[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21620] branches/soc-2009-chingachgook/ source/blender/collada: *Exporter handles empty objects.

Chingiz Dyussenov chingiz.ds at gmail.com
Thu Jul 16 09:56:17 CEST 2009


Revision: 21620
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21620
Author:   chingachgook
Date:     2009-07-16 09:56:17 +0200 (Thu, 16 Jul 2009)

Log Message:
-----------
*Exporter handles empty objects.
*Added textures import.
TODO:
Fix images import. 

Modified Paths:
--------------
    branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
    branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-07-16 07:11:46 UTC (rev 21619)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-07-16 07:56:17 UTC (rev 21620)
@@ -575,7 +575,7 @@
 		COLLADASW::Node node(mSW);
 		std::string ob_name(id_name(ob));
 		node.start();
-
+		
 		node.addTranslate(ob->loc[0], ob->loc[1], ob->loc[2]);
 		
 		// when animation time comes, replace a single <rotate> with 3, one for each axis
@@ -632,6 +632,9 @@
 			COLLADASW::InstanceLight instLa(mSW, COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, ob_name));
 			instLa.add();
 		}
+		// empty object
+		else if (ob->type == OB_EMPTY) {
+		}
 		
 		// write node for child object
 		Base *b = (Base*) sce->base.first;
@@ -639,7 +642,7 @@
 			
 			Object *cob = b->object;
 			
