Commit: ddabe465b55980a642b917d11cfc1ec2a27300a5
Author: Gaia Clary
Date:   Sat Jun 24 22:16:32 2017 +0200
Branches: master
https://developer.blender.org/rBddabe465b55980a642b917d11cfc1ec2a27300a5

collada: export UV Textures as materials. Note: the reimport of the exported 
collada files will have materials assigned instead of UV Face Textures! This is 
expected behavior

===================================================================

M       source/blender/collada/DocumentExporter.cpp
M       source/blender/collada/EffectExporter.cpp
M       source/blender/collada/EffectExporter.h
M       source/blender/collada/GeometryExporter.cpp
M       source/blender/collada/ImageExporter.cpp
M       source/blender/collada/InstanceWriter.cpp
M       source/blender/collada/InstanceWriter.h
M       source/blender/collada/MaterialExporter.cpp

===================================================================

diff --git a/source/blender/collada/DocumentExporter.cpp 
b/source/blender/collada/DocumentExporter.cpp
index bd32e989ae3..634071bc90f 100644
--- a/source/blender/collada/DocumentExporter.cpp
+++ b/source/blender/collada/DocumentExporter.cpp
@@ -138,7 +138,8 @@ extern bool bc_has_object_type(LinkNode *export_set, short 
obtype);
 char *bc_CustomData_get_layer_name(const struct CustomData *data, int type, 
int n)
 {
        int layer_index = CustomData_get_layer_index(data, type);
-       if (layer_index < 0) return NULL;
+       if (layer_index < 0)
+               return NULL;
 
        return data->layers[layer_index + n].name;
 }
@@ -147,9 +148,10 @@ char *bc_CustomData_get_active_layer_name(const CustomData 
*data, int type)
 {
        /* get the layer index of the active layer of type */
        int layer_index = CustomData_get_active_layer_index(data, type);
-       if (layer_index < 0) return NULL;
+       if (layer_index < 1)
+               return NULL;
 
-       return data->layers[layer_index].name;
+       return bc_CustomData_get_layer_name(data, type, layer_index-1);
 }
 
 DocumentExporter::DocumentExporter(const ExportSettings *export_settings) : 
