nux-0.9.46
|
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