[Bf-blender-cvs] [dcf57e34f38] master: GPencil: Fix unreported problem when use Onion Skin in several windows

Antonio Vazquez noreply at git.blender.org
Wed Oct 16 10:33:51 CEST 2019


Commit: dcf57e34f3866bba5ddd9cfdfe858a1a5eedc4c2
Author: Antonio  Vazquez
Date:   Wed Oct 16 10:29:18 2019 +0200
Branches: master
https://developer.blender.org/rBdcf57e34f3866bba5ddd9cfdfe858a1a5eedc4c2

GPencil: Fix unreported problem when use Onion Skin in several windows

The onion skin was nos displayed in secondary screens when disable the Onion switch or the Overlay in the main window.

Added a check to verify if the main overlay and onion switches are enabled in any screen in order to generate the cache data.

This is required to generate the onion skin and limit the times the cache is updated because the cache is generated only in the first screen and if the first screen has the onion disabled the cache for onion skin is not generated. The loop adds time, but always is faster than regenerate the cache all the times.

Reviewed By: mendio, pepeland

Differential Revision: https://developer.blender.org/D6049

===================================================================

M	source/blender/draw/engines/gpencil/gpencil_draw_utils.c
M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/makesrna/intern/rna_space.c

===================================================================

diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
index a13896a2b08..0997568ed22 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c
@@ -140,13 +140,9 @@ static void gpencil_calc_vertex(GPENCIL_StorageList *stl,
 
   Object *ob = cache_ob->ob;
   const DRWContextState *draw_ctx = DRW_context_state_get();
-  const bool main_onion = draw_ctx->v3d != NULL ?
-                              (draw_ctx->v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) :
-                              true;
+  const bool main_onion = stl->storage->is_main_onion;
   const bool playing = stl->storage->is_playing;
-  const bool overlay = draw_ctx->v3d != NULL ?
-                           (bool)((draw_ctx->v3d->flag2 & V3D_HIDE_OVERLAYS) == 0) :
-                           true;
+  const bool overlay = stl->storage->is_main_overlay;
   const bool do_onion = (bool)((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0) && overlay &&
                         main_onion && !playing && gpencil_onion_active(gpd);
 
@@ -1763,8 +1759,8 @@ static void gpencil_shgroups_create(GPENCIL_e_data *e_data,
   const bool overlay = draw_ctx->v3d != NULL ?
                            (bool)((draw_ctx->v3d->flag2 & V3D_HIDE_OVERLAYS) == 0) :
                            true;
-  const bool main_onion = v3d != NULL ? (v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) : true;
-  const bool do_onion = (bool)((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0) && main_onion &&
+  const bool screen_onion = v3d != NULL ? (v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) : true;
+  const bool do_onion = (bool)((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0) && screen_onion &&
                         overlay && gpencil_onion_active(gpd);
 
   int start_stroke = 0;
@@ -2044,13 +2040,9 @@ void gpencil_populate_datablock(GPENCIL_e_data *e_data,
   bGPdata *gpd_eval = (bGPdata *)ob->data;
   bGPdata *gpd = (bGPdata *)DEG_get_original_id(&gpd_eval->id);
 
-  const bool main_onion = draw_ctx->v3d != NULL ?
-                              (draw_ctx->v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) :
-                              true;
+  const bool main_onion = stl->storage->is_main_onion;
   const bool playing = stl->storage->is_playing;
-  const bool overlay = draw_ctx->v3d != NULL ?
-                           (bool)((draw_ctx->v3d->flag2 & V3D_HIDE_OVERLAYS) == 0) :
-                           true;
+  const bool overlay = stl->storage->is_main_overlay;
   const bool do_onion = (bool)((gpd->flag & GP_DATA_STROKE_WEIGHTMODE) == 0) && overlay &&
                         main_onion && !playing && gpencil_onion_active(gpd);
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index aaadf680955..9554e9c0275 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -24,11 +24,13 @@
 
 #include "BKE_gpencil.h"
 #include "BKE_library.h"
+#include "BKE_main.h"
 #include "BKE_object.h"
 #include "BKE_paint.h"
 #include "BKE_shader_fx.h"
 
 #include "DNA_gpencil_types.h"
+#include "DNA_screen_types.h"
 #include "DNA_view3d_types.h"
 
 #include "draw_mode_engines.h"
@@ -305,6 +307,43 @@ static void GPENCIL_engine_free(void)
   GPENCIL_delete_fx_shaders(&e_data);
 }
 
+/* Helper: Check if the main overlay and onion switches are enabled in any screen.
+ *
+ * This is required to generate the onion skin and limit the times the cache is updated because the
+ * cache is generated only in the first screen and if the first screen has the onion disabled the
+ * cache for onion skin is not generated. The loop adds time, but always is faster than regenerate
+ * the cache all the times.
+ */
+static void gpencil_check_screen_switches(const DRWContextState *draw_ctx,
+                                          GPENCIL_StorageList *stl)
+{
+  stl->storage->is_main_overlay = false;
+  stl->storage->is_main_onion = false;
+  /* Check if main onion switch is enabled in any screen. */
+  Main *bmain = CTX_data_main(draw_ctx->evil_C);
+
+  for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
+    for (const ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
+      if (sa && sa->spacetype == SPACE_VIEW3D) {
+        View3D *v3d = sa->spacedata.first;
+        if (v3d == NULL) {
+          continue;
+        }
+        if ((v3d->flag2 & V3D_HIDE_OVERLAYS) == 0) {
+          stl->storage->is_main_overlay = true;
+        }
+        if (v3d->gp_flag & V3D_GP_SHOW_ONION_SKIN) {
+          stl->storage->is_main_onion = true;
+        }
+      }
+      /* If found, don't need loop more. */
+      if ((stl->storage->is_main_overlay) && (stl->storage->is_main_onion)) {
+        return;
+      }
+    }
+  }
+}
+
 void GPENCIL_cache_init(void *vedata)
 {
   GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
@@ -391,10 +430,15 @@ void GPENCIL_cache_init(void *vedata)
         stl->storage->reset_cache = true;
       }
       stl->storage->is_playing = playing;
+
+      /* Found if main overlay and onion switches are enabled in any screen. */
+      gpencil_check_screen_switches(draw_ctx, stl);
     }
     else {
       stl->storage->is_playing = false;
       stl->storage->reset_cache = false;
+      stl->storage->is_main_overlay = false;
+      stl->storage->is_main_onion = false;
     }
     /* save render state */
     stl->storage->is_render = DRW_state_is_image_render();
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 10cab248317..36bc205f41a 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -143,6 +143,8 @@ typedef struct GPENCIL_Storage {
   bool is_playing;
   bool is_render;
   bool is_mat_preview;
+  bool is_main_overlay;
+  bool is_main_onion;
   bool background_ready;
   int is_xray;
   bool is_ontop;
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 01532d8568b..1b2adfd28c6 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -787,13 +787,18 @@ static void rna_Space_view2d_sync_update(Main *UNUSED(bmain),
 
 static void rna_GPencil_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *UNUSED(ptr))
 {
+  bool changed = false;
   /* need set all caches as dirty to recalculate onion skinning */
   for (Object *ob = bmain->objects.first; ob; ob = ob->id.next) {
     if (ob->type == OB_GPENCIL) {
-      DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
+      bGPdata *gpd = (bGPdata *)ob->data;
+      DEG_id_tag_update(&gpd->id, ID_RECALC_GEOMETRY);
+      changed = true;
     }
   }
-  WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
+  if (changed) {
+    WM_main_add_notifier(NC_GPENCIL | NA_EDITED, NULL);
+  }
 }
 
 /* Space 3D View */



More information about the Bf-blender-cvs mailing list