[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50234] branches/soc-2012-bratwurst/source /blender/assimp: - bf_assimp: strip root node if possible.

Alexander Gessler alexander.gessler at gmx.net
Mon Aug 27 03:33:05 CEST 2012


Revision: 50234
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50234
Author:   aramis_acg
Date:     2012-08-27 01:33:02 +0000 (Mon, 27 Aug 2012)
Log Message:
-----------
- bf_assimp: strip root node if possible.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h

Modified: branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp	2012-08-26 23:57:55 UTC (rev 50233)
+++ branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp	2012-08-27 01:33:02 UTC (rev 50234)
@@ -67,6 +67,7 @@
 , armature()
 , settings(settings)
 , log_pipe(!!settings.enableAssimpLog ? settings.reports : NULL)
+, root_collapsed()
 {
 }
 
@@ -178,6 +179,8 @@
 		return false;
 	}
 
+	collapse_root_node();
+
 	populate_node_name_map(scene->mRootNode);
 
 	// generate the subgraph of all mesh-carrier nodes
@@ -216,6 +219,76 @@
 }
 
 
+void SceneImporter::collapse_root_node()
+{
+	root_collapsed = false;
+	const aiNode* const nd = scene->mRootNode;
+
+	// look for reasons why we couldn't get rid of the root node
+	if(nd->mNumMeshes) {
+		return;
+	}
+
+	if(!nd->mNumChildren) {
+		return;
+	}
+
+	// lights assigned to root
+	for (unsigned int j = 0; j < scene->mNumLights; ++j) {
+		if (scene->mLights[j]->mName == nd->mName) {
+			return;
+		}
+	}
+
+	// cameras assigned to root
+	for (unsigned int j = 0; j < scene->mNumCameras; ++j) {
+		if (scene->mCameras[j]->mName == nd->mName) {
+			return;
+		}
+	}
+
+	// animations assigned to root
+	for (unsigned int i = 0; i < scene->mNumAnimations; ++i) {
+		const aiAnimation& anim = *scene->mAnimations[i];
+
+		for (unsigned int j = 0; j < anim.mNumChannels; ++j) {
+			if (anim.mChannels[j]->mNodeName == nd->mName) {
+				return;
+			}
+		}
+	}
+
+	// non-identity root transform and animated children
+	if (!nd->mTransformation.IsIdentity()) {
+		for (unsigned int k = 0; k < nd->mNumChildren; ++k) {
+			for (unsigned int i = 0; i < scene->mNumAnimations; ++i) {
+
+				const aiAnimation& anim = *scene->mAnimations[i];
+				for (unsigned int j = 0; j < anim.mNumChannels; ++j) {
+
+					if (anim.mChannels[j]->mNodeName == nd->mChildren[k]->mName) {
+						return;
+					}
+				}
+			}
+		}
+	}
+
+	// ok, drop the root node, apply its trafo to all children
+	for (unsigned int k = 0; k < nd->mNumChildren; ++k) {
+		nd->mChildren[k]->mTransformation = nd->mTransformation * nd->mChildren[k]->mTransformation;
+	}
+
+	// ignore const-correctness another time since this is not
+	// dangerous either, but it may prevent nasty conversion errors.
+	const_cast<aiNode*>(nd)->mTransformation = aiMatrix4x4();
+
+	root_collapsed = true;
+
+	verbose("collapse root node");
+}
+
+
 void SceneImporter::handle_scale()
 {
 	// XXX make this configurable
@@ -371,7 +444,7 @@
 }
 
 
-void SceneImporter::convert_node(const aiNode& in_node, Object* out_parent) 
+void SceneImporter::convert_node(const aiNode& in_node, Object* out_parent, bool is_root) 
 {
 	typedef std::vector<Object *> ObjectVector;
 	ObjectVector objects_done;
@@ -379,6 +452,8 @@
 	unsigned int meshes = 0, cameras = 0, lights = 0;
 	verbose(("convert node: " + std::string(in_node.mName.C_Str())).c_str());
 
+	const bool root_drop = is_root && root_collapsed;
+
 	// attach meshes
 	if (in_node.mNumMeshes) {
 
@@ -437,7 +512,8 @@
 	// are nodes that carry meshes in the subtree rooted at them. These must
 	// be preserved to avoid loosing the trafo info.
 
-	if (meshes + cameras + lights  == 0 &&  (!has_bones || has_mesh_descendants(in_node))) {
+	if (meshes + cameras + lights  == 0 &&  (!has_bones || has_mesh_descendants(in_node)) && !root_drop) {
+		
 		Object* const obj = util_add_object(out_scene, OB_EMPTY, in_node.mName.C_Str());
 		objects_done.push_back(obj);
 	}
@@ -474,30 +550,33 @@
 	}
 
 
-	if (objects_done.empty()) {
+	if (objects_done.empty() && !root_drop) {
 		return;
 	}
 
-	Object& anchor = *objects_done.back();
-	convert_node_transform(in_node, anchor); 
+	Object* anchor = NULL; 
 
-	objects_by_node[&in_node] = &anchor;
+	if(!is_root || !root_collapsed) {
 
-	// set parent (unless this is root)
-	if(out_parent) {
-		util_set_parent(&anchor, out_parent ,&C, true);
-	}
+		anchor = objects_done.back();
+		convert_node_transform(in_node, *anchor); 
 
-	for (ObjectVector::iterator it = objects_done.begin(), end = objects_done.end() - 1; it != end; ++it) {
-		Object& obj = **it;
+		objects_by_node[&in_node] = anchor;
+		if(out_parent) {
+			util_set_parent(anchor, out_parent ,&C, true);
+		}
 
-		set_identity_transform(obj);
-		util_set_parent(&obj,&anchor,&C,true);
+		for (ObjectVector::iterator it = objects_done.begin(), end = objects_done.end() - 1; it != end; ++it) {
+			Object& obj = **it;
+
+			set_identity_transform(obj);
+			util_set_parent(&obj,anchor,&C,true);
+		}
 	}
 
 	// recursively convert child nodes
 	for (unsigned int i = 0, c = in_node.mNumChildren; i < c; ++i) {
-		convert_node(*in_node.mChildren[i],&anchor);
+		convert_node(*in_node.mChildren[i],anchor, false);
 	}
 }
 

Modified: branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h	2012-08-26 23:57:55 UTC (rev 50233)
+++ branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h	2012-08-27 01:33:02 UTC (rev 50234)
@@ -75,6 +75,8 @@
 	const bassimp_import_settings settings;
 	LogPipe log_pipe;
 
+	bool root_collapsed;
+
 private:
 
 	void configure_importer();
@@ -85,7 +87,7 @@
 	void convert_armature();
 	void convert_skin();
 
-	void convert_node(const aiNode& in_node, Object* out_parent);
+	void convert_node(const aiNode& in_node, Object* out_parent, bool is_root = true);
 	void convert_node_transform(const aiNode& node_in, Object& out_obj) const;
 	void set_identity_transform(Object& out_obj) const;
 
@@ -97,6 +99,7 @@
 	void handle_coordinate_space();
 	void populate_mesh_node_graph(const aiNode* node);
 	void populate_node_name_map(const aiNode* node);
+	void collapse_root_node();
 
 public:
 




More information about the Bf-blender-cvs mailing list