fix collada: get Alpha and Emission from principled BSDF Shader

This commit is contained in:
Gaia Clary 2019-06-03 16:34:47 +02:00
parent 1f650c402d
commit 97e53d2385
3 changed files with 59 additions and 12 deletions

View File

@ -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)

View File

@ -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 */

View File

@ -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(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_base_color(bNode *shader);
COLLADASW::ColorOrTexture bc_get_emission(Material *ma);
COLLADASW::ColorOrTexture bc_get_emission(bNode *shader);
double bc_get_reflectivity(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