Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2017-05-30 23:28:47 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-05-30 23:30:16 +0300
commite7fb013a60dd91caef1b1dd80f52b3996f06a21c (patch)
treeca9ec934203b7cc5e48f2fbc65b982487be91323
parentff0210319480ac9a77897bed716088a0bc18cd35 (diff)
Draw Manager: Add SceneLayerEngineData and use callbacks to clear runtime engine data
-rw-r--r--source/blender/blenkernel/intern/layer.c10
-rw-r--r--source/blender/blenkernel/intern/object.c10
-rw-r--r--source/blender/blenloader/intern/readfile.c2
-rw-r--r--source/blender/draw/DRW_engine.h2
-rw-r--r--source/blender/draw/intern/DRW_render.h6
-rw-r--r--source/blender/draw/intern/draw_manager.c49
-rw-r--r--source/blender/draw/modes/object_mode.c2
-rw-r--r--source/blender/makesdna/DNA_layer_types.h10
-rw-r--r--source/blender/makesdna/DNA_object_types.h9
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c1
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