[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