Revision: 28089
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28089
Author:   kazanbas
Date:     2010-04-08 13:40:29 +0200 (Thu, 08 Apr 2010)

Log Message:
-----------
COLLADA branch: fix importer's parenting problem.

Modified Paths:
--------------
    branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp

Modified: 
branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp  
2010-04-08 11:26:10 UTC (rev 28088)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp  
2010-04-08 11:40:29 UTC (rev 28089)
@@ -174,7 +174,6 @@
                return array.getDoubleValues()->getData()[index];
 }
 
-#if 0
 // copied from /editors/object/object_relations.c
 static int test_parent_loop(Object *par, Object *ob)
 {
@@ -187,7 +186,8 @@
 }
 
 // a shortened version of parent_set_exec()
-static int set_parent(Object *ob, Object *par, bContext *C)
+// if is_parent_space is true then ob->obmat will be multiplied by par->obmat 
before parenting
+static int set_parent(Object *ob, Object *par, bContext *C, bool 
is_parent_space=true)
 {
        if (!par || test_parent_loop(par, ob))
                return false;
@@ -198,32 +198,34 @@
        ob->parent = par;
        ob->partype = PAROBJECT;
 
-       ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
-       par->recalc |= OB_RECALC_OB;
-
        ob->parsubstr[0] = 0;
 
-       where_is_object(sce, par);
+       if (is_parent_space) {
+               // calc par->obmat
+               where_is_object(sce, par);
 
-       // // move child obmat into world space
-       // float mat[4][4];
-       // copy_m4_m4(mat, ob->obmat);
-       // mul_m4_m4m4(ob->obmat, mat, par->obmat);
+               // move child obmat into world space
+               float mat[4][4];
+               mul_m4_m4m4(mat, ob->obmat, par->obmat);
+               copy_m4_m4(ob->obmat, mat);
+       }
        
-       // apply child obmat (i.e. decompose into rot/loc/size)
-       ED_object_apply_obmat(ob);
+       // apply child obmat (i.e. decompose it into rot/loc/size)
+       object_apply_mat4(ob, ob->obmat);
 
        // compute parentinv
        what_does_parent(sce, ob, &workob);
        invert_m4_m4(ob->parentinv, workob.obmat);
 
+       ob->recalc |= OB_RECALC_OB | OB_RECALC_DATA;
+       par->recalc |= OB_RECALC_OB;
+
        DAG_scene_sort(sce);
        DAG_ids_flush_update(0);
        WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, NULL);
 
        return true;
 }
-#endif
 
 typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > 
TexIndexTextureArrayMap;
 
@@ -579,9 +581,9 @@
                        ModifierData *md = ED_object_modifier_add(NULL, scene, 
ob, NULL, eModifierType_Armature);
                        ((ArmatureModifierData *)md)->object = ob_arm;
 
-                       tm->decompose(bind_shape_matrix, ob->loc, ob->rot, 
NULL, ob->size);
-                       
-#if 0
+                       copy_m4_m4(ob->obmat, bind_shape_matrix);
+                       object_apply_mat4(ob, ob->obmat);
+#if 1
                        ::set_parent(ob, ob_arm, C);
 #else
                        Object workob;
@@ -1005,12 +1007,10 @@
                        else
                                fprintf(stderr, "Cannot find object to link 
armature with.\n");
 
-#if 0
                        // set armature parent if any
                        Object *par = skin.get_parent();
                        if (par)
-                               set_parent(skin.get_armature(), par, C);
-#endif
+                               set_parent(skin.get_armature(), par, C, false);
 
                        // free memory stolen from SkinControllerData
                        skin.free();
@@ -2297,8 +2297,10 @@
        {
                float mat[4][4];
                TransformReader::get_node_mat(mat, node, &uid_animated_map, ob);
-               if (ob)
-                       object_apply_mat4(ob, mat);
+               if (ob) {
+                       copy_m4_m4(ob->obmat, mat);
+                       object_apply_mat4(ob, ob->obmat);
+               }
        }
        
 #if 0
@@ -3199,8 +3201,9 @@
        void write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, 
Scene *sce, Object *par)
        {
                Object *ob = NULL;
+               bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
 
-               if (node->getType() == COLLADAFW::Node::JOINT) {
+               if (is_joint) {
                        armature_importer.add_joint(node, parent_node == NULL 
|| parent_node->getType() != COLLADAFW::Node::JOINT, par);
                }
                else {
@@ -3241,26 +3244,17 @@
                        // check if object is not NULL
                        if (!ob) return;
 
-                       object_map[node->getUniqueId()] = ob;
-                       
-                       // if par was given make this object child of the 
previous 
-                       if (par && ob) {
-#if 0
-                               set_parent(ob, par, mContext);
-#else
-                               ob->parent = par;
-
-                               // doing what 'set parent' operator does
-                               par->recalc |= OB_RECALC_OB;
-                               ob->parsubstr[0] = 0;
-                       
-                               DAG_scene_sort(sce);
-#endif
-                       }
+                       object_map[node->getUniqueId()] = ob;                   
                }
 
                anim_importer.read_node_transform(node, ob);
 
+               if (!is_joint) {
+                       // if par was given make this object child of the 
previous 
+                       if (par && ob)
+                               set_parent(ob, par, mContext);
+               }
+
                // if node has child nodes write them
                COLLADAFW::NodePointerArray &child_nodes = 
node->getChildNodes();
                for (unsigned int i = 0; i < child_nodes.getCount(); i++) {     


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

Reply via email to