export_settings(export_settings) {
diff --git a/source/blender/collada/EffectExporter.cpp 
b/source/blender/collada/EffectExporter.cpp
index 4ce88d96888..e0c81cfc54b 100644
--- a/source/blender/collada/EffectExporter.cpp
+++ b/source/blender/collada/EffectExporter.cpp
@@ -27,7 +27,6 @@
 
 
 #include <map>
-#include <set>
 
 #include "COLLADASWEffectProfile.h"
 #include "COLLADAFWColorOrTexture.h"
@@ -49,21 +48,10 @@ extern "C" {
        #include "BKE_material.h"
 }
 
-// OB_MESH is assumed
-static std::string getActiveUVLayerName(Object *ob)
-{
-       Mesh *me = (Mesh *)ob->data;
-
-       int num_layers = CustomData_number_of_layers(&me->fdata, CD_MTFACE);
-       if (num_layers)
-               return 
std::string(bc_CustomData_get_active_layer_name(&me->fdata, CD_MTFACE));
-               
-       return "";
-}
-
 EffectsExporter::EffectsExporter(COLLADASW::StreamWriter *sw, const 
ExportSettings *export_settings) : COLLADASW::LibraryEffects(sw), 
export_settings(export_settings) {
 }
 
+
 bool EffectsExporter::hasEffects(Scene *sce)
 {
        Base *base = (Base *)sce->base.first;
@@ -86,13 +74,49 @@ bool EffectsExporter::hasEffects(Scene *sce)
 
 void EffectsExporter::exportEffects(Scene *sce)
 {
-       if (hasEffects(sce)) {
-               this->scene = sce;
-               openLibrary();
-               MaterialFunctor mf;
-               mf.forEachMaterialInExportSet<EffectsExporter>(sce, *this, 
this->export_settings->export_set);
-
-               closeLibrary();
+       this->scene = sce;
+       
+       if (this->export_settings->export_texture_type == BC_TEXTURE_TYPE_MAT) {
+               if (hasEffects(sce)) {
+                               MaterialFunctor mf;
+                               openLibrary();
+                               
mf.forEachMaterialInExportSet<EffectsExporter>(sce, *this, 
this->export_settings->export_set);
+                               closeLibrary();
+               }
+       }
+       else if (this->export_settings->export_texture_type == 
BC_TEXTURE_TYPE_UV) {
+               std::set<Object *> uv_textured_obs = 
bc_getUVTexturedObjects(sce, !this->export_settings->active_uv_only);
+               std::set<Image *> uv_images = bc_getUVImages(sce, 
!this->export_settings->active_uv_only);
+               if (uv_images.size() > 0) {
+                       openLibrary();
+                       std::set<Image *>::iterator uv_images_iter;
+                       for (uv_images_iter = uv_images.begin();
+                               uv_images_iter != uv_images.end();
+                               uv_images_iter++) {
+
+                               Image *ima = *uv_images_iter;
+                               std::string key(id_name(ima));
+                               key = translate_id(key);
+                               COLLADASW::Sampler 
sampler(COLLADASW::Sampler::SAMPLER_TYPE_2D,
+                                       key + 
COLLADASW::Sampler::SAMPLER_SID_SUFFIX,
+                                       key + 
COLLADASW::Sampler::SURFACE_SID_SUFFIX);
+                               sampler.setImageId(key);
+
+                               openEffect(key + "-effect");
+                               COLLADASW::EffectProfile ep(mSW);
+                               
ep.setProfileType(COLLADASW::EffectProfile::COMMON);
+                               
ep.setShaderType(COLLADASW::EffectProfile::PHONG);
+                               ep.setDiffuse(createTexture(ima, key, 
&sampler), false, "diffuse");
+                               COLLADASW::ColorOrTexture cot = getcol(0, 0, 0, 
1.0f);
+                               ep.setSpecular(cot, false, "specular");
+                               ep.openProfile();
+                               ep.addProfileElements();
+                               ep.addExtraTechniques(mSW);
+                               ep.closeProfile();
+                               closeEffect();
+                       }
+                       closeLibrary();
+               }
        }
 }
 
@@ -172,6 +196,18 @@ void 
EffectsExporter::writeTextures(COLLADASW::EffectProfile &ep,
        }
 }
 
+void EffectsExporter::exportUVMats(Object *ob)
+{
+       std::vector<int> tex_indices;
+       int active_uv_layer = -1;
+       std::set<Image *> uv_textures;
+       if (ob->type == OB_MESH && ob->totcol && 
this->export_settings->export_texture_type == BC_TEXTURE_TYPE_UV) {
+               bool active_uv_only = this->export_settings->active_uv_only;
+               Mesh *me = (Mesh *)ob->data;
+               active_uv_layer = CustomData_get_active_layer_index(&me->pdata, 
CD_MTEXPOLY);
+       }
+}
+
 void EffectsExporter::operator()(Material *ma, Object *ob)
 {
        // create a list of indices to textures of type TEX_IMAGE
@@ -365,7 +401,7 @@ void EffectsExporter::operator()(Material *ma, Object *ob)
 
        // 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));
+       std::string active_uv(bc_get_active_uvlayer_name(ob));
 
        // write textures
        // XXX very slow
@@ -385,16 +421,18 @@ void EffectsExporter::operator()(Material *ma, Object *ob)
                writeTextures(ep, key, sampler, t, ima, uvname);
        }
 
-       std::set<Image *>::iterator uv_t_iter;
-       int idx;
-       for (idx = 0, uv_t_iter = uv_textures.begin(); uv_t_iter != 
uv_textures.end(); uv_t_iter++, idx++ ) {
-               if (active_uv_layer>-1 && idx==active_uv_layer) {
+       if (active_uv_layer > -1) {
+               // Export only UV textures assigned to active UV Layer (sounds 
reasonable, but is that correct?)
+               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];
                        ep.setDiffuse(createTexture(ima, active_uv, sampler), 
false, "diffuse");
+                       ep.setShaderType(COLLADASW::EffectProfile::PHONG);
                }
        }
 
diff --git a/source/blender/collada/EffectExporter.h 
b/source/blender/collada/EffectExporter.h
index d20cbfdfe0b..b11699b56e2 100644
--- a/source/blender/collada/EffectExporter.h
+++ b/source/blender/collada/EffectExporter.h
@@ -47,6 +47,8 @@ class EffectsExporter: COLLADASW::LibraryEffects
 {
 public:
        EffectsExporter(COLLADASW::StreamWriter *sw, const ExportSettings 
*export_settings);
+       void EffectsExporter::exportUVMats(Object *ob);
+
        void exportEffects(Scene *sce);
 
        void operator()(Material *ma, Object *ob);
diff --git a/source/blender/collada/GeometryExporter.cpp 
b/source/blender/collada/GeometryExporter.cpp
index 2ba0ccc827c..db3b8a62c33 100644
--- a/source/blender/collada/GeometryExporter.cpp
+++ b/source/blender/collada/GeometryExporter.cpp
@@ -135,13 +135,15 @@ void GeometryExporter::operator()(Object *ob)
        // Only create Polylists if number of faces > 0
        if (me->totface > 0) {
                // XXX slow
-               if (ob->totcol) {
+               if (ob->totcol && this->export_settings->export_texture_type == 
BC_TEXTURE_TYPE_MAT) {
                        for (int a = 0; a < ob->totcol; a++) {
                                createPolylist(a, has_uvs, has_color, ob, me, 
geom_id, norind);
                        }
                }
                else {
-                       createPolylist(0, has_uvs, has_color, ob, me, geom_id, 
norind);
+                       bool all_uv_layers = 
!this->export_settings->active_uv_only;
+                       std::set<Image *> uv_images = bc_getUVImages(ob, 
all_uv_layers);
+                       createPolylists(uv_images, has_uvs, has_color, ob, me, 
geom_id, norind);
                }
        }
        
@@ -221,13 +223,15 @@ void GeometryExporter::export_key_mesh(Object *ob, Mesh 
*me, KeyBlock *kb)
        //createLooseEdgeList(ob, me, geom_id, norind);
 
        // XXX slow             
-       if (ob->totcol) {
+       if (ob->totcol && this->export_settings->export_texture_type == 
BC_TEXTURE_TYPE_MAT) {
                for (int a = 0; a < ob->totcol; a++) {
                        createPolylist(a, has_uvs, has_color, ob, me, geom_id, 
norind);
                }
        }
        else {
-               createPolylist(0, has_uvs, has_color, ob, me, geom_id, norind);
+               bool all_uv_layers = !this->export_settings->active_uv_only;
+               std::set<Image *> uv_images = bc_getUVImages(ob, all_uv_layers);
+               createPolylists(uv_images, has_uvs, has_color, ob, me, geom_id, 
norind);
        }
        
        closeMesh();
@@ -296,7 +300,8 @@ std::string 
GeometryExporter::makeVertexColorSourceId(std::string& geom_id, char
        return result;
 }
 
-// powerful because it handles both cases when there is material and when 
there's not
+
+// Export meshes with Materials
 void GeometryExporter::createPolylist(short material_index,
                                       bool has_uvs,
                                       bool has_color,
@@ -361,13 +366,21 @@ void GeometryExporter::createPolylist(short 
material_index,
        int active_uv_index = CustomData_get_active_layer_index(&me->fdata, 
CD_MTFACE)-1;
        for (i = 0; i < num_layers; i++) {
                if (!this->export_settings->active_uv_only || i == 
active_uv_index) {
+                       
+                       std::string uv_name(bc_get_uvlayer_name(me, i));
+                       std::string effective_id = geom_id; // (uv_name == "") 
? geom_id : uv_name;
+                       std::string layer_id = makeTexcoordSourceId(
+                               effective_id,
+                               i, this->export_settings->active_uv_only);
 
-                       // char *name = CustomData_get_layer_name(&me->fdata, 
CD_MTFACE, i);
+                       /* Note: the third parameter denotes the offset of 
TEXCOORD in polylist elements
+                          For now this is always 2 (This may change 
sometime/maybe) 
+                       */
                        COLLADASW::Input 
input3(COLLADASW::InputSemantic::TEXCOORD,
-                                                                       
makeUrl(makeTexcoordSourceId(geom_id, i, 
this->export_settings->active_uv_only)),
-                                                                       2, // 
this is only until we have optimized UV sets
-                                                                       
(this->export_settings->active_uv_only) ? 0 : i  // only_active_uv exported -> 
we have only one set
-                                                                       );
+                               makeUrl(layer_id),
+                               2, // this is only until we have optimized UV 
sets
+                               (this->export_settings->active_uv_only) ? 0 : i 
 // only_active_uv exported -> we have only one set
+                               );
                        til.push_back(input3);
                }
        }
@@ -697,7 +710,13 @@ void GeometryExporter::createTexcoordsSource(std::string 
geom_id, Mesh *me)
                        MLoopUV *mloops = (MLoopUV 
*)CustomData_get_layer_n(&me->ldata, CD_MLOOPUV, a);
                        
                        COLLADASW::FloatSourceF source(mSW);
-                       std::string layer_id = makeTexcoordSourceId(geom_id, a, 

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to