-			if ((cob->type == OB_MESH || cob->type == OB_CAMERA || cob->type == OB_LAMP) && cob->parent == ob) {
+			if ((cob->type == OB_MESH || cob->type == OB_CAMERA || cob->type == OB_LAMP || cob->type == OB_EMPTY) && cob->parent == ob) {
 				// write node...
 				writeNodes(cob, sce);
 			}
@@ -655,7 +658,7 @@
 		while(base) {
 			Object *ob = base->object;
 			
-			if ((ob->type == OB_MESH || ob->type == OB_CAMERA || ob->type == OB_LAMP) && !ob->parent) {
+			if ((ob->type == OB_MESH || ob->type == OB_CAMERA || ob->type == OB_LAMP || ob->type == OB_EMPTY) && !ob->parent) {
 				// write nodes....
 				writeNodes(ob, sce);
 				

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-16 07:11:46 UTC (rev 21619)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-16 07:56:17 UTC (rev 21620)
@@ -12,6 +12,7 @@
 #include "COLLADAFWEffect.h"
 #include "COLLADAFWGeometry.h"
 #include "COLLADAFWMesh.h"
+#include "COLLADAFWMeshPrimitive.h"
 #include "COLLADAFWMeshVertexData.h"
 #include "COLLADAFWFloatOrDoubleArray.h"
 #include "COLLADAFWArrayPrimitiveType.h"
@@ -24,6 +25,10 @@
 #include "COLLADAFWRotate.h"
 #include "COLLADAFWAnimationCurve.h"
 #include "COLLADAFWAnimationList.h"
+#include "COLLADAFWSkinController.h"
+#include "COLLADAFWColorOrTexture.h"
+#include "COLLADAFWSampler.h"
+#include "COLLADAFWTypes.h"
 
 #include "COLLADASaxFWLLoader.h"
 
@@ -33,6 +38,8 @@
 #include "BKE_main.h"
 #include "BKE_customdata.h"
 #include "BKE_library.h"
+#include "BKE_texture.h"
+#include "DNA_texture_types.h"
 }
 #include "BKE_mesh.h"
 #include "BKE_global.h"
@@ -47,6 +54,7 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_material_types.h"
+//#include "DNA_texture_types.h"
 
 #include "DocumentImporter.h"
 
@@ -56,6 +64,7 @@
 
 // #define COLLADA_DEBUG
 
+char *CustomData_get_layer_name(const struct CustomData *data, int type, int n);
 
 const char *primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type)
 {
@@ -96,6 +105,13 @@
 	return "UNKNOWN";
 }
 
+/*
+
+  COLLADA Importer limitations:
+
+  - no multiple scene import, all objects are added to active scene
+
+ */
 /** Class that needs to be implemented by a writer. 
 	IMPORTANT: The write functions are called in arbitrary order.*/
 class Writer: public COLLADAFW::IWriter
@@ -108,9 +124,12 @@
 	bContext *mContext;
 
 	std::map<COLLADAFW::UniqueId, Mesh*> uid_mesh_map; // geometry unique id-to-mesh map
+	std::map<COLLADAFW::UniqueId, Image*> uid_image_map;
 	std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
 	std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
-
+	// maps for assigning textures to uv layers
+	std::map<COLLADAFW::TextureMapId, char*> set_layername_map;
+	std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > index_mtex_map;
 	// this structure is used to assign material indices to faces
 	// when materials are assigned to an object
 	struct Primitive {
@@ -149,7 +168,8 @@
 		// TODO need also for angle conversion, time conversion...
 	};
 
-	class UVDataWrapper {
+	class UVDataWrapper
+	{
 		COLLADAFW::MeshVertexData *mVData;
 	public:
 		UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
@@ -273,104 +293,136 @@
 		// XXX could store the scene id, but do nothing for now
 		return true;
 	}
-
-	void writeNode (COLLADAFW::Node *node, Scene *sce, Object *parent_ob = NULL)
+	
+	// bind early created mesh to object, assign materials and textures
+	Object *create_mesh_object(Object *ob, Scene *sce, COLLADAFW::Node *node,
+							   COLLADAFW::InstanceGeometry *geom)
 	{
-		// XXX linking object with the first <instance_geometry>, though a node may have more of them...
-		// TODO: join multiple <instance_...> meshes into 1, and link object with it
-		COLLADAFW::InstanceGeometryPointerArray &geom = node->getInstanceGeometries();
-		COLLADAFW::InstanceCameraPointerArray &camera = node->getInstanceCameras();
-		COLLADAFW::InstanceLightPointerArray &lamp = node->getInstanceLights();
-		COLLADAFW::InstanceControllerPointerArray &controller = node->getInstanceControllers();
-		COLLADAFW::InstanceNodePointerArray &inst_node = node->getInstanceNodes();
-		Object *ob;
-		int k;
+		ob = add_object(sce, OB_MESH);
 		
-		// if node has <instance_geometries> - connect mesh with object
-		// XXX currently only one <instance_geometry> in a node is supported
-		if (geom.getCount() != 0) {
+		const std::string& id = node->getOriginalId();
+		if (id.length())
+			rename_id(&ob->id, (char*)id.c_str());
+		
+		const COLLADAFW::UniqueId& geom_uid = geom->getInstanciatedObjectId();
+		if (uid_mesh_map.find(geom_uid) == uid_mesh_map.end()) {
+			// XXX report to user
+			// this could happen if a mesh was not created
+			// (e.g. if it contains unsupported geometry)
+			fprintf(stderr, "Couldn't find a mesh by UID.\n");
+			// delete created object
+			free_object(ob);
+			return NULL;
+		}
+		// replace ob->data freeing the old one
+		Mesh *old_mesh = (Mesh*)ob->data;
+		set_mesh(ob, uid_mesh_map[geom_uid]);
+		if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
+		
+		// assign materials to object
+		// assign material indices to mesh faces
+		for (int k = 0; k < geom->getMaterialBindings().getCount(); k++) {
 			
-			ob = add_object(sce, OB_MESH);
+			const COLLADAFW::UniqueId& mat_uid = geom->getMaterialBindings()[k].getReferencedMaterial();
+			// check if material was properly written to map
+			if (uid_material_map.find(mat_uid) == uid_material_map.end()) {
+				fprintf(stderr, "Cannot find material by UID.\n");
+				continue;
+			}
 			
-			const std::string& id = node->getOriginalId();
-			if (id.length())
-				rename_id(&ob->id, (char*)id.c_str());
+			// assign textures to uv layers
+			// bvi_array "bind_vertex_input array"
+			COLLADAFW::InstanceGeometry::TextureCoordinateBindingArray& bvi_array = 
+				geom->getMaterialBindings()[k].getTextureCoordinateBindingArray();
 			
-			const COLLADAFW::UniqueId& geom_uid = geom[0]->getInstanciatedObjectId();
-			if (uid_mesh_map.find(geom_uid) == uid_mesh_map.end()) {
-				// XXX report to user
-				// this could happen if a mesh was not created
-				// (e.g. if it contains unsupported geometry)
-				fprintf(stderr, "Couldn't find a mesh by UID.\n");
-				// delete created object
-				free_object(ob);
-				return;
-			}
-			// replace ob->data freeing the old one
-			Mesh *old_mesh = (Mesh*)ob->data;
-			set_mesh(ob, uid_mesh_map[geom_uid]);
-			if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
-			
-			// assign materials to object
-			// assign material indices to mesh faces
-			for (k = 0; k < geom[0]->getMaterialBindings().getCount(); k++) {
+			for (int l = 0; l < bvi_array.getCount(); l++) {
 				
-				const COLLADAFW::UniqueId& mat_uid =
-					geom[0]->getMaterialBindings()[k].getReferencedMaterial();
+				COLLADAFW::TextureMapId tex_index = bvi_array[l].textureMapId;
+				size_t set_index = bvi_array[l].setIndex;
+				char *layername = set_layername_map[set_index];
 				
-				if (uid_material_map.find(mat_uid) == uid_material_map.end()) {
-					
-					fprintf(stderr, "Cannot find material by UID.\n");
+				// check if mtexes were properly added to vector
+				if (index_mtex_map.find(tex_index) == index_mtex_map.end()) {
+					fprintf(stderr, "Cannot find vector of mtexes by texture map id.\n");
 					continue;
 				}
+				std::vector<MTex*> mtexes = index_mtex_map[tex_index];
+				std::vector<MTex*>::iterator it;
+				for (it = mtexes.begin(); it != mtexes.end(); it++) {
+					MTex *mtex = *it;
+					strcpy(mtex->uvname, layername);
+				}	
+			}
+			
+			assign_material(ob, uid_material_map[mat_uid], ob->totcol + 1);
+			
+			MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[geom_uid];
+			COLLADAFW::MaterialId mat_id = geom->getMaterialBindings()[k].getMaterialId();
+			
+			// if there's geometry that uses this material,
+			// set mface->mat_nr=k for each face in that geometry
+			if (mat_prim_map.find(mat_id) != mat_prim_map.end()) {
 				
-				assign_material(ob, uid_material_map[mat_uid], ob->totcol + 1);
+				std::vector<Primitive>& prims = mat_prim_map[mat_id];
 				
-				MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[geom_uid];
-				COLLADAFW::MaterialId mat_id = geom[0]->getMaterialBindings()[k].getMaterialId();
+				std::vector<Primitive>::iterator it;
 				
-				// if there's geometry that uses this material,
-				// set mface->mat_nr=k for each face in that geometry
-				if (mat_prim_map.find(mat_id) != mat_prim_map.end()) {
+				for (it = prims.begin(); it != prims.end(); it++) {
+					Primitive& prim = *it;
 					
-					std::vector<Primitive>& prims = mat_prim_map[mat_id];
-					
-					std::vector<Primitive>::iterator it;
-					
-					for (it = prims.begin(); it != prims.end(); it++) {
-						Primitive& prim = *it;
-						
-						int l = 0;
-						while (l++ < prim.totface) {
-							prim.mface->mat_nr = k;
-							prim.mface++;
-						}
+					int l = 0;
+					while (l++ < prim.totface) {
+						prim.mface->mat_nr = k;
+						prim.mface++;
 					}
 				}
 			}
 		}
-		// checking of all other possible instances
+		return ob;
+	}
+	
+	void write_node (COLLADAFW::Node *node, Scene *sce, Object *parent_ob = NULL)
+	{
+		// XXX linking object with the first <instance_geometry>, though a node may have more of them...

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list