[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22008] branches/soc-2009-chingachgook/ source/blender/collada: Some small changes to textures import/export.

Chingiz Dyussenov chingiz.ds at gmail.com
Wed Jul 29 13:32:42 CEST 2009


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

Log Message:
-----------
Some small changes to textures import/export. 

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-29 08:02:50 UTC (rev 22007)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp	2009-07-29 11:32:42 UTC (rev 22008)
@@ -1009,9 +1009,14 @@
 		// set shader type - one of three blinn, phong or lambert
 		if (ma->spec_shader == MA_SPEC_BLINN) {
 			ep.setShaderType(COLLADASW::EffectProfile::BLINN);
+			// shininess
+			ep.setShininess(ma->spec);
 		}
 		else if (ma->spec_shader == MA_SPEC_PHONG) {
 			ep.setShaderType(COLLADASW::EffectProfile::PHONG);
+			// shininess
+			// XXX not sure about this
+			ep.setShininess(ma->har / 4);
 		}
 		else {
 			// XXX write warning "Current shader type is not supported" 
@@ -1026,8 +1031,6 @@
 		}
 		// transparency
 		ep.setTransparency(ma->alpha);
-		// shininess
-		ep.setShininess(ma->spec);
 		// emission
 		COLLADASW::ColorOrTexture cot = getcol(0.0f, 0.0f, 0.0f, 1.0f);
 		ep.setEmission(cot);

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-29 08:02:50 UTC (rev 22007)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-29 11:32:42 UTC (rev 22008)
@@ -361,12 +361,7 @@
 	};
 	typedef std::map<COLLADAFW::MaterialId, std::vector<Primitive> > MaterialIdPrimitiveArrayMap;
 	std::map<COLLADAFW::UniqueId, MaterialIdPrimitiveArrayMap> geom_uid_mat_mapping_map; // crazy name!
