Cleanup: Simplify logic, rename variables

Return the map of gathered attributes directly, use simpler
naming for "attributes" and "gathered_attributes".
This commit is contained in:
Hans Goudey 2022-03-24 22:29:23 -05:00
parent 83c99ccb21
commit 9b2879f8b3
1 changed files with 60 additions and 67 deletions

View File

@ -60,18 +60,16 @@ struct IndexAttributes {
/** \name Utility Functions
* \{ */
static void gather_attributes_without_id(const GeometrySet &geometry_set,
const GeometryComponentType component_type,
const Span<std::string> skip_attributes,
const bool include_instances,
Map<AttributeIDRef, AttributeKind> &r_gathered_attributes)
static Map<AttributeIDRef, AttributeKind> gather_attributes_without_id(
const GeometrySet &geometry_set,
const GeometryComponentType component_type,
const bool include_instances)
{
Map<AttributeIDRef, AttributeKind> attributes;
geometry_set.gather_attributes_for_propagation(
{component_type}, component_type, include_instances, r_gathered_attributes);
for (const std::string &attribute : skip_attributes) {
r_gathered_attributes.remove(attribute);
}
r_gathered_attributes.remove("id");
{component_type}, component_type, include_instances, attributes);
attributes.remove("id");
return attributes;
};
static IndexRange range_for_offsets_index(const Span<int> offsets, const int index)
@ -141,11 +139,11 @@ static void threaded_id_offset_copy(const Span<int> offsets,
static void create_duplicate_index_attribute(GeometryComponent &component,
const AttributeDomain output_domain,
const IndexMask selection,
const IndexAttributes &attributes,
const IndexAttributes &attribute_outputs,
const Span<int> offsets)
{
OutputAttribute_Typed<int> copy_attribute = component.attribute_try_get_for_output_only<int>(
attributes.duplicate_index.get(), output_domain);
attribute_outputs.duplicate_index.get(), output_domain);
MutableSpan<int> duplicate_indices = copy_attribute.as_span();
for (const int i : IndexRange(selection.size())) {
const IndexRange range = range_for_offsets_index(offsets, i);
@ -193,11 +191,10 @@ static void copy_point_attributes_without_id(GeometrySet &geometry_set,
const GeometryComponent &src_component,
GeometryComponent &dst_component)
{
Map<AttributeIDRef, AttributeKind> gathered_attributes;
gather_attributes_without_id(
geometry_set, component_type, {}, include_instances, gathered_attributes);
Map<AttributeIDRef, AttributeKind> attributes = gather_attributes_without_id(
geometry_set, component_type, include_instances);
for (const Map<AttributeIDRef, AttributeKind>::Item entry : gathered_attributes.items()) {
for (const Map<AttributeIDRef, AttributeKind>::Item entry : attributes.items()) {
const AttributeIDRef attribute_id = entry.key;
ReadAttributeLookup src_attribute = src_component.attribute_try_get_for_read(attribute_id);
if (!src_attribute || src_attribute.domain != ATTR_DOMAIN_POINT) {
@ -239,12 +236,10 @@ static void copy_curve_attributes_without_id(const GeometrySet &geometry_set,
bke::CurvesGeometry &dst_curves,
CurveComponent &dst_component)
{
Map<AttributeIDRef, AttributeKind> gathered_attributes;
gather_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_CURVE, {}, false, gathered_attributes);
for (const Map<AttributeIDRef, AttributeKind>::Item entry : gathered_attributes.items()) {
Map<AttributeIDRef, AttributeKind> attributes = gather_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_CURVE, false);
for (const Map<AttributeIDRef, AttributeKind>::Item entry : attributes.items()) {
const AttributeIDRef attribute_id = entry.key;
ReadAttributeLookup src_attribute = src_component.attribute_try_get_for_read(attribute_id);
if (!src_attribute) {
@ -332,7 +327,7 @@ static void copy_stable_id_curves(const bke::CurvesGeometry &src_curves,
static void duplicate_curves(GeometrySet &geometry_set,
const Field<int> &count_field,
const Field<bool> &selection_field,
const IndexAttributes &attributes)
const IndexAttributes &attribute_outputs)
{
if (!geometry_set.has_curves()) {
geometry_set.keep_only({GEO_COMPONENT_TYPE_INSTANCES});
@ -395,9 +390,9 @@ static void duplicate_curves(GeometrySet &geometry_set,
copy_stable_id_curves(
curves, selection, curve_offsets, src_component, new_curves, dst_component);
if (attributes.duplicate_index) {
if (attribute_outputs.duplicate_index) {
create_duplicate_index_attribute(
dst_component, ATTR_DOMAIN_CURVE, selection, attributes, curve_offsets);
dst_component, ATTR_DOMAIN_CURVE, selection, attribute_outputs, curve_offsets);
}
geometry_set.replace_curves(new_curves_id);
@ -421,11 +416,10 @@ static void copy_face_attributes_without_id(GeometrySet &geometry_set,
const GeometryComponent &src_component,
GeometryComponent &dst_component)
{
Map<AttributeIDRef, AttributeKind> gathered_attributes;
gather_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_MESH, {}, false, gathered_attributes);
Map<AttributeIDRef, AttributeKind> attributes = gather_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_MESH, false);
for (const Map<AttributeIDRef, AttributeKind>::Item entry : gathered_attributes.items()) {
for (const Map<AttributeIDRef, AttributeKind>::Item entry : attributes.items()) {
const AttributeIDRef attribute_id = entry.key;
ReadAttributeLookup src_attribute = src_component.attribute_try_get_for_read(attribute_id);
if (!src_attribute) {
@ -521,7 +515,7 @@ static void copy_stable_id_faces(const Mesh &mesh,
static void duplicate_faces(GeometrySet &geometry_set,
const Field<int> &count_field,
const Field<bool> &selection_field,
const IndexAttributes &attributes)
const IndexAttributes &attribute_outputs)
{
if (!geometry_set.has_mesh()) {
geometry_set.keep_only({GEO_COMPONENT_TYPE_INSTANCES});
@ -609,9 +603,9 @@ static void duplicate_faces(GeometrySet &geometry_set,
copy_stable_id_faces(mesh, selection, offsets, vert_mapping, src_component, dst_component);
if (attributes.duplicate_index) {
if (attribute_outputs.duplicate_index) {
create_duplicate_index_attribute(
dst_component, ATTR_DOMAIN_FACE, selection, attributes, offsets);
dst_component, ATTR_DOMAIN_FACE, selection, attribute_outputs, offsets);
}
geometry_set.replace_mesh(new_mesh);
@ -633,11 +627,10 @@ static void copy_edge_attributes_without_id(GeometrySet &geometry_set,
const GeometryComponent &src_component,
GeometryComponent &dst_component)
{
Map<AttributeIDRef, AttributeKind> gathered_attributes;
gather_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_MESH, {}, false, gathered_attributes);
Map<AttributeIDRef, AttributeKind> attributes = gather_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_MESH, false);
for (const Map<AttributeIDRef, AttributeKind>::Item entry : gathered_attributes.items()) {
for (const Map<AttributeIDRef, AttributeKind>::Item entry : attributes.items()) {
const AttributeIDRef attribute_id = entry.key;
ReadAttributeLookup src_attribute = src_component.attribute_try_get_for_read(attribute_id);
if (!src_attribute) {
@ -719,7 +712,7 @@ static void copy_stable_id_edges(const Mesh &mesh,
static void duplicate_edges(GeometrySet &geometry_set,
const Field<int> &count_field,
const Field<bool> &selection_field,
const IndexAttributes &attributes)
const IndexAttributes &attribute_outputs)
{
if (!geometry_set.has_mesh()) {
geometry_set.keep_only({GEO_COMPONENT_TYPE_INSTANCES});
@ -778,9 +771,9 @@ static void duplicate_edges(GeometrySet &geometry_set,
copy_stable_id_edges(mesh, selection, edge_offsets, src_component, dst_component);
if (attributes.duplicate_index) {
if (attribute_outputs.duplicate_index) {
create_duplicate_index_attribute(
dst_component, ATTR_DOMAIN_EDGE, selection, attributes, edge_offsets);
dst_component, ATTR_DOMAIN_EDGE, selection, attribute_outputs, edge_offsets);
}
geometry_set.replace_mesh(new_mesh);
@ -795,7 +788,7 @@ static void duplicate_edges(GeometrySet &geometry_set,
static void duplicate_points_curve(GeometrySet &geometry_set,
const Field<int> &count_field,
const Field<bool> &selection_field,
const IndexAttributes &attributes)
const IndexAttributes &attribute_outputs)
{
const CurveComponent &src_component = *geometry_set.get_component_for_read<CurveComponent>();
const Curves &src_curves_id = *src_component.get_for_read();
@ -834,11 +827,10 @@ static void duplicate_points_curve(GeometrySet &geometry_set,
CurveComponent dst_component;
dst_component.replace(new_curves_id, GeometryOwnershipType::Editable);
Map<AttributeIDRef, AttributeKind> gathered_attributes;
gather_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_CURVE, {}, false, gathered_attributes);
Map<AttributeIDRef, AttributeKind> attributes = gather_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_CURVE, false);
for (const Map<AttributeIDRef, AttributeKind>::Item entry : gathered_attributes.items()) {
for (const Map<AttributeIDRef, AttributeKind>::Item entry : attributes.items()) {
const AttributeIDRef attribute_id = entry.key;
ReadAttributeLookup src_attribute = src_component.attribute_try_get_for_read(attribute_id);
if (!src_attribute) {
@ -881,9 +873,9 @@ static void duplicate_points_curve(GeometrySet &geometry_set,
copy_stable_id_point(offsets, src_component, dst_component);
if (attributes.duplicate_index) {
if (attribute_outputs.duplicate_index) {
create_duplicate_index_attribute(
dst_component, ATTR_DOMAIN_POINT, selection, attributes, offsets.as_span());
dst_component, ATTR_DOMAIN_POINT, selection, attribute_outputs, offsets.as_span());
}
geometry_set.replace_curves(new_curves_id);
@ -898,7 +890,7 @@ static void duplicate_points_curve(GeometrySet &geometry_set,
static void duplicate_points_mesh(GeometrySet &geometry_set,
const Field<int> &count_field,
const Field<bool> &selection_field,
const IndexAttributes &attributes)
const IndexAttributes &attribute_outputs)
{
const MeshComponent &src_component = *geometry_set.get_component_for_read<MeshComponent>();
const Mesh &mesh = *geometry_set.get_mesh_for_read();
@ -926,9 +918,9 @@ static void duplicate_points_mesh(GeometrySet &geometry_set,
copy_stable_id_point(offsets, src_component, dst_component);
if (attributes.duplicate_index) {
if (attribute_outputs.duplicate_index) {
create_duplicate_index_attribute(
dst_component, ATTR_DOMAIN_POINT, selection, attributes, offsets.as_span());
dst_component, ATTR_DOMAIN_POINT, selection, attribute_outputs, offsets.as_span());
}
geometry_set.replace_mesh(new_mesh);
@ -943,7 +935,7 @@ static void duplicate_points_mesh(GeometrySet &geometry_set,
static void duplicate_points_pointcloud(GeometrySet &geometry_set,
const Field<int> &count_field,
const Field<bool> &selection_field,
const IndexAttributes &attributes)
const IndexAttributes &attribute_outputs)
{
const PointCloudComponent &src_points =
*geometry_set.get_component_for_read<PointCloudComponent>();
@ -968,9 +960,9 @@ static void duplicate_points_pointcloud(GeometrySet &geometry_set,
copy_stable_id_point(offsets, src_points, dst_component);
if (attributes.duplicate_index) {
if (attribute_outputs.duplicate_index) {
create_duplicate_index_attribute(
dst_component, ATTR_DOMAIN_POINT, selection, attributes, offsets);
dst_component, ATTR_DOMAIN_POINT, selection, attribute_outputs, offsets);
}
geometry_set.replace_pointcloud(pointcloud);
}
@ -984,24 +976,25 @@ static void duplicate_points_pointcloud(GeometrySet &geometry_set,
static void duplicate_points(GeometrySet &geometry_set,
const Field<int> &count_field,
const Field<bool> &selection_field,
const IndexAttributes &attributes)
const IndexAttributes &attribute_outputs)
{
Vector<GeometryComponentType> component_types = geometry_set.gather_component_types(true, true);
for (const GeometryComponentType component_type : component_types) {
switch (component_type) {
case GEO_COMPONENT_TYPE_POINT_CLOUD:
if (geometry_set.has_pointcloud()) {
duplicate_points_pointcloud(geometry_set, count_field, selection_field, attributes);
duplicate_points_pointcloud(
geometry_set, count_field, selection_field, attribute_outputs);
}
break;
case GEO_COMPONENT_TYPE_MESH:
if (geometry_set.has_mesh()) {
duplicate_points_mesh(geometry_set, count_field, selection_field, attributes);
duplicate_points_mesh(geometry_set, count_field, selection_field, attribute_outputs);
}
break;
case GEO_COMPONENT_TYPE_CURVE:
if (geometry_set.has_curves()) {
duplicate_points_curve(geometry_set, count_field, selection_field, attributes);
duplicate_points_curve(geometry_set, count_field, selection_field, attribute_outputs);
}
break;
default:
@ -1021,7 +1014,7 @@ static void duplicate_points(GeometrySet &geometry_set,
static void duplicate_instances(GeometrySet &geometry_set,
const Field<int> &count_field,
const Field<bool> &selection_field,
const IndexAttributes &attributes)
const IndexAttributes &attribute_outputs)
{
if (!geometry_set.has_instances()) {
geometry_set.clear();
@ -1064,9 +1057,9 @@ static void duplicate_instances(GeometrySet &geometry_set,
copy_point_attributes_without_id(
geometry_set, GEO_COMPONENT_TYPE_INSTANCES, true, offsets, src_instances, dst_instances);
if (attributes.duplicate_index) {
if (attribute_outputs.duplicate_index) {
create_duplicate_index_attribute(
dst_instances, ATTR_DOMAIN_INSTANCE, selection, attributes, offsets);
dst_instances, ATTR_DOMAIN_INSTANCE, selection, attribute_outputs, offsets);
}
geometry_set = std::move(dst_geometry);
@ -1087,28 +1080,28 @@ static void node_geo_exec(GeoNodeExecParams params)
Field<int> count_field = params.extract_input<Field<int>>("Amount");
Field<bool> selection_field = params.extract_input<Field<bool>>("Selection");
IndexAttributes attributes;
IndexAttributes attribute_outputs;
if (params.output_is_required("Duplicate Index")) {
attributes.duplicate_index = StrongAnonymousAttributeID("duplicate_index");
attribute_outputs.duplicate_index = StrongAnonymousAttributeID("duplicate_index");
}
if (duplicate_domain == ATTR_DOMAIN_INSTANCE) {
duplicate_instances(geometry_set, count_field, selection_field, attributes);
duplicate_instances(geometry_set, count_field, selection_field, attribute_outputs);
}
else {
geometry_set.modify_geometry_sets([&](GeometrySet &geometry_set) {
switch (duplicate_domain) {
case ATTR_DOMAIN_CURVE:
duplicate_curves(geometry_set, count_field, selection_field, attributes);
duplicate_curves(geometry_set, count_field, selection_field, attribute_outputs);
break;
case ATTR_DOMAIN_FACE:
duplicate_faces(geometry_set, count_field, selection_field, attributes);
duplicate_faces(geometry_set, count_field, selection_field, attribute_outputs);
break;
case ATTR_DOMAIN_EDGE:
duplicate_edges(geometry_set, count_field, selection_field, attributes);
duplicate_edges(geometry_set, count_field, selection_field, attribute_outputs);
break;
case ATTR_DOMAIN_POINT:
duplicate_points(geometry_set, count_field, selection_field, attributes);
duplicate_points(geometry_set, count_field, selection_field, attribute_outputs);
break;
default:
BLI_assert_unreachable();
@ -1122,10 +1115,10 @@ static void node_geo_exec(GeoNodeExecParams params)
return;
}
if (attributes.duplicate_index) {
if (attribute_outputs.duplicate_index) {
params.set_output(
"Duplicate Index",
AnonymousAttributeFieldInput::Create<int>(std::move(attributes.duplicate_index),
AnonymousAttributeFieldInput::Create<int>(std::move(attribute_outputs.duplicate_index),
params.attribute_producer_name()));
}
params.set_output("Geometry", std::move(geometry_set));