void OSXPBuffer::createPBuffer() { LogManager::getSingleton().logMessage( "OSXPBuffer::createPBuffer()" ); GLint attrib[] = { AGL_NO_RECOVERY, GL_TRUE, AGL_ACCELERATED, GL_TRUE, AGL_RGBA, AGL_NONE }; AGLPixelFormat pixelFormat = aglChoosePixelFormat(NULL, 0, attrib); mAGLContext = aglCreateContext(pixelFormat, NULL); //mAGLContext = aglGetCurrentContext(); aglCreatePBuffer( mWidth, mHeight, GL_TEXTURE_2D, GL_RGBA, 0, &mPBuffer ); GLint vs = aglGetVirtualScreen( mAGLContext ); aglSetPBuffer( mAGLContext, mPBuffer, 0, 0, vs ); mContext = OGRE_NEW OSXCarbonContext(mAGLContext, pixelFormat); }
void OSXCarbonWindow::setFullscreen(bool fullScreen, unsigned int width, unsigned int height) { if (mIsFullScreen != fullScreen || width != mWidth || height != mHeight) { // Set the full screen flag mIsFullScreen = fullScreen; createAGLContext(mFSAA, mColourDepth); if (mIsFullScreen) { GLRenderSystem *rs = static_cast<GLRenderSystem*>(Root::getSingleton().getRenderSystem()); CGLContextObj share = NULL; aglGetCGLContext(mAGLContext, (void**)&share); // Create the CGL context object if it doesn't already exist, sharing the AGL context. if(!mCGLContext) { void *cglPixFormat; aglGetCGLPixelFormat(mAGLPixelFormat, (void **)&cglPixFormat); mCGLContext = OGRE_NEW OSXCGLContext(mCGLContextObj, (CGLPixelFormatObj) cglPixFormat); } // Create the context, keeping the current colour depth and FSAA settings createCGLFullscreen(width, height, getColourDepth(), getFSAA(), share); rs->_switchContext(mContext); // Hide the Carbon window HideWindow(mWindow); // And tell the rendersystem to stop rendering to it too WindowEventUtilities::_removeRenderWindow(this); } else { // Create a new AGL context and pixel format if necessary createAGLContext(mFSAA, mColourDepth); // Create a window if we haven't already, existence check is done within the functions if(!mWindow) { if(mIsExternal) createWindowFromExternal(mView); else createNewWindow(width, height, mWindowTitle); } // Destroy the current CGL context, we will create a new one when/if we go back to full screen destroyCGLFullscreen(); // Set the drawable, and current context // If you do this last, there is a moment before the rendering window pops-up #if defined(MAC_OS_X_VERSION_10_4) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 aglSetDrawable(mAGLContext, GetWindowPort(mWindow)); #else aglSetWindowRef(mAGLContext, mWindow); #endif aglSetCurrentContext(mAGLContext); if(!mCarbonContext) { mCarbonContext = OGRE_NEW OSXCarbonContext(mAGLContext, mAGLPixelFormat); } GLRenderSystem *rs = static_cast<GLRenderSystem*>(Root::getSingleton().getRenderSystem()); mContext = mCarbonContext; rs->_switchContext(mContext); WindowEventUtilities::_addRenderWindow(this); ShowWindow(mWindow); SelectWindow(mWindow); RepositionWindow(mWindow, NULL, kWindowCenterOnMainScreen); } mWidth = width; mHeight = height; } }
//-------------------------------------------------------------------------------------------------// void OSXCarbonWindow::create( const String& name, unsigned int width, unsigned int height, bool fullScreen, const NameValuePairList *miscParams ) { bool hasDepthBuffer = false; String title = name; size_t fsaa_samples = 0; int left = 0; int top = 0; bool vsync = false; bool hidden = false; int depth = 32; if( miscParams ) { NameValuePairList::const_iterator opt(NULL); NameValuePairList::const_iterator end = miscParams->end(); // Full screen anti aliasing if((opt = miscParams->find("FSAA")) != end) fsaa_samples = StringConverter::parseUnsignedInt( opt->second ); if((opt = miscParams->find("left")) != end) left = StringConverter::parseUnsignedInt( opt->second ); if((opt = miscParams->find("top")) != end) top = StringConverter::parseUnsignedInt( opt->second ); if((opt = miscParams->find("title")) != end) title = opt->second; if((opt = miscParams->find("vsync")) != end) vsync = StringConverter::parseBool(opt->second); if((opt = miscParams->find("hidden")) != end) hidden = StringConverter::parseBool(opt->second); if((opt = miscParams->find("gamma")) != end) mHwGamma = StringConverter::parseBool(opt->second); if((opt = miscParams->find("depthBuffer")) != end) hasDepthBuffer = StringConverter::parseBool( opt->second ); if((opt = miscParams->find("colourDepth")) != end) depth = StringConverter::parseUnsignedInt( opt->second ); if((opt = miscParams->find("Full Screen")) != end) fullScreen = StringConverter::parseBool( opt->second ); } if(fullScreen) { setFullscreen(fullScreen, width, height); } else { createAGLContext(fsaa_samples, depth); NameValuePairList::const_iterator opt(NULL); if(miscParams) opt = miscParams->find("externalWindowHandle"); if(!miscParams || opt == miscParams->end()) createNewWindow(width, height, title.c_str()); else createWindowFromExternal((HIViewRef)StringConverter::parseUnsignedLong(opt->second)); // Set the drawable, and current context // If you do this last, there is a moment before the rendering window pops-up // This could go once inside each case above, before the window is displayed, // if desired. #if defined(MAC_OS_X_VERSION_10_4) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4 aglSetDrawable(mAGLContext, GetWindowPort(mWindow)); #else aglSetWindowRef(mAGLContext, mWindow); #endif aglSetCurrentContext(mAGLContext); // Give a copy of our context to the render system if(!mCarbonContext) { mCarbonContext = OGRE_NEW OSXCarbonContext(mAGLContext, mAGLPixelFormat); mContext = mCarbonContext; } } // Apply vsync settings. call setVSyncInterval first to avoid // setting vsync more than once. setVSyncEnabled(vsync); setHidden(hidden); mName = name; mWidth = width; mHeight = height; mColourDepth = depth; mFSAA = fsaa_samples; mIsFullScreen = fullScreen; mActive = true; mClosed = false; mCreated = true; }
GLContext* OSXCarbonContext::clone() const { aglSetCurrentContext(NULL); AGLContext aglCtxShare = aglCreateContext(mPixelFormat, mAGLContext); return OGRE_NEW OSXCarbonContext(aglCtxShare, mPixelFormat); }