MCPcopy Create free account
hub / github.com/ImageEngine/cortex / shaderSetup

Method shaderSetup

src/IECoreGL/CurvesPrimitive.cpp:153–214  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

151}
152
153const Shader::Setup *CurvesPrimitive::shaderSetup( const Shader *shader, State *state ) const
154{
155 bool linear, ribbons;
156 renderMode( state, linear, ribbons );
157
158 if( linear && !ribbons )
159 {
160 // we just render in the standard way.
161 return Primitive::shaderSetup( shader, state );
162 }
163
164 // we're rendering with ribbons and/or cubic interpolation. we need
165 // to substitute in a geometry shader to do the work.
166
167 for( MemberData::GeometrySetupVector::const_iterator it = m_memberData->geometrySetups.begin(), eIt = m_memberData->geometrySetups.end(); it != eIt; it++ )
168 {
169 if( it->originalShader == shader && it->linear == linear && it->ribbons == ribbons )
170 {
171 return it->shaderSetup.get();
172 }
173 }
174
175 ConstShaderPtr geometryShader = shader;
176 ShaderStateComponent *shaderStateComponent = state->get<ShaderStateComponent>();
177 if( geometryShader->geometrySource() == "" )
178 {
179 // if the current shader has a specific geometry shader component,
180 // then we assume the user has provided one capable of doing the tesselation,
181 // but if not then we substitute in our own geometry shader.
182 ShaderLoader *shaderLoader = shaderStateComponent->shaderLoader();
183 if( ribbons )
184 {
185 if( linear )
186 {
187 geometryShader = shaderLoader->create( geometryShader->vertexSource(), linearRibbonsGeometrySource(), geometryShader->fragmentSource() );
188 }
189 else
190 {
191 geometryShader = shaderLoader->create( geometryShader->vertexSource(), cubicRibbonsGeometrySource(), geometryShader->fragmentSource() );
192 }
193 }
194 else
195 {
196 // When drawing as lines, default to the constant fragment source, because using a facing ratio
197 // shader doesn't work
198 geometryShader = shaderLoader->create(
199 geometryShader->vertexSource(), cubicLinesGeometrySource(),
200 geometryShader->fragmentSource() != "" ? geometryShader->fragmentSource() : Shader::constantFragmentSource()
201 );
202 }
203 }
204
205 Shader::SetupPtr geometryShaderSetup = new Shader::Setup( geometryShader );
206 shaderStateComponent->addParametersToShaderSetup( geometryShaderSetup.get() );
207 addPrimitiveVariablesToShaderSetup( geometryShaderSetup.get() );
208 geometryShaderSetup->addUniformParameter( "basis", new IECore::M44fData( m_memberData->basis.matrix ) );
209 geometryShaderSetup->addUniformParameter( "width", new IECore::M44fData( m_memberData->width ) );
210

Callers

nothing calls this directly

Calls 9

shaderSetupFunction · 0.85
GeometrySetupClass · 0.85
addUniformParameterMethod · 0.80
beginMethod · 0.45
endMethod · 0.45
getMethod · 0.45
shaderLoaderMethod · 0.45
createMethod · 0.45

Tested by

no test coverage detected