diff options
author | Jacques Lucke <jacques@blender.org> | 2021-08-03 11:44:41 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-08-03 11:44:41 +0300 |
commit | 2ceeaf95a1a4ac15a9e217e9d81c19473accc2c2 (patch) | |
tree | f5a6001bdd56fbb870224c9a5e208bf6ff2539c0 /source/blender/modifiers/intern | |
parent | c8de9dc2a41d8416541ce89c35a4e50c807bcd38 (diff) | |
parent | b1a607ce04fecae7af4474f7b087993ec2cf8e5b (diff) |
Merge branch 'master' into temp-geometry-nodes-fields-prototype
Diffstat (limited to 'source/blender/modifiers/intern')
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes_evaluator.cc | 68 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_solidify_nonmanifold.c | 13 |
2 files changed, 48 insertions, 33 deletions
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc index 38f0188eeb9..188cce694ea 100644 --- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc +++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc @@ -1290,28 +1290,8 @@ class GeometryNodesEvaluator { void *buffer = allocator.allocate(to_type.size(), to_type.alignment()); GMutablePointer value{to_type, buffer}; - const bke::FieldRefCPPType *from_field_type = dynamic_cast<const bke::FieldRefCPPType *>( - &from_type); - const bke::FieldRefCPPType *to_field_type = dynamic_cast<const bke::FieldRefCPPType *>( - &to_type); + this->convert_value(from_type, to_type, value_to_forward.get(), buffer); - if (from_field_type != nullptr && to_field_type != nullptr && - conversions_.is_convertible(from_field_type->field_type(), to_field_type->field_type())) { - const MultiFunction &fn = *conversions_.get_conversion_multi_function( - MFDataType::ForSingle(from_field_type->field_type()), - MFDataType::ForSingle(to_field_type->field_type())); - FieldPtr old_field = from_field_type->get_field(value_to_forward.get()); - FieldPtr new_field = new bke::MultiFunctionField({old_field}, fn, 1); - to_field_type->construct(buffer, std::move(new_field)); - } - else if (conversions_.is_convertible(from_type, to_type)) { - /* Do the conversion if possible. */ - conversions_.convert_to_uninitialized(from_type, to_type, value_to_forward.get(), buffer); - } - else { - /* Cannot convert, use default value instead. */ - to_type.copy_construct(to_type.default_value(), buffer); - } /* Multi input socket values are logged once all values are available. */ if (!to_socket->is_multi_input_socket()) { this->log_socket_value({to_socket}, value); @@ -1439,17 +1419,43 @@ class GeometryNodesEvaluator { if (type == required_type) { return {type, buffer}; } - if (conversions_.is_convertible(type, required_type)) { - /* Convert the loaded value to the required type if possible. */ - void *converted_buffer = allocator.allocate(required_type.size(), required_type.alignment()); - conversions_.convert_to_uninitialized(type, required_type, buffer, converted_buffer); - type.destruct(buffer); - return {required_type, converted_buffer}; + void *converted_buffer = allocator.allocate(required_type.size(), required_type.alignment()); + this->convert_value(type, required_type, buffer, converted_buffer); + return {required_type, converted_buffer}; + } + + void convert_value(const CPPType &from_type, + const CPPType &to_type, + const void *from_value, + void *to_value) + { + if (from_type == to_type) { + from_type.copy_construct(from_value, to_value); + return; + } + + const bke::FieldRefCPPType *from_field_type = dynamic_cast<const bke::FieldRefCPPType *>( + &from_type); + const bke::FieldRefCPPType *to_field_type = dynamic_cast<const bke::FieldRefCPPType *>( + &to_type); + + if (from_field_type != nullptr && to_field_type != nullptr && + conversions_.is_convertible(from_field_type->field_type(), to_field_type->field_type())) { + const MultiFunction &fn = *conversions_.get_conversion_multi_function( + MFDataType::ForSingle(from_field_type->field_type()), + MFDataType::ForSingle(to_field_type->field_type())); + FieldPtr old_field = from_field_type->get_field(from_value); + FieldPtr new_field = new bke::MultiFunctionField({old_field}, fn, 1); + to_field_type->construct(to_value, std::move(new_field)); + } + else if (conversions_.is_convertible(from_type, to_type)) { + /* Do the conversion if possible. */ + conversions_.convert_to_uninitialized(from_type, to_type, from_value, to_value); + } + else { + /* Cannot convert, use default value instead. */ + to_type.copy_construct(to_type.default_value(), to_value); } - /* Use a default fallback value when the loaded type is not compatible. */ - void *default_buffer = allocator.allocate(required_type.size(), required_type.alignment()); - required_type.copy_construct(required_type.default_value(), default_buffer); - return {required_type, default_buffer}; } NodeState &get_node_state(const DNode node) diff --git a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c index b872f04b60f..18d308e5f02 100644 --- a/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c +++ b/source/blender/modifiers/intern/MOD_solidify_nonmanifold.c @@ -71,6 +71,15 @@ static float angle_signed_on_axis_normalized_v3v3_v3(const float n[3], return angle; } +static float clamp_nonzero(const float value, const float epsilon) +{ + BLI_assert(!(epsilon < 0.0f)); + if (value < 0.0f) { + return min_ff(value, -epsilon); + } + return max_ff(value, epsilon); +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -164,8 +173,8 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md, const float ofs_front = (smd->offset_fac + 1.0f) * 0.5f * smd->offset; const float ofs_back = ofs_front - smd->offset * smd->offset_fac; - const float ofs_front_clamped = max_ff(1e-5f, fabsf(smd->offset > 0 ? ofs_front : ofs_back)); - const float ofs_back_clamped = max_ff(1e-5f, fabsf(smd->offset > 0 ? ofs_back : ofs_front)); + const float ofs_front_clamped = clamp_nonzero(smd->offset > 0 ? ofs_front : ofs_back, 1e-5f); + const float ofs_back_clamped = clamp_nonzero(smd->offset > 0 ? ofs_back : ofs_front, 1e-5f); const float offset_fac_vg = smd->offset_fac_vg; const float offset_fac_vg_inv = 1.0f - smd->offset_fac_vg; const float offset = fabsf(smd->offset) * smd->offset_clamp; |