[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