[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39985] trunk/blender/source/blender/ collada: Split off scene export code.

Nathan Letwory nathan at letworyinteractive.com
Wed Sep 7 00:18:12 CEST 2011


Revision: 39985
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39985
Author:   jesterking
Date:     2011-09-06 22:18:12 +0000 (Tue, 06 Sep 2011)
Log Message:
-----------
Split off scene export code.

Modified Paths:
--------------
    trunk/blender/source/blender/collada/CMakeLists.txt
    trunk/blender/source/blender/collada/DocumentExporter.cpp

Added Paths:
-----------
    trunk/blender/source/blender/collada/SceneExporter.cpp
    trunk/blender/source/blender/collada/SceneExporter.h

Modified: trunk/blender/source/blender/collada/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/collada/CMakeLists.txt	2011-09-06 21:02:26 UTC (rev 39984)
+++ trunk/blender/source/blender/collada/CMakeLists.txt	2011-09-06 22:18:12 UTC (rev 39985)
@@ -61,6 +61,7 @@
 	MaterialExporter.cpp
 	MeshImporter.cpp
 	SkinInfo.cpp
+	SceneExporter.cpp
 	TransformReader.cpp
 	TransformWriter.cpp
 	collada.cpp
@@ -85,6 +86,7 @@
 	MaterialExporter.h
 	MeshImporter.h
 	SkinInfo.h
+	SceneExporter.h
 	TransformReader.h
 	TransformWriter.h
 	collada.h

Modified: trunk/blender/source/blender/collada/DocumentExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentExporter.cpp	2011-09-06 21:02:26 UTC (rev 39984)
+++ trunk/blender/source/blender/collada/DocumentExporter.cpp	2011-09-06 22:18:12 UTC (rev 39985)
@@ -34,6 +34,7 @@
 {
 #include "DNA_scene_types.h"
 #include "DNA_object_types.h"
+#include "DNA_group_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_image_types.h"
@@ -104,6 +105,7 @@
 #include "COLLADASWConstants.h"
 #include "COLLADASWLibraryControllers.h"
 #include "COLLADASWInstanceController.h"
+#include "COLLADASWInstanceNode.h"
 #include "COLLADASWBaseInputElement.h"
 
 #include "collada_internal.h"
@@ -113,6 +115,7 @@
 #include "InstanceWriter.h"
 #include "TransformWriter.h"
 
+#include "SceneExporter.h"
 #include "ArmatureExporter.h"
 #include "AnimationExporter.h"
 #include "CameraExporter.h"
@@ -142,165 +145,6 @@
 	return data->layers[layer_index].name;
 }
 
