[Bf-blender-cvs] [4352d1beb5d] temp-geometry-nodes-fields-prototype: support anonymous attribute field input
Jacques Lucke
noreply at git.blender.org
Thu Jul 29 21:41:13 CEST 2021
Commit: 4352d1beb5d63c4cd150f9cd6722eff28b77a83d
Author: Jacques Lucke
Date: Thu Jul 29 19:38:39 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB4352d1beb5d63c4cd150f9cd6722eff28b77a83d
support anonymous attribute field input
===================================================================
M source/blender/nodes/geometry/node_geometry_util.cc
===================================================================
diff --git a/source/blender/nodes/geometry/node_geometry_util.cc b/source/blender/nodes/geometry/node_geometry_util.cc
index 6339b03f6c1..455bc8c55dc 100644
--- a/source/blender/nodes/geometry/node_geometry_util.cc
+++ b/source/blender/nodes/geometry/node_geometry_util.cc
@@ -24,6 +24,8 @@
#include "BKE_mesh_runtime.h"
#include "BKE_pointcloud.h"
+#include "NOD_type_conversions.hh"
+
namespace blender::nodes {
using bke::GeometryInstanceGroup;
@@ -62,15 +64,14 @@ void prepare_field_inputs(bke::FieldInputs &field_inputs,
{
const int domain_size = component.attribute_domain_size(domain);
for (const bke::FieldInputKey &key : field_inputs) {
- if (const bke::PersistentAttributeFieldInputKey *attribute_key =
+ std::unique_ptr<bke::FieldInputValue> input_value;
+ if (const bke::PersistentAttributeFieldInputKey *persistent_attribute_key =
dynamic_cast<const bke::PersistentAttributeFieldInputKey *>(&key)) {
- const StringRef name = attribute_key->name();
- const CPPType &cpp_type = attribute_key->type();
+ const StringRef name = persistent_attribute_key->name();
+ const CPPType &cpp_type = persistent_attribute_key->type();
const CustomDataType type = bke::cpp_type_to_custom_data_type(cpp_type);
GVArrayPtr attribute = component.attribute_get_for_read(name, domain, type);
- auto value = std::make_unique<bke::GVArrayFieldInputValue>(std::move(attribute));
- field_inputs.set_input(key, *value);
- r_values.append(std::move(value));
+ input_value = std::make_unique<bke::GVArrayFieldInputValue>(std::move(attribute));
}
else if (dynamic_cast<const bke::IndexFieldInputKey *>(&key) != nullptr) {
auto index_func = [](int i) { return i; };
@@ -78,10 +79,29 @@ void prepare_field_inputs(bke::FieldInputs &field_inputs,
domain_size, index_func);
GVArrayPtr index_gvarray = std::make_unique<fn::GVArray_For_VArray<int>>(
std::move(index_varray));
- auto value = std::make_unique<bke::GVArrayFieldInputValue>(std::move(index_gvarray));
- field_inputs.set_input(key, *value);
- r_values.append(std::move(value));
+ input_value = std::make_unique<bke::GVArrayFieldInputValue>(std::move(index_gvarray));
+ }
+ else if (const bke::AnonymousAttributeFieldInputKey *anonymous_attribute_key =
+ dynamic_cast<const bke::AnonymousAttributeFieldInputKey *>(&key)) {
+ const AnonymousCustomDataLayerID &layer_id = anonymous_attribute_key->layer_id();
+ ReadAttributeLookup attribute = component.attribute_try_get_anonymous_for_read(layer_id);
+ if (!attribute) {
+ continue;
+ }
+ GVArrayPtr varray = std::move(attribute.varray);
+ if (attribute.domain != domain) {
+ varray = component.attribute_try_adapt_domain(std::move(varray), attribute.domain, domain);
+ }
+ const CPPType &type = anonymous_attribute_key->type();
+ if (varray->type() != type) {
+ const blender::nodes::DataTypeConversions &conversions = get_implicit_type_conversions();
+ varray = conversions.try_convert(std::move(varray), type);
+ }
+ input_value = std::make_unique<bke::GVArrayFieldInputValue>(std::move(varray));
}
+
+ field_inputs.set_input(key, *input_value);
+ r_values.append(std::move(input_value));
}
}
More information about the Bf-blender-cvs
mailing list