[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [48201] trunk/blender/source/blender: Collada: (Export) Added export of surface textures, and control over exported uv layers

Gaia Clary gaia.clary at machinimatrix.org
Fri Jun 22 18:17:04 CEST 2012


Revision: 48201
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48201
Author:   gaiaclary
Date:     2012-06-22 16:16:58 +0000 (Fri, 22 Jun 2012)
Log Message:
-----------
Collada: (Export) Added export of surface textures, and control over exported uv layers

Modified Paths:
--------------
    trunk/blender/source/blender/collada/ArmatureExporter.cpp
    trunk/blender/source/blender/collada/CMakeLists.txt
    trunk/blender/source/blender/collada/EffectExporter.cpp
    trunk/blender/source/blender/collada/EffectExporter.h
    trunk/blender/source/blender/collada/ExportSettings.h
    trunk/blender/source/blender/collada/GeometryExporter.cpp
    trunk/blender/source/blender/collada/ImageExporter.cpp
    trunk/blender/source/blender/collada/ImageExporter.h
    trunk/blender/source/blender/collada/InstanceWriter.cpp
    trunk/blender/source/blender/collada/InstanceWriter.h
    trunk/blender/source/blender/collada/SConscript
    trunk/blender/source/blender/collada/SceneExporter.cpp
    trunk/blender/source/blender/collada/collada.cpp
    trunk/blender/source/blender/collada/collada.h
    trunk/blender/source/blender/collada/collada_utils.cpp
    trunk/blender/source/blender/collada/collada_utils.h
    trunk/blender/source/blender/editors/io/io_collada.c
    trunk/blender/source/blender/makesrna/intern/rna_scene_api.c

Modified: trunk/blender/source/blender/collada/ArmatureExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/ArmatureExporter.cpp	2012-06-22 15:43:51 UTC (rev 48200)
+++ trunk/blender/source/blender/collada/ArmatureExporter.cpp	2012-06-22 16:16:58 UTC (rev 48201)
@@ -111,7 +111,7 @@
 		write_bone_URLs(ins, ob_arm, bone);
 	}
 
-	InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob);
+	InstanceWriter::add_material_bindings(ins.getBindMaterial(), ob, this->export_settings->active_uv_only);
 		
 	ins.add();
 	return true;

Modified: trunk/blender/source/blender/collada/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/collada/CMakeLists.txt	2012-06-22 15:43:51 UTC (rev 48200)
+++ trunk/blender/source/blender/collada/CMakeLists.txt	2012-06-22 16:16:58 UTC (rev 48201)
@@ -34,6 +34,7 @@
 	../makesdna
 	../makesrna
 	../windowmanager
+	../imbuf
 	../../../intern/guardedalloc
 )
 

Modified: trunk/blender/source/blender/collada/EffectExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/EffectExporter.cpp	2012-06-22 15:43:51 UTC (rev 48200)
+++ trunk/blender/source/blender/collada/EffectExporter.cpp	2012-06-22 16:16:58 UTC (rev 48201)
@@ -27,6 +27,7 @@
 
 
 #include <map>
+#include <set>
 
 #include "COLLADASWEffectProfile.h"
 
@@ -39,6 +40,8 @@
 #include "DNA_world_types.h"
 
 #include "BKE_customdata.h"
+#include "BKE_mesh.h"
+#include "BKE_material.h"
 
 #include "collada_internal.h"
 #include "collada_utils.h"
@@ -118,6 +121,54 @@
 	ep.setSpecular(cot, false, "specular");
 }
 
+void EffectsExporter::writeTextures(COLLADASW::EffectProfile &ep,
+									std::string &key,
+									COLLADASW::Sampler *sampler, 
+									MTex *t, Image *ima,
+									std::string &uvname ) {
+		
+	// Image not set for texture
+	if (!ima) return;
+
+	// color
+	if (t->mapto & (MAP_COL | MAP_COLSPEC)) {
+		ep.setDiffuse(createTexture(ima, uvname, sampler), false, "diffuse");
+	}
+	// ambient
+	if (t->mapto & MAP_AMB) {
+		ep.setAmbient(createTexture(ima, uvname, sampler), false, "ambient");
+	}
+	// specular
+	if (t->mapto & MAP_SPEC) {
+		ep.setSpecular(createTexture(ima, uvname, sampler), false, "specular");
+	}
+	// emission
+	if (t->mapto & MAP_EMIT) {
+		ep.setEmission(createTexture(ima, uvname, sampler), false, "emission");
+	}
+	// reflective
+	if (t->mapto & MAP_REF) {
+		ep.setReflective(createTexture(ima, uvname, sampler));
+	}
+	// alpha
+	if (t->mapto & MAP_ALPHA) {
+		ep.setTransparent(createTexture(ima, uvname, sampler));
+	}
+	// extension:
+	// Normal map --> Must be stored with <extra> tag as different technique, 
+	// since COLLADA doesn't support normal maps, even in current COLLADA 1.5.
+	if (t->mapto & MAP_NORM) {
+		COLLADASW::Texture texture(key);
+		texture.setTexcoord(uvname);
+		texture.setSampler(*sampler);
+		// technique FCOLLADA, with the <bump> tag, is most likely the best understood,
+		// most widespread de-facto standard.
+		texture.setProfileName("FCOLLADA");
+		texture.setChildElementName("bump");
+		ep.addExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture));
+	}
+}
+
 void EffectsExporter::operator()(Material *ma, Object *ob)
 {
 	// create a list of indices to textures of type TEX_IMAGE
@@ -256,6 +307,52 @@
 		}
 	}
 
