[Bf-blender-cvs] [58b6976a27f] bevelv2: Fix a bug re slope on vertex events.

Howard Trickey noreply at git.blender.org
Sat Nov 5 19:40:07 CET 2022


Commit: 58b6976a27f2de5a607d18b5700aa9b3a9a0add7
Author: Howard Trickey
Date:   Sat Nov 5 14:38:46 2022 -0400
Branches: bevelv2
https://developer.blender.org/rB58b6976a27f2de5a607d18b5700aa9b3a9a0add7

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.

===================================================================

M	source/blender/blenlib/intern/mesh_inset.cc
M	source/blender/blenlib/tests/BLI_mesh_inset_test.cc

===================================================================

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



More information about the Bf-blender-cvs mailing list