diff options
author | Antonioya <blendergit@gmail.com> | 2019-02-27 21:49:16 +0300 |
---|---|---|
committer | Antonioya <blendergit@gmail.com> | 2019-02-28 19:13:05 +0300 |
commit | 461b1bdfbf0a21edc84ca81d015a12c51b7d1a4d (patch) | |
tree | a8bd25b9c5a666353e1c8ac99ff8da5222bbc5a2 /source | |
parent | 8ca45e929af641aae8b482f7aefd82519052c6bf (diff) |
GPencil: Add selection support for objects using strokes
Now it's possible to select a grease pencil object without using the dummy.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/engines/gpencil/gpencil_engine.c | 71 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 6 |
2 files changed, 70 insertions, 7 deletions
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index 5112ba101a9..a045792ad4d 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -711,16 +711,22 @@ static void gpencil_prepare_fast_drawing( static void gpencil_free_obj_runtime(GPENCIL_StorageList *stl) { + if (stl->g_data->gp_object_cache == NULL) { + return; + } + /* reset all cache flags */ for (int i = 0; i < stl->g_data->gp_cache_used; i++) { tGPencilObjectCache *cache_ob = &stl->g_data->gp_object_cache[i]; - bGPdata *gpd = cache_ob->gpd; - gpd->flag &= ~GP_DATA_CACHE_IS_DIRTY; - - /* free shgrp array */ - cache_ob->tot_layers = 0; - MEM_SAFE_FREE(cache_ob->name); - MEM_SAFE_FREE(cache_ob->shgrp_array); + if (cache_ob) { + bGPdata *gpd = cache_ob->gpd; + gpd->flag &= ~GP_DATA_CACHE_IS_DIRTY; + + /* free shgrp array */ + cache_ob->tot_layers = 0; + MEM_SAFE_FREE(cache_ob->name); + MEM_SAFE_FREE(cache_ob->shgrp_array); + } } /* free the cache itself */ @@ -752,6 +758,47 @@ static void gpencil_draw_pass_range( } +/* draw strokes to use for selection */ +static void drw_gpencil_select_render(GPENCIL_StorageList *stl, GPENCIL_PassList *psl) +{ + tGPencilObjectCache *cache_ob; + tGPencilObjectCache_shgrp *array_elm = NULL; + DRWShadingGroup *init_shgrp = NULL; + DRWShadingGroup *end_shgrp = NULL; + + /* Draw all pending objects */ + if ((stl->g_data->gp_cache_used > 0) && + (stl->g_data->gp_object_cache)) + { + /* sort by zdepth */ + qsort(stl->g_data->gp_object_cache, stl->g_data->gp_cache_used, + sizeof(tGPencilObjectCache), gpencil_object_cache_compare_zdepth); + + for (int i = 0; i < stl->g_data->gp_cache_used; i++) { + cache_ob = &stl->g_data->gp_object_cache[i]; + if (cache_ob) { + bGPdata *gpd = cache_ob->gpd; + init_shgrp = NULL; + if (cache_ob->tot_layers > 0) { + for (int e = 0; e < cache_ob->tot_layers; e++) { + array_elm = &cache_ob->shgrp_array[e]; + if (init_shgrp == NULL) { + init_shgrp = array_elm->init_shgrp; + } + end_shgrp = array_elm->end_shgrp; + } + /* draw group */ + DRW_draw_pass_subset( + GPENCIL_3D_DRAWMODE(gpd) ? psl->stroke_pass_3d : psl->stroke_pass_2d, + init_shgrp, end_shgrp); + } + /* the cache must be dirty for next loop */ + gpd->flag |= GP_DATA_CACHE_IS_DIRTY; + } + } + } +} + /* draw scene */ void GPENCIL_draw_scene(void *ved) { @@ -778,6 +825,16 @@ void GPENCIL_draw_scene(void *ved) bGPdata *gpd_act = (obact) && (obact->type == OB_GPENCIL) ? (bGPdata *)obact->data : NULL; const bool is_edit = GPENCIL_ANY_EDIT_MODE(gpd_act); + /* if the draw is for select, do a basic drawing and return */ + if (DRW_state_is_select()) { + + drw_gpencil_select_render(stl, psl); + /* free memory */ + gpencil_free_obj_runtime(stl); + + return; + } + /* paper pass to display a comfortable area to draw over complex scenes with geometry */ if ((!is_render) && (obact) && (obact->type == OB_GPENCIL)) { if (((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0) && diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 82e371b8147..e07ab26d122 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2087,11 +2087,17 @@ void DRW_draw_select_loop( drw_engines_enable_from_mode(obedit_mode); } else if (!draw_surface) { + /* grease pencil selection */ + use_drw_engine(&draw_engine_gpencil_type); + drw_engines_enable_from_overlays(v3d->overlay.flag); drw_engines_enable_from_object_mode(); } else { drw_engines_enable_basic(); + /* grease pencil selection */ + use_drw_engine(&draw_engine_gpencil_type); + drw_engines_enable_from_overlays(v3d->overlay.flag); drw_engines_enable_from_object_mode(); } |