From 6b99cd05aa5528a931e391c5d78278aeaa6dd861 Mon Sep 17 00:00:00 2001 From: Sukhitha Prabhath Jayathilake Date: Sun, 21 Aug 2011 15:47:21 +0000 Subject: Armature object animations export. --- source/blender/collada/AnimationExporter.cpp | 13 ++++++++----- source/blender/collada/ArmatureExporter.cpp | 4 +--- source/blender/collada/ArmatureImporter.cpp | 19 ++++++++++++++++--- source/blender/collada/ArmatureImporter.h | 1 + 4 files changed, 26 insertions(+), 11 deletions(-) (limited to 'source/blender') diff --git a/source/blender/collada/AnimationExporter.cpp b/source/blender/collada/AnimationExporter.cpp index 014c13d8986..2f074992076 100644 --- a/source/blender/collada/AnimationExporter.cpp +++ b/source/blender/collada/AnimationExporter.cpp @@ -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 diff --git a/source/blender/collada/ArmatureExporter.cpp b/source/blender/collada/ArmatureExporter.cpp index bd7aea16b29..92d06bb639f 100644 --- a/source/blender/collada/ArmatureExporter.cpp +++ b/source/blender/collada/ArmatureExporter.cpp @@ -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(); //} } diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index 67828fb967d..1e7879b352f 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -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::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::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 diff --git a/source/blender/collada/ArmatureImporter.h b/source/blender/collada/ArmatureImporter.h index 92d070ef575..4f4aed210f2 100644 --- a/source/blender/collada/ArmatureImporter.h +++ b/source/blender/collada/ArmatureImporter.h @@ -89,6 +89,7 @@ private: std::map geom_uid_by_controller_uid; std::map joint_by_uid; // contains all joints std::vector root_joints; + std::vector finished_joints; std::map joint_parent_map; std::map unskinned_armature_map; -- cgit v1.2.3