[Bf-blender-cvs] [ab91491963f] soc-2020-greasepencil-curve: GPencil: Recalculating handles for cyclic curves
Falk David
noreply at git.blender.org
Mon Jul 6 17:23:11 CEST 2020
Commit: ab91491963f555609c95dfe1bdc5317dcfd0a665
Author: Falk David
Date: Mon Jul 6 17:07:34 2020 +0200
Branches: soc-2020-greasepencil-curve
https://developer.blender.org/rBab91491963f555609c95dfe1bdc5317dcfd0a665
GPencil: Recalculating handles for cyclic curves
===================================================================
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 6b0016734df..949b741d67c 100644
--- a/source/blender/blenkernel/intern/gpencil_curve.c
+++ b/source/blender/blenkernel/intern/gpencil_curve.c
@@ -566,19 +566,19 @@ void BKE_gpencil_editcurve_stroke_sync_selection(bGPDstroke *gps, bGPDcurve *gpc
if (gps->flag & GP_STROKE_SELECT) {
gpc->flag |= GP_CURVE_SELECT;
- for (int i = 0; i < gpc->tot_curve_points; i++) {
- bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
- bGPDspoint *pt = &gps->points[gpc_pt->point_index];
- if (pt->flag & GP_SPOINT_SELECT) {
- gpc_pt->flag |= GP_CURVE_POINT_SELECT;
- BEZT_SEL_ALL(&gpc_pt->bezt);
- }
- else {
- gpc_pt->flag &= ~GP_CURVE_POINT_SELECT;
- BEZT_DESEL_ALL(&gpc_pt->bezt);
+ for (int i = 0; i < gpc->tot_curve_points; i++) {
+ bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
+ bGPDspoint *pt = &gps->points[gpc_pt->point_index];
+ if (pt->flag & GP_SPOINT_SELECT) {
+ gpc_pt->flag |= GP_CURVE_POINT_SELECT;
+ BEZT_SEL_ALL(&gpc_pt->bezt);
+ }
+ else {
+ gpc_pt->flag &= ~GP_CURVE_POINT_SELECT;
+ BEZT_DESEL_ALL(&gpc_pt->bezt);
+ }
}
}
-}
else {
gpc->flag &= ~GP_CURVE_SELECT;
gpencil_editstroke_deselect_all(gpc);
@@ -594,12 +594,12 @@ void BKE_gpencil_stroke_editcurve_sync_selection(bGPDstroke *gps, bGPDcurve *gpc
gps->flag |= GP_STROKE_SELECT;
for (int i = 0; i < gpc->tot_curve_points - 1; i++) {
- bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
- bGPDspoint *pt = &gps->points[gpc_pt->point_index];
+ bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
+ bGPDspoint *pt = &gps->points[gpc_pt->point_index];
bGPDcurve_point *gpc_pt_next = &gpc->curve_points[i + 1];
- if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
- pt->flag |= GP_SPOINT_SELECT;
+ if (gpc_pt->flag & GP_CURVE_POINT_SELECT) {
+ pt->flag |= GP_SPOINT_SELECT;
if (gpc_pt_next->flag & GP_CURVE_POINT_SELECT) {
/* select all the points after */
for (int j = gpc_pt->point_index + 1; j < gpc_pt_next->point_index; j++) {
@@ -614,9 +614,9 @@ void BKE_gpencil_stroke_editcurve_sync_selection(bGPDstroke *gps, bGPDcurve *gpc
for (int j = gpc_pt->point_index + 1; j < gpc_pt_next->point_index; j++) {
bGPDspoint *pt_next = &gps->points[j];
pt_next->flag &= ~GP_SPOINT_SELECT;
+ }
+ }
}
- }
-}
bGPDcurve_point *gpc_first = &gpc->curve_points[0];
bGPDcurve_point *gpc_last = &gpc->curve_points[gpc->tot_curve_points - 1];
@@ -792,24 +792,56 @@ void BKE_gpencil_editcurve_recalculate_handles(bGPDstroke *gps)
return;
}
- for (int i = 0; i < gpc->tot_curve_points; i++) {
+ if (gpc->tot_curve_points == 1) {
+ BKE_nurb_handle_calc(&(gpc->curve_points[0].bezt), NULL, NULL, false, 0);
+ gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
+ }
+
+ for (int i = 1; i < gpc->tot_curve_points - 1; i++) {
bGPDcurve_point *gpc_pt = &gpc->curve_points[i];
- bGPDcurve_point *gpc_pt_prev = (i > 0) ? &gpc->curve_points[i - 1] : NULL;
- bGPDcurve_point *gpc_pt_next = (i < gpc->tot_curve_points - 1) ? &gpc->curve_points[i + 1] :
- NULL;
+ bGPDcurve_point *gpc_pt_prev = &gpc->curve_points[i - 1];
+ bGPDcurve_point *gpc_pt_next = &gpc->curve_points[i + 1];
/* update handle if point or neighbour is selected */
- if (gpc_pt->flag & GP_CURVE_POINT_SELECT ||
- (gpc_pt_prev != NULL && gpc_pt_prev->flag & GP_CURVE_POINT_SELECT) ||
- (gpc_pt_next != NULL && gpc_pt_next->flag & GP_CURVE_POINT_SELECT)) {
+ if (gpc_pt->flag & GP_CURVE_POINT_SELECT || gpc_pt_prev->flag & GP_CURVE_POINT_SELECT ||
+ gpc_pt_next->flag & GP_CURVE_POINT_SELECT) {
BezTriple *bezt = &gpc_pt->bezt;
- BezTriple *bezt_prev = gpc_pt_prev != NULL ? &gpc_pt_prev->bezt : NULL;
- BezTriple *bezt_next = gpc_pt_next != NULL ? &gpc_pt_next->bezt : NULL;
+ BezTriple *bezt_prev = &gpc_pt_prev->bezt;
+ BezTriple *bezt_next = &gpc_pt_next->bezt;
BKE_nurb_handle_calc(bezt, bezt_prev, bezt_next, false, 0);
changed = true;
}
}
+ bGPDcurve_point *gpc_first = &gpc->curve_points[0];
+ bGPDcurve_point *gpc_last = &gpc->curve_points[gpc->tot_curve_points - 1];
+ bGPDcurve_point *gpc_first_next = &gpc->curve_points[1];
+ bGPDcurve_point *gpc_last_prev = &gpc->curve_points[gpc->tot_curve_points - 2];
+ if (gps->flag & GP_STROKE_CYCLIC) {
+ if (gpc_first->flag & GP_CURVE_POINT_SELECT || gpc_last->flag & GP_CURVE_POINT_SELECT) {
+ BezTriple *bezt_first = &gpc_first->bezt;
+ BezTriple *bezt_last = &gpc_last->bezt;
+ BezTriple *bezt_first_next = &gpc_first_next->bezt;
+ BezTriple *bezt_last_prev = &gpc_last_prev->bezt;
+
+ BKE_nurb_handle_calc(bezt_first, bezt_last, bezt_first_next, false, 0);
+ BKE_nurb_handle_calc(bezt_last, bezt_last_prev, bezt_first, false, 0);
+ changed = true;
+ }
+ }
+ else {
+ if (gpc_first->flag & GP_CURVE_POINT_SELECT || gpc_last->flag & GP_CURVE_POINT_SELECT) {
+ BezTriple *bezt_first = &gpc_first->bezt;
+ BezTriple *bezt_last = &gpc_last->bezt;
+ BezTriple *bezt_first_next = &gpc_first_next->bezt;
+ BezTriple *bezt_last_prev = &gpc_last_prev->bezt;
+
+ BKE_nurb_handle_calc(bezt_first, NULL, bezt_first_next, false, 0);
+ BKE_nurb_handle_calc(bezt_last, bezt_last_prev, NULL, false, 0);
+ changed = true;
+ }
+ }
+
if (changed) {
gps->flag |= GP_STROKE_NEEDS_CURVE_UPDATE;
}
More information about the Bf-blender-cvs
mailing list