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

This commit is contained in:
2017-05-30 22:28:47 +02:00
parent ff02103194
commit e7fb013a60
10 changed files with 76 additions and 25 deletions

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -2245,18 +2245,38 @@ 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);
}

View File

@@ -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");

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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