Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_delete_geometry.cc
| Show First 20 Lines • Show All 523 Lines • ▼ Show 20 Lines | static void separate_point_cloud_selection(GeometrySet &geometry_set, | ||||
| Map<AttributeIDRef, AttributeKind> attributes; | Map<AttributeIDRef, AttributeKind> attributes; | ||||
| geometry_set.gather_attributes_for_propagation( | geometry_set.gather_attributes_for_propagation( | ||||
| {GEO_COMPONENT_TYPE_POINT_CLOUD}, GEO_COMPONENT_TYPE_POINT_CLOUD, false, attributes); | {GEO_COMPONENT_TYPE_POINT_CLOUD}, GEO_COMPONENT_TYPE_POINT_CLOUD, false, attributes); | ||||
| copy_attributes_based_on_mask(attributes, src_points, dst_points, ATTR_DOMAIN_POINT, mask); | copy_attributes_based_on_mask(attributes, src_points, dst_points, ATTR_DOMAIN_POINT, mask); | ||||
| geometry_set.replace_pointcloud(pointcloud); | geometry_set.replace_pointcloud(pointcloud); | ||||
| } | } | ||||
| static void separate_instance_selection(GeometrySet &geometry_set, | |||||
| const Field<bool> &selection_field, | |||||
| const bool invert) | |||||
| { | |||||
| InstancesComponent &instances = geometry_set.get_component_for_write<InstancesComponent>(); | |||||
| GeometryComponentFieldContext field_context{instances, ATTR_DOMAIN_INSTANCE}; | |||||
| const int domain_size = instances.attribute_domain_size(ATTR_DOMAIN_INSTANCE); | |||||
| fn::FieldEvaluator evaluator{field_context, domain_size}; | |||||
| evaluator.add(selection_field); | |||||
| evaluator.evaluate(); | |||||
| const VArray_Span<bool> &selection = evaluator.get_evaluated<bool>(0); | |||||
| Vector<int64_t> indices; | |||||
| const IndexMask mask = index_mask_indices(selection, invert, indices); | |||||
| if (mask.is_empty()) { | |||||
| geometry_set.remove<InstancesComponent>(); | |||||
| return; | |||||
| } | |||||
| instances.remove_instances(mask); | |||||
| } | |||||
| static void compute_selected_vertices_from_vertex_selection(const Span<bool> vertex_selection, | static void compute_selected_vertices_from_vertex_selection(const Span<bool> vertex_selection, | ||||
| const bool invert, | const bool invert, | ||||
| MutableSpan<int> r_vertex_map, | MutableSpan<int> r_vertex_map, | ||||
| int *r_num_selected_vertices) | int *r_num_selected_vertices) | ||||
| { | { | ||||
| BLI_assert(vertex_selection.size() == r_vertex_map.size()); | BLI_assert(vertex_selection.size() == r_vertex_map.size()); | ||||
| int num_selected_vertices = 0; | int num_selected_vertices = 0; | ||||
| ▲ Show 20 Lines • Show All 716 Lines • ▼ Show 20 Lines | void separate_geometry(GeometrySet &geometry_set, | ||||
| bool some_valid_domain = false; | bool some_valid_domain = false; | ||||
| if (geometry_set.has_pointcloud()) { | if (geometry_set.has_pointcloud()) { | ||||
| if (domain == ATTR_DOMAIN_POINT) { | if (domain == ATTR_DOMAIN_POINT) { | ||||
| separate_point_cloud_selection(geometry_set, selection_field, invert); | separate_point_cloud_selection(geometry_set, selection_field, invert); | ||||
| some_valid_domain = true; | some_valid_domain = true; | ||||
| } | } | ||||
| } | } | ||||
| if (geometry_set.has_mesh()) { | if (geometry_set.has_mesh()) { | ||||
| if (domain != ATTR_DOMAIN_CURVE) { | if (ELEM(domain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_EDGE, ATTR_DOMAIN_FACE, ATTR_DOMAIN_CORNER)) { | ||||
| separate_mesh_selection(geometry_set, selection_field, domain, mode, invert); | separate_mesh_selection(geometry_set, selection_field, domain, mode, invert); | ||||
| some_valid_domain = true; | some_valid_domain = true; | ||||
| } | } | ||||
| } | } | ||||
| if (geometry_set.has_curve()) { | if (geometry_set.has_curve()) { | ||||
| if (ELEM(domain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_CURVE)) { | if (ELEM(domain, ATTR_DOMAIN_POINT, ATTR_DOMAIN_CURVE)) { | ||||
| separate_curve_selection(geometry_set, selection_field, domain, invert); | separate_curve_selection(geometry_set, selection_field, domain, invert); | ||||
| some_valid_domain = true; | some_valid_domain = true; | ||||
| } | } | ||||
| } | } | ||||
| if (geometry_set.has_instances()) { | |||||
| if (domain == ATTR_DOMAIN_INSTANCE) { | |||||
| separate_instance_selection(geometry_set, selection_field, invert); | |||||
| some_valid_domain = true; | |||||
| } | |||||
| } | |||||
| r_is_error = !some_valid_domain && geometry_set.has_realized_data(); | r_is_error = !some_valid_domain && geometry_set.has_realized_data(); | ||||
| } | } | ||||
| } // namespace blender::nodes | } // namespace blender::nodes | ||||
| namespace blender::nodes::node_geo_delete_geometry_cc { | namespace blender::nodes::node_geo_delete_geometry_cc { | ||||
| NODE_STORAGE_FUNCS(NodeGeometryDeleteGeometry) | NODE_STORAGE_FUNCS(NodeGeometryDeleteGeometry) | ||||
| ▲ Show 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | |||||
| } // namespace blender::nodes::node_geo_delete_geometry_cc | } // namespace blender::nodes::node_geo_delete_geometry_cc | ||||
| void register_node_type_geo_delete_geometry() | void register_node_type_geo_delete_geometry() | ||||
| { | { | ||||
| namespace file_ns = blender::nodes::node_geo_delete_geometry_cc; | namespace file_ns = blender::nodes::node_geo_delete_geometry_cc; | ||||
| static bNodeType ntype; | static bNodeType ntype; | ||||
| geo_node_type_base(&ntype, GEO_NODE_DELETE_GEOMETRY, "Delete Geometry", NODE_CLASS_GEOMETRY, 0); | geo_node_type_base(&ntype, GEO_NODE_DELETE_GEOMETRY, "Delete Geometry", NODE_CLASS_GEOMETRY); | ||||
| node_type_storage(&ntype, | node_type_storage(&ntype, | ||||
| "NodeGeometryDeleteGeometry", | "NodeGeometryDeleteGeometry", | ||||
| node_free_standard_storage, | node_free_standard_storage, | ||||
| node_copy_standard_storage); | node_copy_standard_storage); | ||||
| node_type_init(&ntype, file_ns::node_init); | node_type_init(&ntype, file_ns::node_init); | ||||
| ntype.declare = file_ns::node_declare; | ntype.declare = file_ns::node_declare; | ||||
| ntype.geometry_node_execute = file_ns::node_geo_exec; | ntype.geometry_node_execute = file_ns::node_geo_exec; | ||||
| ntype.draw_buttons = file_ns::node_layout; | ntype.draw_buttons = file_ns::node_layout; | ||||
| nodeRegisterType(&ntype); | nodeRegisterType(&ntype); | ||||
| } | } | ||||