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. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to