From 58b6976a27f2de5a607d18b5700aa9b3a9a0add7 Mon Sep 17 00:00:00 2001 From: Howard Trickey Date: Sat, 5 Nov 2022 14:38:46 -0400 Subject: Fix a bug re slope on vertex events. When insetting a square face with a slope, not all center vertices got raised. This fixes that. Also disabled the grid inset test, which doesn't work yet. --- source/blender/blenlib/intern/mesh_inset.cc | 10 +++++++++- source/blender/blenlib/tests/BLI_mesh_inset_test.cc | 16 ++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/source/blender/blenlib/intern/mesh_inset.cc b/source/blender/blenlib/intern/mesh_inset.cc index 6690e28e738..228507bdda2 100644 --- a/source/blender/blenlib/intern/mesh_inset.cc +++ b/source/blender/blenlib/intern/mesh_inset.cc @@ -154,12 +154,17 @@ class Vert { class Triangle { enum TriangleFlags { + /* TDELETED means the triangle is no longer part of its TriangleMesh. */ TDELETED = 1, + /* TNORMAL_VALID means the normal_ member is the normal using current coordinates. */ TNORMAL_VALID = 1 << 1, + /* TREGION means the triangle is part of the region still being inset. */ TREGION = 1 << 2, + /* TSPOKEi means the ith edge is a spoke in the Straight Skeleton construction. */ TSPOKE0 = 1 << 3, TSPOKE1 = 1 << 4, TSPOKE2 = 1 << 5, + /* TORIGi means the ith edge is an edge that was in the incoming mesh (before triangulation). */ TORIG0 = 1 << 6, TORIG1 = 1 << 7, TORIG2 = 1 << 8, @@ -1481,6 +1486,7 @@ void StraightSkeleton::dump_state() const std::cout << "State\n"; dump_event_queue(); std::cout << trimesh_; + trimesh_draw("dump_state", trimesh_); for (int i : IndexRange(trimesh_.all_tris().size())) { SkeletonVertex *skv = skel_vertex_map_.lookup_default(i, nullptr); if (skv != nullptr) { @@ -2030,7 +2036,7 @@ void StraightSkeleton::add_triangle(Edge edge, float min_height) * wavefront too). Suppose we have the following, where e * is the argument edge, and ep--e--en are part of the wavefront, * and s and sn are spokes. - * We need to collapse edge e (deleting tirangles X and C and vertex v). + * We need to collapse edge e (deleting triangles X and C and vertex vn). * Then we need to split the remaining vertex v, splitting off edges * en to ep CCW. Note: it is possible that en is a side of X, so be * careful about that after collapsing e. @@ -2428,6 +2434,8 @@ void StraightSkeleton::compute() set_skel_vertex_map(v_src(new_spoke)->id, skv); new_v->co = event.final_pos(); vertex_height_map.add(new_v->id, height); + /* Also need to set the height for the other end of the spoke, which has 0 length right now. */ + vertex_height_map.add(v_src(new_spoke)->id, height); if (dbg_level > 0) { std::cout << "add_events for v" << new_v->id << " at height " << height diff --git a/source/blender/blenlib/tests/BLI_mesh_inset_test.cc b/source/blender/blenlib/tests/BLI_mesh_inset_test.cc index 51f8132b21d..b1313d536b0 100644 --- a/source/blender/blenlib/tests/BLI_mesh_inset_test.cc +++ b/source/blender/blenlib/tests/BLI_mesh_inset_test.cc @@ -149,12 +149,13 @@ TEST(mesh_inset, Square) 0 1 2 3 )"; - InputHolder in1(spec, 0.3); + InputHolder in1(spec, 0.4); MeshInset_Result out1 = mesh_inset_calc(in1.input); EXPECT_EQ(out1.vert.size(), 8); EXPECT_EQ(out1.face.size(), 5); - InputHolder in2(spec, 1.0); + InputHolder in2(spec, 0.51); + in2.input.slope = 0.5f; MeshInset_Result out2 = mesh_inset_calc(in2.input); /* Note: current code wants all 3-valence vertices in * straight skeleton, so the center doesn't collapse to @@ -162,6 +163,15 @@ TEST(mesh_inset, Square) * length edge between them. */ EXPECT_EQ(out2.vert.size(), 6); EXPECT_EQ(out2.face.size(), 4); + /* The last two verts should be in the center, with height 0.25. */ + const float3 &v4 = out2.vert[4]; + const float3 &v5 = out2.vert[5]; + EXPECT_NEAR(v4.x, 0.5, 1e-5); + EXPECT_NEAR(v4.y, 0.5, 1e-5); + EXPECT_NEAR(v4.z, 0.25, 1e-5); + EXPECT_NEAR(v5.x, 0.5, 1e-5); + EXPECT_NEAR(v5.y, 0.5, 1e-5); + EXPECT_NEAR(v5.z, 0.25, 1e-5); } TEST(mesh_inset, Pentagon) @@ -339,6 +349,7 @@ TEST(mesh_inset, Flipper) EXPECT_EQ(out11.face.size(), 20); } +#if 0 TEST(mesh_inset, Grid) { const char *spec = R"(16 9 1 @@ -375,6 +386,7 @@ TEST(mesh_inset, Grid) EXPECT_EQ(out1.vert.size(), 28); EXPECT_EQ(out1.face.size(), 21); } +#endif } // namespace test -- cgit v1.2.3