[Bf-blender-cvs] [e76d9647462] soc-2019-bevel-profiles: Bevel Custom Profile: 4-way pipe case vertex mesh working.

Hans Goudey noreply at git.blender.org
Wed Jul 31 00:50:53 CEST 2019


Commit: e76d96474625b627a46eec9cfa112438e7899da2
Author: Hans Goudey
Date:   Tue Jul 30 14:48:18 2019 -0400
Branches: soc-2019-bevel-profiles
https://developer.blender.org/rBe76d96474625b627a46eec9cfa112438e7899da2

Bevel Custom Profile: 4-way pipe case vertex mesh working.

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

M	source/blender/bmesh/tools/bmesh_bevel.c

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

diff --git a/source/blender/bmesh/tools/bmesh_bevel.c b/source/blender/bmesh/tools/bmesh_bevel.c
index 5711fde3aaa..aed6c0ce3f9 100644
--- a/source/blender/bmesh/tools/bmesh_bevel.c
+++ b/source/blender/bmesh/tools/bmesh_bevel.c
@@ -61,7 +61,7 @@
 #define DEBUG_CUSTOM_PROFILE_ORIGINAL 0
 #define DEBUG_CUSTOM_PROFILE_WELD 0
 #define DEBUG_CUSTOM_PROFILE_ADJ 0
-#define DEBUG_CUSTOM_PROFILE_PIPE 0
+#define DEBUG_CUSTOM_PROFILE_PIPE 1
 #define DEBUG_CUSTOM_PROFILE_ORIENTATION 0
 #define DEBUG_CUSTOM_PROFILE_ORIENTATION_DRAW DEBUG_CUSTOM_PROFILE_ORIENTATION | 0
 #define DEBUG_CUSTOM_PROFILE_CUTOFF 0
@@ -2432,10 +2432,9 @@ static void build_boundary_terminal_edge(BevelParams *bp,
     }
     /* For the edges not adjacent to the beveled edge, slide the bevel amount along. */
     d = efirst->offset_l_spec;
