template <> struct OneVariableApplyer< Castor3D::TextureBaseRPtr > { inline void operator()( OpenGl & p_gl, int p_iGlIndex, Castor3D::TextureBaseRPtr const * p_pValue, uint32_t p_uiOcc) { if( p_uiOcc <= 1 && *p_pValue ) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, (int*)&(*p_pValue)->GetIndex() ); } } }; template <> struct OneVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, int const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, int const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, int const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform2v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, int const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform3v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, int const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform4v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct OneVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, uint32_t const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, uint32_t const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, uint32_t const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform2v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, uint32_t const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform3v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, uint32_t const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform4v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct OneVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform2v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform3v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform4v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct OneVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform1v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform2v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform3v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct PointVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniform4v( p_iGlIndex, p_uiOcc, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix2x2v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix2x3v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix2x4v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix3x2v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix3x3v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix3x4v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix4x2v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix4x3v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, float const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix4x4v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix2x2v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix2x3v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix2x4v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix3x2v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix3x3v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix3x4v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix4x2v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix4x3v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template <> struct MatrixVariableApplyer { inline void operator()( OpenGl & p_gl, int p_iGlIndex, double const * p_pValue, uint32_t p_uiOcc) { p_gl.SetUniformMatrix4x4v( p_iGlIndex, p_uiOcc, false, p_pValue); } }; template< typename T > struct OneVariableApplyer { inline void operator()( OpenGl & CU_PARAM_UNUSED( p_gl ), int CU_PARAM_UNUSED( p_iGlIndex ), T const * CU_PARAM_UNUSED( p_pValue ), uint32_t CU_PARAM_UNUSED( p_uiOcc ) ) { CASTOR_EXCEPTION( "OneVariableApplyer - Unsupported arguments" ); } }; template struct PointVariableApplyer { inline void operator()( OpenGl & CU_PARAM_UNUSED( p_gl ), int CU_PARAM_UNUSED( p_iGlIndex ), T const * CU_PARAM_UNUSED( p_pValue ), uint32_t CU_PARAM_UNUSED( p_uiOcc ) ) { CASTOR_EXCEPTION( "PointVariableApplyer - Unsupported arguments" ); } }; template struct MatrixVariableApplyer { inline void operator()( OpenGl & CU_PARAM_UNUSED( p_gl ), int CU_PARAM_UNUSED( p_iGlIndex ), T const * CU_PARAM_UNUSED( p_pValue ), uint32_t CU_PARAM_UNUSED( p_uiOcc ) ) { CASTOR_EXCEPTION( "MatrixVariableApplyer - Unsupported arguments" ); } }; //*********************************************************************************************************************** template inline void GlFrameVariableBase :: DoApply( Type const * p_pValue, uint32_t p_uiOcc) { if (m_iGlIndex != eGL_INVALID_INDEX) { OneVariableApplyer()( m_gl, m_iGlIndex, p_pValue, p_uiOcc); } } template inline void GlFrameVariableBase :: DoApply( Type const * p_pValue, uint32_t p_uiOcc) { if (m_iGlIndex != eGL_INVALID_INDEX) { PointVariableApplyer()( m_gl, m_iGlIndex, p_pValue, p_uiOcc); } } template inline void GlFrameVariableBase :: DoApply( Type const * p_pValue, uint32_t p_uiOcc) { if (m_iGlIndex != eGL_INVALID_INDEX) { MatrixVariableApplyer()( m_gl, m_iGlIndex, p_pValue, p_uiOcc); } } //*********************************************************************************************************************** template< typename T > GlOneFrameVariable< T > :: GlOneFrameVariable( OpenGl & p_gl, uint32_t p_uiOcc, GlShaderProgram * p_pProgram ) : Castor3D::OneFrameVariable< T > ( p_pProgram, p_uiOcc ) , GlFrameVariableBase ( p_gl, &p_pProgram->GetGlProgram() ) { } template< typename T > GlOneFrameVariable< T > :: GlOneFrameVariable( OpenGl & p_gl, Castor3D::OneFrameVariable< T > * p_pVariable) : Castor3D::OneFrameVariable< T > ( *p_pVariable ) , GlFrameVariableBase ( p_gl, &static_cast< GlShaderProgram * >( &p_pVariable->GetProgram())->GetGlProgram() ) { } template< typename T > GlOneFrameVariable< T > :: ~GlOneFrameVariable() { } template< typename T > bool GlOneFrameVariable< T > :: Initialise() { if (m_iGlIndex == eGL_INVALID_INDEX) { GetVariableLocation( Castor::str_utils::to_str( Castor3D::FrameVariable::m_strName ).c_str() ); } return m_iGlIndex != eGL_INVALID_INDEX; } template< typename T > void GlOneFrameVariable< T > :: Cleanup() { m_iGlIndex = eGL_INVALID_INDEX; } template< typename T > void GlOneFrameVariable< T > :: Apply() { if( Castor3D::FrameVariable::m_bChanged ) { GlFrameVariableBase::DoApply< T >( Castor3D::OneFrameVariable< T >::m_pValues, Castor3D::FrameVariable::m_uiOcc); Castor3D::FrameVariable::m_bChanged = false; } } //*********************************************************************************************************************** template GlPointFrameVariable :: GlPointFrameVariable( OpenGl & p_gl, uint32_t p_uiOcc, GlShaderProgram * p_pProgram ) : Castor3D::PointFrameVariable< T, Count > ( p_pProgram, p_uiOcc ) , GlFrameVariableBase ( p_gl, &p_pProgram->GetGlProgram() ) { } template GlPointFrameVariable :: GlPointFrameVariable( OpenGl & p_gl, Castor3D::PointFrameVariable * p_pVariable) : Castor3D::PointFrameVariable< T, Count > ( *p_pVariable ) , GlFrameVariableBase ( p_gl, &static_cast< GlShaderProgram * >( &p_pVariable->GetProgram())->GetGlProgram() ) { } template GlPointFrameVariable :: ~GlPointFrameVariable() { } template bool GlPointFrameVariable :: Initialise() { if (m_iGlIndex == eGL_INVALID_INDEX) { GetVariableLocation( Castor::str_utils::to_str( Castor3D::FrameVariable::m_strName ).c_str() ); } return m_iGlIndex != eGL_INVALID_INDEX; } template void GlPointFrameVariable :: Cleanup() { m_iGlIndex = eGL_INVALID_INDEX; } template void GlPointFrameVariable :: Apply() { if( Castor3D::FrameVariable::m_bChanged ) { GlFrameVariableBase::DoApply< T, Count >( Castor3D::PointFrameVariable::m_pValues, Castor3D::FrameVariable::m_uiOcc); Castor3D::FrameVariable::m_bChanged = false; } } //*********************************************************************************************************************** template GlMatrixFrameVariable :: GlMatrixFrameVariable( OpenGl & p_gl, uint32_t p_uiOcc, GlShaderProgram * p_pProgram ) : Castor3D::MatrixFrameVariable< T, Rows, Columns > ( p_pProgram, p_uiOcc ) , GlFrameVariableBase ( p_gl, &p_pProgram->GetGlProgram() ) { } template GlMatrixFrameVariable :: GlMatrixFrameVariable( OpenGl & p_gl, Castor3D::MatrixFrameVariable * p_pVariable) : Castor3D::MatrixFrameVariable ( *p_pVariable ) , GlFrameVariableBase ( p_gl, &static_cast< GlShaderProgram * >( p_pVariable->GetProgram() )->GetGlProgram() ) { } template GlMatrixFrameVariable :: ~GlMatrixFrameVariable() { } template bool GlMatrixFrameVariable :: Initialise() { if (m_iGlIndex == eGL_INVALID_INDEX) { GetVariableLocation( Castor::str_utils::to_str( Castor3D::FrameVariable::m_strName ).c_str() ); } return m_iGlIndex != eGL_INVALID_INDEX; } template void GlMatrixFrameVariable :: Cleanup() { m_iGlIndex = eGL_INVALID_INDEX; } template void GlMatrixFrameVariable :: Apply() { if( Castor3D::FrameVariable::m_bChanged ) { GlFrameVariableBase::DoApply< T, Rows, Columns >( Castor3D::MatrixFrameVariable::m_pValues, Castor3D::FrameVariable::m_uiOcc); Castor3D::FrameVariable::m_bChanged = false; } } //***********************************************************************************************************************