[Bf-blender-cvs] [fa662dceef3] soc-2020-greasepencil-curve: GPencil: Support cyclic curves
Falk David
noreply at git.blender.org
Mon Jul 6 17:23:11 CEST 2020
Commit: fa662dceef378f9c68d56c7d1e5e403d14bc8b46
Author: Falk David
Date: Mon Jul 6 17:05:05 2020 +0200
Branches: soc-2020-greasepencil-curve
https://developer.blender.org/rBfa662dceef378f9c68d56c7d1e5e403d14bc8b46
GPencil: Support cyclic curves
Generte points between the first and last curve point when
converting a curve to a stroke.
===================================================================
M source/blender/blenkernel/intern/gpencil_curve.c
===================================================================
diff --git a/source/blender/blenkernel/intern/gpencil_curve.c b/source/blender/blenkernel/intern/gpencil_curve.c
index ac3ef162b22..6b0016734df 100644
--- a/source/blender/blenkernel/intern/gpencil_curve.c
+++ b/source/blender/blenkernel/intern/gpencil_curve.c
@@ -676,6 +676,38 @@ static void gpencil_interpolate_v4_from_to(
}
}
+static void gpencil_calculate_stroke_points_curve_point(
+ bGPDcurve_point *cpt, bGPDcurve_point *cpt_next, float *points_offset, int resolu, int stride)
+{
+ /* sample points on all 3 axis between two curve points */
+ for (uint axis = 0; axis < 3; axis++) {
+ BKE_curve_forward_diff_bezier(cpt->bezt.vec[1][axis],
+ cpt->bezt.vec[2][axis],
+ cpt_next->bezt.vec[0][axis],
+ cpt_next->bezt.vec[1][axis],
+ POINTER_OFFSET(points_offset, sizeof(float) * axis),
+ (int)resolu,
+ stride);
+ }
+
+ /* interpolate other attributes */
+ gpencil_interpolate_fl_from_to(cpt->pressure,
+ cpt_next->pressure,
+ POINTER_OFFSET(points_offset, sizeof(float) * 3),
+ resolu,
+ stride);
+ gpencil_interpolate_fl_from_to(cpt->strength,
+ cpt_next->strength,
+ POINTER_OFFSET(points_offset, sizeof(float) * 4),
+ resolu,
+ stride);
+ gpencil_interpolate_v4_from_to(cpt->vert_color,
+ cpt_next->vert_color,
+ POINTER_OFFSET(points_offset, sizeof(float) * 5),
+ resolu,
+ stride);
+}
+
/**
* Recalculate stroke points with the editcurve of the stroke.
*/
@@ -696,7 +728,7 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps)
const uint stride = sizeof(float[9]);
const uint resolu_stride = resolu * stride;
const uint points_len = BKE_curve_calc_coords_axis_len(
- curve_point_array_len, resolu, is_cyclic, true);
+ curve_point_array_len, resolu, is_cyclic, false);
float(*points)[9] = MEM_callocN((stride * points_len * (is_cyclic ? 2 : 1)), __func__);
float *points_offset = &points[0][0];
@@ -704,59 +736,23 @@ void BKE_gpencil_stroke_update_geometry_from_editcurve(bGPDstroke *gps)
bGPDcurve_point *cpt_curr = &curve_point_array[i];
bGPDcurve_point *cpt_next = &curve_point_array[i + 1];
- /* sample points on all 3 axis between two curve points */
- for (uint axis = 0; axis < 3; axis++) {
- BKE_curve_forward_diff_bezier(cpt_curr->bezt.vec[1][axis],
- cpt_curr->bezt.vec[2][axis],
- cpt_next->bezt.vec[0][axis],
- cpt_next->bezt.vec[1][axis],
- POINTER_OFFSET(points_offset, sizeof(float) * axis),
- (int)resolu,
- stride);
- }
-
- /* interpolate other attributes */
- gpencil_interpolate_fl_from_to(cpt_curr->pressure,
- cpt_next->pressure,
- POINTER_OFFSET(points_offset, sizeof(float) * 3),
- resolu,
- stride);
- gpencil_interpolate_fl_from_to(cpt_curr->strength,
- cpt_next->strength,
- POINTER_OFFSET(points_offset, sizeof(float) * 4),
- resolu,
- stride);
- gpencil_interpolate_v4_from_to(cpt_curr->vert_color,
- cpt_next->vert_color,
- POINTER_OFFSET(points_offset, sizeof(float) * 5),
- resolu,
- stride);
+ gpencil_calculate_stroke_points_curve_point(cpt_curr, cpt_next, points_offset, resolu, stride);
/* update the index */
cpt_curr->point_index = i * resolu;
points_offset = POINTER_OFFSET(points_offset, resolu_stride);
}
- /* TODO: make cyclic strokes work */
- // if (is_cyclic) {
- // bGPDcurve_point *cpt_curr = &curve_point_array[array_last];
- // bGPDcurve_point *cpt_next = &curve_point_array[0];
- // BKE_curve_forward_diff_bezier(cpt_curr->bezt.vec[1][axis],
- // cpt_curr->bezt.vec[2][axis],
- // cpt_next->bezt.vec[0][axis],
- // cpt_next->bezt.vec[1][axis],
- // points_offset,
- // (int)resolu,
- // stride);
- // points_offset = POINTER_OFFSET(points_offset, stride);
- // }
- // else {
- // float *points_last = POINTER_OFFSET(&points[0][axis], array_last * resolu_stride);
- // *points_last = curve_point_array[array_last].bezt.vec[1][axis];
- // points_offset = POINTER_OFFSET(points_offset, stride);
- // }
-
if (is_cyclic) {
- memcpy(points[points_len], points[0], stride * points_len);
+ bGPDcurve_point *cpt_curr = &curve_point_array[array_last];
+ bGPDcurve_point *cpt_next = &curve_point_array[0];
+
+ gpencil_calculate_stroke_points_curve_point(cpt_curr, cpt_next, points_offset, resolu, stride);
+
+ cpt_curr->point_index = array_last * resolu;
+ }
+ else {
+ bGPDcurve_point *cpt_curr = &curve_point_array[array_last];
+ cpt_curr->point_index = array_last * resolu;
}
/* resize stroke point array */
More information about the Bf-blender-cvs
mailing list