00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "rendermanager.h"
00013 #include "kernel.h"
00014 #include "basedefs.h"
00015
00016 using namespace VRUT;
00017
00018
00019 RenderManager::RenderManager()
00020 : ServerBase<RenderModule>(RENDER_MANAGER)
00021 {
00022 }
00023
00024
00025 RenderManager::~RenderManager()
00026 {
00028 WindowList::iterator glwit;
00029 for (glwit = windowList.begin(); glwit != windowList.end(); glwit++)
00030 {
00031 if (*glwit)
00032 {
00033 (*glwit)->Deinitialize();
00034 (*glwit)->SetRenderManager((RenderManager *)NULL);
00035 (*glwit)->Close();
00036 }
00037 }
00038 }
00039
00040
00041 GLWindow * RenderManager::GetGLWindow(RENDER_WINDOW_ID windowID)
00042 {
00043 return ( windowID >= windowList.size() ? (GLWindow *)NULL : windowList[windowID] );
00044 }
00045
00046
00047 RENDER_WINDOW_ID RenderManager::RenderScene(Scene * scene, NODE_ID cameraID)
00048 {
00049 if (!scene)
00050 {
00051 LOGERROR(wxString::Format(wxT("%sCannot render NULL scene"), SERVER_CLASS_NAMES[serverID].c_str()));
00052 return RENDER_WINDOW_ID_NONE;
00053 }
00054
00055 MODULE_ID moduleID = createModuleInstance();
00056 RenderModule * module = getModule(moduleID);
00057 if (module && module->IsOfType(MODULE_TYPE_RENDER))
00058 {
00059 module->SetSceneMgr(KERNEL->sceneManager);
00060 RENDER_WINDOW_ID windowID = RENDER_WINDOW_ID(windowList.size());
00061 wxString title = wxString::Format(wxT("%i (%s) "), windowID, scene->GetName().c_str());
00062 MainWindow * mainWindow = KERNEL->GetMainWindow();
00063 wxAuiNotebook * renderNotebook = mainWindow->GetRenderNotebook();
00064 GLWindow * glw = new GLWindow(renderNotebook, module, windowID, wxDefaultPosition, wxDefaultSize, (int *)NULL, title);
00065 glw->SetRenderManager(this);
00066 windowList.push_back(glw);
00067 if (!glw->CreateGLContext())
00068 LOGERROR(SERVER_CLASS_NAMES[serverID] + wxT("Failed to create GL context"));
00069 glw->SetFocus();
00070 renderNotebook->AddPage(glw, title, true);
00071
00072 wxCommandEvent showEvt = Event::GET_EVT_GUI_PANE_SHOW(ID_MainWin_View_RenderNotebook, true);
00073 KERNEL->GetMessageSink()->PostEvent(showEvt);
00074
00075 Parameter::ParameterIdentificator camPI(module->GetName(), wxT("cameraID"), module->GetID());
00077 KERNEL->environment.RegisterParam(camPI, wxString::Format(wxT("%i"), cameraID));
00079 wxCommandEvent ev1 = Event::GET_EVT_PARAM_SET(camPI, wxString::Format(wxT("%i"), cameraID));
00080 module->PostEvent(ev1, true);
00082 wxCommandEvent ev1g = Event::GET_EVT_PARAM_SET(camPI, wxString::Format(wxT("%i"), cameraID));
00083 KERNEL->GetMessageSink()->PostEvent(ev1g);
00084
00085 Parameter::ParameterIdentificator scenePI(module->GetName(), wxT("sceneID"), module->GetID());
00087 KERNEL->environment.RegisterParam(scenePI, wxString::Format(wxT("%i"), scene->GetID()));
00089 wxCommandEvent ev2 = Event::GET_EVT_PARAM_SET(scenePI, wxString::Format(wxT("%i"), scene->GetID()));
00090 module->PostEvent(ev2, true);
00091 ModuleHandle<RenderModule>::StartModuleThread(module);
00093 wxCommandEvent ev2g = Event::GET_EVT_PARAM_SET(scenePI, wxString::Format(wxT("%i"), scene->GetID()));
00094 KERNEL->GetMessageSink()->PostEvent(ev2g);
00095
00097 scene->WriteLock(cameraID);
00098 scene->SetProjectionParams(cameraID, glw->GetClientSize().x, glw->GetClientSize().y);
00099 scene->WriteUnlock(cameraID);
00100
00102 wxCommandEvent ev3 = Event::GET_EVT_RENDER_WIN_CREATED(windowID);
00103 KERNEL->GetMessageSink()->PostEvent(ev3);
00104
00105 return windowID;
00106 }
00107 else
00108 {
00109 releaseModule(moduleID);
00110 LOGERROR(SERVER_CLASS_NAMES[serverID] + wxT("No suitable render module found"));
00111 return RENDER_WINDOW_ID_NONE;
00112 }
00113 }
00114
00115
00116 void RenderManager::RenderUpdate(SCENE_ID sceneID)
00117 {
00118 for (WindowList::iterator wit = windowList.begin();
00119 wit != windowList.end(); wit++)
00120 {
00121 if (*wit
00122 && (*wit)->GetRenderModule()
00123 && (*wit)->GetRenderModule()->GetSceneID() == sceneID)
00124 (*wit)->draw();
00125 }
00126 }
00127
00128
00129 void RenderManager::DestroyGLWindow(GLWindow * glWin)
00130 {
00131 windowList[glWin->GetID()] = (GLWindow *)NULL;
00132 MODULE_ID mid = glWin->GetRenderModule()->GetID();
00133 glWin->Deinitialize();
00134 releaseModule(mid);
00135 }