[Bf-blender-cvs] [a7efec6a949] temp-geometry-nodes-extrude-mesh: Cleanup, add selection outputs to all modes, simplify naming
Hans Goudey
noreply at git.blender.org
Thu Dec 30 19:59:07 CET 2021
Commit: a7efec6a949079341af4ae665689057097a803c5
Author: Hans Goudey
Date: Thu Dec 30 12:59:00 2021 -0600
Branches: temp-geometry-nodes-extrude-mesh
https://developer.blender.org/rBa7efec6a949079341af4ae665689057097a803c5
Cleanup, add selection outputs to all modes, simplify naming
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
index 1b063afd98a..6d948612488 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -42,8 +42,8 @@ static void node_declare(NodeDeclarationBuilder &b)
b.add_input<decl::Bool>(N_("Selection")).default_value(true).supports_field().hide_value();
b.add_input<decl::Vector>(N_("Offset")).supports_field().subtype(PROP_TRANSLATION);
b.add_output<decl::Geometry>("Mesh");
- b.add_output<decl::Bool>(N_("Side Faces")).field_source();
- b.add_output<decl::Bool>(N_("Top Faces")).field_source();
+ b.add_output<decl::Bool>(N_("Top")).field_source();
+ b.add_output<decl::Bool>(N_("Side")).field_source();
}
static void node_layout(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -60,17 +60,28 @@ static void node_init(bNodeTree *UNUSED(tree), bNode *node)
node->storage = data;
}
-static void node_update(bNodeTree *tree, bNode *node)
+struct AttributeOutputs {
+ StrongAnonymousAttributeID top_id;
+ StrongAnonymousAttributeID side_id;
+};
+
+static void save_selection_as_attribute(MeshComponent &component,
+ const AnonymousAttributeID *id,
+ const AttributeDomain domain,
+ const IndexMask selection)
{
- const NodeGeometryExtrudeMesh &storage = node_storage(*node);
- const GeometryNodeExtrudeMeshMode mode = static_cast<GeometryNodeExtrudeMeshMode>(storage.mode);
+ BLI_assert(!component.attribute_exists(id));
- bNodeSocket *mesh = (bNodeSocket *)node->outputs.first;
- bNodeSocket *side_faces = mesh->next;
- bNodeSocket *top_faces = side_faces->next;
+ OutputAttribute_Typed<bool> attribute = component.attribute_try_get_for_output_only<bool>(
+ id, domain);
+ if (selection.is_range()) {
+ attribute.as_span().slice(selection.as_range()).fill(true);
+ }
+ else {
+ attribute.as_span().fill_indices(selection, true);
+ }
- nodeSetSocketAvailability(tree, side_faces, mode == GEO_NODE_EXTRUDE_MESH_FACES);
- nodeSetSocketAvailability(tree, top_faces, mode == GEO_NODE_EXTRUDE_MESH_FACES);
+ attribute.save();
}
static void expand_mesh_size(Mesh &mesh,
@@ -108,9 +119,12 @@ static void expand_mesh_size(Mesh &mesh,
static void extrude_mesh_vertices(MeshComponent &component,
const Field<bool> &selection_field,
- const Field<float3> &offset_field)
+ const Field<float3> &offset_field,
+ const AttributeOutputs &attribute_outputs)
{
Mesh &mesh = *component.get_for_write();
+ const int orig_vert_size = mesh.totvert;
+ const int orig_edge_size = mesh.totedge;
GeometryComponentFieldContext context{component, ATTR_DOMAIN_POINT};
FieldEvaluator evaluator{context, mesh.totvert};
@@ -120,19 +134,19 @@ static void extrude_mesh_vertices(MeshComponent &component,
const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
const VArray<float3> offsets = evaluator.get_evaluated<float3>(0);
- const int orig_vert_size = mesh.totvert;
expand_mesh_size(mesh, selection.size(), selection.size(), 0, 0);
- MutableSpan<MVert> verts{mesh.mvert, mesh.totvert};
- MutableSpan<MEdge> edges{mesh.medge, mesh.totedge};
- MutableSpan<MVert> new_verts = verts.take_back(selection.size());
- MutableSpan<MEdge> new_edges = edges.take_back(selection.size());
+ const IndexRange new_vert_range{orig_vert_size, selection.size()};
+ const IndexRange new_edge_range{orig_edge_size, selection.size()};
+
+ MutableSpan<MVert> new_verts = bke::mesh_verts(mesh).slice(new_vert_range);
+ MutableSpan<MEdge> new_edges = bke::mesh_edges(mesh).slice(new_edge_range);
for (const int i_selection : selection.index_range()) {
MEdge &edge = new_edges[i_selection];
edge.v1 = selection[i_selection];
edge.v2 = orig_vert_size + i_selection;
- edge.flag |= ME_LOOSEEDGE;
+ edge.flag = ME_LOOSEEDGE;
}
component.attribute_foreach([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
@@ -164,6 +178,15 @@ static void extrude_mesh_vertices(MeshComponent &component,
});
});
+ if (attribute_outputs.top_id) {
+ save_selection_as_attribute(
+ component, attribute_outputs.top_id.get(), ATTR_DOMAIN_POINT, new_vert_range);
+ }
+ if (attribute_outputs.side_id) {
+ save_selection_as_attribute(
+ component, attribute_outputs.side_id.get(), ATTR_DOMAIN_EDGE, new_edge_range);
+ }
+
BKE_mesh_runtime_clear_cache(&mesh);
BKE_mesh_normals_tag_dirty(&mesh);
@@ -173,11 +196,13 @@ static void extrude_mesh_vertices(MeshComponent &component,
static void extrude_mesh_edges(MeshComponent &component,
const Field<bool> &selection_field,
- const Field<float3> &offset_field)
+ const Field<float3> &offset_field,
+ const AttributeOutputs &attribute_outputs)
{
Mesh &mesh = *component.get_for_write();
const int orig_vert_size = mesh.totvert;
Span<MEdge> orig_edges{mesh.medge, mesh.totedge};
+ Span<MPoly> orig_polys{mesh.mpoly, mesh.totpoly};
const int orig_loop_size = mesh.totloop;
GeometryComponentFieldContext edge_context{component, ATTR_DOMAIN_EDGE};
@@ -212,21 +237,22 @@ static void extrude_mesh_edges(MeshComponent &component,
point_evaluator.evaluate();
const IndexRange extrude_vert_range{orig_vert_size, extrude_vert_orig_indices.size()};
- const int extrude_edge_offset = orig_edges.size();
- const int extrude_edge_size = extrude_vert_range.size();
- const int duplicate_edge_offset = orig_edges.size() + extrude_vert_range.size();
- const int duplicate_edge_size = selection.size();
- const int new_edge_size = extrude_edge_size + duplicate_edge_size;
+ const IndexRange extrude_edge_range{orig_edges.size(), extrude_vert_range.size()};
+ const IndexRange duplicate_edge_range{extrude_edge_range.one_after_last(), selection.size()};
const int new_poly_size = selection.size();
const int new_loop_size = new_poly_size * 4;
- expand_mesh_size(mesh, extrude_vert_range.size(), new_edge_size, new_poly_size, new_loop_size);
+ expand_mesh_size(mesh,
+ extrude_vert_range.size(),
+ extrude_edge_range.size() + duplicate_edge_range.size(),
+ new_poly_size,
+ new_loop_size);
MutableSpan<MVert> verts{mesh.mvert, mesh.totvert};
MutableSpan<MVert> new_verts = verts.slice(extrude_vert_range);
MutableSpan<MEdge> edges{mesh.medge, mesh.totedge};
- MutableSpan<MEdge> extrude_edges = edges.slice(extrude_edge_offset, extrude_edge_size);
- MutableSpan<MEdge> duplicate_edges = edges.slice(duplicate_edge_offset, duplicate_edge_size);
+ MutableSpan<MEdge> extrude_edges = edges.slice(extrude_edge_range);
+ MutableSpan<MEdge> duplicate_edges = edges.slice(duplicate_edge_range);
MutableSpan<MPoly> polys{mesh.mpoly, mesh.totpoly};
MutableSpan<MPoly> new_polys = polys.take_back(selection.size());
MutableSpan<MLoop> loops{mesh.mloop, mesh.totloop};
@@ -285,13 +311,13 @@ static void extrude_mesh_edges(MeshComponent &component,
poly_loops[0].v = orig_edge.v1;
poly_loops[0].e = orig_edge_index;
poly_loops[1].v = orig_edge.v2;
- poly_loops[1].e = extrude_edge_offset + extrude_edge_index_2;
+ poly_loops[1].e = extrude_edge_range.start() + extrude_edge_index_2;
/* The first vertex of the duplicate edge is the extrude edge that isn't used yet. */
poly_loops[2].v = extrude_edge_1.v1 == orig_edge.v2 ? extrude_edge_2.v1 : extrude_edge_2.v2;
- poly_loops[2].e = duplicate_edge_offset + i;
+ poly_loops[2].e = duplicate_edge_range.start() + i;
poly_loops[3].v = extrude_edge_2.v1 == orig_edge.v1 ? extrude_edge_1.v1 : extrude_edge_1.v2;
- poly_loops[3].e = extrude_edge_offset + extrude_edge_index_1;
+ poly_loops[3].e = extrude_edge_range.start() + extrude_edge_index_1;
}
component.attribute_foreach([&](const AttributeIDRef &id, const AttributeMetaData meta_data) {
@@ -318,7 +344,7 @@ static void extrude_mesh_edges(MeshComponent &component,
attribute_math::convert_to_static_type(meta_data.data_type, [&](auto dummy) {
using T = decltype(dummy);
MutableSpan<T> data = attribute.as_span().typed<T>();
- MutableSpan<T> duplicate_data = data.slice(duplicate_edge_offset, duplicate_edge_size);
+ MutableSpan<T> duplicate_data = data.slice(duplicate_edge_range);
for (const int i : selection.index_range()) {
duplicate_data[i] = data[selection[i]];
@@ -337,6 +363,17 @@ static void extrude_mesh_edges(MeshComponent &component,
}
});
+ if (attribute_outputs.top_id) {
+ save_selection_as_attribute(
+ component, attribute_outputs.top_id.get(), ATTR_DOMAIN_EDGE, duplicate_edge_range);
+ }
+ if (attribute_outputs.side_id) {
+ save_selection_as_attribute(component,
+ attribute_outputs.side_id.get(),
+ ATTR_DOMAIN_FACE,
+ IndexRange(orig_polys.size(), new_poly_size));
+ }
+
BKE_mesh_runtime_clear_cache(&mesh);
BKE_mesh_normals_tag_dirty(&mesh);
@@ -373,15 +410,10 @@ static IndexMask index_mask_from_selection(const VArray<bool> &selection,
return IndexMask(r_indices);
}
-struct FaceExtrudeAttributeOutputs {
- StrongAnonymousAttributeID top_faces_id;
- StrongAnonymousAttributeID side_faces_id;
-};
-
static void extrude_mesh_faces(MeshComponent &component,
const Field<bool> &selection_field,
const Field<float3> &offset_field,
- FaceExtrudeAttributeOutputs &attribute_outputs)
+ const AttributeOutputs &attribute_outputs)
{
Mesh &mesh = *component.get_for_write();
const int orig_vert_size = mesh.totvert;
@@ -465,27 +497,31 @@ static void extrude_mes
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list