[Bf-blender-cvs] [e7fb013a60d] blender2.8: Draw Manager: Add SceneLayerEngineData and use callbacks to clear runtime engine data

Clément Foucault noreply at git.blender.org
Tue May 30 22:31:45 CEST 2017


Commit: e7fb013a60dd91caef1b1dd80f52b3996f06a21c
Author: Clément Foucault
Date:   Tue May 30 22:28:47 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBe7fb013a60dd91caef1b1dd80f52b3996f06a21c

Draw Manager: Add SceneLayerEngineData and use callbacks to clear runtime engine data

===================================================================

M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/draw/DRW_engine.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/object_mode.c
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesdna/DNA_object_types.h
M	source/blenderplayer/bad_level_call_stubs/stubs.c

===================================================================

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




More information about the Bf-blender-cvs mailing list