[Bf-blender-cvs] [2ceeaf95a1a] temp-geometry-nodes-fields-prototype: Merge branch 'master' into temp-geometry-nodes-fields-prototype
Jacques Lucke
noreply at git.blender.org
Tue Aug 3 10:44:52 CEST 2021
Commit: 2ceeaf95a1a4ac15a9e217e9d81c19473accc2c2
Author: Jacques Lucke
Date: Tue Aug 3 10:44:41 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB2ceeaf95a1a4ac15a9e217e9d81c19473accc2c2
Merge branch 'master' into temp-geometry-nodes-fields-prototype
===================================================================
===================================================================
diff --cc source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 38f0188eeb9,1391587fa7d..188cce694ea
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@@ -1439,17 -1374,29 +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;
+ }
+
- if (conversions_.is_convertible(from_type, to_type)) {
++ 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)
More information about the Bf-blender-cvs
mailing list