[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44935] trunk/blender/source/blender/ collada: #collada instance_node import, partially fixes #27629

Arystanbek Dyussenov arystan.d at gmail.com
Sat Mar 17 07:37:43 CET 2012


Revision: 44935
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44935
Author:   kazanbas
Date:     2012-03-17 06:37:26 +0000 (Sat, 17 Mar 2012)
Log Message:
-----------
#collada instance_node import, partially fixes #27629

Patch applied in r37663 caused loss of <instance_node>s.

All parts of the smaller test file attached in the report now import.

Revision Links:
--------------
    http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37663

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

Modified: trunk/blender/source/blender/collada/DocumentImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.cpp	2012-03-17 04:43:32 UTC (rev 44934)
+++ trunk/blender/source/blender/collada/DocumentImporter.cpp	2012-03-17 06:37:26 UTC (rev 44935)
@@ -121,8 +121,10 @@
 	
 	loader.registerExtraDataCallbackHandler(ehandler);
 
-	if (!root.loadDocument(mFilename))
+	if (!root.loadDocument(mFilename)) {
+		fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 1st pass\n");
 		return false;
+	}
 	
 	if(errorHandler.hasError())
 		return false;
@@ -134,8 +136,10 @@
 	COLLADASaxFWL::Loader loader2;
 	COLLADAFW::Root root2(&loader2, this);
 	
-	if (!root2.loadDocument(mFilename))
+	if (!root2.loadDocument(mFilename)) {
+		fprintf(stderr, "COLLADAFW::Root::loadDocument() returned false on 2nd pass\n");
 		return false;
+	}
 	
 	
 	delete ehandler;
@@ -313,7 +317,7 @@
 	return ob;
 }
 
-Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, Object *par_ob, bool is_library_node)
+Object* DocumentImporter::create_instance_node(Object *source_ob, COLLADAFW::Node *source_node, COLLADAFW::Node *instance_node, Scene *sce, bool is_library_node)
 {
 	Object *obn = copy_object(source_ob);
 	obn->recalc |= OB_RECALC_OB|OB_RECALC_DATA|OB_RECALC_TIME;
@@ -357,10 +361,10 @@
 			Object *new_child = NULL;
 			if (inodes.getCount()) { // \todo loop through instance nodes
 				const COLLADAFW::UniqueId& id = inodes[0]->getInstanciatedObjectId();
-				new_child = create_instance_node(object_map[id], node_map[id], child_node, sce, NULL, is_library_node);
+				new_child = create_instance_node(object_map[id], node_map[id], child_node, sce, is_library_node);
 			}
 			else {
-				new_child = create_instance_node(object_map[child_id], child_node, NULL, sce, NULL, is_library_node);
+				new_child = create_instance_node(object_map[child_id], child_node, NULL, sce, is_library_node);
 			}
 			bc_set_parent(new_child, obn, mContext, true);
 
@@ -369,21 +373,14 @@
 		}
 	}
 
-	// when we have an instance_node, don't return the object, because otherwise
-	// its correct location gets overwritten in write_node(). Fixes bug #26012.
-	if(instance_node) {
-		if (par_ob && obn)
-			bc_set_parent(obn, par_ob, mContext);
-		return NULL;
-	}
-
-	else return obn;
+	return obn;
 }
 
 void DocumentImporter::write_node (COLLADAFW::Node *node, COLLADAFW::Node *parent_node, Scene *sce, Object *par, bool is_library_node)
 {
 	Object *ob = NULL;
 	bool is_joint = node->getType() == COLLADAFW::Node::JOINT;
+	bool read_transform = true;
 
 	if (is_joint) {
 		if ( par ) {
@@ -439,9 +436,11 @@
 				Object *source_ob = object_map[node_id];
 				COLLADAFW::Node *source_node = node_map[node_id];
 
-				ob = create_instance_node(source_ob, source_node, node, sce, par, is_library_node);
+				ob = create_instance_node(source_ob, source_node, node, sce, is_library_node);
 			}
 			++inst_done;
+
+			read_transform = false;
 		}
 		// if node is empty - create empty object
 		// XXX empty node may not mean it is empty object, not sure about this
@@ -449,7 +448,8 @@
 			ob = add_object(sce, OB_EMPTY);
 		}
 		
-		// check if object is not NULL
+		// XXX: if there're multiple instances, only one is stored
+
 		if (!ob) return;
 		
 		std::string nodename = node->getName().size() ? node->getName() : node->getOriginalId();
@@ -462,7 +462,8 @@
 			libnode_ob.push_back(ob);
 	}
 
-	anim_importer.read_node_transform(node, ob); // overwrites location set earlier
+	if (read_transform)
+		anim_importer.read_node_transform(node, ob); // overwrites location set earlier
 
 	if (!is_joint) {
 		// if par was given make this object child of the previous 

Modified: trunk/blender/source/blender/collada/DocumentImporter.h
===================================================================
--- trunk/blender/source/blender/collada/DocumentImporter.h	2012-03-17 04:43:32 UTC (rev 44934)
+++ trunk/blender/source/blender/collada/DocumentImporter.h	2012-03-17 06:37:26 UTC (rev 44935)
@@ -72,7 +72,7 @@
 	/** these should not be here */
 	Object* create_camera_object(COLLADAFW::InstanceCamera*, Scene*);
 	Object* create_lamp_object(COLLADAFW::InstanceLight*, Scene*);
-	Object* create_instance_node(Object*, COLLADAFW::Node*, COLLADAFW::Node*, Scene*, Object*, bool);
+	Object* create_instance_node(Object*, COLLADAFW::Node*, COLLADAFW::Node*, Scene*, bool);
 	void write_node(COLLADAFW::Node*, COLLADAFW::Node*, Scene*, Object*, bool);
 	MTex* create_texture(COLLADAFW::EffectCommon*, COLLADAFW::Texture&, Material*, int, TexIndexTextureArrayMap&);
 	void write_profile_COMMON(COLLADAFW::EffectCommon*, Material*);

Modified: trunk/blender/source/blender/collada/ErrorHandler.cpp
===================================================================
--- trunk/blender/source/blender/collada/ErrorHandler.cpp	2012-03-17 04:43:32 UTC (rev 44934)
+++ trunk/blender/source/blender/collada/ErrorHandler.cpp	2012-03-17 06:37:26 UTC (rev 44935)
@@ -83,5 +83,9 @@
 		COLLADASaxFWL::SaxFWLError* saxFWLError = (COLLADASaxFWL::SaxFWLError*) error;
 		std::cout << "Sax FWL Error: " << saxFWLError->getErrorMessage() << std::endl;
 	}
+	else {
+		std::cout << "opencollada error: " << error->getFullErrorMessage() << std::endl;
+	}
+
 	return false;
 }




More information about the Bf-blender-cvs mailing list