[Bf-blender-cvs] [09f72c5dba3] lanpr-under-gp: LANPR: Auto update for modifier now works in dg.
YimingWu
noreply at git.blender.org
Sun Jun 28 11:26:58 CEST 2020
Commit: 09f72c5dba3a80be26fb36a8aefebdb2dd593868
Author: YimingWu
Date: Sun Jun 28 17:26:43 2020 +0800
Branches: lanpr-under-gp
https://developer.blender.org/rB09f72c5dba3a80be26fb36a8aefebdb2dd593868
LANPR: Auto update for modifier now works in dg.
===================================================================
M source/blender/editors/include/ED_lineart.h
M source/blender/editors/lineart/lineart_cpu.c
M source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
M source/blender/makesrna/intern/rna_gpencil_modifier.c
===================================================================
diff --git a/source/blender/editors/include/ED_lineart.h b/source/blender/editors/include/ED_lineart.h
index 524bc9f5bdb..39ae8ce8033 100644
--- a/source/blender/editors/include/ED_lineart.h
+++ b/source/blender/editors/include/ED_lineart.h
@@ -261,6 +261,12 @@ typedef enum eLineartInitStatus {
LRT_INIT_LOCKS = (1 << 1),
} eLineartInitStatus;
+typedef enum eLineartModifierSyncStatus {
+ LRT_SYNC_IDLE = 0,
+ LRT_SYNC_WAITING = 1,
+ LRT_SYNC_FRESH = 2,
+} eLineartModifierSyncStatus;
+
typedef struct LineartSharedResource {
/* We only allocate once for all */
@@ -282,6 +288,7 @@ typedef struct LineartSharedResource {
*/
SpinLock lock_render_status;
eLineartRenderStatus flag_render_status;
+ eLineartModifierSyncStatus fflag_sync_staus;
/** Geometry loading is done in the worker thread,
* Lock the render thread until loading is done, so that
@@ -490,6 +497,9 @@ void *ED_lineart_make_leveled_edge_vertex_array(struct LineartRenderBuffer *rb,
void ED_lineart_calculation_set_flag(eLineartRenderStatus flag);
bool ED_lineart_calculation_flag_check(eLineartRenderStatus flag);
+void ED_lineart_modifier_sync_set_flag(eLineartModifierSyncStatus flag, bool is_from_modifier);
+bool ED_lineart_modifier_sync_flag_check(eLineartModifierSyncStatus flag);
+
int ED_lineart_compute_feature_lines_internal(struct Depsgraph *depsgraph,
const int instersections_only);
diff --git a/source/blender/editors/lineart/lineart_cpu.c b/source/blender/editors/lineart/lineart_cpu.c
index 253f58d5fb2..078a9e0ff52 100644
--- a/source/blender/editors/lineart/lineart_cpu.c
+++ b/source/blender/editors/lineart/lineart_cpu.c
@@ -35,6 +35,7 @@
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_gpencil.h"
+#include "BKE_gpencil_modifier.h"
#include "BKE_object.h"
#include "BKE_report.h"
#include "BKE_scene.h"
@@ -2651,6 +2652,24 @@ bool ED_lineart_calculation_flag_check(eLineartRenderStatus flag)
return match;
}
+void ED_lineart_modifier_sync_set_flag(eLineartModifierSyncStatus flag, bool is_from_modifier)
+{
+ BLI_spin_lock(&lineart_share.lock_render_status);
+
+ lineart_share.fflag_sync_staus = flag;
+
+ BLI_spin_unlock(&lineart_share.lock_render_status);
+}
+
+bool ED_lineart_modifier_sync_flag_check(eLineartModifierSyncStatus flag)
+{
+ bool match;
+ BLI_spin_lock(&lineart_share.lock_render_status);
+ match = (lineart_share.fflag_sync_staus == flag);
+ BLI_spin_unlock(&lineart_share.lock_render_status);
+ return match;
+}
+
static int lineart_max_occlusion_in_collections(Collection *c)
{
CollectionChild *cc;
@@ -3824,11 +3843,17 @@ typedef struct LRT_FeatureLineWorker {
} LRT_FeatureLineWorker;
static void lineart_update_gp_strokes_actual(Scene *scene, Depsgraph *dg);
+static void lineart_notify_gpencil_targets(Depsgraph *dg);
static void lineart_compute_feature_lines_worker(TaskPool *__restrict UNUSED(pool),
LRT_FeatureLineWorker *worker_data)
{
ED_lineart_compute_feature_lines_internal(worker_data->dg, worker_data->intersection_only);
+
+ /* Calculation is done, give fresh data. */
+ ED_lineart_modifier_sync_set_flag(LRT_SYNC_FRESH, false);
+
+ lineart_notify_gpencil_targets(worker_data->dg);
// lineart_update_gp_strokes_actual(DEG_get_evaluated_scene(worker_data->dg), worker_data->dg);
ED_lineart_calculation_set_flag(LRT_RENDER_FINISHED);
}
@@ -3842,7 +3867,7 @@ void ED_lineart_compute_feature_lines_background(Depsgraph *dg, const int inters
/* If the calculation is already started then bypass it. */
if (ED_lineart_calculation_flag_check(LRT_RENDER_RUNNING)) {
- /* Release lock when early return. */
+ /* Release lock when early return. TODO: Canceling */
BLI_spin_unlock(&lineart_share.lock_loader);
return;
}
@@ -3922,6 +3947,22 @@ void SCENE_OT_lineart_calculate_feature_lines(wmOperatorType *ot)
/* Grease Pencil bindings */
+static void lineart_notify_gpencil_targets(Depsgraph *dg)
+{
+ DEG_OBJECT_ITER_BEGIN (dg,
+ o,
+ DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY | DEG_ITER_OBJECT_FLAG_VISIBLE |
+ DEG_ITER_OBJECT_FLAG_DUPLI | DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET) {
+ if (o->type == OB_GPENCIL) {
+ if (BKE_gpencil_modifiers_findby_type(o, eGpencilModifierType_Lineart)) {
+ bGPdata *gpd = ((Object *)o->id.orig_id)->data;
+ DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY);
+ }
+ }
+ }
+ DEG_OBJECT_ITER_END;
+}
+
/* returns flags from LineartEdgeFlag */
static int lineart_object_line_types(Object *ob)
{
@@ -3961,13 +4002,15 @@ void ED_lineart_generate_gpencil_from_chain(Depsgraph *depsgraph,
if ((!lineart_share.init_complete) || !ED_lineart_calculation_flag_check(LRT_RENDER_FINISHED)) {
/* cache not ready */
+ printf("Line art cache not ready.\n");
return;
}
else {
/* lock the cache, prevent rendering job from starting */
BLI_spin_lock(&lineart_share.lock_render_status);
}
-
+ static int tempnum = 0;
+ tempnum++;
int color_idx = 0;
short thickness = 100;
@@ -3991,7 +4034,7 @@ void ED_lineart_generate_gpencil_from_chain(Depsgraph *depsgraph,
if (rlc->level > level_end || rlc->level < level_start) {
continue;
}
- if (ob && &ob->id != rlc->object_ref) {
+ if (ob && ob->id.orig_id != rlc->object_ref->id.orig_id) {
/* Note: not object_ref and ob are both (same?) copy on write data, if legacy mode, use
* object_ref->id.orig_id. Same below.
* TODO? Should we always use orig_id in the future? */
@@ -4485,12 +4528,19 @@ void ED_lineart_post_frame_update_external(Scene *s, Depsgraph *dg)
if ((s->lineart.flags & LRT_ENABLED) == 0 || !(s->lineart.flags & LRT_AUTO_UPDATE)) {
return;
}
- if (s->lineart.flags & LRT_AUTO_UPDATE) {
- ED_lineart_compute_feature_lines_background(dg, 0);
+ if (ED_lineart_modifier_sync_flag_check(LRT_SYNC_WAITING)) {
+ /* Modifier is waiting for data, trigger update (will wait/cancel if already running) */
+ if (s->lineart.flags & LRT_AUTO_UPDATE) {
+ ED_lineart_compute_feature_lines_background(dg, 0);
- /* Wait for loading finish */
- BLI_spin_lock(&lineart_share.lock_loader);
- BLI_spin_unlock(&lineart_share.lock_loader);
+ /* Wait for loading finish */
+ BLI_spin_lock(&lineart_share.lock_loader);
+ BLI_spin_unlock(&lineart_share.lock_loader);
+ }
+ }
+ else if (ED_lineart_modifier_sync_flag_check(LRT_SYNC_FRESH)) {
+ /* At this stage GP should have all the data. We clear the flag */
+ ED_lineart_modifier_sync_set_flag(LRT_SYNC_IDLE, false);
}
}
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index e6eae85829d..82436a7720f 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -65,6 +65,7 @@
static void initData(GpencilModifierData *md)
{
LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+ lmd->line_types = LRT_EDGE_FLAG_ALL_TYPE;
}
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
@@ -85,6 +86,23 @@ static void generate_strokes_actual(
return;
}
+ if (ED_lineart_modifier_sync_flag_check(LRT_SYNC_IDLE)) {
+ /* Update triggered when nothing's happening, means DG update, so we request a refresh on line
+ * art cache, meanwhile waiting for result. Update will trigger agian */
+ ED_lineart_modifier_sync_set_flag(LRT_SYNC_WAITING, true);
+ printf("Set waiting.\n");
+ return;
+ }
+ else if (ED_lineart_modifier_sync_flag_check(LRT_SYNC_WAITING)) {
+ printf("Still waiting.\n");
+ /* Calculation in process */
+ return;
+ }
+
+ printf("Using data.\n");
+ /* If we reach here, means calculation is finished (LRT_SYNC_FRESH), we grab cache. flag reset is
+ * done by calculation function.*/
+
if (lmd->source_type == LRT_SOURCE_OBJECT) {
Object *source_object = lmd->source_object;
if (!source_object) {
@@ -156,18 +174,41 @@ static void bakeModifier(Main *UNUSED(bmain),
}
}
+static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx)
+{
+ LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+ if (lmd->source_type == LRT_SOURCE_OBJECT) {
+ DEG_add_object_relation(
+ ctx->node, lmd->source_object, DEG_OB_COMP_GEOMETRY, "Line Art Modifier");
+ DEG_add_object_relation(
+ ctx->node, lmd->source_object, DEG_OB_COMP_TRANSFORM, "Line Art Modifier");
+ }
+}
+
static void freeData(GpencilModifierData *md)
{
LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
}
+static void foreachObjectLink(GpencilModifierData *md,
+ Object *ob,
+ ObjectWalkFunc walk,
+ void *userData)
+{
+ LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+
+ walk(userData, ob, &lmd->source_object, IDWALK_CB_NOP);
+}
+
static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
{
LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
walk(userData, ob, (ID **)&lmd->target_gp_material, IDWALK_CB_USER);
- walk(userData, ob, (ID **)&lmd->source_object, IDWALK_CB_USER);
+ // walk(userData, ob, (ID **)&lmd->source_object, IDWALK_CB_USER);
walk(userData, ob, (ID **)&lmd->source_collection, IDWALK_CB_USER);
+
+ foreachObjectLink(md, ob, (ObjectWalkFunc)walk, userData);
}
static void panel_draw(const bContext *C, Panel *panel)
@@ -253,9 +294,9 @@ GpencilModifierTypeInfo modifierType_Gpencil_Lineart = {
/* initData */ initData,
/* freeData */ freeData,
/* isDisabled */ NULL,
- /* updateDepsgraph */ NULL,
+ /* updateDepsgraph */ updateDepsgraph,
/* dependsOnTime */ NULL,
- /* foreachObjectLink */ NULL,
+ /* foreachObjectLink */ foreachObjectLink,
/* foreachIDLink */ foreachIDLink,
/* foreachTexLink */ NULL,
/* panelRegister */ panelRegister,
di
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list