+
+	std::set<Image *> uv_textures;
+	if (ob->type == OB_MESH && ob->totcol) {
+		Mesh *me     = (Mesh *) ob->data;
+		BKE_mesh_tessface_ensure(me);
+		for (int i = 0; i < me->pdata.totlayer; i++) {
+			if (me->pdata.layers[i].type == CD_MTEXPOLY) {
+				MTexPoly *txface = (MTexPoly *)me->pdata.layers[i].data;
+				MFace *mface = me->mface;
+				for (int j = 0; j < me->totpoly; j++, mface++, txface++) {
+
+					Material *mat = give_current_material(ob, mface->mat_nr + 1);
+					if (mat != ma) 
+						continue;
+
+					Image *ima = txface->tpage;
+					if (ima == NULL)
+						continue;
+
+
+					bool not_in_list = uv_textures.find(ima)==uv_textures.end();
+					if (not_in_list) {
+						std::string name = id_name(ima);
+						std::string key(name);
+						key = translate_id(key);
+
+						// create only one <sampler>/<surface> pair for each unique image
+						if (im_samp_map.find(key) == im_samp_map.end()) {
+							//<newparam> <sampler> <source>
+							COLLADASW::Sampler sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D,
+													   key + COLLADASW::Sampler::SAMPLER_SID_SUFFIX,
+													   key + COLLADASW::Sampler::SURFACE_SID_SUFFIX);
+							sampler.setImageId(key);
+							samplers[a] = sampler;
+							samp_surf[b][0] = &samplers[a];
+							im_samp_map[key] = b;
+							b++;
+							a++;
+							uv_textures.insert(ima);
+						}
+					}
+				}
+			}
+		}
+	}
+
 	// used as fallback when MTex->uvname is "" (this is pretty common)
 	// it is indeed the correct value to use in that case
 	std::string active_uv(getActiveUVLayerName(ob));
@@ -265,58 +362,25 @@
 	for (a = 0; a < tex_indices.size(); a++) {
 		MTex *t = ma->mtex[tex_indices[a]];
 		Image *ima = t->tex->ima;
-		
-		// Image not set for texture
-		if (!ima) continue;
 
-		// we assume map input is always TEXCO_UV
+		std::string key(id_name(ima));
+		key = translate_id(key);
+		int i = im_samp_map[key];
+		std::string uvname = strlen(t->uvname) ? t->uvname : active_uv;
+		COLLADASW::Sampler *sampler = (COLLADASW::Sampler *)samp_surf[i][0];
+		writeTextures(ep, key, sampler, t, ima, uvname);
+	}
 
+	std::set<Image *>::iterator uv_t_iter;
+	for(uv_t_iter = uv_textures.begin(); uv_t_iter != uv_textures.end(); uv_t_iter++ ) {
+		Image *ima = *uv_t_iter;
 		std::string key(id_name(ima));
 		key = translate_id(key);
 		int i = im_samp_map[key];
 		COLLADASW::Sampler *sampler = (COLLADASW::Sampler *)samp_surf[i][0];
-		//COLLADASW::Surface *surface = (COLLADASW::Surface*)samp_surf[i][1];
+		ep.setDiffuse(createTexture(ima, active_uv, sampler), false, "diffuse");
+	}
 
