Changeset View
Changeset View
Standalone View
Standalone View
source/gameengine/Ketsji/KX_KetsjiEngine.cpp
| Show First 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | |||||
| #include "KX_TimeCategoryLogger.h" | #include "KX_TimeCategoryLogger.h" | ||||
| #include "RAS_FramingManager.h" | #include "RAS_FramingManager.h" | ||||
| #include "DNA_world_types.h" | #include "DNA_world_types.h" | ||||
| #include "DNA_scene_types.h" | #include "DNA_scene_types.h" | ||||
| #include "KX_NavMeshObject.h" | #include "KX_NavMeshObject.h" | ||||
| #include "GPU_material.h" | |||||
| #define DEFAULT_LOGIC_TIC_RATE 60.0 | #define DEFAULT_LOGIC_TIC_RATE 60.0 | ||||
| //#define DEFAULT_PHYSICS_TIC_RATE 60.0 | //#define DEFAULT_PHYSICS_TIC_RATE 60.0 | ||||
| #ifdef FREE_WINDOWS /* XXX mingw64 (gcc 4.7.0) defines a macro for DrawText that translates to DrawTextA. Not good */ | #ifdef FREE_WINDOWS /* XXX mingw64 (gcc 4.7.0) defines a macro for DrawText that translates to DrawTextA. Not good */ | ||||
| #ifdef DrawText | #ifdef DrawText | ||||
| #undef DrawText | #undef DrawText | ||||
| #endif | #endif | ||||
| #endif | #endif | ||||
| ▲ Show 20 Lines • Show All 214 Lines • ▼ Show 20 Lines | void KX_KetsjiEngine::RenderDome() | ||||
| KX_SceneList::iterator sceneit; | 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 (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++) | ||||
| // for each scene, call the proceed functions | // for each scene, call the proceed functions | ||||
| { | { | ||||
moguri: Do we really need to call into BlenderWorldInfo this much? Can we not just call one update that… | |||||
Not Done Inline ActionsYes the four calls are are necessary. Actually the are only per frame per scene.
hg1: Yes the four calls are are necessary. Actually the are only per frame per scene.
1. Is when… | |||||
| scene = *sceneit; | scene = *sceneit; | ||||
| 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()); | scene->GetWorldInfo()->UpdateWorldSettings(); | ||||
| // shadow buffers | // shadow buffers | ||||
| if (i == 0) { | if (i == 0) { | ||||
| RenderShadowBuffers(scene); | RenderShadowBuffers(scene); | ||||
| } | } | ||||
| // Avoid drawing the scene with the active camera twice when it's viewport is enabled | // Avoid drawing the scene with the active camera twice when it's viewport is enabled | ||||
| if (cam && !cam->GetViewport()) | if (cam && !cam->GetViewport()) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 143 Lines • ▼ Show 20 Lines | for (it = cameras->begin(); it != cameras->end(); it++) | ||||
| clearvp.SetTop(viewport.GetTop()); | clearvp.SetTop(viewport.GetTop()); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (doclear) { | if (doclear) { | ||||
| KX_Scene* firstscene = *m_scenes.begin(); | KX_Scene* firstscene = *m_scenes.begin(); | ||||
| SetBackGround(firstscene->GetWorldInfo()); | firstscene->GetWorldInfo()->UpdateBackGround(); | ||||
| 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(); | ||||
| } | } | ||||
| } | } | ||||
| bool KX_KetsjiEngine::BeginFrame() | bool KX_KetsjiEngine::BeginFrame() | ||||
| ▲ Show 20 Lines • Show All 333 Lines • ▼ Show 20 Lines | void KX_KetsjiEngine::Render() | ||||
| KX_SceneList::iterator sceneit; | KX_SceneList::iterator sceneit; | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++) | 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 = *sceneit; | ||||
| 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()); | scene->GetWorldInfo()->UpdateWorldSettings(); | ||||
| // 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 | ||||
| RenderShadowBuffers(scene); | RenderShadowBuffers(scene); | ||||
| // Avoid drawing the scene with the active camera twice when it's viewport is enabled | // Avoid drawing the scene with the active camera twice when it's viewport is enabled | ||||
| Show All 40 Lines | if (m_rasterizer->Stereo()) | ||||
| for (sceneit = m_scenes.begin();sceneit != m_scenes.end(); sceneit++) | 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 = *sceneit; | ||||
| 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()); | scene->GetWorldInfo()->UpdateWorldSettings(); | ||||
| if (scene->IsClearingZBuffer()) | if (scene->IsClearingZBuffer()) | ||||
| m_rasterizer->ClearDepthBuffer(); | m_rasterizer->ClearDepthBuffer(); | ||||
| //pass the scene, for picking and raycasting (shadows) | //pass the scene, for picking and raycasting (shadows) | ||||
| m_rasterizer->SetAuxilaryClientInfo(scene); | m_rasterizer->SetAuxilaryClientInfo(scene); | ||||
| // do the rendering | // do the rendering | ||||
| ▲ Show 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | |||||
| const STR_String& KX_KetsjiEngine::GetExitString() | const STR_String& KX_KetsjiEngine::GetExitString() | ||||
| { | { | ||||
| return m_exitstring; | return m_exitstring; | ||||
| } | } | ||||
| void KX_KetsjiEngine::SetBackGround(KX_WorldInfo* wi) | |||||
| { | |||||
| if (wi->hasWorld()) | |||||
| { | |||||
| if (m_rasterizer->GetDrawingMode() == RAS_IRasterizer::KX_TEXTURED) | |||||
| { | |||||
| m_rasterizer->SetBackColor( | |||||
| wi->getBackColorRed(), | |||||
| wi->getBackColorGreen(), | |||||
| wi->getBackColorBlue(), | |||||
| 0.0 | |||||
| ); | |||||
| float horicolor[] = {wi->getBackColorRed(), wi->getBackColorGreen(), wi->getBackColorBlue()}; | |||||
| GPU_horizon_update_color(horicolor); | |||||
| } | |||||
| } | |||||
| } | |||||
| void KX_KetsjiEngine::SetWorldSettings(KX_WorldInfo* wi) | |||||
| { | |||||
| if (wi->hasWorld()) | |||||
| { | |||||
| if (m_rasterizer->GetDrawingMode() >= RAS_IRasterizer::KX_SOLID) | |||||
| { | |||||
| m_rasterizer->SetAmbientColor( | |||||
| wi->getAmbientColorRed(), | |||||
| wi->getAmbientColorGreen(), | |||||
| wi->getAmbientColorBlue() | |||||
| ); | |||||
| float ambcolor[] = {wi->getAmbientColorRed(), wi->getAmbientColorGreen(), wi->getAmbientColorBlue()}; | |||||
| GPU_ambient_update_color(ambcolor); | |||||
| if (wi->hasMist()) | |||||
| { | |||||
| m_rasterizer->SetFog( | |||||
| wi->getMistType(), | |||||
| wi->getMistStart(), | |||||
| wi->getMistDistance(), | |||||
| wi->getMistIntensity(), | |||||
| wi->getMistColorRed(), | |||||
| wi->getMistColorGreen(), | |||||
| wi->getMistColorBlue() | |||||
| ); | |||||
| float mistcolor[] = {wi->getMistColorRed(), wi->getMistColorGreen(), wi->getMistColorBlue()}; | |||||
| GPU_mist_update_values( | |||||
| wi->getMistType(), | |||||
| wi->getMistStart(), | |||||
| wi->getMistDistance(), | |||||
| wi->getMistIntensity(), | |||||
| mistcolor | |||||
| ); | |||||
| m_rasterizer->EnableFog(true); | |||||
| GPU_mist_update_enable(true); | |||||
| } | |||||
| else { | |||||
| m_rasterizer->EnableFog(false); | |||||
| GPU_mist_update_enable(false); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| void KX_KetsjiEngine::EnableCameraOverride(const STR_String& forscene) | void KX_KetsjiEngine::EnableCameraOverride(const STR_String& forscene) | ||||
| { | { | ||||
| m_overrideCam = true; | m_overrideCam = true; | ||||
| m_overrideSceneName = forscene; | m_overrideSceneName = forscene; | ||||
| } | } | ||||
| void KX_KetsjiEngine::SetCameraZoom(float camzoom) | void KX_KetsjiEngine::SetCameraZoom(float camzoom) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 995 Lines • Show Last 20 Lines | |||||
Do we really need to call into BlenderWorldInfo this much? Can we not just call one update that handles all the bf_gpu calls once per frame per scene?