[Bf-blender-cvs] [0742bc5087e] greasepencil-refactor: Cleanup: GPencil: Simplify drawing logic.
Clément Foucault
noreply at git.blender.org
Mon Dec 16 02:14:12 CET 2019
Commit: 0742bc5087e65604b90672c1000cf05209fe80f2
Author: Clément Foucault
Date: Mon Dec 16 01:03:32 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB0742bc5087e65604b90672c1000cf05209fe80f2
Cleanup: GPencil: Simplify drawing logic.
===================================================================
M source/blender/draw/engines/gpencil/gpencil_cache_utils.c
M source/blender/draw/engines/gpencil/gpencil_engine.c
M source/blender/draw/engines/gpencil/gpencil_engine.h
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
index 2073b44d284..ba51465353a 100644
--- a/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_cache_utils.c
@@ -66,6 +66,7 @@ GPENCIL_tLayer *gpencil_layer_cache_add_new(GPENCIL_PrivateData *pd, Object *ob,
const bool is_mask = (gpl->flag & GP_LAYER_USE_MASK) != 0;
tgp_layer->is_mask = is_mask;
+ tgp_layer->do_masked_clear = false;
if (!is_mask) {
tgp_layer->is_masked = false;
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 1c0731b289f..a1d643d170a 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -798,9 +798,14 @@ static void gp_layer_cache_populate(bGPDlayer *gpl,
gpIterPopulateData *iter = (gpIterPopulateData *)thunk;
bGPdata *gpd = (bGPdata *)iter->ob->data;
+ GPENCIL_tLayer *tgp_layer_prev = iter->tgp_ob->layers.last;
GPENCIL_tLayer *tgp_layer = gpencil_layer_cache_add_new(iter->pd, iter->ob, gpl);
BLI_LINKS_APPEND(&iter->tgp_ob->layers, tgp_layer);
+ if (tgp_layer->is_masked && (tgp_layer_prev == NULL || !tgp_layer_prev->is_masked)) {
+ tgp_layer->do_masked_clear = true;
+ }
+
GPUUniformBuffer *ubo_mat;
gpencil_material_resources_get(iter->matpool, 0, NULL, NULL, &ubo_mat);
@@ -1340,38 +1345,43 @@ static void GPENCIL_draw_scene_new(void *ved)
GPU_framebuffer_multi_clear(fbl->gpencil_fb, clear_cols);
for (GPENCIL_tObject *ob = pd->tobjects.first; ob; ob = ob->next) {
- bool masked_fb_in_use = false;
-
DRW_stats_group_start("GPencil Object");
- GPU_framebuffer_bind(fbl->gpencil_fb);
- GPU_framebuffer_clear_depth_stencil(fbl->gpencil_fb, ob->is_drawmode3d ? 1.0f : 0.0f, 0x00);
+ GPUFrameBuffer *fb_object = fbl->gpencil_fb;
if (ob->vfx.first) {
/* TODO vfx */
- // GPU_framebuffer_bind(fbl->object_fb);
}
+ GPU_framebuffer_bind(fb_object);
+ GPU_framebuffer_clear_depth_stencil(fb_object, ob->is_drawmode3d ? 1.0f : 0.0f, 0x00);
+
for (GPENCIL_tLayer *layer = ob->layers.first; layer; layer = layer->next) {
if (layer->blend_ps) {
GPU_framebuffer_bind(fbl->layer_fb);
GPU_framebuffer_multi_clear(fbl->layer_fb, clear_cols);
}
- else {
- GPU_framebuffer_bind((layer->is_masked) ? fbl->masked_fb : fbl->gpencil_fb);
- if (layer->is_masked && !masked_fb_in_use) {
+ else if (layer->is_masked) {
+ GPU_framebuffer_bind(fbl->masked_fb);
+ if (layer->do_masked_clear) {
GPU_framebuffer_multi_clear(fbl->masked_fb, clear_cols);
- masked_fb_in_use = layer->is_masked;
}
}
+ else {
+ GPU_framebuffer_bind(fb_object);
+ }
DRW_draw_pass(layer->geom_ps);
if (layer->blend_ps) {
- GPU_framebuffer_bind((layer->is_masked) ? fbl->masked_fb : fbl->gpencil_fb);
- if (layer->is_masked && !masked_fb_in_use) {
- GPU_framebuffer_multi_clear(fbl->masked_fb, clear_cols);
- masked_fb_in_use = layer->is_masked;
+ if (layer->is_masked) {
+ GPU_framebuffer_bind(fbl->masked_fb);
+ if (layer->do_masked_clear) {
+ GPU_framebuffer_multi_clear(fbl->masked_fb, clear_cols);
+ }
+ }
+ else {
+ GPU_framebuffer_bind(fb_object);
}
DRW_draw_pass(layer->blend_ps);
}
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 68160880d05..8ffb1721b0a 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -183,6 +183,7 @@ typedef struct GPENCIL_tLayer {
/** Used to identify which layers are masks and which are masked. */
bool is_mask;
bool is_masked;
+ bool do_masked_clear;
} GPENCIL_tLayer;
typedef struct GPENCIL_tObject {
More information about the Bf-blender-cvs
mailing list