84 params.error_message_add(NodeWarningType::Error,
85 "Selection control is not supported in object mode");
86 params.set_output(
"Geometry", std::move(geometry));
91 const AttrDomain domain = AttrDomain(
params.node().custom1);
93 geometry.modify_geometry_sets([&](
GeometrySet &geometry) {
94 if (
Mesh *mesh = geometry.get_mesh_for_write()) {
97 const Field<bool> field = conversions.try_convert(selection, CPPType::get<bool>());
99 case AttrDomain::Point:
102 mesh->attributes_for_write().remove(
".select_edge");
103 mesh->attributes_for_write().remove(
".select_poly");
104 bke::try_capture_field_on_geometry(geometry.get_component_for_write<MeshComponent>(),
108 bke::mesh_select_vert_flush(*mesh);
110 case AttrDomain::Edge:
111 bke::try_capture_field_on_geometry(geometry.get_component_for_write<MeshComponent>(),
115 bke::mesh_select_edge_flush(*mesh);
117 case AttrDomain::Face:
120 mesh->attributes_for_write().remove(
".select_vert");
121 mesh->attributes_for_write().remove(
".select_edge");
122 bke::try_capture_field_on_geometry(geometry.get_component_for_write<MeshComponent>(),
126 bke::mesh_select_face_flush(*mesh);
134 case OB_MODE_SCULPT: {
135 GField on_domain = GField(
136 std::make_shared<bke::EvaluateOnDomainInput>(selection, domain));
137 GField clamped_and_inverted = invert_selection(clamp_selection(std::move(on_domain)));
138 const Field<float> field = conversions.try_convert(std::move(clamped_and_inverted),
139 CPPType::get<float>());
140 bke::try_capture_field_on_geometry(geometry.get_component_for_write<MeshComponent>(),
151 if (geometry.has_curves()) {
152 const Field<float> field = clamp_selection(selection);
153 if (ELEM(domain, AttrDomain::Point, AttrDomain::Curve)) {
154 bke::try_capture_field_on_geometry(
155 geometry.get_component_for_write<CurveComponent>(),
".selection", domain, field);
158 if (geometry.has_pointcloud()) {
159 const Field<float> field = clamp_selection(selection);
160 if (domain == AttrDomain::Point) {
161 bke::try_capture_field_on_geometry(
162 geometry.get_component_for_write<PointCloudComponent>(),
".selection", domain, field);
166 params.set_output(
"Geometry", std::move(geometry));