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
This commit is contained in:
committed by
Antonio Vazquez
parent
35a545b752
commit
dcf57e34f3
@@ -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);
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user