Commit: d4fd06d6ce89113310bb769f4777c9a4d77cb155 Author: Hans Goudey Date: Fri Feb 12 13:25:45 2021 -0600 Branches: master https://developer.blender.org/rBd4fd06d6ce89113310bb769f4777c9a4d77cb155
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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
