[Bf-blender-cvs] [2c329f91fe8] temp-lineart-contained: LineArt: Baking and clearing notifier updated.
YimingWu
noreply at git.blender.org
Wed Mar 10 06:46:54 CET 2021
Commit: 2c329f91fe83ce8b8abe8e6f472ee16bf10f0247
Author: YimingWu
Date: Wed Mar 10 13:46:22 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB2c329f91fe83ce8b8abe8e6f472ee16bf10f0247
LineArt: Baking and clearing notifier updated.
===================================================================
M source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
===================================================================
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index 91d909a4af7..5ae16efbf00 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -70,17 +70,17 @@ static void clear_strokes(Object *ob, GpencilModifierData *md, int frame)
BKE_gpencil_layer_frame_delete(gpl, gpf);
}
-static void bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int frame)
+static bool bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int frame)
{
if (md->type != eGpencilModifierType_Lineart) {
- return;
+ return false;
}
LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
bGPdata *gpd = ob->data;
bGPDlayer *gpl = BKE_gpencil_layer_get_by_name(gpd, lmd->target_layer, 1);
if (!gpl) {
- return;
+ return false;
}
bool only_use_existing_gp_frames = false;
bGPDframe *gpf = (only_use_existing_gp_frames ?
@@ -89,7 +89,7 @@ static void bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int
if (!gpf) {
/* No greasepencil frame created or found. */
- return;
+ return false;
}
ED_lineart_compute_feature_lines_internal(dg, lmd);
@@ -117,6 +117,10 @@ static void bake_strokes(Object *ob, Depsgraph *dg, GpencilModifierData *md, int
lmd->flags);
ED_lineart_destroy_render_data(lmd);
+
+ md->mode &= ~(eGpencilModifierMode_Realtime | eGpencilModifierMode_Render);
+
+ return true;
}
typedef struct LineartBakeJob {
@@ -138,15 +142,16 @@ typedef struct LineartBakeJob {
bool overwrite_frames;
} LineartBakeJob;
-static void lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob)
+static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob)
{
+ bool touched = false;
+ if (ob->type != OB_GPENCIL) {
+ return false;
+ }
for (int frame = bj->frame_begin; frame <= bj->frame_end; frame += bj->frame_increment) {
BKE_scene_frame_set(bj->scene, frame);
BKE_scene_graph_update_for_newframe(bj->dg);
- if (ob->type != OB_GPENCIL) {
- continue;
- }
if (bj->overwrite_frames) {
LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
@@ -155,11 +160,14 @@ static void lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob)
}
LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
- bake_strokes(ob, bj->dg, md, frame);
+ if (bake_strokes(ob, bj->dg, md, frame)) {
+ touched = true;
+ }
}
*bj->progress = (float)(frame - bj->frame_begin) / (bj->frame_end - bj->frame_begin);
}
+ return true;
}
static void lineart_gpencil_bake_startjob(void *customdata,
@@ -173,11 +181,17 @@ static void lineart_gpencil_bake_startjob(void *customdata,
if (bj->ob) {
/* Which means only bake one line art gpencil object, specified by bj->ob. */
- lineart_gpencil_bake_single_target(bj, bj->ob);
+ if (lineart_gpencil_bake_single_target(bj, bj->ob)) {
+ DEG_id_tag_update((struct ID *)bj->ob->data, ID_RECALC_GEOMETRY);
+ WM_event_add_notifier(bj->C, NC_GPENCIL | ND_DATA | NA_EDITED, bj->ob);
+ }
}
else {
CTX_DATA_BEGIN (bj->C, Object *, ob, visible_objects) {
- lineart_gpencil_bake_single_target(bj, ob);
+ if (lineart_gpencil_bake_single_target(bj, ob)) {
+ DEG_id_tag_update((struct ID *)ob->data, ID_RECALC_GEOMETRY);
+ WM_event_add_notifier(bj->C, NC_GPENCIL | ND_DATA | NA_EDITED, ob);
+ }
}
CTX_DATA_END;
}
@@ -245,6 +259,7 @@ static int lineart_gpencil_bake_common(bContext *C,
else {
float pseduo_progress;
lineart_gpencil_bake_startjob(bj, NULL, NULL, &pseduo_progress);
+
MEM_freeN(bj);
return OPERATOR_FINISHED;
@@ -307,8 +322,10 @@ static int lineart_gpencil_clear_strokes_exec(bContext *C, wmOperator *op)
BKE_gpencil_free_frames(gpl);
}
- BKE_report(op->reports, RPT_INFO, "Line Art clear layers is complete.");
- WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
+ BKE_report(op->reports, RPT_INFO, "Line art cleared for this target.");
+
+ DEG_id_tag_update((struct ID *)ob->data, ID_RECALC_GEOMETRY);
+ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, ob);
return OPERATOR_FINISHED;
}
static int lineart_gpencil_clear_strokes_all_targets_exec(bContext *C, wmOperator *op)
@@ -330,11 +347,12 @@ static int lineart_gpencil_clear_strokes_all_targets_exec(bContext *C, wmOperato
}
BKE_gpencil_free_frames(gpl);
}
+ DEG_id_tag_update((struct ID *)ob->data, ID_RECALC_GEOMETRY);
+ WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, ob);
}
CTX_DATA_END;
- BKE_report(op->reports, RPT_INFO, "Line Art all clear layers is complete.");
- WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED, NULL);
+ BKE_report(op->reports, RPT_INFO, "All line art targets are now cleared.");
return OPERATOR_FINISHED;
}
More information about the Bf-blender-cvs
mailing list