Merge branch 'blender-v3.3-release'

This commit is contained in:
Aras Pranckevicius 2022-08-11 15:54:04 +03:00
commit c4a0438522
4 changed files with 55 additions and 34 deletions

View File

@ -547,20 +547,29 @@ StringRefNull MTLWriter::mtl_file_path() const
return mtl_filepath_;
}
void MTLWriter::write_bsdf_properties(const MTLMaterial &mtl_material)
void MTLWriter::write_bsdf_properties(const MTLMaterial &mtl)
{
fmt_handler_.write<eMTLSyntaxElement::Ns>(mtl_material.Ns);
fmt_handler_.write<eMTLSyntaxElement::Ka>(
mtl_material.Ka.x, mtl_material.Ka.y, mtl_material.Ka.z);
fmt_handler_.write<eMTLSyntaxElement::Kd>(
mtl_material.Kd.x, mtl_material.Kd.y, mtl_material.Kd.z);
fmt_handler_.write<eMTLSyntaxElement::Ks>(
mtl_material.Ks.x, mtl_material.Ks.y, mtl_material.Ks.z);
fmt_handler_.write<eMTLSyntaxElement::Ke>(
mtl_material.Ke.x, mtl_material.Ke.y, mtl_material.Ke.z);
fmt_handler_.write<eMTLSyntaxElement::Ni>(mtl_material.Ni);
fmt_handler_.write<eMTLSyntaxElement::d>(mtl_material.d);
fmt_handler_.write<eMTLSyntaxElement::illum>(mtl_material.illum);
/* For various material properties, we only capture information
* coming from the texture, or the default value of the socket.
* When the texture is present, do not emit the default value. */
if (!mtl.tex_map_of_type(eMTLSyntaxElement::map_Ns).is_valid()) {
fmt_handler_.write<eMTLSyntaxElement::Ns>(mtl.Ns);
}
fmt_handler_.write<eMTLSyntaxElement::Ka>(mtl.Ka.x, mtl.Ka.y, mtl.Ka.z);
if (!mtl.tex_map_of_type(eMTLSyntaxElement::map_Kd).is_valid()) {
fmt_handler_.write<eMTLSyntaxElement::Kd>(mtl.Kd.x, mtl.Kd.y, mtl.Kd.z);
}
if (!mtl.tex_map_of_type(eMTLSyntaxElement::map_Ks).is_valid()) {
fmt_handler_.write<eMTLSyntaxElement::Ks>(mtl.Ks.x, mtl.Ks.y, mtl.Ks.z);
}
if (!mtl.tex_map_of_type(eMTLSyntaxElement::map_Ke).is_valid()) {
fmt_handler_.write<eMTLSyntaxElement::Ke>(mtl.Ke.x, mtl.Ke.y, mtl.Ke.z);
}
fmt_handler_.write<eMTLSyntaxElement::Ni>(mtl.Ni);
if (!mtl.tex_map_of_type(eMTLSyntaxElement::map_d).is_valid()) {
fmt_handler_.write<eMTLSyntaxElement::d>(mtl.d);
}
fmt_handler_.write<eMTLSyntaxElement::illum>(mtl.illum);
}
void MTLWriter::write_texture_map(
@ -583,12 +592,13 @@ void MTLWriter::write_texture_map(
options.append(" -bm ").append(std::to_string(mtl_material.map_Bump_strength));
}
std::string path = path_reference(
texture_map.value.image_path.c_str(), blen_filedir, dest_dir, path_mode, &copy_set);
/* Always emit forward slashes for cross-platform compatibility. */
std::replace(path.begin(), path.end(), '\\', '/');
#define SYNTAX_DISPATCH(eMTLSyntaxElement) \
if (texture_map.key == eMTLSyntaxElement) { \
std::string path = path_reference( \
texture_map.value.image_path.c_str(), blen_filedir, dest_dir, path_mode, &copy_set); \
/* Always emit forward slashes for cross-platform compatibility. */ \
std::replace(path.begin(), path.end(), '\\', '/'); \
fmt_handler_.write<eMTLSyntaxElement>(options, path.c_str()); \
return; \
}
@ -600,6 +610,7 @@ void MTLWriter::write_texture_map(
SYNTAX_DISPATCH(eMTLSyntaxElement::map_refl);
SYNTAX_DISPATCH(eMTLSyntaxElement::map_Ke);
SYNTAX_DISPATCH(eMTLSyntaxElement::map_Bump);
#undef SYNTAX_DISPATCH
BLI_assert(!"This map type was not written to the file.");
}
@ -626,7 +637,7 @@ void MTLWriter::write_materials(const char *blen_filepath,
fmt_handler_.write<eMTLSyntaxElement::newmtl>(mtlmat.name);
write_bsdf_properties(mtlmat);
for (const auto &tex : mtlmat.texture_maps.items()) {
if (tex.value.image_path.empty()) {
if (!tex.value.is_valid()) {
continue;
}
write_texture_map(mtlmat, tex, blen_filedir, dest_dir, path_mode, copy_set);

View File

@ -8,8 +8,6 @@
#include "BLI_map.hh"
#include "BLI_math_vec_types.hh"
#include "BLI_string_ref.hh"
#include "BLI_vector.hh"
#include "DNA_node_types.h"
#include "obj_export_io.hh"
@ -25,19 +23,22 @@ template<> struct DefaultHash<io::obj::eMTLSyntaxElement> {
} // namespace blender
namespace blender::io::obj {
class OBJMesh;
/**
* Generic container for texture node properties.
*/
struct tex_map_XX {
tex_map_XX(StringRef to_socket_id) : dest_socket_id(to_socket_id){};
bool is_valid() const
{
return !image_path.empty();
}
/** Target socket which this texture node connects to. */
/* Target socket which this texture node connects to. */
const std::string dest_socket_id;
float3 translation{0.0f};
float3 scale{1.0f};
/* Only Flat and Smooth projections are supported. */
/* Only Flat and Sphere projections are supported. */
int projection_type = SHD_PROJ_FLAT;
std::string image_path;
std::string mtl_dir_path;
@ -58,16 +59,15 @@ struct MTLMaterial {
texture_maps.add(eMTLSyntaxElement::map_Bump, tex_map_XX("Normal"));
}
/**
* Caller must ensure that the given lookup key exists in the Map.
* \return Texture map corresponding to the given ID.
*/
const tex_map_XX &tex_map_of_type(const eMTLSyntaxElement key) const
{
BLI_assert(texture_maps.contains(key));
return texture_maps.lookup(key);
}
tex_map_XX &tex_map_of_type(const eMTLSyntaxElement key)
{
{
BLI_assert(texture_maps.contains_as(key));
return texture_maps.lookup_as(key);
}
BLI_assert(texture_maps.contains(key));
return texture_maps.lookup(key);
}
std::string name;

View File

@ -342,7 +342,7 @@ void ShaderNodetreeWrap::set_bsdf_socket_values(Material *mat)
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)) {
if (mtl_mat_.tex_map_of_type(eMTLSyntaxElement::map_Ke).is_valid()) {
set_property_of_socket(SOCK_FLOAT, "Emission Strength", {1.0f}, bsdf_);
}
set_property_of_socket(SOCK_FLOAT, "Specular", {specular}, bsdf_);
@ -365,7 +365,7 @@ void ShaderNodetreeWrap::add_image_textures(Main *bmain, Material *mat, bool rel
{
for (const Map<const eMTLSyntaxElement, tex_map_XX>::Item texture_map :
mtl_mat_.texture_maps.items()) {
if (texture_map.value.image_path.empty()) {
if (!texture_map.value.is_valid()) {
/* No Image texture node of this map type can be added to this material. */
continue;
}

View File

@ -325,6 +325,16 @@ TEST_F(obj_importer_test, import_cubes_with_textures_rel)
float3(1, -1, -1),
float3(0, 1, 0),
float2(0.9935f, 0.0020f)},
{"OBCubeTexMul",
OB_MESH,
8,
12,
6,
24,
float3(4, -2, -1),
float3(4, -4, -1),
float3(0, 1, 0),
float2(0.9935f, 0.0020f)},
{"OBCubeTiledTex",
OB_MESH,
8,
@ -346,7 +356,7 @@ TEST_F(obj_importer_test, import_cubes_with_textures_rel)
float3(0, 1, 0),
float2(0.9935f, 0.0020f)},
};
import_and_check("cubes_with_textures_rel.obj", expect, std::size(expect), 3, 4);
import_and_check("cubes_with_textures_rel.obj", expect, std::size(expect), 4, 4);
}
TEST_F(obj_importer_test, import_faces_invalid_or_with_holes)