[Bf-blender-cvs] [5a997cae616] soc-2019-bevel-profiles: Fixed profile sample table creation. Table has to be plugged in to evaulate though
Hans Goudey
noreply at git.blender.org
Mon Jun 3 17:36:39 CEST 2019
Commit: 5a997cae61601e92a09963ac85a6527ca6275912
Author: Hans Goudey
Date: Mon Jun 3 07:36:53 2019 -0400
Branches: soc-2019-bevel-profiles
https://developer.blender.org/rB5a997cae61601e92a09963ac85a6527ca6275912
Fixed profile sample table creation. Table has to be plugged in to evaulate though
===================================================================
M source/blender/blenkernel/intern/colortools.c
===================================================================
diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c
index 5585bbdf3a2..7896ba68af8 100644
--- a/source/blender/blenkernel/intern/colortools.c
+++ b/source/blender/blenkernel/intern/colortools.c
@@ -1293,17 +1293,15 @@ void curvemap_path_evaluate(const struct CurveMap *cuma, float length_portion, f
}
-/* HANS-TODO: Fix this, it can't be the right method, because it doesn't generalize well to
- * small distances between points. There could be a lot of points inside one segment length,
- * but this code assumes that there's only 1. I need to think harder about what method to use here.
- * But really it might not be worth pursuing this much because there might be a more general solution
- * that includes curves and the small speedup it would give isn't a high priority right now */
+/* HANS-TODO: Test this! (And start using it) */
static void curvemap_path_make_table(struct CurveMap *cuma) {
/* Fill table with values for the position of the graph at each of the segments */
- float segment_length = cuma->total_length / cuma->nsegments;
+ const float segment_length = cuma->total_length / cuma->nsegments;
float length_travelled = 0.0f;
float distance_to_next_point = curvemap_path_linear_distance_to_next_point(cuma, 0);
float distance_to_previous_point = 0.0f;
+ float travelled_since_last_point = 0.0f;
+ float segment_left = segment_length;
float f;
int i_point = 0;
@@ -1312,25 +1310,24 @@ static void curvemap_path_make_table(struct CurveMap *cuma) {
/* Travel along the path, recording locations of segments as we pass where they should be */
for (int i = 0; i < cuma->nsegments; i++) {
- if (segment_length < distance_to_next_point) {
- /* There is room for the next segment before the next point */
- f = (distance_to_previous_point + segment_length) / (distance_to_previous_point + distance_to_next_point);
- cuma->x_segment_vals[i] = lerp(cuma->curve[i_point].x, cuma->curve[i_point+1].x, f);
- cuma->y_segment_vals[i] = lerp(cuma->curve[i_point].x, cuma->curve[i_point+1].x, f);
- distance_to_next_point -= segment_length;
- distance_to_previous_point += segment_length;
- }
- else {
- /* We have to pass over a CurveMapPoint to get to the next segment */
- float left_after_pass = segment_length - distance_to_next_point;
+ /* Travel over all of the points that could be inside this segment */
+ while (distance_to_next_point > segment_length * (i + 1) - length_travelled) {
+ length_travelled += distance_to_next_point;
+ segment_left -= distance_to_next_point;
+ travelled_since_last_point += distance_to_next_point;
i_point++;
- distance_to_previous_point = segment_length - distance_to_next_point;
distance_to_next_point = curvemap_path_linear_distance_to_next_point(cuma, i_point);
- f = left_after_pass / (distance_to_previous_point + distance_to_next_point);
- cuma->x_segment_vals[i] = lerp(cuma->curve[i_point].x, cuma->curve[i_point+1].x, f);
- cuma->y_segment_vals[i] = lerp(cuma->curve[i_point].x, cuma->curve[i_point+1].x, f);
+ distance_to_previous_point = 0.0f;
}
- length_travelled += segment_length;
+ /* We're now at the last point that fits inside the current segment */
+
+ f = segment_left / (distance_to_previous_point + distance_to_next_point);
+ cuma->x_segment_vals[i] = lerp(cuma->curve[i_point].x, cuma->curve[i_point+1].x, f);
+ cuma->y_segment_vals[i] = lerp(cuma->curve[i_point].x, cuma->curve[i_point+1].x, f);
+ distance_to_next_point -= segment_left;
+ distance_to_previous_point += segment_left;
+
+ length_travelled += segment_left;
}
}
More information about the Bf-blender-cvs
mailing list