fix D4476 collada exporter: in Blender 2.80 we no longer have a specular color.
authorGaia Clary <gaia.clary@machinimatrix.org>
Thu, 7 Mar 2019 22:26:10 +0000 (23:26 +0100)
committerGaia Clary <gaia.clary@machinimatrix.org>
Thu, 7 Mar 2019 22:26:10 +0000 (23:26 +0100)
Specularity is not a color but a factor.
I have replaced the original export code with
a correct export of the Specularity factor.

source/blender/collada/EffectExporter.cpp
source/blender/collada/EffectExporter.h
source/blender/collada/collada_utils.cpp
source/blender/collada/collada_utils.h

index b2bf09665ca0d7f9dff9e028180794dd7b75c028..3494cdbada4bf64e65a32a0e139714a8ab808b55 100644 (file)
@@ -114,11 +114,10 @@ void EffectsExporter::set_diffuse_color(COLLADASW::EffectProfile &ep, Material *
        ep.setDiffuse(cot, false, "diffuse");
 }
 
-void EffectsExporter::set_specular_color(COLLADASW::EffectProfile &ep, Material *ma)
+void EffectsExporter::set_reflectivity(COLLADASW::EffectProfile &ep, Material *ma)
 {
-       bool use_fallback = ep.getShaderType() != COLLADASW::EffectProfile::LAMBERT;
-       COLLADASW::ColorOrTexture cot = bc_get_specular_color(ma, use_fallback);
-       ep.setSpecular(cot, false, "specular");
+       double reflectivity = bc_get_reflectivity(ma);
+       ep.setReflectivity(reflectivity, false, "specular");
 }
 
 void EffectsExporter::set_emission(COLLADASW::EffectProfile &ep, Material *ma)
@@ -182,7 +181,7 @@ void EffectsExporter::operator()(Material *ma, Object *ob)
 
        set_transparency(ep, ma);
        set_diffuse_color(ep, ma);
-       set_specular_color(ep, ma);
+       set_reflectivity(ep, ma);
        set_emission(ep, ma);
 
        get_images(ma, material_image_map);
index 1928c5cbdb514fd1f226108090df24e05634109b..3ba642088a15b33bdfffda6efe4edea9bab7ae12 100644 (file)
@@ -55,7 +55,7 @@ private:
        void set_shader_type(COLLADASW::EffectProfile &ep, Material *ma);
        void set_transparency(COLLADASW::EffectProfile &ep, Material *ma);
        void set_diffuse_color(COLLADASW::EffectProfile &ep, Material *ma);
-       void set_specular_color(COLLADASW::EffectProfile &ep, Material *ma);
+       void set_reflectivity(COLLADASW::EffectProfile &ep, Material *ma);
        void set_emission(COLLADASW::EffectProfile &ep, Material *ma);
        void get_images(Material *ma, KeyImageMap &uid_image_map);
        void create_image_samplers(COLLADASW::EffectProfile &ep, KeyImageMap &uid_image_map, std::string &active_uv);
index 37a4608fe297799f3a427d04573bc0929c6d20b9..faf00cf11d8b9975aad56df533540b432af0f71d 100644 (file)
@@ -1362,20 +1362,6 @@ COLLADASW::ColorOrTexture bc_get_base_color(Material *ma)
        }
 }
 
-COLLADASW::ColorOrTexture bc_get_specular_color(Material *ma, bool use_fallback)
-{
-       bNode *master_shader = bc_get_master_shader(ma);
-       if (ma->use_nodes && master_shader) {
-               return bc_get_specular_color(master_shader);
-       }
-       else if (use_fallback) {
-               return bc_get_cot(ma->specr * ma->spec, ma->specg * ma->spec, ma->specb * ma->spec, 1.0f);
-       }
-       else {
-               return bc_get_cot(0.0, 0.0, 0.0, 1.0); // no specular
-       }
-}
-
 COLLADASW::ColorOrTexture bc_get_base_color(bNode *shader)
 {
        bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, "Base Color");
@@ -1390,18 +1376,25 @@ COLLADASW::ColorOrTexture bc_get_base_color(bNode *shader)
        }
 }
 
-COLLADASW::ColorOrTexture bc_get_specular_color(bNode *shader)
+bool bc_get_reflectivity(bNode *shader, double &reflectivity)
 {
        bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, "Specular");
-       if (socket)
-       {
-               bNodeSocketValueRGBA *dcol = (bNodeSocketValueRGBA *)socket->default_value;
-               float* col = dcol->value;
-               return bc_get_cot(col[0], col[1], col[2], col[3]);
+       if (socket) {
+               bNodeSocketValueFloat *ref = (bNodeSocketValueFloat *)socket->default_value;
+               reflectivity = (double)ref->value;
+               return true;
        }
-       else {
-               return bc_get_cot(0.8, 0.8, 0.8, 1.0); //default white
+       return false;
+}
+
+double bc_get_reflectivity(Material *ma)
+{
+       double reflectivity = ma->spec; // fallback if no socket found
+       bNode *master_shader = bc_get_master_shader(ma);
+       if (ma->use_nodes && master_shader) {
+               bc_get_reflectivity(master_shader, reflectivity);
        }
+       return reflectivity;
 }
 
 bNode *bc_get_master_shader(Material *ma)
index 32c89cf41e6cbfd73a108c98b255896df21ebb87..b68da4e81543ff94329822709b658b037512490a 100644 (file)
@@ -310,8 +310,8 @@ void bc_add_default_shader(bContext *C, Material *ma);
 bNode *bc_get_master_shader(Material *ma);
 COLLADASW::ColorOrTexture bc_get_cot(float r, float g, float b, float a);
 COLLADASW::ColorOrTexture bc_get_base_color(bNode *shader);
+bool bc_get_reflectivity(bNode *shader, double &reflectivity);
+double bc_get_reflectivity(Material *ma);
 COLLADASW::ColorOrTexture bc_get_base_color(Material *ma);
-COLLADASW::ColorOrTexture bc_get_specular_color(bNode *shader);
-COLLADASW::ColorOrTexture bc_get_specular_color(Material *ma, bool use_fallback);
 
 #endif