[Bf-blender-cvs] [1b2b07fb18a] temp-geometry-nodes-fields-prototype: progress
Jacques Lucke
noreply at git.blender.org
Wed Jul 28 14:14:20 CEST 2021
Commit: 1b2b07fb18a2a434c3f3471905f91531dbd6d74c
Author: Jacques Lucke
Date: Mon Jul 26 16:34:28 2021 +0200
Branches: temp-geometry-nodes-fields-prototype
https://developer.blender.org/rB1b2b07fb18a2a434c3f3471905f91531dbd6d74c
progress
===================================================================
M release/scripts/startup/nodeitems_builtins.py
M source/blender/blenkernel/BKE_field.hh
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/intern/node.cc
M source/blender/blenlib/BLI_optionally_owned_ptr.hh
M source/blender/blenlib/BLI_virtual_array.hh
M source/blender/makesdna/DNA_node_types.h
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/nodes/CMakeLists.txt
M source/blender/nodes/NOD_geometry.h
M source/blender/nodes/NOD_static_types.h
A source/blender/nodes/geometry/nodes/node_geo_attribute.cc
M source/blender/nodes/geometry/nodes/node_geo_attribute_fill.cc
===================================================================
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 09820291222..dda36fe83fc 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -539,6 +539,7 @@ geometry_node_categories = [
NodeItem("FunctionNodeInputVector"),
NodeItem("GeometryNodeInputMaterial"),
NodeItem("GeometryNodeIsViewport"),
+ NodeItem("GeometryNodeAttribute"),
]),
GeometryNodeCategory("GEO_MATERIAL", "Material", items=[
NodeItem("GeometryNodeMaterialAssign"),
diff --git a/source/blender/blenkernel/BKE_field.hh b/source/blender/blenkernel/BKE_field.hh
index 5f1d23b47b3..a3c6a11e5ed 100644
--- a/source/blender/blenkernel/BKE_field.hh
+++ b/source/blender/blenkernel/BKE_field.hh
@@ -44,6 +44,7 @@ class FieldInputKey {
public:
virtual ~FieldInputKey() = default;
virtual uint64_t hash() const = 0;
+ virtual const CPPType &type() const = 0;
friend bool operator==(const FieldInputKey &a, const FieldInputKey &b)
{
@@ -79,14 +80,14 @@ class AttributeFieldInputKey : public FieldInputKey {
return get_default_hash_2(name_, type_);
}
- StringRefNull name() const
+ const CPPType &type() const override
{
- return name_;
+ return *type_;
}
- const CPPType &type() const
+ StringRefNull name() const
{
- return *type_;
+ return name_;
}
private:
@@ -115,21 +116,6 @@ class GVArrayFieldInputValue : public FieldInputValue {
}
};
-template<typename T> class VArrayFieldInputValue : public FieldInputValue {
- private:
- const VArray<T> *varray_;
-
- public:
- VArrayFieldInputValue(const VArray<T> &varray) : varray_(varray)
- {
- }
-
- const VArray<T> &varray() const
- {
- return *varray_;
- }
-};
-
class FieldInputs {
private:
using InputMap = Map<std::reference_wrapper<const FieldInputKey>, const FieldInputValue *>;
@@ -166,24 +152,19 @@ class FieldInputs {
template<typename T> class FieldOutput {
private:
- const VArray<T> *varray_ = nullptr;
- VArrayPtr<T> varray_owned_;
+ OptionallyOwnedPtr<const VArray<T>> varray_;
public:
- FieldOutput(const VArray<T> &varray) : varray_(&varray)
- {
- }
-
- FieldOutput(VArrayPtr<T> varray) : varray_(varray.get()), varray_owned_(std::move(varray))
+ FieldOutput(OptionallyOwnedPtr<const VArray<T>> varray) : varray_(std::move(varray))
{
}
- VArrayPtr<T> &varray_owned()
+ OptionallyOwnedPtr<const VArray<T>> extract()
{
- return varray_owned_;
+ return std::move(varray_);
}
- const VArray<T> &varray_ref() const
+ const VArray<T> &varray() const
{
return *varray_;
}
@@ -191,15 +172,10 @@ template<typename T> class FieldOutput {
class GFieldOutput {
private:
- const GVArray *varray_;
- GVArrayPtr varray_owned_;
+ OptionallyOwnedPtr<const GVArray> varray_;
public:
- GFieldOutput(const GVArray &varray) : varray_(&varray)
- {
- }
-
- GFieldOutput(GVArrayPtr varray) : varray_(varray.get()), varray_owned_(std::move(varray))
+ GFieldOutput(OptionallyOwnedPtr<const GVArray> varray) : varray_(std::move(varray))
{
}
@@ -253,10 +229,13 @@ template<typename T> class Field : public GField {
GFieldOutput evaluate_generic(IndexMask mask, const FieldInputs &inputs) const override
{
FieldOutput<T> output = this->evaluate(mask, inputs);
- if (output.varray_owned()) {
- return {std::make_unique<fn::GVArray_For_OwnedVArray<T>>(std::move(output.varray_owned()))};
+ OptionallyOwnedPtr<const VArray<T>> varray = output.extract();
+ if (varray.is_owned()) {
+ return GFieldOutput{OptionallyOwnedPtr<const GVArray>{
+ std::make_unique<fn::GVArray_For_OwnedVArray<T>>(varray.extract_owned())}};
}
- return {std::make_unique<fn::GVArray_For_VArray<T>>(output.varray_ref())};
+ return GFieldOutput{OptionallyOwnedPtr<const GVArray>{
+ std::make_unique<fn::GVArray_For_VArray<T>>(output.varray())}};
}
const CPPType &output_type() const override
@@ -276,34 +255,39 @@ template<typename T> class ConstantField : public Field<T> {
FieldOutput<T> evaluate(IndexMask mask, const FieldInputs &UNUSED(inputs)) const
{
- return {std::make_unique<VArray_For_Single<T>>(value_, mask.min_array_size())};
+ return OptionallyOwnedPtr<const VArray<T>>{
+ std::make_unique<VArray_For_Single<T>>(value_, mask.min_array_size())};
}
};
-template<typename T, typename KeyT> class VArrayInputField : public Field<T> {
+template<typename KeyT> class VArrayInputField : public GField {
private:
- T default_value_;
KeyT key_;
public:
- template<typename... Args>
- VArrayInputField(T default_value, Args &&... args)
- : default_value_(std::move(default_value)), key_(std::forward<Args>(args)...)
+ template<typename... Args> VArrayInputField(Args &&... args) : key_(std::forward<Args>(args)...)
{
}
- void foreach_input_key(FunctionRef<void(const FieldInputKey &key)> callback) const
+ void foreach_input_key(FunctionRef<void(const FieldInputKey &key)> callback) const override
{
callback(key_);
}
- FieldOutput<T> evaluate(IndexMask mask, const FieldInputs &inputs) const override
+ const CPPType &output_type() const override
+ {
+ return key_.type();
+ }
+
+ GFieldOutput evaluate_generic(IndexMask mask, const FieldInputs &inputs) const override
{
- const VArrayFieldInputValue<T> *input = inputs.get<VArrayFieldInputValue<T>>(key_);
+ const GVArrayFieldInputValue *input = inputs.get<GVArrayFieldInputValue>(key_);
if (input == nullptr) {
- return std::make_unique<VArray_For_Single<T>>(default_value_, mask.min_array_size());
+ return GFieldOutput{
+ OptionallyOwnedPtr<const GVArray>{std::make_unique<fn::GVArray_For_SingleValueRef>(
+ key_.type(), mask.min_array_size(), key_.type().default_value())}};
}
- return input->varray();
+ return GFieldOutput{OptionallyOwnedPtr<const GVArray>{input->varray()}};
}
};
@@ -394,7 +378,9 @@ class MultiFunctionField : public GField {
MEM_freeN(span.data());
}
- return {std::make_unique<fn::GVArray_For_OwnedGSpan>(output_span, mask)};
+ std::unique_ptr<GVArray> out_array = std::make_unique<fn::GVArray_For_OwnedGSpan>(output_span,
+ mask);
+ return GFieldOutput{OptionallyOwnedPtr<const GVArray>{std::move(out_array)}};
}
};
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h
index cecb3118038..fd4eb8f1b98 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1466,6 +1466,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree,
#define GEO_NODE_CURVE_PRIMITIVE_QUADRILATERAL 1070
#define GEO_NODE_CURVE_TRIM 1071
#define GEO_NODE_CURVE_SET_HANDLES 1072
+#define GEO_NODE_ATTRIBUTE 1073
/** \} */
diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index e9608457896..8fc872b0f08 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -5087,6 +5087,7 @@ static void registerGeometryNodes()
register_node_type_geo_group();
register_node_type_geo_align_rotation_to_vector();
+ register_node_type_geo_attribute();
register_node_type_geo_attribute_clamp();
register_node_type_geo_attribute_color_ramp();
register_node_type_geo_attribute_combine_xyz();
diff --git a/source/blender/blenlib/BLI_optionally_owned_ptr.hh b/source/blender/blenlib/BLI_optionally_owned_ptr.hh
index cfb9cf5273f..174491ad5f4 100644
--- a/source/blender/blenlib/BLI_optionally_owned_ptr.hh
+++ b/source/blender/blenlib/BLI_optionally_owned_ptr.hh
@@ -42,6 +42,19 @@ template<typename T, typename OwnedTPtr = std::unique_ptr<T>> class OptionallyOw
{
}
+ bool is_owned() const
+ {
+ return static_cast<bool>(owned_ptr_);
+ }
+
+ OwnedTPtr extract_owned()
+ {
+ OwnedTPtr ptr = std::move(owned_ptr_);
+ owned_ptr_ = OwnedTPtr{nullptr};
+ ptr_ = nullptr;
+ return ptr;
+ }
+
T *operator->()
{
BLI_assert(ptr_ != nullptr);
diff --git a/source/blender/blenlib/BLI_virtual_array.hh b/source/blender/blenlib/BLI_virtual_array.hh
index 1c02bce8411..71c6db7e56e 100644
--- a/source/blender/blenlib/BLI_virtual_array.hh
+++ b/source/blender/blenlib/BLI_virtual_array.hh
@@ -255,7 +255,7 @@ template<typename T> class VMutableArray : public VArray<T> {
}
};
-template<typename T> using VArrayPtr = std::unique_ptr<VArray<T>>;
+template<typename T> using VArrayPtr = std::unique_ptr<const VArray<T>>;
template<typename T> using VMutableArrayPtr = std::unique_ptr<VMutableArray<T>>;
/**
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 5152098f57a..33d1a92c386 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1418,6 +1418,11 @@ typedef struct NodeGeometryRaycast {
char _pad[1];
} NodeGeometryRaycast;
+typedef struct NodeGeometryAttribute {
+ /* eNodeSocketDatatype. */
+ int8_t output_type;
+} NodeGeometryAttribute;
+
/* script node mode */
#define NODE_SCRIPT_INTERNAL 0
#define NODE_SCRIPT_EXTERNAL 1
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 3d4256db335..4cbed2b6a33 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -2040,6 +2040,20 @@ static const EnumPropertyItem *rna_GeometryNodeSwitch_type_itemf(bContext *UNUSE
return itemf_function_check(node_socket_data_type_items, switch_type_supported);
}
+static bool attribute_type_supported(const EnumPropertyItem *item)
+{
+ return ELEM(item->value, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA);
+}
+
+static const EnumPropertyItem *rna_GeometryNodeAttribute_type_itemf(bContext *UNUSED(C),
+ PointerRNA *UNUSED(ptr),
+ PropertyRNA *UNUSED(prop),
+
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list