+ GLint loc = program.GetUniformLocation( Program::UNIFORM_MODEL_MATRIX );
+ if( Program::UNIFORM_UNKNOWN != loc )
+ {
+ program.SetUniformMatrix4fv( loc, 1, modelMatrix.AsFloat() );
+ }
+ loc = program.GetUniformLocation( Program::UNIFORM_VIEW_MATRIX );
+ if( Program::UNIFORM_UNKNOWN != loc )
+ {
+ if( program.GetViewMatrix() != &viewMatrix )
+ {
+ program.SetViewMatrix( &viewMatrix );
+ program.SetUniformMatrix4fv( loc, 1, viewMatrix.AsFloat() );
+ }
+ }
+ // set projection matrix if program has not yet received it this frame or if it is dirty
+ loc = program.GetUniformLocation( Program::UNIFORM_PROJECTION_MATRIX );
+ if( Program::UNIFORM_UNKNOWN != loc )
+ {
+ if( program.GetProjectionMatrix() != &projectionMatrix )
+ {
+ program.SetProjectionMatrix( &projectionMatrix );
+ program.SetUniformMatrix4fv( loc, 1, projectionMatrix.AsFloat() );
+ }
+ }
+ loc = program.GetUniformLocation(Program::UNIFORM_MODELVIEW_MATRIX);
+ if( Program::UNIFORM_UNKNOWN != loc )
+ {
+ program.SetUniformMatrix4fv( loc, 1, modelViewMatrix.AsFloat() );
+ }
+
+ loc = program.GetUniformLocation( Program::UNIFORM_MVP_MATRIX );
+ if( Program::UNIFORM_UNKNOWN != loc )
+ {
+ Matrix::Multiply( gModelViewProjectionMatrix, modelViewMatrix, projectionMatrix );
+ program.SetUniformMatrix4fv( loc, 1, gModelViewProjectionMatrix.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() );
+ }