namespace
{
-static Matrix gModelViewProjectionMatrix( false ); ///< a shared matrix to calculate the MVP matrix, dont want to store it in object to reduce storage overhead
-static Matrix3 gNormalMatrix; ///< a shared matrix to calculate normal matrix, dont want to store it in object to reduce storage overhead
/**
* Helper to set view and projection matrices once per program
loc = program.GetUniformLocation( Program::UNIFORM_MVP_MATRIX );
if( Program::UNIFORM_UNKNOWN != loc )
{
- Matrix::Multiply( gModelViewProjectionMatrix, modelViewMatrix, projectionMatrix );
- program.SetUniformMatrix4fv( loc, 1, gModelViewProjectionMatrix.AsFloat() );
+ Matrix modelViewProjectionMatrix(false);
+ Matrix::Multiply( modelViewProjectionMatrix, modelViewMatrix, projectionMatrix );
+ program.SetUniformMatrix4fv( loc, 1, modelViewProjectionMatrix.AsFloat() );
}
loc = program.GetUniformLocation( Program::UNIFORM_NORMAL_MATRIX );
if( Program::UNIFORM_UNKNOWN != loc )
{
- gNormalMatrix = modelViewMatrix;
- gNormalMatrix.Invert();
- gNormalMatrix.Transpose();
- program.SetUniformMatrix3fv( loc, 1, gNormalMatrix.AsFloat() );
+ Matrix3 normalMatrix;
+ normalMatrix = modelViewMatrix;
+ normalMatrix.Invert();
+ normalMatrix.Transpose();
+ program.SetUniformMatrix3fv( loc, 1, normalMatrix.AsFloat() );
}
}
mDepthWriteMode( depthWriteMode ),
mDepthTestMode( depthTestMode ),
mUpdateAttributesLocation( true ),
- mPremultipledAlphaEnabled( preMultipliedAlphaEnabled )
+ mPremultipledAlphaEnabled( preMultipliedAlphaEnabled ),
+ mShaderChanged( false )
{
if( blendingBitmask != 0u )
{
if( uniformMapDataProvider.GetUniformMapChanged( bufferIndex ) ||
node.GetUniformMapChanged(bufferIndex) ||
- mUniformIndexMap.Count() == 0)
+ mUniformIndexMap.Count() == 0 ||
+ mShaderChanged )
{
+ // Reset shader pointer
+ mShaderChanged = false;
+
const SceneGraph::CollectedUniformMap& uniformMap = uniformMapDataProvider.GetUniformMap( bufferIndex );
const SceneGraph::CollectedUniformMap& uniformMapNode = node.GetUniformMap( bufferIndex );
}
}
-bool Renderer::BindTextures( Context& context, Program& program )
+bool Renderer::BindTextures( Context& context, Program& program, Vector<GLuint>& boundTextures )
{
uint32_t textureUnit = 0;
bool result = true;
if( textures[i] )
{
result = textures[i]->Bind(context, textureUnit, samplers[i] );
+ boundTextures.PushBack( textures[i]->GetId() );
if( result && program.GetSamplerUniformLocation( i, uniformLocation ) )
{
program.SetUniform1i( uniformLocation, textureUnit );
const Matrix& viewMatrix,
const Matrix& projectionMatrix,
const Vector3& size,
- bool blend )
+ bool blend,
+ Vector<GLuint>& boundTextures )
{
// Get the program to use:
Program* program = mRenderDataProvider->GetShader().GetProgram();
// Take the program into use so we can send uniforms to it
program->Use();
- if( DALI_LIKELY( BindTextures( context, *program ) ) )
+ if( DALI_LIKELY( BindTextures( context, *program, boundTextures ) ) )
{
// Only set up and draw if we have textures and they are all valid
sortAttributes.geometry = mGeometry;
}
+void Renderer::SetShaderChanged( bool value )
+{
+ mShaderChanged = value;
+}
+
} // namespace SceneGraph
} // namespace Internal