-
-/*
-  Utilities to avoid code duplication.
-  Definition can take some time to understand, but they should be useful.
-*/
-
-
-template<class Functor>
-void forEachObjectInScene(Scene *sce, Functor &f)
-{
-	Base *base= (Base*) sce->base.first;
-	while(base) {
-		Object *ob = base->object;
-			
-		f(ob);
-
-		base= base->next;
-	}
-}
-
-
-
-class SceneExporter: COLLADASW::LibraryVisualScenes, protected TransformWriter, protected InstanceWriter
-{
-	ArmatureExporter *arm_exporter;
-public:
-	SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm) : COLLADASW::LibraryVisualScenes(sw),
-																		arm_exporter(arm) {}
-	
-	void exportScene(Scene *sce, bool export_selected) {
- 		// <library_visual_scenes> <visual_scene>
-		std::string id_naming = id_name(sce);
-		openVisualScene(translate_id(id_naming), id_naming);
-
-		// write <node>s
-		//forEachMeshObjectInScene(sce, *this);
-		//forEachCameraObjectInScene(sce, *this);
-		//forEachLampObjectInScene(sce, *this);
-		exportHierarchy(sce, export_selected);
-
-		// </visual_scene> </library_visual_scenes>
-		closeVisualScene();
-
-		closeLibrary();
-	}
-
-	void exportHierarchy(Scene *sce, bool export_selected)
-	{
-		Base *base= (Base*) sce->base.first;
-		while(base) {
-			Object *ob = base->object;
-
-			if (!ob->parent) {
-				if(sce->lay & ob->lay) {
-				switch(ob->type) {
-				case OB_MESH:
-				case OB_CAMERA:
-				case OB_LAMP:
-				case OB_ARMATURE:
-				case OB_EMPTY:
-					if (export_selected && !(ob->flag & SELECT)) {
-						break;
-					}
-					// write nodes....
-					writeNodes(ob, sce);
-					break;
-				}
-				}
-			}
-
-			base= base->next;
-		}
-	}
-
-
-	// called for each object
-	//void operator()(Object *ob) {
-	void writeNodes(Object *ob, Scene *sce)
-	{
-		COLLADASW::Node node(mSW);
-		node.setNodeId(translate_id(id_name(ob)));
-		node.setType(COLLADASW::Node::NODE);
-
-		node.start();
-
-		bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob);
-
-		if (ob->type == OB_MESH && is_skinned_mesh)
-			// for skinned mesh we write obmat in <bind_shape_matrix>
-			TransformWriter::add_node_transform_identity(node);
-		else
-			TransformWriter::add_node_transform_ob(node, ob);
-		
-		// <instance_geometry>
-		if (ob->type == OB_MESH) {
-			if (is_skinned_mesh) {
-				arm_exporter->add_instance_controller(ob);
-			}
-			else {
-				COLLADASW::InstanceGeometry instGeom(mSW);
-				instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
-
-				InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), ob);
-			
-				instGeom.add();
-			}
-		}
-
-		// <instance_controller>
-		else if (ob->type == OB_ARMATURE) {
-			arm_exporter->add_armature_bones(ob, sce);
-
-			// XXX this looks unstable...
-			node.end();
-		}
-		
-		// <instance_camera>
-		else if (ob->type == OB_CAMERA) {
-			COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob)));
-			instCam.add();
-		}
-		
-		// <instance_light>
-		else if (ob->type == OB_LAMP) {
-			COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob)));
-			instLa.add();
-		}
-
-		// empty object
-		else if (ob->type == OB_EMPTY) {
-		}
-
-		// write nodes for child objects
-		Base *b = (Base*) sce->base.first;
-		while(b) {
-			// cob - child object
-			Object *cob = b->object;
-
-			if (cob->parent == ob) {
-				switch(cob->type) {
-				case OB_MESH:
-				case OB_CAMERA:
-				case OB_LAMP:
-				case OB_EMPTY:
-				case OB_ARMATURE:
-					// write node...
-					writeNodes(cob, sce);
-					break;
-				}
-			}
-
-			b = b->next;
-		}
-
-		if (ob->type != OB_ARMATURE)
-			node.end();
-	}
-};
-
 // TODO: it would be better to instantiate animations rather than create a new one per object
 // COLLADA allows this through multiple <channel>s in <animation>.
 // For this to work, we need to know objects that use a certain action.

