[Bf-committers] Patch to allow recording of static objects in game engine

James Yonan james at openvpn.net
Sat Apr 27 19:10:25 CEST 2013


I'd have to say that in addition to all of the wonderful things Blender 
can do, I've come to realize that it has great potential as a children's 
learning tool for math, geometry, physics, and computer science, not to 
mention 3D modeling.  My 10-year old son has really gotten into Blender, 
especially turning the physics engine loose on convoluted marble runs.

Unfortunately, he was disappointed to find that after putting a lot of 
effort into animating some static objects via actuators, that he could 
not record the motions of the objects in the same way that dynamic 
objects can easily be recorded.  The simulation played out fine in the 
game engine, but only the motions of dynamic objects were recorded.  So 
when he tried to render an animation using the recording, the motion of 
the static objects was lost.

I tried to find a solution on the web -- apparently this behavior 
existed by default in Blender 2.60 and earlier but mysteriously 
disappeared in recent releases, causing some consternation:

http://blenderartists.org/forum/showthread.php?246697-Recording-Motion-of-Static-Objects

Apparently the only known workaround for recent Blender releases to 
enable recording is to make all objects Dynamic (as discussed in thread 
above).  This seems wrong, because in some cases you might want an 
object to be static so that you can control its motion without 
interference from the physics engine.  In fact the game engine currently 
allows this, it just doesn't record the motion of the static objects, 
making it difficult to record such animation from the game engine for 
later high-quality renders.  This seems wrong as well, that the the game 
engine, when run, would produce a different set of object motions than 
would be recorded as keyframes when Game>Record Animation is checked.

Anyway, I've written up a simple patch to restore recording of static 
objects.  The attached patch (against trunk rev 56332) allows for easy 
recording of the motion of static objects via a checkbox on the Physics 
panel.  All static objects are given a new checkbox called "Record 
Animation" that appears under the "Actor" and "Ghost" checkboxes on the 
Physics panel.  This checkbox only appears for static objects.  When 
checked, the motion of the static object will be recorded, whenever 
game-engine recording is enabled via Game>Record Animation.

So with this patch, we were finally able to render my son's animation. 
Here's the finished result:

http://youtu.be/yltDGgW4jd0

Is this something that can be considered for inclusion in Blender?

Thanks,
James
-------------- next part --------------
Index: release/scripts/startup/bl_ui/properties_game.py
===================================================================
--- release/scripts/startup/bl_ui/properties_game.py	(revision 56332)
+++ release/scripts/startup/bl_ui/properties_game.py	(working copy)
@@ -156,6 +156,7 @@
             col = layout.column()
             col.prop(game, "use_actor")
             col.prop(game, "use_ghost")
+            col.prop(game, "record_static_animate")
             col.prop(ob, "hide_render", text="Invisible")
 
             layout.separator()
