Fix: Missing edge domain in node tool set selection node
This wasn't implemented in the initial commit because we didn't have a function to flush edge selections to vertices and faces. But using the existing domain interpolations makes that trivial, so it may as well be added now to avoid the arbitrary limitation from the user perspective. See https://devtalk.blender.org/t/node-tools-feedback/31388/5 Pull Request: https://projects.blender.org/blender/blender/pulls/113367
This commit is contained in:
@@ -539,6 +539,7 @@ void BKE_mesh_flush_hidden_from_faces(struct Mesh *me);
|
||||
|
||||
void BKE_mesh_flush_select_from_faces(struct Mesh *me);
|
||||
void BKE_mesh_flush_select_from_verts(struct Mesh *me);
|
||||
void BKE_mesh_flush_select_from_edges(struct Mesh *me);
|
||||
|
||||
/* spatial evaluation */
|
||||
/**
|
||||
|
||||
@@ -683,6 +683,44 @@ void BKE_mesh_flush_select_from_verts(Mesh *me)
|
||||
select_poly.finish();
|
||||
}
|
||||
|
||||
void BKE_mesh_flush_select_from_edges(Mesh *me)
|
||||
{
|
||||
using namespace blender;
|
||||
using namespace blender::bke;
|
||||
MutableAttributeAccessor attributes = me->attributes_for_write();
|
||||
const VArray<bool> select_edge = *attributes.lookup_or_default<bool>(
|
||||
".select_edge", ATTR_DOMAIN_POINT, false);
|
||||
if (select_edge.is_single() && !select_edge.get_internal_single()) {
|
||||
attributes.remove(".select_vert");
|
||||
attributes.remove(".select_poly");
|
||||
return;
|
||||
}
|
||||
SpanAttributeWriter<bool> select_vert = attributes.lookup_or_add_for_write_only_span<bool>(
|
||||
".select_vert", ATTR_DOMAIN_POINT);
|
||||
SpanAttributeWriter<bool> select_poly = attributes.lookup_or_add_for_write_only_span<bool>(
|
||||
".select_poly", ATTR_DOMAIN_FACE);
|
||||
{
|
||||
IndexMaskMemory memory;
|
||||
const VArray<bool> hide_vert = *attributes.lookup_or_default<bool>(
|
||||
".hide_vert", ATTR_DOMAIN_POINT, false);
|
||||
array_utils::copy(
|
||||
*attributes.lookup_or_default<bool>(".select_vert", ATTR_DOMAIN_POINT, false),
|
||||
IndexMask::from_bools(hide_vert, memory).complement(hide_vert.index_range(), memory),
|
||||
select_vert.span);
|
||||
}
|
||||
{
|
||||
IndexMaskMemory memory;
|
||||
const VArray<bool> hide_poly = *attributes.lookup_or_default<bool>(
|
||||
".hide_poly", ATTR_DOMAIN_FACE, false);
|
||||
array_utils::copy(
|
||||
*attributes.lookup_or_default<bool>(".select_vert", ATTR_DOMAIN_FACE, false),
|
||||
IndexMask::from_bools(hide_poly, memory).complement(hide_poly.index_range(), memory),
|
||||
select_poly.span);
|
||||
}
|
||||
select_vert.finish();
|
||||
select_poly.finish();
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
@@ -225,7 +225,7 @@ DEF_ENUM(rna_enum_attribute_type_with_auto_items)
|
||||
DEF_ENUM(rna_enum_attribute_domain_items)
|
||||
DEF_ENUM(rna_enum_attribute_domain_edge_face_items)
|
||||
DEF_ENUM(rna_enum_attribute_domain_only_mesh_items)
|
||||
DEF_ENUM(rna_enum_attribute_domain_point_face_curve_items)
|
||||
DEF_ENUM(rna_enum_attribute_domain_point_edge_face_curve_items)
|
||||
DEF_ENUM(rna_enum_attribute_curves_domain_items)
|
||||
DEF_ENUM(rna_enum_color_attribute_domain_items)
|
||||
DEF_ENUM(rna_enum_attribute_domain_without_corner_items)
|
||||
|
||||
@@ -99,8 +99,9 @@ const EnumPropertyItem rna_enum_attribute_domain_only_mesh_items[] = {
|
||||
{0, nullptr, 0, nullptr, nullptr},
|
||||
};
|
||||
|
||||
const EnumPropertyItem rna_enum_attribute_domain_point_face_curve_items[] = {
|
||||
const EnumPropertyItem rna_enum_attribute_domain_point_edge_face_curve_items[] = {
|
||||
{ATTR_DOMAIN_POINT, "POINT", 0, "Point", "Attribute on point"},
|
||||
{ATTR_DOMAIN_EDGE, "EDGE", 0, "Edge", "Attribute on mesh edge"},
|
||||
{ATTR_DOMAIN_FACE, "FACE", 0, "Face", "Attribute on mesh faces"},
|
||||
{ATTR_DOMAIN_CURVE, "CURVE", 0, "Spline", "Attribute on spline"},
|
||||
{0, nullptr, 0, nullptr, nullptr},
|
||||
|
||||
@@ -54,6 +54,13 @@ static void node_geo_exec(GeoNodeExecParams params)
|
||||
selection);
|
||||
BKE_mesh_flush_select_from_verts(mesh);
|
||||
break;
|
||||
case ATTR_DOMAIN_EDGE:
|
||||
bke::try_capture_field_on_geometry(geometry.get_component_for_write<MeshComponent>(),
|
||||
".select_edge",
|
||||
ATTR_DOMAIN_EDGE,
|
||||
selection);
|
||||
BKE_mesh_flush_select_from_edges(mesh);
|
||||
break;
|
||||
case ATTR_DOMAIN_FACE:
|
||||
/* Remove attributes in case they are on the wrong domain, which can happen after
|
||||
* conversion to and from other geometry types. */
|
||||
@@ -93,7 +100,7 @@ static void node_rna(StructRNA *srna)
|
||||
"domain",
|
||||
"Domain",
|
||||
"",
|
||||
rna_enum_attribute_domain_point_face_curve_items,
|
||||
rna_enum_attribute_domain_point_edge_face_curve_items,
|
||||
NOD_inline_enum_accessors(custom1),
|
||||
ATTR_DOMAIN_POINT);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user