[Bf-blender-cvs] [c18eb01eb64] soc-2020-greasepencil-curve: GPencil: WIP: multi-dimensional curve fitting
Falk David
noreply at git.blender.org
Thu Jul 23 13:59:30 CEST 2020
Commit: c18eb01eb6416f06cd3ee59e428d24b6b6d2164a
Author: Falk David
Date: Thu Jul 23 13:41:13 2020 +0200
Branches: soc-2020-greasepencil-curve
https://developer.blender.org/rBc18eb01eb6416f06cd3ee59e428d24b6b6d2164a
GPencil: WIP: multi-dimensional curve fitting
===================================================================
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 e38c79f3a0f..982cea69901 100644
--- a/source/blender/blenkernel/intern/gpencil_curve.c
+++ b/source/blender/blenkernel/intern/gpencil_curve.c
@@ -53,8 +53,6 @@
#include "DEG_depsgraph_query.h"
-#define POINT_DIM 3
-
/* Helper: Check materials with same color. */
static int gpencil_check_same_material_color(Object *ob_gp, float color[4], Material **r_mat)
{
@@ -471,15 +469,26 @@ void BKE_gpencil_convert_curve(Main *bmain,
*/
bGPDcurve *BKE_gpencil_stroke_editcurve_generate(bGPDstroke *gps, float error_threshold)
{
+#define POINT_DIM 9
if (gps->totpoints < 1) {
return NULL;
}
float *points = MEM_callocN(sizeof(float) * gps->totpoints * POINT_DIM, __func__);
+ float diag_length = len_v3v3(gps->boundbox_min, gps->boundbox_max);
+ float tmp_vec[3];
+
for (int i = 0; i < gps->totpoints; i++) {
bGPDspoint *pt = &gps->points[i];
- float *to = &points[i * POINT_DIM];
- copy_v3_v3(to, &pt->x);
+ int row = i * POINT_DIM;
+
+ /* normalize coordinate to 0..1 */
+ sub_v3_v3v3(tmp_vec, &pt->x, gps->boundbox_min);
+ mul_v3_v3fl(&points[row], tmp_vec, 1.0f / diag_length);
+
+ points[row + 3] = pt->pressure;
+ points[row + 4] = pt->strength;
+ copy_v4_v4(&points[row + 5], pt->vert_color);
}
uint calc_flag = CURVE_FIT_CALC_HIGH_QUALIY;
@@ -487,40 +496,52 @@ bGPDcurve *BKE_gpencil_stroke_editcurve_generate(bGPDstroke *gps, float error_th
calc_flag |= CURVE_FIT_CALC_CYCLIC;
}
+ /* TODO: make this a parameter */
+ float corner_angle = M_PI_2;
+
float *r_cubic_array = NULL;
unsigned int r_cubic_array_len = 0;
unsigned int *r_cubic_orig_index = NULL;
unsigned int *r_corners_index_array = NULL;
unsigned int r_corners_index_len = 0;
- int r = curve_fit_cubic_to_points_fl(points,
- gps->totpoints,
- POINT_DIM,
- error_threshold,
- calc_flag,
- NULL,
- 0,
- &r_cubic_array,
- &r_cubic_array_len,
- &r_cubic_orig_index,
- &r_corners_index_array,
- &r_corners_index_len);
+ int r = curve_fit_cubic_to_points_refit_fl(points,
+ gps->totpoints,
+ POINT_DIM,
+ error_threshold,
+ calc_flag,
+ NULL,
+ 0,
+ corner_angle,
+ &r_cubic_array,
+ &r_cubic_array_len,
+ &r_cubic_orig_index,
+ &r_corners_index_array,
+ &r_corners_index_len);
if (r != 0 || r_cubic_array_len < 1) {
return NULL;
}
+ uint curve_point_size = 3 * POINT_DIM;
+
bGPDcurve *editcurve = BKE_gpencil_stroke_editcurve_new(r_cubic_array_len);
for (int i = 0; i < r_cubic_array_len; i++) {
bGPDcurve_point *cpt = &editcurve->curve_points[i];
BezTriple *bezt = &cpt->bezt;
- bGPDspoint *orig_pt = &gps->points[r_cubic_orig_index[i]];
+ float *curve_point = &r_cubic_array[i * curve_point_size];
+
for (int j = 0; j < 3; j++) {
- copy_v3_v3(bezt->vec[j], &r_cubic_array[i * 3 * POINT_DIM + j * 3]);
+ float *bez = &curve_point[j * POINT_DIM];
+ copy_v3_v3(tmp_vec, bez);
+ mul_v3_fl(tmp_vec, diag_length);
+ add_v3_v3v3(bezt->vec[j], tmp_vec, gps->boundbox_min);
}
- cpt->pressure = orig_pt->pressure;
- cpt->strength = orig_pt->strength;
- copy_v4_v4(cpt->vert_color, orig_pt->vert_color);
+
+ float *ctrl_point = &curve_point[1 * POINT_DIM];
+ cpt->pressure = ctrl_point[3];
+ cpt->strength = ctrl_point[4];
+ copy_v4_v4(cpt->vert_color, &ctrl_point[5]);
/* default handle type */
bezt->h1 |= HD_ALIGN;
@@ -540,6 +561,7 @@ bGPDcurve *BKE_gpencil_stroke_editcurve_generate(bGPDstroke *gps, float error_th
free(r_cubic_orig_index);
}
+#undef POINT_DIM
return editcurve;
}
More information about the Bf-blender-cvs
mailing list