Changeset View
Changeset View
Standalone View
Standalone View
source/gameengine/Ketsji/KX_KetsjiEngine.cpp
| Show First 20 Lines • Show All 180 Lines • ▼ Show 20 Lines | #endif | ||||
| for (int i = tc_first; i < tc_numCategories; i++) | for (int i = tc_first; i < tc_numCategories; i++) | ||||
| m_logger->AddCategory((KX_TimeCategory)i); | m_logger->AddCategory((KX_TimeCategory)i); | ||||
| #ifdef WITH_PYTHON | #ifdef WITH_PYTHON | ||||
| m_pyprofiledict = PyDict_New(); | m_pyprofiledict = PyDict_New(); | ||||
| #endif | #endif | ||||
| m_taskscheduler = BLI_task_scheduler_create(TASK_SCHEDULER_AUTO_THREADS); | m_taskscheduler = BLI_task_scheduler_create(TASK_SCHEDULER_AUTO_THREADS); | ||||
| m_scenes = new CListValue(); | |||||
| } | } | ||||
| /** | /** | ||||
| * Destructor of the Ketsji Engine, release all memory | * Destructor of the Ketsji Engine, release all memory | ||||
| */ | */ | ||||
| KX_KetsjiEngine::~KX_KetsjiEngine() | KX_KetsjiEngine::~KX_KetsjiEngine() | ||||
| { | { | ||||
| delete m_logger; | delete m_logger; | ||||
| if (m_usedome) | if (m_usedome) | ||||
| delete m_dome; | delete m_dome; | ||||
| #ifdef WITH_PYTHON | #ifdef WITH_PYTHON | ||||
| Py_CLEAR(m_pyprofiledict); | Py_CLEAR(m_pyprofiledict); | ||||
| #endif | #endif | ||||
| if (m_taskscheduler) | if (m_taskscheduler) | ||||
| BLI_task_scheduler_free(m_taskscheduler); | BLI_task_scheduler_free(m_taskscheduler); | ||||
| m_scenes->Release(); | |||||
| } | } | ||||
| void KX_KetsjiEngine::SetKeyboardDevice(SCA_IInputDevice* keyboarddevice) | void KX_KetsjiEngine::SetKeyboardDevice(SCA_IInputDevice* keyboarddevice) | ||||
| { | { | ||||
| MT_assert(keyboarddevice); | MT_assert(keyboarddevice); | ||||
| m_keyboarddevice = keyboarddevice; | m_keyboarddevice = keyboarddevice; | ||||
| ▲ Show 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| void KX_KetsjiEngine::RenderDome() | void KX_KetsjiEngine::RenderDome() | ||||
| { | { | ||||
| const GLint *viewport = m_canvas->GetViewPort(); | const GLint *viewport = m_canvas->GetViewPort(); | ||||
| m_dome->SetViewPort(viewport); | m_dome->SetViewPort(viewport); | ||||
| KX_Scene* firstscene = *m_scenes.begin(); | KX_Scene* firstscene = (KX_Scene*)m_scenes->GetFront(); | ||||
| const RAS_FrameSettings &framesettings = firstscene->GetFramingType(); | const RAS_FrameSettings &framesettings = firstscene->GetFramingType(); | ||||
| m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true); | m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true); | ||||
| // hiding mouse cursor each frame | // hiding mouse cursor each frame | ||||
| // (came back when going out of focus and then back in again) | // (came back when going out of focus and then back in again) | ||||
| if (m_hideCursor) | if (m_hideCursor) | ||||
| m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE); | m_canvas->SetMouseState(RAS_ICanvas::MOUSE_INVISIBLE); | ||||
| // clear the entire game screen with the border color | // clear the entire game screen with the border color | ||||
| // only once per frame | // only once per frame | ||||
| m_canvas->BeginDraw(); | m_canvas->BeginDraw(); | ||||
| // BeginFrame() sets the actual drawing area. You can use a part of the window | // BeginFrame() sets the actual drawing area. You can use a part of the window | ||||
| if (!BeginFrame()) | if (!BeginFrame()) | ||||
| return; | return; | ||||
| KX_SceneList::iterator sceneit; | |||||
| KX_Scene* scene = NULL; | KX_Scene* scene = NULL; | ||||
| int n_renders=m_dome->GetNumberRenders();// usually 4 or 6 | int n_renders=m_dome->GetNumberRenders();// usually 4 or 6 | ||||
| for (int i=0;i<n_renders;i++) { | for (int i=0;i<n_renders;i++) { | ||||
| m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER); | m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER); | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++) | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) | ||||
| // for each scene, call the proceed functions | // for each scene, call the proceed functions | ||||
| { | { | ||||
| scene = *sceneit; | scene = (KX_Scene*)m_scenes->GetValue(sce_idx); | ||||
| KX_Camera* cam = scene->GetActiveCamera(); | KX_Camera* cam = scene->GetActiveCamera(); | ||||
| // pass the scene's worldsettings to the rasterizer | // pass the scene's worldsettings to the rasterizer | ||||
| SetWorldSettings(scene->GetWorldInfo()); | SetWorldSettings(scene->GetWorldInfo()); | ||||
| // shadow buffers | // shadow buffers | ||||
| if (i == 0) { | if (i == 0) { | ||||
| RenderShadowBuffers(scene); | RenderShadowBuffers(scene); | ||||
| ▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| m_clockTime = m_kxsystem->GetTimeInSeconds(); | m_clockTime = m_kxsystem->GetTimeInSeconds(); | ||||
| m_frameTime = m_kxsystem->GetTimeInSeconds(); | m_frameTime = m_kxsystem->GetTimeInSeconds(); | ||||
| m_previousClockTime = m_kxsystem->GetTimeInSeconds(); | m_previousClockTime = m_kxsystem->GetTimeInSeconds(); | ||||
| m_firstframe = true; | m_firstframe = true; | ||||
| m_bInitialized = true; | m_bInitialized = true; | ||||
| // there is always one scene enabled at startup | // there is always one scene enabled at startup | ||||
| Scene* scene = m_scenes[0]->GetBlenderScene(); | Scene* scene = ((KX_Scene*)m_scenes->GetFront())->GetBlenderScene(); | ||||
| if (scene) | if (scene) | ||||
| { | { | ||||
| m_ticrate = scene->gm.ticrate ? scene->gm.ticrate : DEFAULT_LOGIC_TIC_RATE; | m_ticrate = scene->gm.ticrate ? scene->gm.ticrate : DEFAULT_LOGIC_TIC_RATE; | ||||
| m_maxLogicFrame = scene->gm.maxlogicstep ? scene->gm.maxlogicstep : 5; | m_maxLogicFrame = scene->gm.maxlogicstep ? scene->gm.maxlogicstep : 5; | ||||
| m_maxPhysicsFrame = scene->gm.maxphystep ? scene->gm.maxlogicstep : 5; | m_maxPhysicsFrame = scene->gm.maxphystep ? scene->gm.maxlogicstep : 5; | ||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| Show All 14 Lines | |||||
| { | { | ||||
| // clear unless we're drawing overlapping stereo | // clear unless we're drawing overlapping stereo | ||||
| if (m_rasterizer->InterlacedStereo() && | if (m_rasterizer->InterlacedStereo() && | ||||
| m_rasterizer->GetEye() == RAS_IRasterizer::RAS_STEREO_RIGHTEYE) | m_rasterizer->GetEye() == RAS_IRasterizer::RAS_STEREO_RIGHTEYE) | ||||
| return; | return; | ||||
| // clear the viewports with the background color of the first scene | // clear the viewports with the background color of the first scene | ||||
| bool doclear = false; | bool doclear = false; | ||||
| KX_SceneList::iterator sceneit; | |||||
| RAS_Rect clearvp, area, viewport; | RAS_Rect clearvp, area, viewport; | ||||
| for (sceneit = m_scenes.begin(); sceneit != m_scenes.end(); sceneit++) | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) | ||||
| { | { | ||||
| KX_Scene* scene = *sceneit; | KX_Scene* scene = (KX_Scene*)m_scenes->GetValue(sce_idx); | ||||
| //const RAS_FrameSettings &framesettings = scene->GetFramingType(); | //const RAS_FrameSettings &framesettings = scene->GetFramingType(); | ||||
| list<class KX_Camera*>* cameras = scene->GetCameras(); | list<class KX_Camera*>* cameras = scene->GetCameras(); | ||||
| list<KX_Camera*>::iterator it; | list<KX_Camera*>::iterator it; | ||||
| for (it = cameras->begin(); it != cameras->end(); it++) | for (it = cameras->begin(); it != cameras->end(); it++) | ||||
| { | { | ||||
| GetSceneViewport(scene, (*it), area, viewport); | GetSceneViewport(scene, (*it), area, viewport); | ||||
| Show All 11 Lines | for (it = cameras->begin(); it != cameras->end(); it++) | ||||
| if (viewport.GetTop() > clearvp.GetTop()) | if (viewport.GetTop() > clearvp.GetTop()) | ||||
| clearvp.SetTop(viewport.GetTop()); | clearvp.SetTop(viewport.GetTop()); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (doclear) { | if (doclear) { | ||||
| KX_Scene* firstscene = *m_scenes.begin(); | KX_Scene* firstscene = (KX_Scene*)m_scenes->GetFront(); | ||||
| SetBackGround(firstscene->GetWorldInfo()); | SetBackGround(firstscene->GetWorldInfo()); | ||||
| m_canvas->SetViewPort(clearvp.GetLeft(), clearvp.GetBottom(), | m_canvas->SetViewPort(clearvp.GetLeft(), clearvp.GetBottom(), | ||||
| clearvp.GetRight(), clearvp.GetTop()); | clearvp.GetRight(), clearvp.GetTop()); | ||||
| m_rasterizer->ClearColorBuffer(); | m_rasterizer->ClearColorBuffer(); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | // PIL_sleep_ms(1); | ||||
| while (frames) | while (frames) | ||||
| { | { | ||||
| m_frameTime += framestep; | m_frameTime += framestep; | ||||
| m_sceneconverter->MergeAsyncLoads(); | m_sceneconverter->MergeAsyncLoads(); | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); ++sceneit) | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) | ||||
| // for each scene, call the proceed functions | // for each scene, call the proceed functions | ||||
| { | { | ||||
| KX_Scene* scene = *sceneit; | KX_Scene* scene = (KX_Scene*)m_scenes->GetValue(sce_idx); | ||||
| /* Suspension holds the physics and logic processing for an | /* Suspension holds the physics and logic processing for an | ||||
| * entire scene. Objects can be suspended individually, and | * entire scene. Objects can be suspended individually, and | ||||
| * the settings for that precede the logic and physics | * the settings for that precede the logic and physics | ||||
| * update. */ | * update. */ | ||||
| m_logger->StartLog(tc_logic, m_kxsystem->GetTimeInSeconds(), true); | m_logger->StartLog(tc_logic, m_kxsystem->GetTimeInSeconds(), true); | ||||
| m_sceneconverter->resetNoneDynamicObjectToIpo();//this is for none dynamic objects with ipo | m_sceneconverter->resetNoneDynamicObjectToIpo();//this is for none dynamic objects with ipo | ||||
| ▲ Show 20 Lines • Show All 120 Lines • ▼ Show 20 Lines | if (GetRestrictAnimationFPS()) | ||||
| SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE); | SG_SetActiveStage(SG_STAGE_ANIMATION_UPDATE); | ||||
| double anim_timestep = 1.0/KX_GetActiveScene()->GetAnimationFPS(); | double anim_timestep = 1.0/KX_GetActiveScene()->GetAnimationFPS(); | ||||
| if (clocktime - m_previousAnimTime > anim_timestep) | if (clocktime - m_previousAnimTime > anim_timestep) | ||||
| { | { | ||||
| // Sanity/debug print to make sure we're actually going at the fps we want (should be close to anim_timestep) | // Sanity/debug print to make sure we're actually going at the fps we want (should be close to anim_timestep) | ||||
| // printf("Anim fps: %f\n", 1.0/(m_clockTime - m_previousAnimTime)); | // printf("Anim fps: %f\n", 1.0/(m_clockTime - m_previousAnimTime)); | ||||
| m_previousAnimTime = clocktime; | m_previousAnimTime = clocktime; | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); ++sceneit) | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) | ||||
| { | { | ||||
| (*sceneit)->UpdateAnimations(clocktime); | ((KX_Scene*)m_scenes->GetValue(sce_idx))->UpdateAnimations(clocktime); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| // Start logging time spend outside main loop | // Start logging time spend outside main loop | ||||
| m_logger->StartLog(tc_outside, m_kxsystem->GetTimeInSeconds(), true); | m_logger->StartLog(tc_outside, m_kxsystem->GetTimeInSeconds(), true); | ||||
| return doRender; | return doRender; | ||||
| } | } | ||||
| void KX_KetsjiEngine::Render() | void KX_KetsjiEngine::Render() | ||||
| { | { | ||||
| if (m_usedome) { | if (m_usedome) { | ||||
| RenderDome(); | RenderDome(); | ||||
| return; | return; | ||||
| } | } | ||||
| KX_Scene* firstscene = *m_scenes.begin(); | KX_Scene* firstscene = (KX_Scene*)m_scenes->GetFront(); | ||||
| const RAS_FrameSettings &framesettings = firstscene->GetFramingType(); | const RAS_FrameSettings &framesettings = firstscene->GetFramingType(); | ||||
| m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true); | m_logger->StartLog(tc_rasterizer, m_kxsystem->GetTimeInSeconds(), true); | ||||
| SG_SetActiveStage(SG_STAGE_RENDER); | SG_SetActiveStage(SG_STAGE_RENDER); | ||||
| // hiding mouse cursor each frame | // hiding mouse cursor each frame | ||||
| // (came back when going out of focus and then back in again) | // (came back when going out of focus and then back in again) | ||||
| if (m_hideCursor) | if (m_hideCursor) | ||||
| Show All 29 Lines | void KX_KetsjiEngine::Render() | ||||
| } | } | ||||
| m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE); | m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE); | ||||
| // BeginFrame() sets the actual drawing area. You can use a part of the window | // BeginFrame() sets the actual drawing area. You can use a part of the window | ||||
| if (!BeginFrame()) | if (!BeginFrame()) | ||||
| return; | return; | ||||
| KX_SceneList::iterator sceneit; | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++) | |||||
| // for each scene, call the proceed functions | // for each scene, call the proceed functions | ||||
| { | { | ||||
| KX_Scene* scene = *sceneit; | KX_Scene* scene = (KX_Scene*)m_scenes->GetValue(sce_idx); | ||||
| KX_Camera* cam = scene->GetActiveCamera(); | KX_Camera* cam = scene->GetActiveCamera(); | ||||
| // pass the scene's worldsettings to the rasterizer | // pass the scene's worldsettings to the rasterizer | ||||
| SetWorldSettings(scene->GetWorldInfo()); | SetWorldSettings(scene->GetWorldInfo()); | ||||
| // this is now done incrementatlly in KX_Scene::CalculateVisibleMeshes | // this is now done incrementatlly in KX_Scene::CalculateVisibleMeshes | ||||
| //scene->UpdateMeshTransformations(); | //scene->UpdateMeshTransformations(); | ||||
| // shadow buffers | // shadow buffers | ||||
| Show All 36 Lines | void KX_KetsjiEngine::Render() | ||||
| if (m_rasterizer->Stereo()) | if (m_rasterizer->Stereo()) | ||||
| { | { | ||||
| m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_RIGHTEYE); | m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_RIGHTEYE); | ||||
| if (!BeginFrame()) | if (!BeginFrame()) | ||||
| return; | return; | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++) | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) | ||||
| // for each scene, call the proceed functions | // for each scene, call the proceed functions | ||||
| { | { | ||||
| KX_Scene* scene = *sceneit; | KX_Scene* scene = (KX_Scene*)m_scenes->GetValue(sce_idx); | ||||
| KX_Camera* cam = scene->GetActiveCamera(); | KX_Camera* cam = scene->GetActiveCamera(); | ||||
| // pass the scene's worldsettings to the rasterizer | // pass the scene's worldsettings to the rasterizer | ||||
| SetWorldSettings(scene->GetWorldInfo()); | SetWorldSettings(scene->GetWorldInfo()); | ||||
| if (scene->IsClearingZBuffer()) | if (scene->IsClearingZBuffer()) | ||||
| m_rasterizer->ClearDepthBuffer(); | m_rasterizer->ClearDepthBuffer(); | ||||
| ▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | |||||
| int KX_KetsjiEngine::GetExitCode() | int KX_KetsjiEngine::GetExitCode() | ||||
| { | { | ||||
| // if a gameactuator has set an exitcode or if there are no scenes left | // if a gameactuator has set an exitcode or if there are no scenes left | ||||
| if (!m_exitcode) | if (!m_exitcode) | ||||
| { | { | ||||
| if (m_scenes.begin()==m_scenes.end()) | if (m_scenes->GetCount() == 0) | ||||
| m_exitcode = KX_EXIT_REQUEST_NO_SCENES_LEFT; | m_exitcode = KX_EXIT_REQUEST_NO_SCENES_LEFT; | ||||
| } | } | ||||
| // check if the window has been closed. | // check if the window has been closed. | ||||
| if (!m_exitcode) | if (!m_exitcode) | ||||
| { | { | ||||
| //if (!m_canvas->Check()) { | //if (!m_canvas->Check()) { | ||||
| // m_exitcode = KX_EXIT_REQUEST_OUTSIDE; | // m_exitcode = KX_EXIT_REQUEST_OUTSIDE; | ||||
| ▲ Show 20 Lines • Show All 344 Lines • ▼ Show 20 Lines | void KX_KetsjiEngine::StopEngine() | ||||
| { | { | ||||
| if (m_animation_record) | if (m_animation_record) | ||||
| { | { | ||||
| // printf("TestHandlesPhysicsObjectToAnimationIpo\n"); | // printf("TestHandlesPhysicsObjectToAnimationIpo\n"); | ||||
| m_sceneconverter->TestHandlesPhysicsObjectToAnimationIpo(); | m_sceneconverter->TestHandlesPhysicsObjectToAnimationIpo(); | ||||
| } | } | ||||
| KX_SceneList::iterator sceneit; | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end() ; sceneit++) | |||||
| { | { | ||||
| KX_Scene* scene = *sceneit; | KX_Scene* scene = (KX_Scene*)m_scenes->GetValue(sce_idx); | ||||
| m_sceneconverter->RemoveScene(scene); | m_sceneconverter->RemoveScene(scene); | ||||
| } | } | ||||
| m_scenes.clear(); | m_scenes->ReleaseAndRemoveAll(); | ||||
| // cleanup all the stuff | // cleanup all the stuff | ||||
| m_rasterizer->Exit(); | m_rasterizer->Exit(); | ||||
| } | } | ||||
| } | } | ||||
| // Scene Management is able to switch between scenes | // Scene Management is able to switch between scenes | ||||
| // and have several scene's running in parallel | // and have several scene's running in parallel | ||||
| void KX_KetsjiEngine::AddScene(KX_Scene* scene) | void KX_KetsjiEngine::AddScene(KX_Scene* scene) | ||||
| { | { | ||||
| m_scenes.push_back(scene); | m_scenes->Add(scene->AddRef()); | ||||
| PostProcessScene(scene); | PostProcessScene(scene); | ||||
| } | } | ||||
| void KX_KetsjiEngine::PostProcessScene(KX_Scene* scene) | void KX_KetsjiEngine::PostProcessScene(KX_Scene* scene) | ||||
| { | { | ||||
| bool override_camera = (m_overrideCam && (scene->GetName() == m_overrideSceneName)); | bool override_camera = (m_overrideCam && (scene->GetName() == m_overrideSceneName)); | ||||
| ▲ Show 20 Lines • Show All 147 Lines • ▼ Show 20 Lines | if (m_show_debug_properties) { | ||||
| ycoord += const_ysize; | ycoord += const_ysize; | ||||
| // Add the title indent afterwards | // Add the title indent afterwards | ||||
| ycoord += title_y_bottom_margin; | ycoord += title_y_bottom_margin; | ||||
| /* Calculate amount of properties that can displayed. */ | /* Calculate amount of properties that can displayed. */ | ||||
| unsigned propsAct = 0; | unsigned propsAct = 0; | ||||
| unsigned propsMax = (m_canvas->GetHeight() - ycoord) / const_ysize; | unsigned propsMax = (m_canvas->GetHeight() - ycoord) / const_ysize; | ||||
| KX_SceneList::iterator sceneit; | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) { | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++) { | KX_Scene* scene = (KX_Scene*)m_scenes->GetValue(sce_idx); | ||||
| KX_Scene* scene = *sceneit; | |||||
| /* the 'normal' debug props */ | /* the 'normal' debug props */ | ||||
| vector<SCA_DebugProp*>& debugproplist = scene->GetDebugProperties(); | vector<SCA_DebugProp*>& debugproplist = scene->GetDebugProperties(); | ||||
| for (unsigned i=0; i < debugproplist.size() && propsAct < propsMax; i++) | for (unsigned i=0; i < debugproplist.size() && propsAct < propsMax; i++) | ||||
| { | { | ||||
| CValue *propobj = debugproplist[i]->m_obj; | CValue *propobj = debugproplist[i]->m_obj; | ||||
| STR_String objname = propobj->GetName(); | STR_String objname = propobj->GetName(); | ||||
| STR_String propname = debugproplist[i]->m_name; | STR_String propname = debugproplist[i]->m_name; | ||||
| Show All 39 Lines | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) { | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| KX_SceneList* KX_KetsjiEngine::CurrentScenes() | CListValue* KX_KetsjiEngine::CurrentScenes() | ||||
| { | { | ||||
| return &m_scenes; | return m_scenes; | ||||
| } | } | ||||
| KX_Scene* KX_KetsjiEngine::FindScene(const STR_String& scenename) | KX_Scene* KX_KetsjiEngine::FindScene(const STR_String& scenename) | ||||
| { | { | ||||
| KX_SceneList::iterator sceneit = m_scenes.begin(); | return (KX_Scene*)m_scenes->FindValue(scenename); | ||||
| // bit risky :) better to split the second clause | |||||
| while ( (sceneit != m_scenes.end()) | |||||
| && ((*sceneit)->GetName() != scenename)) | |||||
| { | |||||
| sceneit++; | |||||
| } | |||||
| return ((sceneit == m_scenes.end()) ? NULL : *sceneit); | |||||
| } | } | ||||
| void KX_KetsjiEngine::ConvertAndAddScene(const STR_String& scenename,bool overlay) | void KX_KetsjiEngine::ConvertAndAddScene(const STR_String& scenename,bool overlay) | ||||
| { | { | ||||
| // only add scene when it doesn't exist! | // only add scene when it doesn't exist! | ||||
| if (FindScene(scenename)) { | if (FindScene(scenename)) { | ||||
| Show All 31 Lines | |||||
| { | { | ||||
| if (m_removingScenes.size()) | if (m_removingScenes.size()) | ||||
| { | { | ||||
| vector<STR_String>::iterator scenenameit; | vector<STR_String>::iterator scenenameit; | ||||
| for (scenenameit=m_removingScenes.begin();scenenameit != m_removingScenes.end();scenenameit++) | for (scenenameit=m_removingScenes.begin();scenenameit != m_removingScenes.end();scenenameit++) | ||||
| { | { | ||||
| STR_String scenename = *scenenameit; | STR_String scenename = *scenenameit; | ||||
| KX_SceneList::iterator sceneit; | KX_Scene* scene = FindScene(scenename); | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end() ; sceneit++) | if (scene) | ||||
| { | |||||
| KX_Scene* scene = *sceneit; | |||||
| if (scene->GetName()==scenename) | |||||
| { | { | ||||
| m_sceneconverter->RemoveScene(scene); | m_sceneconverter->RemoveScene(scene); | ||||
| m_scenes.erase(sceneit); | if (m_scenes->RemoveValue(scene)) | ||||
| break; | { | ||||
| int ret = scene->Release(); | |||||
| if (ret > 0) | |||||
| std::cout << "warning: Zombie scene, name : " << scenename << ", reference counting : " << ret << std::endl; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| m_removingScenes.clear(); | m_removingScenes.clear(); | ||||
| } | } | ||||
| } | } | ||||
| KX_Scene* KX_KetsjiEngine::CreateScene(Scene *scene, bool libloading) | KX_Scene* KX_KetsjiEngine::CreateScene(Scene *scene, bool libloading) | ||||
| Show All 29 Lines | void KX_KetsjiEngine::AddScheduledScenes() | ||||
| { | { | ||||
| for (scenenameit = m_addingOverlayScenes.begin(); | for (scenenameit = m_addingOverlayScenes.begin(); | ||||
| scenenameit != m_addingOverlayScenes.end(); | scenenameit != m_addingOverlayScenes.end(); | ||||
| scenenameit++) | scenenameit++) | ||||
| { | { | ||||
| STR_String scenename = *scenenameit; | STR_String scenename = *scenenameit; | ||||
| KX_Scene* tmpscene = CreateScene(scenename); | KX_Scene* tmpscene = CreateScene(scenename); | ||||
| if (tmpscene) { | if (tmpscene) { | ||||
| m_scenes.push_back(tmpscene); | m_scenes->Add(tmpscene->AddRef()); | ||||
| PostProcessScene(tmpscene); | PostProcessScene(tmpscene); | ||||
| } else { | } else { | ||||
| printf("warning: scene %s could not be found, not added!\n",scenename.ReadPtr()); | printf("warning: scene %s could not be found, not added!\n",scenename.ReadPtr()); | ||||
| } | } | ||||
| } | } | ||||
| m_addingOverlayScenes.clear(); | m_addingOverlayScenes.clear(); | ||||
| } | } | ||||
| if (m_addingBackgroundScenes.size()) | if (m_addingBackgroundScenes.size()) | ||||
| { | { | ||||
| for (scenenameit = m_addingBackgroundScenes.begin(); | for (scenenameit = m_addingBackgroundScenes.begin(); | ||||
| scenenameit != m_addingBackgroundScenes.end(); | scenenameit != m_addingBackgroundScenes.end(); | ||||
| scenenameit++) | scenenameit++) | ||||
| { | { | ||||
| STR_String scenename = *scenenameit; | STR_String scenename = *scenenameit; | ||||
| KX_Scene* tmpscene = CreateScene(scenename); | KX_Scene* tmpscene = CreateScene(scenename); | ||||
| if (tmpscene) { | if (tmpscene) { | ||||
| m_scenes.insert(m_scenes.begin(),tmpscene); | m_scenes->Insert(0, tmpscene->AddRef()); | ||||
| PostProcessScene(tmpscene); | PostProcessScene(tmpscene); | ||||
| } else { | } else { | ||||
| printf("warning: scene %s could not be found, not added!\n",scenename.ReadPtr()); | printf("warning: scene %s could not be found, not added!\n",scenename.ReadPtr()); | ||||
| } | } | ||||
| } | } | ||||
| m_addingBackgroundScenes.clear(); | m_addingBackgroundScenes.clear(); | ||||
| } | } | ||||
| } | } | ||||
| Show All 26 Lines | if (m_replace_scenes.size()) | ||||
| vector<pair<STR_String,STR_String> >::iterator scenenameit; | vector<pair<STR_String,STR_String> >::iterator scenenameit; | ||||
| for (scenenameit = m_replace_scenes.begin(); | for (scenenameit = m_replace_scenes.begin(); | ||||
| scenenameit != m_replace_scenes.end(); | scenenameit != m_replace_scenes.end(); | ||||
| scenenameit++) | scenenameit++) | ||||
| { | { | ||||
| STR_String oldscenename = (*scenenameit).first; | STR_String oldscenename = (*scenenameit).first; | ||||
| STR_String newscenename = (*scenenameit).second; | STR_String newscenename = (*scenenameit).second; | ||||
| int i=0; | |||||
| /* Scenes are not supposed to be included twice... I think */ | /* Scenes are not supposed to be included twice... I think */ | ||||
| KX_SceneList::iterator sceneit; | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) { | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end() ; sceneit++) { | KX_Scene* scene = (KX_Scene*)m_scenes->GetValue(sce_idx); | ||||
| KX_Scene* scene = *sceneit; | |||||
| if (scene->GetName() == oldscenename) { | if (scene->GetName() == oldscenename) { | ||||
| // avoid crash if the new scene doesn't exist, just do nothing | // avoid crash if the new scene doesn't exist, just do nothing | ||||
| Scene *blScene = m_sceneconverter->GetBlenderSceneForName(newscenename); | Scene *blScene = m_sceneconverter->GetBlenderSceneForName(newscenename); | ||||
| if (blScene) { | if (blScene) { | ||||
| m_sceneconverter->RemoveScene(scene); | m_sceneconverter->RemoveScene(scene); | ||||
| scene->Release(); | |||||
| KX_Scene* tmpscene = CreateScene(blScene); | KX_Scene* tmpscene = CreateScene(blScene); | ||||
| m_scenes[i]=tmpscene; | m_scenes->SetValue(sce_idx, tmpscene->AddRef()); | ||||
| PostProcessScene(tmpscene); | PostProcessScene(tmpscene); | ||||
| } | } | ||||
| else { | else { | ||||
| printf("warning: scene %s could not be found, not replaced!\n",newscenename.ReadPtr()); | printf("warning: scene %s could not be found, not replaced!\n",newscenename.ReadPtr()); | ||||
| } | } | ||||
| } | } | ||||
| i++; | |||||
| } | } | ||||
| } | } | ||||
| m_replace_scenes.clear(); | m_replace_scenes.clear(); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 234 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| void KX_KetsjiEngine::Resize() | void KX_KetsjiEngine::Resize() | ||||
| { | { | ||||
| KX_SceneList::iterator sceneit; | KX_SceneList::iterator sceneit; | ||||
| /* extended mode needs to recalculate camera frustrums when */ | /* extended mode needs to recalculate camera frustrums when */ | ||||
| KX_Scene* firstscene = *m_scenes.begin(); | KX_Scene* firstscene = (KX_Scene*)m_scenes->GetFront(); | ||||
| const RAS_FrameSettings &framesettings = firstscene->GetFramingType(); | const RAS_FrameSettings &framesettings = firstscene->GetFramingType(); | ||||
| if (framesettings.FrameType() == RAS_FrameSettings::e_frame_extend) { | if (framesettings.FrameType() == RAS_FrameSettings::e_frame_extend) { | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++) { | for (unsigned int sce_idx = 0; sce_idx < m_scenes->GetCount(); ++sce_idx) { | ||||
| KX_Camera* cam = ((KX_Scene *)*sceneit)->GetActiveCamera(); | KX_Camera* cam = ((KX_Scene*)m_scenes->GetValue(sce_idx))->GetActiveCamera(); | ||||
| cam->InvalidateProjectionMatrix(); | cam->InvalidateProjectionMatrix(); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void KX_KetsjiEngine::SetGlobalSettings(GlobalSettings* gs) | void KX_KetsjiEngine::SetGlobalSettings(GlobalSettings* gs) | ||||
| { | { | ||||
| Show All 9 Lines | |||||