Draw Manager: Add SceneLayerEngineData and use callbacks to clear runtime engine data
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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");
|
||||
|
@@ -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 {
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user