]> git.mxchange.org Git - simgear.git/blobdiff - simgear/screen/RenderTexture.cpp
MSVC fix.
[simgear.git] / simgear / screen / RenderTexture.cpp
index 364f5ef726221bd5d0362275b7ea85531396c54f..2214228a53e4527fc619d406dd48d957eb152d33 100644 (file)
 /*
  * Changelog:
  *
- * Jan. 2005, Removed GLEW dependencies, Erik Hofman
+ * Jan. 2005, Removed GLEW dependencies, Erik Hofman, Fred Bouvier
  */
 
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
+#ifdef HAVE_WINDOWS_H
+#  include <windows.h>
+#endif
 
 #include <simgear/compiler.h>
-#include <simgear/screen/RenderTexture.h>
 #include <simgear/screen/extensions.hxx>
+#include <simgear/screen/RenderTexture.h>
 
 #include <stdio.h>
 #include <stdlib.h>
 
 using namespace std;
 
+#ifdef _WIN32
+static bool fctPtrInited = false;
+/* WGL_ARB_pixel_format */
+static wglChoosePixelFormatARBProc wglChoosePixelFormatARBPtr = 0;
+static wglGetPixelFormatAttribivARBProc wglGetPixelFormatAttribivARBPtr = 0;
+/* WGL_ARB_pbuffer */
+static wglCreatePbufferARBProc wglCreatePbufferARBPtr = 0;
+static wglGetPbufferDCARBProc wglGetPbufferDCARBPtr = 0;
+static wglQueryPbufferARBProc wglQueryPbufferARBPtr = 0;
+static wglReleasePbufferDCARBProc wglReleasePbufferDCARBPtr = 0;
+static wglDestroyPbufferARBProc wglDestroyPbufferARBPtr = 0;
+/* WGL_ARB_render_texture */
+static wglBindTexImageARBProc wglBindTexImageARBPtr = 0;
+static wglReleaseTexImageARBProc wglReleaseTexImageARBPtr = 0;
+#endif
+
 //---------------------------------------------------------------------------
 // Function      : RenderTexture::RenderTexture
 // Description  : 
@@ -99,6 +122,7 @@ RenderTexture::RenderTexture(const char *strMode)
     _hPBuffer(NULL),
     _hPreviousDC(0),
     _hPreviousContext(0),
+#elif defined( __APPLE__ )
 #else
     _pDisplay(NULL),
     _hGLContext(NULL),
@@ -122,6 +146,7 @@ RenderTexture::RenderTexture(const char *strMode)
     
     _pbufferAttribs.push_back(WGL_PBUFFER_LARGEST_ARB);
     _pbufferAttribs.push_back(true);
+#elif defined( __APPLE__ )
 #else
     _pbufferAttribs.push_back(GLX_RENDER_TYPE_SGIX);
     _pbufferAttribs.push_back(GLX_RGBA_BIT_SGIX);
@@ -231,7 +256,7 @@ void PrintExtensionError( char* strMsg, ... )
     char strBuffer[512];
     va_list args;
     va_start(args, strMsg);
-#ifdef _WIN32
+#if defined _WIN32 && !defined __CYGWIN__
     _vsnprintf( strBuffer, 512, strMsg, args );
 #else
     vsnprintf( strBuffer, 512, strMsg, args );
@@ -241,6 +266,7 @@ void PrintExtensionError( char* strMsg, ... )
     fprintf(stderr, strMsg);
 }
 
+
 //---------------------------------------------------------------------------
 // Function            : RenderTexture::Initialize
 // Description     : 
