CelestiaContent/src/glext.cpp

229 lines
7.4 KiB
C++

// glext.cpp
#include <string.h>
#include "gl.h"
#include "glext.h"
// ARB_texture_compression
PFNGLCOMPRESSEDTEXIMAGE3DARBPROC glCompressedTexImage3DARB;
PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glCompressedTexImage2DARB;
PFNGLCOMPRESSEDTEXIMAGE1DARBPROC glCompressedTexImage1DARB;
PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC glCompressedTexSubImage3DARB;
PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC glCompressedTexSubImage2DARB;
PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC glCompressedTexSubImage1DARB;
// ARB_multitexture command function pointers
PFNGLMULTITEXCOORD2IARBPROC glMultiTexCoord2iARB;
PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB;
PFNGLMULTITEXCOORD3FARBPROC glMultiTexCoord3fARB;
PFNGLMULTITEXCOORD3FVARBPROC glMultiTexCoord3fvARB;
PFNGLACTIVETEXTUREARBPROC glActiveTextureARB;
PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB;
// NV_register_combiners command function pointers
PFNGLCOMBINERPARAMETERFVNVPROC glCombinerParameterfvNV;
PFNGLCOMBINERPARAMETERIVNVPROC glCombinerParameterivNV;
PFNGLCOMBINERPARAMETERFNVPROC glCombinerParameterfNV;
PFNGLCOMBINERPARAMETERINVPROC glCombinerParameteriNV;
PFNGLCOMBINERINPUTNVPROC glCombinerInputNV;
PFNGLCOMBINEROUTPUTNVPROC glCombinerOutputNV;
PFNGLFINALCOMBINERINPUTNVPROC glFinalCombinerInputNV;
PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC glGetCombinerInputParameterfvNV;
PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC glGetCombinerInputParameterivNV;
PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC glGetCombinerOutputParameterfvNV;
PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC glGetCombinerOutputParameterivNV;
PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC glGetFinalCombinerInputParameterfvNV;
PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC glGetFinalCombinerInputParameterivNV;
// EXT_paletted_texture command function pointers
PFNGLCOLORTABLEEXTPROC glColorTableEXT;
// WGL_EXT_swap_control command function pointers
PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT;
PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT;
// extern void Alert(const char *szFormat, ...);
void Alert(const char *szFormat, ...)
{
}
#if 0
// Check for required extensions and initialize them if present
bool InitGLExtensions(void)
{
#if 0
if (!extensionSupported("GL_EXT_bgra")) {
Alert("Required OpenGL extension GL_EXT_bgra not supported");
return false;
}
#endif
if (!extensionSupported("GL_ARB_multitexture")) {
Alert("Required OpenGL extension GL_ARB_multitexture not supported");
return false;
}
#if 0
if (!extensionSupported("GL_EXT_texture_env_combine")) {
Alert("Required OpenGL extension GL_EXT_texture_env_combine not supported");
return false;
}
if (!extensionSupported("GL_NV_register_combiners")) {
Alert("Required OpenGL extension GL_NV_register_combiners not supported");
return false;
}
if (!extensionSupported("GL_EXT_texture_cube_map")) {
Alert("Required OpenGL extension GL_EXT_texture_cube_map not supported");
return false;
}
if (!extensionSupported("GL_EXT_separate_specular_color")) {
Alert("Required OpenGL extension GL_EXT_separate_specular_color not supported");
return false;
}
if (!extensionSupported("WGL_EXT_swap_control")) {
Alert("Required OpenGL extension WGL_EXT_swap_control not supported");
return false;
}
#endif
initMultiTexture();
#if 0
initRegisterCombiners();
initSwapControl();
#endif
return true;
}
#endif
// ARB_multitexture
void InitExtMultiTexture()
{
glMultiTexCoord2iARB =
(PFNGLMULTITEXCOORD2IARBPROC) wglGetProcAddress("glMultiTexCoord2iARB");
glMultiTexCoord2fARB =
(PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress("glMultiTexCoord2fARB");
glMultiTexCoord3fARB =
(PFNGLMULTITEXCOORD3FARBPROC) wglGetProcAddress("glMultiTexCoord3fARB");
glMultiTexCoord3fvARB =
(PFNGLMULTITEXCOORD3FVARBPROC) wglGetProcAddress("glMultiTexCoord3fvARB");
glActiveTextureARB =
(PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress("glActiveTextureARB");
glClientActiveTextureARB =
(PFNGLCLIENTACTIVETEXTUREARBPROC) wglGetProcAddress("glClientActiveTextureARB");
}
// ARB_texture_compression
void InitExtTextureCompression()
{
glCompressedTexImage3DARB =
(PFNGLCOMPRESSEDTEXIMAGE3DARBPROC)
wglGetProcAddress("glCompressedTexImage3DARB");
glCompressedTexImage2DARB =
(PFNGLCOMPRESSEDTEXIMAGE2DARBPROC)
wglGetProcAddress("glCompressedTexImage2DARB");
glCompressedTexImage1DARB =
(PFNGLCOMPRESSEDTEXIMAGE1DARBPROC)
wglGetProcAddress("glCompressedTexImage1DARB");
glCompressedTexSubImage3DARB =
(PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC)
wglGetProcAddress("glCompressedTexSubImage3DARB");
glCompressedTexSubImage2DARB =
(PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC)
wglGetProcAddress("glCompressedTexSubImage2DARB");
glCompressedTexSubImage1DARB =
(PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC)
wglGetProcAddress("glCompressedTexSubImage1DARB");
}
// NV_register_combiners
void InitExtRegisterCombiners()
{
/* Retrieve all NV_register_combiners routines. */
glCombinerParameterfvNV =
(PFNGLCOMBINERPARAMETERFVNVPROC)
wglGetProcAddress("glCombinerParameterfvNV");
glCombinerParameterivNV =
(PFNGLCOMBINERPARAMETERIVNVPROC)
wglGetProcAddress("glCombinerParameterivNV");
glCombinerParameterfNV =
(PFNGLCOMBINERPARAMETERFNVPROC)
wglGetProcAddress("glCombinerParameterfNV");
glCombinerParameteriNV =
(PFNGLCOMBINERPARAMETERINVPROC)
wglGetProcAddress("glCombinerParameteriNV");
glCombinerInputNV =
(PFNGLCOMBINERINPUTNVPROC)
wglGetProcAddress("glCombinerInputNV");
glCombinerOutputNV =
(PFNGLCOMBINEROUTPUTNVPROC)
wglGetProcAddress("glCombinerOutputNV");
glFinalCombinerInputNV =
(PFNGLFINALCOMBINERINPUTNVPROC)
wglGetProcAddress("glFinalCombinerInputNV");
glGetCombinerInputParameterfvNV =
(PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC)
wglGetProcAddress("glGetCombinerInputParameterfvNV");
glGetCombinerInputParameterivNV =
(PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC)
wglGetProcAddress("glGetCombinerInputParameterivNV");
glGetCombinerOutputParameterfvNV =
(PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC)
wglGetProcAddress("glGetCombinerOutputParameterfvNV");
glGetCombinerOutputParameterivNV =
(PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC)
wglGetProcAddress("glGetCombinerOutputParameterivNV");
glGetFinalCombinerInputParameterfvNV =
(PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC)
wglGetProcAddress("glGetFinalCombinerInputParameterfvNV");
glGetFinalCombinerInputParameterivNV =
(PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC)
wglGetProcAddress("glGetFinalCombinerInputParameterivNV");
}
void InitExtPalettedTexture()
{
// glColorTableEXT = (void *) wglGetProcAddress("glColorTableEXT");
}
void InitExtSwapControl()
{
wglSwapIntervalEXT =
(PFNWGLSWAPINTERVALEXTPROC) wglGetProcAddress("wglSwapIntervalEXT");
wglGetSwapIntervalEXT =
(PFNWGLGETSWAPINTERVALEXTPROC) wglGetProcAddress("wglGetSwapIntervalEXT");
}
bool ExtensionSupported(char *ext)
{
char *extensions = (char *) glGetString(GL_EXTENSIONS);
if (extensions == NULL)
return false;
int len = strlen(ext);
for (;;) {
if (strncmp(extensions, ext, len) == 0)
return true;
extensions = strchr(extensions, ' ');
if (extensions != NULL)
extensions++;
else
break;
}
return false;
}