2009-12-30 10 views
5

Wenn ich gehe OGRE mit SDL zu verwenden (wie in this article beschrieben), scheint ich Probleme mit einem zweiten Fenster zu haben, das hinter meinem Hauptdarstellungsfenster erscheint. Grundsätzlich verwende ich den Code, den ich verwende:Wie verwende ich SDL mit 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); 

Die Frage ist, wie kann ich das zusätzliche Fenster loswerden?

Nur für die Nachwelt verwende ich OGRE 1.6.4, Mac OS X 10.6.2 und SDL 1.2.14.

Antwort

7

Ich fand es schließlich selbst heraus. Das Problem besteht darin, dass OGREs Mac GL Backend die Option currentGLContext nicht berücksichtigt. Daher ist die beste Lösung, zu SDL 1.3 (direkt von Subversion, zum Zeitpunkt des Schreibens) zu wechseln und den Aufruf SDL_CreateWindowFrom zu verwenden, um Ereignisse aus einem Fenster abzurufen erstellt von OGRE. Es sollte auch beachtet werden, dass das OGRE-Fenster auf cocoa gesetzt haben muss, sonst wird SDL das Fensterhandle nicht erkennen.

2

Ich sehe, dass Sie bereits Ihr Problem gelöst haben, aber nicht alle Benutzer werden mit SDL auf 1.3 heruntergestuft werden. Sie können SDL2 und ein SDL2-Fenster verwenden, das über SDL_CreateWindow mit OGRE erstellt wurde. Der Code würde in etwa so aussehen:

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