Geometry Nodes: Duplicate Elements Node
This adds a node which copies part of a geometry a dynamic number of times. Different parts of the geometry can be copied differing amounts of times, controlled by the amount input field. Geometry can also be ignored by use of the selection input. The output geometry contains only the copies created by the node. if the amount input is set to zero, the output geometry will be empty. The duplicate index output is an integer index with the copy number of each duplicate. Differential Revision: https://developer.blender.org/D13701
This commit is contained in:
parent
e32b676baf
commit
120f16fa1f
Notes:
blender-bot
2023-02-14 06:27:47 +01:00
Referenced by issue #98400, Geometry Nodes: Crash with Duplicate Elements and Set ID Referenced by issue #93259, Duplicate Geometry node
|
@ -164,6 +164,7 @@ def geometry_node_items(context):
|
|||
yield NodeItem("GeometryNodeBoundBox")
|
||||
yield NodeItem("GeometryNodeConvexHull")
|
||||
yield NodeItem("GeometryNodeDeleteGeometry")
|
||||
yield NodeItem("GeometryNodeDuplicateElements")
|
||||
yield NodeItem("GeometryNodeGeometryToInstance")
|
||||
yield NodeItem("GeometryNodeMergeByDistance")
|
||||
yield NodeItem("GeometryNodeProximity")
|
||||
|
|
|
@ -1515,6 +1515,8 @@ struct TexResult;
|
|||
#define GEO_NODE_EXTRUDE_MESH 1152
|
||||
#define GEO_NODE_MERGE_BY_DISTANCE 1153
|
||||
|
||||
#define GEO_NODE_DUPLICATE_ELEMENTS 1160
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
|
|
@ -4751,6 +4751,7 @@ static void registerGeometryNodes()
|
|||
register_node_type_geo_curve_to_points();
|
||||
register_node_type_geo_curve_trim();
|
||||
register_node_type_geo_delete_geometry();
|
||||
register_node_type_geo_duplicate_elements();
|
||||
register_node_type_geo_distribute_points_on_faces();
|
||||
register_node_type_geo_dual_mesh();
|
||||
register_node_type_geo_edge_split();
|
||||
|
|
|
@ -1610,6 +1610,11 @@ typedef struct NodeGeometryDeleteGeometry {
|
|||
int8_t mode;
|
||||
} NodeGeometryDeleteGeometry;
|
||||
|
||||
typedef struct NodeGeometryDuplicateElements {
|
||||
/* AttributeDomain. */
|
||||
int8_t domain;
|
||||
} NodeGeometryDuplicateElements;
|
||||
|
||||
typedef struct NodeGeometrySeparateGeometry {
|
||||
/* AttributeDomain. */
|
||||
int8_t domain;
|
||||
|
|
|
@ -11287,6 +11287,27 @@ static void def_geo_delete_geometry(StructRNA *srna)
|
|||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
|
||||
}
|
||||
|
||||
static void def_geo_duplicate_elements(StructRNA *srna)
|
||||
{
|
||||
PropertyRNA *prop;
|
||||
|
||||
static const EnumPropertyItem domain_items[] = {
|
||||
{ATTR_DOMAIN_POINT, "POINT", 0, "Point", ""},
|
||||
{ATTR_DOMAIN_EDGE, "EDGE", 0, "Edge", ""},
|
||||
{ATTR_DOMAIN_FACE, "FACE", 0, "Face", ""},
|
||||
{ATTR_DOMAIN_CURVE, "SPLINE", 0, "Spline", ""},
|
||||
{ATTR_DOMAIN_INSTANCE, "INSTANCE", 0, "Instance", ""},
|
||||
{0, NULL, 0, NULL, NULL},
|
||||
};
|
||||
RNA_def_struct_sdna_from(srna, "NodeGeometryDuplicateElements", "storage");
|
||||
|
||||
prop = RNA_def_property(srna, "domain", PROP_ENUM, PROP_NONE);
|
||||
RNA_def_property_enum_items(prop, domain_items);
|
||||
RNA_def_property_enum_default(prop, ATTR_DOMAIN_POINT);
|
||||
RNA_def_property_ui_text(prop, "Domain", "Which domain to duplicate");
|
||||
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
|
||||
}
|
||||
|
||||
static void def_geo_string_to_curves(StructRNA *srna)
|
||||
{
|
||||
static const EnumPropertyItem rna_node_geometry_string_to_curves_overflow_items[] = {
|
||||
|
|
|
@ -82,6 +82,7 @@ void register_node_type_geo_curve_to_mesh(void);
|
|||
void register_node_type_geo_curve_to_points(void);
|
||||
void register_node_type_geo_curve_trim(void);
|
||||
void register_node_type_geo_delete_geometry(void);
|
||||
void register_node_type_geo_duplicate_elements(void);
|
||||
void register_node_type_geo_distribute_points_on_faces(void);
|
||||
void register_node_type_geo_dual_mesh(void);
|
||||
void register_node_type_geo_edge_split(void);
|
||||
|
|
|
@ -338,6 +338,7 @@ DefNode(GeometryNode, GEO_NODE_CURVE_SPLINE_TYPE, def_geo_curve_spline_type, "CU
|
|||
DefNode(GeometryNode, GEO_NODE_CURVE_TO_MESH, 0, "CURVE_TO_MESH", CurveToMesh, "Curve to Mesh", "")
|
||||
DefNode(GeometryNode, GEO_NODE_CURVE_TO_POINTS, def_geo_curve_to_points, "CURVE_TO_POINTS", CurveToPoints, "Curve to Points", "")
|
||||
DefNode(GeometryNode, GEO_NODE_DELETE_GEOMETRY, def_geo_delete_geometry, "DELETE_GEOMETRY", DeleteGeometry, "Delete Geometry", "")
|
||||
DefNode(GeometryNode, GEO_NODE_DUPLICATE_ELEMENTS, def_geo_duplicate_elements, "DUPLICATE_ELEMENTS", DuplicateElements, "Duplicate Elements", "")
|
||||
DefNode(GeometryNode, GEO_NODE_DISTRIBUTE_POINTS_ON_FACES, def_geo_distribute_points_on_faces, "DISTRIBUTE_POINTS_ON_FACES", DistributePointsOnFaces, "Distribute Points on Faces", "")
|
||||
DefNode(GeometryNode, GEO_NODE_ACCUMULATE_FIELD, def_geo_accumulate_field, "ACCUMULATE_FIELD", AccumulateField, "Accumulate Field", "")
|
||||
DefNode(GeometryNode, GEO_NODE_DUAL_MESH, 0, "DUAL_MESH", DualMesh, "Dual Mesh", "")
|
||||
|
|
|
@ -98,6 +98,7 @@ set(SRC
|
|||
nodes/node_geo_curve_to_points.cc
|
||||
nodes/node_geo_curve_trim.cc
|
||||
nodes/node_geo_delete_geometry.cc
|
||||
nodes/node_geo_duplicate_elements.cc
|
||||
nodes/node_geo_distribute_points_on_faces.cc
|
||||
nodes/node_geo_dual_mesh.cc
|
||||
nodes/node_geo_edge_split.cc
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue