2009-12-30 7 views
5

Cuando voy a utilizar OGRE con SDL (como se describe en this article), parece que tengo problemas con una segunda ventana que aparece detrás de la ventana principal de mi renderizado. Básicamente, el código que estoy usando es el siguiente:¿Cómo usar SDL con OGRE?

SDL_init(SDL_INIT_VIDEO); 
SDL_Surface *screen = SDL_SetVideoMode(640, 480, 0, SDL_OPENGL); 

Ogre::Root *root = new Ogre::Root(); 
root->restoreConfig(); 
root->initialise(false); 

Ogre::NameValuePairList windowSettings; 
windowSettings["currentGLContext"] = Ogre::String("True"); 
Ogre::RenderWindow *window = root->createRenderWindow("MainRenderWindow", 640, 480, false, &windowSettings); 
window->setVisible(true); 

La pregunta es, ¿cómo me deshago de la ventana extra?

Solo para la posteridad, estoy usando OGRE 1.6.4, Mac OS X 10.6.2 y SDL 1.2.14.

Respuesta

7

Terminé descifrando esto por mi cuenta. El problema es que el backgro de Mac GL de OGRE no cumple con la opción currentGLContext, por lo que la mejor solución es cambiar a SDL 1.3 (directamente desde Subversion, a partir del momento de la escritura) y usar la llamada SDL_CreateWindowFrom para comenzar a recibir eventos desde una ventana creado por OGRE. También se debe tener en cuenta que la ventana OGRE debe tener el macAPI establecido en cocoa, o SDL no reconocerá el identificador de ventana.

2

Veo que ya ha resuelto su problema, pero no todos los usuarios se contentarán con la degradación de SDL a 1.3. Puede usar SDL2 y una ventana SDL2 creada a través de SDL_CreateWindow con OGRE. El código sería algo como esto:

if (SDL_Init(SDL_INIT_VIDEO) != 0) { 
    OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, "Cannot initialize SDL2!", 
     "BaseApplication::setup"); 
} 

Ogre::Root *root = new Ogre::Root(); 
root->restoreConfig(); 
root->initialise(false); 

Ogre::NameValuePairList params; // ogre window/render system params 
SDL_Window *sdlWindow = SDL_CreateWindow("myWindow", posX, posY, width, height, vflags); 
// see SDL_CreateWindow docs/examples for how to populate posX, posY, width, height, and vflags according to your needs 

SDL_SysWMinfo wmInfo; 
SDL_VERSION(&wmInfo.version); 
if (SDL_GetWindowWMInfo(sdlWindow, &wmInfo) == SDL_FALSE) { 
    OGRE_EXCEPT(Ogre::Exception::ERR_INTERNAL_ERROR, 
     "Couldn't get WM Info! (SDL2)", 
     "BaseApplication::setup"); 
} 

params.insert(std::make_pair("macAPI", "cocoa")); 
params.insert(std::make_pair("macAPICocoaUseNSView", "true")); 

// grab a string representing the NSWindow pointer 
Ogre::String winHandle = Ogre::StringConverter::toString((unsigned long)wmInfo.info.cocoa.window); 

// assign the NSWindow pointer to the parentWindowHandle parameter 
params.insert(std::make_pair("parentWindowHandle", winHandle)); 

Ogre::RenderWindow *ogreWindow = root->createRenderWindow("myWindowTitle", width, height, isFullscreen, &params); 
// see OGRE documentation on how to populate width, height, and isFullscreen to suit your needs 

// create OGRE scene manager, camera, viewports, etc