Index: source/gameengine/Converter/KX_BlenderSceneConverter.cpp
===================================================================
--- source/gameengine/Converter/KX_BlenderSceneConverter.cpp	(revision 56332)
+++ source/gameengine/Converter/KX_BlenderSceneConverter.cpp	(working copy)
@@ -700,7 +700,7 @@
 		for (g=0;g<numObjects;g++)
 		{
 			KX_GameObject* gameObj = (KX_GameObject*)parentList->GetValue(g);
-			if (gameObj->IsDynamic())
+			if (gameObj->RecordAnimation())
 			{
 				//KX_IPhysicsController* physCtrl = gameObj->GetPhysicsController();
 				
@@ -764,7 +764,7 @@
 			CListValue* parentList = scene->GetRootParentList();
 			for (int ix=0;ix<parentList->GetCount();ix++) {
 				KX_GameObject* gameobj = (KX_GameObject*)parentList->GetValue(ix);
-				if (!gameobj->IsDynamic()) {
+				if (!gameobj->RecordAnimation()) {
 					Object* blenderobject = gameobj->GetBlenderObject();
 					if (!blenderobject)
 						continue;
@@ -816,7 +816,7 @@
 		{
 			KX_GameObject* gameObj = (KX_GameObject*)parentList->GetValue(g);
 			Object* blenderObject = gameObj->GetBlenderObject();
-			if (blenderObject && blenderObject->parent==NULL && gameObj->IsDynamic())
+			if (blenderObject && blenderObject->parent==NULL && gameObj->RecordAnimation())
 			{
 				//KX_IPhysicsController* physCtrl = gameObj->GetPhysicsController();
 
@@ -935,7 +935,7 @@
 		for (g=0;g<numObjects;g++)
 		{
 			KX_GameObject* gameObj = (KX_GameObject*)parentList->GetValue(g);
-			if (gameObj->IsDynamic())
+			if (gameObj->RecordAnimation())
 			{
 				//KX_IPhysicsController* physCtrl = gameObj->GetPhysicsController();
 				
Index: source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- source/gameengine/Converter/BL_BlenderDataConversion.cpp	(revision 56332)
+++ source/gameengine/Converter/BL_BlenderDataConversion.cpp	(working copy)
@@ -1645,6 +1645,7 @@
 	objprop.m_softbody = (blenderobject->gameflag & OB_SOFT_BODY) != 0;
 	objprop.m_angular_rigidbody = (blenderobject->gameflag & OB_RIGID_BODY) != 0;
 	objprop.m_character = (blenderobject->gameflag & OB_CHARACTER) != 0;
+	objprop.m_static_animate = (blenderobject->gameflag & OB_STATIC_ANIMATE) != 0;
 	
 	///contact processing threshold is only for rigid bodies and static geometry, not 'dynamic'
 	if (objprop.m_angular_rigidbody || !objprop.m_dyna )
Index: source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp
===================================================================
--- source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp	(revision 56332)
+++ source/gameengine/Ketsji/KX_ConvertPhysicsObjects.cpp	(working copy)
@@ -493,6 +493,10 @@
 	gameobj->getClientInfo()->m_type = 
 		(isbulletsensor) ? ((isActor) ? KX_ClientObjectInfo::OBACTORSENSOR : KX_ClientObjectInfo::OBSENSOR) :
 		(isActor) ? KX_ClientObjectInfo::ACTOR : KX_ClientObjectInfo::STATIC;
+
+	// indicates that animation should be recorded for static object
+	gameobj->SetStaticAnimate(objprop->m_static_animate);
+
 	// store materialname in auxinfo, needed for touchsensors
 	if (meshobj)
 	{
Index: source/gameengine/Ketsji/KX_ConvertPhysicsObject.h
===================================================================
--- source/gameengine/Ketsji/KX_ConvertPhysicsObject.h	(revision 56332)
+++ source/gameengine/Ketsji/KX_ConvertPhysicsObject.h	(working copy)
@@ -71,6 +71,7 @@
 	bool	m_ghost;
 	class KX_GameObject*	m_dynamic_parent;
 	bool	m_isactor;
+	bool	m_static_animate;        
 	bool	m_sensor;
 	bool	m_character;
 	bool	m_concave;
Index: source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- source/gameengine/Ketsji/KX_GameObject.cpp	(revision 56332)
+++ source/gameengine/Ketsji/KX_GameObject.cpp	(working copy)
@@ -110,6 +110,7 @@
       m_pInstanceObjects(NULL),
       m_pDupliGroupObject(NULL),
       m_actionManager(NULL),
+      m_bStaticAnimate(false),
       m_isDeformable(false)
 #ifdef WITH_PYTHON
     , m_attr_dict(NULL)
Index: source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- source/gameengine/Ketsji/KX_GameObject.h	(revision 56332)
+++ source/gameengine/Ketsji/KX_GameObject.h	(working copy)
@@ -128,6 +128,7 @@
 
 	BL_ActionManager* GetActionManager();
 	
+	bool								m_bStaticAnimate;
 public:
 	bool								m_isDeformable;
 
@@ -461,6 +462,14 @@
 	);
 
 	/**
+	 * Indicate whether or not animation should be recorded for static object
+	 */
+	void SetStaticAnimate(bool static_animate)
+	{
+	  m_bStaticAnimate = static_animate;
+	}
+
+	/**
 	 * \return a pointer to the physics controller owned by this class.
 	 */
 
@@ -600,6 +609,14 @@
 	}
 
 	/**
+	 * Should we record animation for this object?
+	 */
+	bool	RecordAnimation() const 
+	{ 
+		return IsDynamic() || m_bStaticAnimate; 
+	}
+
+	/**
 	 * Check if this object has a vertex parent relationship
 	 */
 	bool IsVertexParent( )
Index: source/blender/makesdna/DNA_object_types.h
===================================================================
--- source/blender/makesdna/DNA_object_types.h	(revision 56332)
+++ source/blender/makesdna/DNA_object_types.h	(working copy)
@@ -516,6 +516,9 @@
 #define OB_HASOBSTACLE	0x200000
 #define OB_CHARACTER		0x400000
 
+/* Indicates that animation should be recorded for static object */
+#define OB_STATIC_ANIMATE 0x800000
+
 /* ob->gameflag2 */
 #define OB_NEVER_DO_ACTIVITY_CULLING	1
 #define OB_LOCK_RIGID_BODY_X_AXIS	4
Index: source/blender/makesrna/intern/rna_object.c
===================================================================
--- source/blender/makesrna/intern/rna_object.c	(revision 56332)
+++ source/blender/makesrna/intern/rna_object.c	(working copy)
@@ -1625,6 +1625,10 @@
 	RNA_def_property_ui_text(prop, "Physics Type", "Select the type of physical representation");
 	RNA_def_property_update(prop, NC_LOGIC, NULL);
 
+	prop = RNA_def_property(srna, "record_static_animate", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_STATIC_ANIMATE);
+	RNA_def_property_ui_text(prop, "Record Animation", "Record animation for static object");
+
 	prop = RNA_def_property(srna, "use_actor", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "gameflag", OB_ACTOR);
 	RNA_def_property_ui_text(prop, "Actor", "Object is detected by the Near and Radar sensor");


More information about the Bf-committers mailing list