Alexander Powell:

Add MAC OS X Render Texture support:

Most texture modes seem to work on my Powerbook, but I don't have a wide array
of machines to test it on otherwise.

If you have problems, please let me know and I'll see if I can help track down
the source of the bug.  I'd love to keep working on it if time permits (I use
RenderTexture in a few other projects), so I'll keep you informed if there are
any changes that I make for the better.
This commit is contained in:
ehofman
2006-03-09 09:54:43 +00:00
parent 359a8c4a81
commit 6b68d9d90b
3 changed files with 474 additions and 43 deletions

View File

@@ -26,6 +26,7 @@
// Original RenderTexture class: Mark J. Harris
// Original Render to Depth Texture support: Thorsten Scheuermann
// Linux Copy-to-texture: Eric Werness
// OS X: Alexander Powell (someone please help)
// Various Bug Fixes: Daniel (Redge) Sperl
// Bill Baxter
//
@@ -43,6 +44,7 @@
*
* Jan. 2005, Removed GLEW dependencies, Erik Hofman, Fred Bouvier
* Nov. 2005, Use the simgear logging facility, Erik Hofman
* Mar. 2006, Add MAC OS X support, Alexander Powell
*/
#ifdef HAVE_CONFIG_H
@@ -84,7 +86,7 @@ static wglDestroyPbufferARBProc wglDestroyPbufferARBPtr = 0;
static wglBindTexImageARBProc wglBindTexImageARBPtr = 0;
static wglReleaseTexImageARBProc wglReleaseTexImageARBPtr = 0;
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
#else /* !_WIN32 */
static bool glXVersion1_3Present = false;
static glXChooseFBConfigProc glXChooseFBConfigPtr = 0;
@@ -112,7 +114,7 @@ RenderTexture::RenderTexture(const char *strMode)
_bIsTexture(false),
_bIsDepthTexture(false),
_bHasARBDepthTexture(true), // [Redge]
#ifdef _WIN32
#if defined(_WIN32) || defined(__MACH__)
_eUpdateMode(RT_RENDER_TO_TEXTURE),
#else
_eUpdateMode(RT_COPY_TO_TEXTURE),
@@ -136,7 +138,10 @@ RenderTexture::RenderTexture(const char *strMode)
_hPBuffer(NULL),
_hPreviousDC(0),
_hPreviousContext(0),
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
_hGLContext(NULL),
_hPBuffer(0),
_hPreviousContext(NULL),
#else
_pDisplay(NULL),
_hGLContext(NULL),
@@ -160,7 +165,11 @@ RenderTexture::RenderTexture(const char *strMode)
_pbufferAttribs.push_back(WGL_PBUFFER_LARGEST_ARB);
_pbufferAttribs.push_back(true);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
//_pixelFormatAttribs.push_back(kCGLPFANoRecovery);
_pixelFormatAttribs.push_back(kCGLPFAAccelerated);
_pixelFormatAttribs.push_back(kCGLPFAWindow);
_pixelFormatAttribs.push_back(kCGLPFAPBuffer);
#else
_pbufferAttribs.push_back(GLX_RENDER_TYPE_SGIX);
_pbufferAttribs.push_back(GLX_RGBA_BIT_SGIX);
@@ -173,6 +182,9 @@ RenderTexture::RenderTexture(const char *strMode)
#ifdef _WIN32
_pixelFormatAttribs.push_back(0);
_pbufferAttribs.push_back(0);
#elif defined(__MACH__)
_pixelFormatAttribs.push_back((CGLPixelFormatAttribute)0);
_pbufferAttribs.push_back((CGLPixelFormatAttribute)0);
#else
_pixelFormatAttribs.push_back(None);
#endif
@@ -192,6 +204,30 @@ RenderTexture::~RenderTexture()
_Invalidate();
}
//---------------------------------------------------------------------------
// Function : _cglcheckError
// Description :
//---------------------------------------------------------------------------
/**
* @fn _cglCheckError()
* @brief Prints to stderr a description when an OS X error is found.
*/
#ifdef __MACH__
static void _cglCheckErrorHelper(CGLError err, char *sourceFile, int sourceLine)
{
# ifdef _DEBUG
if (err)
{
fprintf(stderr, "RenderTexture CGL Error: %s at (%s,%d)",
CGLErrorString(err), sourceFile, sourceLine);
}
# endif
}
# define _cglCheckError(err) _cglCheckErrorHelper(err,__FILE__,__LINE__)
#endif
//---------------------------------------------------------------------------
// Function : _wglGetLastError
@@ -455,8 +491,134 @@ bool RenderTexture::Initialize(int width, int height,
if (_bDoubleBuffered) SG_LOG(SG_GL, SG_ALERT, " double buffered");
#endif
#elif defined( __APPLE__ )
#else // !_WIN32
#elif defined( __MACH__ )
// Get the current context.
CGLContextObj hglrc = CGLGetCurrentContext();
if (NULL == hglrc)
fprintf(stderr, "Couldn't get current context!");
CGLPixelFormatObj pixFormat = NULL;
long int iNumFormats;
CGLError error;
// Copy the _pixelFormatAttribs into another array to fix
// typecast issues
CGLPixelFormatAttribute *pixFormatAttribs =
(CGLPixelFormatAttribute *)malloc(sizeof(CGLPixelFormatAttribute)
* _pixelFormatAttribs.size());
for (unsigned int ii = 0; ii < _pixelFormatAttribs.size(); ii++)
{
pixFormatAttribs[ii] =
(CGLPixelFormatAttribute)_pixelFormatAttribs[ii];
}
if (error =
CGLChoosePixelFormat(&pixFormatAttribs[0], &pixFormat, &iNumFormats))
{
fprintf(stderr,
"RenderTexture Error: CGLChoosePixelFormat() failed.\n");
_cglCheckError(error);
return false;
}
if ( iNumFormats <= 0 )
{
fprintf(stderr,
"RenderTexture Error: Couldn't find a suitable "+
"pixel format.\n");
return false;
}
// Free the copy of the _pixelFormatAttribs array
free(pixFormatAttribs);
// Create the context.
error = CGLCreateContext(pixFormat, (_bShareObjects)
? CGLGetCurrentContext() : NULL, &_hGLContext);
if (error)
{
fprintf(stderr,
"RenderTexture Error: CGLCreateContext() failed.\n");
_cglCheckError(error);
return false;
}
CGLDestroyPixelFormat(pixFormat);
// Create the p-buffer.
error = CGLCreatePBuffer(_iWidth, _iHeight, (_bRectangle)
? GL_TEXTURE_RECTANGLE_EXT : GL_TEXTURE_2D, GL_RGBA, 0, &_hPBuffer);
if (error)
{
fprintf(stderr,
"RenderTexture Error: CGLCreatePBuffer() failed.\n");
_cglCheckError(error);
return false;
}
long screen;
if (error = CGLGetVirtualScreen(CGLGetCurrentContext(), &screen))
{
_cglCheckError(error);
return false;
}
if (error = CGLSetPBuffer(_hGLContext, _hPBuffer, 0, 0, screen))
{
_cglCheckError(error);
return false;
}
// 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 );
_bInitialized = true;
/*
// get the actual number of bits allocated:
int attrib = WGL_RED_BITS_ARB;
//int bits[6];
int value;
_iNumColorBits[0] =
(wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value))
? value : 0;
attrib = WGL_GREEN_BITS_ARB;
_iNumColorBits[1] =
(wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value))
? value : 0;
attrib = WGL_BLUE_BITS_ARB;
_iNumColorBits[2] =
(wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value))
? value : 0;
attrib = WGL_ALPHA_BITS_ARB;
_iNumColorBits[3] =
(wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value))
? value : 0;
attrib = WGL_DEPTH_BITS_ARB;
_iNumDepthBits =
(wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value))
? value : 0;
attrib = WGL_STENCIL_BITS_ARB;
_iNumStencilBits =
(wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value))
? value : 0;
attrib = WGL_DOUBLE_BUFFER_ARB;
_bDoubleBuffered =
(wglGetPixelFormatAttribivARB(_hDC, iFormat, 0, 1, &attrib, &value))
? (value?true:false) : false;
*/
#if defined(_DEBUG) | defined(DEBUG)
fprintf(stderr, "Created a %dx%d RenderTexture with BPP(%d, %d, %d, %d)",
_iWidth, _iHeight,
_iNumColorBits[0], _iNumColorBits[1],
_iNumColorBits[2], _iNumColorBits[3]);
if (_iNumDepthBits) fprintf(stderr, " depth=%d", _iNumDepthBits);
if (_iNumStencilBits) fprintf(stderr, " stencil=%d", _iNumStencilBits);
if (_bDoubleBuffered) fprintf(stderr, " double buffered");
fprintf(stderr, "\n");
#endif
#else // !_WIN32, !__MACH_
_pDisplay = glXGetCurrentDisplay();
GLXContext context = glXGetCurrentContext();
int screen = DefaultScreen(_pDisplay);
@@ -570,7 +732,13 @@ bool RenderTexture::Initialize(int width, int height,
_wglGetLastError();
return false;
}
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
CGLError err;
if (err = CGLSetCurrentContext(_hGLContext))
{
_cglCheckError(err);
return false;
}
#else
_hPreviousContext = glXGetCurrentContext();
_hPreviousDrawable = glXGetCurrentDrawable();
@@ -595,7 +763,12 @@ bool RenderTexture::Initialize(int width, int height,
_wglGetLastError();
return false;
}
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
if (err = CGLSetCurrentContext(_hPreviousContext))
{
_cglCheckError(err);
return false;
}
#else
if (False == glXMakeCurrent(_pDisplay,
_hPreviousDrawable, _hPreviousContext))
@@ -653,7 +826,17 @@ bool RenderTexture::_Invalidate()
_hPBuffer = 0;
return true;
}
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
if ( _hPBuffer )
{
if (CGLGetCurrentContext() == _hGLContext)
CGLSetCurrentContext(NULL);
if (!_bCopyContext)
CGLDestroyContext(_hGLContext);
CGLDestroyPBuffer(_hPBuffer);
_hPBuffer = NULL;
return true;
}
#else
if ( _hPBuffer )
{
@@ -687,7 +870,7 @@ bool RenderTexture::Reset(const char *strMode, ...)
_iWidth = 0; _iHeight = 0;
_bIsTexture = false; _bIsDepthTexture = false,
_bHasARBDepthTexture = true;
#ifdef _WIN32
#if defined(_WIN32) || defined(__MACH__)
_eUpdateMode = RT_RENDER_TO_TEXTURE;
#else
_eUpdateMode = RT_COPY_TO_TEXTURE;
@@ -724,7 +907,11 @@ bool RenderTexture::Reset(const char *strMode, ...)
_pbufferAttribs.push_back(WGL_PBUFFER_LARGEST_ARB);
_pbufferAttribs.push_back(true);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
//_pixelFormatAttribs.push_back(kCGLPFANoRecovery);
_pixelFormatAttribs.push_back(kCGLPFAAccelerated);
_pixelFormatAttribs.push_back(kCGLPFAWindow);
_pixelFormatAttribs.push_back(kCGLPFAPBuffer);
#else
_pbufferAttribs.push_back(GLX_RENDER_TYPE_SGIX);
_pbufferAttribs.push_back(GLX_RGBA_BIT_SGIX);
@@ -747,6 +934,8 @@ bool RenderTexture::Reset(const char *strMode, ...)
#ifdef _WIN32
_pixelFormatAttribs.push_back(0);
_pbufferAttribs.push_back(0);
#elif defined(__MACH__)
_pixelFormatAttribs.push_back((CGLPixelFormatAttribute)0);
#else
_pixelFormatAttribs.push_back(None);
#endif
@@ -794,7 +983,17 @@ bool RenderTexture::Resize(int iWidth, int iHeight)
_hPBuffer = 0;
return true;
}
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
if ( _hPBuffer )
{
if (CGLGetCurrentContext() == _hGLContext)
CGLSetCurrentContext(NULL);
if (!_bCopyContext)
CGLDestroyContext(_hGLContext);
CGLDestroyPBuffer(_hPBuffer);
_hPBuffer = NULL;
return true;
}
#else
if ( _hPBuffer )
{
@@ -837,7 +1036,8 @@ bool RenderTexture::BeginCapture()
_hPreviousContext = wglGetCurrentContext();
if (NULL == _hPreviousContext)
_wglGetLastError();
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
_hPreviousContext = CGLGetCurrentContext();
#else
_hPreviousContext = glXGetCurrentContext();
_hPreviousDrawable = glXGetCurrentDrawable();
@@ -866,6 +1066,8 @@ bool RenderTexture::EndCapture()
return false;
}
glFlush(); // Added by a-lex
_MaybeCopyBuffer();
#ifdef _WIN32
@@ -875,7 +1077,13 @@ bool RenderTexture::EndCapture()
_wglGetLastError();
return false;
}
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
CGLError err;
if (err = CGLSetCurrentContext(_hPreviousContext))
{
_cglCheckError(err);
return false;
}
#else
if (False == glXMakeCurrent(_pDisplay, _hPreviousDrawable,
_hPreviousContext))
@@ -945,7 +1153,8 @@ bool RenderTexture::BeginCapture(RenderTexture* current)
_hPreviousContext = current->_hPreviousContext;
if (NULL == _hPreviousContext)
_wglGetLastError();
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
_hPreviousContext = current->_hPreviousContext;
#else
_hPreviousContext = current->_hPreviousContext;
_hPreviousDrawable = current->_hPreviousDrawable;
@@ -1032,6 +1241,18 @@ bool RenderTexture::BindBuffer( int iBuffer )
_bIsBufferBound = true;
_iCurrentBoundBuffer = iBuffer;
}
#elif defined(__MACH__)
if (RT_RENDER_TO_TEXTURE == _eUpdateMode && _bIsTexture &&
(!_bIsBufferBound || _iCurrentBoundBuffer != iBuffer))
{
CGLError err;
if (err=CGLTexImagePBuffer(CGLGetCurrentContext(), _hPBuffer, iBuffer))
{
_cglCheckError(err);
}
_bIsBufferBound = true;
_iCurrentBoundBuffer = iBuffer;
}
#endif
}
return true;
@@ -1039,7 +1260,7 @@ bool RenderTexture::BindBuffer( int iBuffer )
//---------------------------------------------------------------------------
// Function : RenderTexture::BindBuffer
// Function : RenderTexture::BindDepthBuffer
// Description :
//---------------------------------------------------------------------------
/**
@@ -1059,6 +1280,17 @@ bool RenderTexture::_BindDepthBuffer() const
return false;
}
}
#elif defined(__MACH__)
if (_bInitialized && _bIsDepthTexture &&
RT_RENDER_TO_TEXTURE == _eUpdateMode)
{
glBindTexture(_iTextureTarget, _iDepthTextureID);
//if (FALSE == CGLTexImagePBuffer(<#CGLContextObj ctx#>,<#CGLPBufferObj pbuffer#>,<#unsigned long source#>)(_hPBuffer, WGL_DEPTH_COMPONENT_NV))
//{
// _wglGetLastError();
// return false;
//}
}
#endif
return true;
}
@@ -1079,7 +1311,7 @@ void RenderTexture::_ParseModeString(const char *modeString,
return;
_iNumComponents = 0;
#ifdef _WIN32
#if defined(_WIN32) || defined(__MACH__)
_eUpdateMode = RT_RENDER_TO_TEXTURE;
#else
_eUpdateMode = RT_COPY_TO_TEXTURE;
@@ -1129,13 +1361,18 @@ 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__ )
#elif defined( __MACH__ )
# if 0
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
pfAttribs.push_back(kCGLPFAColorSize);
pfAttribs.push_back(bitVec[0] + bitVec[1] + bitVec[2]);
# endif
#else
pfAttribs.push_back(GLX_RED_SIZE);
pfAttribs.push_back(bitVec[0]);
@@ -1175,7 +1412,8 @@ 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__ )
#elif defined( __MACH__ )
# if 0
pfAttribs.push_back(AGL_RED_SIZE);
pfAttribs.push_back(bitVec[0]);
pfAttribs.push_back(AGL_GREEN_SIZE);
@@ -1184,6 +1422,14 @@ void RenderTexture::_ParseModeString(const char *modeString,
pfAttribs.push_back(bitVec[2]);
pfAttribs.push_back(AGL_ALPHA_SIZE);
pfAttribs.push_back(bitVec[3]);
# else
pfAttribs.push_back(kCGLPFAColorSize);
pfAttribs.push_back(bitVec[0] + bitVec[1] + bitVec[2] + bitVec[3]);
//pfAttribs.push_back(kCGLPFAAlphaSize);
//pfAttribs.push_back(bitVec[3]);
// printf("Color size: %d\n", bitVec[0] + bitVec[1] + bitVec[2] + bitVec[3]);
# endif
#else
pfAttribs.push_back(GLX_RED_SIZE);
pfAttribs.push_back(bitVec[0]);
@@ -1212,9 +1458,14 @@ void RenderTexture::_ParseModeString(const char *modeString,
#ifdef _WIN32
pfAttribs.push_back(WGL_RED_BITS_ARB);
pfAttribs.push_back(bitVec[0]);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
# if 0
pfAttribs.push_back(AGL_RED_SIZE);
pfAttribs.push_back(bitVec[0]);
# else
pfAttribs.push_back(kCGLPFAColorSize);
pfAttribs.push_back(bitVec[0]);
# endif
#else
pfAttribs.push_back(GLX_RED_SIZE);
pfAttribs.push_back(bitVec[0]);
@@ -1244,11 +1495,16 @@ 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__ )
#elif defined( __MACH__ )
# if 0
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(kCGLPFAColorSize);
pfAttribs.push_back(bitVec[0] + bitVec[1]);
# endif
#else
pfAttribs.push_back(GLX_RED_SIZE);
pfAttribs.push_back(bitVec[0]);
@@ -1277,8 +1533,12 @@ void RenderTexture::_ParseModeString(const char *modeString,
bHasStencil = true;
#ifdef _WIN32
pfAttribs.push_back(WGL_STENCIL_BITS_ARB);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
# if 0
pfAttribs.push_back(AGL_STENCIL_SIZE);
# else
pfAttribs.push_back(kCGLPFAStencilSize);
# endif
#else
pfAttribs.push_back(GLX_STENCIL_SIZE);
#endif
@@ -1296,10 +1556,15 @@ 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__ )
#elif defined( __MACH__ )
# if 0
pfAttribs.push_back(AGL_SAMPLE_BUFFERS_ARB);
pfAttribs.push_back(1);
pfAttribs.push_back(AGL_SAMPLES_ARB);
# else
pfAttribs.push_back(kCGLPFAMultisample);
pfAttribs.push_back(kCGLPFASamples);
# endif
pfAttribs.push_back(strtol(kv.second.c_str(), 0, 10));
#else
pfAttribs.push_back(GLX_SAMPLE_BUFFERS_ARB);
@@ -1316,9 +1581,13 @@ void RenderTexture::_ParseModeString(const char *modeString,
#ifdef _WIN32
pfAttribs.push_back(WGL_DOUBLE_BUFFER_ARB);
pfAttribs.push_back(true);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
# if 0
pfAttribs.push_back(AGL_DOUBLEBUFFER);
pfAttribs.push_back(True);
# else
pfAttribs.push_back(kCGLPFADoubleBuffer);
# endif
#else
pfAttribs.push_back(GLX_DOUBLEBUFFER);
pfAttribs.push_back(True);
@@ -1330,8 +1599,12 @@ void RenderTexture::_ParseModeString(const char *modeString,
{
#ifdef _WIN32
pfAttribs.push_back(WGL_AUX_BUFFERS_ARB);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
# if 0
pfAttribs.push_back(AGL_AUX_BUFFERS);
# else
pfAttribs.push_back(kCGLPFAAuxBuffers);
# endif
#else
pfAttribs.push_back(GLX_AUX_BUFFERS);
#endif
@@ -1346,7 +1619,8 @@ void RenderTexture::_ParseModeString(const char *modeString,
{
_bIsTexture = true;
if ((kv.first == "texRECT") && GL_NV_texture_rectangle)
if ((kv.first == "texRECT") && (GL_NV_texture_rectangle ||
GL_EXT_texture_rectangle))
{
_bRectangle = true;
bBindRECT = true;
@@ -1367,7 +1641,8 @@ void RenderTexture::_ParseModeString(const char *modeString,
{
_bIsDepthTexture = true;
if ((kv.first == "depthTexRECT") && GL_NV_texture_rectangle)
if ((kv.first == "depthTexRECT") && (GL_NV_texture_rectangle ||
GL_EXT_texture_rectangle))
{
_bRectangle = true;
bBindRECT = true;
@@ -1439,8 +1714,12 @@ void RenderTexture::_ParseModeString(const char *modeString,
#ifdef _WIN32
pfAttribs.push_back(WGL_DEPTH_BITS_ARB);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
# if 0
pfAttribs.push_back(AGL_DEPTH_SIZE);
# else
pfAttribs.push_back(kCGLPFADepthSize);
# endif
#else
pfAttribs.push_back(GLX_DEPTH_SIZE);
#endif
@@ -1451,8 +1730,12 @@ void RenderTexture::_ParseModeString(const char *modeString,
#ifdef _WIN32
pfAttribs.push_back(WGL_STENCIL_BITS_ARB);
pfAttribs.push_back(0);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
# if 0
pfAttribs.push_back(AGL_STENCIL_SIZE);
# else
pfAttribs.push_back(kCGLPFAStencilSize);
# endif
pfAttribs.push_back(0);
#else
pfAttribs.push_back(GLX_STENCIL_SIZE);
@@ -1506,7 +1789,7 @@ void RenderTexture::_ParseModeString(const char *modeString,
pbAttribs.push_back(WGL_MIPMAP_TEXTURE_ARB);
pbAttribs.push_back(true);
}
#elif defined(__MACH__)
#elif defined(DEBUG) || defined(_DEBUG)
SG_LOG(SG_GL, SG_INFO, "RenderTexture Error: Render to Texture not "
"supported in Linux or MacOS");
@@ -1530,7 +1813,11 @@ void RenderTexture::_ParseModeString(const char *modeString,
pfAttribs.push_back(WGL_PIXEL_TYPE_ARB);
pfAttribs.push_back(WGL_TYPE_RGBA_FLOAT_ATI);
}
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
// if (GL_MACH_float_pixels) // FIXME
{
pfAttribs.push_back(kCGLPFAColorFloat);
}
#else
if (GLX_NV_float_buffer)
{
@@ -1640,7 +1927,100 @@ void RenderTexture::_ParseModeString(const char *modeString,
"(r=1,rg=2,rgb=3,rgba=4): " << _iNumComponents);
break;
}
}
}
#elif defined(__MACH__)
if (_bFloat)
{
/*
//if (WGLEW_NV_float_buffer) // FIXME
{
switch(_iNumComponents)
{
case 1:
pfAttribs.push_back(WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV);
pfAttribs.push_back(true);
pbAttribs.push_back(WGL_TEXTURE_FORMAT_ARB);
pbAttribs.push_back(WGL_TEXTURE_FLOAT_R_NV);
break;
case 2:
pfAttribs.push_back(WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV);
pfAttribs.push_back(true);
pbAttribs.push_back(WGL_TEXTURE_FORMAT_ARB);
pbAttribs.push_back(WGL_TEXTURE_FLOAT_RG_NV);
break;
case 3:
pfAttribs.push_back(WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV);
pfAttribs.push_back(true);
pbAttribs.push_back(WGL_TEXTURE_FORMAT_ARB);
pbAttribs.push_back(WGL_TEXTURE_FLOAT_RGB_NV);
break;
case 4:
pfAttribs.push_back(WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV);
pfAttribs.push_back(true);
pbAttribs.push_back(WGL_TEXTURE_FORMAT_ARB);
pbAttribs.push_back(WGL_TEXTURE_FLOAT_RGBA_NV);
break;
default:
fprintf(stderr,
"RenderTexture Warning: Bad number of components "
"(r=1,rg=2,rgb=3,rgba=4): %d.\n",
_iNumComponents);
break;
}
}
else
{
if (4 == _iNumComponents)
{
pfAttribs.push_back(WGL_BIND_TO_TEXTURE_RGBA_ARB);
pfAttribs.push_back(true);
pbAttribs.push_back(WGL_TEXTURE_FORMAT_ARB);
pbAttribs.push_back(WGL_TEXTURE_RGBA_ARB);
}
else
{
// standard ARB_render_texture only supports 3 or 4 channels
pfAttribs.push_back(WGL_BIND_TO_TEXTURE_RGB_ARB);
pfAttribs.push_back(true);
pbAttribs.push_back(WGL_TEXTURE_FORMAT_ARB);
pbAttribs.push_back(WGL_TEXTURE_RGB_ARB);
}
}
*/
}
else
{
/*
switch(_iNumComponents)
{
case 3:
pfAttribs.push_back(WGL_BIND_TO_TEXTURE_RGB_ARB);
pfAttribs.push_back(true);
pbAttribs.push_back(WGL_TEXTURE_FORMAT_ARB);
pbAttribs.push_back(WGL_TEXTURE_RGB_ARB);
break;
case 4:
pfAttribs.push_back(WGL_BIND_TO_TEXTURE_RGBA_ARB);
pfAttribs.push_back(true);
pbAttribs.push_back(WGL_TEXTURE_FORMAT_ARB);
pbAttribs.push_back(WGL_TEXTURE_RGBA_ARB);
break;
default:
fprintf(stderr,
"RenderTexture Warning: Bad number of components "
"(r=1,rg=2,rgb=3,rgba=4): %d.\n", _iNumComponents);
break;
}
*/
}
#elif defined(DEBUG) || defined(_DEBUG)
SG_LOG(SG_GL, SG_ALERT,
"RenderTexture Error: Render to Texture not supported in "
@@ -1667,6 +2047,7 @@ void RenderTexture::_ParseModeString(const char *modeString,
pbAttribs.push_back(WGL_DEPTH_TEXTURE_FORMAT_NV);
pbAttribs.push_back(WGL_TEXTURE_DEPTH_COMPONENT_NV);
}
#elif defined(__MACH__)
#elif defined(DEBUG) || defined(_DEBUG)
SG_LOG(SG_GL, SG_INFO, "RenderTexture Error: Render to Texture not supported in "
"Linux or MacOS");
@@ -1819,7 +2200,8 @@ bool RenderTexture::_VerifyExtensions()
}
SetLastError(0);
}
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
// FIXME! Check extensions!
#else
Display* dpy = glXGetCurrentDisplay();
int minor = 0, major = 0;
@@ -1902,6 +2284,8 @@ bool RenderTexture::_InitializeTextures()
{
if (_bRectangle && GL_NV_texture_rectangle)
_iTextureTarget = GL_TEXTURE_RECTANGLE_NV;
else if (_bRectangle && GL_EXT_texture_rectangle)
_iTextureTarget = GL_TEXTURE_RECTANGLE_EXT;
else
_iTextureTarget = GL_TEXTURE_2D;
}
@@ -2099,6 +2483,21 @@ void RenderTexture::_MaybeCopyBuffer()
}
}
#elif defined(__MACH__)
if (RT_COPY_TO_TEXTURE == _eUpdateMode)
{
if (_bIsTexture)
{
glBindTexture(_iTextureTarget, _iTextureID);
glCopyTexSubImage2D(_iTextureTarget, 0, 0, 0, 0, 0, _iWidth, _iHeight);
}
if (_bIsDepthTexture)
{
glBindTexture(_iTextureTarget, _iDepthTextureID);
assert(_bHasARBDepthTexture);
glCopyTexSubImage2D(_iTextureTarget, 0, 0, 0, 0, 0, _iWidth, _iHeight);
}
}
#else
if (_bIsTexture)
{
@@ -2178,7 +2577,14 @@ bool RenderTexture::_MakeCurrent()
_wglGetLastError();
return false;
}
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
CGLError err;
if (err = CGLSetCurrentContext(_hGLContext))
{
_cglCheckError(err);
return false;
}
#else
if (false == glXMakeCurrent(_pDisplay, _hPBuffer, _hGLContext))
{
@@ -2230,7 +2636,10 @@ RenderTexture::RenderTexture(int width, int height,
_hPBuffer(NULL),
_hPreviousDC(0),
_hPreviousContext(0),
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
_hGLContext(NULL),
_hPBuffer(NULL),
_hPreviousContext(NULL),
#else
_pDisplay(NULL),
_hGLContext(NULL),
@@ -2317,7 +2726,7 @@ bool RenderTexture::Initialize(bool bShare /* = true */,
}
if (_bIsTexture)
{
if (GL_NV_texture_rectangle &&
if ((GL_NV_texture_rectangle || GL_EXT_texture_rectangle) &&
((!IsPowerOfTwo(_iWidth) || !IsPowerOfTwo(_iHeight))
|| iRBits >= 16 || iGBits > 16 || iBBits > 16 || iABits >= 16))
mode.append("texRECT ");
@@ -2326,7 +2735,7 @@ bool RenderTexture::Initialize(bool bShare /* = true */,
}
if (_bIsDepthTexture)
{
if (GL_NV_texture_rectangle &&
if ((GL_NV_texture_rectangle || GL_EXT_texture_rectangle) &&
((!IsPowerOfTwo(_iWidth) || !IsPowerOfTwo(_iHeight))
|| iRBits >= 16 || iGBits > 16 || iBBits > 16 || iABits >= 16))
mode.append("texRECT ");
@@ -2347,7 +2756,11 @@ bool RenderTexture::Initialize(bool bShare /* = true */,
_pbufferAttribs.push_back(WGL_PBUFFER_LARGEST_ARB);
_pbufferAttribs.push_back(true);
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
//_pixelFormatAttribs.push_back(kCGLPFANoRecovery);
_pixelFormatAttribs.push_back(kCGLPFAAccelerated);
_pixelFormatAttribs.push_back(kCGLPFAWindow);
_pixelFormatAttribs.push_back(kCGLPFAPBuffer);
#else
_pixelFormatAttribs.push_back(GLX_RENDER_TYPE_SGIX);
_pixelFormatAttribs.push_back(GLX_RGBA_BIT_SGIX);
@@ -2360,6 +2773,8 @@ bool RenderTexture::Initialize(bool bShare /* = true */,
#ifdef _WIN32
_pixelFormatAttribs.push_back(0);
_pbufferAttribs.push_back(0);
#elif defined(__MACH__)
_pixelFormatAttribs.push_back(0);
#else
_pixelFormatAttribs.push_back(None);
#endif

View File

@@ -27,6 +27,7 @@
// Original RenderTexture code: Mark J. Harris
// Original Render-to-depth-texture support: Thorsten Scheuermann
// Linux Copy-to-texture: Eric Werness
// OS X: Alexander Powell (someone please help)
// Various Bug Fixes: Daniel (Redge) Sperl
// Bill Baxter
//
@@ -45,18 +46,18 @@
* Changelog:
*
* Jan. 2005, Removed GLEW dependencies, Erik Hofman
* Added MacOS X support
* Mar. 2006, Added MAC OS X support, Alexander Powell
*/
#include <simgear/compiler.h>
#if !defined( _WIN32 ) && !defined( __APPLE__ )
#if !defined( _WIN32 ) && !defined( __MACH__ )
# include <X11/Xlib.h>
#endif
#include SG_GL_H
#ifndef _WIN32
# include SG_GLX_H
#endif
#ifdef __APPLE__
#ifdef __MACH__
# ifndef None
# define None false
# endif
@@ -346,8 +347,11 @@ protected: // data
HDC _hPreviousDC;
HGLRC _hPreviousContext;
#elif defined( __APPLE__ )
#elif defined( __MACH__ )
CGLContextObj _hGLContext;
CGLPBufferObj _hPBuffer;
CGLContextObj _hPreviousContext;
#else
Display *_pDisplay;
GLXContext _hGLContext;

View File

@@ -465,6 +465,18 @@ typedef void (*glXQueryDrawableProc) (Display *, GLXDrawable, int, unsigned int
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8
#endif
/*
* NV_texture_rectangle
*/
#ifndef GL_EXT_texture_rectangle
#define GL_EXT_texture_rectangle 1
#define GL_TEXTURE_RECTANGLE_EXT 0x84F5
#define GL_TEXTURE_BINDING_RECTANGLE_EXT 0x84F6
#define GL_PROXY_TEXTURE_RECTANGLE_EXT 0x84F7
#define GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT 0x84F8
#endif
/*
* WGL_NV_texture_rectangle
*/