diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2010-03-03 09:38:47 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2010-03-03 09:38:47 +0300 |
commit | 0cad3ae24cc9628be09da4d1b4fe475a0c1733f7 (patch) | |
tree | 4078f623e0d7e5edbf23814d638982e3c706ba47 | |
parent | c26486f207eab2a82d02932d8ff2b7c19a307b95 (diff) |
BGE 2D Filters: filters run per scene now (fix for [#18152]) - it (slightly) breaks backward compatibility !!!
Originally we had 2DFilters (m_filtermanager) stored in RenderTools. That way filters were stored globally and were being called once per each scene. This was producing two big problems: (1) performance and (2) flexibility of use.
(1) Performance - To run the filters 2X == 2X slower
(2) flexibility of use - Very often we want the filter in the scene but not in the UI for example.
For those reasons I believe that 2DFilters with multiple scenes was very useless or unpredictable. I hope they work fine now.
To make it work as before (2.4) you can simply recreate the 2dfilter actuators across the scenes.
* * * * *
Imagine that we have:
(a) Main Scene
(b) Overlay Scene
in Main Scene the Z Buffer and RGB will be from the main scene.
in Overlay Scene the Z Buffer will be from the Overlay Scene and the RBG buffer is from both [(a + 2D Filter) + b].
So in pseudo code if we have a,b,c,d,e scenes we have: (2DFilterE(2DFilterD(2DFilterC(2DFilterB(2DFilterA(a) + b) + c) + d) + e)
19 files changed, 46 insertions, 60 deletions
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 0c958654722..98cbd95b867 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -2246,7 +2246,6 @@ static void SCREEN_OT_region_flip(wmOperatorType *ot) /* api callbacks */ ot->exec= region_flip_exec; - ot->poll= ED_operator_areaactive; ot->flag= 0; } diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp index 60d60ca9045..3d736557535 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp +++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp @@ -379,13 +379,3 @@ void KX_BlenderRenderTools::MotionBlur(RAS_IRasterizer* rasterizer) } } } - -void KX_BlenderRenderTools::Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text) -{ - m_filtermanager.EnableFilter(propNames, gameObj, filtermode, pass, text); -} - -void KX_BlenderRenderTools::Render2DFilters(RAS_ICanvas* canvas) -{ - m_filtermanager.RenderFilters(canvas); -} diff --git a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h index 54c89454c90..07226524538 100644 --- a/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h +++ b/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h @@ -94,10 +94,6 @@ public: virtual void MotionBlur(RAS_IRasterizer* rasterizer); - virtual void Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text); - - virtual void Render2DFilters(RAS_ICanvas* canvas); - virtual void SetClientObject(RAS_IRasterizer *rasty, void* obj); diff --git a/source/gameengine/Converter/KX_ConvertActuators.cpp b/source/gameengine/Converter/KX_ConvertActuators.cpp index 5aa7283f14c..9b41470769f 100644 --- a/source/gameengine/Converter/KX_ConvertActuators.cpp +++ b/source/gameengine/Converter/KX_ConvertActuators.cpp @@ -969,7 +969,7 @@ void BL_ConvertActuators(char* maggiename, } tmp = new SCA_2DFilterActuator(gameobj, filtermode, _2dfilter->flag, - _2dfilter->float_arg,_2dfilter->int_arg,ketsjiEngine->GetRasterizer(),rendertools); + _2dfilter->float_arg,_2dfilter->int_arg,ketsjiEngine->GetRasterizer(),scene); if (_2dfilter->text) { diff --git a/source/gameengine/GameLogic/CMakeLists.txt b/source/gameengine/GameLogic/CMakeLists.txt index 3ffba14ec95..958e697aa39 100644 --- a/source/gameengine/GameLogic/CMakeLists.txt +++ b/source/gameengine/GameLogic/CMakeLists.txt @@ -32,6 +32,7 @@ SET(INC ../../../intern/string ../../../source/gameengine/Expressions ../../../source/gameengine/SceneGraph + ../../../source/gameengine/Ketsji ../../../intern/moto/include ../../../source/gameengine/Rasterizer ) diff --git a/source/gameengine/GameLogic/Makefile b/source/gameengine/GameLogic/Makefile index a1794a60452..0d4d50b32a0 100644 --- a/source/gameengine/GameLogic/Makefile +++ b/source/gameengine/GameLogic/Makefile @@ -41,6 +41,7 @@ CCFLAGS += $(LEVEL_1_CPP_WARNINGS) CPPFLAGS += -I../Expressions CPPFLAGS += -I../SceneGraph CPPFLAGS += -I../Rasterizer +CPPFLAGS += -I../Ketsji CPPFLAGS += -I$(NAN_STRING)/include CPPFLAGS += -I$(NAN_MOTO)/include CPPFLAGS += -I../../blender/makesdna diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp index 5cda00d901f..43cf36b7db8 100644 --- a/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp +++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.cpp @@ -42,14 +42,14 @@ SCA_2DFilterActuator::SCA_2DFilterActuator( float float_arg, int int_arg, RAS_IRasterizer* rasterizer, - RAS_IRenderTools* rendertools) + KX_Scene* scene) : SCA_IActuator(gameobj, KX_ACT_2DFILTER), m_type(type), m_disableMotionBlur(flag), m_float_arg(float_arg), m_int_arg(int_arg), m_rasterizer(rasterizer), - m_rendertools(rendertools) + m_scene(scene) { m_gameObj = NULL; if(gameobj){ @@ -87,7 +87,7 @@ bool SCA_2DFilterActuator::Update() } else if(m_type < RAS_2DFilterManager::RAS_2DFILTER_NUMBER_OF_FILTERS) { - m_rendertools->Update2DFilter(m_propNames, m_gameObj, m_type, m_int_arg, m_shaderText); + m_scene->Update2DFilter(m_propNames, m_gameObj, m_type, m_int_arg, m_shaderText); } // once the filter is in place, no need to update it again => disable the actuator return false; diff --git a/source/gameengine/GameLogic/SCA_2DFilterActuator.h b/source/gameengine/GameLogic/SCA_2DFilterActuator.h index d47cfb203f8..beb4cb88608 100644 --- a/source/gameengine/GameLogic/SCA_2DFilterActuator.h +++ b/source/gameengine/GameLogic/SCA_2DFilterActuator.h @@ -29,8 +29,8 @@ #define __SCA_2DFILETRACTUATOR_H__ #include "RAS_IRasterizer.h" -#include "RAS_IRenderTools.h" #include "SCA_IActuator.h" +#include "KX_Scene.h" class SCA_2DFilterActuator : public SCA_IActuator { @@ -45,7 +45,7 @@ private: int m_int_arg; STR_String m_shaderText; RAS_IRasterizer* m_rasterizer; - RAS_IRenderTools* m_rendertools; + KX_Scene* m_scene; public: @@ -56,7 +56,7 @@ public: float float_arg, int int_arg, RAS_IRasterizer* rasterizer, - RAS_IRenderTools* rendertools); + KX_Scene* scene); void SetShaderText(const char *text); virtual ~SCA_2DFilterActuator(); diff --git a/source/gameengine/GameLogic/SConscript b/source/gameengine/GameLogic/SConscript index 3840754ed06..57325d99d04 100644 --- a/source/gameengine/GameLogic/SConscript +++ b/source/gameengine/GameLogic/SConscript @@ -6,6 +6,7 @@ sources = env.Glob('*.cpp') + env.Glob('Joystick/*.cpp') incs = '. #/source/kernel/gen_system #/intern/string' incs += ' #/source/gameengine/Expressions #/intern/moto/include' incs += ' #/source/gameengine/Rasterizer #/source/gameengine/SceneGraph' +incs += ' #/source/gameengine/Ketsji' defs = [] diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp index bf474e4e42f..e02b5fedaf0 100644 --- a/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp +++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp @@ -433,13 +433,3 @@ void GPC_RenderTools::MotionBlur(RAS_IRasterizer* rasterizer) } } -void GPC_RenderTools::Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text) -{ - m_filtermanager.EnableFilter(propNames, gameObj, filtermode, pass, text); -} - -void GPC_RenderTools::Render2DFilters(RAS_ICanvas* canvas) -{ - m_filtermanager.RenderFilters(canvas); -} - diff --git a/source/gameengine/GamePlayer/common/GPC_RenderTools.h b/source/gameengine/GamePlayer/common/GPC_RenderTools.h index 1f58c5cb543..378c6d8580f 100644 --- a/source/gameengine/GamePlayer/common/GPC_RenderTools.h +++ b/source/gameengine/GamePlayer/common/GPC_RenderTools.h @@ -94,10 +94,6 @@ public: virtual void MotionBlur(RAS_IRasterizer* rasterizer); - virtual void Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text); - - virtual void Render2DFilters(RAS_ICanvas* canvas); - virtual void SetClientObject(RAS_IRasterizer *rasty, void* obj); }; diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 18ae80c78c3..d1fecb76998 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -334,6 +334,11 @@ void KX_KetsjiEngine::RenderDome() it++; } + // Part of PostRenderScene() + m_rendertools->MotionBlur(m_rasterizer); + scene->Render2DFilters(m_canvas); + // no RunDrawingCallBacks + // no FlushDebugLines } m_dome->BindImages(i); } @@ -362,11 +367,7 @@ void KX_KetsjiEngine::RenderDome() 1.0 ); } - m_dome->Draw(); - - // run the 2dfilters and motion blur once for all the scenes - PostRenderFrame(); EndFrame(); } @@ -859,6 +860,7 @@ void KX_KetsjiEngine::Render() it++; } + PostRenderScene(scene); } // only one place that checks for stereo @@ -908,6 +910,7 @@ void KX_KetsjiEngine::Render() it++; } + PostRenderScene(scene); } } // if(m_rasterizer->Stereo()) @@ -1313,20 +1316,16 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam) if (scene->GetPhysicsEnvironment()) scene->GetPhysicsEnvironment()->debugDrawWorld(); - - m_rasterizer->FlushDebugLines(); - - //it's running once for every scene (i.e. overlay scenes have it running twice). That's not the ideal. - PostRenderFrame(); - - // Run any post-drawing python callbacks - scene->RunDrawingCallbacks(scene->GetPostDrawCB()); } - -void KX_KetsjiEngine::PostRenderFrame() +/* +To run once per scene +*/ +void KX_KetsjiEngine::PostRenderScene(KX_Scene* scene) { - m_rendertools->Render2DFilters(m_canvas); m_rendertools->MotionBlur(m_rasterizer); + scene->Render2DFilters(m_canvas); + scene->RunDrawingCallbacks(scene->GetPostDrawCB()); + m_rasterizer->FlushDebugLines(); } void KX_KetsjiEngine::StopEngine() diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h index a6ca5fb6519..36db8685afb 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.h +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h @@ -185,7 +185,7 @@ private: float m_overrideFrameColorB; void RenderFrame(KX_Scene* scene, KX_Camera* cam); - void PostRenderFrame(); + void PostRenderScene(KX_Scene* scene); void RenderDebugProperties(); void RenderShadowBuffers(KX_Scene *scene); void SetBackGround(KX_WorldInfo* worldinfo); diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index 986476acd99..3547a6db545 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -1842,6 +1842,16 @@ bool KX_Scene::MergeScene(KX_Scene *other) return true; } +void KX_Scene::Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text) +{ + m_filtermanager.EnableFilter(propNames, gameObj, filtermode, pass, text); +} + +void KX_Scene::Render2DFilters(RAS_ICanvas* canvas) +{ + m_filtermanager.RenderFilters(canvas); +} + //---------------------------------------------------------------------------- //Python diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index 52062aa57f1..c3fc23f2979 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -46,6 +46,7 @@ #include "RAS_Rect.h" #include "PyObjectPlus.h" +#include "RAS_2DFilterManager.h" /** * @section Forward declarations @@ -273,6 +274,7 @@ protected: struct Scene* m_blenderScene; + RAS_2DFilterManager m_filtermanager; public: KX_Scene(class SCA_IInputDevice* keyboarddevice, class SCA_IInputDevice* mousedevice, @@ -535,6 +537,12 @@ public: */ void SetNodeTree(SG_Tree* root); + /** + * 2D Filters + */ + void Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text); + void Render2DFilters(RAS_ICanvas* canvas); + #ifndef DISABLE_PYTHON /* --------------------------------------------------------------------- */ /* Python interface ---------------------------------------------------- */ diff --git a/source/gameengine/Rasterizer/CMakeLists.txt b/source/gameengine/Rasterizer/CMakeLists.txt index 981fd2833b5..096b1583e3e 100644 --- a/source/gameengine/Rasterizer/CMakeLists.txt +++ b/source/gameengine/Rasterizer/CMakeLists.txt @@ -31,6 +31,7 @@ SET(INC ../../../source/kernel/gen_system ../../../source/blender/makesdna ../../../source/gameengine/SceneGraph + ../../../source/gameengine/Ketsji ../../../intern/string ../../../intern/moto/include ../../../extern/glew/include diff --git a/source/gameengine/Rasterizer/Makefile b/source/gameengine/Rasterizer/Makefile index d4cc6ab2652..a12d599b60b 100644 --- a/source/gameengine/Rasterizer/Makefile +++ b/source/gameengine/Rasterizer/Makefile @@ -45,6 +45,7 @@ CPPFLAGS += -I../../blender/makesdna CPPFLAGS += -I../SceneGraph CPPFLAGS += -I../BlenderRoutines CPPFLAGS += -I../Expressions +CPPFLAGS += -I../Ketsji CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION) diff --git a/source/gameengine/Rasterizer/RAS_2DFilterManager.h b/source/gameengine/Rasterizer/RAS_2DFilterManager.h index cd3dc359847..7ff7cde7882 100644 --- a/source/gameengine/Rasterizer/RAS_2DFilterManager.h +++ b/source/gameengine/Rasterizer/RAS_2DFilterManager.h @@ -28,6 +28,7 @@ #ifndef __RAS_I2DFILTER #define __RAS_I2DFILTER +#include "RAS_ICanvas.h" #define MAX_RENDER_PASS 100 #ifdef WITH_CXX_GUARDEDALLOC diff --git a/source/gameengine/Rasterizer/RAS_IRenderTools.h b/source/gameengine/Rasterizer/RAS_IRenderTools.h index 1d069351ff6..0d89cb41e3c 100644 --- a/source/gameengine/Rasterizer/RAS_IRenderTools.h +++ b/source/gameengine/Rasterizer/RAS_IRenderTools.h @@ -176,14 +176,6 @@ public: virtual void MotionBlur(RAS_IRasterizer* rasterizer)=0; - - virtual - void - Update2DFilter(vector<STR_String>& propNames, void* gameObj, RAS_2DFilterManager::RAS_2DFILTER_MODE filtermode, int pass, STR_String& text)=0; - - virtual - void - Render2DFilters(RAS_ICanvas* canvas)=0; #ifdef WITH_CXX_GUARDEDALLOC |