| 151 | } |
| 152 | |
| 153 | const 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 |
nothing calls this directly
no test coverage detected