00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00021
00022
00023 #ifndef H_SPK_GLEXTHANDLER
00024 #define H_SPK_GLEXTHANDLER
00025
00026 #include "Core/SPK_DEF.h"
00027 #include "RenderingAPIs/OpenGL/SPK_GL_DEF.h"
00028
00029
00030 #define GL_POINT_SPRITE 0x8861
00031 #define GL_COORD_REPLACE 0x8862
00032 #define GL_POINT_DISTANCE_ATTENUATION 0x8129
00033 #define GL_POINT_SIZE_MIN 0x8126
00034 #define GL_POINT_SIZE_MAX 0x8127
00035 #define GL_TEXTURE_3D 0x806F
00036
00037
00038 namespace SPK
00039 {
00040 namespace GL
00041 {
00064 class SPK_GL_PREFIX GLExtHandler
00065 {
00066 public :
00067
00069
00071
00082 static bool loadGLExtPointSprite();
00083
00085
00087
00098 static bool loadGLExtPointParameter();
00099
00111 static void setPixelPerUnit(float fovy,int screenHeight);
00112
00114
00116
00128 static bool loadGLExtTexture3D();
00129
00151 static void glTexImage3D(GLenum target,
00152 GLint level,
00153 GLenum internalFormat,
00154 GLsizei width,
00155 GLsizei height,
00156 GLsizei depth,
00157 GLint border,
00158 GLenum format,
00159 GLenum type,
00160 const GLvoid* pixels);
00161
00163
00165
00179 static bool loadGLExtShader();
00180
00181 protected :
00182
00187 enum GLExtension
00188 {
00189 UNCHECKED,
00190 SUPPORTED,
00191 UNSUPPORTED,
00192 };
00193
00199 static void* glGetProcAddress(const char* name);
00200
00202
00204
00209 static GLExtension getPointSpriteGLExt();
00210
00216 static void enablePointSpriteGLExt();
00217
00223 static void disablePointSpriteGLExt();
00224
00226
00228
00233 static GLExtension getPointParameterGLExt();
00234
00250 static void enablePointParameterGLExt(float size,bool distance);
00251
00257 static void disablePointParameterGLExt();
00258
00260
00262
00268 static GLExtension getTexture3DGLExt();
00269
00271
00273
00279 static GLExtension getShaderGLExt();
00280
00281 private :
00282
00283
00284 typedef char GLchar;
00285
00286
00287 typedef void (APIENTRY *SPK_PFNGLPOINTPARAMETERFPROC)(GLenum,GLfloat);
00288 typedef void (APIENTRY *SPK_PFNGLPOINTPARAMETERFVPROC)(GLenum,const GLfloat*);
00289 typedef void (APIENTRY *SPK_PFNGLTEXIMAGE3DPROC)(GLenum,GLint,GLint,GLsizei,GLsizei,GLsizei,GLint,GLenum,GLenum,const GLvoid*);
00290 typedef void (APIENTRY *SPK_PFNGLCREATESHADERPROC)(GLenum);
00291 typedef void (APIENTRY *SPK_PFNGLDELETESHADERPROC)(GLuint);
00292 typedef void (APIENTRY *SPK_PFNGLSHADERSOURCEPROC)(GLuint,GLsizei,const GLchar**,const GLint*);
00293 typedef void (APIENTRY *SPK_PFNGLCOMPILESHADERPROC)(GLuint);
00294 typedef void (APIENTRY *SPK_PFNGLCREATEPROGRAMPROC)(void);
00295 typedef void (APIENTRY *SPK_PFNGLDELETEPROGRAMPROC)(GLuint);
00296 typedef void (APIENTRY *SPK_PFNGLATTACHSHADERPROC)(GLuint,GLuint);
00297 typedef void (APIENTRY *SPK_PFNGLDETACHSHADERPROC)(GLuint,GLuint);
00298 typedef void (APIENTRY *SPK_PFNGLLINKPROGRAMPROC)(GLuint);
00299 typedef void (APIENTRY *SPK_PFNGLUSEPROGRAMPROC)(GLuint);
00300
00301
00302 #if defined(__APPLE__) || defined(macintosh)
00303 static void* SPK_NSGLGetProcAddress(const char* name);
00304 #endif
00305
00307
00309
00310 static GLExtension pointSpriteGLExt;
00311
00313
00315
00316 static GLExtension pointParameterGLExt;
00317
00318 static SPK_PFNGLPOINTPARAMETERFPROC SPK_glPointParameterf;
00319 static SPK_PFNGLPOINTPARAMETERFVPROC SPK_glPointParameterfv;
00320
00321 static const float POINT_SIZE_CURRENT;
00322 static const float POINT_SIZE_MIN;
00323 static const float POINT_SIZE_MAX;
00324
00325 static float pixelPerUnit;
00326
00327 static const float QUADRATIC_SCREEN[3];
00328
00330
00332
00333 static GLExtension texture3DGLExt;
00334
00335 static SPK_PFNGLTEXIMAGE3DPROC SPK_glTexImage3D;
00336
00338
00340
00341 static GLExtension shaderGLExt;
00342
00343 static SPK_PFNGLCREATESHADERPROC SPK_glCreateShader;
00344 static SPK_PFNGLDELETESHADERPROC SPK_glDeleteShader;
00345 static SPK_PFNGLSHADERSOURCEPROC SPK_glShaderSource;
00346 static SPK_PFNGLCOMPILESHADERPROC SPK_glCompileShader;
00347 static SPK_PFNGLCREATEPROGRAMPROC SPK_glCreateProgram;
00348 static SPK_PFNGLDELETEPROGRAMPROC SPK_glDeleteProgram;
00349 static SPK_PFNGLATTACHSHADERPROC SPK_glAttachShader;
00350 static SPK_PFNGLDETACHSHADERPROC SPK_glDetachShader;
00351 static SPK_PFNGLLINKPROGRAMPROC SPK_glLinkProgram;
00352 static SPK_PFNGLUSEPROGRAMPROC SPK_glUseProgram;
00353 };
00354
00355
00356 inline void* GLExtHandler::glGetProcAddress(const char* name)
00357 {
00358 #if defined(WIN32) || defined(_WIN32)
00359 return (void*)wglGetProcAddress(name);
00360 #elif defined(__APPLE__) || defined(macintosh)
00361 return (void*)SPK_NSGLGetProcAddress(name);
00362 #elif defined(linux) || defined(__linux)
00363 return (void*)glXGetProcAddressARB(reinterpret_cast<const GLubyte*>(name));
00364 #else
00365 return (void*)NULL;
00366 #endif
00367 }
00368
00369 inline void GLExtHandler::enablePointSpriteGLExt()
00370 {
00371 glTexEnvf(GL_POINT_SPRITE,GL_COORD_REPLACE,GL_TRUE);
00372 glEnable(GL_POINT_SPRITE);
00373 }
00374
00375 inline void GLExtHandler::disablePointSpriteGLExt()
00376 {
00377 glDisable(GL_POINT_SPRITE);
00378 }
00379 }}
00380
00381 #endif