[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28973] trunk/blender/source: BGE Fix for: [#22142] Armature deformation does not work in Game Engine.

Dalai Felinto dfelinto at gmail.com
Tue May 25 10:42:12 CEST 2010


Revision: 28973
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28973
Author:   dfelinto
Date:     2010-05-25 10:42:11 +0200 (Tue, 25 May 2010)

Log Message:
-----------
BGE Fix for: [#22142] Armature deformation does not work in Game Engine. + parent type to modifiers doversion(). Patch by Xavier Thomas (xat)

This fix the problem of not being able to play animations created with Blender 2.5 in BGE. Patch reviewed by Benoit

Added also other parent to modifier conversions as requested by Joshua (aligorith). I didn't bump subversion here, but the patch should work still. If not I'm increasing subversion sooner anyways (tomorrow or by the middle of the week I hope).

I was waiting to commit this one together with the Logic Editor datablock patch (converting material_name DNA properties to struct Material *). However my patch is getting too big and it's better if it's alone (easier to analyze later, eventual fixes, ...)

Mitchell, this commit adds a function that can help hardware skinning - HasArmatureDeformer()

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Converter/BL_ModifierDeformer.cpp
    trunk/blender/source/gameengine/Converter/BL_ModifierDeformer.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2010-05-25 06:53:18 UTC (rev 28972)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2010-05-25 08:42:11 UTC (rev 28973)
@@ -10848,8 +10848,10 @@
 		}
 	}
 	
+
 	/* put 2.50 compatibility code here until next subversion bump */
 	{
+		Object *ob;
 		bScreen *sc;
 
 		for (sc= main->screen.first; sc; sc= sc->id.next) {
@@ -10871,6 +10873,38 @@
 		}
 
 		do_version_mdef_250(fd, lib, main);
+
+		/* parent type to modifier */
+		for(ob = main->object.first; ob; ob = ob->id.next) {
+			if(ob->parent) {
+				Object *parent= newlibadr(fd, lib, ob->parent);
+				if(parent->type==OB_ARMATURE && ob->partype==PARSKEL) {
+					ArmatureModifierData *amd;
+
+					amd = (ArmatureModifierData*) modifier_new(eModifierType_Armature);
+					amd->object = ob->parent;
+					BLI_addtail((ListBase*)&ob->modifiers, amd);
+					amd->deformflag= ((bArmature *)(parent->data))->deformflag;
+					ob->partype = PAROBJECT;
+				}
+				else if(parent->type==OB_LATTICE && ob->partype==PARSKEL) {
+					LatticeModifierData *lmd;
+
+					lmd = (LatticeModifierData*) modifier_new(eModifierType_Lattice);
+					lmd->object = ob->parent;
+					BLI_addtail((ListBase*)&ob->modifiers, lmd);
+					ob->partype = PAROBJECT;
+				}
+				else if(parent->type==OB_CURVE && ob->partype==PARCURVE) {
+					CurveModifierData *cmd;
+
+					cmd = (CurveModifierData*) modifier_new(eModifierType_Curve);
+					cmd->object = ob->parent;
+					BLI_addtail((ListBase*)&ob->modifiers, cmd);
+					ob->partype = PAROBJECT;
+				}
+			}
+		}
 	}
 
 	/* WATCH IT!!!: pointers from libdata have not been converted yet here! */

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2010-05-25 06:53:18 UTC (rev 28972)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2010-05-25 08:42:11 UTC (rev 28973)
@@ -1729,7 +1729,7 @@
 		// only support relative shape key
 		bool bHasShapeKey = mesh->key != NULL && mesh->key->type==KEY_RELATIVE;
 		bool bHasDvert = mesh->dvert != NULL && ob->defbase.first;
