Commit: d034b85f3325379c40981502e44a07e5ef4c7d14 Author: Jacques Lucke Date: Fri Jan 21 17:34:47 2022 +0100 Branches: master https://developer.blender.org/rBd034b85f3325379c40981502e44a07e5ef4c7d14
Geometry Nodes: new Scale Elements nodes This node can scale individual edges and faces. When multiple selected faces/edges share the same vertices, they are scaled together. The center and scaling factor is averaged in this case. For some examples see D13757. Differential Revision: https://developer.blender.org/D13757 =================================================================== M release/scripts/startup/nodeitems_builtins.py M source/blender/blenkernel/BKE_node.h M source/blender/blenkernel/intern/node.cc M source/blender/makesdna/DNA_node_types.h M source/blender/makesrna/intern/rna_nodetree.c M source/blender/nodes/NOD_geometry.h M source/blender/nodes/NOD_static_types.h M source/blender/nodes/geometry/CMakeLists.txt A source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc =================================================================== diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 772668cb3fb..b8099127a55 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -150,6 +150,7 @@ def mesh_node_items(context): yield NodeItem("GeometryNodeSubdivideMesh") yield NodeItem("GeometryNodeSubdivisionSurface") yield NodeItem("GeometryNodeTriangulate") + yield NodeItem("GeometryNodeScaleElements") yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) yield NodeItem("GeometryNodeInputMeshEdgeAngle") yield NodeItem("GeometryNodeInputMeshEdgeNeighbors") diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index ccea76fc24d..3b952204755 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -1631,6 +1631,7 @@ int ntreeTexExecTree(struct bNodeTree *ntree, #define GEO_NODE_FIELD_AT_INDEX 1148 #define GEO_NODE_CURVE_PRIMITIVE_ARC 1149 #define GEO_NODE_FLIP_FACES 1150 +#define GEO_NODE_SCALE_ELEMENTS 1151 /** \} */ diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 9ee54c9ebeb..1acd4248639 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -4825,6 +4825,7 @@ static void registerGeometryNodes() register_node_type_geo_realize_instances(); register_node_type_geo_rotate_instances(); register_node_type_geo_sample_texture(); + register_node_type_geo_scale_elements(); register_node_type_geo_scale_instances(); register_node_type_geo_separate_components(); register_node_type_geo_separate_geometry(); diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index a23e45f8b74..10058204e88 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -2341,6 +2341,11 @@ typedef enum GeometryNodeRealizeInstancesFlag { GEO_NODE_REALIZE_INSTANCES_LEGACY_BEHAVIOR = (1 << 0), } GeometryNodeRealizeInstancesFlag; +typedef enum GeometryNodeScaleElementsMode { + GEO_NODE_SCALE_ELEMENTS_UNIFORM = 0, + GEO_NODE_SCALE_ELEMENTS_SINGLE_AXIS = 1, +} GeometryNodeScaleElementsMode; + #ifdef __cplusplus } #endif diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c index adb6b1e4e34..c506c35e281 100644 --- a/source/blender/makesrna/intern/rna_nodetree.c +++ b/source/blender/makesrna/intern/rna_nodetree.c @@ -11422,6 +11422,53 @@ static void def_geo_field_at_index(StructRNA *srna) RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_GeometryNode_socket_update"); } +static void def_geo_scale_elements(StructRNA *srna) +{ + PropertyRNA *prop; + + static const EnumPropertyItem domain_items[] = { + {ATTR_DOMAIN_FACE, + "FACE", + ICON_NONE, + "Face", + "Scale individual faces or neighboring face islands"}, + {ATTR_DOMAIN_EDGE, + "EDGE", + ICON_NONE, + "Edge", + "Scale individual edges or neighboring edge islands"}, + {0, NULL, 0, NULL, NULL}, + }; + + static const EnumPropertyItem scale_mode_items[] = { + {GEO_NODE_SCALE_ELEMENTS_UNIFORM, + "UNIFORM", + ICON_NONE, + "Uniform", + "Scale elements by the same factor in every direction"}, + {GEO_NODE_SCALE_ELEMENTS_SINGLE_AXIS, + "SINGLE_AXIS", + ICON_NONE, + "Single Axis", + "Scale elements in a single direction"}, + {0, NULL, 0, NULL, NULL}, + + }; + + prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom1"); + RNA_def_property_enum_items(prop, domain_items); + RNA_def_property_enum_default(prop, ATTR_DOMAIN_FACE); + RNA_def_property_ui_text(prop, "Domain", "Element type to transform"); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_GeometryNode_socket_update"); + + prop = RNA_def_property(srna, "scale_mode", PROP_ENUM, PROP_NONE); + RNA_def_property_enum_sdna(prop, NULL, "custom2"); + RNA_def_property_enum_items(prop, scale_mode_items); + RNA_def_property_ui_text(prop, "Scale Mode", ""); + RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_GeometryNode_socket_update"); +} + /* -------------------------------------------------------------------------- */ static void rna_def_shader_node(BlenderRNA *brna) diff --git a/source/blender/nodes/NOD_geometry.h b/source/blender/nodes/NOD_geometry.h index ff4036308c6..9c9e3876662 100644 --- a/source/blender/nodes/NOD_geometry.h +++ b/source/blender/nodes/NOD_geometry.h @@ -156,6 +156,7 @@ void register_node_type_geo_raycast(void); void register_node_type_geo_realize_instances(void); void register_node_type_geo_rotate_instances(void); void register_node_type_geo_sample_texture(void); +void register_node_type_geo_scale_elements(void); void register_node_type_geo_scale_instances(void); void register_node_type_geo_select_by_handle_type(void); void register_node_type_geo_separate_components(void); diff --git a/source/blender/nodes/NOD_static_types.h b/source/blender/nodes/NOD_static_types.h index 53d6d64ef84..06a1cf90fca 100644 --- a/source/blender/nodes/NOD_static_types.h +++ b/source/blender/nodes/NOD_static_types.h @@ -407,6 +407,7 @@ DefNode(GeometryNode, GEO_NODE_RESAMPLE_CURVE, def_geo_curve_resample, "RESAMPLE DefNode(GeometryNode, GEO_NODE_REVERSE_CURVE, 0, "REVERSE_CURVE", ReverseCurve, "Reverse Curve", "") DefNode(GeometryNode, GEO_NODE_ROTATE_INSTANCES, 0, "ROTATE_INSTANCES", RotateInstances, "Rotate Instances", "") DefNode(GeometryNode, GEO_NODE_SAMPLE_CURVE, def_geo_curve_sample, "SAMPLE_CURVE", SampleCurve, "Sample Curve", "") +DefNode(GeometryNode, GEO_NODE_SCALE_ELEMENTS, def_geo_scale_elements, "SCALE_ELEMENTS", ScaleElements, "Scale Elements", "") DefNode(GeometryNode, GEO_NODE_SCALE_INSTANCES, 0, "SCALE_INSTANCES", ScaleInstances, "Scale Instances", "") DefNode(GeometryNode, GEO_NODE_SEPARATE_COMPONENTS, 0, "SEPARATE_COMPONENTS", SeparateComponents, "Separate Components", "") DefNode(GeometryNode, GEO_NODE_SEPARATE_GEOMETRY, def_geo_separate_geometry, "SEPARATE_GEOMETRY", SeparateGeometry, "Separate Geometry", "") diff --git a/source/blender/nodes/geometry/CMakeLists.txt b/source/blender/nodes/geometry/CMakeLists.txt index 37d7843020a..37b43c26a86 100644 --- a/source/blender/nodes/geometry/CMakeLists.txt +++ b/source/blender/nodes/geometry/CMakeLists.txt @@ -167,6 +167,7 @@ set(SRC nodes/node_geo_raycast.cc nodes/node_geo_realize_instances.cc nodes/node_geo_rotate_instances.cc + nodes/node_geo_scale_elements.cc nodes/node_geo_scale_instances.cc nodes/node_geo_separate_components.cc nodes/node_geo_separate_geometry.cc diff --git a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc new file mode 100644 index 00000000000..fd599b7ca61 --- /dev/null +++ b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc @@ -0,0 +1,485 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "BLI_array.hh" +#include "BLI_disjoint_set.hh" +#include "BLI_task.hh" +#include "BLI_vector.hh" +#include "BLI_vector_set.hh" + +#include "DNA_mesh_types.h" +#include "DNA_meshdata_types.h" + +#include "UI_interface.h" +#include "UI_resources.h" + +#include "BKE_mesh.h" + +#include "node_geometry_util.hh" + +namespace blender::nodes::node_geo_scale_elements_cc { + +static void node_declare(NodeDeclarationBuilder &b) +{ + b.add_input<decl::Geometry>(N_("Geometry")).supported_type(GEO_COMPONENT_TYPE_MESH); + b.add_input<decl::Bool>(N_("Selection")).default_value(true).hide_value().supports_field(); + b.add_input<decl::Float>(N_("Scale"), "Scale").default_value(1.0f).min(0.0f).supports_field(); + b.add_input<decl::Vector>(N_("Center")) + .subtype(PROP_TRANSLATION) + .implicit_field() + .description(N_("Origin of the scaling for each element. If multiple elements are " + "connected, their center is averaged")); + b.add_input<decl::Vector>(N_("Axis")) + .default_value({1.0f, 0.0f, 0.0f}) + .supports_field() + .description(N_("Direction in which to scale the element")); + b.add_output<decl::Geometry>(N_("Geometry")); +}; + +static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr) +{ + uiItemR(layout, ptr, "domain", 0, "", ICON_NONE); + uiItemR(layout, ptr, "scale_mode", 0, "", ICON_NONE); +} + +static void node_init(bNodeTree *UNUSED(tree), bNode *node) +{ + node->custom1 = ATTR_DOMAIN_FACE; + node->custom2 = GEO_NODE_SCALE_ELEMENTS_UNIFORM; +} + +static void node_update(bNodeTree *ntree, bNode *node) +{ + bNodeSocket *geometry_socket = static_cast<bNodeSocket *>(node->inputs.first); + bNodeSocket *selection_socket = geometry_socket->next; + bNodeSocket *scale_float_socket = selection_socket->next; + bNodeSocket *center_socket = scale_float_socket->next; + bNodeSocket *axis_socket = center_socket->next; + + const GeometryNodeScaleElementsMode mode = static_cast<GeometryNodeScaleElementsMode>( + node->custom2); + const bool use_single_axis = mode == GEO_NODE_SCALE_ELEMENTS_SINGLE_AXIS; + + nodeSetSocketAvailability(ntree, axis_socket, use_single_axis); +} + +struct UniformScaleFields { + Field<bool> selection; + Field<float> scale; + Field<float3> center; +}; + +struct UniformScaleParams { + IndexMask selection; + VArray< @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
