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)
/* api callbacks */
ot->exec= region_flip_exec;
-
ot->poll= ED_operator_areaactive;
ot->flag= 0;
}
}
}
}
-
-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);
-}
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);
}
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)
{
../../../intern/string
../../../source/gameengine/Expressions
../../../source/gameengine/SceneGraph
+ ../../../source/gameengine/Ketsji
../../../intern/moto/include
../../../source/gameengine/Rasterizer
)
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
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){
}
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;
#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
{
int m_int_arg;
STR_String m_shaderText;
RAS_IRasterizer* m_rasterizer;
- RAS_IRenderTools* m_rendertools;
+ KX_Scene* m_scene;
public:
float float_arg,
int int_arg,
RAS_IRasterizer* rasterizer,
- RAS_IRenderTools* rendertools);
+ KX_Scene* scene);
void SetShaderText(const char *text);
virtual ~SCA_2DFilterActuator();
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 = []
}
}
-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);
-}
-
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);
};
it++;
}
+ // Part of PostRenderScene()
+ m_rendertools->MotionBlur(m_rasterizer);
+ scene->Render2DFilters(m_canvas);
+ // no RunDrawingCallBacks
+ // no FlushDebugLines
}
m_dome->BindImages(i);
}
1.0
);
}
-
m_dome->Draw();
-
- // run the 2dfilters and motion blur once for all the scenes
- PostRenderFrame();
EndFrame();
}
it++;
}
+ PostRenderScene(scene);
}
// only one place that checks for stereo
it++;
}
+ PostRenderScene(scene);
}
} // if(m_rasterizer->Stereo())
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()
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);
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
#include "RAS_Rect.h"
#include "PyObjectPlus.h"
+#include "RAS_2DFilterManager.h"
/**
* @section Forward declarations
struct Scene* m_blenderScene;
+ RAS_2DFilterManager m_filtermanager;
public:
KX_Scene(class SCA_IInputDevice* keyboarddevice,
class SCA_IInputDevice* mousedevice,
*/
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 ---------------------------------------------------- */
../../../source/kernel/gen_system
../../../source/blender/makesdna
../../../source/gameengine/SceneGraph
+ ../../../source/gameengine/Ketsji
../../../intern/string
../../../intern/moto/include
../../../extern/glew/include
CPPFLAGS += -I../SceneGraph
CPPFLAGS += -I../BlenderRoutines
CPPFLAGS += -I../Expressions
+CPPFLAGS += -I../Ketsji
CPPFLAGS += -I$(NAN_PYTHON)/include/python$(NAN_PYTHON_VERSION)
#ifndef __RAS_I2DFILTER
#define __RAS_I2DFILTER
+#include "RAS_ICanvas.h"
#define MAX_RENDER_PASS 100
#ifdef WITH_CXX_GUARDEDALLOC
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