Fix T38847: Reject reuse of child bones as root bones. That doesn't make sense anyways.
authorgaiaclary <gaia.clary@machinimatrix.org>
Thu, 27 Feb 2014 14:23:18 +0000 (15:23 +0100)
committergaiaclary <gaia.clary@machinimatrix.org>
Thu, 27 Feb 2014 14:23:32 +0000 (15:23 +0100)
source/blender/collada/ArmatureImporter.cpp

index 6d4308be5b5e7208fc2c296d4708c671359fa9d8..c52ee656217b60659ecc575794a550b417ff214a 100644 (file)
@@ -337,18 +337,23 @@ void ArmatureImporter::create_armature_bones( )
                if (get_armature_for_joint(*ri) != NULL) continue;
                
                Object *ob_arm = joint_parent_map[(*ri)->getUniqueId()];
-
                if (!ob_arm)
                        continue;
 
-               ED_armature_to_edit((bArmature *)ob_arm->data);
+               bArmature * armature = (bArmature *)ob_arm->data;
+               if (!armature)
+                       continue;
+
+               char * bone_name = (char *)bc_get_joint_name(*ri);
+               Bone *bone = BKE_armature_find_bone_name(armature, bone_name);
+               if(bone) {
+                       fprintf(stderr, "Reuse of child bone [%s] as root bone in same Armature is not supported.\n", bone_name);
+                       continue;
+               }
 
-               /*
-                * TODO:
-                * check if bones have already been created for a given joint
-                */
+               ED_armature_to_edit(armature);
 
-               create_bone(NULL, *ri , NULL, (*ri)->getChildNodes().getCount(), NULL, (bArmature *)ob_arm->data);
+               create_bone(NULL, *ri , NULL, (*ri)->getChildNodes().getCount(), NULL, armature);
 
                //leaf bone tails are derived from the matrix, so no need of this.
                fix_leaf_bones();
@@ -356,12 +361,12 @@ void ArmatureImporter::create_armature_bones( )
                // exit armature edit mode
                unskinned_armature_map[(*ri)->getUniqueId()] = ob_arm;
 
-               ED_armature_from_edit((bArmature *)ob_arm->data);
+               ED_armature_from_edit(armature);
 
                //This serves no purpose, as pose is automatically reset later, in BKE_where_is_bone()
                //set_pose(ob_arm, *ri, NULL, NULL);
 
-               ED_armature_edit_free((bArmature *)ob_arm->data);
+               ED_armature_edit_free(armature);
                DAG_id_tag_update(&ob_arm->id, OB_RECALC_OB | OB_RECALC_DATA);
        }
 }