[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54615] trunk/blender/source/blender/ collada: fix #34284 Collada: update problem for vertex weights directly after import.

Gaia Clary gaia.clary at machinimatrix.org
Sun Feb 17 19:33:11 CET 2013


Revision: 54615
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54615
Author:   gaiaclary
Date:     2013-02-17 18:33:10 +0000 (Sun, 17 Feb 2013)
Log Message:
-----------
fix #34284 Collada: update problem for vertex weights directly after import.

Modified Paths:
--------------
    trunk/blender/source/blender/collada/ArmatureImporter.cpp
    trunk/blender/source/blender/collada/DocumentImporter.cpp

Modified: trunk/blender/source/blender/collada/ArmatureImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/ArmatureImporter.cpp	2013-02-17 18:13:22 UTC (rev 54614)
+++ trunk/blender/source/blender/collada/ArmatureImporter.cpp	2013-02-17 18:33:10 UTC (rev 54615)
@@ -415,10 +415,23 @@
 			break;
 	}
 
-	if (shared)
+	if (!shared && this->joint_parent_map.size() > 0) {
+		// All armatures have been created while creating the Node tree. 
+		// The Collada exporter currently does not create a 
+		// strict relationship between geometries and armatures
+		// So when we reimport a Blender collada file, then we have
+		// to guess what is meant.
+		// XXX This is not safe when we have more than one armatures
+		// in the import.
+		shared = this->joint_parent_map.begin()->second;
+	}
+
+	if (shared) {
 		ob_arm = skin.set_armature(shared);
-	else
+	}
+	else {
 		ob_arm = skin.create_armature(scene);  //once for every armature
+	}
 
 	// enter armature edit mode
 	ED_armature_to_edit(ob_arm);
@@ -659,38 +672,44 @@
 		//Prereq: all the geometries must be imported and mesh objects must be made
 		Object *source_ob = this->mesh_importer->get_object_by_geom_uid((*mc)->getSource());
 		
-		Mesh *source_me = (Mesh*) source_ob->data;
-		//insert key to source mesh
-		Key *key = source_me->key = BKE_key_add((ID *)source_me);
-		key->type = KEY_RELATIVE;
-		KeyBlock *kb;
-		
-		//insert basis key
-		kb = BKE_keyblock_add_ctime(key, "Basis", FALSE);
-		BKE_key_convert_from_mesh(source_me, kb);
+		if (source_ob) {
 
-		//insert other shape keys
-		for (int i = 0 ; i < morphTargetIds.getCount() ; i++ ) {
-			//better to have a seperate map of morph objects, 
-			//This'll do for now since only mesh morphing is imported
-
-			Mesh *me = this->mesh_importer->get_mesh_by_geom_uid(morphTargetIds[i]);
+			Mesh *source_me = (Mesh*) source_ob->data;
+			//insert key to source mesh
+			Key *key = source_me->key = BKE_key_add((ID *)source_me);
+			key->type = KEY_RELATIVE;
+			KeyBlock *kb;
 			
-			if (me) {
-				me->key = key;
-				std::string morph_name = *this->mesh_importer->get_geometry_name(me->id.name);
+			//insert basis key
+			kb = BKE_keyblock_add_ctime(key, "Basis", FALSE);
+			BKE_key_convert_from_mesh(source_me, kb);
 
-				kb = BKE_keyblock_add_ctime(key, morph_name.c_str(), FALSE);
-				BKE_key_convert_from_mesh(me, kb);
+			//insert other shape keys
+			for (int i = 0 ; i < morphTargetIds.getCount() ; i++ ) {
+				//better to have a seperate map of morph objects, 
+				//This'll do for now since only mesh morphing is imported
+
+				Mesh *me = this->mesh_importer->get_mesh_by_geom_uid(morphTargetIds[i]);
 				
-				//apply weights
-				weight =  morphWeights.getFloatValues()->getData()[i];
-				kb->curval = weight;
+				if (me) {
+					me->key = key;
+					std::string morph_name = *this->mesh_importer->get_geometry_name(me->id.name);
+
+					kb = BKE_keyblock_add_ctime(key, morph_name.c_str(), FALSE);
+					BKE_key_convert_from_mesh(me, kb);
+					
+					//apply weights
+					weight =  morphWeights.getFloatValues()->getData()[i];
+					kb->curval = weight;
+				}
+				else {
+					fprintf(stderr, "Morph target geometry not found.\n");
+				}
 			}
-			else {
-				fprintf(stderr, "Morph target geometry not found.\n");
-			}
 		}
+		else {
+			fprintf(stderr, "Morph target object not found.\n");
+		}
 	}
 }
 

Modified: trunk/blender/source/blender/collada/DocumentImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.cpp	2013-02-17 18:13:22 UTC (rev 54614)
+++ trunk/blender/source/blender/collada/DocumentImporter.cpp	2013-02-17 18:33:10 UTC (rev 54615)
@@ -180,14 +180,16 @@
 {
 	if (mImportStage != General)
 		return;
-		
+
+	Main *bmain = CTX_data_main(mContext);
+	// TODO: create a new scene except the selected <visual_scene> - use current blender scene for it
+	Scene *sce = CTX_data_scene(mContext);
+
 	/** TODO Break up and put into 2-pass parsing of DAE */
 	std::vector<const COLLADAFW::VisualScene *>::iterator it;
 	for (it = vscenes.begin(); it != vscenes.end(); it++) {
 		PointerRNA sceneptr, unit_settings;
 		PropertyRNA *system, *scale;
-		// TODO: create a new scene except the selected <visual_scene> - use current blender scene for it
-		Scene *sce = CTX_data_scene(mContext);
 		
 		// for scene unit settings: system, scale_length
 
@@ -228,7 +230,6 @@
 		}
 
 		// update scene
-		Main *bmain = CTX_data_main(mContext);
 		DAG_scene_sort(bmain, sce);
 		DAG_ids_flush_update(bmain, 0);
 		WM_event_add_notifier(mContext, NC_OBJECT | ND_TRANSFORM, NULL);
@@ -241,6 +242,8 @@
 	armature_importer.set_tags_map(this->uid_tags_map);
 	armature_importer.make_armatures(mContext);
 	armature_importer.make_shape_keys();
+	DAG_scene_sort(bmain, sce);
+	DAG_ids_flush_update(bmain, 0);
 
 #if 0
 	armature_importer.fix_animation();
@@ -273,8 +276,8 @@
 		}
 		libnode_ob.clear();
 
-		DAG_scene_sort(CTX_data_main(mContext), sce);
-		DAG_ids_flush_update(CTX_data_main(mContext), 0);
+		DAG_scene_sort(bmain, sce);
+		DAG_ids_flush_update(bmain, 0);
 	}
 }
 
@@ -541,13 +544,13 @@
 		if ( (geom_done + camera_done + lamp_done + controller_done + inst_done) < 1) {
 			//Check if Object is armature, by checking if immediate child is a JOINT node.
 			if (is_armature(node)) {
-				ob = bc_add_object(sce, OB_ARMATURE, NULL);
+				ob = bc_add_object(sce, OB_ARMATURE, name.c_str());
 			}
 			else {
 				ob = bc_add_object(sce, OB_EMPTY, NULL);
 			}
+			objects_done->push_back(ob);
 
-			objects_done->push_back(ob);
 		}
 		
 		// XXX: if there're multiple instances, only one is stored




More information about the Bf-blender-cvs mailing list