-    if (bp->use_custom_profile) {
+    if (bp->use_custom_profile || bp->profile < 0.25f) {
       /* HANS-TODO: Even this doesn't give enough room to the profile when the adjacent edges
-       * aren't square so the profile is rotated sideways. There are already issues with this when
-       * the non-custom profile parameter is small though */
+       * aren't square so the profile is rotated sideways. */
       d *= sqrtf(2.0f); /* Need to go further down the edge to make room for full profile area */
     }
     for (e = e->next; e->next != efirst; e = e->next) {
@@ -4328,8 +4327,6 @@ static VMesh *tri_corner_adj_vmesh(BevelParams *bp, BevVert *bv)
 }
 
 /* Makes the mesh that replaces the original vertex, bounded by the profiles on the sides */
-/* HANS-TODO: Decide whether to disable the process of using fullness to find the initial center
- * point for the start mesh */
 static VMesh *adj_vmesh(BevelParams *bp, BevVert *bv)
 {
 #if DEBUG_CUSTOM_PROFILE_ADJ | DEBUG_CUSTOM_PROFILE_CUTOFF
@@ -4337,7 +4334,7 @@ static VMesh *adj_vmesh(BevelParams *bp, BevVert *bv)
 #endif
   int n_bndv, nseg, i;
   VMesh *vm0, *vm1;
-  float boundverts_center[3], original_vertex[3], fullest[3], center_direction[3];
+  float boundverts_center[3], original_vertex[3], negative_fullest[3], center_direction[3];
   BoundVert *bndv;
   MemArena *mem_arena = bp->mem_arena;
   float r, p, fullness;
@@ -4381,14 +4378,14 @@ static VMesh *adj_vmesh(BevelParams *bp, BevVert *bv)
   /* To place the center vertex:
    * coa is original vertex
    * co is centroid of boundary corners
-   * cob is reflection of coa in across co.
-   * 'fullness' is the fraction of the way
-   * from co to coa (if positive) or to cob (if negative).
+   * 'negative_fullest' is the reflection of the original vertex across the boundverts' center.
+   * 'fullness' is the fraction of the way from the boundvert's centroid to to the
+   * original vertex(if positive) or to negative_fullest (if negative).
    */
   copy_v3_v3(original_vertex, bv->v->co);
   mul_v3_fl(boundverts_center, 1.0f / (float)n_bndv);
-  sub_v3_v3v3(fullest, boundverts_center, original_vertex);
-  add_v3_v3(fullest, boundverts_center);
+  sub_v3_v3v3(negative_fullest, boundverts_center, original_vertex);
+  add_v3_v3(negative_fullest, boundverts_center);
 
   /* An offline optimization process found fullness that let to closest fit to sphere as
    * a function of r and ns (for case of cube corner) */
@@ -4480,13 +4477,14 @@ static VMesh *pipe_adj_vmesh(BevelParams *bp, BevVert *bv, BoundVert *vpipe)
   printf("PIPE ADJ VMESH\n");
   float green[4] = {0.0f, 1.0f, 0.0f, 1.0f};
   float blue[4] = {0.0f, 0.0f, 1.0f, 1.0f};
-  float new_profile_normal_end[3];
+  float red[4] = {1.0f, 0.0f, 0.0f, 1.0f};
+  float white[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+  float *color;
 #endif
-  int ipipe, i, j, k, n_bndv, ns, half_ns, ipipe1, ipipe2;
+  int i, j, k, n_bndv, ns, half_ns, ipipe1, ipipe2;
   VMesh *vm;
   bool even, midline;
-//  Profile *pipe_profile;
-  float new_profile_plane_co[3], new_profile_plane_no[3], new_profile_plane[4], new_vert[3];
+  float *pipe1_profile_point, *pipe2_profile_point, f;
 
   /* HANS-TODO: We shouldn't need to go through the subdivision process with a custom profile.
    * Try just using "new_adj_vmesh" in that case. */
@@ -4501,93 +4499,93 @@ static VMesh *pipe_adj_vmesh(BevelParams *bp, BevVert *bv, BoundVert *vpipe)
   ipipe2 = vpipe->next->next->index;
 
 #if DEBUG_CUSTOM_PROFILE_PIPE
-    /* Draw the locations of all the vertices before the "snapping" process */
-    for (i = 0; i < n_bndv; i++) {
-      for (j = 1; j <= half_ns; j++) {
-        for (k = 1; k <= ns; k++) {
-          if (!is_canon(vm, i, j, k)) {
-           continue;
-          }
-          DRW_debug_sphere(mesh_vert(vm, i, j, k)->co, 0.01f, green);
-        }
-      }
-    }
+    printf("ipipe1: %d\n", ipipe1);
+    printf("ipipe2: %d\n", ipipe2);
 #endif
 
-  if (bp->use_custom_profile) {
-//    for (ipipe = 0; ipipe < 2; ipipe++) {
-//      /* Adjust the side of the first pipe profile first, then the other profile's side second */
-//      i = (ipipe == 0) ? ipipe1 : ipipe2;
-//      for (j = 1; j <= half_ns; j++) {
-//        for (k = 0; k <= ns; k++) {
-    for (i = 0; i < n_bndv; i++) {
-      for (j = 1; j <= half_ns; j++) {
-       for (k = 1; k <= ns; k++) {
-         if (!is_canon(vm, i, j, k)) {
-           continue;
+  for (i = 0; i < n_bndv; i++) {
+#if DEBUG_CUSTOM_PROFILE_PIPE
+    printf("i: %d\n", i);
+#endif
+    for (j = 1; j <= half_ns; j++) {
+      for (k = 0; k <= half_ns; k++) {
+        if (!is_canon(vm, i, j, k)) {
+          continue;
+        }
+        if (bp->use_custom_profile) {
+          /* Find the profile vertex that corresponds to this "row" from each pipe profile */
+          if (i == ipipe1) {
+            pipe1_profile_point = mesh_vert(vm, i, 0, k)->co;
+            pipe2_profile_point = mesh_vert(vm, ipipe2, 0, ns - k)->co;
+            f = (float)j / (float)ns;
           }
-          /* Get a new profile plane by moving the original's position to this ring */
-          copy_v3_v3(new_profile_plane_co, mesh_vert(vm, i, j, k)->co);
-          copy_v3_v3(new_profile_plane_no, vpipe->profile.proj_dir);
-          plane_from_point_normal_v3(new_profile_plane, new_profile_plane_co,
-                                     new_profile_plane_no);
-
+          else if (i == ipipe2) {
+            pipe1_profile_point = mesh_vert(vm, i, 0, k)->co;
+            pipe2_profile_point = mesh_vert(vm, ipipe1, 0, ns - k)->co;
+            f = (float)j / (float)ns;
+          }
+          else if (i == (ipipe1 + 1) % n_bndv) {
+            pipe1_profile_point = mesh_vert(vm, (i + 1) % n_bndv, 0, j)->co;
+            pipe2_profile_point = mesh_vert(vm, i - 1, 0, ns - j)->co;
+            f = (float)(ns - k) / (float)ns;
+          }
+          else {
+            pipe1_profile_point = mesh_vert(vm, (i + 1) % n_bndv, 0, j)->co;
+            pipe2_profile_point = mesh_vert(vm, i, j, 0)->co;
+            f = (float)(ns - k) / (float)ns;
+          }
+          /* Find which "column" this vertex is on to find interpolation factor */
 
-          /* Get this point's location by snapping the first profile's location to the new plane */
-          closest_to_plane_v3(new_vert, new_profile_plane,
-                              mesh_vert(vm, ipipe1, 0, k)->co);
-          copy_v3_v3(mesh_vert(vm, i, j, k)->co, new_vert);
+          /* Place the vertex by interpolatin between the two profile points by the factor */
 #if DEBUG_CUSTOM_PROFILE_PIPE
-          printf("i: %d, j: %d, k: %d\n", i, j, k);
-          printf("new_profile_plane_co: (%.3f, %.3f, %.3f)\n", new_profile_plane_co[0],
-                                                               new_profile_plane_co[1],
-                                                               new_profile_plane_co[2]);
-          printf("new_profile_plane_no: (%.3f, %.3f, %.3f)\n", new_profile_plane_no[0],
-                                                               new_profile_plane_no[1],
-                                                               new_profile_plane_no[2]);
-          printf("new vertex: (%.3f, %.3f, %.3f)\n", new_vert[0],
-                                                     new_vert[1],
-                                                     new_vert[2]);
-//          if (new_vert[0] > 1.0f || new_vert[0] < 0.0f ||
-//              new_vert[1] > 1.0f || new_vert[1] < -1.0f ||
-//              new_vert[0] > 1.0f || new_vert[0] < 0.0f) {
-//            printf("!! New vertex not in range for test bevel shape\n");
-//          }
-//          float bad_location1[3] = {0.970746f, 0.8f, 0.285874f};
-//          float bad_location2[3] = {0.970746f, 0.0f, 0.285874f};
-//          float bad_location3[3] = {0.750881f, -0.8f, 0.666078f};
-//          if (compare_v3v3(new_vert, bad_location1, BEVEL_EPSILON_BIG) ||
-//              compare_v3v3(new_vert, bad_location2, BEVEL_EPSILON_BIG) ||
-//              compare_v3v3(new_vert, bad_location3, BEVEL_EPSILON_BIG )) {
-//            printf("!! Bad location!\n");
-//          }
-          madd_v3_v3v3fl(new_profile_normal_end, new_profile_plane_co, new_profile_plane_no,
-                         0.1f);
-          DRW_debug_line_v3v3(new_profile_plane_co, new_profile_normal_end, green);
-          DRW_debug_sphere(new_vert, 0.01f, blue);
+          printf("f: %.3f\n", f);
+          printf("point 1: (%.3f, %.3f, %.3f)\n", pipe1_profile_point[0],
+                                                  pipe1_profile_point[1],
+                                                  pipe1_profile_point[2]);
+          printf("point 2: (%.3f, %.3f, %.3f)\n", pipe2_profile_point[0],
+                                                  pipe2_profile_point[1],
+                                                  pipe2_profile_point[2]);
 #endif
+          interp_v3_v3v3(mesh_vert(vm, i, j, k)->co, pipe1_profile_point, pipe2_profile_point, f);
+        }
+        else {
+          /* A tricky case is for the 'square' profiles and an even nseg: we want certain
+          * vertices to snap to the midline on the pipe, not just to one plane or the other. */
+          midline = even && k == half_ns &&
+              ((i == 0 && j == half_ns) || (i == ipipe1 || i == ipipe2));
+          snap_to_pipe_profile(vpipe, midline, mesh_vert(vm, i, j, k)->co);
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list