[Bf-blender-cvs] [7b9a739b5b0] soc-2019-bevel-profiles: Profile Widget: Sampling function returns ProfilePoint array
Hans Goudey
noreply at git.blender.org
Tue Aug 6 19:54:32 CEST 2019
Commit: 7b9a739b5b09d75cd3eb7256dc9557760387659d
Author: Hans Goudey
Date: Tue Aug 6 13:50:57 2019 -0400
Branches: soc-2019-bevel-profiles
https://developer.blender.org/rB7b9a739b5b09d75cd3eb7256dc9557760387659d
Profile Widget: Sampling function returns ProfilePoint array
This enables two things:
- Memory savings, because no temporary array is needed to change data
formats anymore and because the results can be reused more easily
- Also returning information about which sampled points came from control
points with vector handles, which will be useful for hardening normals of
custom profile bevels.
===================================================================
M source/blender/blenkernel/BKE_profile_widget.h
M source/blender/blenkernel/intern/profile_widget.c
M source/blender/blenloader/intern/readfile.c
M source/blender/bmesh/tools/bmesh_bevel.c
M source/blender/editors/interface/interface_draw.c
M source/blender/editors/interface/interface_handlers.c
M source/blender/editors/interface/interface_templates.c
M source/blender/makesdna/DNA_profilewidget_types.h
M source/blender/makesrna/intern/rna_profile.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_profile_widget.h b/source/blender/blenkernel/BKE_profile_widget.h
index 3574ed67cef..480afe804a7 100644
--- a/source/blender/blenkernel/BKE_profile_widget.h
+++ b/source/blender/blenkernel/BKE_profile_widget.h
@@ -27,6 +27,9 @@
struct ProfileWidget;
struct ProfilePoint;
+/* HANS-QUESTION: Should I add the BKE_ to the front of these functions? The CurveMapping widget
+ * doesn't have them but it's mentioned in the style guide that public functions should have it */
+
void profilewidget_set_defaults(struct ProfileWidget *prwdgt);
struct ProfileWidget *profilewidget_add(int preset);
@@ -51,10 +54,10 @@ void profilewidget_reverse(struct ProfileWidget *prwdgt);
void profilewidget_reset(struct ProfileWidget *prwdgt);
-void profilewidget_create_samples(const struct ProfileWidget *prwdgt,
- float *locations,
+void profilewidget_create_samples(struct ProfileWidget *prwdgt,
int n_segments,
- bool sample_straight_edges);
+ bool sample_straight_edges,
+ struct ProfilePoint *r_samples);
void profilewidget_initialize(struct ProfileWidget *prwdgt, short nsegments);
@@ -68,8 +71,8 @@ float profilewidget_distance_to_next_point(const struct ProfileWidget *prwdgt, i
float profilewidget_total_length(const struct ProfileWidget *prwdgt);
void profilewidget_create_samples_even_spacing(const struct ProfileWidget *prwdgt,
- double *x_table_out,
- double *y_table_out);
+ double *x_table_out,
+ double *y_table_out);
/* Length portion is the fraction of the total path length where we want the location */
void profilewidget_evaluate_portion(const struct ProfileWidget *prwdgt,
diff --git a/source/blender/blenkernel/intern/profile_widget.c b/source/blender/blenkernel/intern/profile_widget.c
index dbac816dea6..fa8a180611a 100644
--- a/source/blender/blenkernel/intern/profile_widget.c
+++ b/source/blender/blenkernel/intern/profile_widget.c
@@ -42,16 +42,16 @@
#include "BKE_fcurve.h"
#define DEBUG_PRWDGT 0
-#define DEBUG_PRWDGT_TABLE 0
+#define DEBUG_PRWDGT_TABLE 1
#define DEBUG_PRWDGT_EVALUATE 0
#define DEBUG_PRWDGT_REVERSE 0
-void profilewidget_set_defaults(ProfileWidget *prwdgt)
+void BKE_profilewidget_set_defaults(ProfileWidget *prwdgt)
{
#if DEBUG_PRWDGT
printf("PROFILEWIDGET SET DEFAULTS\n");
#endif
- prwdgt->flag = PROF_DO_CLIP;
+ 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;
@@ -67,22 +67,6 @@ void profilewidget_set_defaults(ProfileWidget *prwdgt)
prwdgt->changed_timestamp = 0;
}
-struct ProfileWidget *profilewidget_add(int preset)
-{
-#if DEBUG_PRWDGT
- printf("PROFILEWIDGET ADD\n");
-#endif
-
- ProfileWidget *prwdgt = MEM_callocN(sizeof(ProfileWidget), "new profile widget");
-
- profilewidget_set_defaults(prwdgt);
- prwdgt->preset = preset;
- profilewidget_reset(prwdgt);
- profilewidget_changed(prwdgt, false);
-
- return prwdgt;
-}
-
void profilewidget_free_data(ProfileWidget *prwdgt)
{
#if DEBUG_PRWDGT
@@ -99,9 +83,9 @@ void profilewidget_free_data(ProfileWidget *prwdgt)
MEM_freeN(prwdgt->table);
prwdgt->table = NULL;
}
- if (prwdgt->samples) {
- MEM_freeN(prwdgt->samples);
- prwdgt->samples = NULL;
+ if (prwdgt->segments) {
+ MEM_freeN(prwdgt->segments);
+ prwdgt->segments = NULL;
}
}
@@ -129,8 +113,8 @@ void profilewidget_copy_data(ProfileWidget *target, const ProfileWidget *prwdgt)
if (prwdgt->table) {
target->table = MEM_dupallocN(prwdgt->table);
}
- if (prwdgt->samples) {
- target->samples = MEM_dupallocN(prwdgt->samples);
+ if (prwdgt->segments) {
+ target->segments = MEM_dupallocN(prwdgt->segments);
}
}
@@ -568,15 +552,18 @@ static int compare_curvature_bezt_edge_i(const BezTriple *bezt, const int i_a, c
/** Used for sampling curves along the profile's path. Any points more than the number of user-
* defined points will be evenly distributed among the curved edges. Then the remainders will be
* distributed to the most curved edges.
- * \param locations: An array of points to put the sampled positions. Must have length n_segments.
* \param n_segments: The number of segments to sample along the path. It must be higher than the
* number of points used to define the profile (prwdgt->totpoint).
* \param sample_straight_edges: Whether to sample points between vector handle control points. If
- this is true and there are only vector edges the straight edges will still be sampled. */
-void profilewidget_create_samples(const ProfileWidget *prwdgt,
- float *locations,
+ * this is true and there are only vector edges the straight edges will still be sampled.
+ * \param r_samples: An array of points to put the sampled positions. Must have length n_segments.
+ * \return r_samples: Fill the array with the sampled locations and if the point corresponds
+ * to a control point, its handle type */
+/* HANS-TODO: This is getting called way too much: when the mouse moves over the bevel modifier UI */
+void profilewidget_create_samples(ProfileWidget *prwdgt,
int n_segments,
- bool sample_straight_edges)
+ bool sample_straight_edges,
+ ProfilePoint *r_samples)
{
#if DEBUG_PRWDGT
printf("PROFILEWIDGET CREATE SAMPLES\n");
@@ -586,21 +573,22 @@ void profilewidget_create_samples(const ProfileWidget *prwdgt,
}
#endif
BezTriple *bezt;
- int i, i_insert, n_left, n_common, i_segment, n_curved_edges;
- int *i_curve_sorted, *n_points;
- int totedges = prwdgt->totpoint - 1;
+ int i, i_insert, n_left, n_common, i_sample, n_curved_edges;
+ int *i_curve_sorted, *n_samples;
int totpoints = prwdgt->totpoint;
+ int totedges = totpoints - 1;
+// n_segments--;
BLI_assert(n_segments > 0);
- /* Create Bezier points for calculating the higher resolution path */
+ /* Create Bezier points for calculating the higher resolution path. */
bezt = MEM_callocN((size_t)totpoints * sizeof(BezTriple), "beztarr");
for (i = 0; i < totpoints; i++) {
bezt[i].vec[1][0] = prwdgt->path[i].x;
bezt[i].vec[1][1] = prwdgt->path[i].y;
bezt[i].h1 = bezt[i].h2 = (prwdgt->path[i].flag & PROF_HANDLE_VECTOR) ? HD_VECT : HD_AUTO;
}
- /* Get handle positions for the bezier points */
+ /* Get handle positions for the bezier points. */
calchandle_profile(&bezt[0], NULL, &bezt[1]);
for (i = 1; i < totpoints - 1; i++) {
calchandle_profile(&bezt[i], &bezt[i - 1], &bezt[i + 1]);
@@ -610,7 +598,7 @@ void profilewidget_create_samples(const ProfileWidget *prwdgt,
/* Sort a list of indexes by the curvature at each point*/
i_curve_sorted = MEM_callocN((size_t)totedges * sizeof(int), "i curve sorted");
for (i = 0; i < totedges; i++) { /* Insertion sort for now */
- /* Place the new index (i) at the first spot where its edge has less curvature */
+ /* Place the new index i at the first spot where its edge has less curvature. */
for (i_insert = 0; i_insert < i; i_insert++) {
if (!compare_curvature_bezt_edge_i(bezt, i, i_curve_sorted[i_insert])) {
break;
@@ -620,7 +608,7 @@ void profilewidget_create_samples(const ProfileWidget *prwdgt,
}
/* Assign sampled points to each edge. */
- n_points = MEM_callocN((size_t)totedges * sizeof(int), "create samples numbers");
+ n_samples = MEM_callocN((size_t)totedges * sizeof(int), "create samples numbers");
int n_added = 0;
if (n_segments >= totedges) {
if (sample_straight_edges) {
@@ -629,10 +617,10 @@ void profilewidget_create_samples(const ProfileWidget *prwdgt,
n_common = n_segments / totedges;
n_left = n_segments % totedges;
- /* Assign the points that fill fit evenly to the edges */
+ /* Assign the points that fill fit evenly to the edges. */
if (n_common > 0) {
for (i = 0; i < totedges; i++) {
- n_points[i] = n_common;
+ n_samples[i] = n_common;
n_added += n_common;
}
}
@@ -645,22 +633,20 @@ void profilewidget_create_samples(const ProfileWidget *prwdgt,
n_curved_edges++;
}
}
- /* Just sample all of the edges if there are no curved edges */
- if (n_curved_edges == 0) {
- n_curved_edges = totedges;
- }
+ /* Just sample all of the edges if there are no curved edges. */
+ n_curved_edges = (n_curved_edges == 0) ? totedges : n_curved_edges;
- /* Give all of the curved edges the same number of points and straight edges one point */
- n_left = n_segments - (totedges - n_curved_edges); /* After one for each straight edge */
- n_common = n_left / n_curved_edges; /* Number assigned to every curved edge */
+ /* Give all of the curved edges the same number of points and straight edges one point. */
+ n_left = n_segments - (totedges - n_curved_edges); /* Left after 1 for each straight edge */
+ n_common = n_left / n_curved_edges; /* Number assigned to all curved edges */
if (n_common > 0) {
for (i = 0; i < totedges; i++) {
if (is_curved_edge(bezt, i)) {
- n_points[i] += n_common;
+ n_samples[i] += n_common;
n_added += n_common;
}
else {
- n_points[i] = 1;
+ n_samples[i] = 1;
n_added++;
}
}
@@ -668,46 +654,63 @@ void profilewidget_create_samples(const ProfileWidget *prwdgt,
n_left -= n_common * n_curved_edges;
}
} else {
- /* Not enough segments to give one to each edge, so just give them to the most curved edges */
+ /* Not enough segments to give one to each edge, so just give them to the most curved edges. */
n_left = n_segments;
}
- /* Assign the remainder of the points that
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list