[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12169] trunk/blender/source/gameengine: GE Patch by Hamed Zaghaghi - Adding Motion Blur to the Game Engine.
Mal Duffin
mal at candomultimedia.com
Sat Sep 29 20:51:03 CEST 2007
Revision: 12169
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12169
Author: mal_cando
Date: 2007-09-29 20:51:01 +0200 (Sat, 29 Sep 2007)
Log Message:
-----------
GE Patch by Hamed Zaghaghi - Adding Motion Blur to the Game Engine.
I reviewed the code, suggested an update ( initialising accumulation buffer ), and tested the resulting update successfully.
It's great to see more GE developers!GE Patch by Hamed Zaghaghi to add motion blur to the GE ( using the accumulation buffer ).
I reviewed code and tested, gave some feedback ( initialising accumulation buffer ) which was implemented straight away, and re-reviewed.
It's great to have another GE coder on the team!
Modified Paths:
--------------
trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h
trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.cpp 2007-09-29 18:51:01 UTC (rev 12169)
@@ -452,4 +452,27 @@
return NULL;
}
+void KX_BlenderRenderTools::MotionBlur(RAS_IRasterizer* rasterizer)
+{
+ int state = rasterizer->GetMotionBlurState();
+ float motionblurvalue;
+ if(state)
+ {
+ motionblurvalue = rasterizer->GetMotionBlurValue();
+ if(state==1)
+ {
+ //bugfix:load color buffer into accum buffer for the first time(state=1)
+ glAccum(GL_LOAD, 1.0);
+ rasterizer->SetMotionBlurState(2);
+ }
+ else if(motionblurvalue>=0.0 && motionblurvalue<=1.0)
+ {
+ glAccum(GL_MULT, motionblurvalue);
+ glAccum(GL_ACCUM, 1-motionblurvalue);
+ glAccum(GL_RETURN, 1.0);
+ glFlush();
+ }
+ }
+}
+
unsigned int KX_BlenderRenderTools::m_numgllights;
Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderRenderTools.h 2007-09-29 18:51:01 UTC (rev 12169)
@@ -100,7 +100,10 @@
void* tface);
bool RayHit(KX_ClientObjectInfo* client, MT_Point3& hit_point, MT_Vector3& hit_normal, void * const data);
+
+ virtual void MotionBlur(RAS_IRasterizer* rasterizer);
};
#endif //__KX_BLENDERRENDERTOOLS
+
Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.cpp 2007-09-29 18:51:01 UTC (rev 12169)
@@ -570,4 +570,27 @@
}
}
+void GPC_RenderTools::MotionBlur(RAS_IRasterizer* rasterizer)
+{
+ int state = rasterizer->GetMotionBlurState();
+ float motionblurvalue;
+ if(state)
+ {
+ motionblurvalue = rasterizer->GetMotionBlurValue();
+ if(state==1)
+ {
+ //bugfix:load color buffer into accum buffer for the first time(state=1)
+ glAccum(GL_LOAD, 1.0);
+ rasterizer->SetMotionBlurState(2);
+ }
+ else if(motionblurvalue>=0.0 && motionblurvalue<=1.0)
+ {
+ glAccum(GL_MULT, motionblurvalue);
+ glAccum(GL_ACCUM, 1-motionblurvalue);
+ glAccum(GL_RETURN, 1.0);
+ glFlush();
+ }
+ }
+}
+
unsigned int GPC_RenderTools::m_numgllights;
Modified: trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h
===================================================================
--- trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/GamePlayer/common/GPC_RenderTools.h 2007-09-29 18:51:01 UTC (rev 12169)
@@ -149,6 +149,8 @@
int applyLights(int objectlayer);
bool RayHit(KX_ClientObjectInfo* client, MT_Point3& hit_point, MT_Vector3& hit_normal, void * const data);
+
+ virtual void MotionBlur(RAS_IRasterizer* rasterizer);
protected:
/**
* Copied from KX_BlenderGL.cpp in KX_blenderhook
@@ -173,3 +175,4 @@
#endif // __GPC_RENDERTOOLS_H
+
Modified: trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp 2007-09-29 18:51:01 UTC (rev 12169)
@@ -966,6 +966,9 @@
scene->CalculateVisibleMeshes(m_rasterizer,cam);
scene->RenderBuckets(camtrans, m_rasterizer, m_rendertools);
+
+ m_rendertools->MotionBlur(m_rasterizer);
+
}
@@ -1463,3 +1466,4 @@
b = m_overrideFrameColorB;
}
+
Modified: trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/Ketsji/KX_PythonInit.cpp 2007-09-29 18:51:01 UTC (rev 12169)
@@ -618,7 +618,31 @@
Py_Return;
}
+static PyObject* gPyEnableMotionBlur(PyObject*,
+ PyObject* args,
+ PyObject*)
+{
+ float motionblurvalue;
+ if (PyArg_ParseTuple(args,"f",&motionblurvalue))
+ {
+ if(gp_Rasterizer)
+ {
+ gp_Rasterizer->EnableMotionBlur(motionblurvalue);
+ }
+ }
+ Py_Return;
+}
+static PyObject* gPyDisableMotionBlur(PyObject*,
+ PyObject* args,
+ PyObject*)
+{
+ if(gp_Rasterizer)
+ {
+ gp_Rasterizer->DisableMotionBlur();
+ }
+ Py_Return;
+}
STR_String gPyGetWindowHeight__doc__="getWindowHeight doc";
STR_String gPyGetWindowWidth__doc__="getWindowWidth doc";
@@ -645,6 +669,9 @@
{"setMistColor",(PyCFunction)gPySetMistColor,METH_VARARGS,"set Mist Color (rgb)"},
{"setMistStart",(PyCFunction)gPySetMistStart,METH_VARARGS,"set Mist Start(rgb)"},
{"setMistEnd",(PyCFunction)gPySetMistEnd,METH_VARARGS,"set Mist End(rgb)"},
+ {"enableMotionBlur",(PyCFunction)gPyEnableMotionBlur,METH_VARARGS,"enable motion blur"},
+ {"disableMotionBlur",(PyCFunction)gPyDisableMotionBlur,METH_VARARGS,"disable motion blur"},
+
{"setEyeSeparation", (PyCFunction) gPySetEyeSeparation, METH_VARARGS, "set the eye separation for stereo mode"},
{"getEyeSeparation", (PyCFunction) gPyGetEyeSeparation, METH_VARARGS, "get the eye separation for stereo mode"},
Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h 2007-09-29 18:51:01 UTC (rev 12169)
@@ -48,7 +48,6 @@
*/
class RAS_IRasterizer
{
-
public:
RAS_IRasterizer(RAS_ICanvas* canv){};
@@ -398,7 +397,15 @@
virtual bool QueryLists(){return false;}
virtual bool QueryArrays(){return false;}
+
+ virtual void EnableMotionBlur(float motionblurvalue)=0;
+ virtual void DisableMotionBlur()=0;
+
+ virtual float GetMotionBlurValue()=0;
+ virtual int GetMotionBlurState()=0;
+ virtual void SetMotionBlurState(int newstate)=0;
};
#endif //__RAS_IRASTERIZER
+
Modified: trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_IRenderTools.h 2007-09-29 18:51:01 UTC (rev 12169)
@@ -174,6 +174,10 @@
struct RAS_LightObject* lightobject
);
+ virtual
+ void
+ MotionBlur(RAS_IRasterizer* rasterizer)=0;
+
virtual
class RAS_IPolyMaterial*
CreateBlenderPolyMaterial(
@@ -195,3 +199,4 @@
#endif //__RAS_IRENDERTOOLS
+
Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp 2007-09-29 18:51:01 UTC (rev 12169)
@@ -82,7 +82,9 @@
m_setfocallength(false),
m_noOfScanlines(32),
m_useTang(false),
- m_materialCachingInfo(0)
+ m_materialCachingInfo(0),
+ m_motionblur(0),
+ m_motionblurvalue(-1.0)
{
m_viewmatrix.Identity();
@@ -1979,3 +1981,15 @@
else
glDisable(mode);
}
+
+void RAS_OpenGLRasterizer::EnableMotionBlur(float motionblurvalue)
+{
+ m_motionblur = 1;
+ m_motionblurvalue = motionblurvalue;
+}
+
+void RAS_OpenGLRasterizer::DisableMotionBlur()
+{
+ m_motionblur = 0;
+ m_motionblurvalue = -1.0;
+}
Modified: trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2007-09-29 05:49:51 UTC (rev 12168)
+++ trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h 2007-09-29 18:51:01 UTC (rev 12169)
@@ -91,6 +91,10 @@
int m_noOfScanlines;
bool InterlacedStereo() const;
+ //motion blur
+ int m_motionblur;
+ float m_motionblurvalue;
+
protected:
int m_drawingmode;
TexCoGen m_texco[RAS_MAX];
@@ -293,8 +297,22 @@
const RAS_TexVert& v2,
const RAS_TexVert& v3,
const MT_Vector3 &no);
-
+
+ virtual void EnableMotionBlur(float motionblurvalue);
+ virtual void DisableMotionBlur();
+ virtual float GetMotionBlurValue(){return m_motionblurvalue;};
+ virtual int GetMotionBlurState(){return m_motionblur;};
+ virtual void SetMotionBlurState(int newstate)
+ {
+ if(newstate<0)
+ m_motionblur = 0;
+ else if(newstate>2)
+ m_motionblur = 2;
+ else
+ m_motionblur = newstate;
+ };
};
#endif //__RAS_OPENGLRASTERIZER
+
More information about the Bf-blender-cvs
mailing list