[Bf-blender-cvs] [87153cf019c] temp-geometry-nodes-fields-prototype: progress
Jacques Lucke
noreply at git.blender.org
Wed Jul 28 14:14:23 CEST 2021
Commit: 87153cf019c1120bd4752cff8b2b5116782029cb
Author: Jacques Lucke
Date: Wed Jul 28 11:33:00 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB87153cf019c1120bd4752cff8b2b5116782029cb
progress
===================================================================
M source/blender/blenkernel/BKE_field.hh
M source/blender/modifiers/intern/MOD_nodes_evaluator.cc
M source/blender/nodes/NOD_geometry_exec.hh
M source/blender/nodes/geometry/nodes/node_geo_attribute.cc
M source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_field.hh b/source/blender/blenkernel/BKE_field.hh
index 5f97fc0ec7e..3b6f1a3d2f0 100644
--- a/source/blender/blenkernel/BKE_field.hh
+++ b/source/blender/blenkernel/BKE_field.hh
@@ -354,6 +354,11 @@ class FieldRefBase {
template<typename T> class FieldRef : public FieldRefBase {
public:
+ FieldRef()
+ {
+ field_ = new ConstantField<T>(T());
+ }
+
FieldRef(FieldPtr field)
{
field_ = std::move(field);
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 66e500c537f..1fb941e2b4a 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -930,6 +930,23 @@ class GeometryNodesEvaluator {
bke::FieldRef<float> field = *(bke::FieldRef<float> *)single_value.value;
input_fields.append(field.field());
}
+ else if (input_state.type->is<bke::FieldRef<int>>()) {
+ bke::FieldRef<int> field = *(bke::FieldRef<int> *)single_value.value;
+ input_fields.append(field.field());
+ }
+ else if (input_state.type->is<bke::FieldRef<float3>>()) {
+ bke::FieldRef<float3> field = *(bke::FieldRef<float3> *)single_value.value;
+ input_fields.append(field.field());
+ }
+ else if (input_state.type->is<bke::FieldRef<bool>>()) {
+ bke::FieldRef<bool> field = *(bke::FieldRef<bool> *)single_value.value;
+ input_fields.append(field.field());
+ }
+ else if (input_state.type->is<bke::FieldRef<blender::ColorGeometry4f>>()) {
+ bke::FieldRef<blender::ColorGeometry4f> field =
+ *(bke::FieldRef<blender::ColorGeometry4f> *)single_value.value;
+ input_fields.append(field.field());
+ }
else {
/* Not yet supported. */
BLI_assert_unreachable();
@@ -952,6 +969,26 @@ class GeometryNodesEvaluator {
allocator.construct<bke::FieldRef<float>>(out_field).release();
this->forward_output(socket, field_ref);
}
+ else if (socket->typeinfo()->type == SOCK_VECTOR) {
+ bke::FieldRef<float3> *field_ref =
+ allocator.construct<bke::FieldRef<float3>>(out_field).release();
+ this->forward_output(socket, field_ref);
+ }
+ else if (socket->typeinfo()->type == SOCK_BOOLEAN) {
+ bke::FieldRef<bool> *field_ref =
+ allocator.construct<bke::FieldRef<bool>>(out_field).release();
+ this->forward_output(socket, field_ref);
+ }
+ else if (socket->typeinfo()->type == SOCK_RGBA) {
+ bke::FieldRef<blender::ColorGeometry4f> *field_ref =
+ allocator.construct<bke::FieldRef<blender::ColorGeometry4f>>(out_field).release();
+ this->forward_output(socket, field_ref);
+ }
+ else if (socket->typeinfo()->type == SOCK_INT) {
+ bke::FieldRef<int> *field_ref =
+ allocator.construct<bke::FieldRef<int>>(out_field).release();
+ this->forward_output(socket, field_ref);
+ }
else {
/* Not yet supported. */
BLI_assert_unreachable();
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index d0f64845852..46513075f48 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -148,7 +148,20 @@ class GeoNodeExecParams {
this->check_input_access(identifier, &CPPType::get<T>());
#endif
GMutablePointer gvalue = this->extract_input(identifier);
- return gvalue.relocate_out<T>();
+ if constexpr (std::is_same_v<T, int> || std::is_same_v<T, float> ||
+ std::is_same_v<T, float3> || std::is_same_v<T, ColorGeometry4f> ||
+ std::is_same_v<T, bool>) {
+ BLI_assert(gvalue.is_type<bke::FieldRef<T>>());
+ bke::FieldRef<T> field = gvalue.relocate_out<bke::FieldRef<T>>();
+ bke::FieldInputs inputs = field->prepare_inputs();
+ bke::FieldOutput output = field->evaluate(IndexRange(1), inputs);
+ T value;
+ output.varray_ref().get(0, &value);
+ return value;
+ }
+ else {
+ return gvalue.relocate_out<T>();
+ }
}
/**
@@ -169,7 +182,7 @@ class GeoNodeExecParams {
/**
* Get the input value for the input socket with the given identifier.
*/
- template<typename T> const T get_input(StringRef identifier) const
+ template<typename T> T get_input(StringRef identifier) const
{
#ifdef DEBUG
this->check_input_access(identifier, &CPPType::get<T>());
@@ -192,6 +205,16 @@ class GeoNodeExecParams {
}
}
+ template<typename T> bke::FieldRef<T> get_input_field(StringRef identifier) const
+ {
+#ifdef DEBUG
+ this->check_input_access(identifier, &CPPType::get<T>());
+#endif
+ GPointer gvalue = provider_->get_input(identifier);
+ BLI_assert(gvalue.is_type<bke::FieldRef<T>>());
+ return *(const bke::FieldRef<T> *)gvalue.get<bke::FieldRef<T>>();
+ }
+
/**
* Store the output value for the given socket identifier.
*/
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute.cc
index 9da9ea3d83f..0e6bc782a1c 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute.cc
@@ -85,7 +85,21 @@ static void geo_node_attribute_exec(GeoNodeExecParams params)
BLI_assert(cpp_type != nullptr);
bke::FieldPtr field = new bke::GVArrayInputField<bke::AttributeFieldInputKey>(std::move(name),
*cpp_type);
- params.set_output("Attribute", bke::FieldRef<float>(std::move(field)));
+ if (cpp_type->is<float>()) {
+ params.set_output("Attribute", bke::FieldRef<float>(std::move(field)));
+ }
+ else if (cpp_type->is<int>()) {
+ params.set_output("Attribute_001", bke::FieldRef<int>(std::move(field)));
+ }
+ else if (cpp_type->is<bool>()) {
+ params.set_output("Attribute_002", bke::FieldRef<bool>(std::move(field)));
+ }
+ else if (cpp_type->is<float3>()) {
+ params.set_output("Attribute_003", bke::FieldRef<float3>(std::move(field)));
+ }
+ else if (cpp_type->is<ColorGeometry4f>()) {
+ params.set_output("Attribute_004", bke::FieldRef<ColorGeometry4f>(std::move(field)));
+ }
}
} // namespace blender::nodes
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
index 406b72bc345..f9e1c696d08 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
@@ -121,7 +121,7 @@ static void fill_attribute(GeometryComponent &component, const GeoNodeExecParams
switch (data_type) {
case CD_PROP_FLOAT: {
- bke::FieldRef<float> value_field = params.get_input<bke::FieldRef<float>>("Value_001");
+ bke::FieldRef<float> value_field = params.get_input_field<float>("Value_001");
bke::FieldInputs field_inputs = value_field->prepare_inputs();
Vector<std::unique_ptr<bke::FieldInputValue>> input_values;
prepare_field_inputs(field_inputs, component, domain, input_values);
More information about the Bf-blender-cvs
mailing list