이런저런 이유로 오늘부터 게임 브리오 엔진 공부를 병행하기로 했습니다. 3개월내로 조작 가능한 프로토타입 하나를 만들 예정입니다. 그런거로 열공!!!

게임브리오 첫 튜토리얼부터 나오는 NiApplication에 대해서 부터 시작!!
튜토리얼 소스를 보면 밑의 소스와 같이 프로그램을 시작합니다.
그리고 이와 함께 NiApplication을 상속 받은 Renderers 클래스에 CreateRenderer() 가상 함수를 재정의 하고 있습니다.

NiApplication* NiApplication::Create()
{
	return NiNew Renderers;
}

동작 방식을 보려면 niappmain.cpp를 봐야합니다.
위의 소스만 봐서는 CreateRenderers() 함수 호출 부위도 없고, 어떻게 창이 뜨는지 조차 알수가 없죠.
밑의 소스는 WinMain() 함수의 일부분입니다.

int WINAPI WinMain(HINSTANCE hI, HINSTANCE, LPSTR cmdline, int iWinMode)
{
    // create the application
    NiApplication* pkTheApp = NiApplication::Create();
    if (!pkTheApp)
    {
        NiMessageBox("Unable to create application", 
            NiAppWindow::GetWindowClassName());
        NiShutdown();    
        return 0;
    }

    // create the application window
    pkTheApp->CreateMainWindow(iWinMode);

    // allow the application to initialize before starting the message pump
    if (pkTheApp->Initialize())
    {
        pkTheApp->MainLoop();
    }

    pkTheApp->Terminate();
}
보시면 NiApplicationCreate() 정적 함수를 호출하고 있습니다. 튜토리얼에서 재정의한 Create() 함수죠.
이 후에 CreateMainWindow(), Initialize()를 차례로 부르고, 메인루프에 진입을 합니다.
그럼 이 Initialize()에서 하는 일을 살펴보자면....
bool NiApplication::Initialize()
{
    // The ShadowManager needs to be initialized before the renderer is
    // created.
    if (m_bUseFrameSystem)
    {
        NiShadowManager::Initialize();
    }

    if (!CreateRenderer())
        return false;

    if (!CreateCamera())
        return false;

    if (!CreateInputSystem())
        return false;

    if (!CreateScene())
    {
        NIMETRICS_APPLICATION_ENDTIMER(kTimer);
        return false;
    }
}
보시면 중간에 CreateRender()가 있습니다. 튜토리얼에서 재정의한 바로 그 함수죠.
이걸로 NiApplication이 어떤식으로 실행되는지 알았으니 이걸 이용해서 뚝딱뚝딱 만들면 될것 같습니다.

+ Recent posts