2014-09-11 3 views
2

윈도우 및 이벤트 처리를 위해 Ogre 1.9.0을 사용하기 위해 SDL 2.0.3을 통합하려고하는데, Linux에서는 제대로 작동하지만 IOS 7.1에서 문제가 발생합니다.SDL 2.0.3 with Ogre 1.9.0 and IOS

SDL에서 입력 또는 창 이벤트를 가져올 수 없습니다. 나는 핸들을 얻기 위해 wmInfo.info.uikit.window을 사용하고있다. 그런 다음 오우거에게 건네 준다. GL 컨텍스트를 적절하게 얻는 경우 확실하지 않습니다. Ogre SDL_APP_DIDENTERFOREGROUND으로 SDL을 시작할 때 단 하나의 이벤트 만 얻을 수 있습니다. IOS를 위해해야 ​​할 특별한 것이 있습니까?

나는 위의 문제에 매달려 있기 때문에 어떤 도움을 주셔서 감사합니다.

또한 OSX 및 IOS 7.1 시뮬레이터에서 작업하고 있습니다. 아래는 오리지널 오우거 iOS 템플릿을 변경 한 것입니다.

SDL과 오우거 초기화 :

//SDL 
if (SDL_Init(SDL_INIT_VIDEO) < 0) 
{ 
    printf("Could not initialize SDL\n"); 
    return 1; 
} 
SDL_GL_SetAttribute(SDL_GL_CONTEXT_EGL, 1); 
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); 
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); 
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); 

SDL_DisplayMode displayMode; 
SDL_GetDesktopDisplayMode(0, &displayMode); 

/* create window and renderer */ 
SDL_Window* window = SDL_CreateWindow(NULL, 0, 0, displayMode.w, displayMode.h, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN | SDL_WINDOW_RESIZABLE); 

SDL_GLContext glContext = SDL_GL_CreateContext(window); 

SDL_SysWMinfo wmInfo; 
SDL_VERSION(&wmInfo.version); 
SDL_GetWindowWMInfo(window,&wmInfo); 

m_pLog = Ogre::LogManager::getSingleton().createLog("OgreLogfile.log", true, true, false); 
m_pLog->setDebugOutputEnabled(true); 

String pluginsPath; 
m_pRoot = new Ogre::Root(pluginsPath, Ogre::macBundlePath() + "/ogre.cfg"); 
m_StaticPluginLoader.load(); 

m_pRenderWnd = m_pRoot->initialise(false, wndTitle); 

size_t winHandle = reinterpret_cast<size_t>(wmInfo.info.uikit.window); 
size_t glHandle = reinterpret_cast<size_t>(glContext); 

Ogre::NameValuePairList params; 
params["externalWindowHandle"] = Ogre::StringConverter::toString((unsigned long)winHandle); 
params["externalGLContext"] = Ogre::StringConverter::toString((unsigned long)glHandle); 
params["externalGLControl"] = String("True"); 

m_pRenderWnd = m_pRoot->createRenderWindow("", displayMode.w/2, displayMode.h/2, false, &params); 

내 메인 루프 :

DemoApp demo; 
demo.startDemo(); 

bool done = false; 

SDL_Event event; 

double mStartTime; 
double mLastFrameTime; 

