[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21658] branches/soc-2009-chingachgook/ source/blender/collada: Fixed textures import - images are assigned to faces.

Chingiz Dyussenov chingiz.ds at gmail.com
Fri Jul 17 12:42:36 CEST 2009


Revision: 21658
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21658
Author:   chingachgook
Date:     2009-07-17 12:42:32 +0200 (Fri, 17 Jul 2009)

Log Message:
-----------
Fixed textures import - images are assigned to faces.

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-17 10:09:07 UTC (rev 21657)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-07-17 10:42:32 UTC (rev 21658)
@@ -696,7 +696,7 @@
 				std::string name(id_name(image));
 
 				if (find(mImages.begin(), mImages.end(), name) == mImages.end()) {
-					COLLADASW::Image img(COLLADABU::URI(image->name), name, "");
+					COLLADASW::Image img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(image->name)), name, "");
 					img.add(mSW);
 
 					mImages.push_back(name);

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-17 10:09:07 UTC (rev 21657)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-17 10:42:32 UTC (rev 21658)
@@ -326,25 +326,32 @@
 		
 		// assign materials to object
 		// assign material indices to mesh faces
+		Mesh *me = (Mesh*)ob->data;
+		MTex *mtex = NULL;
+		MTFace *tface = NULL;
+		char *layername = CustomData_get_layer_name(&me->fdata, CD_MTFACE, 0);
+		
 		for (int k = 0; k < geom->getMaterialBindings().getCount(); k++) {
 			
-			const COLLADAFW::UniqueId& mat_uid = geom->getMaterialBindings()[k].getReferencedMaterial();
+			const COLLADAFW::UniqueId& ma_uid = geom->getMaterialBindings()[k].getReferencedMaterial();
 			// check if material was properly written to map
-			if (uid_material_map.find(mat_uid) == uid_material_map.end()) {
+			if (uid_material_map.find(ma_uid) == uid_material_map.end()) {
 				fprintf(stderr, "Cannot find material by UID.\n");
 				continue;
 			}
+			Material *ma = uid_material_map[ma_uid];
+			int l;
 			
 			// assign textures to uv layers
 			// bvi_array "bind_vertex_input array"
 			COLLADAFW::InstanceGeometry::TextureCoordinateBindingArray& bvi_array = 
 				geom->getMaterialBindings()[k].getTextureCoordinateBindingArray();
 			
-			for (int l = 0; l < bvi_array.getCount(); l++) {
+			for (l = 0; l < bvi_array.getCount(); l++) {
 				
 				COLLADAFW::TextureMapId tex_index = bvi_array[l].textureMapId;
 				size_t set_index = bvi_array[l].setIndex;
-				char *layername = set_layername_map[set_index];
+				char *uvname = set_layername_map[set_index];
 				
 				// check if mtexes were properly added to vector
 				if (index_mtex_map.find(tex_index) == index_mtex_map.end()) {
@@ -354,20 +361,33 @@
 				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);
+					mtex = *it;
+					strcpy(mtex->uvname, uvname);
 					
 				}	
 			}
+			mtex = NULL;
+			// find and save texture mapped to diffuse
+			for (l = 0; l < 18; l++) {
+				if (ma->mtex[l] != NULL && ma->mtex[l]->mapto == MAP_COL)
+					mtex = ma->mtex[l];
+			}
+			// get mtface for first uv layer
+			if (tface == NULL && mtex != NULL)
+				tface = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE, mtex->uvname);
+			// get mtface for next uv layer
+			else if(layername != NULL && mtex != NULL && strcmp(layername, mtex->uvname) != 0) {
+				tface = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE, mtex->uvname);
+				layername = mtex->uvname;
+			}
 			
-			assign_material(ob, uid_material_map[mat_uid], ob->totcol + 1);
+			assign_material(ob, ma, 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()) {
 				
 				std::vector<Primitive>& prims = mat_prim_map[mat_id];
@@ -376,11 +396,15 @@
 				
 				for (it = prims.begin(); it != prims.end(); it++) {
 					Primitive& prim = *it;
-					
-					int l = 0;
+					l = 0;
 					while (l++ < prim.totface) {
 						prim.mface->mat_nr = k;
 						prim.mface++;
+						if (mtex != NULL && tface != NULL) {
+							tface->tpage = (Image*)mtex->tex->ima;
+							tface->mode = TF_TEX;
+							tface++;
+						}
 					}
 				}
 			}
@@ -501,7 +525,6 @@
 				fprintf(stderr, "MATRIX, LOOKAT and SKEW transformations are not supported yet.\n");
 				break;
 			}
-			//if (ob->type == OB_CAMERA) continue;
 			
 			// AnimationList that drives this Transformation
 			const COLLADAFW::UniqueId& anim_list_id = tm->getAnimationList();





More information about the Bf-blender-cvs mailing list