[Bf-blender-cvs] [291247680cd] soc-2019-bevel-profiles: Custom bevel profiles: Merged calculate_profile and calculate_profile_custom.

Hans Goudey noreply at git.blender.org
Thu Jun 27 23:22:11 CEST 2019


Commit: 291247680cdc329ec61a3eaa98c3136382662344
Author: Hans Goudey
Date:   Thu Jun 27 17:16:16 2019 -0400
Branches: soc-2019-bevel-profiles
https://developer.blender.org/rB291247680cdc329ec61a3eaa98c3136382662344

Custom bevel profiles: Merged calculate_profile and calculate_profile_custom.

Now that I'm using the custom profile for all bevel cases, I don't need to have
separate code that uses the custom bevel profiles, so I only need one function.

This also changes the "reversed" parameter to flip the order of the calculated
profile so it doesn't have to be done later with get_profile_point indices.

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

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 bb1f4c31845..a690bb521bd 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 1
-#define DEBUG_CUSTOM_PROFILE_ORIENTATION 0
+#define DEBUG_CUSTOM_PROFILE_ORIENTATION 1
 
 #if DEBUG_CUSTOM_PROFILE_ORIENTATION
 extern void DRW_debug_sphere(const float center[3], const float radius, const float color[4]);
@@ -1654,15 +1654,14 @@ static void get_profile_point(BevelParams *bp, const Profile *pro, int i, int n,
   }
 }
 
-/* This does the same thing as the regular calculate profile function, but it uses the
- * custom profile points instead of the normal ones. Eventually, when the custom and normal
- * profile spacings are merged, this function will be redundant, but for now, I will call this
- * function in certain cases where I am working on the custom profile. This also checks for
- * is_profile_start and flips the profile if it isn't the start of the boundary */
-/* HANS-TODO: Get rid of this function when all custom profile cases are completed */
-/* HANS-TODO: Change the reverse case so that I don't have to sample the points backwards in
- * get_profile_point. This would simplify the rest of the code a lot */
-static void calculate_profile_custom(BevelParams *bp, BoundVert *bndv, bool reversed)
+/* Calculate the actual coordinate values for bndv's profile.
+ * This is only needed if bp->seg > 1.
+ * Allocate the space for them if that hasn't been done already.
+ * If bp->seg is not a power of 2, also need to calculate
+ * the coordinate values for the power of 2 >= bp->seg,
+ * because the ADJ pattern needs power-of-2 boundaries
+ * during construction. */
+static void calculate_profile(BevelParams *bp, BoundVert *bndv, bool reversed)
 {
   int i, k, ns;
   const double *xvals, *yvals;
@@ -1711,7 +1710,7 @@ static void calculate_profile_custom(BevelParams *bp, BoundVert *bndv, bool reve
       xvals = bp->pro_spacing.xvals_2;
       yvals = bp->pro_spacing.yvals_2;
       prof_co = pro->prof_co_2;
-    }    
+    }
     /* HANS-TODO: Why this assert? */
     BLI_assert((r == PRO_LINE_R || (xvals != NULL && yvals != NULL)) && prof_co != NULL);
 
