[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32341] trunk/blender/source/blender: COLLADACOLLADA exporter: split geometry export into own files.

Nathan Letwory nathan at letworyinteractive.com
Wed Oct 6 11:53:06 CEST 2010


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

Log Message:
-----------
COLLADACOLLADA exporter: split geometry export into own files.

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

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

Modified: trunk/blender/source/blender/blenkernel/BKE_customdata.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_customdata.h	2010-10-06 09:21:40 UTC (rev 32340)
+++ trunk/blender/source/blender/blenkernel/BKE_customdata.h	2010-10-06 09:53:06 UTC (rev 32341)
@@ -32,6 +32,10 @@
 #ifndef BKE_CUSTOMDATA_H
 #define BKE_CUSTOMDATA_H
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 struct ID;
 struct CustomData;
 struct CustomDataLayer;
@@ -295,5 +299,9 @@
 void CustomData_external_reload(struct CustomData *data,
 	struct ID *id, CustomDataMask mask, int totelem);
 
+#ifdef __cplusplus
+}
 #endif
 
+#endif
+

Modified: trunk/blender/source/blender/collada/DocumentExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/DocumentExporter.cpp	2010-10-06 09:21:40 UTC (rev 32340)
+++ trunk/blender/source/blender/collada/DocumentExporter.cpp	2010-10-06 09:53:06 UTC (rev 32341)
@@ -34,8 +34,8 @@
 #include "DNA_image_types.h"
 #include "DNA_material_types.h"
 #include "DNA_texture_types.h"
-#include "DNA_camera_types.h"
-#include "DNA_lamp_types.h"
+//#include "DNA_camera_types.h"
+//#include "DNA_lamp_types.h"
 #include "DNA_anim_types.h"
 #include "DNA_action_types.h"
 #include "DNA_curve_types.h"
@@ -74,7 +74,7 @@
 #include "COLLADASWAsset.h"
 #include "COLLADASWLibraryVisualScenes.h"
 #include "COLLADASWNode.h"
-#include "COLLADASWLibraryGeometries.h"
+//#include "COLLADASWLibraryGeometries.h"
 #include "COLLADASWSource.h"
 #include "COLLADASWInstanceGeometry.h"
 #include "COLLADASWInputList.h"
@@ -96,7 +96,7 @@
 #include "COLLADASWLibraryMaterials.h"
 #include "COLLADASWBindMaterial.h"
 //#include "COLLADASWLibraryCameras.h"
-#include "COLLADASWLibraryLights.h"
+//#include "COLLADASWLibraryLights.h"
 #include "COLLADASWInstanceCamera.h"
 #include "COLLADASWInstanceLight.h"
 //#include "COLLADASWCameraOptic.h"
@@ -110,6 +110,7 @@
 
 #include "CameraExporter.h"
 #include "LightExporter.h"
+#include "GeometryExporter.h"
 
 #include <vector>
 #include <algorithm> // std::find
@@ -138,23 +139,6 @@
   Definition can take some time to understand, but they should be useful.
 */
 
-// f should have
-// void operator()(Object* ob)
-template<class Functor>
-void forEachMeshObjectInScene(Scene *sce, Functor &f)
-{
-	
-	Base *base= (Base*) sce->base.first;
-	while(base) {
-		Object *ob = base->object;
-		
-		if (ob->type == OB_MESH && ob->data) {
-			f(ob);
-		}
-		base= base->next;
-		
-	}
-}
 
 template<class Functor>
 void forEachObjectInScene(Scene *sce, Functor &f)
@@ -203,7 +187,8 @@
 void forEachMaterialInScene(Scene *sce, Functor &f)
 {
 	ForEachMaterialFunctor<Functor> matfunc(&f);
-	forEachMeshObjectInScene(sce, matfunc);
+	GeometryFunctor gf;
+	gf.forEachMeshObjectInScene<ForEachMaterialFunctor<Functor>>(sce, matfunc);
 }
 
 // OB_MESH is assumed
@@ -218,455 +203,7 @@
 	return "";
 }
 