@@ -271,7 +297,7 @@ bool RenderTexture::Initialize(int width, int height,
     if (_bInitialized)
         _Invalidate();
 
-#if _WIN32
+#ifdef _WIN32
     // Get the current context.
     HDC hdc = wglGetCurrentDC();
     if (NULL == hdc)
@@ -296,7 +322,7 @@ bool RenderTexture::Initialize(int width, int height,
     }
     else 
     {
-        if (!wglChoosePixelFormatARB(hdc, &_pixelFormatAttribs[0], NULL, 
+        if (!wglChoosePixelFormatARBPtr(hdc, &_pixelFormatAttribs[0], NULL, 
                                      1, &iFormat, &iNumFormats))
         {
             fprintf(stderr, 
@@ -315,7 +341,7 @@ bool RenderTexture::Initialize(int width, int height,
     }
     
     // Create the p-buffer.    
-    _hPBuffer = wglCreatePbufferARB(hdc, iFormat, _iWidth, _iHeight, 
+    _hPBuffer = wglCreatePbufferARBPtr(hdc, iFormat, _iWidth, _iHeight, 
                                     &_pbufferAttribs[0]);
     if (!_hPBuffer)
     {
@@ -326,7 +352,7 @@ bool RenderTexture::Initialize(int width, int height,
     }
     
     // Get the device context.
-    _hDC = wglGetPbufferDCARB( _hPBuffer);
+    _hDC = wglGetPbufferDCARBPtr( _hPBuffer);
     if ( !_hDC )
     {
         fprintf(stderr, 
@@ -368,8 +394,8 @@ bool RenderTexture::Initialize(int width, int height,
     }
     
     // Determine the actual width and height we were able to create.
-    wglQueryPbufferARB( _hPBuffer, WGL_PBUFFER_WIDTH_ARB, &_iWidth );
-    wglQueryPbufferARB( _hPBuffer, WGL_PBUFFER_HEIGHT_ARB, &_iHeight );
+    wglQueryPbufferARBPtr( _hPBuffer, WGL_PBUFFER_WIDTH_ARB, &_iWidth );
+    wglQueryPbufferARBPtr( _hPBuffer, WGL_PBUFFER_HEIGHT_ARB, &_iHeight );
     
     _bInitialized = true;
     
@@ -378,31 +404,31 @@ bool RenderTexture::Initialize(int width, int height,
     //int bits[6];
     int value;
     _iNumColorBits[0] = 
-        (wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value)) 
+        (wglGetPixelFormatAttribivARBPtr(_hDC, iFormat, 0, 1, &attrib, &value)) 
         ? value : 0;
     attrib = WGL_GREEN_BITS_ARB;
     _iNumColorBits[1] = 
-        (wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value)) 
+        (wglGetPixelFormatAttribivARBPtr(_hDC, iFormat, 0, 1, &attrib, &value)) 
         ? value : 0;
     attrib = WGL_BLUE_BITS_ARB;
     _iNumColorBits[2] = 
-        (wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value)) 
+        (wglGetPixelFormatAttribivARBPtr(_hDC, iFormat, 0, 1, &attrib, &value)) 
         ? value : 0;
     attrib = WGL_ALPHA_BITS_ARB;
     _iNumColorBits[3] = 
-        (wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value)) 
+        (wglGetPixelFormatAttribivARBPtr(_hDC, iFormat, 0, 1, &attrib, &value)) 
         ? value : 0; 
     attrib = WGL_DEPTH_BITS_ARB;
     _iNumDepthBits = 
-        (wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value)) 
+        (wglGetPixelFormatAttribivARBPtr(_hDC, iFormat, 0, 1, &attrib, &value)) 
         ? value : 0; 
     attrib = WGL_STENCIL_BITS_ARB;
     _iNumStencilBits = 
-        (wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value)) 
+        (wglGetPixelFormatAttribivARBPtr(_hDC, iFormat, 0, 1, &attrib, &value)) 
         ? value : 0; 
     attrib = WGL_DOUBLE_BUFFER_ARB;
     _bDoubleBuffered = 
-        (wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value)) 
+        (wglGetPixelFormatAttribivARBPtr(_hDC, iFormat, 0, 1, &attrib, &value)) 
         ? (value?true:false) : false; 
     
 #if defined(_DEBUG) | defined(DEBUG)
@@ -416,6 +442,7 @@ bool RenderTexture::Initialize(int width, int height,
     fprintf(stderr, "\n");
 #endif
 
+#elif defined( __APPLE__ )
 #else // !_WIN32
     _pDisplay = glXGetCurrentDisplay();
     GLXContext context = glXGetCurrentContext();
@@ -497,6 +524,7 @@ bool RenderTexture::Initialize(int width, int height,
         _wglGetLastError();
         return false;
     }
+#elif defined( __APPLE__ )
 #else
     _hPreviousContext = glXGetCurrentContext();
     _hPreviousDrawable = glXGetCurrentDrawable();
@@ -521,6 +549,7 @@ bool RenderTexture::Initialize(int width, int height,
         _wglGetLastError();
         return false;
     }
+#elif defined( __APPLE__ )
 #else
     if (False == glXMakeCurrent(_pDisplay, 
                                 _hPreviousDrawable, _hPreviousContext))
@@ -550,16 +579,16 @@ bool RenderTexture::_Invalidate()
     _iNumStencilBits = 0;
     
     if (_bIsTexture)
-        glDeleteTextures(1, &_iTextureID);
+        glDeleteTextures(1, (const GLuint*)&_iTextureID);
     if (_bIsDepthTexture) 
     {
         // [Redge]
         if (!_bHasARBDepthTexture) delete[] _pPoorDepthTexture;
         // [/Redge]
-        glDeleteTextures(1, &_iDepthTextureID);
+        glDeleteTextures(1, (const GLuint*)&_iDepthTextureID);
     }
     
-#if _WIN32
+#ifdef _WIN32
     if ( _hPBuffer )
     {
         // Check if we are currently rendering in the pbuffer
@@ -567,11 +596,12 @@ bool RenderTexture::_Invalidate()
             wglMakeCurrent(0,0);
         if (!_bCopyContext) 
             wglDeleteContext( _hGLContext);
-        wglReleasePbufferDCARB( _hPBuffer, _hDC);
-        wglDestroyPbufferARB( _hPBuffer );
+        wglReleasePbufferDCARBPtr( _hPBuffer, _hDC);
+        wglDestroyPbufferARBPtr( _hPBuffer );
         _hPBuffer = 0;
         return true;
     }
+#elif defined( __APPLE__ )
 #else
     if ( _hPBuffer )
     {
@@ -642,6 +672,7 @@ bool RenderTexture::Reset(const char *strMode, ...)
     
     _pbufferAttribs.push_back(WGL_PBUFFER_LARGEST_ARB);
     _pbufferAttribs.push_back(true);
+#elif defined( __APPLE__ )
 #else
     _pbufferAttribs.push_back(GLX_RENDER_TYPE_SGIX);
     _pbufferAttribs.push_back(GLX_RGBA_BIT_SGIX);
@@ -652,7 +683,7 @@ bool RenderTexture::Reset(const char *strMode, ...)
     va_list args;
     char strBuffer[256];
     va_start(args,strMode);
-#ifdef _WIN32
+#if defined _WIN32 && !defined __CYGWIN__
     _vsnprintf( strBuffer, 256, strMode, args );
 #else
     vsnprintf( strBuffer, 256, strMode, args );
@@ -695,9 +726,9 @@ bool RenderTexture::Resize(int iWidth, int iHeight)
     
     // Do same basic work as _Invalidate, but don't reset all our flags
     if (_bIsTexture)
-        glDeleteTextures(1, &_iTextureID);
+        glDeleteTextures(1, (const GLuint*)&_iTextureID);
     if (_bIsDepthTexture)
-        glDeleteTextures(1, &_iDepthTextureID);
+        glDeleteTextures(1, (const GLuint*)&_iDepthTextureID);
 #ifdef _WIN32
     if ( _hPBuffer )
     {
@@ -706,11 +737,12 @@ bool RenderTexture::Resize(int iWidth, int iHeight)
             wglMakeCurrent(0,0);
         if (!_bCopyContext) 
             wglDeleteContext( _hGLContext);
-        wglReleasePbufferDCARB( _hPBuffer, _hDC);
-        wglDestroyPbufferARB( _hPBuffer );
+        wglReleasePbufferDCARBPtr( _hPBuffer, _hDC);
+        wglDestroyPbufferARBPtr( _hPBuffer );
         _hPBuffer = 0;
         return true;
     }
+#elif defined( __APPLE__ )
 #else
     if ( _hPBuffer )
     {
@@ -753,6 +785,7 @@ bool RenderTexture::BeginCapture()
     _hPreviousContext = wglGetCurrentContext();
     if (NULL == _hPreviousContext)
         _wglGetLastError();
+#elif defined( __APPLE__ )
 #else
     _hPreviousContext = glXGetCurrentContext();
     _hPreviousDrawable = glXGetCurrentDrawable();
@@ -790,6 +823,7 @@ bool RenderTexture::EndCapture()
         _wglGetLastError();
         return false;
     }
+#elif defined( __APPLE__ )
 #else
     if (False == glXMakeCurrent(_pDisplay, _hPreviousDrawable, 
                                 _hPreviousContext))
@@ -859,6 +893,7 @@ bool RenderTexture::BeginCapture(RenderTexture* current)
     _hPreviousContext = current->_hPreviousContext;
     if (NULL == _hPreviousContext)
         _wglGetLastError();
+#elif defined( __APPLE__ )
 #else
     _hPreviousContext = current->_hPreviousContext;
     _hPreviousDrawable = current->_hPreviousDrawable;
@@ -930,11 +965,11 @@ bool RenderTexture::BindBuffer( int iBuffer )
     {
         glBindTexture(_iTextureTarget, _iTextureID);
         
-#if _WIN32
+#ifdef _WIN32
         if (RT_RENDER_TO_TEXTURE == _eUpdateMode && _bIsTexture &&
             (!_bIsBufferBound || _iCurrentBoundBuffer != iBuffer))
         {
-            if (FALSE == wglBindTexImageARB(_hPBuffer, iBuffer))
+            if (FALSE == wglBindTexImageARBPtr(_hPBuffer, iBuffer))
             {
                 //  WVB: WGL API considers binding twice to the same buffer
                 //  to be an error.  But we don't want to 
@@ -966,7 +1001,7 @@ bool RenderTexture::_BindDepthBuffer() const
         RT_RENDER_TO_TEXTURE == _eUpdateMode)
     {
         glBindTexture(_iTextureTarget, _iDepthTextureID);
-        if (FALSE == wglBindTexImageARB(_hPBuffer, WGL_DEPTH_COMPONENT_NV))
+        if (FALSE == wglBindTexImageARBPtr(_hPBuffer, WGL_DEPTH_COMPONENT_NV))
         {
             _wglGetLastError();
             return false;
@@ -1042,17 +1077,22 @@ void RenderTexture::_ParseModeString(const char *modeString,
             pfAttribs.push_back(bitVec[1]);
             pfAttribs.push_back(WGL_BLUE_BITS_ARB);
             pfAttribs.push_back(bitVec[2]);
+#elif defined( __APPLE__ )
+            pfAttribs.push_back(AGL_RED_SIZE);
+            pfAttribs.push_back(bitVec[0]);
+            pfAttribs.push_back(AGL_GREEN_SIZE);
+            pfAttribs.push_back(bitVec[1]);
+            pfAttribs.push_back(AGL_BLUE_SIZE);
+            pfAttribs.push_back(bitVec[2]);
 #else
-# ifndef sgi
             pfAttribs.push_back(GLX_RED_SIZE);
             pfAttribs.push_back(bitVec[0]);
             pfAttribs.push_back(GLX_GREEN_SIZE);
             pfAttribs.push_back(bitVec[1]);
             pfAttribs.push_back(GLX_BLUE_SIZE);
             pfAttribs.push_back(bitVec[2]);
-# endif
 #endif
-                       _iNumComponents += 3;
+           _iNumComponents += 3;
             continue;
         }
                else if (kv.first == "rgb") 
@@ -1085,8 +1125,16 @@ void RenderTexture::_ParseModeString(const char *modeString,
             pfAttribs.push_back(bitVec[2]);
             pfAttribs.push_back(WGL_ALPHA_BITS_ARB);
             pfAttribs.push_back(bitVec[3]);
+#elif defined( __APPLE__ )
+            pfAttribs.push_back(AGL_RED_SIZE);
+            pfAttribs.push_back(bitVec[0]);
+            pfAttribs.push_back(AGL_GREEN_SIZE);
+            pfAttribs.push_back(bitVec[1]);
+            pfAttribs.push_back(AGL_BLUE_SIZE);
+            pfAttribs.push_back(bitVec[2]);
+            pfAttribs.push_back(AGL_ALPHA_SIZE);
+            pfAttribs.push_back(bitVec[3]);
 #else
-# ifndef sgi
             pfAttribs.push_back(GLX_RED_SIZE);
             pfAttribs.push_back(bitVec[0]);
             pfAttribs.push_back(GLX_GREEN_SIZE);
@@ -1095,9 +1143,8 @@ void RenderTexture::_ParseModeString(const char *modeString,
             pfAttribs.push_back(bitVec[2]);
             pfAttribs.push_back(GLX_ALPHA_SIZE);
             pfAttribs.push_back(bitVec[3]);
-# endif
 #endif
-                       _iNumComponents = 4;
+           _iNumComponents = 4;
             continue;
         }
                else if (kv.first == "rgba") 
@@ -1116,6 +1163,9 @@ void RenderTexture::_ParseModeString(const char *modeString,
 #ifdef _WIN32
             pfAttribs.push_back(WGL_RED_BITS_ARB);
             pfAttribs.push_back(bitVec[0]);
+#elif defined( __APPLE__ )
+            pfAttribs.push_back(AGL_RED_SIZE);
+            pfAttribs.push_back(bitVec[0]);
 #else
             pfAttribs.push_back(GLX_RED_SIZE);
             pfAttribs.push_back(bitVec[0]);
@@ -1146,6 +1196,11 @@ void RenderTexture::_ParseModeString(const char *modeString,
             pfAttribs.push_back(bitVec[0]);
             pfAttribs.push_back(WGL_GREEN_BITS_ARB);
             pfAttribs.push_back(bitVec[1]);
+#elif defined( __APPLE__ )
+            pfAttribs.push_back(AGL_RED_SIZE);
+            pfAttribs.push_back(bitVec[0]);
+            pfAttribs.push_back(AGL_GREEN_SIZE);
+            pfAttribs.push_back(bitVec[1]);
 #else
             pfAttribs.push_back(GLX_RED_SIZE);
             pfAttribs.push_back(bitVec[0]);
@@ -1175,6 +1230,8 @@ void RenderTexture::_ParseModeString(const char *modeString,
             bHasStencil = true;
 #ifdef _WIN32
             pfAttribs.push_back(WGL_STENCIL_BITS_ARB);
+#elif defined( __APPLE__ )
+            pfAttribs.push_back(AGL_STENCIL_SIZE);
 #else
             pfAttribs.push_back(GLX_STENCIL_SIZE);
 #endif
@@ -1192,6 +1249,11 @@ void RenderTexture::_ParseModeString(const char *modeString,
             pfAttribs.push_back(1);
             pfAttribs.push_back(WGL_SAMPLES_ARB);
             pfAttribs.push_back(strtol(kv.second.c_str(), 0, 10));
+#elif defined( __APPLE__ )
+            pfAttribs.push_back(AGL_SAMPLE_BUFFERS_ARB);
+            pfAttribs.push_back(1);
+            pfAttribs.push_back(AGL_SAMPLES_ARB);
+            pfAttribs.push_back(strtol(kv.second.c_str(), 0, 10));
 #else
            pfAttribs.push_back(GL_SAMPLE_BUFFERS_ARB);
            pfAttribs.push_back(1);
@@ -1207,6 +1269,9 @@ void RenderTexture::_ParseModeString(const char *modeString,
 #ifdef _WIN32
             pfAttribs.push_back(WGL_DOUBLE_BUFFER_ARB);
             pfAttribs.push_back(true);
+#elif defined( __APPLE__ )
+            pfAttribs.push_back(AGL_DOUBLEBUFFER);
+            pfAttribs.push_back(True);
 #else
             pfAttribs.push_back(GL_DOUBLEBUFFER);
             pfAttribs.push_back(True);
@@ -1218,6 +1283,8 @@ void RenderTexture::_ParseModeString(const char *modeString,
         {
 #ifdef _WIN32
             pfAttribs.push_back(WGL_AUX_BUFFERS_ARB);
+#elif defined( __APPLE__ )
+            pfAttribs.push_back(AGL_AUX_BUFFERS);
 #else
             pfAttribs.push_back(GL_AUX_BUFFERS);
 #endif
@@ -1325,6 +1392,8 @@ void RenderTexture::_ParseModeString(const char *modeString,
 
 #ifdef _WIN32
     pfAttribs.push_back(WGL_DEPTH_BITS_ARB);
+#elif defined( __APPLE__ )
+    pfAttribs.push_back(AGL_DEPTH_SIZE);
 #else
     pfAttribs.push_back(GLX_DEPTH_SIZE);
 #endif
@@ -1335,6 +1404,9 @@ void RenderTexture::_ParseModeString(const char *modeString,
 #ifdef _WIN32
         pfAttribs.push_back(WGL_STENCIL_BITS_ARB);
         pfAttribs.push_back(0);
+#elif defined( __APPLE__ )
+        pfAttribs.push_back(AGL_STENCIL_SIZE);
+        pfAttribs.push_back(0);
 #else
         pfAttribs.push_back(GLX_STENCIL_SIZE);
         pfAttribs.push_back(0);
@@ -1390,7 +1462,7 @@ void RenderTexture::_ParseModeString(const char *modeString,
 
 #elif defined(DEBUG) || defined(_DEBUG)
         printf("RenderTexture Error: Render to Texture not "
-               "supported in Linux\n");
+               "supported in Linux or MacOS\n");
 #endif  
     }
 
@@ -1411,6 +1483,7 @@ void RenderTexture::_ParseModeString(const char *modeString,
             pfAttribs.push_back(WGL_PIXEL_TYPE_ARB);
             pfAttribs.push_back(WGL_TYPE_RGBA_FLOAT_ATI);
         }
+#elif defined( __APPLE__ )
 #else
         if (GL_NV_float_buffer)
         {
@@ -1524,7 +1597,7 @@ void RenderTexture::_ParseModeString(const char *modeString,
 #elif defined(DEBUG) || defined(_DEBUG)
         fprintf(stderr, 
                 "RenderTexture Error: Render to Texture not supported in "
-                "Linux\n");
+                "Linux or MacOS\ n");
 #endif  
     }
         
@@ -1549,7 +1622,7 @@ void RenderTexture::_ParseModeString(const char *modeString,
         }
 #elif defined(DEBUG) || defined(_DEBUG)
         printf("RenderTexture Error: Render to Texture not supported in "
-               "Linux\n");
+               "Linux or MacOS\n");
 #endif 
     }
 }
@@ -1622,51 +1695,81 @@ vector<int> RenderTexture::_ParseBitVector(string bitVector)
 bool RenderTexture::_VerifyExtensions()
 {
 #ifdef _WIN32
-    if (!WGL_ARB_pbuffer)
+    if ( !fctPtrInited )
     {
-        PrintExtensionError("WGL_ARB_pbuffer");
-        return false;
-    }
-    if (!WGL_ARB_pixel_format)
-    {
-        PrintExtensionError("WGL_ARB_pixel_format");
-        return false;
-    }
-    if (_bIsTexture && !WGL_ARB_render_texture)
-    {
-        PrintExtensionError("WGL_ARB_render_texture");
-        return false;
-    }
-    if (_bRectangle && !GL_NV_texture_rectangle)
-    {
-        PrintExtensionError("GL_NV_texture_rectangle");
-        return false;
-    }
-    if (_bFloat && !(GL_NV_float_buffer || WGL_ATI_pixel_format_float))
-    {
-        PrintExtensionError("GL_NV_float_buffer or GL_ATI_pixel_format_float");
-        return false;
-    
-    }
-    if (_bFloat && _bIsTexture && !(GL_NV_float_buffer || GL_ATI_texture_float))
-    {
-        PrintExtensionError("NV_float_buffer or ATI_texture_float");
-    }
-    if (_bIsDepthTexture && !GL_ARB_depth_texture)
-    {
-        // [Redge]
+        fctPtrInited = true;
+        wglGetExtensionsStringARBProc wglGetExtensionsStringARBPtr = (wglGetExtensionsStringARBProc)wglGetProcAddress( "wglGetExtensionsStringARB" );
+        if ( wglGetExtensionsStringARBPtr == 0 )
+        {
+            PrintExtensionError("WGL_ARB_extensions_string");
+            return false;
+        }
+        string wglExtensionsString = wglGetExtensionsStringARBPtr( wglGetCurrentDC() );
+        if ( SGSearchExtensionsString( wglExtensionsString.c_str(), "WGL_ARB_pixel_format" ) )
+        {
+            wglChoosePixelFormatARBPtr = (wglChoosePixelFormatARBProc)SGLookupFunction("wglChoosePixelFormatARB");
+            wglGetPixelFormatAttribivARBPtr = (wglGetPixelFormatAttribivARBProc)SGLookupFunction("wglGetPixelFormatAttribivARB");
+        }
+        else
+        {
+            PrintExtensionError("WGL_ARB_pixel_format");
+            return false;
+        }
+        if ( SGSearchExtensionsString( wglExtensionsString.c_str(), "WGL_ARB_pbuffer" ) )
+        {
+            wglCreatePbufferARBPtr = (wglCreatePbufferARBProc)SGLookupFunction("wglCreatePbufferARB");
+            wglGetPbufferDCARBPtr = (wglGetPbufferDCARBProc)SGLookupFunction("wglGetPbufferDCARB");
+            wglQueryPbufferARBPtr = (wglQueryPbufferARBProc)SGLookupFunction("wglQueryPbufferARB");
+            wglReleasePbufferDCARBPtr = (wglReleasePbufferDCARBProc)SGLookupFunction("wglReleasePbufferDCARB");
+            wglDestroyPbufferARBPtr = (wglDestroyPbufferARBProc)SGLookupFunction("wglDestroyPbufferARB");
+        }
+        else
+        {
+            PrintExtensionError("WGL_ARB_pbuffer");
+            return false;
+        }
+        if ( SGSearchExtensionsString( wglExtensionsString.c_str(), "WGL_ARB_render_texture" ) )
+        {
+            wglBindTexImageARBPtr = (wglBindTexImageARBProc)SGLookupFunction("wglBindTexImageARB");
+            wglReleaseTexImageARBPtr = (wglReleaseTexImageARBProc)SGLookupFunction("wglReleaseTexImageARB");
+        }
+        else if ( _bIsTexture )
+        {
+            PrintExtensionError("WGL_ARB_render_texture");
+            return false;
+        }
+        if (_bRectangle && !SGIsOpenGLExtensionSupported( "GL_NV_texture_rectangle" ))
+        {
+            PrintExtensionError("GL_NV_texture_rectangle");
+            return false;
+        }
+        if (_bFloat && !(SGIsOpenGLExtensionSupported( "GL_NV_float_buffer" ) || SGSearchExtensionsString( wglExtensionsString.c_str(), "WGL_ATI_pixel_format_float" )))
+        {
+            PrintExtensionError("GL_NV_float_buffer or GL_ATI_pixel_format_float");
+            return false;
+        
+        }
+        if (_bFloat && _bIsTexture && !(SGIsOpenGLExtensionSupported( "GL_NV_float_buffer" ) || SGIsOpenGLExtensionSupported( "GL_ATI_texture_float" )))
+        {
+            PrintExtensionError("NV_float_buffer or ATI_texture_float");
+        }
+        if (_bIsDepthTexture && !SGIsOpenGLExtensionSupported( "GL_ARB_depth_texture" ))
+        {
+            // [Redge]
 #if defined(_DEBUG) | defined(DEBUG)
-        fprintf(stderr, 
-                "RenderTexture Warning: "
-                "OpenGL extension GL_ARB_depth_texture not available.\n"
-                "         Using glReadPixels() to emulate behavior.\n");
+            fprintf(stderr, 
+                    "RenderTexture Warning: "
+                    "OpenGL extension GL_ARB_depth_texture not available.\n"
+                    "         Using glReadPixels() to emulate behavior.\n");
 #endif   
-        _bHasARBDepthTexture = false;
-        //PrintExtensionError("GL_ARB_depth_texture");
-        //return false;
-        // [/Redge]
+            _bHasARBDepthTexture = false;
+            //PrintExtensionError("GL_ARB_depth_texture");
+            //return false;
+            // [/Redge]
+        }
+        SetLastError(0);
     }
-    SetLastError(0);
+#elif defined( __APPLE__ )
 #else
     if (!GLX_SGIX_pbuffer)
     {
@@ -1719,7 +1822,7 @@ bool RenderTexture::_InitializeTextures()
 
     if (_bIsTexture)
     {
-        glGenTextures(1, &_iTextureID);
+        glGenTextures(1, (GLuint*)&_iTextureID);
         glBindTexture(_iTextureTarget, _iTextureID);  
         
         // Use clamp to edge as the default texture wrap mode for all tex
@@ -1830,7 +1933,7 @@ bool RenderTexture::_InitializeTextures()
   
     if (_bIsDepthTexture)
     { 
-        glGenTextures(1, &_iDepthTextureID);
+        glGenTextures(1, (GLuint*)&_iDepthTextureID);
         glBindTexture(_iTextureTarget, _iDepthTextureID);  
         
         // Use clamp to edge as the default texture wrap mode for all tex
@@ -1944,7 +2047,7 @@ bool RenderTexture::_ReleaseBoundBuffers()
         // release the pbuffer from the render texture object
         if (0 != _iCurrentBoundBuffer && _bIsBufferBound)
         {
-            if (FALSE == wglReleaseTexImageARB(_hPBuffer, _iCurrentBoundBuffer))
+            if (FALSE == wglReleaseTexImageARBPtr(_hPBuffer, _iCurrentBoundBuffer))
             {
                 _wglGetLastError();
                 return false;
@@ -1958,7 +2061,7 @@ bool RenderTexture::_ReleaseBoundBuffers()
         glBindTexture(_iTextureTarget, _iDepthTextureID);
         
         // release the pbuffer from the render texture object
-        if (FALSE == wglReleaseTexImageARB(_hPBuffer, WGL_DEPTH_COMPONENT_NV))
+        if (FALSE == wglReleaseTexImageARBPtr(_hPBuffer, WGL_DEPTH_COMPONENT_NV))
         {
             _wglGetLastError();
             return false;
@@ -1989,6 +2092,7 @@ bool RenderTexture::_MakeCurrent()
         _wglGetLastError();
         return false;
     }
+#elif defined( __APPLE__ )
 #else
     if (false == glXMakeCurrent(_pDisplay, _hPBuffer, _hGLContext)) 
     {
@@ -2040,6 +2144,7 @@ RenderTexture::RenderTexture(int width, int height,
     _hPBuffer(NULL),
     _hPreviousDC(0),
     _hPreviousContext(0),
+#elif defined( __APPLE__ )
 #else
     _pDisplay(NULL),
     _hGLContext(NULL),
@@ -2156,6 +2261,7 @@ bool RenderTexture::Initialize(bool         bShare       /* = true */,
     
     _pbufferAttribs.push_back(WGL_PBUFFER_LARGEST_ARB);
     _pbufferAttribs.push_back(true);
+#elif defined( __APPLE__ )
 #else
     _pixelFormatAttribs.push_back(GLX_RENDER_TYPE_SGIX);
     _pixelFormatAttribs.push_back(GLX_RGBA_BIT_SGIX);