From eda377c223cfc0460e3294c95771313f8d4388c3 Mon Sep 17 00:00:00 2001 From: Gaia Clary Date: Tue, 4 Jun 2019 14:31:22 +0200 Subject: 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). --- source/blender/collada/collada_utils.cpp | 115 +++++++++++++++++++------------ 1 file changed, 70 insertions(+), 45 deletions(-) (limited to 'source/blender/collada/collada_utils.cpp') 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; +} -- cgit v1.2.3