diff options
author | Gaia Clary <gaia.clary@machinimatrix.org> | 2019-06-03 17:34:47 +0300 |
---|---|---|
committer | Gaia Clary <gaia.clary@machinimatrix.org> | 2019-06-03 17:35:01 +0300 |
commit | 97e53d2385cd0b72add07bff4df1f8bc660f51fb (patch) | |
tree | 1bc4d0f35e7402d9ef701b66b145a9dfe79c7bb2 /source/blender/collada | |
parent | 1f650c402d3b43eee7cb51c7d4f373ba82ac2116 (diff) |
fix collada: get Alpha and Emission from principled BSDF Shader
Diffstat (limited to 'source/blender/collada')
-rw-r--r-- | source/blender/collada/EffectExporter.cpp | 13 | ||||
-rw-r--r-- | source/blender/collada/collada_utils.cpp | 46 | ||||
-rw-r--r-- | source/blender/collada/collada_utils.h | 10 |
3 files changed, 58 insertions, 11 deletions
diff --git a/source/blender/collada/EffectExporter.cpp b/source/blender/collada/EffectExporter.cpp index 676d939e8f5..a45cdccecf3 100644 --- a/source/blender/collada/EffectExporter.cpp +++ b/source/blender/collada/EffectExporter.cpp @@ -101,14 +101,8 @@ void EffectsExporter::set_shader_type(COLLADASW::EffectProfile &ep, Material *ma void EffectsExporter::set_transparency(COLLADASW::EffectProfile &ep, Material *ma) { - COLLADASW::ColorOrTexture cot = bc_get_base_color(ma); - float transparency = cot.getColor().getAlpha(); - if (transparency < 1) { - // Tod: because we are in A_ONE mode transparency is calculated like this: - COLLADASW::ColorOrTexture cot = getcol(1.0f, 1.0f, 1.0f, transparency); - ep.setTransparent(cot); - ep.setOpaque(COLLADASW::EffectProfile::A_ONE); - } + double alpha = bc_get_alpha(ma); + ep.setTransparency(alpha, false, "alpha"); } void EffectsExporter::set_diffuse_color(COLLADASW::EffectProfile &ep, Material *ma) { @@ -125,7 +119,8 @@ void EffectsExporter::set_reflectivity(COLLADASW::EffectProfile &ep, Material *m void EffectsExporter::set_emission(COLLADASW::EffectProfile &ep, Material *ma) { - // not yet supported (needs changes in principled shader + COLLADASW::ColorOrTexture cot = bc_get_emission(ma); + ep.setEmission(cot, false, "emission"); } void EffectsExporter::get_images(Material *ma, KeyImageMap &material_image_map) diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index e42ceda7da8..976a3c0edf3 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -1343,6 +1343,31 @@ COLLADASW::ColorOrTexture bc_get_base_color(bNode *shader) } } +COLLADASW::ColorOrTexture bc_get_emission(Material *ma) +{ + bNode *master_shader = bc_get_master_shader(ma); + if (ma->use_nodes && master_shader) { + return bc_get_emission(master_shader); + } + else { + return bc_get_cot(0, 0, 0, 1); /* default black */ + } +} + +COLLADASW::ColorOrTexture bc_get_emission(bNode *shader) +{ + bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, "Emission"); + if (socket) { + bNodeSocketValueRGBA *dcol = (bNodeSocketValueRGBA *)socket->default_value; + float *col = dcol->value; + return bc_get_cot(col[0], col[1], col[2], col[3]); + } + else { + return bc_get_cot(0, 0, 0, 1); /* default black */ + } +} + + bool bc_get_reflectivity(bNode *shader, double &reflectivity) { bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, "Specular"); @@ -1354,6 +1379,27 @@ bool bc_get_reflectivity(bNode *shader, double &reflectivity) return false; } +double bc_get_alpha(Material *ma) +{ + double alpha = ma->a; /* fallback if no socket found */ + bNode *master_shader = bc_get_master_shader(ma); + if (ma->use_nodes && master_shader) { + bc_get_alpha(master_shader, alpha); + } + return alpha; +} + +bool bc_get_alpha(bNode *shader, double &alpha) +{ + bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, "Alpha"); + if (socket) { + bNodeSocketValueFloat *ref = (bNodeSocketValueFloat *)socket->default_value; + alpha = (double)ref->value; + return true; + } + return false; +} + double bc_get_reflectivity(Material *ma) { double reflectivity = ma->spec; /* fallback if no socket found */ diff --git a/source/blender/collada/collada_utils.h b/source/blender/collada/collada_utils.h index e142d4c77db..7836b1ede86 100644 --- a/source/blender/collada/collada_utils.h +++ b/source/blender/collada/collada_utils.h @@ -385,9 +385,15 @@ class BoneExtensionManager { 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(Material *ma); COLLADASW::ColorOrTexture bc_get_base_color(bNode *shader); -bool bc_get_reflectivity(bNode *shader, double &reflectivity); +COLLADASW::ColorOrTexture bc_get_emission(Material *ma); +COLLADASW::ColorOrTexture bc_get_emission(bNode *shader); + double bc_get_reflectivity(Material *ma); -COLLADASW::ColorOrTexture bc_get_base_color(Material *ma); +bool bc_get_reflectivity(bNode *shader, double &emission); +double bc_get_alpha(Material *ma); +bool bc_get_alpha(bNode *shader, double &alpha); #endif |