@@ -1727,10 +1726,10 @@ static void calculate_profile_custom(BevelParams *bp, BoundVert *bndv, bool reve
         if (map_ok) {
           if (reversed) {
 #if DEBUG_CUSTOM_PROFILE_ORIENTATION
-            printf("Using reversed custom profile orientation\n");
+            printf("(reversed)\n");
 #endif
-            p[0] = (float)yvals[k];
-            p[1] = (float)xvals[k];
+            p[0] = (float)yvals[ns - k];
+            p[1] = (float)xvals[ns - k];
           }
           else {
             p[0] = (float)xvals[k];
@@ -1763,102 +1762,6 @@ static void calculate_profile_custom(BevelParams *bp, BoundVert *bndv, bool reve
   }
 }
 
-/* Calculate the actual coordinate values for bndv's profile.
- * This is only needed if bp->seg > 1.
- * Allocate the space for them if that hasn't been done already.
- * If bp->seg is not a power of 2, also need to calculate
- * the coordinate values for the power of 2 >= bp->seg,
- * because the ADJ pattern needs power-of-2 boundaries
- * during construction. */
-static void calculate_profile(BevelParams *bp, BoundVert *bndv)
-{
-  int i, k, ns;
-  const double *xvals, *yvals;
-  float co[3], co2[3], p[3], m[4][4];
-  float *prof_co, *prof_co_k;
-  float r;
-  bool need_2, map_ok;
-  Profile *pro = &bndv->profile;
-
-  if (bp->seg == 1) {
-    return;
-  }
-
-  need_2 = bp->seg != bp->pro_spacing.seg_2;
-  if (!pro->prof_co) {
-    pro->prof_co = (float *)BLI_memarena_alloc(bp->mem_arena,
-                                               ((size_t)bp->seg + 1) * 3 * sizeof(float));
-    if (need_2) {
-      pro->prof_co_2 = (float *)BLI_memarena_alloc(
-          bp->mem_arena, ((size_t)bp->pro_spacing.seg_2 + 1) * 3 * sizeof(float));
-    }
-    else {
-      pro->prof_co_2 = pro->prof_co;
-    }
-  }
-  r = pro->super_r;
-  if (r == PRO_LINE_R) {
-    map_ok = false;
-  }
-  else {
-    map_ok = make_unit_square_map(pro->coa, pro->midco, pro->cob, m);
-  }
-  /* The first iteration is the nseg case, the second is the seg_2 case if it's needed */
-  for (i = 0; i < 2; i++) {
-    if (i == 0) {
-      ns = bp->seg;
-      xvals = bp->pro_spacing.xvals;
-      yvals = bp->pro_spacing.yvals;
-      prof_co = pro->prof_co;
-    }
-    else {
-      if (!need_2) {
-        break; /* shares coords with pro->prof_co */
-      }
-      ns = bp->pro_spacing.seg_2;
-      xvals = bp->pro_spacing.xvals_2;
-      yvals = bp->pro_spacing.yvals_2;
-      prof_co = pro->prof_co_2;
-    }
-    /* HANS-TODO: Why this assert? */
-    BLI_assert((r == PRO_LINE_R || (xvals != NULL && yvals != NULL)) && prof_co != NULL);
-
-    /* Iterate over the vertices along the boundary arc */
-    for (k = 0; k <= ns; k++) {
-      if (k == 0) {
-        copy_v3_v3(co, pro->coa);
-      }
-      else if (k == ns) {
-        copy_v3_v3(co, pro->cob);
-      }
-      else {
-        if (map_ok) {
-          p[0] = (float)xvals[k];
-          p[1] = (float)yvals[k];
-          p[2] = 0.0f;
-          mul_v3_m4v3(co, m, p);
-        }
-        else {
-          interp_v3_v3v3(co, pro->coa, pro->cob, (float)k / (float)ns);
-        }
-      }
-      /* project co onto final profile plane */
-      prof_co_k = prof_co + 3 * k; /* Each coord takes up 3 spaces */
-      if (!is_zero_v3(pro->proj_dir)) {
-        add_v3_v3v3(co2, co, pro->proj_dir);
-        /* pro->plane_co and pro->plane_no are built in "set_profile_params" */
-        if (!isect_line_plane_v3(prof_co_k, co, co2, pro->plane_co, pro->plane_no)) {
-          /* shouldn't happen */
-          copy_v3_v3(prof_co_k, co);
-        }
-      }
-      else {
-        copy_v3_v3(prof_co_k, co);
-      }
-    }
-  }
-}
-
 /* Snap a direction co to a superellipsoid with parameter super_r.
  * For square profiles, midline says whether or not to snap to both planes.
  *
@@ -2370,19 +2273,6 @@ static bool eh_on_plane(EdgeHalf *e)
   return false;
 }
 
-/* Same thing as below, but the profiles are calculated with the custom profile spacing data
- * HANS-TODO: Remove this when all of the cases are resolved */
-static void calculate_vm_profiles_custom(BevelParams *bp, BevVert *bv, VMesh *vm)
-{
-  BoundVert *v;
-
-  v = vm->boundstart;
-  do {
-    set_profile_params(bp, bv, v);
-    calculate_profile_custom(bp, v, false); /* HANS-TODO: Possibly choose whether to reverse here */
-  } while ((v = v->next) != vm->boundstart);
-}
-
 /* Calculate the profiles for all the BoundVerts of VMesh vm */
 static void calculate_vm_profiles(BevelParams *bp, BevVert *bv, VMesh *vm)
 {
@@ -2391,7 +2281,8 @@ static void calculate_vm_profiles(BevelParams *bp, BevVert *bv, VMesh *vm)
   v = vm->boundstart;
   do {
     set_profile_params(bp, bv, v);
-    calculate_profile(bp, v);
+    /* We probably don't know to orientation at this point, so don't reverse the profiles */
+    calculate_profile(bp, v, false);
   } while ((v = v->next) != vm->boundstart);
 }
 
@@ -2418,12 +2309,7 @@ static void build_boundary_vertex_only(BevelParams *bp, BevVert *bv, bool constr
     }
   } while ((e = e->next) != efirst);
 
-  if (bp->use_custom_profile){
-    calculate_vm_profiles_custom(bp, bv, vm);
-  }
-  else {
-    calculate_vm_profiles(bp, bv, vm);
-  }
+  calculate_vm_profiles(bp, bv, vm);
 
   if (construct) {
     set_bound_vert_seams(bv, bp->mark_seam, bp->mark_sharp);
@@ -2538,24 +2424,14 @@ static void build_boundary_terminal_edge(BevelParams *bp,
       }
     }
   }
