GPencil: Fix unreported missing frames in interpolation
When interpolate, the temp frames are tagged, and later removed. If for any reason any stroke was tagged in other area of Blender (this tag is used for temp tagging), the stroke could be removed by error when run interpolation. In a previous fix, the tag was cleared before, but only for the frame range of the interpolation. Now, the clear is done for all frames. Also, instead to clear for each stroke sampling, now it's done only once at invoke time.
This commit is contained in:
parent
766edbdf1f
commit
87c0a38a39
|
@ -136,15 +136,17 @@ static void gpencil_interpolate_free_temp_strokes(bGPDframe *gpf)
|
|||
}
|
||||
|
||||
/* Helper: Untag all strokes. */
|
||||
static void gpencil_interpolate_untag_strokes(bGPDframe *gpf)
|
||||
static void gpencil_interpolate_untag_strokes(bGPDlayer *gpl)
|
||||
{
|
||||
if (gpf == NULL) {
|
||||
if (gpl == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
|
||||
if (gps->flag & GP_STROKE_TAG) {
|
||||
gps->flag &= ~GP_STROKE_TAG;
|
||||
LISTBASE_FOREACH (bGPDframe *, gpf, &gpl->frames) {
|
||||
LISTBASE_FOREACH (bGPDstroke *, gps, &gpf->strokes) {
|
||||
if (gps->flag & GP_STROKE_TAG) {
|
||||
gps->flag &= ~GP_STROKE_TAG;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -263,15 +265,6 @@ static void gpencil_interpolate_set_points(bContext *C, tGPDinterpolate *tgpi)
|
|||
/* set layers */
|
||||
LISTBASE_FOREACH (bGPDlayer *, gpl, &gpd->layers) {
|
||||
tGPDinterpolate_layer *tgpil;
|
||||
|
||||
/* Untag strokes to be sure nothing is pending. This must be done for
|
||||
* all layer because it could be anything tagged and it would be removed
|
||||
* at the end of the process when all tagged strokes are removed. */
|
||||
if (gpl->actframe != NULL) {
|
||||
gpencil_interpolate_untag_strokes(gpl->actframe);
|
||||
gpencil_interpolate_untag_strokes(gpl->actframe->next);
|
||||
}
|
||||
|
||||
/* all layers or only active */
|
||||
if (!(tgpi->flag & GP_TOOLFLAG_INTERPOLATE_ALL_LAYERS) && (gpl != active_gpl)) {
|
||||
continue;
|
||||
|
@ -483,6 +476,11 @@ static bool gpencil_interpolate_set_init_values(bContext *C, wmOperator *op, tGP
|
|||
/* set layers */
|
||||
gpencil_interpolate_set_points(C, tgpi);
|
||||
|
||||
/* Untag strokes to be sure nothing is pending due any canceled process. */
|
||||
LISTBASE_FOREACH (bGPDlayer *, gpl, &tgpi->gpd->layers) {
|
||||
gpencil_interpolate_untag_strokes(gpl);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue