diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-03-26 21:13:34 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-03-27 15:01:47 +0300 |
commit | deda6a43fc710f30ceb9e3b30d1f8d79180fe8d1 (patch) | |
tree | cbe8c10668a697b47e5cbc219fef05ce24bceb60 /source/blender/draw | |
parent | 7ee41920fa0b7ed51a03fe4ee15c6fd782d294a8 (diff) |
Draw Engines: Make g_data struct part of the viewport storage
This makes viewport cache construction independant from each others and will allow multithread down the road.
Diffstat (limited to 'source/blender/draw')
18 files changed, 364 insertions, 359 deletions
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c index 750e6f4ebfe..9f46556b7c2 100644 --- a/source/blender/draw/engines/clay/clay.c +++ b/source/blender/draw/engines/clay/clay.c @@ -76,6 +76,7 @@ typedef struct CLAY_Storage { typedef struct CLAY_StorageList { struct CLAY_Storage *storage; struct GPUUniformBuffer *mat_ubo; + struct g_data *g_data; } CLAY_StorageList; /* keep it under MAX_BUFFERS */ @@ -100,6 +101,7 @@ typedef struct CLAY_PassList { struct DRWPass *depth_pass; struct DRWPass *depth_pass_cull; struct DRWPass *clay_pass; + struct g_data *g_data; } CLAY_PassList; typedef struct CLAY_Data { @@ -134,15 +136,14 @@ static struct { int ubo_mat_idxs[MAX_CLAY_MAT]; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { DRWShadingGroup *depth_shgrp; DRWShadingGroup *depth_shgrp_select; DRWShadingGroup *depth_shgrp_active; DRWShadingGroup *depth_shgrp_cull; DRWShadingGroup *depth_shgrp_cull_select; DRWShadingGroup *depth_shgrp_cull_active; - CLAY_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* Functions */ @@ -604,13 +605,18 @@ static void CLAY_cache_init(void *vedata) CLAY_PassList *psl = ((CLAY_Data *)vedata)->psl; CLAY_StorageList *stl = ((CLAY_Data *)vedata)->stl; + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } + /* Depth Pass */ { psl->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); - g_data.depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); + stl->g_data->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); psl->depth_pass_cull = DRW_pass_create("Depth Pass Cull", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK); - g_data.depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); + stl->g_data->depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); } /* Clay Pass */ @@ -640,7 +646,7 @@ static void CLAY_cache_populate(void *vedata, Object *ob) geom = DRW_cache_surface_get(ob); /* Depth Prepass */ - DRW_shgroup_call_add((do_cull) ? g_data.depth_shgrp_cull : g_data.depth_shgrp, geom, ob->obmat); + DRW_shgroup_call_add((do_cull) ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp, geom, ob->obmat); /* Shading */ clay_shgrp = CLAY_object_shgrp_get(vedata, ob, stl, psl); diff --git a/source/blender/draw/engines/eevee/eevee.c b/source/blender/draw/engines/eevee/eevee.c index bb17a6b46b0..eceb72279f6 100644 --- a/source/blender/draw/engines/eevee/eevee.c +++ b/source/blender/draw/engines/eevee/eevee.c @@ -37,17 +37,6 @@ static struct { struct GPUShader *tonemap; } e_data = {NULL}; /* Engine data */ -static struct { - DRWShadingGroup *default_lit_grp; - DRWShadingGroup *depth_shgrp; - DRWShadingGroup *depth_shgrp_select; - DRWShadingGroup *depth_shgrp_active; - DRWShadingGroup *depth_shgrp_cull; - DRWShadingGroup *depth_shgrp_cull_select; - DRWShadingGroup *depth_shgrp_cull_active; - EEVEE_Data *vedata; -} g_data = {NULL}; /* Transient data */ - extern char datatoc_lit_surface_frag_glsl[]; extern char datatoc_lit_surface_vert_glsl[]; extern char datatoc_tonemap_frag_glsl[]; @@ -91,33 +80,38 @@ static void EEVEE_cache_init(void *vedata) EEVEE_TextureList *txl = ((EEVEE_Data *)vedata)->txl; EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } + { psl->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); - g_data.depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); + stl->g_data->depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); - g_data.depth_shgrp_select = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); - DRW_shgroup_state_set(g_data.depth_shgrp_select, DRW_STATE_WRITE_STENCIL_SELECT); + stl->g_data->depth_shgrp_select = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); + DRW_shgroup_state_set(stl->g_data->depth_shgrp_select, DRW_STATE_WRITE_STENCIL_SELECT); - g_data.depth_shgrp_active = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); - DRW_shgroup_state_set(g_data.depth_shgrp_active, DRW_STATE_WRITE_STENCIL_ACTIVE); + stl->g_data->depth_shgrp_active = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); + DRW_shgroup_state_set(stl->g_data->depth_shgrp_active, DRW_STATE_WRITE_STENCIL_ACTIVE); psl->depth_pass_cull = DRW_pass_create("Depth Pass Cull", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK); - g_data.depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); + stl->g_data->depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); - g_data.depth_shgrp_cull_select = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); - DRW_shgroup_state_set(g_data.depth_shgrp_cull_select, DRW_STATE_WRITE_STENCIL_SELECT); + stl->g_data->depth_shgrp_cull_select = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); + DRW_shgroup_state_set(stl->g_data->depth_shgrp_cull_select, DRW_STATE_WRITE_STENCIL_SELECT); - g_data.depth_shgrp_cull_active = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); - DRW_shgroup_state_set(g_data.depth_shgrp_cull_active, DRW_STATE_WRITE_STENCIL_ACTIVE); + stl->g_data->depth_shgrp_cull_active = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); + DRW_shgroup_state_set(stl->g_data->depth_shgrp_cull_active, DRW_STATE_WRITE_STENCIL_ACTIVE); } { DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_EQUAL; psl->pass = DRW_pass_create("Default Light Pass", state); - g_data.default_lit_grp = DRW_shgroup_create(e_data.default_lit, psl->pass); - DRW_shgroup_uniform_block(g_data.default_lit_grp, "light_block", stl->lights_ubo, 0); - DRW_shgroup_uniform_int(g_data.default_lit_grp, "light_count", &stl->lights_info->light_count, 1); + stl->g_data->default_lit_grp = DRW_shgroup_create(e_data.default_lit, psl->pass); + DRW_shgroup_uniform_block(stl->g_data->default_lit_grp, "light_block", stl->lights_ubo, 0); + DRW_shgroup_uniform_int(stl->g_data->default_lit_grp, "light_count", &stl->lights_info->light_count, 1); } { @@ -149,11 +143,11 @@ static void EEVEE_cache_populate(void *vedata, Object *ob) // if ((ob->base_flag & BASE_ACTIVE) != 0) // DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull_active : depth_shgrp_active, geom, ob->obmat); if ((ob->base_flag & BASE_SELECTED) != 0) - DRW_shgroup_call_add((do_cull) ? g_data.depth_shgrp_cull_select : g_data.depth_shgrp_select, geom, ob->obmat); + DRW_shgroup_call_add((do_cull) ? stl->g_data->depth_shgrp_cull_select : stl->g_data->depth_shgrp_select, geom, ob->obmat); else - DRW_shgroup_call_add((do_cull) ? g_data.depth_shgrp_cull : g_data.depth_shgrp, geom, ob->obmat); + DRW_shgroup_call_add((do_cull) ? stl->g_data->depth_shgrp_cull : stl->g_data->depth_shgrp, geom, ob->obmat); - DRW_shgroup_call_add(g_data.default_lit_grp, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->default_lit_grp, geom, ob->obmat); } else if (ob->type == OB_LAMP) { EEVEE_lights_cache_add(stl, ob); diff --git a/source/blender/draw/engines/eevee/eevee_lights.c b/source/blender/draw/engines/eevee/eevee_lights.c index b3459901616..c0359cdd042 100644 --- a/source/blender/draw/engines/eevee/eevee_lights.c +++ b/source/blender/draw/engines/eevee/eevee_lights.c @@ -35,9 +35,6 @@ typedef struct EEVEE_Light { float spot_size, spot_blend, area_x, area_y; } EEVEE_Light; -static struct { - ListBase lamps; /* Lamps gathered during cache iteration */ -} g_data = {NULL}; /* Transient data */ void EEVEE_lights_init(EEVEE_StorageList *stl) { @@ -49,13 +46,13 @@ void EEVEE_lights_init(EEVEE_StorageList *stl) void EEVEE_lights_cache_init(EEVEE_StorageList *stl) { - BLI_listbase_clear(&g_data.lamps); + BLI_listbase_clear(&stl->g_data->lamps); stl->lights_info->light_count = 0; } void EEVEE_lights_cache_add(EEVEE_StorageList *stl, Object *ob) { - BLI_addtail(&g_data.lamps, BLI_genericNodeN(ob)); + BLI_addtail(&stl->g_data->lamps, BLI_genericNodeN(ob)); stl->lights_info->light_count += 1; } @@ -70,12 +67,12 @@ void EEVEE_lights_cache_finish(EEVEE_StorageList *stl) if (light_ct > 0) { int i = 0; - for (LinkData *link = g_data.lamps.first; link && i < MAX_LIGHT; link = link->next, i++) { + for (LinkData *link = stl->g_data->lamps.first; link && i < MAX_LIGHT; link = link->next, i++) { Object *ob = (Object *)link->data; stl->lights_ref[i] = ob; } } - BLI_freelistN(&g_data.lamps); + BLI_freelistN(&stl->g_data->lamps); /* We changed light data so we need to upload it */ EEVEE_lights_update(stl); diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h index 4d8f697cc64..b81731a9188 100644 --- a/source/blender/draw/engines/eevee/eevee_private.h +++ b/source/blender/draw/engines/eevee/eevee_private.h @@ -50,6 +50,7 @@ typedef struct EEVEE_StorageList { struct EEVEE_Light *lights_data; /* Array, Packed lights data info, duplication of what is in the Uniform Buffer in Vram */ struct Object **lights_ref; /* List of all lights in the buffer. */ struct GPUUniformBuffer *lights_ubo; + struct g_data *g_data; } EEVEE_StorageList; typedef struct EEVEE_LightsInfo { @@ -64,6 +65,18 @@ typedef struct EEVEE_Data { EEVEE_StorageList *stl; } EEVEE_Data; +typedef struct g_data{ + struct DRWShadingGroup *default_lit_grp; + struct DRWShadingGroup *depth_shgrp; + struct DRWShadingGroup *depth_shgrp_select; + struct DRWShadingGroup *depth_shgrp_active; + struct DRWShadingGroup *depth_shgrp_cull; + struct DRWShadingGroup *depth_shgrp_cull_select; + struct DRWShadingGroup *depth_shgrp_cull_active; + + struct ListBase lamps; /* Lamps gathered during cache iteration */ +} g_data; /* Transient data */ + /* eevee_lights.c */ void EEVEE_lights_init(EEVEE_StorageList *stl); void EEVEE_lights_cache_init(EEVEE_StorageList *stl); diff --git a/source/blender/draw/modes/edit_armature_mode.c b/source/blender/draw/modes/edit_armature_mode.c index a04ae608ce7..5361bd1c89f 100644 --- a/source/blender/draw/modes/edit_armature_mode.c +++ b/source/blender/draw/modes/edit_armature_mode.c @@ -42,6 +42,11 @@ typedef struct EDIT_ARMATURE_PassList { struct DRWPass *relationship; } EDIT_ARMATURE_PassList; +/* keep it under MAX_STORAGE */ +typedef struct EDIT_ARMATURE_StorageList { + struct g_data *g_data; +} EDIT_ARMATURE_StorageList; + typedef struct EDIT_ARMATURE_Data { char engine_name[32]; void *fbl; @@ -52,17 +57,21 @@ typedef struct EDIT_ARMATURE_Data { /* *********** STATIC *********** */ -static struct { +typedef struct g_data { DRWShadingGroup *relationship_lines; - EDIT_ARMATURE_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ static void EDIT_ARMATURE_cache_init(void *vedata) { - EDIT_ARMATURE_PassList *psl = ((EDIT_ARMATURE_Data *)vedata)->psl; + EDIT_ARMATURE_StorageList *stl = ((EDIT_ARMATURE_Data *)vedata)->stl; + + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Solid bones */ @@ -82,8 +91,8 @@ static void EDIT_ARMATURE_cache_init(void *vedata) psl->relationship = DRW_pass_create("Bone Relationship Pass", state); /* Relationship Lines */ - g_data.relationship_lines = shgroup_dynlines_uniform_color(psl->relationship, ts.colorWire); - DRW_shgroup_state_set(g_data.relationship_lines, DRW_STATE_STIPPLE_3); + stl->g_data->relationship_lines = shgroup_dynlines_uniform_color(psl->relationship, ts.colorWire); + DRW_shgroup_state_set(stl->g_data->relationship_lines, DRW_STATE_STIPPLE_3); } } @@ -91,10 +100,11 @@ static void EDIT_ARMATURE_cache_populate(void *vedata, Object *ob) { bArmature *arm = ob->data; EDIT_ARMATURE_PassList *psl = ((EDIT_ARMATURE_Data *)vedata)->psl; + EDIT_ARMATURE_StorageList *stl = ((EDIT_ARMATURE_Data *)vedata)->stl; if (ob->type == OB_ARMATURE) { if (arm->edbo) { - DRW_shgroup_armature_edit(ob, psl->bone_solid, psl->bone_wire, g_data.relationship_lines); + DRW_shgroup_armature_edit(ob, psl->bone_solid, psl->bone_wire, stl->g_data->relationship_lines); } } } diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c index 46030554fb6..f8010fbd570 100644 --- a/source/blender/draw/modes/edit_curve_mode.c +++ b/source/blender/draw/modes/edit_curve_mode.c @@ -76,6 +76,7 @@ typedef struct EDIT_CURVE_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } EDIT_CURVE_StorageList; typedef struct EDIT_CURVE_Data { @@ -99,16 +100,13 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - EDIT_CURVE_Data *vedata; +typedef struct g_data { + /* This keeps the references of the shading groups for * easy access in EDIT_CURVE_cache_populate() */ DRWShadingGroup *group; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -117,7 +115,6 @@ static struct { * (Optional) */ static void EDIT_CURVE_engine_init(void *vedata) { - EDIT_CURVE_TextureList *txl = ((EDIT_CURVE_Data *)vedata)->txl; EDIT_CURVE_FramebufferList *fbl = ((EDIT_CURVE_Data *)vedata)->fbl; EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl; @@ -148,11 +145,13 @@ static void EDIT_CURVE_engine_init(void *vedata) * Assume that all Passes are NULL */ static void EDIT_CURVE_cache_init(void *vedata) { - EDIT_CURVE_PassList *psl = ((EDIT_CURVE_Data *)vedata)->psl; EDIT_CURVE_StorageList *stl = ((EDIT_CURVE_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -161,16 +160,16 @@ static void EDIT_CURVE_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.2f, 0.5f, 0.3f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -188,7 +187,7 @@ static void EDIT_CURVE_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c index 32862ca444c..27ea05650cb 100644 --- a/source/blender/draw/modes/edit_lattice_mode.c +++ b/source/blender/draw/modes/edit_lattice_mode.c @@ -76,6 +76,7 @@ typedef struct EDIT_LATTICE_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } EDIT_LATTICE_StorageList; typedef struct EDIT_LATTICE_Data { @@ -99,16 +100,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in EDIT_LATTICE_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - EDIT_LATTICE_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -117,7 +113,6 @@ static struct { * (Optional) */ static void EDIT_LATTICE_engine_init(void *vedata) { - EDIT_LATTICE_TextureList *txl = ((EDIT_LATTICE_Data *)vedata)->txl; EDIT_LATTICE_FramebufferList *fbl = ((EDIT_LATTICE_Data *)vedata)->fbl; EDIT_LATTICE_StorageList *stl = ((EDIT_LATTICE_Data *)vedata)->stl; @@ -148,11 +143,13 @@ static void EDIT_LATTICE_engine_init(void *vedata) * Assume that all Passes are NULL */ static void EDIT_LATTICE_cache_init(void *vedata) { - EDIT_LATTICE_PassList *psl = ((EDIT_LATTICE_Data *)vedata)->psl; EDIT_LATTICE_StorageList *stl = ((EDIT_LATTICE_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -161,16 +158,16 @@ static void EDIT_LATTICE_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {1.0f, 0.0f, 0.0f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -188,7 +185,7 @@ static void EDIT_LATTICE_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c index b17d6288d05..084e0eb89b7 100644 --- a/source/blender/draw/modes/edit_mesh_mode.c +++ b/source/blender/draw/modes/edit_mesh_mode.c @@ -75,6 +75,11 @@ typedef struct EDIT_MESH_TextureList { struct GPUTexture *occlude_wire_color_tx; } EDIT_MESH_TextureList; +/* keep it under MAX_STORAGE */ +typedef struct EDIT_MESH_StorageList { + struct g_data *g_data; +} EDIT_MESH_StorageList; + typedef struct EDIT_MESH_Data { char engine_name[32]; EDIT_MESH_FramebufferList *fbl; @@ -101,7 +106,7 @@ static struct { struct GPUShader *depth_sh; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { DRWShadingGroup *depth_shgrp_hidden_wire; DRWShadingGroup *fnormals_shgrp; @@ -119,15 +124,13 @@ static struct { DRWShadingGroup *facedot_occluded_shgrp; DRWShadingGroup *facefill_occluded_shgrp; - EDIT_MESH_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ static void EDIT_MESH_engine_init(void *vedata) { - EDIT_MESH_Data *ved = DRW_viewport_engine_data_get("EditMeshMode"); - EDIT_MESH_TextureList *txl = ved->txl; + EDIT_MESH_TextureList *txl = ((EDIT_MESH_Data *)vedata)->txl; EDIT_MESH_FramebufferList *fbl = ((EDIT_MESH_Data *)vedata)->fbl; float *viewport_size = DRW_viewport_size_get(); @@ -263,9 +266,9 @@ static float size_normal; static void EDIT_MESH_cache_init(void *vedata) { - EDIT_MESH_TextureList *txl = ((EDIT_MESH_Data *)vedata)->txl; EDIT_MESH_PassList *psl = ((EDIT_MESH_Data *)vedata)->psl; + EDIT_MESH_StorageList *stl = ((EDIT_MESH_Data *)vedata)->stl; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); const struct bContext *C = DRW_get_context(); @@ -274,44 +277,49 @@ static void EDIT_MESH_cache_init(void *vedata) bool do_zbufclip = ((v3d->flag & V3D_ZBUF_SELECT) == 0); static float zero = 0.0f; - + + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } + { /* Complementary Depth Pass */ psl->depth_hidden_wire = DRW_pass_create("Depth Pass Hidden Wire", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK); - g_data.depth_shgrp_hidden_wire = DRW_shgroup_create(e_data.depth_sh, psl->depth_hidden_wire); + stl->g_data->depth_shgrp_hidden_wire = DRW_shgroup_create(e_data.depth_sh, psl->depth_hidden_wire); } { /* Normals */ psl->normals = DRW_pass_create("Edit Mesh Normals Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS); - g_data.fnormals_shgrp = DRW_shgroup_create(e_data.normals_face_sh, psl->normals); - DRW_shgroup_uniform_float(g_data.fnormals_shgrp, "normalSize", &size_normal, 1); - DRW_shgroup_uniform_vec4(g_data.fnormals_shgrp, "color", ts.colorNormal, 1); + stl->g_data->fnormals_shgrp = DRW_shgroup_create(e_data.normals_face_sh, psl->normals); + DRW_shgroup_uniform_float(stl->g_data->fnormals_shgrp, "normalSize", &size_normal, 1); + DRW_shgroup_uniform_vec4(stl->g_data->fnormals_shgrp, "color", ts.colorNormal, 1); - g_data.vnormals_shgrp = DRW_shgroup_create(e_data.normals_sh, psl->normals); - DRW_shgroup_uniform_float(g_data.vnormals_shgrp, "normalSize", &size_normal, 1); - DRW_shgroup_uniform_vec4(g_data.vnormals_shgrp, "color", ts.colorVNormal, 1); + stl->g_data->vnormals_shgrp = DRW_shgroup_create(e_data.normals_sh, psl->normals); + DRW_shgroup_uniform_float(stl->g_data->vnormals_shgrp, "normalSize", &size_normal, 1); + DRW_shgroup_uniform_vec4(stl->g_data->vnormals_shgrp, "color", ts.colorVNormal, 1); - g_data.lnormals_shgrp = DRW_shgroup_create(e_data.normals_sh, psl->normals); - DRW_shgroup_uniform_float(g_data.lnormals_shgrp, "normalSize", &size_normal, 1); - DRW_shgroup_uniform_vec4(g_data.lnormals_shgrp, "color", ts.colorLNormal, 1); + stl->g_data->lnormals_shgrp = DRW_shgroup_create(e_data.normals_sh, psl->normals); + DRW_shgroup_uniform_float(stl->g_data->lnormals_shgrp, "normalSize", &size_normal, 1); + DRW_shgroup_uniform_vec4(stl->g_data->lnormals_shgrp, "color", ts.colorLNormal, 1); } if (!do_zbufclip) { - psl->edit_face_overlay = edit_mesh_create_overlay_pass(&g_data.face_overlay_shgrp, &g_data.ledges_overlay_shgrp, &g_data.lverts_overlay_shgrp, - &g_data.facedot_overlay_shgrp, &face_mod, DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_DEPTH | DRW_STATE_BLEND); + psl->edit_face_overlay = edit_mesh_create_overlay_pass(&stl->g_data->face_overlay_shgrp, &stl->g_data->ledges_overlay_shgrp, &stl->g_data->lverts_overlay_shgrp, + &stl->g_data->facedot_overlay_shgrp, &face_mod, DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_DEPTH | DRW_STATE_BLEND); } else { /* We render all wires with depth and opaque to a new fbo and blend the result based on depth values */ - psl->edit_face_occluded = edit_mesh_create_overlay_pass(&g_data.face_occluded_shgrp, &g_data.ledges_occluded_shgrp, &g_data.lverts_occluded_shgrp, - &g_data.facedot_occluded_shgrp, &zero, DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_DEPTH); + psl->edit_face_occluded = edit_mesh_create_overlay_pass(&stl->g_data->face_occluded_shgrp, &stl->g_data->ledges_occluded_shgrp, &stl->g_data->lverts_occluded_shgrp, + &stl->g_data->facedot_occluded_shgrp, &zero, DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_DEPTH); /* however we loose the front faces value (because we need the depth of occluded wires and * faces are alpha blended ) so we recover them in a new pass. */ psl->facefill_occlude = DRW_pass_create("Front Face Color", DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS | DRW_STATE_BLEND); - g_data.facefill_occluded_shgrp = DRW_shgroup_create(e_data.overlay_facefill_sh, psl->facefill_occlude); - DRW_shgroup_uniform_block(g_data.facefill_occluded_shgrp, "globalsBlock", globals_ubo, 0); + stl->g_data->facefill_occluded_shgrp = DRW_shgroup_create(e_data.overlay_facefill_sh, psl->facefill_occlude); + DRW_shgroup_uniform_block(stl->g_data->facefill_occluded_shgrp, "globalsBlock", globals_ubo, 0); /* we need a full screen pass to combine the result */ struct Batch *quad = DRW_cache_fullscreen_quad_get(); @@ -348,8 +356,9 @@ static void edit_mesh_add_ob_to_pass(Scene *scene, Object *ob, DRWShadingGroup * } } -static void EDIT_MESH_cache_populate(void *UNUSED(vedata), Object *ob) +static void EDIT_MESH_cache_populate(void *vedata, Object *ob) { + EDIT_MESH_StorageList *stl = ((EDIT_MESH_Data *)vedata)->stl; const struct bContext *C = DRW_get_context(); View3D *v3d = CTX_wm_view3d(C); Scene *scene = CTX_data_scene(C); @@ -371,31 +380,31 @@ static void EDIT_MESH_cache_populate(void *UNUSED(vedata), Object *ob) if (do_occlude_wire) { geom = DRW_cache_surface_get(ob); - DRW_shgroup_call_add(g_data.depth_shgrp_hidden_wire, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->depth_shgrp_hidden_wire, geom, ob->obmat); } if (fnormals_do) { geom = DRW_cache_face_centers_get(ob); - DRW_shgroup_call_add(g_data.fnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->fnormals_shgrp, geom, ob->obmat); } if (vnormals_do) { geom = DRW_cache_verts_get(ob); - DRW_shgroup_call_add(g_data.vnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->vnormals_shgrp, geom, ob->obmat); } if (lnormals_do) { geom = DRW_cache_surface_verts_get(ob); - DRW_shgroup_call_add(g_data.lnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->lnormals_shgrp, geom, ob->obmat); } if ((v3d->flag & V3D_ZBUF_SELECT) == 0) { - edit_mesh_add_ob_to_pass(scene, ob, g_data.face_occluded_shgrp, g_data.ledges_occluded_shgrp, - g_data.lverts_occluded_shgrp, g_data.facedot_occluded_shgrp, g_data.facefill_occluded_shgrp); + edit_mesh_add_ob_to_pass(scene, ob, stl->g_data->face_occluded_shgrp, stl->g_data->ledges_occluded_shgrp, + stl->g_data->lverts_occluded_shgrp, stl->g_data->facedot_occluded_shgrp, stl->g_data->facefill_occluded_shgrp); } else { - edit_mesh_add_ob_to_pass(scene, ob, g_data.face_overlay_shgrp, g_data.ledges_overlay_shgrp, - g_data.lverts_overlay_shgrp, g_data.facedot_overlay_shgrp, NULL); + edit_mesh_add_ob_to_pass(scene, ob, stl->g_data->face_overlay_shgrp, stl->g_data->ledges_overlay_shgrp, + stl->g_data->lverts_overlay_shgrp, stl->g_data->facedot_overlay_shgrp, NULL); } } } diff --git a/source/blender/draw/modes/edit_metaball_mode.c b/source/blender/draw/modes/edit_metaball_mode.c index 5f0ca3f1566..f993537369f 100644 --- a/source/blender/draw/modes/edit_metaball_mode.c +++ b/source/blender/draw/modes/edit_metaball_mode.c @@ -76,6 +76,7 @@ typedef struct EDIT_METABALL_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } EDIT_METABALL_StorageList; typedef struct EDIT_METABALL_Data { @@ -99,16 +100,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in EDIT_METABALL_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - EDIT_METABALL_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -117,10 +113,9 @@ static struct { * (Optional) */ static void EDIT_METABALL_engine_init(void *vedata) { - EDIT_METABALL_Data *ved = DRW_viewport_engine_data_get("EditMetaballMode"); - EDIT_METABALL_TextureList *txl = ved->txl; + EDIT_METABALL_TextureList *txl = ((EDIT_METABALL_Data *)vedata)->txl; EDIT_METABALL_FramebufferList *fbl = ((EDIT_METABALL_Data *)vedata)->fbl; - EDIT_METABALL_StorageList *stl = ved->stl; + EDIT_METABALL_StorageList *stl = ((EDIT_METABALL_Data *)vedata)->stl; UNUSED_VARS(txl, fbl, stl); @@ -148,11 +143,13 @@ static void EDIT_METABALL_engine_init(void *vedata) * Assume that all Passes are NULL */ static void EDIT_METABALL_cache_init(void *vedata) { - EDIT_METABALL_PassList *psl = ((EDIT_METABALL_Data *)vedata)->psl; EDIT_METABALL_StorageList *stl = ((EDIT_METABALL_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -161,16 +158,16 @@ static void EDIT_METABALL_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.0f, 1.0f, 0.0f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -188,7 +185,7 @@ static void EDIT_METABALL_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/edit_surface_mode.c b/source/blender/draw/modes/edit_surface_mode.c index b5e0d09fb23..6cfe0f1344b 100644 --- a/source/blender/draw/modes/edit_surface_mode.c +++ b/source/blender/draw/modes/edit_surface_mode.c @@ -76,6 +76,7 @@ typedef struct EDIT_SURFACE_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } EDIT_SURFACE_StorageList; typedef struct EDIT_SURFACE_Data { @@ -99,16 +100,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in EDIT_SURFACE_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - EDIT_SURFACE_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -117,10 +113,9 @@ static struct { * (Optional) */ static void EDIT_SURFACE_engine_init(void *vedata) { - EDIT_SURFACE_Data *ved = DRW_viewport_engine_data_get("EditSurfaceMode"); - EDIT_SURFACE_TextureList *txl = ved->txl; + EDIT_SURFACE_TextureList *txl = ((EDIT_SURFACE_Data *)vedata)->txl; EDIT_SURFACE_FramebufferList *fbl = ((EDIT_SURFACE_Data *)vedata)->fbl; - EDIT_SURFACE_StorageList *stl = ved->stl; + EDIT_SURFACE_StorageList *stl = ((EDIT_SURFACE_Data *)vedata)->stl; UNUSED_VARS(txl, fbl, stl); @@ -148,11 +143,13 @@ static void EDIT_SURFACE_engine_init(void *vedata) * Assume that all Passes are NULL */ static void EDIT_SURFACE_cache_init(void *vedata) { - EDIT_SURFACE_PassList *psl = ((EDIT_SURFACE_Data *)vedata)->psl; EDIT_SURFACE_StorageList *stl = ((EDIT_SURFACE_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -161,16 +158,16 @@ static void EDIT_SURFACE_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.0f, 0.0f, 1.0f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -188,7 +185,7 @@ static void EDIT_SURFACE_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/edit_text_mode.c b/source/blender/draw/modes/edit_text_mode.c index 46ab36efbb5..4f48448f108 100644 --- a/source/blender/draw/modes/edit_text_mode.c +++ b/source/blender/draw/modes/edit_text_mode.c @@ -76,6 +76,7 @@ typedef struct EDIT_TEXT_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } EDIT_TEXT_StorageList; typedef struct EDIT_TEXT_Data { @@ -99,16 +100,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in EDIT_TEXT_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - EDIT_TEXT_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -117,10 +113,9 @@ static struct { * (Optional) */ static void EDIT_TEXT_engine_init(void *vedata) { - EDIT_TEXT_Data *ved = DRW_viewport_engine_data_get("EditTextMode"); - EDIT_TEXT_TextureList *txl = ved->txl; + EDIT_TEXT_TextureList *txl = ((EDIT_TEXT_Data *)vedata)->txl; EDIT_TEXT_FramebufferList *fbl = ((EDIT_TEXT_Data *)vedata)->fbl; - EDIT_TEXT_StorageList *stl = ved->stl; + EDIT_TEXT_StorageList *stl = ((EDIT_TEXT_Data *)vedata)->stl; UNUSED_VARS(txl, fbl, stl); @@ -148,11 +143,13 @@ static void EDIT_TEXT_engine_init(void *vedata) * Assume that all Passes are NULL */ static void EDIT_TEXT_cache_init(void *vedata) { - EDIT_TEXT_PassList *psl = ((EDIT_TEXT_Data *)vedata)->psl; EDIT_TEXT_StorageList *stl = ((EDIT_TEXT_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -161,16 +158,16 @@ static void EDIT_TEXT_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {1.0f, 0.0f, 0.0f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -188,7 +185,7 @@ static void EDIT_TEXT_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 706f73005d5..cfea5b030f6 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -87,6 +87,11 @@ typedef struct OBJECT_TextureList { struct GPUTexture *outlines_blur_tx; } OBJECT_TextureList; +/* keep it under MAX_STORAGE */ +typedef struct OBJECT_StorageList { + struct g_data *g_data; +} OBJECT_StorageList; + typedef struct OBJECT_Data { char engine_name[32]; void *fbl; @@ -97,7 +102,7 @@ typedef struct OBJECT_Data { /* *********** STATIC *********** */ -static struct { +typedef struct g_data{ /* Empties */ DRWShadingGroup *plain_axes; DRWShadingGroup *cube; @@ -154,8 +159,7 @@ static struct { DRWShadingGroup *outlines_select_group; DRWShadingGroup *outlines_transform; - OBJECT_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ static struct { struct GPUShader *outline_resolve_sh; @@ -187,7 +191,6 @@ enum { static void OBJECT_engine_init(void *vedata) { - OBJECT_TextureList *txl = ((OBJECT_Data *)vedata)->txl; OBJECT_FramebufferList *fbl = ((OBJECT_Data *)vedata)->fbl; @@ -376,12 +379,16 @@ static DRWShadingGroup *shgroup_outline(DRWPass *pass, const float col[4], struc static void OBJECT_cache_init(void *vedata) { - /* DRW_viewport_engine_data_get is rather slow, better not do it on every objects */ - OBJECT_PassList *psl = ((OBJECT_Data *)vedata)->psl; OBJECT_TextureList *txl = ((OBJECT_Data *)vedata)->txl; + OBJECT_StorageList *stl = ((OBJECT_Data *)vedata)->stl; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } + { DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_WIRE; psl->outlines = DRW_pass_create("Outlines Pass", state); @@ -389,15 +396,15 @@ static void OBJECT_cache_init(void *vedata) struct GPUShader *sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); /* Select */ - g_data.outlines_select = shgroup_outline(psl->outlines, ts.colorSelect, sh); - g_data.outlines_select_group = shgroup_outline(psl->outlines, ts.colorGroupActive, sh); + stl->g_data->outlines_select = shgroup_outline(psl->outlines, ts.colorSelect, sh); + stl->g_data->outlines_select_group = shgroup_outline(psl->outlines, ts.colorGroupActive, sh); /* Transform */ - g_data.outlines_transform = shgroup_outline(psl->outlines, ts.colorTransform, sh); + stl->g_data->outlines_transform = shgroup_outline(psl->outlines, ts.colorTransform, sh); /* Active */ - g_data.outlines_active = shgroup_outline(psl->outlines, ts.colorActive, sh); - g_data.outlines_active_group = shgroup_outline(psl->outlines, ts.colorGroupActive, sh); + stl->g_data->outlines_active = shgroup_outline(psl->outlines, ts.colorActive, sh); + stl->g_data->outlines_active_group = shgroup_outline(psl->outlines, ts.colorGroupActive, sh); } { @@ -536,53 +543,53 @@ static void OBJECT_cache_init(void *vedata) /* Empties */ geom = DRW_cache_plain_axes_get(); - g_data.plain_axes = shgroup_instance(psl->non_meshes, geom); + stl->g_data->plain_axes = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_cube_get(); - g_data.cube = shgroup_instance(psl->non_meshes, geom); + stl->g_data->cube = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_circle_get(); - g_data.circle = shgroup_instance(psl->non_meshes, geom); + stl->g_data->circle = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_empty_sphere_get(); - g_data.sphere = shgroup_instance(psl->non_meshes, geom); + stl->g_data->sphere = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_empty_cone_get(); - g_data.cone = shgroup_instance(psl->non_meshes, geom); + stl->g_data->cone = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_single_arrow_get(); - g_data.single_arrow = shgroup_instance(psl->non_meshes, geom); + stl->g_data->single_arrow = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_get(); - g_data.single_arrow_line = shgroup_instance(psl->non_meshes, geom); + stl->g_data->single_arrow_line = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_arrows_get(); - g_data.arrows = shgroup_instance(psl->non_meshes, geom); + stl->g_data->arrows = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_axis_names_get(); - g_data.axis_names = shgroup_instance_axis_names(psl->non_meshes, geom); + stl->g_data->axis_names = shgroup_instance_axis_names(psl->non_meshes, geom); /* Speaker */ geom = DRW_cache_speaker_get(); - g_data.speaker = shgroup_instance(psl->non_meshes, geom); + stl->g_data->speaker = shgroup_instance(psl->non_meshes, geom); /* Camera */ geom = DRW_cache_camera_get(); - g_data.camera = shgroup_camera_instance(psl->non_meshes, geom); + stl->g_data->camera = shgroup_camera_instance(psl->non_meshes, geom); geom = DRW_cache_camera_tria_get(); - g_data.camera_tria = shgroup_camera_instance(psl->non_meshes, geom); + stl->g_data->camera_tria = shgroup_camera_instance(psl->non_meshes, geom); geom = DRW_cache_plain_axes_get(); - g_data.camera_focus = shgroup_instance(psl->non_meshes, geom); + stl->g_data->camera_focus = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_get(); - g_data.camera_clip = shgroup_distance_lines_instance(psl->non_meshes, geom); - g_data.camera_mist = shgroup_distance_lines_instance(psl->non_meshes, geom); + stl->g_data->camera_clip = shgroup_distance_lines_instance(psl->non_meshes, geom); + stl->g_data->camera_mist = shgroup_distance_lines_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_endpoints_get(); - g_data.camera_clip_points = shgroup_distance_lines_instance(psl->non_meshes, geom); - g_data.camera_mist_points = shgroup_distance_lines_instance(psl->non_meshes, geom); + stl->g_data->camera_clip_points = shgroup_distance_lines_instance(psl->non_meshes, geom); + stl->g_data->camera_mist_points = shgroup_distance_lines_instance(psl->non_meshes, geom); /* Lamps */ /* TODO @@ -591,48 +598,48 @@ static void OBJECT_cache_init(void *vedata) /* start with buflimit because we don't want stipples */ geom = DRW_cache_single_line_get(); - g_data.lamp_buflimit = shgroup_distance_lines_instance(psl->non_meshes, geom); + stl->g_data->lamp_buflimit = shgroup_distance_lines_instance(psl->non_meshes, geom); - g_data.lamp_center = shgroup_dynpoints_uniform_color(psl->non_meshes, ts.colorLampNoAlpha, &ts.sizeLampCenter); - g_data.lamp_center_group = shgroup_dynpoints_uniform_color(psl->non_meshes, ts.colorGroup, &ts.sizeLampCenter); + stl->g_data->lamp_center = shgroup_dynpoints_uniform_color(psl->non_meshes, ts.colorLampNoAlpha, &ts.sizeLampCenter); + stl->g_data->lamp_center_group = shgroup_dynpoints_uniform_color(psl->non_meshes, ts.colorGroup, &ts.sizeLampCenter); geom = DRW_cache_lamp_get(); - g_data.lamp_circle = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircle); - g_data.lamp_circle_shadow = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircleShadow); + stl->g_data->lamp_circle = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircle); + stl->g_data->lamp_circle_shadow = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircleShadow); geom = DRW_cache_lamp_sunrays_get(); - g_data.lamp_sunrays = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircle); + stl->g_data->lamp_sunrays = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircle); - g_data.lamp_groundline = shgroup_groundlines_uniform_color(psl->non_meshes, ts.colorLamp); - g_data.lamp_groundpoint = shgroup_groundpoints_uniform_color(psl->non_meshes, ts.colorLamp); + stl->g_data->lamp_groundline = shgroup_groundlines_uniform_color(psl->non_meshes, ts.colorLamp); + stl->g_data->lamp_groundpoint = shgroup_groundpoints_uniform_color(psl->non_meshes, ts.colorLamp); geom = DRW_cache_lamp_area_get(); - g_data.lamp_area = shgroup_instance(psl->non_meshes, geom); + stl->g_data->lamp_area = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_lamp_hemi_get(); - g_data.lamp_hemi = shgroup_instance(psl->non_meshes, geom); + stl->g_data->lamp_hemi = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_get(); - g_data.lamp_distance = shgroup_distance_lines_instance(psl->non_meshes, geom); + stl->g_data->lamp_distance = shgroup_distance_lines_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_endpoints_get(); - g_data.lamp_buflimit_points = shgroup_distance_lines_instance(psl->non_meshes, geom); + stl->g_data->lamp_buflimit_points = shgroup_distance_lines_instance(psl->non_meshes, geom); geom = DRW_cache_lamp_spot_get(); - g_data.lamp_spot_cone = shgroup_spot_instance(psl->non_meshes, geom); + stl->g_data->lamp_spot_cone = shgroup_spot_instance(psl->non_meshes, geom); geom = DRW_cache_circle_get(); - g_data.lamp_spot_blend = shgroup_instance(psl->non_meshes, geom); + stl->g_data->lamp_spot_blend = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_lamp_spot_square_get(); - g_data.lamp_spot_pyramid = shgroup_instance(psl->non_meshes, geom); + stl->g_data->lamp_spot_pyramid = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_square_get(); - g_data.lamp_spot_blend_rect = shgroup_instance(psl->non_meshes, geom); + stl->g_data->lamp_spot_blend_rect = shgroup_instance(psl->non_meshes, geom); /* Relationship Lines */ - g_data.relationship_lines = shgroup_dynlines_uniform_color(psl->non_meshes, ts.colorWire); - DRW_shgroup_state_set(g_data.relationship_lines, DRW_STATE_STIPPLE_3); + stl->g_data->relationship_lines = shgroup_dynlines_uniform_color(psl->non_meshes, ts.colorWire); + DRW_shgroup_state_set(stl->g_data->relationship_lines, DRW_STATE_STIPPLE_3); } { @@ -654,21 +661,21 @@ static void OBJECT_cache_init(void *vedata) DRW_shgroup_uniform_float(grp, "outlineWidth", &outlineWidth, 1); DRW_shgroup_uniform_vec4(grp, "color", ts.colorActive, 1); DRW_shgroup_uniform_vec4(grp, "outlineColor", ts.colorOutline, 1); - g_data.center_active = grp; + stl->g_data->center_active = grp; /* Select */ grp = DRW_shgroup_point_batch_create(sh, psl->ob_center); DRW_shgroup_uniform_vec4(grp, "color", ts.colorSelect, 1); - g_data.center_selected = grp; + stl->g_data->center_selected = grp; /* Deselect */ grp = DRW_shgroup_point_batch_create(sh, psl->ob_center); DRW_shgroup_uniform_vec4(grp, "color", ts.colorDeselect, 1); - g_data.center_deselected = grp; + stl->g_data->center_deselected = grp; } } -static void DRW_shgroup_lamp(Object *ob, SceneLayer *sl) +static void DRW_shgroup_lamp(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl) { Lamp *la = ob->data; float *color; @@ -677,29 +684,29 @@ static void DRW_shgroup_lamp(Object *ob, SceneLayer *sl) /* Don't draw the center if it's selected or active */ if (theme_id == TH_GROUP) - DRW_shgroup_dynamic_call_add(g_data.lamp_center_group, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_center_group, ob->obmat[3]); else if (theme_id == TH_LAMP) - DRW_shgroup_dynamic_call_add(g_data.lamp_center, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_center, ob->obmat[3]); /* First circle */ - DRW_shgroup_dynamic_call_add(g_data.lamp_circle, ob->obmat[3], color); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_circle, ob->obmat[3], color); /* draw dashed outer circle if shadow is on. remember some lamps can't have certain shadows! */ if (la->type != LA_HEMI) { if ((la->mode & LA_SHAD_RAY) || ((la->mode & LA_SHAD_BUF) && (la->type == LA_SPOT))) { - DRW_shgroup_dynamic_call_add(g_data.lamp_circle_shadow, ob->obmat[3], color); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_circle_shadow, ob->obmat[3], color); } } /* Distance */ if (ELEM(la->type, LA_HEMI, LA_SUN, LA_AREA)) { - DRW_shgroup_dynamic_call_add(g_data.lamp_distance, color, &zero, &la->dist, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_distance, color, &zero, &la->dist, ob->obmat); } copy_m4_m4(la->shapemat, ob->obmat); if (la->type == LA_SUN) { - DRW_shgroup_dynamic_call_add(g_data.lamp_sunrays, ob->obmat[3], color); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_sunrays, ob->obmat[3], color); } else if (la->type == LA_SPOT) { float size[3], sizemat[4][4]; @@ -719,33 +726,33 @@ static void DRW_shgroup_lamp(Object *ob, SceneLayer *sl) mul_m4_m4m4(la->spotblendmat, la->spotconemat, sizemat); if (la->mode & LA_SQUARE) { - DRW_shgroup_dynamic_call_add(g_data.lamp_spot_pyramid, color, &one, la->spotconemat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_spot_pyramid, color, &one, la->spotconemat); /* hide line if it is zero size or overlaps with outer border, * previously it adjusted to always to show it but that seems * confusing because it doesn't show the actual blend size */ if (blend != 0.0f && blend != 1.0f) { - DRW_shgroup_dynamic_call_add(g_data.lamp_spot_blend_rect, color, &one, la->spotblendmat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_spot_blend_rect, color, &one, la->spotblendmat); } } else { - DRW_shgroup_dynamic_call_add(g_data.lamp_spot_cone, color, la->spotconemat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_spot_cone, color, la->spotconemat); /* hide line if it is zero size or overlaps with outer border, * previously it adjusted to always to show it but that seems * confusing because it doesn't show the actual blend size */ if (blend != 0.0f && blend != 1.0f) { - DRW_shgroup_dynamic_call_add(g_data.lamp_spot_blend, color, &one, la->spotblendmat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_spot_blend, color, &one, la->spotblendmat); } } normalize_m4(la->shapemat); - DRW_shgroup_dynamic_call_add(g_data.lamp_buflimit, color, &la->clipsta, &la->clipend, ob->obmat); - DRW_shgroup_dynamic_call_add(g_data.lamp_buflimit_points, color, &la->clipsta, &la->clipend, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_buflimit, color, &la->clipsta, &la->clipend, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_buflimit_points, color, &la->clipsta, &la->clipend, ob->obmat); } else if (la->type == LA_HEMI) { static float hemisize = 2.0f; - DRW_shgroup_dynamic_call_add(g_data.lamp_hemi, color, &hemisize, la->shapemat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_hemi, color, &hemisize, la->shapemat); } else if (la->type == LA_AREA) { float size[3] = {1.0f, 1.0f, 1.0f}, sizemat[4][4]; @@ -756,15 +763,15 @@ static void DRW_shgroup_lamp(Object *ob, SceneLayer *sl) mul_m4_m4m4(la->shapemat, la->shapemat, sizemat); } - DRW_shgroup_dynamic_call_add(g_data.lamp_area, color, &la->area_size, la->shapemat); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_area, color, &la->area_size, la->shapemat); } /* Line and point going to the ground */ - DRW_shgroup_dynamic_call_add(g_data.lamp_groundline, ob->obmat[3]); - DRW_shgroup_dynamic_call_add(g_data.lamp_groundpoint, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_groundline, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(stl->g_data->lamp_groundpoint, ob->obmat[3]); } -static void DRW_shgroup_camera(Object *ob, SceneLayer *sl) +static void DRW_shgroup_camera(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl) { const struct bContext *C = DRW_get_context(); View3D *v3d = CTX_wm_view3d(C); @@ -799,11 +806,11 @@ static void DRW_shgroup_camera(Object *ob, SceneLayer *sl) cam->drwtria[1][0] = shift[0]; cam->drwtria[1][1] = shift[1] + ((1.1f * drawsize * (asp[1] + 0.7f)) * scale[1]); - DRW_shgroup_dynamic_call_add(g_data.camera, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->camera, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); /* Active cam */ if (is_active) { - DRW_shgroup_dynamic_call_add(g_data.camera_tria, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->camera_tria, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); } /* draw the rest in normalize object space */ @@ -820,10 +827,10 @@ static void DRW_shgroup_camera(Object *ob, SceneLayer *sl) size_to_mat4(sizemat, size); mul_m4_m4m4(cam->drwfocusmat, cam->drwfocusmat, sizemat); - DRW_shgroup_dynamic_call_add(g_data.camera_focus, (is_active ? col_hi : col), &cam->drawsize, cam->drwfocusmat); + DRW_shgroup_dynamic_call_add(stl->g_data->camera_focus, (is_active ? col_hi : col), &cam->drawsize, cam->drwfocusmat); - DRW_shgroup_dynamic_call_add(g_data.camera_clip, color, &cam->clipsta, &cam->clipend, cam->drwnormalmat); - DRW_shgroup_dynamic_call_add(g_data.camera_clip_points, (is_active ? col_hi : col), &cam->clipsta, &cam->clipend, cam->drwnormalmat); + DRW_shgroup_dynamic_call_add(stl->g_data->camera_clip, color, &cam->clipsta, &cam->clipend, cam->drwnormalmat); + DRW_shgroup_dynamic_call_add(stl->g_data->camera_clip_points, (is_active ? col_hi : col), &cam->clipsta, &cam->clipend, cam->drwnormalmat); } if (cam->flag & CAM_SHOWMIST) { @@ -832,73 +839,74 @@ static void DRW_shgroup_camera(Object *ob, SceneLayer *sl) if (world) { static float col[3] = {0.5f, 0.5f, 0.5f}, col_hi[3] = {1.0f, 1.0f, 1.0f}; world->mistend = world->miststa + world->mistdist; - DRW_shgroup_dynamic_call_add(g_data.camera_mist, color, &world->miststa, &world->mistend, cam->drwnormalmat); - DRW_shgroup_dynamic_call_add(g_data.camera_mist_points, (is_active ? col_hi : col), &world->miststa, &world->mistend, cam->drwnormalmat); + DRW_shgroup_dynamic_call_add(stl->g_data->camera_mist, color, &world->miststa, &world->mistend, cam->drwnormalmat); + DRW_shgroup_dynamic_call_add(stl->g_data->camera_mist_points, (is_active ? col_hi : col), &world->miststa, &world->mistend, cam->drwnormalmat); } } } -static void DRW_shgroup_empty(Object *ob, SceneLayer *sl) +static void DRW_shgroup_empty(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl) { float *color; DRW_object_wire_theme_get(ob, sl, &color); switch (ob->empty_drawtype) { case OB_PLAINAXES: - DRW_shgroup_dynamic_call_add(g_data.plain_axes, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->plain_axes, color, &ob->empty_drawsize, ob->obmat); break; case OB_SINGLE_ARROW: - DRW_shgroup_dynamic_call_add(g_data.single_arrow, color, &ob->empty_drawsize, ob->obmat); - DRW_shgroup_dynamic_call_add(g_data.single_arrow_line, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->single_arrow, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->single_arrow_line, color, &ob->empty_drawsize, ob->obmat); break; case OB_CUBE: - DRW_shgroup_dynamic_call_add(g_data.cube, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->cube, color, &ob->empty_drawsize, ob->obmat); break; case OB_CIRCLE: - DRW_shgroup_dynamic_call_add(g_data.circle, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->circle, color, &ob->empty_drawsize, ob->obmat); break; case OB_EMPTY_SPHERE: - DRW_shgroup_dynamic_call_add(g_data.sphere, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->sphere, color, &ob->empty_drawsize, ob->obmat); break; case OB_EMPTY_CONE: - DRW_shgroup_dynamic_call_add(g_data.cone, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->cone, color, &ob->empty_drawsize, ob->obmat); break; case OB_ARROWS: - DRW_shgroup_dynamic_call_add(g_data.arrows, color, &ob->empty_drawsize, ob->obmat); - DRW_shgroup_dynamic_call_add(g_data.axis_names, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->arrows, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->axis_names, color, &ob->empty_drawsize, ob->obmat); break; } } -static void DRW_shgroup_speaker(Object *ob, SceneLayer *sl) +static void DRW_shgroup_speaker(OBJECT_StorageList *stl, Object *ob, SceneLayer *sl) { float *color; static float one = 1.0f; DRW_object_wire_theme_get(ob, sl, &color); - DRW_shgroup_dynamic_call_add(g_data.speaker, color, &one, ob->obmat); + DRW_shgroup_dynamic_call_add(stl->g_data->speaker, color, &one, ob->obmat); } -static void DRW_shgroup_relationship_lines(Object *ob) +static void DRW_shgroup_relationship_lines(OBJECT_StorageList *stl, Object *ob) { if (ob->parent) { - DRW_shgroup_dynamic_call_add(g_data.relationship_lines, ob->obmat[3]); - DRW_shgroup_dynamic_call_add(g_data.relationship_lines, ob->parent->obmat[3]); + DRW_shgroup_dynamic_call_add(stl->g_data->relationship_lines, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(stl->g_data->relationship_lines, ob->parent->obmat[3]); } } -static void DRW_shgroup_object_center(Object *ob) +static void DRW_shgroup_object_center(OBJECT_StorageList *stl, Object *ob) { if ((ob->base_flag & BASE_SELECTED) != 0) { - DRW_shgroup_dynamic_call_add(g_data.center_selected, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(stl->g_data->center_selected, ob->obmat[3]); } else if (0) { - DRW_shgroup_dynamic_call_add(g_data.center_deselected, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(stl->g_data->center_deselected, ob->obmat[3]); } } static void OBJECT_cache_populate(void *vedata, Object *ob) { + OBJECT_StorageList *stl = ((OBJECT_Data *)vedata)->stl; const struct bContext *C = DRW_get_context(); Scene *scene = CTX_data_scene(C); SceneLayer *sl = CTX_data_scene_layer(C); @@ -918,16 +926,16 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); switch (theme_id) { case TH_ACTIVE: - DRW_shgroup_call_add(g_data.outlines_active, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->outlines_active, geom, ob->obmat); break; case TH_SELECT: - DRW_shgroup_call_add(g_data.outlines_select, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->outlines_select, geom, ob->obmat); break; case TH_GROUP_ACTIVE: - DRW_shgroup_call_add(g_data.outlines_select_group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->outlines_select_group, geom, ob->obmat); break; case TH_TRANSFORM: - DRW_shgroup_call_add(g_data.outlines_transform, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->outlines_transform, geom, ob->obmat); break; } } @@ -935,16 +943,16 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) } break; case OB_LAMP: - DRW_shgroup_lamp(ob, sl); + DRW_shgroup_lamp(stl, ob, sl); break; case OB_CAMERA: - DRW_shgroup_camera(ob, sl); + DRW_shgroup_camera(stl, ob, sl); break; case OB_EMPTY: - DRW_shgroup_empty(ob, sl); + DRW_shgroup_empty(stl, ob, sl); break; case OB_SPEAKER: - DRW_shgroup_speaker(ob, sl); + DRW_shgroup_speaker(stl, ob, sl); break; case OB_ARMATURE: { @@ -952,7 +960,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) if (arm->edbo == NULL) { DRW_shgroup_armature_object(ob, sl, ((OBJECT_Data *)vedata)->psl->bone_solid, ((OBJECT_Data *)vedata)->psl->bone_wire, - g_data.relationship_lines); + stl->g_data->relationship_lines); } } break; @@ -960,8 +968,8 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) break; } - DRW_shgroup_object_center(ob); - DRW_shgroup_relationship_lines(ob); + DRW_shgroup_object_center(stl, ob); + DRW_shgroup_relationship_lines(stl, ob); } static void OBJECT_draw_scene(void *vedata) diff --git a/source/blender/draw/modes/paint_texture_mode.c b/source/blender/draw/modes/paint_texture_mode.c index f1617a29133..e6221c4efc3 100644 --- a/source/blender/draw/modes/paint_texture_mode.c +++ b/source/blender/draw/modes/paint_texture_mode.c @@ -76,6 +76,7 @@ typedef struct PAINT_TEXTURE_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } PAINT_TEXTURE_StorageList; typedef struct PAINT_TEXTURE_Data { @@ -99,16 +100,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in PAINT_TEXTURE_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - PAINT_TEXTURE_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -117,10 +113,9 @@ static struct { * (Optional) */ static void PAINT_TEXTURE_engine_init(void *vedata) { - PAINT_TEXTURE_Data *ved = DRW_viewport_engine_data_get("PaintTextureMode"); - PAINT_TEXTURE_TextureList *txl = ved->txl; + PAINT_TEXTURE_TextureList *txl = ((PAINT_TEXTURE_Data *)vedata)->txl; PAINT_TEXTURE_FramebufferList *fbl = ((PAINT_TEXTURE_Data *)vedata)->fbl; - PAINT_TEXTURE_StorageList *stl = ved->stl; + PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; UNUSED_VARS(txl, fbl, stl); @@ -148,11 +143,13 @@ static void PAINT_TEXTURE_engine_init(void *vedata) * Assume that all Passes are NULL */ static void PAINT_TEXTURE_cache_init(void *vedata) { - PAINT_TEXTURE_PassList *psl = ((PAINT_TEXTURE_Data *)vedata)->psl; PAINT_TEXTURE_StorageList *stl = ((PAINT_TEXTURE_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -161,16 +158,16 @@ static void PAINT_TEXTURE_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.2f, 0.5f, 0.3f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -188,7 +185,7 @@ static void PAINT_TEXTURE_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index 0d8ccff23aa..15c08a7d415 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -76,6 +76,7 @@ typedef struct PAINT_VERTEX_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } PAINT_VERTEX_StorageList; typedef struct PAINT_VERTEX_Data { @@ -99,16 +100,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in PAINT_VERTEX_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - PAINT_VERTEX_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -117,10 +113,9 @@ static struct { * (Optional) */ static void PAINT_VERTEX_engine_init(void *vedata) { - PAINT_VERTEX_Data *ved = DRW_viewport_engine_data_get("PaintVertexMode"); - PAINT_VERTEX_TextureList *txl = ved->txl; + PAINT_VERTEX_TextureList *txl = ((PAINT_VERTEX_Data *)vedata)->txl; PAINT_VERTEX_FramebufferList *fbl = ((PAINT_VERTEX_Data *)vedata)->fbl; - PAINT_VERTEX_StorageList *stl = ved->stl; + PAINT_VERTEX_StorageList *stl = ((PAINT_VERTEX_Data *)vedata)->stl; UNUSED_VARS(txl, fbl, stl); @@ -148,11 +143,13 @@ static void PAINT_VERTEX_engine_init(void *vedata) * Assume that all Passes are NULL */ static void PAINT_VERTEX_cache_init(void *vedata) { - PAINT_VERTEX_PassList *psl = ((PAINT_VERTEX_Data *)vedata)->psl; PAINT_VERTEX_StorageList *stl = ((PAINT_VERTEX_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -161,16 +158,16 @@ static void PAINT_VERTEX_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.2f, 0.5f, 0.3f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -188,7 +185,7 @@ static void PAINT_VERTEX_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c index 00a034a87c0..3063e685149 100644 --- a/source/blender/draw/modes/paint_weight_mode.c +++ b/source/blender/draw/modes/paint_weight_mode.c @@ -76,6 +76,7 @@ typedef struct PAINT_WEIGHT_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } PAINT_WEIGHT_StorageList; typedef struct PAINT_WEIGHT_Data { @@ -99,16 +100,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in PAINT_WEIGHT_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - PAINT_WEIGHT_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* *********** FUNCTIONS *********** */ @@ -117,10 +113,9 @@ static struct { * (Optional) */ static void PAINT_WEIGHT_engine_init(void *vedata) { - PAINT_WEIGHT_Data *ved = DRW_viewport_engine_data_get("PaintWeightMode"); - PAINT_WEIGHT_TextureList *txl = ved->txl; + PAINT_WEIGHT_TextureList *txl = ((PAINT_WEIGHT_Data *)vedata)->txl; PAINT_WEIGHT_FramebufferList *fbl = ((PAINT_WEIGHT_Data *)vedata)->fbl; - PAINT_WEIGHT_StorageList *stl = ved->stl; + PAINT_WEIGHT_StorageList *stl = ((PAINT_WEIGHT_Data *)vedata)->stl; UNUSED_VARS(txl, fbl, stl); @@ -148,11 +143,13 @@ static void PAINT_WEIGHT_engine_init(void *vedata) * Assume that all Passes are NULL */ static void PAINT_WEIGHT_cache_init(void *vedata) { - PAINT_WEIGHT_PassList *psl = ((PAINT_WEIGHT_Data *)vedata)->psl; PAINT_WEIGHT_StorageList *stl = ((PAINT_WEIGHT_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -161,16 +158,16 @@ static void PAINT_WEIGHT_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.2f, 0.5f, 0.3f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -178,17 +175,14 @@ static void PAINT_WEIGHT_cache_init(void *vedata) /* Add geometry to shadingGroups. Execute for each objects */ static void PAINT_WEIGHT_cache_populate(void *vedata, Object *ob) { - PAINT_WEIGHT_PassList *psl = ((PAINT_WEIGHT_Data *)vedata)->psl; PAINT_WEIGHT_StorageList *stl = ((PAINT_WEIGHT_Data *)vedata)->stl; - UNUSED_VARS(psl, stl); - if (ob->type == OB_MESH) { /* Get geometry cache */ struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/particle_mode.c b/source/blender/draw/modes/particle_mode.c index b2d9d39281b..84426b28752 100644 --- a/source/blender/draw/modes/particle_mode.c +++ b/source/blender/draw/modes/particle_mode.c @@ -70,6 +70,7 @@ typedef struct PARTICLE_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } PARTICLE_StorageList; typedef struct PARTICLE_Data { @@ -93,16 +94,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in PARTICLE_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - PARTICLE_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -111,7 +107,6 @@ static struct { * (Optional) */ static void PARTICLE_engine_init(void *vedata) { - PARTICLE_TextureList *txl = ((PARTICLE_Data *)vedata)->txl; PARTICLE_FramebufferList *fbl = ((PARTICLE_Data *)vedata)->fbl; PARTICLE_StorageList *stl = ((PARTICLE_Data *)vedata)->stl; @@ -142,11 +137,13 @@ static void PARTICLE_engine_init(void *vedata) * Assume that all Passes are NULL */ static void PARTICLE_cache_init(void *vedata) { - PARTICLE_PassList *psl = ((PARTICLE_Data *)vedata)->psl; PARTICLE_StorageList *stl = ((PARTICLE_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -155,16 +152,16 @@ static void PARTICLE_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.2f, 0.5f, 0.3f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -182,7 +179,7 @@ static void PARTICLE_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/pose_mode.c b/source/blender/draw/modes/pose_mode.c index ec08650b866..0c880130cfc 100644 --- a/source/blender/draw/modes/pose_mode.c +++ b/source/blender/draw/modes/pose_mode.c @@ -70,6 +70,7 @@ typedef struct POSE_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } POSE_StorageList; typedef struct POSE_Data { @@ -93,16 +94,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in POSE_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - POSE_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -111,7 +107,6 @@ static struct { * (Optional) */ static void POSE_engine_init(void *vedata) { - POSE_TextureList *txl = ((POSE_Data *)vedata)->txl; POSE_FramebufferList *fbl = ((POSE_Data *)vedata)->fbl; POSE_StorageList *stl = ((POSE_Data *)vedata)->stl; @@ -142,11 +137,13 @@ static void POSE_engine_init(void *vedata) * Assume that all Passes are NULL */ static void POSE_cache_init(void *vedata) { - POSE_PassList *psl = ((POSE_Data *)vedata)->psl; POSE_StorageList *stl = ((POSE_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -155,16 +152,16 @@ static void POSE_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.2f, 0.5f, 0.3f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -182,7 +179,7 @@ static void POSE_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } diff --git a/source/blender/draw/modes/sculpt_mode.c b/source/blender/draw/modes/sculpt_mode.c index 49cc324869c..4ed03668796 100644 --- a/source/blender/draw/modes/sculpt_mode.c +++ b/source/blender/draw/modes/sculpt_mode.c @@ -70,6 +70,7 @@ typedef struct SCULPT_StorageList { * free with MEM_freeN() when viewport is freed. * (not per object) */ struct CustomStruct *block; + struct g_data *g_data; } SCULPT_StorageList; typedef struct SCULPT_Data { @@ -93,16 +94,11 @@ static struct { struct GPUShader *custom_shader; } e_data = {NULL}; /* Engine data */ -static struct { +typedef struct g_data { /* This keeps the references of the shading groups for * easy access in SCULPT_cache_populate() */ DRWShadingGroup *group; - - /* This keeps the reference of the viewport engine data because - * DRW_viewport_engine_data_get is slow and we don't want to - * call it for every object */ - SCULPT_Data *vedata; -} g_data = {NULL}; /* Transient data */ +} g_data; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -144,7 +140,10 @@ static void SCULPT_cache_init(void *vedata) SCULPT_PassList *psl = ((SCULPT_Data *)vedata)->psl; SCULPT_StorageList *stl = ((SCULPT_Data *)vedata)->stl; - UNUSED_VARS(stl); + if (!stl->g_data) { + /* Alloc transient pointers */ + stl->g_data = MEM_mallocN(sizeof(g_data), "g_data"); + } { /* Create a pass */ @@ -153,16 +152,16 @@ static void SCULPT_cache_init(void *vedata) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * stl->g_data->group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + * stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); + stl->g_data->group = DRW_shgroup_create(e_data.custom_shader, psl->pass); /* Uniforms need a pointer to it's value so be sure it's accessible at * any given time (i.e. use static vars) */ static float color[4] = {0.2f, 0.5f, 0.3f, 1.0}; - DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); + DRW_shgroup_uniform_vec4(stl->g_data->group, "color", color, 1); } } @@ -180,7 +179,7 @@ static void SCULPT_cache_populate(void *vedata, Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(g_data.group, geom, ob->obmat); + DRW_shgroup_call_add(stl->g_data->group, geom, ob->obmat); } } |