![]() |
TAPs 0.7.7.3
|
00001 /****************************************************************************** 00002 TAPsGLSLFns.hpp 00003 00004 Based on 3DLabs Inc. Ltd. and adapted from aGLSL.h by Martin Christen. 00005 This class relies on using glew to initialize OpenGL. 00006 Since Windows XP uses OpenGL 1.1, so glewInit() is needed to initialize 00007 the OpenGL to the highest version that the graphics card can support. 00008 00009 SUKITTI PUNAK (06/08/2005) 00010 UPDATE (09/10/2010) 00011 ******************************************************************************/ 00029 #ifndef TAPs_GLSL_FNS_HPP 00030 #define TAPs_GLSL_FNS_HPP 00031 00032 //----------------------------------------------------------------------------- 00033 #ifndef TAPs_USE_GLSL 00034 #define TAPs_USE_GLSL 00035 #endif 00036 //----------------------------------------------------------------------------- 00037 // Operating System Check 00038 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) 00039 #define TAPs_GLSL_WINDOWS 00040 #include <windows.h> 00041 #elif defined(__MACOSX__) 00042 #define TAPs_GLSL_MACOSX 00043 #error "MacOSX is not supported!" 00044 #elif defined(linux) || defined(__linux) || defined(__linux__) 00045 #define TAPs_GLSL_LINUX 00046 #error "LINUX is not supported!" 00047 #else 00048 #error "This OS is not supported!" 00049 #endif 00050 //----------------------------------------------------------------------------- 00051 //#include "TAPs_GL_Ext.hpp" 00052 00053 //#include "../Core/TAPsLib.hpp" 00054 //#define GLEW_MX 00055 00056 #define GLEW_STATIC 1 00057 #include <GL/glew.h> 00058 #include <GL/wglew.h> 00059 #include <GL/gl.h> 00060 //#include <GL/glut.h> 00061 //#include <GL/glu.h> 00062 //#include <GL/glext.h> 00063 //#include <GL/wglext.h> 00064 00065 #include "../Core/TAPsLib.hpp" 00066 #include "../OpenGL/TAPsOpenGLFns.hpp" 00067 00068 #include <iostream> 00069 #include <fstream> 00070 #include <vector> 00071 00072 00073 #ifdef WIN32 /*[*/ 00074 #include <io.h> 00075 #endif /*]*/ 00076 00077 #include <stdlib.h> 00078 #include <stdio.h> 00079 #include <string.h> 00080 #include <fcntl.h> 00081 00082 // For wxWidgets 00083 #ifdef TAPs_USE_WXWIDGETS 00084 #include <wx/wx.h> 00085 #endif 00086 00087 //----------------------------------------------------------------------------- 00088 BEGIN_NAMESPACE_TAPs__OpenGL 00089 //============================================================================= 00090 //----------------------------------------------------------------------------- 00091 // Useful Macros 00092 /* 00093 #ifdef TAPs_GLSL_WINDOWS 00094 #define MacrosLoadExtension( fnType, fnName ) ( ( fnName = (fnType) wglGetProcAddress( #fnName ) ) == NULL ) 00095 #endif 00096 #ifdef TAPs_GLSL_LINUX 00097 #define MacrosLoadExtension( fnType, fnName ) ( ( fnName = (fnType) glXGetProcAddress( #fnName ) ) == NULL ) 00098 #endif 00099 bool GFnTestExtension( const char * extName ); 00100 */ 00101 //============================================================================= 00102 class GLSLShader 00103 { 00104 //---------------------------------------------------------------- 00105 friend class GLSLProgramObject; // i.e. GLSL Program 00106 //---------------------------------------------------------------- 00107 public: 00108 //---------------------------------------------------------------- 00109 GLSLShader (); 00110 ~GLSLShader (); 00111 int Load ( const char *fileName ); // read file returns 00112 // 0 if everything is ok, 00113 // -1 if file not found, 00114 // -2 if file is empty 00115 // -3 if no memory 00116 // Load shader from char array, make sure shader is 0 terminated! 00117 void LoadFromMemory ( const char *shader ); 00118 bool Compile (); // compile shader 00119 char * GetCompilerLog (); // get compiler log messages 00120 GLint GetAttribLoc ( char * cpAttribName ); // get localtion of the attribute 00121 00122 void SetName ( std::string const & name ) { m_name = name; } 00123 std::string const & GetName () { return m_name; } 00124 //---------------------------------------------------------------- 00125 protected: 00126 //---------------------------------------------------------------- 00127 // Data Members 00128 int m_iShaderType; 00129 GLuint m_uiShaderObject; 00130 GLchar * m_cpShaderSource; 00131 bool m_bCompileStatus; 00132 GLchar * m_cpCompilerLog; 00133 bool m_bMemAlloc; 00134 std::string m_name; 00135 //---------------------------------------------------------------- 00136 }; 00137 //============================================================================= 00138 class GLSLVertexShader : public GLSLShader 00139 { 00140 public: 00141 GLSLVertexShader (); 00142 ~GLSLVertexShader (); 00143 }; 00144 //============================================================================= 00145 class GLSLGeometryShader : public GLSLShader 00146 { 00147 public: 00148 GLSLGeometryShader (); 00149 ~GLSLGeometryShader (); 00150 }; 00151 //============================================================================= 00152 class GLSLFragmentShader : public GLSLShader 00153 { 00154 public: 00155 GLSLFragmentShader (); 00156 ~GLSLFragmentShader (); 00157 }; 00158 //============================================================================= 00159 // GLSL Program 00160 class GLSLProgramObject 00161 { 00162 public: 00163 //---------------------------------------------------------------- 00164 GLSLProgramObject (); 00165 ~GLSLProgramObject (); 00166 //---------------------------------------------------------------- 00167 // Add a vertex or fragment shader 00168 void AddShader ( GLSLShader * glslShader ); 00169 //---------------------------------------------------------------- 00170 bool Link (); // link all shaders 00171 char * GetLinkerLog (); // get linker messages 00172 //---------------------------------------------------------------- 00173 // Begin this shader. OpenGL calls will go through shader 00174 void BeginGLSL (); 00175 // Stop using this shader. OpenGL calls will go through regular pipeline. 00176 void EndGLSL (); 00177 //---------------------------------------------------------------- 00178 bool IsGLSLEnabled (); // returns true if GLSL is enabled 00179 //---------------------------------------------------------------- 00180 GLuint GetProgramObject () { 00181 return m_uiProgramObject; 00182 } 00183 //---------------------------------------------------------------- 00184 GLuint const GetProgramObject () const { 00185 return m_uiProgramObject; 00186 } 00187 //---------------------------------------------------------------- 00188 // To set (uniform) Textures to GLSL Shader 00189 // only glUniform1i and glUniform1iv can be used to load texture(s) 00190 //--------------------------------------------------------------- 00191 // Set Uniform Variables to GLSL Shader 00192 //--------------------------------------------------------------- 00193 // Float 00194 bool SetUniform1f ( char * var, GLfloat x ); 00195 bool SetUniform2f ( char * var, GLfloat x, GLfloat y ); 00196 bool SetUniform3f ( char * var, GLfloat x, GLfloat y, GLfloat z ); 00197 bool SetUniform4f ( char * var, GLfloat x, GLfloat y, GLfloat z, GLfloat w ); 00198 //----------------------- 00199 // Float Vector 00200 bool SetUniform1fv ( char * var, GLsizei count, GLfloat * val ); 00201 bool SetUniform2fv ( char * var, GLsizei count, GLfloat * val ); 00202 bool SetUniform3fv ( char * var, GLsizei count, GLfloat * val ); 00203 bool SetUniform4fv ( char * var, GLsizei count, GLfloat * val ); 00204 //----------------------- 00205 // Integer 00206 bool SetUniform1i ( char * var, GLint x ); 00207 bool SetUniform2i ( char * var, GLint x, GLint y ); 00208 bool SetUniform3i ( char * var, GLint x, GLint y, GLint z ); 00209 bool SetUniform4i ( char * var, GLint x, GLint y, GLint z, GLint w ); 00210 //----------------------- 00211 // Integer Vector 00212 bool SetUniform1iv ( char * var, GLsizei count, GLint * val ); 00213 bool SetUniform2iv ( char * var, GLsizei count, GLint * val ); 00214 bool SetUniform3iv ( char * var, GLsizei count, GLint * val ); 00215 bool SetUniform4iv ( char * var, GLsizei count, GLint * val ); 00216 //----------------------- 00217 // Unsigned Integer 00218 bool SetUniform1ui ( char * var, GLuint x ); 00219 bool SetUniform2ui ( char * var, GLuint x, GLuint y ); 00220 bool SetUniform3ui ( char * var, GLuint x, GLuint y, GLuint z ); 00221 bool SetUniform4ui ( char * var, GLuint x, GLuint y, GLuint z, GLuint w ); 00222 //----------------------- 00223 // Unsigned Integer Vector 00224 // bool SetUniform1uiv ( char * var, GLsizei count, GLuint * val ); 00225 // bool SetUniform2uiv ( char * var, GLsizei count, GLuint * val ); 00226 // bool SetUniform3uiv ( char * var, GLsizei count, GLuint * val ); 00227 // bool SetUniform4uiv ( char * var, GLsizei count, GLuint * val ); 00228 //----------------------- 00229 bool SetUniformMatrix2fv ( char * var, GLsizei count, GLboolean transpose, GLfloat * val ); 00230 bool SetUniformMatrix3fv ( char * var, GLsizei count, GLboolean transpose, GLfloat * val ); 00231 bool SetUniformMatrix4fv ( char * var, GLsizei count, GLboolean transpose, GLfloat * val ); 00232 //---------------------------------------------------------------- 00233 // Get Uniform Variables from GLSL Shader 00234 void GetUniformfv ( char * var, GLfloat * val ); // float 00235 void GetUniformiv ( char * var, GLint * val ); // int 00236 void GetUniformuiv ( char * var, GLuint * val ); // unsigned int 00237 //---------------------------------------------------------------- 00238 // Set Vertex Attributes to GLSL Shader 00239 bool SetVertexAttrib1f ( GLuint index, GLfloat x ); 00240 bool SetVertexAttrib2f ( GLuint index, GLfloat x, GLfloat y ); 00241 bool SetVertexAttrib3f ( GLuint index, GLfloat x, GLfloat y, GLfloat z ); 00242 bool SetVertexAttrib4f ( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w ); 00243 //---------------------------------------------------------------- 00244 void MemageMemory () { m_bManageMemory = true; } 00245 //---------------------------------------------------------------- 00246 // Turn On/Off All Shaders 00247 static void UseShader ( bool b ) { m_stcbShaderActive = b; } 00248 00249 void SetName ( std::string const & name ) { m_name = name; } 00250 std::string const & GetName () { return m_name; } 00251 //---------------------------------------------------------------- 00252 private: 00253 //---------------------------------------------------------------- 00254 // Member Functions 00255 GLint GetUniLoc( const GLchar *name ); // get location of the uniform variable 00256 //---------------------------------------------------------------- 00257 // Data Members 00258 GLuint m_uiProgramObject; 00259 bool m_bLinkStatus; 00260 GLchar * m_cpLinkerLog; 00261 std::vector< GLSLShader * > m_vShaderList; // list of all shaders 00262 bool m_bManageMemory; 00263 static bool m_stcbShaderActive; 00264 std::string m_name; 00265 //---------------------------------------------------------------- 00266 }; 00267 //============================================================================= 00318 class GLSLShaderManager 00319 { 00320 public: 00321 GLSLShaderManager (); 00322 ~GLSLShaderManager (); 00323 //--------------------------------------------------------------- 00324 bool CreateGLSLProgramObject ( GLSLProgramObject * (&progObj) ); 00325 bool AttachShaderFromFile ( GLSLProgramObject * progObj, char const * shaderFile, GLuint shaderType ); 00326 inline bool AttachShaderFromFile ( GLSLProgramObject * progObj, std::string & shaderFile, GLuint shaderType ) 00327 { return AttachShaderFromFile ( progObj, shaderFile.c_str(), shaderType ); } 00328 bool Link ( GLSLProgramObject * progObj ); 00329 //--------------------------------------------------------------- 00330 // Load vertex/geometry/fragment shader(s) from file(s) 00335 GLSLProgramObject * LoadVertexGeometryAndFragmentShadersFromFile ( 00336 char * vertFile, char * geomFile, char * fragFile ); 00337 GLSLProgramObject * LoadVertexAndFragmentShadersFromFile ( 00338 char * vertFile, char * fragFile ) 00339 { return LoadFromFile( vertFile, fragFile ); } 00340 //GLSLProgramObject * LoadVertexAndGeometryFragmentShadersFromFile ( 00341 // char * vertFile, char * geomFile ); 00342 //GLSLProgramObject * LoadGeometryAndFragmentShadersFromFile ( 00343 // char * geomFile, char * fragFile ); 00344 GLSLProgramObject * LoadFromFile ( char * vertFile, char * fragFile ); 00345 GLSLProgramObject * LoadOnlyAVertexShaderFromFile ( char * vertFile ); 00346 GLSLProgramObject * LoadOnlyAGeometryShaderFromFile ( char * geomFile ); 00347 GLSLProgramObject * LoadOnlyAFragmentShaderFromFile ( char * fragFile ); 00348 //--------------------------------------------------------------- 00349 // Load vertex/fragment shader from memory 00350 GLSLProgramObject * LoadFromMemory ( const char * vertMem, const char * fragMem ); 00351 //--------------------------------------------------------------- 00352 // Delete a program object 00353 bool Delete ( GLSLProgramObject * obj ); 00354 //---------------------------------------------------------------- 00355 std::vector< GLSLProgramObject * > & GetProgramObjectList () { 00356 return m_vProgramObjectList; 00357 } 00358 //---------------------------------------------------------------- 00359 std::vector< GLSLProgramObject * > const & GetProgramObjectList () const { 00360 return m_vProgramObjectList; 00361 } 00362 //---------------------------------------------------------------- 00363 protected: 00364 bool LoadVertexShaderFromFile ( GLSLVertexShader * vertShader, const char * vertFile ); 00365 bool LoadGeometryShaderFromFile ( GLSLGeometryShader * geomShader, const char * geomFile ); 00366 bool LoadFragmentShaderFromFile ( GLSLFragmentShader * fragShader, const char * fragFile ); 00367 bool CompileVertexShaderFromFile ( GLSLVertexShader * vertShader, const char * vertFile ); 00368 bool CompileGeometryShaderFromFile ( GLSLGeometryShader * geomShader, const char * vertFile ); 00369 bool CompileFragmentShaderFromFile ( GLSLFragmentShader * fragShader, const char * vertFile ); 00370 //---------------------------------------------------------------- 00371 private: 00372 std::vector< GLSLProgramObject * > m_vProgramObjectList; 00373 //=============================================================== 00374 //--------------------------------------------------------------- 00375 // For Attributes / Uniform Variables 00376 //=========================================== 00377 // Uniform Variables 00378 //------------------------------------------- 00379 // Scalars 00380 std::vector< float > m_f1Uniform; 00381 std::vector< int > m_i1Uniform; 00382 std::vector< bool > m_b1Uniform; 00383 //------------------------------------------- 00384 // Vectors 00385 std::vector< Vector2<float> > m_f2Uniform; 00386 std::vector< Vector2<int> > m_i2Uniform; 00387 std::vector< Vector2<bool> > m_b2Uniform; 00388 std::vector< Vector3<float> > m_f3Uniform; 00389 std::vector< Vector3<int> > m_i3Uniform; 00390 std::vector< Vector3<bool> > m_b3Uniform; 00391 std::vector< Vector4<float> > m_f4Uniform; 00392 std::vector< Vector4<int> > m_i4Uniform; 00393 std::vector< Vector4<bool> > m_b4Uniform; 00394 //------------------------------------------- 00395 // Matrices 00396 std::vector< ColMatrix2x2<float> > m_m2x2Uniform; 00397 std::vector< ColMatrix3x3<float> > m_m3x3Uniform; 00398 std::vector< ColMatrix4x4<float> > m_m4x4Uniform; 00399 //------------------------------------------- 00400 // Samplers 00401 // -------- 00402 // sampler1D Access a 1D texture 00403 // sampler2D Access a 2D texture 00404 // sampler3D Access a 3D texture 00405 // samplerCube Access a cube-map texture 00406 // sampler1DShadow Access a 1D depth texture with comparison 00407 // sampler2DShadow Access a 2D depth texture with comparison 00408 //------------------------------------------- 00409 //=========================================== 00410 // Attributes 00411 //------------------------------------------- 00412 // Scalars 00413 std::vector< short > m_s1VertexAttrib; 00414 std::vector< float > m_f1VertexAttrib; 00415 std::vector< double > m_d1VertexAttrib; 00416 //------------------------------------------- 00417 // 2D Vectors 00418 std::vector< Vector2<short> > m_s2VertexAttrib; 00419 std::vector< Vector2<float> > m_f2VertexAttrib; 00420 std::vector< Vector2<double> > m_d2VertexAttrib; 00421 // 3D Vectors 00422 std::vector< Vector3<short> > m_s3VertexAttrib; 00423 std::vector< Vector3<float> > m_f3VertexAttrib; 00424 std::vector< Vector3<double> > m_d3VertexAttrib; 00425 // 4D Vectors 00426 std::vector< Vector4<short> > m_s4VertexAttrib; 00427 std::vector< Vector4<float> > m_f4VertexAttrib; 00428 std::vector< Vector4<double> > m_d4VertexAttrib; 00429 std::vector< Vector4<char> > m_b4VertexAttrib; 00430 std::vector< Vector4<int> > m_i4VertexAttrib; 00431 std::vector< Vector4<unsigned char> > m_ub4VertexAttrib; 00432 std::vector< Vector4<unsigned short> > m_us4VertexAttrib; 00433 std::vector< Vector4<unsigned int> > m_ui4VertexAttrib; 00434 //--------------------------------------------------------------- 00435 //=============================================================== 00436 //------------------------------------------------------------------------- 00437 }; // End Class GLSLShaderManager 00438 //============================================================================= 00439 // Classless functions to initialize OpenGL Extensions and check for GLSL and 00440 // OpenGL Version 2 00441 bool GFnInitGLSL (); 00442 bool GFnCheckGLSL (); 00443 bool GFnCheckGL2 (); 00444 //============================================================================= 00445 END_NAMESPACE_TAPs__OpenGL 00446 //----------------------------------------------------------------------------- 00447 // Include definition if TAPs_USE_EXPORT is not defined 00448 #if !defined( TAPs_USE_EXPORT ) 00449 #include "TAPsGLSLFns.cpp" 00450 #endif 00451 //----------------------------------------------------------------------------- 00452 #endif 00453 //345678901234567890123456789012345678901234567890123456789012345678901234567890 00454 //--+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8