Blender profile leaf bone tip import.
authorSukhitha Prabhath Jayathilake <pr.jayathilake@gmail.com>
Tue, 26 Jul 2011 18:28:07 +0000 (18:28 +0000)
committerSukhitha Prabhath Jayathilake <pr.jayathilake@gmail.com>
Tue, 26 Jul 2011 18:28:07 +0000 (18:28 +0000)
source/blender/collada/ArmatureImporter.cpp
source/blender/collada/ArmatureImporter.h
source/blender/collada/DocumentImporter.cpp
source/blender/collada/DocumentImporter.h

index 4e330738026302fdadd50bc827d644a3397280c6..9489ddd152514def9e1d88145e9c8000d9b65fae 100644 (file)
@@ -145,7 +145,7 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
 
                // treat zero-sized bone like a leaf bone
                if (length <= epsilon) {
-                       add_leaf_bone(parent_mat, parent);
+                       add_leaf_bone(parent_mat, parent, node);
                }
 
        }
@@ -157,7 +157,8 @@ void ArmatureImporter::create_unskinned_bone( COLLADAFW::Node *node, EditBone *p
 
        // in second case it's not a leaf bone, but we handle it the same way
        if (!children.getCount() || children.getCount() > 1) {
-               add_leaf_bone(mat, bone);
+
+               add_leaf_bone(mat, bone, node);
        }
 
 }
@@ -220,7 +221,7 @@ void ArmatureImporter::create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBo
 
                // treat zero-sized bone like a leaf bone
                if (length <= epsilon) {
-                       add_leaf_bone(parent_mat, parent);
+                       add_leaf_bone(parent_mat, parent, node);
                }
 
                /*
@@ -258,22 +259,35 @@ void ArmatureImporter::create_bone(SkinInfo& skin, COLLADAFW::Node *node, EditBo
 
        // in second case it's not a leaf bone, but we handle it the same way
        if (!children.getCount() || children.getCount() > 1) {
-               add_leaf_bone(mat, bone);
+               add_leaf_bone(mat, bone , node);
        }
 }
 
-void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone)
+void ArmatureImporter::add_leaf_bone(float mat[][4], EditBone *bone,  COLLADAFW::Node * node)
 {
        LeafBone leaf;
 
        leaf.bone = bone;
        copy_m4_m4(leaf.mat, mat);
        BLI_strncpy(leaf.name, bone->name, sizeof(leaf.name));
-
+    
+       TagsMap::iterator etit;
+       ExtraTags *et = 0;
+       etit = uid_tags_map.find(node->getUniqueId().toAscii());
+       if(etit !=  uid_tags_map.end())
+       et = etit->second;
+    
+       float x,y,z;
+       et->setData("tip_x",&x);
+       et->setData("tip_y",&y);
+       et->setData("tip_z",&z);
+       float vec[3] = {x,y,z};
+    copy_v3_v3(leaf.bone->tail, leaf.bone->head);
+       add_v3_v3v3(leaf.bone->tail, leaf.bone->head, vec);
        leaf_bones.push_back(leaf);
 }
 
-void ArmatureImporter::fix_leaf_bones()
+void ArmatureImporter::fix_leaf_bones( )
 {
        // just setting tail for leaf bones here
 
@@ -283,7 +297,7 @@ void ArmatureImporter::fix_leaf_bones()
 
                // pointing up
                float vec[3] = {0.0f, 0.0f, 1.0f};
-
+        
                mul_v3_fl(vec, leaf_bone_length);
 
                copy_v3_v3(leaf.bone->tail, leaf.bone->head);
@@ -407,7 +421,7 @@ void ArmatureImporter::create_armature_bones( )
      leaf_bone_length = FLT_MAX;
                create_unskinned_bone(*ri, NULL, (*ri)->getChildNodes().getCount(), NULL, ob_arm);
 
-               fix_leaf_bones();
+               //fix_leaf_bones();
 
        // exit armature edit mode
        
@@ -750,6 +764,11 @@ Object *ArmatureImporter::get_armature_for_joint(COLLADAFW::Node *node)
        return NULL;
 }
 
+void ArmatureImporter::set_tags_map(TagsMap & tagsMap)
+{
+    this->uid_tags_map = tagsMap;
+}
+
 void ArmatureImporter::get_rna_path_for_joint(COLLADAFW::Node *node, char *joint_path, size_t count)
 {
        BLI_snprintf(joint_path, count, "pose.bones[\"%s\"]", bc_get_joint_name(node));
@@ -771,3 +790,5 @@ bool ArmatureImporter::get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint)
        return found;
 }
 
+
+
index 2471e97007cc167dc961c35d88b4645bae705e01..92d070ef575353d5ea397c28a36d55749a77c189 100644 (file)
@@ -46,6 +46,7 @@ extern "C" {
 #include "MeshImporter.h"
 #include "SkinInfo.h"
 #include "TransformReader.h"
+#include "ExtraTags.h"
 
 #include <map>
 #include <vector>
@@ -109,7 +110,7 @@ private:
        void create_unskinned_bone(COLLADAFW::Node *node, EditBone *parent, int totchild,
                                 float parent_mat[][4], Object * ob_arm);
 
-       void add_leaf_bone(float mat[][4], EditBone *bone);
+       void add_leaf_bone(float mat[][4], EditBone *bone, COLLADAFW::Node * node);
 
        void fix_leaf_bones();
        
@@ -132,6 +133,9 @@ private:
        void create_armature_bones(SkinInfo& skin);
        void create_armature_bones( );
 
+       /** TagsMap typedef for uid_tags_map. */
+       typedef std::map<std::string, ExtraTags*> TagsMap;
+       TagsMap uid_tags_map;
 public:
 
        ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce);
@@ -166,7 +170,8 @@ public:
        
        // gives a world-space mat
        bool get_joint_bind_mat(float m[][4], COLLADAFW::Node *joint);
-
+    
+       void set_tags_map( TagsMap& tags_map);
        
 };
 
index c3090eebc9fad573d8b0f8984f303841f15ee409..27442420f90d737e8e8c38fbcdc9f3fcb9cd9de2 100644 (file)
@@ -190,7 +190,7 @@ void DocumentImporter::finish()
                        write_node(roots[i], NULL, sce, NULL, false);
                }
        }
-
+       armature_importer.set_tags_map(this->uid_tags_map);
        armature_importer.make_armatures(mContext);
 
 #if 0
index f6917c2e9bfe2e183ce823795b24ef073de1321f..a347eed3e5a3c8dd9e9a5e4c3b332df06fd7d52d 100644 (file)
@@ -47,7 +47,7 @@
 #include "AnimationImporter.h"
 #include "ArmatureImporter.h"
 #include "MeshImporter.h"
-#include "ExtraTags.h"
+
 
 
 struct Main;