fix collada: get Alpha and Emission from principled BSDF Shader
This commit is contained in:
parent
1f650c402d
commit
97e53d2385
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue