/*
* Copyright 2010 Inalogic® Inc.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License, as
* published by the Free Software Foundation; either version 2.1 or 3.0
* of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the applicable version of the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of both the GNU Lesser General Public
* License along with this program. If not, see
*
* Authored by: Jay Taoko
*
*/
#ifndef GLSHADERPARAMETER_H
#define GLSHADERPARAMETER_H
#include "GLError.h"
#include "GLResource.h"
namespace nux
{
//! Type of shader in a shader
enum eShaderParameterType
{
eVERTEXUNIFORMTYPE,
eFRAGMENTUNIFORMTYPE,
eSAMPLERUNIFORMTYPE,
};
//! Type of shader
enum eShaderType
{
eVERTEXSHADERTYPE,
eFRAGMENTSHADERTYPE
};
class GLProgramObject;
class IOpenGLShaderProgram;
class GLShaderParameter
{
public:
int m_Index; // Register m_Index / Attribute m_Index
eShaderParameterType m_ShaderParameterType;
NString m_Name;
bool m_bIsOptional;
bool m_bIsStatic;
bool bStaticSet;
GLProgramObject *m_ShaderProgram;
IOpenGLShaderProgram *m_ShaderProgram2;
GLShaderParameter *m_NextParameter;
UINT m_Size;
UINT m_Type;
GLShaderParameter(GLProgramObject *Shader,
const char *ParamName,
eShaderParameterType InType,
bool InbIsOptional = FALSE,
bool InbIsStatic = FALSE);
inline void SetUniform1f( FLOAT FloatA )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform1fARB( m_Index, FloatA ));
}
inline void SetUniform1i( INT i )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform1iARB( m_Index, i ));
}
inline void SetUniform2f( FLOAT FloatA, FLOAT FloatB )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform2fARB( m_Index, FloatA, FloatB ));
}
inline void SetUniform3f( FLOAT FloatA, FLOAT FloatB, FLOAT FloatC )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform3fARB( m_Index, FloatA, FloatB, FloatC ));
}
inline void SetUniform4f( FLOAT FloatA, FLOAT FloatB, FLOAT FloatC, FLOAT FloatD )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform4fARB( m_Index, FloatA, FloatB, FloatC, FloatD ));
}
inline void SetUniform1fv( GLsizei count, GLfloat *value )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform1fvARB( m_Index, count, value ));
}
inline void SetUniform2fv( GLsizei count, GLfloat *value )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform2fvARB( m_Index, count, value ));
}
inline void SetUniform3fv( GLsizei count, GLfloat *value )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform3fvARB( m_Index, count, value ));
}
inline void SetUniform4fv( GLsizei count, GLfloat *value )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniform4fvARB( m_Index, count, value ));
}
inline void SetUniformMatrix2fv( GLsizei count, GLfloat *value, GLboolean transpose = GL_FALSE )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniformMatrix2fvARB( m_Index, count, transpose, value ));
}
inline void SetUniformMatrix3fv( GLsizei count, GLfloat *value, GLboolean transpose = GL_FALSE )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniformMatrix3fvARB( m_Index, count, transpose, value ));
}
inline void SetUniformMatrix4fv( GLsizei count, GLfloat *value, GLboolean transpose = GL_FALSE )
{
NUX_RETURN_IF_TRUE(m_Index == -1);
CHECKGL(glUniformMatrix4fvARB( m_Index, count, transpose, value ));
}
inline void SetTexture( const GLuint textureId )
{
//CHECKGL(glUniform1iARB( m_Index, textureId ));
//CHECKGL(cgGLEnableTextureParameter( CgParameter ));
}
void MapTo( GLProgramObject *Shader );
private:
};
}
#endif // GLSHADERPARAMETER_H