[Bf-blender-cvs] [12f9fd95164] pygpu_extensions: Geometry Nodes: Add operation setting to attribute randomize node
Hans Goudey
noreply at git.blender.org
Fri Feb 12 22:56:29 CET 2021
Commit: 12f9fd95164963c5d2d4906cbfa203419afcc0de
Author: Hans Goudey
Date: Fri Feb 12 13:25:45 2021 -0600
Branches: pygpu_extensions
https://developer.blender.org/rB12f9fd95164963c5d2d4906cbfa203419afcc0de
Geometry Nodes: Add operation setting to attribute randomize node
This commit adds a drop-down to the attribute randomize node to support
a few operations on the values of existing attributes: "Replace/Create"
(the existing behavior), "Add", "Subtract", and "Multiply".
At this point, the operations are limited by what is simple to implement.
More could be added in the future, but there isn't a strong use case
for more complex operations anyway, and a second math node can be used.
Differential Revision: https://developer.blender.org/D10269
===================================================================
M source/blender/blenkernel/BKE_blender_version.h
M source/blender/blenlib/BLI_hash.h
M source/blender/blenloader/intern/versioning_290.c
M source/blender/makesdna/DNA_node_types.h
M source/blender/makesrna/intern/rna_nodetree.c
M source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index c6fe02202a6..7db6980c91a 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -39,7 +39,7 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
-#define BLENDER_FILE_SUBVERSION 7
+#define BLENDER_FILE_SUBVERSION 8
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and show a warning if the file
diff --git a/source/blender/blenlib/BLI_hash.h b/source/blender/blenlib/BLI_hash.h
index d687e805323..cfd39ea3cf8 100644
--- a/source/blender/blenlib/BLI_hash.h
+++ b/source/blender/blenlib/BLI_hash.h
@@ -90,6 +90,16 @@ BLI_INLINE unsigned int BLI_hash_string(const char *str)
return i;
}
+BLI_INLINE float BLI_hash_int_2d_to_float(uint32_t kx, uint32_t ky)
+{
+ return (float)BLI_hash_int_2d(kx, ky) / (float)0xFFFFFFFFu;
+}
+
+BLI_INLINE float BLI_hash_int_3d_to_float(uint32_t kx, uint32_t ky, uint32_t kz)
+{
+ return (float)BLI_hash_int_3d(kx, ky, kz) / (float)0xFFFFFFFFu;
+}
+
BLI_INLINE unsigned int BLI_hash_int(unsigned int k)
{
return BLI_hash_int_2d(k, 0);
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index 78d60715aa5..74b3827ffd0 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -1704,6 +1704,25 @@ void blo_do_versions_290(FileData *fd, Library *UNUSED(lib), Main *bmain)
}
FOREACH_NODETREE_END;
}
+
+ if (!MAIN_VERSION_ATLEAST(bmain, 293, 8)) {
+ FOREACH_NODETREE_BEGIN (bmain, ntree, id) {
+ if (ntree->type != NTREE_GEOMETRY) {
+ continue;
+ }
+ LISTBASE_FOREACH (bNode *, node, &ntree->nodes) {
+ if (node->type == GEO_NODE_POINT_INSTANCE && node->storage == NULL) {
+ NodeAttributeRandomize *data = (NodeAttributeRandomize *)MEM_callocN(
+ sizeof(NodeAttributeRandomize), __func__);
+ data->data_type = node->custom1;
+ data->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE;
+ node->storage = data;
+ }
+ }
+ }
+ FOREACH_NODETREE_END;
+ }
+
/**
* Versioning code until next subversion bump goes here.
*
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 43c5fa81651..fd9fcfa3232 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -1109,6 +1109,16 @@ typedef struct NodeAttributeMix {
uint8_t input_type_b;
} NodeAttributeMix;
+typedef struct NodeAttributeRandomize {
+ /* CustomDataType. */
+ uint8_t data_type;
+ /* AttributeDomain. */
+ uint8_t domain;
+ /* GeometryNodeAttributeRandomizeMode. */
+ uint8_t operation;
+ char _pad[1];
+} NodeAttributeRandomize;
+
typedef struct NodeAttributeVectorMath {
/* NodeVectorMathOperation */
uint8_t operation;
@@ -1637,6 +1647,7 @@ typedef enum GeometryNodeAttributeInputMode {
GEO_NODE_ATTRIBUTE_INPUT_VECTOR = 2,
GEO_NODE_ATTRIBUTE_INPUT_COLOR = 3,
GEO_NODE_ATTRIBUTE_INPUT_BOOLEAN = 4,
+ GEO_NODE_ATTRIBUTE_INPUT_INTEGER = 5,
} GeometryNodeAttributeInputMode;
typedef enum GeometryNodePointDistributeMethod {
@@ -1649,6 +1660,13 @@ typedef enum GeometryNodeRotatePointsType {
GEO_NODE_POINT_ROTATE_TYPE_AXIS_ANGLE = 1,
} GeometryNodeRotatePointsType;
+typedef enum GeometryNodeAttributeRandomizeMode {
+ GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE = 0,
+ GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD = 1,
+ GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT = 2,
+ GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY = 3,
+} GeometryNodeAttributeRandomizeMode;
+
typedef enum GeometryNodeRotatePointsSpace {
GEO_NODE_POINT_ROTATE_SPACE_OBJECT = 0,
GEO_NODE_POINT_ROTATE_SPACE_POINT = 1,
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 3a9d373e30e..75d7c7a4588 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -355,6 +355,30 @@ const EnumPropertyItem rna_enum_node_filter_items[] = {
{0, NULL, 0, NULL, NULL},
};
+static const EnumPropertyItem rna_node_geometry_attribute_randomize_operation_items[] = {
+ {GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE,
+ "REPLACE_CREATE",
+ ICON_NONE,
+ "Replace/Create",
+ "Replace the value and data type of an existing attribute, or create a new one"},
+ {GEO_NODE_ATTRIBUTE_RANDOMIZE_ADD,
+ "ADD",
+ ICON_NONE,
+ "Add",
+ "Add the random values to the existing attribute values"},
+ {GEO_NODE_ATTRIBUTE_RANDOMIZE_SUBTRACT,
+ "SUBTRACT",
+ ICON_NONE,
+ "Subtract",
+ "Subtract random values from the existing attribute values"},
+ {GEO_NODE_ATTRIBUTE_RANDOMIZE_MULTIPLY,
+ "MULTIPLY",
+ ICON_NONE,
+ "Multiply",
+ "Multiply the existing attribute values with the random values"},
+ {0, NULL, 0, NULL, NULL},
+};
+
#ifndef RNA_RUNTIME
static const EnumPropertyItem node_sampler_type_items[] = {
{0, "NEAREST", 0, "Nearest", ""},
@@ -1921,7 +1945,7 @@ static const EnumPropertyItem *itemf_function_check(
static bool attribute_random_type_supported(const EnumPropertyItem *item)
{
- return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_BOOL);
+ return ELEM(item->value, CD_PROP_FLOAT, CD_PROP_FLOAT3, CD_PROP_BOOL, CD_PROP_INT32);
}
static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_type_itemf(
bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
@@ -1930,15 +1954,47 @@ static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_type_itemf(
return itemf_function_check(rna_enum_attribute_type_items, attribute_random_type_supported);
}
-static bool attribute_random_domain_supported(const EnumPropertyItem *item)
+static const EnumPropertyItem *rna_GeometryNodeAttributeRandomize_operation_itemf(
+ bContext *UNUSED(C), PointerRNA *ptr, PropertyRNA *UNUSED(prop), bool *r_free)
{
- return item->value == ATTR_DOMAIN_POINT;
+ bNode *node = ptr->data;
+ const NodeAttributeRandomize *node_storage = (NodeAttributeRandomize *)node->storage;
+ const CustomDataType data_type = (CustomDataType)node_storage->data_type;
+
+ EnumPropertyItem *item_array = NULL;
+ int items_len = 0;
+ for (const EnumPropertyItem *item = rna_node_geometry_attribute_randomize_operation_items;
+ item->identifier != NULL;
+ item++) {
+ if (data_type == CD_PROP_BOOL) {
+ if (item->value == GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE) {
+ RNA_enum_item_add(&item_array, &items_len, item);
+ }
+ }
+ else {
+ RNA_enum_item_add(&item_array, &items_len, item);
+ }
+ }
+ RNA_enum_item_end(&item_array, &items_len);
+
+ *r_free = true;
+ return item_array;
}
-static const EnumPropertyItem *rna_GeometryNodeAttributeRandom_domain_itemf(
- bContext *UNUSED(C), PointerRNA *UNUSED(ptr), PropertyRNA *UNUSED(prop), bool *r_free)
+
+static void rna_GeometryNodeAttributeRandomize_data_type_update(Main *bmain,
+ Scene *scene,
+ PointerRNA *ptr)
{
- *r_free = true;
- return itemf_function_check(rna_enum_attribute_domain_items, attribute_random_domain_supported);
+ bNode *node = ptr->data;
+ NodeAttributeRandomize *node_storage = (NodeAttributeRandomize *)node->storage;
+
+ /* The boolean data type has no extra operations besides,
+ * replace, so make sure the enum value is set properly. */
+ if (node_storage->data_type == CD_PROP_BOOL) {
+ node_storage->operation = GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE;
+ }
+
+ rna_Node_socket_update(bmain, scene, ptr);
}
static bool attribute_fill_type_supported(const EnumPropertyItem *item)
@@ -8528,9 +8584,27 @@ static void def_geo_attribute_create_common(StructRNA *srna,
static void def_geo_attribute_randomize(StructRNA *srna)
{
- def_geo_attribute_create_common(srna,
- "rna_GeometryNodeAttributeRandom_type_itemf",
- "rna_GeometryNodeAttributeRandom_domain_itemf");
+ PropertyRNA *prop;
+
+ RNA_def_struct_sdna_from(srna, "NodeAttributeRandomize", "storage");
+
+ prop = RNA_def_property(srna, "data_type", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "data_type");
+ RNA_def_property_enum_items(prop, rna_enum_attribute_type_items);
+ RNA_def_property_enum_funcs(prop, NULL, NULL, "rna_GeometryNodeAttributeRandom_type_itemf");
+ RNA_def_property_enum_default(prop, CD_PROP_FLOAT);
+ RNA_def_property_ui_text(prop, "Data Type", "Type of data stored in attribute");
+ RNA_def_property_update(
+ prop, NC_NODE | NA_EDITED, "rna_GeometryNodeAttributeRandomize_data_type_update");
+
+ prop = RNA_def_property(srna, "operation", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "operation");
+ RNA_def_property_enum_items(prop, rna_node_geometry_attribute_randomize_operation_items);
+ RNA_def_property_enum_funcs(
+ prop, NULL, NULL, "rna_GeometryNodeAttributeRandomize_operation_itemf");
+ RNA_def_property_enum_default(prop, GEO_NODE_ATTRIBUTE_RANDOMIZE_REPLACE_CREATE);
+ RNA_def_property_ui_text(prop, "Operation", "");
+ RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_socket_update");
}
static void def_geo_attribute_fill(StructRNA *srna)
diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
index 7e95714a44b..dc924ede3a1 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_randomize.cc
@@ -32,6 +32,8 @@ static bNodeSocketTemplate geo_node_attribute_randomize_in[] = {
{SOCK_VECTOR, N_("Max"), 1.0f, 1.0f, 1.0f, 0.0f, -FLT_MAX, FLT_MAX},
{SOCK_FLOAT, N_("Min"), 0.0f, 0.0f, 0.0f, 0.0f, -FLT_MAX, FLT_MAX},
{SOCK_FLOAT, N_("Max")
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list