Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonioya <blendergit@gmail.com>2016-09-11 13:22:30 +0300
committerAntonioya <blendergit@gmail.com>2016-09-11 13:28:09 +0300
commit347d759c623fe238c79a2d31827b8999d228fefe (patch)
tree9b32e67d45e55c6d7122885dc816dca2dcd09fdc /source/blender/editors/gpencil
parent96f28f9b5060f823631ced28e325e5d6b11c25b4 (diff)
GPencil: Change interpolate stroke factor
Now the factor works similar to other Blender areas to make the factor more consistent for artists. The value 0% means equal to original stroke, 100% equal to final stroke (50% means half way). Any value below 0% or greater than 100% create an overshoot of the stroke.
Diffstat (limited to 'source/blender/editors/gpencil')
-rw-r--r--source/blender/editors/gpencil/gpencil_edit.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c
index 3d0323dbfb1..cce22ba9e17 100644
--- a/source/blender/editors/gpencil/gpencil_edit.c
+++ b/source/blender/editors/gpencil/gpencil_edit.c
@@ -2076,6 +2076,12 @@ static void gp_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
bGPDstroke *gps_from, *gps_to, *new_stroke;
int fFrame;
+ /* save initial factor for active layer to define shift limits */
+ tgpi->init_factor = (float)(tgpi->cframe - active_gpl->actframe->framenum) / (active_gpl->actframe->next->framenum - active_gpl->actframe->framenum + 1);
+ /* limits are 100% below 0 and 100% over the 100% */
+ tgpi->low_limit = -1.0f - tgpi->init_factor;
+ tgpi->high_limit = 2.0f - tgpi->init_factor;
+
/* set layers */
for (gpl = gpd->layers.first; gpl; gpl = gpl->next) {
/* all layers or only active */
@@ -2099,7 +2105,7 @@ static void gp_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
tgpil->interFrame = MEM_callocN(sizeof(bGPDframe), "bGPDframe");
tgpil->interFrame->framenum = tgpi->cframe;
- /* get interpolation factor */
+ /* get interpolation factor by layer (usually must be equal for all layers, but not sure) */
tgpil->factor = (float)(tgpi->cframe - tgpil->prevFrame->framenum) / (tgpil->nextFrame->framenum - tgpil->prevFrame->framenum + 1);
/* create new strokes data with interpolated points reading original stroke */
for (gps_from = tgpil->prevFrame->strokes.first; gps_from; gps_from = gps_from->next) {
@@ -2159,13 +2165,13 @@ static void gpencil_mouse_update_shift(tGPDinterpolate *tgpi, wmOperator *op, co
float mid = (float)(tgpi->ar->winx - tgpi->ar->winrct.xmin) / 2.0f;
float mpos = event->x - tgpi->ar->winrct.xmin;
if (mpos >= mid) {
- tgpi->shift = (mpos - mid) / mid;
+ tgpi->shift = ((mpos - mid) * tgpi->high_limit) / mid;
}
else {
- tgpi->shift = -1.0f * (1.0f - (mpos / mid));
+ tgpi->shift = tgpi->low_limit - ((mpos * tgpi->low_limit) / mid);
}
- CLAMP(tgpi->shift, -1.0f, 1.0f);
+ CLAMP(tgpi->shift, tgpi->low_limit, tgpi->high_limit);
RNA_float_set(op->ptr, "shift", tgpi->shift);
}
@@ -2185,7 +2191,7 @@ static void gpencil_interpolate_status_indicators(tGPDinterpolate *p)
BLI_snprintf(status_str, sizeof(status_str), "%s: %s", msg_str, str_offs);
}
else {
- BLI_snprintf(status_str, sizeof(status_str), "%s: %d", msg_str, (int)(p->shift * 100.0f));
+ BLI_snprintf(status_str, sizeof(status_str), "%s: %d %%", msg_str, (int)((p->init_factor + p->shift) * 100.0f));
}
ED_area_headerprint(p->sa, status_str);
@@ -2343,13 +2349,13 @@ static int gpencil_interpolate_invoke(bContext *C, wmOperator *op, const wmEvent
/* cannot interpolate if not between 2 frames */
if ((gpl->actframe == NULL) || (gpl->actframe->next == NULL)) {
- BKE_report(op->reports, RPT_ERROR, "Interpolation requires to be between two grease pencil frames");
+ BKE_report(op->reports, RPT_ERROR, "Interpolation requires to be between two grease pencil frames in active layer");
return OPERATOR_CANCELLED;
}
/* cannot interpolate in extremes */
if ((gpl->actframe->framenum == scene->r.cfra) || (gpl->actframe->next->framenum == scene->r.cfra)) {
- BKE_report(op->reports, RPT_ERROR, "Interpolation requires to be between two grease pencil frames");
+ BKE_report(op->reports, RPT_ERROR, "Interpolation requires to be between two grease pencil frames in active layer");
return OPERATOR_CANCELLED;
}
@@ -2444,7 +2450,7 @@ static int gpencil_interpolate_modal(bContext *C, wmOperator *op, const wmEvent
case WHEELUPMOUSE:
{
tgpi->shift = tgpi->shift + 0.01f;
- CLAMP(tgpi->shift, -1.0f, 1.0f);
+ CLAMP(tgpi->shift, tgpi->low_limit, tgpi->high_limit);
RNA_float_set(op->ptr, "shift", tgpi->shift);
/* update screen */
gpencil_interpolate_update(C, op, tgpi);
@@ -2453,7 +2459,7 @@ static int gpencil_interpolate_modal(bContext *C, wmOperator *op, const wmEvent
case WHEELDOWNMOUSE:
{
tgpi->shift = tgpi->shift - 0.01f;
- CLAMP(tgpi->shift, -1.0f, 1.0f);
+ CLAMP(tgpi->shift, tgpi->low_limit, tgpi->high_limit);
RNA_float_set(op->ptr, "shift", tgpi->shift);
/* update screen */
gpencil_interpolate_update(C, op, tgpi);
@@ -2473,13 +2479,16 @@ static int gpencil_interpolate_modal(bContext *C, wmOperator *op, const wmEvent
default:
if ((event->val == KM_PRESS) && handleNumInput(C, &tgpi->num, event)) {
float value;
+ float factor = tgpi->init_factor;
/* Grab shift from numeric input, and store this new value (the user see an int) */
- value = tgpi->shift * 100.0f;
+ value = (factor + tgpi->shift) * 100.0f;
applyNumInput(&tgpi->num, &value);
-
tgpi->shift = value / 100.0f;
- CLAMP(tgpi->shift, -1.0f, 1.0f);
+ /* recalculate the shift to get the right value in the frame scale */
+ tgpi->shift = tgpi->shift - factor;
+
+ CLAMP(tgpi->shift, tgpi->low_limit, tgpi->high_limit);
RNA_float_set(op->ptr, "shift", tgpi->shift);
/* update screen */