diff options
Diffstat (limited to 'source/blender/io/wavefront_obj/importer/obj_import_mtl.cc')
-rw-r--r-- | source/blender/io/wavefront_obj/importer/obj_import_mtl.cc | 68 |
1 files changed, 40 insertions, 28 deletions
diff --git a/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc b/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc index 56e3a062cb6..c2ecd8a37de 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc +++ b/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc @@ -197,10 +197,10 @@ void ShaderNodetreeWrap::set_bsdf_socket_values(Material *mat) bool do_glass = false; /* See https://wikipedia.org/wiki/Wavefront_.obj_file for possible values of illum. */ switch (illum) { - case 1: { + case -1: + case 1: /* Base color on, ambient on. */ break; - } case 2: { /* Highlight on. */ do_highlight = true; @@ -257,28 +257,30 @@ void ShaderNodetreeWrap::set_bsdf_socket_values(Material *mat) * Principled BSDF: */ /* Specular: average of Ks components. */ float specular = (mtl_mat_.Ks[0] + mtl_mat_.Ks[1] + mtl_mat_.Ks[2]) / 3; - /* Roughness: map 0..1000 range to 1..0 and apply non-linearity. */ - float clamped_ns = std::max(0.0f, std::min(1000.0f, mtl_mat_.Ns)); - float roughness = 1.0f - sqrt(clamped_ns / 1000.0f); - /* Metallic: average of Ka components. */ - float metallic = (mtl_mat_.Ka[0] + mtl_mat_.Ka[1] + mtl_mat_.Ka[2]) / 3; - float ior = mtl_mat_.Ni; - float alpha = mtl_mat_.d; - if (specular < 0.0f) { - specular = static_cast<float>(do_highlight); + specular = do_highlight ? 1.0f : 0.0f; } + /* Roughness: map 0..1000 range to 1..0 and apply non-linearity. */ + float roughness; if (mtl_mat_.Ns < 0.0f) { - roughness = static_cast<float>(!do_highlight); + roughness = do_highlight ? 0.0f : 1.0f; } - if (metallic < 0.0f) { - if (do_reflection) { + else { + float clamped_ns = std::max(0.0f, std::min(1000.0f, mtl_mat_.Ns)); + roughness = 1.0f - sqrt(clamped_ns / 1000.0f); + } + /* Metallic: average of Ka components. */ + float metallic = (mtl_mat_.Ka[0] + mtl_mat_.Ka[1] + mtl_mat_.Ka[2]) / 3; + if (do_reflection) { + if (metallic < 0.0f) { metallic = 1.0f; } } else { metallic = 0.0f; } + + float ior = mtl_mat_.Ni; if (ior < 0) { if (do_tranparency) { ior = 1.0f; @@ -287,28 +289,38 @@ void ShaderNodetreeWrap::set_bsdf_socket_values(Material *mat) ior = 1.5f; } } - if (alpha < 0) { - if (do_tranparency) { - alpha = 1.0f; - } + float alpha = mtl_mat_.d; + if (do_tranparency && alpha < 0) { + alpha = 1.0f; } - float3 base_color = {std::max(0.0f, mtl_mat_.Kd[0]), - std::max(0.0f, mtl_mat_.Kd[1]), - std::max(0.0f, mtl_mat_.Kd[2])}; - float3 emission_color = {std::max(0.0f, mtl_mat_.Ke[0]), - std::max(0.0f, mtl_mat_.Ke[1]), - std::max(0.0f, mtl_mat_.Ke[2])}; - set_property_of_socket(SOCK_RGBA, "Base Color", {base_color, 3}, bsdf_); - set_property_of_socket(SOCK_RGBA, "Emission", {emission_color, 3}, bsdf_); + float3 base_color = {mtl_mat_.Kd[0], mtl_mat_.Kd[1], mtl_mat_.Kd[2]}; + if (base_color.x >= 0 && base_color.y >= 0 && base_color.z >= 0) { + set_property_of_socket(SOCK_RGBA, "Base Color", {base_color, 3}, bsdf_); + /* Viewport shading uses legacy r,g,b base color. */ + mat->r = base_color.x; + mat->g = base_color.y; + mat->b = base_color.z; + } + + float3 emission_color = {mtl_mat_.Ke[0], mtl_mat_.Ke[1], mtl_mat_.Ke[2]}; + if (emission_color.x >= 0 && emission_color.y >= 0 && emission_color.z >= 0) { + set_property_of_socket(SOCK_RGBA, "Emission", {emission_color, 3}, bsdf_); + } if (mtl_mat_.texture_maps.contains_as(eMTLSyntaxElement::map_Ke)) { set_property_of_socket(SOCK_FLOAT, "Emission Strength", {1.0f}, bsdf_); } set_property_of_socket(SOCK_FLOAT, "Specular", {specular}, bsdf_); set_property_of_socket(SOCK_FLOAT, "Roughness", {roughness}, bsdf_); + mat->roughness = roughness; set_property_of_socket(SOCK_FLOAT, "Metallic", {metallic}, bsdf_); - set_property_of_socket(SOCK_FLOAT, "IOR", {ior}, bsdf_); - set_property_of_socket(SOCK_FLOAT, "Alpha", {alpha}, bsdf_); + mat->metallic = metallic; + if (ior != -1) { + set_property_of_socket(SOCK_FLOAT, "IOR", {ior}, bsdf_); + } + if (alpha != -1) { + set_property_of_socket(SOCK_FLOAT, "Alpha", {alpha}, bsdf_); + } if (do_tranparency) { mat->blend_method = MA_BM_BLEND; } |