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));
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to