diff options
author | Gaia Clary <gaia.clary@machinimatrix.org> | 2019-06-04 15:31:22 +0300 |
---|---|---|
committer | Gaia Clary <gaia.clary@machinimatrix.org> | 2019-06-05 13:42:54 +0300 |
commit | eda377c223cfc0460e3294c95771313f8d4388c3 (patch) | |
tree | d8c7d5d74a74f19b993ad18f09d098f5ed039549 /source/blender/collada/collada_utils.cpp | |
parent | 98cea7edcefa58d5eb7e2350461b8efe33fe7d9e (diff) |
update Collada Importer: reworked export and import of Materials
- added import of transparency and emission into principled BSDF Shader
- added support for importing all default collada material parameters
* diffuse
* emission
* index_of_refraction
* shininess (mapped to BSDF Roughness)
* reflectivity (mapped to BSDF Metallic)
* transparency + transparent mapped to BSDF Alpha)
* ambient (creates unconnected texture node)
* specular (creates unconnected texture node)
* reflective(creates unconnected texture node)
- added support for exporting collada material parameters:
* diffuse
* emission
* index_of_refraction
* shininess (mapped to BSDF Roughness)
* reflectivity (mapped to BSDF Metallic)
* transparency + transparent mapped to BSDF Alpha)
- prepared support for exporting the following parameters
but currently commented out:
* ambient (creates unconnected texture node)
* specular (creates unconnected texture node)
* reflective(creates unconnected texture node)
Problem: For now we only allow export of principled BSDF based
materials. I am not sure from where to get ambient, specular
and reflective as those values are not included in the
principled BSDF Shader (wip).
Diffstat (limited to 'source/blender/collada/collada_utils.cpp')
-rw-r--r-- | source/blender/collada/collada_utils.cpp | 115 |
1 files changed, 70 insertions, 45 deletions
diff --git a/source/blender/collada/collada_utils.cpp b/source/blender/collada/collada_utils.cpp index 50dc1d8d658..dd5611c4bef 100644 --- a/source/blender/collada/collada_utils.cpp +++ b/source/blender/collada/collada_utils.cpp @@ -1321,92 +1321,110 @@ void bc_add_default_shader(bContext *C, Material *ma) COLLADASW::ColorOrTexture bc_get_base_color(Material *ma) { - bNode *master_shader = bc_get_master_shader(ma); - if (ma->use_nodes && master_shader) { - return bc_get_base_color(master_shader); + Color default_color = {0.8, 0.8, 0.8, 1.0}; + bNode *shader = bc_get_master_shader(ma); + if (ma->use_nodes && shader) { + return bc_get_cot_from_shader(shader, "Base Color", default_color); } else { - return bc_get_cot(ma->r, ma->g, ma->b, ma->a); + return bc_get_cot(default_color); } } -COLLADASW::ColorOrTexture bc_get_base_color(bNode *shader) +COLLADASW::ColorOrTexture bc_get_emission(Material *ma) { - bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, "Base Color"); - if (socket) { - bNodeSocketValueRGBA *dcol = (bNodeSocketValueRGBA *)socket->default_value; - float *col = dcol->value; - return bc_get_cot(col[0], col[1], col[2], col[3]); + Color default_color = {0, 0, 0, 1}; + bNode *shader = bc_get_master_shader(ma); + if (ma->use_nodes && shader) { + return bc_get_cot_from_shader(shader, "Emission", default_color); } else { - return bc_get_cot(0.8, 0.8, 0.8, 1.0); /* default white */ + return bc_get_cot(default_color); /* default black */ } } -COLLADASW::ColorOrTexture bc_get_emission(Material *ma) +COLLADASW::ColorOrTexture bc_get_ambient(Material *ma) +{ + Color default_color = {0, 0, 0, 1.0}; + return bc_get_cot(default_color); +} + +COLLADASW::ColorOrTexture bc_get_specular(Material *ma) +{ + Color default_color = {0, 0, 0, 1.0}; + return bc_get_cot(default_color); +} + +COLLADASW::ColorOrTexture bc_get_reflective(Material *ma) +{ + Color default_color = {0, 0, 0, 1.0}; + return bc_get_cot(default_color); +} + +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) { - return bc_get_emission(master_shader); - } - else { - return bc_get_cot(0, 0, 0, 1); /* default black */ + bc_get_float_from_shader(master_shader, alpha, "Alpha"); } + return alpha; } -COLLADASW::ColorOrTexture bc_get_emission(bNode *shader) +double bc_get_ior(Material *ma) { - 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 */ + double ior = -1; /* fallback if no socket found */ + bNode *master_shader = bc_get_master_shader(ma); + if (ma->use_nodes && master_shader) { + bc_get_float_from_shader(master_shader, ior, "IOR"); } + return ior; } -bool bc_get_reflectivity(bNode *shader, double &reflectivity) +double bc_get_shininess(Material *ma) { - bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, "Specular"); - if (socket) { - bNodeSocketValueFloat *ref = (bNodeSocketValueFloat *)socket->default_value; - reflectivity = (double)ref->value; - return true; + double ior = -1; /* fallback if no socket found */ + bNode *master_shader = bc_get_master_shader(ma); + if (ma->use_nodes && master_shader) { + bc_get_float_from_shader(master_shader, ior, "Roughness"); } - return false; + return ior; } -double bc_get_alpha(Material *ma) +double bc_get_reflectivity(Material *ma) { - double alpha = ma->a; /* fallback if no socket found */ + 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_alpha(master_shader, alpha); + bc_get_float_from_shader(master_shader, reflectivity, "Metallic"); } - return alpha; + return reflectivity; } -bool bc_get_alpha(bNode *shader, double &alpha) +double bc_get_float_from_shader(bNode *shader, double &val, std::string nodeid) { - bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, "Alpha"); + bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, nodeid.c_str()); if (socket) { bNodeSocketValueFloat *ref = (bNodeSocketValueFloat *)socket->default_value; - alpha = (double)ref->value; + val = (double)ref->value; return true; } return false; } -double bc_get_reflectivity(Material *ma) +COLLADASW::ColorOrTexture bc_get_cot_from_shader(bNode *shader, + std::string nodeid, + Color &default_color) { - 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); + bNodeSocket *socket = nodeFindSocket(shader, SOCK_IN, nodeid.c_str()); + if (socket) { + bNodeSocketValueRGBA *dcol = (bNodeSocketValueRGBA *)socket->default_value; + float *col = dcol->value; + return bc_get_cot(col); + } + else { + return bc_get_cot(default_color); /* default black */ } - return reflectivity; } bNode *bc_get_master_shader(Material *ma) @@ -1428,3 +1446,10 @@ COLLADASW::ColorOrTexture bc_get_cot(float r, float g, float b, float a) COLLADASW::ColorOrTexture cot(color); return cot; } + +COLLADASW::ColorOrTexture bc_get_cot(Color col) +{ + COLLADASW::Color color(col[0], col[1], col[2], col[3]); + COLLADASW::ColorOrTexture cot(color); + return cot; +} |