[Bf-blender-cvs] [3086602f70d] temp-lineart-contained: LineArt: Global overrides for cached calculation.
YimingWu
noreply at git.blender.org
Thu Apr 22 05:45:36 CEST 2021
Commit: 3086602f70d5a0759ff0cda5f65abf93d6d35a21
Author: YimingWu
Date: Thu Apr 22 11:45:08 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB3086602f70d5a0759ff0cda5f65abf93d6d35a21
LineArt: Global overrides for cached calculation.
===================================================================
M source/blender/blenkernel/BKE_gpencil_modifier.h
M source/blender/blenkernel/intern/gpencil_modifier.c
M source/blender/gpencil_modifiers/MOD_gpencil_lineart.h
M source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
M source/blender/makesdna/DNA_gpencil_modifier_types.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index c6406c8478c..25fd3b18234 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -294,6 +294,18 @@ bool BKE_gpencil_has_geometry_modifiers(struct Object *ob);
bool BKE_gpencil_has_time_modifiers(struct Object *ob);
bool BKE_gpencil_has_transform_modifiers(struct Object *ob);
+typedef struct GpencilLineartLimitInfo {
+ char min_level;
+ char max_level;
+ short edge_types;
+} GpencilLineartLimitInfo;
+
+void BKE_gpencil_get_lineart_global_limits(struct Object *ob,
+ struct GpencilLineartLimitInfo *info);
+
+void BKE_gpencil_assign_lineart_global_limits(struct GpencilModifierData *md,
+ struct GpencilLineartLimitInfo *info);
+
void BKE_gpencil_lattice_init(struct Object *ob);
void BKE_gpencil_lattice_clear(struct Object *ob);
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index cf0c792f079..723e41557a5 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -166,21 +166,6 @@ bool BKE_gpencil_has_geometry_modifiers(Object *ob)
return false;
}
-/**
- * Check if object has grease pencil Geometry modifiers.
- * \param ob: Grease pencil object
- * \return True if exist
- */
-bool BKE_gpencil_has_lineart_modifiers(Object *ob)
-{
- LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
- if (md->type == eGpencilModifierType_Lineart) {
- return true;
- }
- }
- return false;
-}
-
/**
* Check if object has grease pencil Time modifiers.
* \param ob: Grease pencil object
@@ -218,6 +203,28 @@ bool BKE_gpencil_has_transform_modifiers(Object *ob)
return false;
}
+void BKE_gpencil_get_lineart_global_limits(Object *ob, struct GpencilLineartLimitInfo *info)
+{
+ LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
+ if (md->type == eGpencilModifierType_Lineart) {
+ LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+ info->min_level = MIN2(info->min_level, lmd->level_start);
+ info->max_level = MAX2(info->max_level,
+ (lmd->use_multiple_levels ? lmd->level_end : lmd->level_start));
+ info->edge_types |= lmd->edge_types;
+ }
+ }
+}
+
+void BKE_gpencil_assign_lineart_global_limits(GpencilModifierData *md,
+ struct GpencilLineartLimitInfo *info)
+{
+ LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)md;
+ lmd->level_start_override = info->min_level;
+ lmd->level_end_override = info->max_level;
+ lmd->edge_types_override = info->edge_types;
+}
+
/* apply time modifiers */
static int gpencil_time_modifier(
Depsgraph *depsgraph, Scene *scene, Object *ob, bGPDlayer *gpl, int cfra, bool is_render)
@@ -787,7 +794,8 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
BKE_gpencil_lattice_init(ob);
const bool time_remap = BKE_gpencil_has_time_modifiers(ob);
- const bool has_lineart = BKE_gpencil_has_lineart_modifiers(ob);
+ GpencilLineartLimitInfo info = {0};
+ BKE_gpencil_get_lineart_global_limits(ob, &info);
LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
@@ -798,6 +806,10 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
continue;
}
+ if (md->type == eGpencilModifierType_Lineart) {
+ BKE_gpencil_assign_lineart_global_limits(md, &info);
+ }
+
/* Apply geometry modifiers (add new geometry). */
if (mti && mti->generateStrokes) {
mti->generateStrokes(md, depsgraph, ob);
@@ -824,10 +836,7 @@ void BKE_gpencil_modifiers_calc(Depsgraph *depsgraph, Scene *scene, Object *ob)
/* Clear any lattice data. */
BKE_gpencil_lattice_clear(ob);
- // if (has_lineart) {
- MOD_lineart_clear_cache(gpd->runtime.lineart_cache);
- gpd->runtime.lineart_cache = NULL;
- //}
+ MOD_lineart_clear_cache(&gpd->runtime.lineart_cache);
}
void BKE_gpencil_modifier_blend_write(BlendWriter *writer, ListBase *modbase)
diff --git a/source/blender/gpencil_modifiers/MOD_gpencil_lineart.h b/source/blender/gpencil_modifiers/MOD_gpencil_lineart.h
index 417e65e9d3f..7d75ed5804e 100644
--- a/source/blender/gpencil_modifiers/MOD_gpencil_lineart.h
+++ b/source/blender/gpencil_modifiers/MOD_gpencil_lineart.h
@@ -32,4 +32,4 @@ void WM_operatortypes_lineart(void);
struct LineartCache;
-void MOD_lineart_clear_cache(struct LineartCache *lc);
+void MOD_lineart_clear_cache(struct LineartCache **lc);
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 81dec324bb8..e6b3bd3ee5b 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -2830,13 +2830,14 @@ static LineartCache *lineart_init_cache()
return lc;
}
-void MOD_lineart_clear_cache(struct LineartCache *lc)
+void MOD_lineart_clear_cache(struct LineartCache **lc)
{
- if (!lc) {
+ if (!(*lc)) {
return;
}
- lineart_mem_destroy(&lc->chain_data_pool);
- MEM_freeN(lc);
+ lineart_mem_destroy(&((*lc)->chain_data_pool));
+ MEM_freeN(*lc);
+ (*lc) = NULL;
}
static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
@@ -2891,11 +2892,11 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
/* See lineart_edge_from_triangle() for how this option may impact performance. */
rb->allow_overlapping_edges = (lmd->calculation_flags & LRT_ALLOW_OVERLAPPING_EDGES) != 0;
- rb->use_contour = (lmd->edge_types & LRT_EDGE_FLAG_CONTOUR) != 0;
- rb->use_crease = (lmd->edge_types & LRT_EDGE_FLAG_CREASE) != 0;
- rb->use_material = (lmd->edge_types & LRT_EDGE_FLAG_MATERIAL) != 0;
- rb->use_edge_marks = (lmd->edge_types & LRT_EDGE_FLAG_EDGE_MARK) != 0;
- rb->use_intersections = (lmd->edge_types & LRT_EDGE_FLAG_INTERSECTION) != 0;
+ rb->use_contour = (lmd->edge_types_override & LRT_EDGE_FLAG_CONTOUR) != 0;
+ rb->use_crease = (lmd->edge_types_override & LRT_EDGE_FLAG_CREASE) != 0;
+ rb->use_material = (lmd->edge_types_override & LRT_EDGE_FLAG_MATERIAL) != 0;
+ rb->use_edge_marks = (lmd->edge_types_override & LRT_EDGE_FLAG_EDGE_MARK) != 0;
+ rb->use_intersections = (lmd->edge_types_override & LRT_EDGE_FLAG_INTERSECTION) != 0;
rb->chain_data_pool = &lc->chain_data_pool;
@@ -3898,7 +3899,7 @@ bool MOD_lineart_compute_feature_lines(Depsgraph *depsgraph,
/* This is used to limit calculation to a certain level to save time, lines who have higher
* occlusion levels will get ignored. */
- rb->max_occlusion_level = MAX2(lmd->level_start, lmd->level_end);
+ rb->max_occlusion_level = lmd->level_end_override;
/* FIXME(Yiming): See definition of int #LineartRenderBuffer::_source_type for detailed. */
rb->_source_type = lmd->source_type;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
index ce0001fe4d2..4b99452b264 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c
@@ -179,16 +179,20 @@ static bool lineart_gpencil_bake_single_target(LineartBakeJob *bj, Object *ob, i
}
}
+ GpencilLineartLimitInfo info = {0};
+ BKE_gpencil_get_lineart_global_limits(ob, &info);
+
LineartCache *lc;
LISTBASE_FOREACH (GpencilModifierData *, md, &ob->greasepencil_modifiers) {
if (md->type != eGpencilModifierType_Lineart) {
continue;
}
+ BKE_gpencil_assign_lineart_global_limits(md, &info);
if (bake_strokes(ob, bj->dg, &lc, md, frame)) {
touched = true;
}
}
- MOD_lineart_clear_cache(lc);
+ MOD_lineart_clear_cache(&lc);
return touched;
}
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index 7dd7396fdb3..7848d2cd2a3 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -884,14 +884,20 @@ typedef struct LineartGpencilModifierData {
/* CPU mode */
float chaining_image_threshold;
- int _pad;
-
/* Ported from SceneLineArt flags. */
int calculation_flags;
/* Additional Switches. */
int flags;
+ /* Runtime data. */
+
+ /* Because we only do calculation once per modifier stack, so we need global override values for
+ * line art to compute as much data as possible. */
+ char level_start_override;
+ char level_end_override;
+ short edge_types_override;
+
struct LineartCache *cache;
/* Keep render buffer so we can call destroy from ModifierData. */
struct LineartRenderBuffer *render_buffer_onetime;
More information about the Bf-blender-cvs
mailing list