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

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/draw/engines/clay/clay.c18
-rw-r--r--source/blender/draw/engines/eevee/eevee.c48
-rw-r--r--source/blender/draw/engines/eevee/eevee_lights.c11
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h13
-rw-r--r--source/blender/draw/modes/edit_armature_mode.c24
-rw-r--r--source/blender/draw/modes/edit_curve_mode.c27
-rw-r--r--source/blender/draw/modes/edit_lattice_mode.c27
-rw-r--r--source/blender/draw/modes/edit_mesh_mode.c73
-rw-r--r--source/blender/draw/modes/edit_metaball_mode.c31
-rw-r--r--source/blender/draw/modes/edit_surface_mode.c31
-rw-r--r--source/blender/draw/modes/edit_text_mode.c31
-rw-r--r--source/blender/draw/modes/object_mode.c214
-rw-r--r--source/blender/draw/modes/paint_texture_mode.c31
-rw-r--r--source/blender/draw/modes/paint_vertex_mode.c31
-rw-r--r--source/blender/draw/modes/paint_weight_mode.c34
-rw-r--r--source/blender/draw/modes/particle_mode.c27
-rw-r--r--source/blender/draw/modes/pose_mode.c27
-rw-r--r--source/blender/draw/modes/sculpt_mode.c25
-rw-r--r--source/blender/gpu/GPU_viewport.h2
19 files changed, 365 insertions, 360 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);
}
}
diff --git a/source/blender/gpu/GPU_viewport.h b/source/blender/gpu/GPU_viewport.h
index db68b603ae6..06102a5c07e 100644
--- a/source/blender/gpu/GPU_viewport.h
+++ b/source/blender/gpu/GPU_viewport.h
@@ -44,7 +44,7 @@ typedef struct GPUViewport GPUViewport;
#define MAX_BUFFERS 8
#define MAX_TEXTURES 16
#define MAX_PASSES 16
-#define MAX_STORAGE 4 /* extend if needed */
+#define MAX_STORAGE 5 /* extend if needed */
/* All FramebufferLists are just the same pointers with different names */
typedef struct FramebufferList {