From 417e99df22241d05179671d2f7198343c60d118b Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Wed, 15 Aug 2012 22:08:22 +0000 Subject: [PATCH] Collada: fixed export when 'active UV Layer only' was selected --- source/blender/collada/EffectExporter.cpp | 62 +++++++++++---------- source/blender/collada/GeometryExporter.cpp | 19 ++++--- source/blender/collada/ImageExporter.cpp | 26 +++++---- source/blender/collada/InstanceWriter.cpp | 2 +- 4 files changed, 62 insertions(+), 47 deletions(-) diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp index 2d9ccc3e3ef..dd59fb9fb91 100644 --- a/source/blender/collada/EffectExporter.cpp +++ b/source/blender/collada/EffectExporter.cpp @@ -313,42 +313,48 @@ void EffectsExporter::operator()(Material *ma, Object *ob) std::set uv_textures; if (ob->type == OB_MESH && ob->totcol && this->export_settings->include_uv_textures) { + bool active_uv_only = this->export_settings->active_uv_only; Mesh *me = (Mesh *) ob->data; + int active_uv_layer = CustomData_get_active_layer_index(&me->pdata, CD_MTEXPOLY); + 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++) { + if (!active_uv_only || active_uv_layer == 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; + Material *mat = give_current_material(ob, mface->mat_nr + 1); + if (mat != ma) + continue; - Image *ima = txface->tpage; - if (ima == NULL) - 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); + 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 / pair for each unique image - if (im_samp_map.find(key) == im_samp_map.end()) { - // - 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); + // create only one / pair for each unique image + if (im_samp_map.find(key) == im_samp_map.end()) { + // + 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); + } } } } diff --git a/source/blender/collada/GeometryExporter.cpp b/source/blender/collada/GeometryExporter.cpp index 29ffcf53ee9..c7ad2ff3975 100644 --- a/source/blender/collada/GeometryExporter.cpp +++ b/source/blender/collada/GeometryExporter.cpp @@ -279,15 +279,18 @@ void GeometryExporter::createPolylist(short material_index, // if mesh has uv coords writes for TEXCOORD int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE); - + int active_uv_index = CustomData_get_active_layer_index(&me->fdata, CD_MTFACE)-1; for (i = 0; i < num_layers; i++) { - // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i); - COLLADASW::Input input3(COLLADASW::InputSemantic::TEXCOORD, - makeUrl(makeTexcoordSourceId(geom_id, i)), - 2, // offset always 2, this is only until we have optimized UV sets - i // set number equals UV map index - ); - til.push_back(input3); + if (!this->export_settings->active_uv_only || i == active_uv_index) { + + // char *name = CustomData_get_layer_name(&me->fdata, CD_MTFACE, i); + COLLADASW::Input input3(COLLADASW::InputSemantic::TEXCOORD, + makeUrl(makeTexcoordSourceId(geom_id, i)), + 2, // offset always 2, this is only until we have optimized UV sets + i // set number equals UV map index + ); + til.push_back(input3); + } } if (has_color) { diff --git a/source/blender/collada/ImageExporter.cpp b/source/blender/collada/ImageExporter.cpp index 206dc09fe8b..66dcec7d8e4 100644 --- a/source/blender/collada/ImageExporter.cpp +++ b/source/blender/collada/ImageExporter.cpp @@ -151,25 +151,31 @@ void ImagesExporter::export_UV_Images() { std::set uv_textures; LinkNode *node; - bool use_copies = this->export_settings->use_texture_copies; + bool use_texture_copies = this->export_settings->use_texture_copies; + bool active_uv_only = this->export_settings->active_uv_only; + for (node = this->export_settings->export_set; node; node = node->next) { Object *ob = (Object *)node->link; if (ob->type == OB_MESH && ob->totcol) { Mesh *me = (Mesh *) ob->data; BKE_mesh_tessface_ensure(me); + int active_uv_layer = CustomData_get_active_layer_index(&me->pdata, CD_MTEXPOLY); 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; - for (int j = 0; j < me->totpoly; j++, txface++) { + if (!active_uv_only || active_uv_layer == i) + { + MTexPoly *txface = (MTexPoly *)me->pdata.layers[i].data; + for (int j = 0; j < me->totpoly; j++, txface++) { - Image *ima = txface->tpage; - if (ima == NULL) - continue; + Image *ima = txface->tpage; + if (ima == NULL) + continue; - bool not_in_list = uv_textures.find(ima) == uv_textures.end(); - if (not_in_list) { - uv_textures.insert(ima); - export_UV_Image(ima, use_copies); + bool not_in_list = uv_textures.find(ima) == uv_textures.end(); + if (not_in_list) { + uv_textures.insert(ima); + export_UV_Image(ima, use_texture_copies); + } } } } diff --git a/source/blender/collada/InstanceWriter.cpp b/source/blender/collada/InstanceWriter.cpp index be45d5295e5..71371d280df 100644 --- a/source/blender/collada/InstanceWriter.cpp +++ b/source/blender/collada/InstanceWriter.cpp @@ -63,7 +63,7 @@ void InstanceWriter::add_material_bindings(COLLADASW::BindMaterial& bind_materia int active_uv_index = CustomData_get_active_layer_index(&me->fdata, CD_MTFACE) -1; for (int b = 0; b < totlayer; b++) { if (!active_uv_only || b == active_uv_index) { - char *name = bc_CustomData_get_layer_name(&me->fdata, CD_MTFACE, map_index); + char *name = bc_CustomData_get_layer_name(&me->fdata, CD_MTFACE, b); im.push_back(COLLADASW::BindVertexInput(name, "TEXCOORD", map_index++)); } }