diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-05-30 23:28:47 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-05-30 23:30:16 +0300 |
commit | e7fb013a60dd91caef1b1dd80f52b3996f06a21c (patch) | |
tree | ca9ec934203b7cc5e48f2fbc65b982487be91323 /source | |
parent | ff0210319480ac9a77897bed716088a0bc18cd35 (diff) |
Draw Manager: Add SceneLayerEngineData and use callbacks to clear runtime engine data
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 10 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object.c | 10 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 2 | ||||
-rw-r--r-- | source/blender/draw/DRW_engine.h | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 6 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 49 | ||||
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_layer_types.h | 10 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_object_types.h | 9 | ||||
-rw-r--r-- | source/blenderplayer/bad_level_call_stubs/stubs.c | 1 |
10 files changed, 76 insertions, 25 deletions
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index c0211c53021..d2fa09fa9e9 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -176,6 +176,16 @@ void BKE_scene_layer_free(SceneLayer *sl) MEM_freeN(sl->properties_evaluated); } + for (SceneLayerEngineData *sled = sl->drawdata.first; sled; sled = sled->next) { + if (sled->storage) { + if (sled->free) { + sled->free(sled->storage); + } + MEM_freeN(sled->storage); + } + } + BLI_freelistN(&sl->drawdata); + MEM_SAFE_FREE(sl->stats); } diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index dd23b61f148..c24a6d3c791 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -454,7 +454,15 @@ void BKE_object_free(Object *ob) } GPU_lamp_free(ob); - DRW_object_engine_data_free(ob); + for (ObjectEngineData *oed = ob->drawdata.first; oed; oed = oed->next) { + if (oed->storage) { + if (oed->free) { + oed->free(oed->storage); + } + MEM_freeN(oed->storage); + } + } + BLI_freelistN(&ob->drawdata); BKE_sculptsession_free(ob); diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 2b27148a3a8..d22af275469 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -6265,6 +6265,8 @@ static void direct_link_scene(FileData *fd, Scene *sce) } sl->properties_evaluated = NULL; + + BLI_listbase_clear(&sl->drawdata); } sce->collection_properties = newdataadr(fd, sce->collection_properties); diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index c5cf029febb..0aca41a970d 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -80,8 +80,6 @@ void DRW_draw_depth_loop( struct Depsgraph *graph, struct ARegion *ar, struct View3D *v3d); -void DRW_object_engine_data_free(struct Object *ob); - /* This is here because GPUViewport needs it */ void DRW_pass_free(struct DRWPass *pass); diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 695027c5de6..7285b3c3311 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -320,8 +320,12 @@ bool DRW_viewport_is_persp_get(void); struct DefaultFramebufferList *DRW_viewport_framebuffer_list_get(void); struct DefaultTextureList *DRW_viewport_texture_list_get(void); +/* SceneLayers */ +void **DRW_scene_layer_engine_data_get(DrawEngineType *engine_type, void (*callback)(void *storage)); + /* Objects */ -void **DRW_object_engine_data_get(Object *ob, DrawEngineType *det); +void **DRW_object_engine_data_get( + Object *ob, DrawEngineType *engine_type, void (*callback)(void *storage)); struct LampEngineData *DRW_lamp_engine_data_get(Object *ob, struct RenderEngineType *engine_type); void DRW_lamp_engine_data_free(struct LampEngineData *led); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index cc2ad3e3017..cf882717f8a 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2246,17 +2246,37 @@ DefaultTextureList *DRW_viewport_texture_list_get(void) /* -------------------------------------------------------------------- */ +/** \name SceneLayers (DRW_scenelayer) + * \{ */ + +void **DRW_scene_layer_engine_data_get(DrawEngineType *engine_type, void (*callback)(void *storage)) +{ + SceneLayerEngineData *sled; + + for (sled = DST.draw_ctx.sl->drawdata.first; sled; sled = sled->next) { + if (sled->engine_type == engine_type) { + return &sled->storage; + } + } + + sled = MEM_callocN(sizeof(SceneLayerEngineData), "SceneLayerEngineData"); + sled->engine_type = engine_type; + sled->free = callback; + BLI_addtail(&DST.draw_ctx.sl->drawdata, sled); + + return &sled->storage; +} + +/** \} */ + + +/* -------------------------------------------------------------------- */ /** \name Objects (DRW_object) * \{ */ -typedef struct ObjectEngineData { - struct ObjectEngineData *next, *prev; - DrawEngineType *engine_type; - void *storage; -} ObjectEngineData; - -void **DRW_object_engine_data_get(Object *ob, DrawEngineType *engine_type) +void **DRW_object_engine_data_get( + Object *ob, DrawEngineType *engine_type, void (*callback)(void *storage)) { ObjectEngineData *oed; @@ -2268,22 +2288,14 @@ void **DRW_object_engine_data_get(Object *ob, DrawEngineType *engine_type) oed = MEM_callocN(sizeof(ObjectEngineData), "ObjectEngineData"); oed->engine_type = engine_type; + oed->free = callback; BLI_addtail(&ob->drawdata, oed); return &oed->storage; } -void DRW_object_engine_data_free(Object *ob) -{ - for (ObjectEngineData *oed = ob->drawdata.first; oed; oed = oed->next) { - if (oed->storage) { - MEM_freeN(oed->storage); - } - } - - BLI_freelistN(&ob->drawdata); -} - +/* XXX There is definitly some overlap between this and DRW_object_engine_data_get. + * We should get rid of one of the two. */ LampEngineData *DRW_lamp_engine_data_get(Object *ob, RenderEngineType *engine_type) { BLI_assert(ob->type == OB_LAMP); @@ -2291,6 +2303,7 @@ LampEngineData *DRW_lamp_engine_data_get(Object *ob, RenderEngineType *engine_ty Scene *scene = DST.draw_ctx.scene; /* TODO Dupliobjects */ + /* TODO Should be per scenelayer */ return GPU_lamp_engine_data_get(scene, ob, NULL, engine_type); } diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 59debb09298..205a0c16613 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -1071,7 +1071,7 @@ static void DRW_shgroup_lamp(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl int theme_id = DRW_object_wire_theme_get(ob, sl, &color); static float zero = 0.0f; - float **la_mats = (float **)DRW_object_engine_data_get(ob, &draw_engine_object_type); + float **la_mats = (float **)DRW_object_engine_data_get(ob, &draw_engine_object_type, NULL); if (*la_mats == NULL) { /* we need 2 matrices */ *la_mats = MEM_mallocN(sizeof(float) * 16 * 2, "Lamp Object Mode Matrices"); diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h index 6b4c19d2977..1e6657ae29c 100644 --- a/source/blender/makesdna/DNA_layer_types.h +++ b/source/blender/makesdna/DNA_layer_types.h @@ -52,6 +52,13 @@ typedef struct CollectionOverride { /* TODO proper data */ } CollectionOverride; +typedef struct SceneLayerEngineData { + struct SceneLayerEngineData *next, *prev; + struct DrawEngineType *engine_type; + void *storage; + void (*free)(void *storage); +} SceneLayerEngineData; + typedef struct LayerCollection { struct LayerCollection *next, *prev; struct SceneCollection *scene_collection; @@ -79,6 +86,9 @@ typedef struct SceneLayer { ListBase layer_collections; /* LayerCollection */ struct IDProperty *properties; /* overrides */ struct IDProperty *properties_evaluated; + + /* Runtime data */ + ListBase drawdata; /* SceneLayerEngineData */ } SceneLayer; typedef struct SceneCollection { diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h index ba42f403a30..72a21437b7d 100644 --- a/source/blender/makesdna/DNA_object_types.h +++ b/source/blender/makesdna/DNA_object_types.h @@ -72,6 +72,13 @@ typedef struct bFaceMap { char name[64]; /* MAX_VGROUP_NAME */ } bFaceMap; +/* Object Runtime display data */ +typedef struct ObjectEngineData { + struct ObjectEngineData *next, *prev; + struct DrawEngineType *engine_type; + void *storage; + void (*free)(void *storage); +} ObjectEngineData; #define MAX_VGROUP_NAME 64 @@ -316,7 +323,7 @@ typedef struct Object { struct IDProperty *base_collection_properties; /* used by depsgraph, flushed from base */ - ListBase drawdata; /* runtime, for draw engine datas */ + ListBase drawdata; /* runtime, ObjectEngineData */ int base_selection_color; /* flushed by depsgraph only */ int pad3[3]; } Object; diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 08aff2bc42e..d06777e792c 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -717,7 +717,6 @@ void EDIT_MESH_collection_settings_create(struct IDProperty *properties) RET_NON void EDIT_ARMATURE_collection_settings_create(struct IDProperty *properties) RET_NONE void PAINT_WEIGHT_collection_settings_create(struct IDProperty *properties) RET_NONE void PAINT_VERTEX_collection_settings_create(struct IDProperty *properties) RET_NONE -void DRW_object_engine_data_free(struct Object *ob) RET_NONE /* python */ struct wmOperatorType *WM_operatortype_find(const char *idname, bool quiet) RET_NULL |