-		std::string uvname = strlen(t->uvname) ? t->uvname : active_uv;
-
-		// color
-		if (t->mapto & (MAP_COL | MAP_COLSPEC)) {
-			ep.setDiffuse(createTexture(ima, uvname, sampler), false, "diffuse");
-		}
-		// ambient
-		if (t->mapto & MAP_AMB) {
-			ep.setAmbient(createTexture(ima, uvname, sampler), false, "ambient");
-		}
-		// specular
-		if (t->mapto & MAP_SPEC) {
-			ep.setSpecular(createTexture(ima, uvname, sampler), false, "specular");
-		}
-		// emission
-		if (t->mapto & MAP_EMIT) {
-			ep.setEmission(createTexture(ima, uvname, sampler), false, "emission");
-		}
-		// reflective
-		if (t->mapto & MAP_REF) {
-			ep.setReflective(createTexture(ima, uvname, sampler));
-		}
-		// alpha
-		if (t->mapto & MAP_ALPHA) {
-			ep.setTransparent(createTexture(ima, uvname, sampler));
-		}
-		// extension:
-		// Normal map --> Must be stored with <extra> tag as different technique, 
-		// since COLLADA doesn't support normal maps, even in current COLLADA 1.5.
-		if (t->mapto & MAP_NORM) {
-			COLLADASW::Texture texture(key);
-			texture.setTexcoord(uvname);
-			texture.setSampler(*sampler);
-			// technique FCOLLADA, with the <bump> tag, is most likely the best understood,
-			// most widespread de-facto standard.
-			texture.setProfileName("FCOLLADA");
-			texture.setChildElementName("bump");
-			ep.addExtraTechniqueColorOrTexture(COLLADASW::ColorOrTexture(texture));
-		}
-	}
 	// performs the actual writing
 	ep.addProfileElements();
 	bool twoSided = false;

Modified: trunk/blender/source/blender/collada/EffectExporter.h
===================================================================
--- trunk/blender/source/blender/collada/EffectExporter.h	2012-06-22 15:43:51 UTC (rev 48200)
+++ trunk/blender/source/blender/collada/EffectExporter.h	2012-06-22 16:16:58 UTC (rev 48201)
@@ -64,7 +64,12 @@
 	void writeBlinn(COLLADASW::EffectProfile &ep, Material *ma);
 	void writeLambert(COLLADASW::EffectProfile &ep, Material *ma);
 	void writePhong(COLLADASW::EffectProfile &ep, Material *ma);
-	
+	void EffectsExporter::writeTextures(COLLADASW::EffectProfile &ep,
+			std::string &key,
+			COLLADASW::Sampler *sampler, 
+			MTex *t, Image *ima,
+			std::string &uvname );
+
 	bool hasEffects(Scene *sce);
 	
 	const ExportSettings *export_settings;

Modified: trunk/blender/source/blender/collada/ExportSettings.h
===================================================================
--- trunk/blender/source/blender/collada/ExportSettings.h	2012-06-22 15:43:51 UTC (rev 48200)
+++ trunk/blender/source/blender/collada/ExportSettings.h	2012-06-22 16:16:58 UTC (rev 48201)
@@ -33,13 +33,20 @@
 public:
 	bool apply_modifiers;
 	BC_export_mesh_type export_mesh_type;
+
 	bool selected;
 	bool include_children;
 	bool include_armatures;
 	bool deform_bones_only;
+
+	bool active_uv_only;
+	bool include_uv_textures;
+	bool use_texture_copies;
+
 	bool use_object_instantiation;
 	bool sort_by_name;
 	bool second_life;
+
 	char *filepath;
 	LinkNode *export_set;
 };

Modified: trunk/blender/source/blender/collada/GeometryExporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/GeometryExporter.cpp	2012-06-22 15:43:51 UTC (rev 48200)
+++ trunk/blender/source/blender/collada/GeometryExporter.cpp	2012-06-22 16:16:58 UTC (rev 48201)
@@ -261,8 +261,9 @@
 		
 	// sets material name
 	if (ma) {
+		std::string material_id = get_material_id(ma);
 		std::ostringstream ostr;
-		ostr << translate_id(id_name(ma));
+		ostr << translate_id(material_id);
 		polylist.setMaterial(ostr.str());
 	}
 			
@@ -436,33 +437,38 @@
 
 	// write <source> for each layer
 	// each <source> will get id like meshName + "map-channel-1"
+	int map_index = 0;
+	int active_uv_index = CustomData_get_active_layer_index(&me->fdata, CD_MTFACE)-1;
 	for (int a = 0; a < num_layers; a++) {
-		MTFace *tface = (MTFace *)CustomData_get_layer_n(&me->fdata, CD_MTFACE, a);
-		// char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, a);
-		
-		COLLADASW::FloatSourceF source(mSW);
-		std::string layer_id = makeTexcoordSourceId(geom_id, a);
-		source.setId(layer_id);
-		source.setArrayId(layer_id + ARRAY_ID_SUFFIX);
-		
-		source.setAccessorCount(totuv);
-		source.setAccessorStride(2);
-		COLLADASW::SourceBase::ParameterNameList &param = source.getParameterNameList();
-		param.push_back("S");
-		param.push_back("T");
-		
-		source.prepareToAppendValues();
-		
-		for (i = 0; i < totfaces; i++) {
-			MFace *f = &mfaces[i];
+
+		if (!this->export_settings->active_uv_only || a == active_uv_index) {

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list