-	/*
-	// maps for assigning textures to uv layers
-	//std::map<COLLADAFW::TextureMapId, char*> set_layername_map;
-	typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > TexIndexTextureArrayMap;
-	std::map<Material*, TexIndexTextureArrayMap> material_texture_mapping_map;
-	*/
+	
 	class UVDataWrapper
 	{
 		COLLADAFW::MeshVertexData *mVData;
@@ -693,21 +688,30 @@
 
 	MeshImporter(ArmatureImporter *arm, Scene *sce) : scene(sce), armature_importer(arm) {}
 	
-	MTex *assign_textures_to_uvlayer(COLLADAFW::InstanceGeometry::TextureCoordinateBinding &ctexture, Mesh **me, TexIndexTextureArrayMap& texindex_texarray_map, MTex *color_texture)
+	
+	MTex *assign_textures_to_uvlayer(COLLADAFW::InstanceGeometry::TextureCoordinateBinding &ctexture,
+									 Mesh *me, TexIndexTextureArrayMap& texindex_texarray_map,
+									 MTex *color_texture)
 	{
+		
 		COLLADAFW::TextureMapId texture_index = ctexture.textureMapId;
-		size_t set_index = ctexture.setIndex;
-		char *uvname = CustomData_get_layer_name(&(*me)->fdata, CD_MTFACE, set_index);
 		
+		char *uvname = CustomData_get_layer_name(&me->fdata, CD_MTFACE, ctexture.setIndex);
+		
 		if (texindex_texarray_map.find(texture_index) == texindex_texarray_map.end()) {
+			
 			fprintf(stderr, "Cannot find texture array by texture index.\n");
 			return NULL;
 		}
-		// assign uvlayer name to texture
+		
 		std::vector<MTex*> textures = texindex_texarray_map[texture_index];
+		
 		std::vector<MTex*>::iterator it;
+		
 		for (it = textures.begin(); it != textures.end(); it++) {
+			
 			MTex *texture = *it;
+			
 			if (texture) {
 				strcpy(texture->uvname, uvname);
 				if (texture->mapto == MAP_COL) color_texture = texture;
@@ -717,40 +721,46 @@
 	}
 	
 	MTFace *assign_material_to_geom(COLLADAFW::InstanceGeometry::MaterialBinding cmaterial,
-								 std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
-								 Object *ob, Mesh *me, const COLLADAFW::UniqueId *geom_uid, 
-								 MTex **color_texture, char *layername, MTFace *texture_face,
-								 std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index)
+									std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
+									Object *ob, const COLLADAFW::UniqueId *geom_uid, 
+									MTex **color_texture, char *layername, MTFace *texture_face,
+									std::map<Material*, TexIndexTextureArrayMap>& material_texture_mapping_map, int mat_index)
 	{
+		Mesh *me = (Mesh*)ob->data;
 		const COLLADAFW::UniqueId& ma_uid = cmaterial.getReferencedMaterial();
-		unsigned int j;
+		
 		// do we know this material?
 		if (uid_material_map.find(ma_uid) == uid_material_map.end()) {
+			
 			fprintf(stderr, "Cannot find material by UID.\n");
 			return NULL;
 		}
+		
 		Material *ma = uid_material_map[ma_uid];
+		assign_material(ob, ma, ob->totcol + 1);
 		
+		COLLADAFW::InstanceGeometry::TextureCoordinateBindingArray& tex_array = 
+			cmaterial.getTextureCoordinateBindingArray();
 		TexIndexTextureArrayMap texindex_texarray_map = material_texture_mapping_map[ma];
+		unsigned int i;
+		// loop through <bind_vertex_inputs>
+		for (i = 0; i < tex_array.getCount(); i++) {
+			
+			*color_texture = assign_textures_to_uvlayer(tex_array[i], me, texindex_texarray_map,
+														*color_texture);
+		}
 		
-		COLLADAFW::InstanceGeometry::TextureCoordinateBindingArray& tex_array = cmaterial.getTextureCoordinateBindingArray();
-		
-		// loop through material's textures
-		for (j = 0; j < tex_array.getCount(); j++) {
-			*color_texture = assign_textures_to_uvlayer(tex_array[j], &me, texindex_texarray_map, *color_texture);
-		}
 		// if material has color texture
 		if (*color_texture && strlen((*color_texture)->uvname)) {
-			// multiple color textures may refer to the same uvlayer, 
-			// set tface only once, otherwise images will rewrite each other 
+			// set tface
 			if (strcmp(layername, (*color_texture)->uvname) != 0) {
-				texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE, (*color_texture)->uvname);
+				
+				texture_face = (MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
+																   (*color_texture)->uvname);
 				strcpy(layername, (*color_texture)->uvname);
 			}
 		}
 		
-		assign_material(ob, ma, ob->totcol + 1);
-		
 		MaterialIdPrimitiveArrayMap& mat_prim_map = geom_uid_mat_mapping_map[*geom_uid];
 		COLLADAFW::MaterialId mat_id = cmaterial.getMaterialId();
 		
@@ -763,12 +773,10 @@
 			
 			for (it = prims.begin(); it != prims.end(); it++) {
 				Primitive& prim = *it;
-				j = 0;
-				while (j++ < prim.totface) {
+				i = 0;
+				while (i++ < prim.totface) {
 					prim.mface->mat_nr = mat_index;
 					prim.mface++;
-					
-					// if tface was set
 					// bind image to tface
 					if (texture_face && (*color_texture)) {
 						texture_face->mode = TF_TEX;
@@ -778,11 +786,11 @@
 				}
 			}
 		}
-
+		
 		return texture_face;
 	}
 	
-	// bind object to mesh
+	
 	Object *create_mesh_object(COLLADAFW::Node *node, COLLADAFW::InstanceGeometry *geom,
 							   bool isController,
 							   std::map<COLLADAFW::UniqueId, Material*>& uid_material_map,
@@ -792,13 +800,16 @@
 		
 		// check if node instanciates controller or geometry
 		if (isController) {
+			
 			geom_uid = armature_importer->get_geometry_uid(*geom_uid);
+			
 			if (!geom_uid) {
 				fprintf(stderr, "Couldn't find a mesh UID by controller's UID.\n");
 				return NULL;
 			}
 		}
 		else {
+			
 			if (uid_mesh_map.find(*geom_uid) == uid_mesh_map.end()) {
 				// this could happen if a mesh was not created
 				// (e.g. if it contains unsupported geometry)
@@ -822,7 +833,6 @@
 		
 		if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
 		
-		Mesh *me = (Mesh*)ob->data;
 		char layername[100];
 		MTFace *texture_face = NULL;
 		MTex *color_texture = NULL;
@@ -831,10 +841,11 @@
 		
 		// loop through geom's materials
 		for (unsigned int i = 0; i < mat_array.getCount(); i++)	{
-			texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, me, geom_uid, &color_texture, layername, texture_face, material_texture_mapping_map, i);
 			
+			texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
+												   &color_texture, layername, texture_face,
+												   material_texture_mapping_map, i);
 		}
-		
 			
 		return ob;
 	}
@@ -1221,6 +1232,7 @@
 		ma->mtex[i]->texco = TEXCO_UV;
 		ma->mtex[i]->tex = add_texture("texture");
 		ma->mtex[i]->tex->type = TEX_IMAGE;
+		ma->mtex[i]->tex->imaflag &= ~TEX_USEALPHA;
 		ma->mtex[i]->tex->ima = uid_image_map[ima_uid];
 		
 		texindex_texarray_map[ctex.getTextureMapId()].push_back(ma->mtex[i]);
@@ -1240,7 +1252,8 @@
 		// phong
 		else if (shader == COLLADAFW::EffectCommon::SHADER_PHONG) {
 			ma->spec_shader = MA_SPEC_PHONG;
-			ma->spec = ef->getShininess().getFloatValue();
+			// XXX setting specular hardness instead of specularity intensity
+			ma->har = ef->getShininess().getFloatValue() * 4;
 		}
 		// lambert
 		else if (shader == COLLADAFW::EffectCommon::SHADER_LAMBERT) {
@@ -1384,6 +1397,25 @@
 			fprintf(stderr, "Cannot create camera. \n");
 			return true;
 		}
+		COLLADAFW::Camera::CameraType type = camera->getCameraType();
+		switch(type) {
+		case COLLADAFW::Camera::ORTHOGRAPHIC:
+			{
+				cam->type = CAM_ORTHO;
+			}
+			break;
+		case COLLADAFW::Camera::PERSPECTIVE:
+			{
+				cam->type = CAM_PERSP;
+			}
+			break;
+		case COLLADAFW::Camera::UNDEFINED_CAMERATYPE:
+			{
+				fprintf(stderr, "Current camera type is not supported. \n");
+				cam->type = CAM_PERSP;
+			}
+			break;
+		}
 		this->uid_camera_map[camera->getUniqueId()] = cam;
 		// XXX import camera options
 		return true;





More information about the Bf-blender-cvs mailing list