-		bool bHasArmature = (ob->parent && ob->parent->type == OB_ARMATURE && ob->partype==PARSKEL && bHasDvert);
+		bool bHasArmature = (BL_ModifierDeformer::HasArmatureDeformer(ob) && ob->parent && ob->parent->type == OB_ARMATURE && bHasDvert);
 		bool bHasModifier = BL_ModifierDeformer::HasCompatibleDeformer(ob);
 		bool bHasSoftBody = (!ob->parent && (ob->gameflag & OB_SOFT_BODY));
 
@@ -2357,8 +2357,8 @@
 	
 			if (me->dvert){
 				BL_DeformableGameObject *obj = (BL_DeformableGameObject*)converter->FindGameObject(blenderobj);
-	
-				if (obj && blenderobj->parent && blenderobj->parent->type==OB_ARMATURE && blenderobj->partype==PARSKEL){
+
+				if (obj && BL_ModifierDeformer::HasArmatureDeformer(blenderobj) && blenderobj->parent && blenderobj->parent->type==OB_ARMATURE){
 					KX_GameObject *par = converter->FindGameObject(blenderobj->parent);
 					if (par && obj->GetDeformer())
 						((BL_SkinDeformer*)obj->GetDeformer())->SetArmature((BL_ArmatureObject*) par);

Modified: trunk/blender/source/gameengine/Converter/BL_ModifierDeformer.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ModifierDeformer.cpp	2010-05-25 06:53:18 UTC (rev 28972)
+++ trunk/blender/source/gameengine/Converter/BL_ModifierDeformer.cpp	2010-05-25 08:42:11 UTC (rev 28973)
@@ -114,11 +114,27 @@
 			continue;
 		if (!(md->mode & eModifierMode_Realtime))
 			continue;
+		/* armature modifier are handled by SkinDeformer, not ModifierDeformer */
+		if (md->type == eModifierType_Armature )
+			continue;
 		return true;
 	}
 	return false;
 }
 
+bool BL_ModifierDeformer::HasArmatureDeformer(Object *ob)
+{
+	if (!ob->modifiers.first)
+		return false;
+
+	ModifierData* md;
+	for (md = (ModifierData*)ob->modifiers.first; md; md = (ModifierData*)md->next) {
+		if (md->type == eModifierType_Armature )
+			return true;
+	}
+	return false;
+}
+
 bool BL_ModifierDeformer::Update(void)
 {
 	bool bShapeUpdate = BL_ShapeDeformer::Update();

Modified: trunk/blender/source/gameengine/Converter/BL_ModifierDeformer.h
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_ModifierDeformer.h	2010-05-25 06:53:18 UTC (rev 28972)
+++ trunk/blender/source/gameengine/Converter/BL_ModifierDeformer.h	2010-05-25 08:42:11 UTC (rev 28973)
@@ -45,6 +45,7 @@
 {
 public:
 	static bool HasCompatibleDeformer(Object *ob);
+	static bool HasArmatureDeformer(Object *ob);
 
 
 	BL_ModifierDeformer(BL_DeformableGameObject *gameobj,

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2010-05-25 06:53:18 UTC (rev 28972)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2010-05-25 08:42:11 UTC (rev 28973)
@@ -1067,12 +1067,12 @@
 			bool bHasShapeKey = blendmesh->key != NULL && blendmesh->key->type==KEY_RELATIVE;
 			bool bHasDvert = blendmesh->dvert != NULL;
 			bool bHasArmature = 
+				BL_ModifierDeformer::HasArmatureDeformer(blendobj) &&
 				parentobj &&								// current parent is armature
 				parentobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE &&
 				oldblendobj &&								// needed for mesh deform
 				blendobj->parent &&							// original object had armature (not sure this test is needed)
-				blendobj->parent->type == OB_ARMATURE && 
-				blendobj->partype==PARSKEL && 
+				blendobj->parent->type == OB_ARMATURE &&
 				blendmesh->dvert!=NULL;						// mesh has vertex group
 			bool bHasSoftBody = (!parentobj && (blendobj->gameflag & OB_SOFT_BODY));
 





More information about the Bf-blender-cvs mailing list