[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 ¶m = 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