[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32346] trunk/blender/source/blender/ collada: COLLADA: Split MaterialsExporter into separate files.

Nathan Letwory nathan at letworyinteractive.com
Wed Oct 6 15:21:08 CEST 2010


Revision: 32346
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32346
Author:   jesterking
Date:     2010-10-06 15:21:08 +0200 (Wed, 06 Oct 2010)

Log Message:
-----------
COLLADA: Split MaterialsExporter into separate files.

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

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

Modified: trunk/blender/source/blender/collada/DocumentExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentExporter.cpp	2010-10-06 12:04:56 UTC (rev 32345)
+++ trunk/blender/source/blender/collada/DocumentExporter.cpp	2010-10-06 13:21:08 UTC (rev 32346)
@@ -106,6 +106,7 @@
 #include "CameraExporter.h"
 #include "GeometryExporter.h"
 #include "LightExporter.h"
+#include "MaterialExporter.h"
 
 // can probably go after refactor is complete
 #include "InstanceWriter.h"
@@ -151,44 +152,8 @@
 	}
 }
 
-// used in forEachMaterialInScene
-template <class MaterialFunctor>
-class ForEachMaterialFunctor
-{
-	std::vector<std::string> mMat; // contains list of material names, to avoid duplicate calling of f
-	MaterialFunctor *f;
-public:
-	ForEachMaterialFunctor(MaterialFunctor *f) : f(f) { }
-	void operator ()(Object *ob)
-	{
-		int a;
-		for(a = 0; a < ob->totcol; a++) {
 
-			Material *ma = give_current_material(ob, a+1);
 
-			if (!ma) continue;
-
-			std::string translated_id = translate_id(id_name(ma));
-			if (find(mMat.begin(), mMat.end(), translated_id) == mMat.end()) {
-				(*this->f)(ma, ob);
-
-				mMat.push_back(translated_id);
-			}
-		}
-	}
-};
-
-// calls f for each unique material linked to each object in sce
-// f should have
-// void operator()(Material* ma)
-template<class Functor>
-void forEachMaterialInScene(Scene *sce, Functor &f)
-{
-	ForEachMaterialFunctor<Functor> matfunc(&f);
-	GeometryFunctor gf;
-	gf.forEachMeshObjectInScene<ForEachMaterialFunctor<Functor> >(sce, matfunc);
-}
-
 // OB_MESH is assumed
 std::string getActiveUVLayerName(Object *ob)
 {
@@ -344,9 +309,9 @@
 	void exportImages(Scene *sce)
 	{
 		openLibrary();
+		MaterialFunctor mf;
+		mf.forEachMaterialInScene<ImagesExporter>(sce, *this);
 
-		forEachMaterialInScene(sce, *this);
-
 		closeLibrary();
 	}
 
@@ -401,9 +366,9 @@
 	void exportEffects(Scene *sce)
 	{
 		openLibrary();
+		MaterialFunctor mf;
+		mf.forEachMaterialInScene<EffectsExporter>(sce, *this);
 
-		forEachMaterialInScene(sce, *this);
-
 		closeLibrary();
 	}
 
@@ -652,32 +617,7 @@
 	}
 };
 
-class MaterialsExporter: COLLADASW::LibraryMaterials
-{
-public:
-	MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){}
-	void exportMaterials(Scene *sce)
-	{
-		openLibrary();
 
-		forEachMaterialInScene(sce, *this);
-
-		closeLibrary();
-	}
-
-	void operator()(Material *ma, Object *ob)
-	{
-		std::string name(id_name(ma));
-
-		openMaterial(translate_id(name), name);
-
-		std::string efid = translate_id(name) + "-effect";
-		addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
-
-		closeMaterial();
-	}
-};
-
 // 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/MaterialExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/MaterialExporter.cpp	                        (rev 0)
+++ trunk/blender/source/blender/collada/MaterialExporter.cpp	2010-10-06 13:21:08 UTC (rev 32346)
@@ -0,0 +1,55 @@
+/**
+ * $Id: DocumentExporter.cpp 32309 2010-10-05 00:05:14Z jesterking $
+ *
+ * ***** 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,
+ *                 Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "COLLADABUUtils.h"
+
+#include "BKE_material.h"
+
+#include "MaterialExporter.h"
+#include "collada_internal.h"
+
+MaterialsExporter::MaterialsExporter(COLLADASW::StreamWriter *sw): COLLADASW::LibraryMaterials(sw){}
+
+void MaterialsExporter::exportMaterials(Scene *sce)
+{
+	openLibrary();
+
+	MaterialFunctor mf;
+	mf.forEachMaterialInScene<MaterialsExporter>(sce, *this);
+
+	closeLibrary();
+}
+
+void MaterialsExporter::operator()(Material *ma, Object *ob)
+{
+	std::string name(id_name(ma));
+
+	openMaterial(translate_id(name), name);
+
+	std::string efid = translate_id(name) + "-effect";
+	addInstanceEffect(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, efid));
+
+	closeMaterial();
+}

Added: trunk/blender/source/blender/collada/MaterialExporter.h
===================================================================
--- trunk/blender/source/blender/collada/MaterialExporter.h	                        (rev 0)
+++ trunk/blender/source/blender/collada/MaterialExporter.h	2010-10-06 13:21:08 UTC (rev 32346)
@@ -0,0 +1,88 @@
+/**
+ * $Id: DocumentExporter.cpp 32309 2010-10-05 00:05:14Z jesterking $
+ *
+ * ***** 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,
+ *                 Nathan Letwory
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __MATERIALEXPORTER_H__
+#define __MATERIALEXPORTER_H__
+
+#include "COLLADASWLibraryMaterials.h"
+#include "COLLADASWStreamWriter.h"
+
+#include "DNA_material_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "GeometryExporter.h"
+
+class MaterialsExporter: COLLADASW::LibraryMaterials
+{
+public:
+	MaterialsExporter(COLLADASW::StreamWriter *sw);
+	void exportMaterials(Scene *sce);
+	void operator()(Material *ma, Object *ob);
+};
+
+// used in forEachMaterialInScene
+template <class Functor>
+class ForEachMaterialFunctor
+{
+	std::vector<std::string> mMat; // contains list of material names, to avoid duplicate calling of f
+	Functor *f;
+public:
+	ForEachMaterialFunctor(Functor*f) : f(f) {}
+	
+	void operator ()(Object *ob)
+	{
+		int a;
+		for(a = 0; a < ob->totcol; a++) {
+
+			Material *ma = give_current_material(ob, a+1);
+
+			if (!ma) continue;
+
+			std::string translated_id = translate_id(id_name(ma));
+			if (find(mMat.begin(), mMat.end(), translated_id) == mMat.end()) {
+				(*this->f)(ma, ob);
+
+				mMat.push_back(translated_id);
+			}
+		}
+	}
+};
+
+struct MaterialFunctor {
+	// calls f for each unique material linked to each object in sce
+	// f should have
+	// void operator()(Material* ma)
+	template<class Functor>
+	void forEachMaterialInScene(Scene *sce, Functor &f)
+	{
+		ForEachMaterialFunctor<Functor> matfunc(&f);
+		GeometryFunctor gf;
+		gf.forEachMeshObjectInScene<ForEachMaterialFunctor<Functor> >(sce, matfunc);
+	}
+};
+
+
+#endif





More information about the Bf-blender-cvs mailing list