[Bf-blender-cvs] [e68ac2827dd] master: fix D4476 collada exporter: in Blender 2.80 we no longer have a specular color.

Gaia Clary noreply at git.blender.org
Thu Mar 7 23:27:35 CET 2019


Commit: e68ac2827dd4f8ad346011a8a408b342e2718707
Author: Gaia Clary
Date:   Thu Mar 7 23:26:10 2019 +0100
Branches: master
https://developer.blender.org/rBe68ac2827dd4f8ad346011a8a408b342e2718707

fix D4476 collada exporter: in Blender 2.80 we no longer have a specular color.

Specularity is not a color but a factor.
I have replaced the original export code with
a correct export of the Specularity factor.

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

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

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

diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp
index b2bf09665ca..3494cdbada4 100644
--- a/source/blender/collada/EffectExporter.cpp
+++ b/source/blender/collada/EffectExporter.cpp
@@ -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);
diff --git a/source/blender/collada/EffectExporter.h b/source/blender/collada/EffectExporter.h
index 1928c5cbdb5..3ba642088a1 100644
--- a/source/blender/collada/EffectExporter.h
+++ b/source/blender/collada/EffectExporter.h
@@ -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);
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp
index 37a4608fe29..faf00cf11d8 100644
--- a/source/blender/collada/collada_utils.cpp
+++ b/source/blender/collada/collada_utils.cpp
@@ -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)
diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h
index 32c89cf41e6..b68da4e8154 100644
--- a/source/blender/collada/collada_utils.h
+++ b/source/blender/collada/collada_utils.h
@@ -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



More information about the Bf-blender-cvs mailing list