while (!done) 
{ 

    mStartTime = OgreFramework::getSingletonPtr()->m_pTimer->getMillisecondsCPU(); 
    OgreFramework::getSingletonPtr()->updateOgre(mLastFrameTime); 
    OgreFramework::getSingletonPtr()->m_pRoot->renderOneFrame(); 
    mLastFrameTime = OgreFramework::getSingletonPtr()->m_pTimer->getMillisecondsCPU() - mStartTime; 


    while (SDL_PollEvent(&event)) 
    { 
     switch (event.type) 
     { 
      case SDL_FINGERMOTION: 
       SDL_Log("Finger Motion"); 
       break; 

      case SDL_FINGERDOWN: 
       SDL_Log("Finger Down"); 
       break; 

      case SDL_FINGERUP: 
       SDL_Log("Finger Up"); 
       break; 

      case SDL_QUIT: 
       done = true; 
       break; 

      case SDL_APP_DIDENTERFOREGROUND: 
       SDL_Log("SDL_APP_DIDENTERFOREGROUND"); 
       break; 

      case SDL_APP_DIDENTERBACKGROUND: 
       SDL_Log("SDL_APP_DIDENTERBACKGROUND"); 
       break; 

      case SDL_APP_LOWMEMORY: 
       SDL_Log("SDL_APP_LOWMEMORY"); 
       break; 

      case SDL_APP_TERMINATING: 
       SDL_Log("SDL_APP_TERMINATING"); 
       break; 

      case SDL_APP_WILLENTERBACKGROUND: 
       SDL_Log("SDL_APP_WILLENTERBACKGROUND"); 
       break; 

      case SDL_APP_WILLENTERFOREGROUND: 
       SDL_Log("SDL_APP_WILLENTERFOREGROUND"); 
       break; 

      case SDL_WINDOWEVENT: 
      { 
       switch (event.window.event) 
       { 

        case SDL_WINDOWEVENT_RESIZED: 
        { 
         SDL_Log("Window %d resized to %dx%d", event.window.windowID, event.window.data1, event.window.data2); 

         break; 
        } 
       } 
      } 
     } 
    } 
+0

[SDL2 및 CEGUI로 Ogre3D 설정] (http://digiorgi.info/233/setup-ogre3d-with-sdl2-cegui) /) –

+0

그래, 이거 보았지만 IOS 나 OSX에서는 작동하지 않아. – sabotage3d

답변

2

이 질문은 이제 옛 몇 년 실현,하지만 저도 같은 문제를 겪고 난 내 솔루션이 다른 사람들에게 유용 할 수 있기를 바랍니다.

문제는 SDL의 UIView (SDL_uikitview)를 Ogre의 UIView (OgreEAGL2View)로 대체하고 있으므로 더 이상 터치 입력이나 SDL_uikitviewcontroller 또는 SDL_uikitview를 통해 구현 된 기능을받지 않을 것입니다. 이 교체

(특히 OgreEAGL2Window.mm 단위) GLES2 RenderSystem 내부 나 자신이 해결 방법 일어나는 내 자신의 UIViewController 및 UIView의를 만든 다음 SDL의 비하인드 해당 뷰 을 넣어하는 것입니다. 그러면 Ogre의 관점에서 렌더링하는 동안 SDL의 뷰에서 터치 입력을받을 수 있습니다. 이것은 목표 - C 컴파일 단위를 만들 필요하고 코드가 같이 보일 것입니다 :

SDL 아무도 만들 필요와 상황이 없음을
#include "OgreEAGL2View.h" 
#import <UIKit/UIWindow.h> 
#import <UIKit/UIDevice.h> 
// other includes 

// call this from your C++ framework 
// pass it your startup params 
void setupMyiOSViews(Ogre::NameValuePairList &params) 
{ 
    // grab the UIWindow (you must have called SDL_createwindow before calling this) 
    SDL_SysWMinfo wmInfo; 
    SDL_Window *sdlWindow; 
    SDL_VERSION(&wmInfo.version); 
    SDL_GetWindowWMInfo(sdlWindow, &wmInfo); 
    UIWindow *w = wmInfo.info.uikit.window; 

    // get a rectangle with the screen dimensions 
    CGRect rect = [[UIScreen mainScreen] applicationFrame]; 
    // instantiate a view controller of Ogre's subclass of UIViewController 
    EAGL2ViewController *myViewController = [[EAGL2ViewController alloc] init]; 
    // instantiate a view of Ogre's subclass of UIView 
    EAGL2View *myView = [[EAGL2View alloc] initWithFrame:rect]; 
    // make sure it's not transparent 
    myView.opaque = YES; 
    // attach the view to the viewcontroller 
    myViewController.view = myView; 
    // add the view to the current window 
    [w addSubview:myView]; 
    // put the view *behind* the SDL view 
    [w sendSubviewToBack:myView]; 

    // add the window, viewcontroller, and view to the proper parameters 
    // UIWindow maps to param: externalWindowHandle 
    // UIViewController maps to param: externalViewControllerHandle 
    // UIView maps to param: externalViewHandle 
    Ogre::String str_w = Ogre::StringConverter::toString((unsigned long)w); 
    Ogre::String str_vc = Ogre::StringConverter::toString((unsigned long)myViewController); 
    Ogre::String str_v = Ogre::StringConverter::toString((unsigned long)myView); 

    params["externalWindowHandle"] = str_w; 
    params["externalViewControllerHandle"] = str_vc; 
    params["externalViewHandle"] = str_v; 

    Ogre::LogManager::getSingleton().logMessage("externalWindowHandle: " + str_w); 
    Ogre::LogManager::getSingleton().logMessage("externalViewControllerHandle: " + str_vc); 
    Ogre::LogManager::getSingleton().logMessage("externalViewHandle: " + str_v); 

// now pass params into Ogre::Root::createRenderWindow 
} 

참고. 오우거가 이제 자신의 뷰와 뷰 콘트롤러로 렌더링됩니다