[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21308] branches/soc-2009-chingachgook/ source/blender/collada/DocumentImporter.cpp: Import:

Chingiz Dyussenov chingiz.ds at gmail.com
Thu Jul 2 07:43:14 CEST 2009


Revision: 21308
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21308
Author:   chingachgook
Date:     2009-07-02 07:43:14 +0200 (Thu, 02 Jul 2009)

Log Message:
-----------
Import:
*materials are assigned to objects.
TODO:
*import UVs

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

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-02 05:25:14 UTC (rev 21307)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-02 05:43:14 UTC (rev 21308)
@@ -100,7 +100,7 @@
 
 	std::map<COLLADAFW::UniqueId, Mesh*> uid_mesh_map; // geometry unique id-to-mesh map
 	std::map<COLLADAFW::UniqueId, Material*> uid_material_map;
-
+	std::map<COLLADAFW::UniqueId, Material*> uid_effect_map;
 	class UnitConverter
 	{
 	private:
@@ -262,9 +262,9 @@
 			
 			float rot[3][3];
 			Mat3One(rot);
-			
+			int k;
 			// transform Object
-			for (int k = 0; k < node->getTransformations().getCount(); k ++) {
+			for (k = 0; k < node->getTransformations().getCount(); k ++) {
 				COLLADAFW::Transformation *transform = node->getTransformations()[k];
 				COLLADAFW::Transformation::TransformationType type = transform->getTransformationType();
 				switch(type) {
@@ -315,11 +315,19 @@
 					break;
 				}
 			}
+			Mat3ToEul(rot, ob->rot);
 			
-			Mat3ToEul(rot, ob->rot);
-
+			for (k = 0; k < geom[0]->getMaterialBindings().getCount(); k++) {
+				const COLLADAFW::UniqueId& mat_uid = geom[0]->getMaterialBindings()[k].getReferencedMaterial();
+				if (uid_material_map.find(mat_uid) == uid_material_map.end()) {
+					// This should not happen
+					fprintf(stderr, "This mesh has no materials.\n");
+					continue;
+				}
+				assign_material(ob, uid_material_map[mat_uid], ob->totcol + 1);
+			}
 		}
-
+		
 		mVisualScenes.push_back(*visualScene);
 
 		return true;
@@ -341,7 +349,7 @@
 		// - write geometry
 
 		// - ignore usupported primitive types
-
+		
 		// TODO: import also uvs, normals
 		// XXX what to do with normal indices?
 		// XXX num_normals may be != num verts, then what to do?
@@ -357,7 +365,6 @@
 		
 		// first check if we can import this mesh
 		COLLADAFW::MeshPrimitiveArray& prim_arr = cmesh->getMeshPrimitives();
-
 		int i;
 		
 		for (i = 0; i < prim_arr.getCount(); i++) {
@@ -495,13 +502,14 @@
 
 	/** When this method is called, the writer must write the material.
 		@return The writer should return true, if writing succeeded, false otherwise.*/
-	virtual bool writeMaterial( const COLLADAFW::Material* material ) 
+	virtual bool writeMaterial( const COLLADAFW::Material* cmat ) 
 	{
-		// TODO: create and store a material.
-		// Let it have 0 users for now.
-		const std::string& str_mat_id = material->getOriginalId();
+		
+		const std::string& str_mat_id = cmat->getOriginalId();
 		Material *ma = add_material((char*)str_mat_id.c_str());
-		this->uid_material_map[material->getInstantiatedEffect()] = ma;
+		
+		this->uid_effect_map[cmat->getInstantiatedEffect()] = ma;
+		this->uid_material_map[cmat->getUniqueId()] = ma;
 		return true;
 	}
 
@@ -511,21 +519,20 @@
 	{
 		
 		const COLLADAFW::UniqueId& uid = effect->getUniqueId();
-		if (uid_material_map.find(uid) == uid_material_map.end()) {
-			// XXX report to user
-			// this could happen if a mesh was not created
-			// (e.g. if it contains unsupported geometry)
+		if (uid_effect_map.find(uid) == uid_effect_map.end()) {
 			fprintf(stderr, "Couldn't find a material by UID.\n");
 			return true;
 		}
 		
-		Material *ma = uid_material_map[uid];
+		Material *ma = uid_effect_map[uid];
 		
 		COLLADAFW::CommonEffectPointerArray ef_array = effect->getCommonEffects();
 		if (ef_array.getCount() < 1) {
 			fprintf(stderr, "Effect hasn't got any common effects.\n");
+			return true;
 		}
-		
+		// XXX TODO: Take all common effects
+		// Currently only first <effect_common> is supported
 		COLLADAFW::EffectCommon *ef = ef_array[0];
 		COLLADAFW::EffectCommon::ShaderType shader = ef->getShaderType();
 		





More information about the Bf-blender-cvs mailing list