Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2010-03-03 09:38:47 +0300
committerDalai Felinto <dfelinto@gmail.com>2010-03-03 09:38:47 +0300
commit0cad3ae24cc9628be09da4d1b4fe475a0c1733f7 (patch)
tree4078f623e0d7e5edbf23814d638982e3c706ba47 /source/gameengine
parentc26486f207eab2a82d02932d8ff2b7c19a307b95 (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)
Diffstat (limited to 'source/gameengine')
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp10
-rw-r--r--source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h4
-rw-r--r--source/gameengine/Converter/KX_ConvertActuators.cpp2
-rw-r--r--source/gameengine/GameLogic/CMakeLists.txt1
-rw-r--r--source/gameengine/GameLogic/Makefile1
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.cpp6
-rw-r--r--source/gameengine/GameLogic/SCA_2DFilterActuator.h6
-rw-r--r--source/gameengine/GameLogic/SConscript1
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.cpp10
-rw-r--r--source/gameengine/GamePlayer/common/GPC_RenderTools.h4
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp29
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h2
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp10
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h8
-rw-r--r--source/gameengine/Rasterizer/CMakeLists.txt1
-rw-r--r--source/gameengine/Rasterizer/Makefile1
-rw-r--r--source/gameengine/Rasterizer/RAS_2DFilterManager.h1
-rw-r--r--source/gameengine/Rasterizer/RAS_IRenderTools.h8
18 files changed, 46 insertions, 59 deletions
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