-// TODO: optimize UV sets by making indexed list with duplicates removed
-class GeometryExporter : COLLADASW::LibraryGeometries
-{
-	struct Face
-	{
-		unsigned int v1, v2, v3, v4;
-	};
 
-	struct Normal
-	{
-		float x, y, z;
-	};
-
-	Scene *mScene;
-
-public:
-	GeometryExporter(COLLADASW::StreamWriter *sw) : COLLADASW::LibraryGeometries(sw) {}
-
-	void exportGeom(Scene *sce)
-	{
-		openLibrary();
-
-		mScene = sce;
-		forEachMeshObjectInScene(sce, *this);
-
-		closeLibrary();
-	}
-
-	void operator()(Object *ob)
-	{
-		// XXX don't use DerivedMesh, Mesh instead?
-
-#if 0		
-		DerivedMesh *dm = mesh_get_derived_final(mScene, ob, CD_MASK_BAREMESH);
-#endif
-		Mesh *me = (Mesh*)ob->data;
-		std::string geom_id = get_geometry_id(ob);
-		std::vector<Normal> nor;
-		std::vector<Face> norind;
-
-		bool has_color = (bool)CustomData_has_layer(&me->fdata, CD_MCOL);
-
-		create_normals(nor, norind, me);
-
-		// openMesh(geoId, geoName, meshId)
-		openMesh(geom_id);
-		
-		// writes <source> for vertex coords
-		createVertsSource(geom_id, me);
-		
-		// writes <source> for normal coords
-		createNormalsSource(geom_id, me, nor);
-
-		bool has_uvs = (bool)CustomData_has_layer(&me->fdata, CD_MTFACE);
-		
-		// writes <source> for uv coords if mesh has uv coords
-		if (has_uvs)
-			createTexcoordsSource(geom_id, me);
-
-		if (has_color)
-			createVertexColorSource(geom_id, me);
-
-		// <vertices>
-		COLLADASW::Vertices verts(mSW);
-		verts.setId(getIdBySemantics(geom_id, COLLADASW::VERTEX));
-		COLLADASW::InputList &input_list = verts.getInputList();
-		COLLADASW::Input input(COLLADASW::POSITION, getUrlBySemantics(geom_id, COLLADASW::POSITION));
-		input_list.push_back(input);
-		verts.add();
-
-		// XXX slow		
-		if (ob->totcol) {
-			for(int a = 0; a < ob->totcol; a++)	{
-				createPolylist(a, has_uvs, has_color, ob, geom_id, norind);
-			}
-		}
-		else {
-			createPolylist(0, has_uvs, has_color, ob, geom_id, norind);
-		}
-		
-		closeMesh();
-		closeGeometry();
-		
-#if 0
-		dm->release(dm);
-#endif
-	}
-
-	// powerful because it handles both cases when there is material and when there's not
-	void createPolylist(int material_index,
-						bool has_uvs,
-						bool has_color,
-						Object *ob,
-						std::string& geom_id,
-						std::vector<Face>& norind)
-	{
-		Mesh *me = (Mesh*)ob->data;
-		MFace *mfaces = me->mface;
-		int totfaces = me->totface;
-
-		// <vcount>
-		int i;
-		int faces_in_polylist = 0;
-		std::vector<unsigned long> vcount_list;
-
-		// count faces with this material
-		for (i = 0; i < totfaces; i++) {
-			MFace *f = &mfaces[i];
-			
-			if (f->mat_nr == material_index) {
-				faces_in_polylist++;
-				if (f->v4 == 0) {
-					vcount_list.push_back(3);
-				}
-				else {
-					vcount_list.push_back(4);
-				}
-			}
-		}
-
-		// no faces using this material
-		if (faces_in_polylist == 0) {
-			fprintf(stderr, "%s: no faces use material %d\n", id_name(ob).c_str(), material_index);
-			return;
-		}
-			
-		Material *ma = ob->totcol ? give_current_material(ob, material_index + 1) : NULL;
-		COLLADASW::Polylist polylist(mSW);
-			
-		// sets count attribute in <polylist>
-		polylist.setCount(faces_in_polylist);
-			
-		// sets material name
-		if (ma) {
-			polylist.setMaterial(translate_id(id_name(ma)));
-		}
-				
-		COLLADASW::InputList &til = polylist.getInputList();
-			
-		// creates <input> in <polylist> for vertices 
-		COLLADASW::Input input1(COLLADASW::VERTEX, getUrlBySemantics(geom_id, COLLADASW::VERTEX), 0);
-			
-		// creates <input> in <polylist> for normals
-		COLLADASW::Input input2(COLLADASW::NORMAL, getUrlBySemantics(geom_id, COLLADASW::NORMAL), 1);
-			
-		til.push_back(input1);
-		til.push_back(input2);
-			
-		// if mesh has uv coords writes <input> for TEXCOORD
-		int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
-
-		for (i = 0; i < num_layers; i++) {
-			// char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i);
-			COLLADASW::Input input3(COLLADASW::TEXCOORD,
-									makeUrl(makeTexcoordSourceId(geom_id, i)),
-									2, // offset always 2, this is only until we have optimized UV sets
-									i  // set number equals UV layer index
-									);
-			til.push_back(input3);
-		}
-
-		if (has_color) {
-			COLLADASW::Input input4(COLLADASW::COLOR, getUrlBySemantics(geom_id, COLLADASW::COLOR), has_uvs ? 3 : 2);
-			til.push_back(input4);
-		}
-			
-		// sets <vcount>
-		polylist.setVCountList(vcount_list);
-			
-		// performs the actual writing
-		polylist.prepareToAppendValues();
-			
-		// <p>
-		int texindex = 0;
-		for (i = 0; i < totfaces; i++) {
-			MFace *f = &mfaces[i];
-
-			if (f->mat_nr == material_index) {
-
-				unsigned int *v = &f->v1;
-				unsigned int *n = &norind[i].v1;
-				for (int j = 0; j < (f->v4 == 0 ? 3 : 4); j++) {
-					polylist.appendValues(v[j]);
-					polylist.appendValues(n[j]);
-
-					if (has_uvs)
-						polylist.appendValues(texindex + j);
-
-					if (has_color)
-						polylist.appendValues(texindex + j);
-				}
-			}
-
-			texindex += 3;
-			if (f->v4 != 0)
-				texindex++;
-		}
-			
-		polylist.finish();
-	}
-	
-	// creates <source> for positions
-	void createVertsSource(std::string geom_id, Mesh *me)
-	{
-#if 0
-		int totverts = dm->getNumVerts(dm);
-		MVert *verts = dm->getVertArray(dm);
-#endif
-		int totverts = me->totvert;
-		MVert *verts = me->mvert;
-		
-		COLLADASW::FloatSourceF source(mSW);
-		source.setId(getIdBySemantics(geom_id, COLLADASW::POSITION));
-		source.setArrayId(getIdBySemantics(geom_id, COLLADASW::POSITION) +
-						  ARRAY_ID_SUFFIX);
-		source.setAccessorCount(totverts);
-		source.setAccessorStride(3);
-		COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
-		param.push_back("X");
-		param.push_back("Y");
-		param.push_back("Z");
-		/*main function, it creates <source id = "">, <float_array id = ""
-		  count = ""> */
-		source.prepareToAppendValues();
-		//appends data to <float_array>
-		int i = 0;
-		for (i = 0; i < totverts; i++) {
-			source.appendValues(verts[i].co[0], verts[i].co[1], verts[i].co[2]);			
-		}
-		
-		source.finish();
-	
-	}
-
-	void createVertexColorSource(std::string geom_id, Mesh *me)
-	{
-		if (!CustomData_has_layer(&me->fdata, CD_MCOL))
-			return;
-
-		MFace *f;
-		int totcolor = 0, i, j;
-
-		for (i = 0, f = me->mface; i < me->totface; i++, f++)
-			totcolor += f->v4 ? 4 : 3;
-
-		COLLADASW::FloatSourceF source(mSW);
-		source.setId(getIdBySemantics(geom_id, COLLADASW::COLOR));
-		source.setArrayId(getIdBySemantics(geom_id, COLLADASW::COLOR) + ARRAY_ID_SUFFIX);
-		source.setAccessorCount(totcolor);
-		source.setAccessorStride(3);
-
-		COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
-		param.push_back("R");
-		param.push_back("G");
-		param.push_back("B");
-
-		source.prepareToAppendValues();
-
-		int index = CustomData_get_active_layer_index(&me->fdata, CD_MCOL);
-
-		MCol *mcol = (MCol*)me->fdata.layers[index].data;
-		MCol *c = mcol;
-
-		for (i = 0, f = me->mface; i < me->totface; i++, c += 4, f++)
-			for (j = 0; j < (f->v4 ? 4 : 3); j++)
-				source.appendValues(c[j].b / 255.0f, c[j].g / 255.0f, c[j].r / 255.0f);
-		
-		source.finish();
-	}
-
-	std::string makeTexcoordSourceId(std::string& geom_id, int layer_index)
-	{
-		char suffix[20];
-		sprintf(suffix, "-%d", layer_index);
-		return getIdBySemantics(geom_id, COLLADASW::TEXCOORD) + suffix;
-	}
-
-	//creates <source> for texcoords
-	void createTexcoordsSource(std::string geom_id, Mesh *me)
-	{
-#if 0
-		int totfaces = dm->getNumFaces(dm);
-		MFace *mfaces = dm->getFaceArray(dm);
-#endif
-		int totfaces = me->totface;
-		MFace *mfaces = me->mface;
-
-		int totuv = 0;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list