nux-0.9.48

NuxGraphics/IOpenGLGLSLShader.h

Go to the documentation of this file.
00001 /*
00002  * Copyright 2010 Inalogic® Inc.
00003  *
00004  * This program is free software: you can redistribute it and/or modify it
00005  * under the terms of the GNU Lesser General Public License, as
00006  * published by the  Free Software Foundation; either version 2.1 or 3.0
00007  * of the License.
00008  *
00009  * This program is distributed in the hope that it will be useful, but
00010  * WITHOUT ANY WARRANTY; without even the implied warranties of
00011  * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
00012  * PURPOSE.  See the applicable version of the GNU Lesser General Public
00013  * License for more details.
00014  *
00015  * You should have received a copy of both the GNU Lesser General Public
00016  * License along with this program. If not, see <http://www.gnu.org/licenses/>
00017  *
00018  * Authored by: Jay Taoko <jaytaoko@inalogic.com>
00019  *
00020  */
00021 
00022 
00023 #ifndef IOPENGLSHADER_H
00024 #define IOPENGLSHADER_H
00025 
00026 namespace nux
00027 {
00028 
00029   class IOpenGLResource;
00030 
00031   bool ExtractShaderString3 (const NString &ShaderToken, const NString &ShaderSource, NString &RetSource, NString ShaderPreprocessorDefines = NString (TEXT ("") ) );
00032 
00033   class IOpenGLShader:  public IOpenGLResource
00034   {
00035     NUX_DECLARE_OBJECT_TYPE (IOpenGLShader, IOpenGLResource);
00036     IOpenGLShader (NString ShaderName, OpenGLResourceType ResourceType);
00037     virtual ~IOpenGLShader();
00038   public:
00039     virtual void SetShaderCode (const ANSICHAR *ShaderCode, const TCHAR *ShaderPreprocessorDefines = TEXT ("") ) = 0;
00040     virtual bool Compile() = 0;
00041     virtual bool IsValid() = 0;
00042     NString _ShaderName;
00043     NString _ShaderCode;
00044   };
00045 
00046   class IOpenGLVertexShader:  public IOpenGLShader
00047   {
00048     NUX_DECLARE_OBJECT_TYPE (IOpenGLVertexShader, IOpenGLShader);
00049   public:
00050     virtual ~IOpenGLVertexShader();
00051     virtual void SetShaderCode (const ANSICHAR *ShaderCode, const TCHAR *VtxShaderPreprocessorDefines = TEXT ("") );
00052     virtual bool Compile();
00053     virtual bool IsValid();
00054   private:
00055     IOpenGLVertexShader (NString ShaderName = NString ("VertexProgram") );
00056     int m_CompiledAndReady;
00057     friend class GpuDevice;
00058   };
00059 
00060   class IOpenGLPixelShader:  public IOpenGLShader
00061   {
00062     NUX_DECLARE_OBJECT_TYPE (IOpenGLPixelShader, IOpenGLShader);
00063   public:
00064     virtual ~IOpenGLPixelShader();
00065     virtual void SetShaderCode (const ANSICHAR *ShaderCode, const TCHAR *FrgShaderPreprocessorDefines = TEXT ("") );
00066     virtual bool Compile();
00067     virtual bool IsValid();
00068   private:
00069     IOpenGLPixelShader (NString ShaderName = NString ("PixelProgram") );
00070     int m_CompiledAndReady;
00071     friend class GpuDevice;
00072   };
00073 
00074 
00075   class IOpenGLShaderProgram:  public IOpenGLResource
00076   {
00077     NUX_DECLARE_OBJECT_TYPE (IOpenGLShaderProgram, IOpenGLResource);
00078   public:
00079     virtual ~IOpenGLShaderProgram();
00080 
00081     // Load an inalogic shader.
00082     void LoadVertexShader (const TCHAR *glslshader, const TCHAR *VtxShaderPreprocessorDefines = TEXT ("") );
00083     void LoadPixelShader (const TCHAR *glslshader, const TCHAR *FrgShaderPreprocessorDefines = TEXT ("") );
00084     void LoadIShaderFile (const TCHAR *ShaderFileName, const TCHAR *VtxShaderPreprocessorDefines = TEXT (""), const TCHAR *FrgShaderPreprocessorDefines = TEXT ("") );
00085     void LoadIShader (const TCHAR *ShaderCode, const TCHAR *VtxShaderPreprocessorDefines = TEXT (""), const TCHAR *FrgShaderPreprocessorDefines = TEXT ("") );
00086     void AddShaderParameter (GLShaderParameter *Parameter);
00087     void AddShaderObject (ObjectPtr<IOpenGLShader> ShaderObject);
00088     void RemoveShaderObject (ObjectPtr<IOpenGLShader> ShaderObject);
00089     void ClearShaderObjects();
00090     bool Link();
00091 
00092     void Begin();
00093     void End();
00094 
00095   public:
00096 
00097     bool SetUniform1f (char *varname, GLfloat v0);
00098     bool SetUniform2f (char *varname, GLfloat v0, GLfloat v1);
00099     bool SetUniform3f (char *varname, GLfloat v0, GLfloat v1, GLfloat v2);
00100     bool SetUniform4f (char *varname, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
00101 
00102     bool SetUniform1i (char *varname, GLint v0);
00103     bool SetUniform2i (char *varname, GLint v0, GLint v1);
00104     bool SetUniform3i (char *varname, GLint v0, GLint v1, GLint v2);
00105     bool SetUniform4i (char *varname, GLint v0, GLint v1, GLint v2, GLint v3);
00106 
00107     bool SetUniform1fv (char *varname, GLsizei count, GLfloat *value);
00108     bool SetUniform2fv (char *varname, GLsizei count, GLfloat *value);
00109     bool SetUniform3fv (char *varname, GLsizei count, GLfloat *value);
00110     bool SetUniform4fv (char *varname, GLsizei count, GLfloat *value);
00111 
00112     bool SetUniform1iv (char *varname, GLsizei count, GLint *value);
00113     bool SetUniform2iv (char *varname, GLsizei count, GLint *value);
00114     bool SetUniform3iv (char *varname, GLsizei count, GLint *value);
00115     bool SetUniform4iv (char *varname, GLsizei count, GLint *value);
00116 
00117     bool SetUniformMatrix2fv (char *varname, GLsizei count, GLboolean transpose, GLfloat *value);
00118     bool SetUniformMatrix3fv (char *varname, GLsizei count, GLboolean transpose, GLfloat *value);
00119     bool SetUniformMatrix4fv (char *varname, GLsizei count, GLboolean transpose, GLfloat *value);
00120 
00121 
00122     bool SetUniform1f (GLint loc, GLfloat v0);
00123     bool SetUniform2f (GLint loc, GLfloat v0, GLfloat v1);
00124     bool SetUniform3f (GLint loc, GLfloat v0, GLfloat v1, GLfloat v2);
00125     bool SetUniform4f (GLint loc, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
00126 
00127     bool SetUniform1i (GLint loc, GLint v0);
00128     bool SetUniform2i (GLint loc, GLint v0, GLint v1);
00129     bool SetUniform3i (GLint loc, GLint v0, GLint v1, GLint v2);
00130     bool SetUniform4i (GLint loc, GLint v0, GLint v1, GLint v2, GLint v3);
00131 
00132     bool SetUniform1fv (GLint loc, GLsizei count, GLfloat *value);
00133     bool SetUniform2fv (GLint loc, GLsizei count, GLfloat *value);
00134     bool SetUniform3fv (GLint loc, GLsizei count, GLfloat *value);
00135     bool SetUniform4fv (GLint loc, GLsizei count, GLfloat *value);
00136 
00137     bool SetUniform1iv (GLint loc, GLsizei count, GLint *value);
00138     bool SetUniform2iv (GLint loc, GLsizei count, GLint *value);
00139     bool SetUniform3iv (GLint loc, GLsizei count, GLint *value);
00140     bool SetUniform4iv (GLint loc, GLsizei count, GLint *value);
00141 
00142     bool SetUniformLocMatrix2fv (GLint loc, GLsizei count, GLboolean transpose, GLfloat *value);
00143     bool SetUniformLocMatrix3fv (GLint loc, GLsizei count, GLboolean transpose, GLfloat *value);
00144     bool SetUniformLocMatrix4fv (GLint loc, GLsizei count, GLboolean transpose, GLfloat *value);
00145 
00146     void GetUniformfv (char *name, GLfloat *values);
00147     void GetUniformiv (char *name, GLint *values);
00148     int GetUniformLocationARB (const GLcharARB *name);
00149     void GetActiveUniformARB (GLuint index,
00150                               GLsizei maxLength,
00151                               GLsizei *length,
00152                               GLint *size,
00153                               GLenum *type,
00154                               GLcharARB *name);
00155 
00156     //    glGetObjectParameterARBfv Parameters
00157     //        object
00158     //        Specifies the handle of the object to be queried
00159     //
00160     //        pname
00161     //        Specifies the an object parameter. Accepted symbolic names are
00162     //        GL_OBJECT_TYPE_ARB ,
00163     //        GL_OBJECT_SUBTYPE_ARB,
00164     //        GL_OBJECT_DELETE_STATUS_ARB,
00165     //        GL_OBJECT_LINK_STATUS_ARB,
00166     //        GL_OBJECT_VALIDATE_STATUS_ARB,
00167     //        GL_OBJECT_COMPILE_STATUS_ARB,
00168     //        GL_OBJECT_INFO_LOG_LENGTH_ARB,
00169     //        GL_OBJECT_ATTACHED_OBJECTS_ARB,
00170     //        GL_OBJECT_ACTIVE_ATTRIBUTES_ARB,
00171     //        GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB,
00172     //        GL_OBJECT_ACTIVE_UNIFORMS_ARB,
00173     //        GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB,
00174     //        GL_OBJECT_SHADER_SOURCE_LENGTH_ARB
00175     //
00176     //        params
00177     //        Returns the requested object parameter
00178     //
00179     void GetObjectParameterfvARB (GLenum pname, GLfloat *params);
00180     BOOL SetSampler (char *name, int exture_unit);
00181 
00182     GLShaderParameter *_FirstParameter;
00183     void CheckAttributeLocation();
00184     void CheckUniformLocation();
00185     int GetAttributeLocation (const TCHAR *AttributeName);
00186 
00187   private:
00188     IOpenGLShaderProgram (NString ShaderProgramName = NString ("ShaderProgram") );
00189     ShaderAttributeDefinition m_ProgramAttributeDefinition[16/*NUM_VERTEX_SHADER_INPUT_ATTRIBUTE*/];
00190     std::vector<ObjectPtr<IOpenGLShader> > ShaderObjectList;
00191     bool m_CompiledAndReady;
00192     NString _ShaderProgramName;
00193     friend class GpuDevice;
00194   };
00195 
00196 }
00197 
00198 #endif // IOPENGLSHADER_H