TAPs 0.7.7.3
TAPsGLSLFns.hpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines