Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaia Clary <gaia.clary@machinimatrix.org>2019-06-04 15:31:22 +0300
committerGaia Clary <gaia.clary@machinimatrix.org>2019-06-05 13:42:54 +0300
commiteda377c223cfc0460e3294c95771313f8d4388c3 (patch)
treed8c7d5d74a74f19b993ad18f09d098f5ed039549 /source/blender/collada/collada_utils.cpp
parent98cea7edcefa58d5eb7e2350461b8efe33fe7d9e (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.cpp115
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;
+}