Commit: 2afbf00600c89ef7332111c89216b88e5e7a7c25 Author: Hans Goudey Date: Thu Aug 15 19:25:10 2019 -0400 Branches: soc-2019-bevel-profiles https://developer.blender.org/rB2afbf00600c89ef7332111c89216b88e5e7a7c25
Profile widget sampling bug fix, cleanup in file - Extra samples are now correctly assigned to most curved edges. - The first and last control points use their neighbor's handle type. - Final cleanup and commenting of profile_widget.c =================================================================== M source/blender/blenkernel/intern/profile_widget.c M source/blender/editors/interface/interface_templates.c =================================================================== diff --git a/source/blender/blenkernel/intern/profile_widget.c b/source/blender/blenkernel/intern/profile_widget.c index cfe0dec94a8..1077f9efe82 100644 --- a/source/blender/blenkernel/intern/profile_widget.c +++ b/source/blender/blenkernel/intern/profile_widget.c @@ -41,40 +41,10 @@ #include "BKE_curve.h" #include "BKE_fcurve.h" -#define DEBUG_PRWDGT 0 -#define DEBUG_PRWDGT_TABLE 0 -#define DEBUG_PRWDGT_EVALUATE 0 -#define DEBUG_PRWDGT_REVERSE 0 - -void BKE_profilewidget_set_defaults(ProfileWidget *prwdgt) -{ -#if DEBUG_PRWDGT - printf("PROFILEWIDGET SET DEFAULTS\n"); -#endif - prwdgt->flag = PROF_USE_CLIP; - - BLI_rctf_init(&prwdgt->view_rect, 0.0f, 1.0f, 0.0f, 1.0f); - prwdgt->clip_rect = prwdgt->view_rect; - - prwdgt->totpoint = 2; - prwdgt->path = MEM_callocN(2 * sizeof(ProfilePoint), "path points"); - - prwdgt->path[0].x = 1.0f; - prwdgt->path[0].y = 0.0f; - prwdgt->path[1].x = 1.0f; - prwdgt->path[1].y = 1.0f; - - prwdgt->changed_timestamp = 0; -} +#define DEBUG_PRWDGT_EVALUATE void BKE_profilewidget_free_data(ProfileWidget *prwdgt) { -#if DEBUG_PRWDGT - printf("PROFILEWIDGET FREE DATA\n"); - if (!prwdgt->path) { - printf("The prwdgt had no path... probably a second redundant free call\n"); - } -#endif if (prwdgt->path) { MEM_freeN(prwdgt->path); prwdgt->path = NULL; @@ -91,9 +61,6 @@ void BKE_profilewidget_free_data(ProfileWidget *prwdgt) void BKE_profilewidget_free(ProfileWidget *prwdgt) { -#if DEBUG_PRWDGT - printf("PROFILEWIDGET FREE\n"); -#endif if (prwdgt) { BKE_profilewidget_free_data(prwdgt); MEM_freeN(prwdgt); @@ -102,9 +69,6 @@ void BKE_profilewidget_free(ProfileWidget *prwdgt) void BKE_profilewidget_copy_data(ProfileWidget *target, const ProfileWidget *prwdgt) { -#if DEBUG_PRWDGT - printf("PROFILEWIDGET COPY DATA\n"); -#endif *target = *prwdgt; if (prwdgt->path) { @@ -120,10 +84,6 @@ void BKE_profilewidget_copy_data(ProfileWidget *target, const ProfileWidget *prw ProfileWidget *BKE_profilewidget_copy(const ProfileWidget *prwdgt) { -#if DEBUG_PRWDGT - printf("PROFILEWIDGET COPY\n"); -#endif - if (prwdgt) { ProfileWidget *new_prdgt = MEM_dupallocN(prwdgt); BKE_profilewidget_copy_data(new_prdgt, prwdgt); @@ -132,56 +92,49 @@ ProfileWidget *BKE_profilewidget_copy(const ProfileWidget *prwdgt) return NULL; } -/** Removes a specific point from the path of control points - * \note: Requiress profilewidget_changed call after */ +/** Removes a specific point from the path of control points. + * \note: Requiress profilewidget_changed call after. */ bool BKE_profilewidget_remove_point(ProfileWidget *prwdgt, ProfilePoint *point) { ProfilePoint *pts; - int a, b, removed = 0; - -#if DEBUG_PRWDGT - printf("PROFILEPATH REMOVE POINT\n"); -#endif + int i_old, i_new, n_removed = 0; - /* must have 2 points minimum */ + /* Must have 2 points minimum. */ if (prwdgt->totpoint <= 2) { return false; } pts = MEM_mallocN((size_t)prwdgt->totpoint * sizeof(ProfilePoint), "path points"); - /* Keep the two outer points */ - for (a = 0, b = 0; a < prwdgt->totpoint; a++) { - if (&prwdgt->path[a] != point) { - pts[b] = prwdgt->path[a]; - b++; + /* Build the new list without the point when it's found. Keep the first and last points. */ + for (i_old = 1, i_new = 0; i_old < prwdgt->totpoint - 1; i_old++) { + if (&prwdgt->path[i_old] != point) { + pts[i_new] = prwdgt->path[i_old]; + i_new++; } else { - removed++; + n_removed++; } } MEM_freeN(prwdgt->path); prwdgt->path = pts; - prwdgt->totpoint -= removed; - return (removed != 0); + prwdgt->totpoint -= n_removed; + return (n_removed != 0); } /** Removes every point in the widget with the supplied flag set, except for the first and last. - * \param flag: ProfilePoint->flag - * \note: Requiress profilewidget_changed call after */ + * \param flag: ProfilePoint->flag. + * \note: Requiress profilewidget_changed call after. */ void BKE_profilewidget_remove(ProfileWidget *prwdgt, const short flag) { -#if DEBUG_PRWDGT - printf("PROFILEPATH REMOVE\n"); -#endif int i_old, i_new, n_removed = 0; - /* Copy every point without the flag into the new path */ + /* Copy every point without the flag into the new path. */ ProfilePoint *new_pts = MEM_mallocN(((size_t)prwdgt->totpoint) * sizeof(ProfilePoint), "path points"); - /* Don't delete the starting and ending points */ + /* Build the new list without any of the points with the flag. Keep the first and last points. */ new_pts[0] = prwdgt->path[0]; for (i_old = 1, i_new = 1; i_old < prwdgt->totpoint - 1; i_old++) { if (!(prwdgt->path[i_old].flag & flag)) { @@ -200,23 +153,20 @@ void BKE_profilewidget_remove(ProfileWidget *prwdgt, const short flag) } /** Adds a new point at the specified location. The choice for which points to place the new vertex - * between is more complex for a profile. We can't just find the new neighbors with X value - * comparisons. Instead this function checks which line segment is closest to the new point. - * \note: Requiress profilewidget_changed call after */ + * between is made by checking which control point line segment is closest to the new point and + * placing the new vertex in between that segment's points. + * \note: Requiress profilewidget_changed call after. */ ProfilePoint *BKE_profilewidget_insert(ProfileWidget *prwdgt, float x, float y) { ProfilePoint *new_pt = NULL; float new_loc[2] = {x, y}; -#if DEBUG_PRWDGT - printf("PROFILEPATH INSERT\n"); -#endif - /* Don't add more control points than the maximum size of the higher resolution table */ + /* Don't add more control points than the maximum size of the higher resolution table. */ if (prwdgt->totpoint == PROF_TABLE_MAX - 1) { return NULL; } - /* Find the index at the line segment that's closest to the new position */ + /* Find the index at the line segment that's closest to the new position. */ float distance; float min_distance = FLT_MAX; int insert_i = 0; @@ -231,7 +181,7 @@ ProfilePoint *BKE_profilewidget_insert(ProfileWidget *prwdgt, float x, float y) } } - /* Insert the new point at the location we found and copy all of the old points in as well */ + /* Insert the new point at the location we found and copy all of the old points in as well. */ prwdgt->totpoint++; ProfilePoint *new_pts = MEM_mallocN(((size_t)prwdgt->totpoint) * sizeof(ProfilePoint), "path points"); @@ -240,11 +190,11 @@ ProfilePoint *BKE_profilewidget_insert(ProfileWidget *prwdgt, float x, float y) /* Insert old points */ new_pts[i_new].x = prwdgt->path[i_old].x; new_pts[i_new].y = prwdgt->path[i_old].y; - new_pts[i_new].flag = prwdgt->path[i_old].flag & ~PROF_SELECT; /* Deselect old points */ + new_pts[i_new].flag = prwdgt->path[i_old].flag & ~PROF_SELECT; /* Deselect old points. */ i_old++; } else { - /* Insert new point */ + /* Insert new point. */ new_pts[i_new].x = x; new_pts[i_new].y = y; new_pts[i_new].flag = PROF_SELECT; @@ -252,20 +202,17 @@ ProfilePoint *BKE_profilewidget_insert(ProfileWidget *prwdgt, float x, float y) } } - /* Free the old points and use the new ones */ + /* Free the old points and use the new ones. */ MEM_freeN(prwdgt->path); prwdgt->path = new_pts; return new_pt; } /** Sets the handle type of the selected control points. - * \param type: Either HD_VECT or HD_AUTO + * \param type: Either HD_VECT or HD_AUTO. * \note: Requiress profilewidget_changed call after. */ void BKE_profilewidget_handle_set(ProfileWidget *prwdgt, int type) { -#if DEBUG_PRWDGT - printf("PROFILEPATH HANDLE SET\n"); -#endif for (int i = 0; i < prwdgt->totpoint; i++) { if (prwdgt->path[i].flag & PROF_SELECT) { prwdgt->path[i].flag &= ~(PROF_HANDLE_VECTOR | PROF_HANDLE_AUTO); @@ -283,9 +230,6 @@ void BKE_profilewidget_handle_set(ProfileWidget *prwdgt, int type) * \note: Requiress profilewidget_changed call after. */ void BKE_profilewidget_reverse(ProfileWidget *prwdgt) { -#if DEBUG_PRWDGT - printf("PROFILEPATH INSERT\n"); -#endif /* Quick fix for when there are only two points and reversing shouldn't do anything */ if (prwdgt->totpoint == 2) { return; @@ -299,24 +243,12 @@ void BKE_profilewidget_reverse(ProfileWidget *prwdgt) new_pts[prwdgt->totpoint - i - 1].flag = prwdgt->path[i].flag; } -#if DEBUG_PRWDGT_REVERSE - printf("Locations before:\n"); - for (int i = 0; i < prwdgt->totpoint; i++) { - printf("(%.2f, %.2f)", (double)prwdgt->path[i].x, (double)prwdgt->path[i].y); - } - printf("\nLocations after:\n"); - for (int i = 0; i < prwdgt->totpoint; i++) { - printf("(%.2f, %.2f)", (double)new_pts[i].x, (double)new_pts[i].y); - } - printf("\n"); -#endif - /* Free the old points and use the new ones */ MEM_freeN(prwdgt->path); prwdgt->path = new_pts; } -/** Puts the widget's control points in a step pattern, setting vector interpolation */ +/** Puts the widget's control points in a step pattern. Uses vector handles for each point. */ static void profilewidget_build_steps(ProfileWidget *prwdgt) { int n, step_x, step_y; @@ -337,12 +269,9 @@ static void profilewidget_build_steps(ProfileWidget *prwdgt) } /** Resets the profile to the current preset. - * \note: Requires profilewidget_changed call after */ + * \note: Requires profilewidget_changed call after. */ void BKE_profilewidget_reset(ProfileWidget *prwdgt) { -#if DEBUG_PRWDGT - printf("PROFILEPATH RESET\n"); -#endif if (prwdgt->path) { MEM_freeN(prwdgt->path); } @@ -478,21 +407,21 @@ void BKE_profilewidget_reset(ProfileWidget *prwdgt) } /** Helper for 'profile_widget_create' samples. Returns whether both handles that make up the edge - * are vector handles */ + * are vector handles. */ static bool is_curved_edge(BezTriple * bezt, int i) { return (bezt[i].h2 != HD_VECT || bezt[i + 1].h1 != HD_VECT); } /** Used to set bezier handle locations in the sample creation process. Reduced copy of - * #calchandleNurb_intern co @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs