Armature object animations export.
authorSukhitha Prabhath Jayathilake <pr.jayathilake@gmail.com>
Sun, 21 Aug 2011 15:47:21 +0000 (15:47 +0000)
committerSukhitha Prabhath Jayathilake <pr.jayathilake@gmail.com>
Sun, 21 Aug 2011 15:47:21 +0000 (15:47 +0000)
source/blender/collada/AnimationExporter.cpp
source/blender/collada/ArmatureExporter.cpp
source/blender/collada/ArmatureImporter.cpp
source/blender/collada/ArmatureImporter.h

index 014c13d8986bf5e9f41bb6c5ee17ea49de47899e..2f0749920762a4496f8a0e7cd63bae81d974b6e6 100644 (file)
@@ -63,6 +63,8 @@ void AnimationExporter::exportAnimations(Scene *sce)
                //Export transform animations
                if(ob->adt && ob->adt->action)      
                {
+                       fcu = (FCurve*)ob->adt->action->curves.first;
+
                        //transform matrix export for bones are temporarily disabled here.
                        if ( ob->type == OB_ARMATURE )
                        {
@@ -71,19 +73,20 @@ void AnimationExporter::exportAnimations(Scene *sce)
                                for (Bone *bone = (Bone*)arm->bonebase.first; bone; bone = bone->next)
                                        write_bone_animation_matrix(ob, bone);
                                
+                               transformName = fcu->rna_path;
                        }
-                       else {
-                       fcu = (FCurve*)ob->adt->action->curves.first;
+                       else 
+                               transformName = extract_transform_name( fcu->rna_path );
+                       
                        while (fcu) {
-                       transformName = extract_transform_name( fcu->rna_path );
-                               
+                               transformName = extract_transform_name( fcu->rna_path );
                                if ((!strcmp(transformName, "location") || !strcmp(transformName, "scale")) ||
                                        (!strcmp(transformName, "rotation_euler") && ob->rotmode == ROT_MODE_EUL)||
                                        (!strcmp(transformName, "rotation_quaternion"))) 
                                        dae_animation(ob ,fcu, transformName, false);
                                fcu = fcu->next;
                        }
-                       }
+               
                }
 
                //Export Lamp parameter animations
index bd7aea16b29f18035d1ed1fa182a3aacaf66c0d5..92d06bb639f83a0c3bf0834abe4d229cfc43f824 100644 (file)
@@ -167,7 +167,6 @@ std::string ArmatureExporter::get_joint_sid(Bone *bone, Object *ob_arm)
 // parent_mat is armature-space
 void ArmatureExporter::add_bone_node(Bone *bone, Object *ob_arm)
 {
-       /*if((bone->flag & BONE_NO_DEFORM) == 0 ){*/
        std::string node_id = get_joint_id(bone, ob_arm);
        std::string node_name = std::string(bone->name);
        std::string node_sid = get_joint_sid(bone, ob_arm);
@@ -189,8 +188,7 @@ void ArmatureExporter::add_bone_node(Bone *bone, Object *ob_arm)
        for (Bone *child = (Bone*)bone->childbase.first; child; child = child->next) {
                add_bone_node(child, ob_arm);
        }
-
-       node.end();
+    node.end();
        //}
 }
 
index 67828fb967d71d4a8e64c00cfa0498980fa64541..1e7879b352ff055a5dd32d104cfe3e753507d92d 100644 (file)
@@ -82,6 +82,10 @@ JointData *ArmatureImporter::get_joint_data(COLLADAFW::Node *node);
 void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *parent, int totchild,
                                 float parent_mat[][4], Object * ob_arm)
 {
+       std::vector<COLLADAFW::Node*>::iterator it;
+       it = std::find(finished_joints.begin(),finished_joints.end(),node);
+       if ( it != finished_joints.end()) return; 
+
        float mat[4][4];
     float obmat[4][4];
 
@@ -151,11 +155,18 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
                add_leaf_bone(mat, bone, node);
        }
 
+       finished_joints.push_back(node);
+
 }
 
 void ArmatureImporter::create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
                                 float parent_mat[][4], bArmature *arm)
 {
+       //Checking if bone is already made.
+       std::vector<COLLADAFW::Node*>::iterator it;
+       it = std::find(finished_joints.begin(),finished_joints.end(),node);
+       if ( it != finished_joints.end()) return; 
+
        float joint_inv_bind_mat[4][4];
 
        // JointData* jd = get_joint_data(node);
@@ -183,10 +194,10 @@ void ArmatureImporter::create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBo
                else
                        copy_m4_m4(mat, obmat);
 
-               /*float loc[3], size[3], rot[3][3] , angle;
+               float loc[3], size[3], rot[3][3] , angle;
                mat4_to_loc_rot_size( loc, rot, size, obmat);
                mat3_to_vec_roll(rot, NULL, &angle );
-               bone->roll=angle;*/
+               bone->roll=angle;
        }
 
        
@@ -257,6 +268,8 @@ void ArmatureImporter::create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBo
        if (!children.getCount() || children.getCount() > 1) {
                add_leaf_bone(mat, bone , node);
        }
+
+       finished_joints.push_back(node);
 }
 
 void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone,  COLLADAFW::Node * node)
@@ -659,7 +672,7 @@ void ArmatureImporter::make_armatures(bContext *C)
        }
        
        //for bones without skins
-       //create_armature_bones();
+       create_armature_bones();
 }
 
 #if 0
index 92d070ef575353d5ea397c28a36d55749a77c189..4f4aed210f20576502b71c9c440a509d97bac81e 100644 (file)
@@ -89,6 +89,7 @@ private:
        std::map<COLLADAFW::UniqueId, COLLADAFW::UniqueId> geom_uid_by_controller_uid;
        std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> joint_by_uid; // contains all joints
        std::vector<COLLADAFW::Node*> root_joints;
+       std::vector<COLLADAFW::Node*> finished_joints;
        std::map<COLLADAFW::UniqueId, Object*> joint_parent_map;
        std::map<COLLADAFW::UniqueId, Object*> unskinned_armature_map;