[Bf-blender-cvs] [c00cc9fd602] temp-geometry-nodes-fields-prototype: improve
Jacques Lucke
noreply at git.blender.org
Wed Jul 28 14:14:21 CEST 2021
Commit: c00cc9fd602fa2d149cc2be8aa4d65430c37beb5
Author: Jacques Lucke
Date: Tue Jul 27 16:29:34 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rBc00cc9fd602fa2d149cc2be8aa4d65430c37beb5
improve
===================================================================
M source/blender/blenkernel/BKE_field.hh
M source/blender/modifiers/intern/MOD_nodes_evaluator.cc
M source/blender/nodes/NOD_geometry_exec.hh
===================================================================
diff --git a/source/blender/blenkernel/BKE_field.hh b/source/blender/blenkernel/BKE_field.hh
index 2604a095949..45253531ec3 100644
--- a/source/blender/blenkernel/BKE_field.hh
+++ b/source/blender/blenkernel/BKE_field.hh
@@ -294,6 +294,7 @@ class MultiFunctionField : public Field {
FieldOutput &output = scope.add_value(field.evaluate(mask, inputs), __func__);
params.add_readonly_single_input(output.varray_ref());
input_index++;
+ break;
}
case fn::MFParamType::SingleOutput: {
const CPPType &type = param_type.data_type().single_type();
@@ -305,6 +306,7 @@ class MultiFunctionField : public Field {
if (param_index == output_param_index_) {
output_span_index = outputs.size() - 1;
}
+ break;
}
case fn::MFParamType::SingleMutable:
case fn::MFParamType::VectorInput:
@@ -331,7 +333,10 @@ class MultiFunctionField : public Field {
}
};
-template<typename T> class FieldRef {
+class FieldRefBase {
+};
+
+template<typename T> class FieldRef : public FieldRefBase {
private:
FieldPtr field_;
diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
index 9e9e380b649..10d804f846d 100644
--- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
+++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc
@@ -32,6 +32,12 @@
#include "BLI_vector_set.hh"
MAKE_CPP_TYPE(FloatFieldRef, blender::bke::FieldRef<float>, CPPTypeFlags::BasicType);
+MAKE_CPP_TYPE(IntFieldRef, blender::bke::FieldRef<int>, CPPTypeFlags::BasicType);
+MAKE_CPP_TYPE(BoolFieldRef, blender::bke::FieldRef<bool>, CPPTypeFlags::BasicType);
+MAKE_CPP_TYPE(Float3FieldRef, blender::bke::FieldRef<blender::float3>, CPPTypeFlags::BasicType);
+MAKE_CPP_TYPE(ColorFieldRef,
+ blender::bke::FieldRef<blender::ColorGeometry4f>,
+ CPPTypeFlags::BasicType);
namespace blender::modifiers::geometry_nodes {
@@ -309,6 +315,18 @@ static const CPPType *get_socket_cpp_type(const SocketRef &socket)
if (type->is<float>()) {
return &CPPType::get<bke::FieldRef<float>>();
}
+ if (type->is<int>()) {
+ return &CPPType::get<bke::FieldRef<int>>();
+ }
+ if (type->is<bool>()) {
+ return &CPPType::get<bke::FieldRef<bool>>();
+ }
+ if (type->is<float3>()) {
+ return &CPPType::get<bke::FieldRef<float3>>();
+ }
+ if (type->is<ColorGeometry4f>()) {
+ return &CPPType::get<bke::FieldRef<ColorGeometry4f>>();
+ }
return type;
}
@@ -319,13 +337,42 @@ static const CPPType *get_socket_cpp_type(const DSocket socket)
static void get_socket_value(const SocketRef &socket, void *r_value)
{
- if (socket.typeinfo()->type == SOCK_FLOAT) {
- float value;
- socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
- new (r_value) bke::FieldRef<float>(FieldPtr{new bke::ConstantField<float>(value)});
- return;
+ switch (socket.typeinfo()->type) {
+ case SOCK_FLOAT: {
+ float value;
+ socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+ new (r_value) bke::FieldRef<float>(FieldPtr{new bke::ConstantField<float>(value)});
+ return;
+ }
+ case SOCK_INT: {
+ int value;
+ socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+ new (r_value) bke::FieldRef<int>(FieldPtr{new bke::ConstantField<int>(value)});
+ return;
+ }
+ case SOCK_BOOLEAN: {
+ bool value;
+ socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+ new (r_value) bke::FieldRef<bool>(FieldPtr{new bke::ConstantField<bool>(value)});
+ return;
+ }
+ case SOCK_RGBA: {
+ ColorGeometry4f value;
+ socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+ new (r_value)
+ bke::FieldRef<ColorGeometry4f>(FieldPtr{new bke::ConstantField<ColorGeometry4f>(value)});
+ return;
+ }
+ case SOCK_VECTOR: {
+ float3 value;
+ socket.typeinfo()->get_cpp_value(*socket.bsocket(), &value);
+ new (r_value) bke::FieldRef<float3>(FieldPtr{new bke::ConstantField<float3>(value)});
+ return;
+ }
+ default:
+ blender::nodes::socket_cpp_value_get(*socket.bsocket(), r_value);
+ return;
}
- blender::nodes::socket_cpp_value_get(*socket.bsocket(), r_value);
}
static bool node_supports_laziness(const DNode node)
diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh
index 98df31cb739..d0f64845852 100644
--- a/source/blender/nodes/NOD_geometry_exec.hh
+++ b/source/blender/nodes/NOD_geometry_exec.hh
@@ -169,14 +169,27 @@ 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> const T get_input(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<T>());
- return *(const T *)gvalue.get();
+ 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.get<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 {
+ BLI_assert(gvalue.is_type<T>());
+ return *(const T *)gvalue.get();
+ }
}
/**
More information about the Bf-blender-cvs
mailing list