diff options
author | Antonioya <blendergit@gmail.com> | 2019-02-27 10:32:55 +0300 |
---|---|---|
committer | Antonioya <blendergit@gmail.com> | 2019-02-27 10:32:55 +0300 |
commit | 7618851f74d183dcf9d5f984ff128f82daaf27ff (patch) | |
tree | 1531e14da07965a65132c141fb423ce956ec006f /source/blender/draw | |
parent | 80ef7fbeb15f388097e2f778d41f7280e77779cf (diff) |
GP: Optimize Instances drawing loop
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/engines/gpencil/gpencil_draw_utils.c | 16 | ||||
-rw-r--r-- | source/blender/draw/engines/gpencil/gpencil_engine.c | 17 | ||||
-rw-r--r-- | source/blender/draw/engines/gpencil/gpencil_engine.h | 2 |
3 files changed, 16 insertions, 19 deletions
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c index cbd50c848b9..3479f278fba 100644 --- a/source/blender/draw/engines/gpencil/gpencil_draw_utils.c +++ b/source/blender/draw/engines/gpencil/gpencil_draw_utils.c @@ -1780,18 +1780,24 @@ void DRW_gpencil_populate_datablock( cache->is_dirty = false; } -void DRW_gpencil_populate_particles(GPENCIL_e_data *e_data, void *vedata) +void DRW_gpencil_populate_particles(GPENCIL_e_data *e_data, GHash *gh_objects, void *vedata) { GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl; /* add particles */ for (int i = 0; i < stl->g_data->gp_cache_used; i++) { tGPencilObjectCache *cache_ob = &stl->g_data->gp_object_cache[i]; - Object *ob = cache_ob->ob; if (cache_ob->is_dup_ob) { - GpencilBatchCache *cache = ob->runtime.gpencil_cache; - if (cache != NULL) { - DRW_gpencil_shgroups_create(e_data, vedata, ob, cache, cache_ob); + /* reasign duplicate objects because memory for particles is not available + * and need to use the original datablock and runtime data */ + Object *ob = (Object *)BLI_ghash_lookup(gh_objects, cache_ob->name); + if (ob) { + cache_ob->ob = ob; + cache_ob->gpd = (bGPdata *)ob->data; + GpencilBatchCache *cache = ob->runtime.gpencil_cache; + if (cache != NULL) { + DRW_gpencil_shgroups_create(e_data, vedata, ob, cache, cache_ob); + } } } } diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c index b062094de30..6df1ae4b873 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.c +++ b/source/blender/draw/engines/gpencil/gpencil_engine.c @@ -651,21 +651,12 @@ void GPENCIL_cache_finish(void *vedata) BLI_ghash_insert(gh_objects, ob->id.name, cache_ob->ob); } } - /* reasign duplicate objects because memory for particles is not available - * and need to use the original datablock and runtime data */ - for (int i = 0; i < stl->g_data->gp_cache_used; i++) { - cache_ob = &stl->g_data->gp_object_cache[i]; - if (cache_ob->is_dup_ob) { - Object *ob_orig = (Object *)BLI_ghash_lookup(gh_objects, cache_ob->name); - cache_ob->ob = ob_orig; - cache_ob->gpd = (bGPdata *)ob_orig->data; - } - } - - BLI_ghash_free(gh_objects, NULL, NULL); /* draw particles */ - DRW_gpencil_populate_particles(&e_data, vedata); + DRW_gpencil_populate_particles(&e_data, gh_objects, vedata); + + /* free hash */ + BLI_ghash_free(gh_objects, NULL, NULL); if (stl->g_data->session_flag & (GP_DRW_PAINT_IDLE | GP_DRW_PAINT_FILLING)) { stl->storage->framebuffer_flag |= GP_FRAMEBUFFER_DRAW; diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h index 48f4dbaf87e..7032c816c5f 100644 --- a/source/blender/draw/engines/gpencil/gpencil_engine.h +++ b/source/blender/draw/engines/gpencil/gpencil_engine.h @@ -387,7 +387,7 @@ void DRW_gpencil_populate_multiedit( struct GPENCIL_e_data *e_data, void *vedata, struct Object *ob, struct tGPencilObjectCache *cache_ob); void DRW_gpencil_triangulate_stroke_fill(struct Object *ob, struct bGPDstroke *gps); -void DRW_gpencil_populate_particles(struct GPENCIL_e_data *e_data, void *vedata); +void DRW_gpencil_populate_particles(struct GPENCIL_e_data *e_data, struct GHash *gh_objects, void *vedata); void DRW_gpencil_multisample_ensure(struct GPENCIL_Data *vedata, int rect_w, int rect_h); |