[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37664] trunk/blender/source/blender/ collada: Fix [#26912] [Collada] Screw up with names/ids on import

Nathan Letwory nathan at letworyinteractive.com
Mon Jun 20 14:43:10 CEST 2011


Revision: 37664
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37664
Author:   jesterking
Date:     2011-06-20 12:43:10 +0000 (Mon, 20 Jun 2011)
Log Message:
-----------
Fix [#26912] [Collada] Screw up with names/ids on import
Reported by Valeriy Firsov

Use the node name if it exists, fall back to id otherwise.

Modified Paths:
--------------
    trunk/blender/source/blender/collada/AnimationImporter.cpp
    trunk/blender/source/blender/collada/ArmatureImporter.cpp
    trunk/blender/source/blender/collada/DocumentImporter.cpp
    trunk/blender/source/blender/collada/MeshImporter.cpp
    trunk/blender/source/blender/collada/SkinInfo.cpp
    trunk/blender/source/blender/collada/collada_internal.cpp

Modified: trunk/blender/source/blender/collada/AnimationImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/AnimationImporter.cpp	2011-06-20 10:50:17 UTC (rev 37663)
+++ trunk/blender/source/blender/collada/AnimationImporter.cpp	2011-06-20 12:43:10 UTC (rev 37664)
@@ -53,12 +53,12 @@
 
 #include <algorithm>
 
-// use this for retrieving bone names, since these must be unique
+// first try node name, if not available (since is optional), fall back to original id
 template<class T>
 static const char *bc_get_joint_name(T *node)
 {
-	const std::string& id = node->getOriginalId();
-	return id.size() ? id.c_str() : node->getName().c_str();
+	const std::string& id = node->getName();
+	return id.size() ? id.c_str() : node->getOriginalId().c_str();
 }
 
 FCurve *AnimationImporter::create_fcurve(int array_index, const char *rna_path)
@@ -827,7 +827,8 @@
 
 		unit_m4(m);
 
-		if (!evaluate_animation(tm, m, fra, node->getOriginalId().c_str())) {
+		std::string nodename = node->getName().size() ? node->getName() : node->getOriginalId();
+		if (!evaluate_animation(tm, m, fra, nodename.c_str())) {
 			switch (type) {
 			case COLLADAFW::Transformation::ROTATE:
 				dae_rotate_to_mat4(tm, m);

Modified: trunk/blender/source/blender/collada/ArmatureImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/ArmatureImporter.cpp	2011-06-20 10:50:17 UTC (rev 37663)
+++ trunk/blender/source/blender/collada/ArmatureImporter.cpp	2011-06-20 12:43:10 UTC (rev 37664)
@@ -42,12 +42,12 @@
 
 #include "ArmatureImporter.h"
 
-// use this for retrieving bone names, since these must be unique
+// use node name, or fall back to original id if not present (name is optional)
 template<class T>
 static const char *bc_get_joint_name(T *node)
 {
-	const std::string& id = node->getOriginalId();
-	return id.size() ? id.c_str() : node->getName().c_str();
+	const std::string& id = node->getName();
+	return id.size() ? id.c_str() : node->getOriginalId().c_str();
 }
 
 ArmatureImporter::ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, AnimationImporterBase *anim, Scene *sce) :

Modified: trunk/blender/source/blender/collada/DocumentImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.cpp	2011-06-20 10:50:17 UTC (rev 37663)
+++ trunk/blender/source/blender/collada/DocumentImporter.cpp	2011-06-20 12:43:10 UTC (rev 37664)
@@ -441,7 +441,8 @@
 		// check if object is not NULL
 		if (!ob) return;
 		
-		rename_id(&ob->id, (char*)node->getOriginalId().c_str());
+		std::string nodename = node->getName().size() ? node->getName() : node->getOriginalId();
+		rename_id(&ob->id, (char*)nodename.c_str());
 
 		object_map[node->getUniqueId()] = ob;
 		node_map[node->getUniqueId()] = node;
@@ -523,7 +524,7 @@
 	if(mImportStage!=General)
 		return true;
 		
-	const std::string& str_mat_id = cmat->getOriginalId();
+	const std::string& str_mat_id = cmat->getName().size() ? cmat->getName() : cmat->getOriginalId();
 	Material *ma = add_material((char*)str_mat_id.c_str());
 	
 	this->uid_effect_map[cmat->getInstantiatedEffect()] = ma;

Modified: trunk/blender/source/blender/collada/MeshImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/MeshImporter.cpp	2011-06-20 10:50:17 UTC (rev 37663)
+++ trunk/blender/source/blender/collada/MeshImporter.cpp	2011-06-20 12:43:10 UTC (rev 37664)
@@ -62,7 +62,7 @@
 #include "MeshImporter.h"
 #include "collada_utils.h"
 
-// works for COLLADAFW::Node, COLLADAFW::Geometry
+// get node name, or fall back to original id if not present (name is optional)
 template<class T>
 static const char *bc_get_dae_name(T *node)
 {
@@ -835,7 +835,6 @@
 	if (*color_texture &&
 		strlen((*color_texture)->uvname) &&
 		strcmp(layername, (*color_texture)->uvname) != 0) {
-		
 		texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
 														   (*color_texture)->uvname);
 		strcpy(layername, (*color_texture)->uvname);
@@ -905,7 +904,7 @@
 	uid_object_map[*geom_uid] = ob;
 	
 	// name Object
-	const std::string& id = node->getOriginalId();
+	const std::string& id = node->getName().size() ? node->getName() : node->getOriginalId();
 	if (id.length())
 		rename_id(&ob->id, (char*)id.c_str());
 	
@@ -917,6 +916,7 @@
 	if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
 	
 	char layername[100];
+	layername[0] = '\0';
 	MTFace *texture_face = NULL;
 	MTex *color_texture = NULL;
 	
@@ -959,7 +959,7 @@
 		return true;
 	}
 	
-	const std::string& str_geom_id = mesh->getOriginalId();
+	const std::string& str_geom_id = mesh->getName().size() ? mesh->getName() : mesh->getOriginalId();
 	Mesh *me = add_mesh((char*)str_geom_id.c_str());
 
 	// store the Mesh pointer to link it later with an Object

Modified: trunk/blender/source/blender/collada/SkinInfo.cpp
===================================================================
--- trunk/blender/source/blender/collada/SkinInfo.cpp	2011-06-20 10:50:17 UTC (rev 37663)
+++ trunk/blender/source/blender/collada/SkinInfo.cpp	2011-06-20 12:43:10 UTC (rev 37664)
@@ -48,12 +48,12 @@
 #include "SkinInfo.h"
 #include "collada_utils.h"
 
-// use this for retrieving bone names, since these must be unique
+// use name, or fall back to original id if name not present (name is optional)
 template<class T>
 static const char *bc_get_joint_name(T *node)
 {
-	const std::string& id = node->getOriginalId();
-	return id.size() ? id.c_str() : node->getName().c_str();
+	const std::string& id = node->getName();
+	return id.size() ? id.c_str() : node->getOriginalId().c_str();
 }
 
 // This is used to store data passed in write_controller_data.

Modified: trunk/blender/source/blender/collada/collada_internal.cpp
===================================================================
--- trunk/blender/source/blender/collada/collada_internal.cpp	2011-06-20 10:50:17 UTC (rev 37663)
+++ trunk/blender/source/blender/collada/collada_internal.cpp	2011-06-20 12:43:10 UTC (rev 37664)
@@ -265,7 +265,7 @@
 
 std::string get_joint_id(Bone *bone, Object *ob_arm)
 {
-	return translate_id(id_name(ob_arm) + "_" + bone->name);
+	return translate_id(bone->name);
 }
 
 std::string get_camera_id(Object *ob)




More information about the Bf-blender-cvs mailing list