Added: trunk/blender/source/blender/collada/SceneExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/SceneExporter.cpp	                        (rev 0)
+++ trunk/blender/source/blender/collada/SceneExporter.cpp	2011-09-06 22:18:12 UTC (rev 39985)
@@ -0,0 +1,161 @@
+/*
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Chingiz Dyussenov, Arystanbek Dyussenov, Jan Diederich, Tod Liverseed.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/collada/SceneExporter.cpp
+ *  \ingroup collada
+ */
+
+#include "SceneExporter.h"
+
+SceneExporter::SceneExporter(COLLADASW::StreamWriter *sw, ArmatureExporter *arm)
+	: COLLADASW::LibraryVisualScenes(sw), arm_exporter(arm)
+{}
+	
+void SceneExporter::exportScene(Scene *sce, bool export_selected)
+{
+	// <library_visual_scenes> <visual_scene>
+	std::string id_naming = id_name(sce);
+	openVisualScene(translate_id(id_naming), id_naming);
+	exportHierarchy(sce, export_selected);
+	closeVisualScene();
+	closeLibrary();
+}
+
+void SceneExporter::exportHierarchy(Scene *sce, bool export_selected)
+{
+	Base *base= (Base*) sce->base.first;
+	while(base) {
+		Object *ob = base->object;
+
+		if (!ob->parent) {
+			if(sce->lay & ob->lay) {
+				switch(ob->type) {
+					case OB_MESH:
+					case OB_CAMERA:
+					case OB_LAMP:
+					case OB_ARMATURE:
+					case OB_EMPTY:
+						if (export_selected && !(ob->flag & SELECT)) {
+							break;
+						}
+						// write nodes....
+						writeNodes(ob, sce);
+						break;
+				}
+			}
+		}
+
+		base= base->next;
+	}
+}
+
+void SceneExporter::writeNodes(Object *ob, Scene *sce)
+{
+	COLLADASW::Node node(mSW);
+	node.setNodeId(translate_id(id_name(ob)));
+	node.setType(COLLADASW::Node::NODE);
+
+	node.start();
+
+	bool is_skinned_mesh = arm_exporter->is_skinned_mesh(ob);
+
+	if (ob->type == OB_MESH && is_skinned_mesh)
+		// for skinned mesh we write obmat in <bind_shape_matrix>
+		TransformWriter::add_node_transform_identity(node);
+	else
+		TransformWriter::add_node_transform_ob(node, ob);
+
+	// <instance_geometry>
+	if (ob->type == OB_MESH) {
+		if (is_skinned_mesh) {
+			arm_exporter->add_instance_controller(ob);
+		}
+		else {
+			COLLADASW::InstanceGeometry instGeom(mSW);
+			instGeom.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_geometry_id(ob)));
+
+			InstanceWriter::add_material_bindings(instGeom.getBindMaterial(), ob);
+
+			instGeom.add();
+		}
+	}
+
+	// <instance_controller>
+	else if (ob->type == OB_ARMATURE) {
+		arm_exporter->add_armature_bones(ob, sce);
+
+		// XXX this looks unstable...
+		node.end();
+	}
+
+	// <instance_camera>
+	else if (ob->type == OB_CAMERA) {
+		COLLADASW::InstanceCamera instCam(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_camera_id(ob)));
+		instCam.add();
+	}
+
+	// <instance_light>
+	else if (ob->type == OB_LAMP) {
+		COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, get_light_id(ob)));
+		instLa.add();
+	}
+
+	// empty object
+	else if (ob->type == OB_EMPTY) { // TODO: handle groups (OB_DUPLIGROUP
+		if((ob->transflag & OB_DUPLIGROUP) == OB_DUPLIGROUP && ob->dup_group) {
+			GroupObject *go = NULL;
+			Group *gr = ob->dup_group;
+			printf("group detected %u\n", gr);
+			for(go = (GroupObject*)(gr->gobject.first); go; go=go->next) {
+				printf("\t%s\n", go->ob->id.name);
+			}
+		}
+	}
+
+	// write nodes for child objects
+	Base *b = (Base*) sce->base.first;
+	while(b) {
+		// cob - child object
+		Object *cob = b->object;
+
+		if (cob->parent == ob) {
+			switch(cob->type) {
+				case OB_MESH:
+				case OB_CAMERA:
+				case OB_LAMP:
+				case OB_EMPTY:
+				case OB_ARMATURE:
+					// write node...
+					writeNodes(cob, sce);
+					break;
+			}
+		}
+
+		b = b->next;
+	}
+
+	if (ob->type != OB_ARMATURE)
+		node.end();
+}
+


Property changes on: trunk/blender/source/blender/collada/SceneExporter.cpp
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision
Added: svn:eol-style
   + native

Added: trunk/blender/source/blender/collada/SceneExporter.h
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list