-  if (!bp->use_custom_profile) {
-    calculate_vm_profiles(bp, bv, vm);
-  }
-  else {
-    calculate_vm_profiles_custom(bp, bv, vm); /* HANS-TODO: Change when all cases are converted */
-  }
+  calculate_vm_profiles(bp, bv, vm);
 
   if (bv->edgecount >= 3) {
     /* special case: snap profile to plane of adjacent two edges */
     v = vm->boundstart;
     BLI_assert(v->ebev != NULL);
     move_profile_plane(v, bv->v);
-    if (!bp->use_custom_profile) {
-      calculate_profile(bp, v);
-    }
-    else {
-      calculate_profile_custom(bp, v, false); /* HANS-TODO: Change back when all cases are converted */
-    }
+    calculate_profile(bp, v, false);
   }
 
   if (construct) {
@@ -2895,12 +2771,7 @@ static void build_boundary(BevelParams *bp, BevVert *bv, bool construct)
     adjust_miter_coords(bp, bv, emiter);
   }
 
-  if (bp->use_custom_profile) {
-    calculate_vm_profiles_custom(bp, bv, vm);
-  }
-  else {
-    calculate_vm_profiles(bp, bv, vm);
-  }
+  calculate_vm_profiles(bp, bv, vm);
 
   if (construct) {
     set_bound_vert_seams(bv, bp->mark_seam, bp->mark_sharp);
@@ -3244,7 +3115,7 @@ static EdgeHalf *next_edgehalf_bev(BevelParams *bp,
   return next_edge;
 }
 #if DEBUG_CUSTOM_PROFILE_ORIENTATION
-static void debug_RPO_draw_sphere(BevelParams* bp, BMEdge* e) {
+static void debug_RPO_edge_draw_sphere(BevelParams* bp, BMEdge* e) {
   float debug_color_1[4];
   debug_color_1[0] = 1.0;
   debug_color_1[1] = 0.0;
@@ -3324,8 +3195,8 @@ static void regularize_profile_orientation(BevelParams *bp, BMEdge *bme)
     /* Mark the correct BoundVert as the start of the newly visited profile
      * The direction of the BoundVert along the path switches every time because their directions
      * are relative to the BevVert they're connected to. So the right and left are BoundVerts
-     * would also switch every EdgeHalf, and all I need to do is switch which BoundVert I make
-     * the profile's start every time. */
+     * would also switch every EdgeHalf, and all we need to do is switch which BoundVert I mark as
+     * the profile's start each time. */
     edgehalf->rightv->is_profile_start = toward_bv;
     edgehalf->leftv->is_profile_start = !toward_bv;
 #if DEBUG_CUSTOM_PROFILE_ORIENTATION
@@ -3356,7 +3227,8 @@ static void regularize_profile_orientation(BevelParams *bp, BMEdge *bme)
     }
     edgehalf->visited_custom = true;
 
-    /* Mark the correct BoundVert as the start of the newly visited profile */
+    /* Mark the corr

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list