nux-1.14.0
|
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 ("Vertex Shader") ); 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 ("Fragment Shader") ); 00070 int m_CompiledAndReady; 00071 friend class GpuDevice; 00072 }; 00073 00074 #if 0 00075 class IOpenGLGeometryShader: public IOpenGLShader 00076 { 00077 NUX_DECLARE_OBJECT_TYPE(IOpenGLGeometryShader, IOpenGLShader); 00078 public: 00079 virtual ~IOpenGLGeometryShader(); 00080 virtual void SetShaderCode(const ANSICHAR *ShaderCode, const TCHAR *GeometryShaderPreprocessorDefines = TEXT("")); 00081 virtual bool Compile(); 00082 virtual bool IsValid(); 00083 00084 void SetInputPrimitiveType(GLenum type); 00085 void SetOutputPrimitiveType(GLenum type); 00086 void SetMaxVertexOutput(int max_vertex_output); 00087 00088 private: 00089 IOpenGLGeometryShader (NString ShaderName = NString ("Geometry Shader")); 00090 int m_CompiledAndReady; 00091 friend class GpuDevice; 00092 }; 00093 #endif 00094 00095 class IOpenGLShaderProgram: public IOpenGLResource 00096 { 00097 NUX_DECLARE_OBJECT_TYPE (IOpenGLShaderProgram, IOpenGLResource); 00098 public: 00099 virtual ~IOpenGLShaderProgram(); 00100 00101 // Load an inalogic shader. 00102 void LoadVertexShader (const TCHAR *glslshader, const TCHAR *VtxShaderPreprocessorDefines = TEXT ("") ); 00103 void LoadPixelShader (const TCHAR *glslshader, const TCHAR *FrgShaderPreprocessorDefines = TEXT ("") ); 00104 void LoadIShaderFile (const TCHAR *ShaderFileName, const TCHAR *VtxShaderPreprocessorDefines = TEXT (""), const TCHAR *FrgShaderPreprocessorDefines = TEXT ("") ); 00105 void LoadIShader (const TCHAR *ShaderCode, const TCHAR *VtxShaderPreprocessorDefines = TEXT (""), const TCHAR *FrgShaderPreprocessorDefines = TEXT ("") ); 00106 void AddShaderParameter (GLShaderParameter *Parameter); 00107 void AddShaderObject (ObjectPtr<IOpenGLShader> ShaderObject); 00108 void RemoveShaderObject (ObjectPtr<IOpenGLShader> ShaderObject); 00109 void ClearShaderObjects(); 00110 bool Link(); 00111 00112 void Begin(); 00113 void End(); 00114 00115 static void SetShaderTracking (bool enabled); 00116 00117 public: 00118 00119 bool SetUniform1f (char *varname, GLfloat v0); 00120 bool SetUniform2f (char *varname, GLfloat v0, GLfloat v1); 00121 bool SetUniform3f (char *varname, GLfloat v0, GLfloat v1, GLfloat v2); 00122 bool SetUniform4f (char *varname, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); 00123 00124 bool SetUniform1i (char *varname, GLint v0); 00125 bool SetUniform2i (char *varname, GLint v0, GLint v1); 00126 bool SetUniform3i (char *varname, GLint v0, GLint v1, GLint v2); 00127 bool SetUniform4i (char *varname, GLint v0, GLint v1, GLint v2, GLint v3); 00128 00129 bool SetUniform1fv (char *varname, GLsizei count, GLfloat *value); 00130 bool SetUniform2fv (char *varname, GLsizei count, GLfloat *value); 00131 bool SetUniform3fv (char *varname, GLsizei count, GLfloat *value); 00132 bool SetUniform4fv (char *varname, GLsizei count, GLfloat *value); 00133 00134 bool SetUniform1iv (char *varname, GLsizei count, GLint *value); 00135 bool SetUniform2iv (char *varname, GLsizei count, GLint *value); 00136 bool SetUniform3iv (char *varname, GLsizei count, GLint *value); 00137 bool SetUniform4iv (char *varname, GLsizei count, GLint *value); 00138 00139 bool SetUniformMatrix2fv (char *varname, GLsizei count, GLboolean transpose, GLfloat *value); 00140 bool SetUniformMatrix3fv (char *varname, GLsizei count, GLboolean transpose, GLfloat *value); 00141 bool SetUniformMatrix4fv (char *varname, GLsizei count, GLboolean transpose, GLfloat *value); 00142 00143 00144 bool SetUniform1f (GLint loc, GLfloat v0); 00145 bool SetUniform2f (GLint loc, GLfloat v0, GLfloat v1); 00146 bool SetUniform3f (GLint loc, GLfloat v0, GLfloat v1, GLfloat v2); 00147 bool SetUniform4f (GLint loc, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); 00148 00149 bool SetUniform1i (GLint loc, GLint v0); 00150 bool SetUniform2i (GLint loc, GLint v0, GLint v1); 00151 bool SetUniform3i (GLint loc, GLint v0, GLint v1, GLint v2); 00152 bool SetUniform4i (GLint loc, GLint v0, GLint v1, GLint v2, GLint v3); 00153 00154 bool SetUniform1fv (GLint loc, GLsizei count, GLfloat *value); 00155 bool SetUniform2fv (GLint loc, GLsizei count, GLfloat *value); 00156 bool SetUniform3fv (GLint loc, GLsizei count, GLfloat *value); 00157 bool SetUniform4fv (GLint loc, GLsizei count, GLfloat *value); 00158 00159 bool SetUniform1iv (GLint loc, GLsizei count, GLint *value); 00160 bool SetUniform2iv (GLint loc, GLsizei count, GLint *value); 00161 bool SetUniform3iv (GLint loc, GLsizei count, GLint *value); 00162 bool SetUniform4iv (GLint loc, GLsizei count, GLint *value); 00163 00164 bool SetUniformLocMatrix2fv (GLint loc, GLsizei count, GLboolean transpose, GLfloat *value); 00165 bool SetUniformLocMatrix3fv (GLint loc, GLsizei count, GLboolean transpose, GLfloat *value); 00166 bool SetUniformLocMatrix4fv (GLint loc, GLsizei count, GLboolean transpose, GLfloat *value); 00167 00168 void GetUniformfv (char *name, GLfloat *values); 00169 void GetUniformiv (char *name, GLint *values); 00170 int GetUniformLocationARB (const GLcharARB *name); 00171 void GetActiveUniformARB (GLuint index, 00172 GLsizei maxLength, 00173 GLsizei *length, 00174 GLint *size, 00175 GLenum *type, 00176 GLcharARB *name); 00177 00178 // glGetObjectParameterARBfv Parameters 00179 // object 00180 // Specifies the handle of the object to be queried 00181 // 00182 // pname 00183 // Specifies the an object parameter. Accepted symbolic names are 00184 // GL_OBJECT_TYPE_ARB , 00185 // GL_OBJECT_SUBTYPE_ARB, 00186 // GL_OBJECT_DELETE_STATUS_ARB, 00187 // GL_OBJECT_LINK_STATUS_ARB, 00188 // GL_OBJECT_VALIDATE_STATUS_ARB, 00189 // GL_OBJECT_COMPILE_STATUS_ARB, 00190 // GL_OBJECT_INFO_LOG_LENGTH_ARB, 00191 // GL_OBJECT_ATTACHED_OBJECTS_ARB, 00192 // GL_OBJECT_ACTIVE_ATTRIBUTES_ARB, 00193 // GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB, 00194 // GL_OBJECT_ACTIVE_UNIFORMS_ARB, 00195 // GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB, 00196 // GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 00197 // 00198 // params 00199 // Returns the requested object parameter 00200 // 00201 void GetObjectParameterfvARB (GLenum pname, GLfloat *params); 00202 bool SetSampler (char *name, int exture_unit); 00203 00204 GLShaderParameter *_FirstParameter; 00205 void CheckAttributeLocation(); 00206 void CheckUniformLocation(); 00207 int GetAttributeLocation (const TCHAR *AttributeName); 00208 00209 private: 00210 IOpenGLShaderProgram (NString ShaderProgramName = NString ("ShaderProgram") ); 00211 ShaderAttributeDefinition m_ProgramAttributeDefinition[16/*NUM_VERTEX_SHADER_INPUT_ATTRIBUTE*/]; 00212 std::vector<ObjectPtr<IOpenGLShader> > ShaderObjectList; 00213 bool m_CompiledAndReady; 00214 NString _ShaderProgramName; 00215 friend class GpuDevice; 00216 }; 00217 00218 } 00219 00220 #endif // IOPENGLSHADER_H