diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-03-19 00:14:53 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-03-20 17:19:03 +0300 |
commit | fc72a2ff4b470b1563d8480d231ca5b1b03a7983 (patch) | |
tree | 3fa13f6ff2c3b4fd3610992318171cb1799eebfd /source/blender | |
parent | 69a17bce1a29f89859d0148733e8f1086b033432 (diff) |
Draw module: code style, encapsulate static vars
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/draw/engines/clay/clay.c | 206 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee.c | 8 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_armature_mode.c | 25 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_curve_mode.c | 82 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_lattice_mode.c | 82 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_mesh_mode.c | 293 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_metaball_mode.c | 82 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_surface_mode.c | 82 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_text_mode.c | 82 | ||||
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 349 | ||||
-rw-r--r-- | source/blender/draw/modes/paint_texture_mode.c | 82 | ||||
-rw-r--r-- | source/blender/draw/modes/paint_vertex_mode.c | 82 | ||||
-rw-r--r-- | source/blender/draw/modes/paint_weight_mode.c | 82 | ||||
-rw-r--r-- | source/blender/draw/modes/particle_mode.c | 76 | ||||
-rw-r--r-- | source/blender/draw/modes/pose_mode.c | 76 | ||||
-rw-r--r-- | source/blender/draw/modes/sculpt_mode.c | 76 |
16 files changed, 909 insertions, 856 deletions
diff --git a/source/blender/draw/engines/clay/clay.c b/source/blender/draw/engines/clay/clay.c index a40805a50c1..6a7e8d10f9c 100644 --- a/source/blender/draw/engines/clay/clay.c +++ b/source/blender/draw/engines/clay/clay.c @@ -44,7 +44,7 @@ extern char datatoc_clay_vert_glsl[]; extern char datatoc_ssao_alchemy_glsl[]; extern char datatoc_ssao_groundtruth_glsl[]; -/* Storage */ +/* *********** LISTS *********** */ /* UBOs data needs to be 16 byte aligned (size of vec4) */ /* Reminder : float, int, bool are 4 bytes */ @@ -64,24 +64,6 @@ typedef struct CLAY_UBO_Storage { CLAY_UBO_Material materials[MAX_CLAY_MAT]; } CLAY_UBO_Storage; -static struct CLAY_data { - /* Depth Pre Pass */ - struct GPUShader *depth_sh; - /* Shading Pass */ - struct GPUShader *clay_sh; - - /* Matcap textures */ - struct GPUTexture *matcap_array; - float matcap_colors[24][3]; - - /* Ssao */ - float winmat[4][4]; - float viewvecs[3][4]; - float ssao_params[4]; - struct GPUTexture *jitter_tx; - struct GPUTexture *sampling_tx; -} data = {NULL}; - /* GPUViewport.storage * Is freed everytime the viewport engine changes */ typedef struct CLAY_Storage { @@ -91,9 +73,6 @@ typedef struct CLAY_Storage { DRWShadingGroup *shgrps[MAX_CLAY_MAT]; } CLAY_Storage; -/* Just a serie of int from 0 to MAX_CLAY_MAT-1 */ -static int ubo_mat_idxs[MAX_CLAY_MAT] = {0}; - /* keep it under MAX_STORAGE */ typedef struct CLAY_StorageList { struct CLAY_Storage *storage; @@ -132,6 +111,38 @@ typedef struct CLAY_Data { CLAY_StorageList *stl; } CLAY_Data; +/* *********** STATIC *********** */ + +static struct { + /* Depth Pre Pass */ + struct GPUShader *depth_sh; + /* Shading Pass */ + struct GPUShader *clay_sh; + + /* Matcap textures */ + struct GPUTexture *matcap_array; + float matcap_colors[24][3]; + + /* Ssao */ + float winmat[4][4]; + float viewvecs[3][4]; + float ssao_params[4]; + struct GPUTexture *jitter_tx; + struct GPUTexture *sampling_tx; + + /* Just a serie of int from 0 to MAX_CLAY_MAT-1 */ + int ubo_mat_idxs[MAX_CLAY_MAT]; +} e_data = {NULL}; /* Engine data */ + +static struct { + 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 */ //#define GTAO @@ -148,15 +159,15 @@ static void add_icon_to_rect(PreviewImage *prv, float *final_rect, int layer) /* Find overall color */ for (int y = 0; y < 4; ++y) { for (int x = 0; x < 4; ++x) { - data.matcap_colors[layer][0] += new_rect[y * 512 * 128 * 4 + x * 128 * 4 + 0]; - data.matcap_colors[layer][1] += new_rect[y * 512 * 128 * 4 + x * 128 * 4 + 1]; - data.matcap_colors[layer][2] += new_rect[y * 512 * 128 * 4 + x * 128 * 4 + 2]; + e_data.matcap_colors[layer][0] += new_rect[y * 512 * 128 * 4 + x * 128 * 4 + 0]; + e_data.matcap_colors[layer][1] += new_rect[y * 512 * 128 * 4 + x * 128 * 4 + 1]; + e_data.matcap_colors[layer][2] += new_rect[y * 512 * 128 * 4 + x * 128 * 4 + 2]; } } - data.matcap_colors[layer][0] /= 16.0f * 2.0f; /* the * 2 is to darken for shadows */ - data.matcap_colors[layer][1] /= 16.0f * 2.0f; - data.matcap_colors[layer][2] /= 16.0f * 2.0f; + e_data.matcap_colors[layer][0] /= 16.0f * 2.0f; /* the * 2 is to darken for shadows */ + e_data.matcap_colors[layer][1] /= 16.0f * 2.0f; + e_data.matcap_colors[layer][2] /= 16.0f * 2.0f; } static struct GPUTexture *load_matcaps(PreviewImage *prv[24], int nbr) @@ -273,13 +284,13 @@ RenderEngineSettings *CLAY_render_settings_create(void) static void CLAY_engine_init(void) { - CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay"); - CLAY_StorageList *stl = vedata->stl; - CLAY_TextureList *txl = vedata->txl; - CLAY_FramebufferList *fbl = vedata->fbl; + CLAY_Data *ved = DRW_viewport_engine_data_get("Clay"); + CLAY_StorageList *stl = ved->stl; + CLAY_TextureList *txl = ved->txl; + CLAY_FramebufferList *fbl = ved->fbl; /* Create Texture Array */ - if (!data.matcap_array) { + if (!e_data.matcap_array) { PreviewImage *prv[24]; /* For now use all of the 24 internal matcaps */ /* TODO only load used matcaps */ @@ -308,27 +319,27 @@ static void CLAY_engine_init(void) prv[22] = UI_icon_to_preview(ICON_MATCAP_23); prv[23] = UI_icon_to_preview(ICON_MATCAP_24); - data.matcap_array = load_matcaps(prv, 24); + e_data.matcap_array = load_matcaps(prv, 24); } /* AO Jitter */ - if (!data.jitter_tx) { - data.jitter_tx = create_jitter_texture(); + if (!e_data.jitter_tx) { + e_data.jitter_tx = create_jitter_texture(); } /* AO Samples */ /* TODO use hammersley sequence */ - if (!data.sampling_tx) { - data.sampling_tx = create_spiral_sample_texture(500); + if (!e_data.sampling_tx) { + e_data.sampling_tx = create_spiral_sample_texture(500); } /* Depth prepass */ - if (!data.depth_sh) { - data.depth_sh = DRW_shader_create_3D_depth_only(); + if (!e_data.depth_sh) { + e_data.depth_sh = DRW_shader_create_3D_depth_only(); } /* Shading pass */ - if (!data.clay_sh) { + if (!e_data.clay_sh) { DynStr *ds = BLI_dynstr_new(); const char *max_mat = "#define MAX_MATERIAL 512\n" @@ -346,7 +357,7 @@ static void CLAY_engine_init(void) matcap_with_ao = BLI_dynstr_get_cstring(ds); - data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, max_mat); + e_data.clay_sh = DRW_shader_create(datatoc_clay_vert_glsl, NULL, matcap_with_ao, max_mat); BLI_dynstr_free(ds); MEM_freeN(matcap_with_ao); @@ -360,10 +371,10 @@ static void CLAY_engine_init(void) stl->mat_ubo = DRW_uniformbuffer_create(sizeof(CLAY_UBO_Storage), NULL); } - if (ubo_mat_idxs[1] == 0) { + if (e_data.ubo_mat_idxs[1] == 0) { /* Just int to have pointers to them */ for (int i = 0; i < MAX_CLAY_MAT; ++i) { - ubo_mat_idxs[i] = i; + e_data.ubo_mat_idxs[i] = i; } } @@ -392,14 +403,14 @@ static void CLAY_engine_init(void) DRW_get_dfdy_factors(dfdyfacs); - data.ssao_params[0] = settings->ssao_samples; - data.ssao_params[1] = size[0] / 64.0; - data.ssao_params[2] = size[1] / 64.0; - data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */ + e_data.ssao_params[0] = settings->ssao_samples; + e_data.ssao_params[1] = size[0] / 64.0; + e_data.ssao_params[2] = size[1] / 64.0; + e_data.ssao_params[3] = dfdyfacs[1]; /* dfdy sign for offscreen */ /* invert the view matrix */ - DRW_viewport_matrix_get(data.winmat, DRW_MAT_WIN); - invert_m4_m4(invproj, data.winmat); + DRW_viewport_matrix_get(e_data.winmat, DRW_MAT_WIN); + invert_m4_m4(invproj, e_data.winmat); /* convert the view vectors to view space */ for (i = 0; i < 3; i++) { @@ -410,19 +421,19 @@ static void CLAY_engine_init(void) mul_v3_fl(viewvecs[i], 1.0f / viewvecs[i][2]); viewvecs[i][3] = 1.0; - copy_v4_v4(data.viewvecs[i], viewvecs[i]); + copy_v4_v4(e_data.viewvecs[i], viewvecs[i]); } /* we need to store the differences */ - data.viewvecs[1][0] -= data.viewvecs[0][0]; - data.viewvecs[1][1] = data.viewvecs[2][1] - data.viewvecs[0][1]; + e_data.viewvecs[1][0] -= e_data.viewvecs[0][0]; + e_data.viewvecs[1][1] = e_data.viewvecs[2][1] - e_data.viewvecs[0][1]; /* calculate a depth offset as well */ if (!is_persp) { float vec_far[] = {-1.0f, -1.0f, 1.0f, 1.0f}; mul_m4_v4(invproj, vec_far); mul_v3_fl(vec_far, 1.0f / vec_far[3]); - data.viewvecs[1][2] = vec_far[2] - data.viewvecs[0][2]; + e_data.viewvecs[1][2] = vec_far[2] - e_data.viewvecs[0][2]; } } } @@ -433,21 +444,21 @@ static DRWShadingGroup *CLAY_shgroup_create(DRWPass *pass, int *material_id) CLAY_TextureList *txl = vedata->txl; const int depthloc = 0, matcaploc = 1, jitterloc = 2, sampleloc = 3; - DRWShadingGroup *grp = DRW_shgroup_create(data.clay_sh, pass); + DRWShadingGroup *grp = DRW_shgroup_create(e_data.clay_sh, pass); DRW_shgroup_uniform_vec2(grp, "screenres", DRW_viewport_size_get(), 1); DRW_shgroup_uniform_buffer(grp, "depthtex", &txl->depth_dup, depthloc); - DRW_shgroup_uniform_texture(grp, "matcaps", data.matcap_array, matcaploc); - DRW_shgroup_uniform_mat4(grp, "WinMatrix", (float *)data.winmat); - DRW_shgroup_uniform_vec4(grp, "viewvecs", (float *)data.viewvecs, 3); - DRW_shgroup_uniform_vec4(grp, "ssao_params", data.ssao_params, 1); - DRW_shgroup_uniform_vec3(grp, "matcaps_color", (float *)data.matcap_colors, 24); + DRW_shgroup_uniform_texture(grp, "matcaps", e_data.matcap_array, matcaploc); + DRW_shgroup_uniform_mat4(grp, "WinMatrix", (float *)e_data.winmat); + DRW_shgroup_uniform_vec4(grp, "viewvecs", (float *)e_data.viewvecs, 3); + DRW_shgroup_uniform_vec4(grp, "ssao_params", e_data.ssao_params, 1); + DRW_shgroup_uniform_vec3(grp, "matcaps_color", (float *)e_data.matcap_colors, 24); DRW_shgroup_uniform_int(grp, "mat_id", material_id, 1); #ifndef GTAO - DRW_shgroup_uniform_texture(grp, "ssao_jitter", data.jitter_tx, jitterloc); - DRW_shgroup_uniform_texture(grp, "ssao_samples", data.sampling_tx, sampleloc); + DRW_shgroup_uniform_texture(grp, "ssao_jitter", e_data.jitter_tx, jitterloc); + DRW_shgroup_uniform_texture(grp, "ssao_samples", e_data.sampling_tx, sampleloc); #endif return grp; @@ -586,7 +597,7 @@ static DRWShadingGroup *CLAY_object_shgrp_get(Object *ob, CLAY_StorageList *stl, ssao_attenuation, matcap_icon); if (shgrps[id] == NULL) { - shgrps[id] = CLAY_shgroup_create(psl->clay_pass, &ubo_mat_idxs[id]); + shgrps[id] = CLAY_shgroup_create(psl->clay_pass, &e_data.ubo_mat_idxs[id]); /* if it's the first shgrp, pass bind the material UBO */ if (stl->storage->ubo_current_id == 1) { DRW_shgroup_uniform_block(shgrps[0], "material_block", stl->mat_ubo, 0); @@ -596,38 +607,31 @@ static DRWShadingGroup *CLAY_object_shgrp_get(Object *ob, CLAY_StorageList *stl, return shgrps[id]; } -static DRWShadingGroup *depth_shgrp; -static DRWShadingGroup *depth_shgrp_select; -static DRWShadingGroup *depth_shgrp_active; -static DRWShadingGroup *depth_shgrp_cull; -static DRWShadingGroup *depth_shgrp_cull_select; -static DRWShadingGroup *depth_shgrp_cull_active; - static void CLAY_cache_init(void) { - CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay"); - CLAY_PassList *psl = vedata->psl; - CLAY_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("Clay"); + CLAY_PassList *psl = g_data.vedata->psl; + CLAY_StorageList *stl = g_data.vedata->stl; /* Depth Pass */ { psl->depth_pass = DRW_pass_create("Depth Pass", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS); - depth_shgrp = DRW_shgroup_create(data.depth_sh, psl->depth_pass); + g_data.depth_shgrp = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass); - depth_shgrp_select = DRW_shgroup_create(data.depth_sh, psl->depth_pass); - DRW_shgroup_state_set(depth_shgrp_select, DRW_STATE_WRITE_STENCIL_SELECT); + 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); - depth_shgrp_active = DRW_shgroup_create(data.depth_sh, psl->depth_pass); - DRW_shgroup_state_set(depth_shgrp_active, DRW_STATE_WRITE_STENCIL_ACTIVE); + 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); psl->depth_pass_cull = DRW_pass_create("Depth Pass Cull", DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_CULL_BACK); - depth_shgrp_cull = DRW_shgroup_create(data.depth_sh, psl->depth_pass_cull); + g_data.depth_shgrp_cull = DRW_shgroup_create(e_data.depth_sh, psl->depth_pass_cull); - depth_shgrp_cull_select = DRW_shgroup_create(data.depth_sh, psl->depth_pass_cull); - DRW_shgroup_state_set(depth_shgrp_cull_select, DRW_STATE_WRITE_STENCIL_SELECT); + 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); - depth_shgrp_cull_active = DRW_shgroup_create(data.depth_sh, psl->depth_pass_cull); - DRW_shgroup_state_set(depth_shgrp_cull_active, DRW_STATE_WRITE_STENCIL_ACTIVE); + 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); } /* Clay Pass */ @@ -640,9 +644,8 @@ static void CLAY_cache_init(void) static void CLAY_cache_populate(Object *ob) { - CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay"); - CLAY_PassList *psl = vedata->psl; - CLAY_StorageList *stl = vedata->stl; + CLAY_PassList *psl = g_data.vedata->psl; + CLAY_StorageList *stl = g_data.vedata->stl; struct Batch *geom; DRWShadingGroup *clay_shgrp; @@ -660,11 +663,11 @@ static void CLAY_cache_populate(Object *ob) /* Depth Prepass */ /* waiting for proper flag */ // if ((ob->base_flag & BASE_ACTIVE) != 0) - // DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull_active : depth_shgrp_active, geom, ob->obmat); + // DRW_shgroup_call_add((do_cull) ? g_data.depth_shgrp_cull_active : g_data.depth_shgrp_active, geom, ob->obmat); if ((ob->base_flag & BASE_SELECTED) != 0) - DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull_select : depth_shgrp_select, geom, ob->obmat); + DRW_shgroup_call_add((do_cull) ? g_data.depth_shgrp_cull_select : g_data.depth_shgrp_select, geom, ob->obmat); else - DRW_shgroup_call_add((do_cull) ? depth_shgrp_cull : depth_shgrp, geom, ob->obmat); + DRW_shgroup_call_add((do_cull) ? g_data.depth_shgrp_cull : g_data.depth_shgrp, geom, ob->obmat); /* Shading */ clay_shgrp = CLAY_object_shgrp_get(ob, stl, psl); @@ -674,17 +677,16 @@ static void CLAY_cache_populate(Object *ob) static void CLAY_cache_finish(void) { - CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay"); - CLAY_StorageList *stl = vedata->stl; + CLAY_StorageList *stl = g_data.vedata->stl; DRW_uniformbuffer_update(stl->mat_ubo, &stl->storage->mat_storage); } static void CLAY_draw_scene(void) { - CLAY_Data *vedata = DRW_viewport_engine_data_get("Clay"); - CLAY_PassList *psl = vedata->psl; - CLAY_FramebufferList *fbl = vedata->fbl; + CLAY_Data *ved = DRW_viewport_engine_data_get("Clay"); + CLAY_PassList *psl = ved->psl; + CLAY_FramebufferList *fbl = ved->fbl; DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); /* Pass 1 : Depth pre-pass */ @@ -716,17 +718,17 @@ static void CLAY_collection_settings_create(RenderEngine *UNUSED(engine), Collec static void CLAY_engine_free(void) { - if (data.clay_sh) { - DRW_shader_free(data.clay_sh); + if (e_data.clay_sh) { + DRW_shader_free(e_data.clay_sh); } - if (data.matcap_array) { - DRW_texture_free(data.matcap_array); + if (e_data.matcap_array) { + DRW_texture_free(e_data.matcap_array); } - if (data.jitter_tx) { - DRW_texture_free(data.jitter_tx); + if (e_data.jitter_tx) { + DRW_texture_free(e_data.jitter_tx); } - if (data.sampling_tx) { - DRW_texture_free(data.sampling_tx); + if (e_data.sampling_tx) { + DRW_texture_free(e_data.sampling_tx); } } diff --git a/source/blender/draw/engines/eevee/eevee.c b/source/blender/draw/engines/eevee/eevee.c index c85e35c904d..2f058e3e6e3 100644 --- a/source/blender/draw/engines/eevee/eevee.c +++ b/source/blender/draw/engines/eevee/eevee.c @@ -56,10 +56,10 @@ extern char datatoc_tonemap_frag_glsl[]; static void EEVEE_engine_init(void) { - g_data.vedata = DRW_viewport_engine_data_get(EEVEE_ENGINE); - EEVEE_TextureList *txl = g_data.vedata->txl; - EEVEE_FramebufferList *fbl = g_data.vedata->fbl; - EEVEE_StorageList *stl = g_data.vedata->stl; + EEVEE_Data *ved = DRW_viewport_engine_data_get(EEVEE_ENGINE); + EEVEE_TextureList *txl = ved->txl; + EEVEE_FramebufferList *fbl = ved->fbl; + EEVEE_StorageList *stl = ved->stl; DRWFboTexture tex = {&txl->color, DRW_BUF_RGBA_32}; diff --git a/source/blender/draw/modes/edit_armature_mode.c b/source/blender/draw/modes/edit_armature_mode.c index d6193986c7f..c56bbe519da 100644 --- a/source/blender/draw/modes/edit_armature_mode.c +++ b/source/blender/draw/modes/edit_armature_mode.c @@ -32,6 +32,9 @@ #include "draw_mode_engines.h" +extern GlobalsUboStorage ts; + +/* *********** LISTS *********** */ /* keep it under MAX_PASSES */ typedef struct EDIT_ARMATURE_PassList { struct DRWPass *bone_solid; @@ -47,16 +50,19 @@ typedef struct EDIT_ARMATURE_Data { void *stl; } EDIT_ARMATURE_Data; -static DRWShadingGroup *relationship_lines; +/* *********** STATIC *********** */ -extern GlobalsUboStorage ts; +static struct { + DRWShadingGroup *relationship_lines; + EDIT_ARMATURE_Data *vedata; +} g_data = {NULL}; /* Transient data */ -static EDIT_ARMATURE_Data *vedata; +/* *********** FUNCTIONS *********** */ static void EDIT_ARMATURE_cache_init(void) { - vedata = DRW_viewport_engine_data_get("EditArmatureMode"); - EDIT_ARMATURE_PassList *psl = vedata->psl; + g_data.vedata = DRW_viewport_engine_data_get("EditArmatureMode"); + EDIT_ARMATURE_PassList *psl = g_data.vedata->psl; { /* Solid bones */ @@ -76,20 +82,19 @@ static void EDIT_ARMATURE_cache_init(void) psl->relationship = DRW_pass_create("Bone Relationship Pass", state); /* Relationship Lines */ - relationship_lines = shgroup_dynlines_uniform_color(psl->relationship, ts.colorWire); - DRW_shgroup_state_set(relationship_lines, DRW_STATE_STIPPLE_3); + g_data.relationship_lines = shgroup_dynlines_uniform_color(psl->relationship, ts.colorWire); + DRW_shgroup_state_set(g_data.relationship_lines, DRW_STATE_STIPPLE_3); } - } static void EDIT_ARMATURE_cache_populate(Object *ob) { bArmature *arm = ob->data; - EDIT_ARMATURE_PassList *psl = vedata->psl; + EDIT_ARMATURE_PassList *psl = g_data.vedata->psl; if (ob->type == OB_ARMATURE) { if (arm->edbo) { - DRW_shgroup_armature_edit(ob, psl->bone_solid, psl->bone_wire, relationship_lines); + DRW_shgroup_armature_edit(ob, psl->bone_solid, psl->bone_wire, 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 49b48396613..745342a4f19 100644 --- a/source/blender/draw/modes/edit_curve_mode.c +++ b/source/blender/draw/modes/edit_curve_mode.c @@ -33,6 +33,12 @@ #include "draw_mode_engines.h" +/* If needed, contains all global/Theme colors + * Add needed theme colors / values to DRW_globals_update() and update UBO + * Not needed for constant color. */ +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -85,26 +91,24 @@ typedef struct EDIT_CURVE_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in EDIT_CURVE_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in EDIT_CURVE_engine_init(); - * free in EDIT_CURVE_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static EDIT_CURVE_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in EDIT_CURVE_engine_init(); + * free in EDIT_CURVE_engine_free(); */ + 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; + + /* This keeps the references of the shading groups for + * easy access in EDIT_CURVE_cache_populate() */ + DRWShadingGroup *group; +} g_data = {NULL}; /* Transient data */ /* *********** FUNCTIONS *********** */ @@ -113,10 +117,10 @@ static EDIT_CURVE_Data *vedata; * (Optional) */ static void EDIT_CURVE_engine_init(void) { - vedata = DRW_viewport_engine_data_get("EditCurveMode"); - EDIT_CURVE_TextureList *txl = vedata->txl; - EDIT_CURVE_FramebufferList *fbl = vedata->fbl; - EDIT_CURVE_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("EditCurveMode"); + EDIT_CURVE_TextureList *txl = g_data.vedata->txl; + EDIT_CURVE_FramebufferList *fbl = g_data.vedata->fbl; + EDIT_CURVE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +139,8 @@ static void EDIT_CURVE_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +148,9 @@ static void EDIT_CURVE_engine_init(void) * Assume that all Passes are NULL */ static void EDIT_CURVE_cache_init(void) { - vedata = DRW_viewport_engine_data_get("EditCurveMode"); - EDIT_CURVE_PassList *psl = vedata->psl; - EDIT_CURVE_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("EditCurveMode"); + EDIT_CURVE_PassList *psl = g_data.vedata->psl; + EDIT_CURVE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +161,16 @@ static void EDIT_CURVE_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +178,8 @@ static void EDIT_CURVE_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void EDIT_CURVE_cache_populate(Object *ob) { - EDIT_CURVE_PassList *psl = vedata->psl; - EDIT_CURVE_StorageList *stl = vedata->stl; + EDIT_CURVE_PassList *psl = g_data.vedata->psl; + EDIT_CURVE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +188,15 @@ static void EDIT_CURVE_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void EDIT_CURVE_cache_finish(void) { - EDIT_CURVE_PassList *psl = vedata->psl; - EDIT_CURVE_StorageList *stl = vedata->stl; + EDIT_CURVE_PassList *psl = g_data.vedata->psl; + EDIT_CURVE_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +207,7 @@ static void EDIT_CURVE_draw_scene(void) { EDIT_CURVE_Data *ved = DRW_viewport_engine_data_get("EditCurveMode"); EDIT_CURVE_PassList *psl = ved->psl; - EDIT_CURVE_FramebufferList *fbl = vedata->fbl; + EDIT_CURVE_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c index e8bf1d92701..30603c2bfc3 100644 --- a/source/blender/draw/modes/edit_lattice_mode.c +++ b/source/blender/draw/modes/edit_lattice_mode.c @@ -33,6 +33,12 @@ #include "draw_mode_engines.h" +/* If needed, contains all global/Theme colors + * Add needed theme colors / values to DRW_globals_update() and update UBO + * Not needed for constant color. */ +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -85,26 +91,24 @@ typedef struct EDIT_LATTICE_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in EDIT_LATTICE_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in EDIT_LATTICE_engine_init(); - * free in EDIT_LATTICE_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static EDIT_LATTICE_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in EDIT_LATTICE_engine_init(); + * free in EDIT_LATTICE_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +117,10 @@ static EDIT_LATTICE_Data *vedata; * (Optional) */ static void EDIT_LATTICE_engine_init(void) { - vedata = DRW_viewport_engine_data_get("EditLatticeMode"); - EDIT_LATTICE_TextureList *txl = vedata->txl; - EDIT_LATTICE_FramebufferList *fbl = vedata->fbl; - EDIT_LATTICE_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("EditLatticeMode"); + EDIT_LATTICE_TextureList *txl = g_data.vedata->txl; + EDIT_LATTICE_FramebufferList *fbl = g_data.vedata->fbl; + EDIT_LATTICE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +139,8 @@ static void EDIT_LATTICE_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +148,9 @@ static void EDIT_LATTICE_engine_init(void) * Assume that all Passes are NULL */ static void EDIT_LATTICE_cache_init(void) { - vedata = DRW_viewport_engine_data_get("EditLatticeMode"); - EDIT_LATTICE_PassList *psl = vedata->psl; - EDIT_LATTICE_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("EditLatticeMode"); + EDIT_LATTICE_PassList *psl = g_data.vedata->psl; + EDIT_LATTICE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +161,16 @@ static void EDIT_LATTICE_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +178,8 @@ static void EDIT_LATTICE_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void EDIT_LATTICE_cache_populate(Object *ob) { - EDIT_LATTICE_PassList *psl = vedata->psl; - EDIT_LATTICE_StorageList *stl = vedata->stl; + EDIT_LATTICE_PassList *psl = g_data.vedata->psl; + EDIT_LATTICE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +188,15 @@ static void EDIT_LATTICE_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void EDIT_LATTICE_cache_finish(void) { - EDIT_LATTICE_PassList *psl = vedata->psl; - EDIT_LATTICE_StorageList *stl = vedata->stl; + EDIT_LATTICE_PassList *psl = g_data.vedata->psl; + EDIT_LATTICE_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +207,7 @@ static void EDIT_LATTICE_draw_scene(void) { EDIT_LATTICE_Data *ved = DRW_viewport_engine_data_get("EditLatticeMode"); EDIT_LATTICE_PassList *psl = ved->psl; - EDIT_LATTICE_FramebufferList *fbl = vedata->fbl; + EDIT_LATTICE_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c index b0e1dc1d022..fee2a284d64 100644 --- a/source/blender/draw/modes/edit_mesh_mode.c +++ b/source/blender/draw/modes/edit_mesh_mode.c @@ -33,6 +33,26 @@ #include "draw_mode_engines.h" +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + +extern char datatoc_edit_overlay_frag_glsl[]; +extern char datatoc_edit_overlay_vert_glsl[]; +extern char datatoc_edit_overlay_geom_tri_glsl[]; +extern char datatoc_edit_overlay_geom_edge_glsl[]; +extern char datatoc_edit_overlay_loosevert_vert_glsl[]; +extern char datatoc_edit_overlay_facedot_frag_glsl[]; +extern char datatoc_edit_overlay_facedot_vert_glsl[]; +extern char datatoc_edit_overlay_mix_vert_glsl[]; +extern char datatoc_edit_overlay_mix_frag_glsl[]; +extern char datatoc_edit_overlay_facefill_vert_glsl[]; +extern char datatoc_edit_overlay_facefill_frag_glsl[]; +extern char datatoc_edit_normals_vert_glsl[]; +extern char datatoc_edit_normals_geom_glsl[]; + +extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; + +/* *********** LISTS *********** */ /* keep it under MAX_PASSES */ typedef struct EDIT_MESH_PassList { struct DRWPass *depth_hidden_wire; @@ -62,61 +82,52 @@ typedef struct EDIT_MESH_Data { void *stl; } EDIT_MESH_Data; -static DRWShadingGroup *depth_shgrp_hidden_wire; - -static DRWShadingGroup *fnormals_shgrp; -static DRWShadingGroup *vnormals_shgrp; -static DRWShadingGroup *lnormals_shgrp; - -static DRWShadingGroup *face_overlay_shgrp; -static DRWShadingGroup *ledges_overlay_shgrp; -static DRWShadingGroup *lverts_overlay_shgrp; -static DRWShadingGroup *facedot_overlay_shgrp; - -static DRWShadingGroup *face_occluded_shgrp; -static DRWShadingGroup *ledges_occluded_shgrp; -static DRWShadingGroup *lverts_occluded_shgrp; -static DRWShadingGroup *facedot_occluded_shgrp; -static DRWShadingGroup *facefill_occluded_shgrp; - -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -static struct GPUShader *overlay_tri_sh = NULL; -static struct GPUShader *overlay_tri_fast_sh = NULL; -static struct GPUShader *overlay_tri_vcol_sh = NULL; -static struct GPUShader *overlay_tri_vcol_fast_sh = NULL; -static struct GPUShader *overlay_edge_sh = NULL; -static struct GPUShader *overlay_edge_vcol_sh = NULL; -static struct GPUShader *overlay_vert_sh = NULL; -static struct GPUShader *overlay_facedot_sh = NULL; -static struct GPUShader *overlay_mix_sh = NULL; -static struct GPUShader *overlay_facefill_sh = NULL; -static struct GPUShader *normals_face_sh = NULL; -static struct GPUShader *normals_sh = NULL; -static struct GPUShader *depth_sh = NULL; - -extern char datatoc_edit_overlay_frag_glsl[]; -extern char datatoc_edit_overlay_vert_glsl[]; -extern char datatoc_edit_overlay_geom_tri_glsl[]; -extern char datatoc_edit_overlay_geom_edge_glsl[]; -extern char datatoc_edit_overlay_loosevert_vert_glsl[]; -extern char datatoc_edit_overlay_facedot_frag_glsl[]; -extern char datatoc_edit_overlay_facedot_vert_glsl[]; -extern char datatoc_edit_overlay_mix_vert_glsl[]; -extern char datatoc_edit_overlay_mix_frag_glsl[]; -extern char datatoc_edit_overlay_facefill_vert_glsl[]; -extern char datatoc_edit_overlay_facefill_frag_glsl[]; -extern char datatoc_edit_normals_vert_glsl[]; -extern char datatoc_edit_normals_geom_glsl[]; - -extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; +/* *********** STATIC *********** */ + +static struct { + struct GPUShader *overlay_tri_sh; + struct GPUShader *overlay_tri_fast_sh; + struct GPUShader *overlay_tri_vcol_sh; + struct GPUShader *overlay_tri_vcol_fast_sh; + struct GPUShader *overlay_edge_sh; + struct GPUShader *overlay_edge_vcol_sh; + struct GPUShader *overlay_vert_sh; + struct GPUShader *overlay_facedot_sh; + struct GPUShader *overlay_mix_sh; + struct GPUShader *overlay_facefill_sh; + struct GPUShader *normals_face_sh; + struct GPUShader *normals_sh; + struct GPUShader *depth_sh; +} e_data = {NULL}; /* Engine data */ + +static struct { + DRWShadingGroup *depth_shgrp_hidden_wire; + + DRWShadingGroup *fnormals_shgrp; + DRWShadingGroup *vnormals_shgrp; + DRWShadingGroup *lnormals_shgrp; + + DRWShadingGroup *face_overlay_shgrp; + DRWShadingGroup *ledges_overlay_shgrp; + DRWShadingGroup *lverts_overlay_shgrp; + DRWShadingGroup *facedot_overlay_shgrp; + + DRWShadingGroup *face_occluded_shgrp; + DRWShadingGroup *ledges_occluded_shgrp; + DRWShadingGroup *lverts_occluded_shgrp; + DRWShadingGroup *facedot_occluded_shgrp; + DRWShadingGroup *facefill_occluded_shgrp; + + EDIT_MESH_Data *vedata; +} g_data = {NULL}; /* Transient data */ + +/* *********** FUNCTIONS *********** */ static void EDIT_MESH_engine_init(void) { - EDIT_MESH_Data *vedata = DRW_viewport_engine_data_get("EditMeshMode"); - EDIT_MESH_TextureList *txl = vedata->txl; - EDIT_MESH_FramebufferList *fbl = vedata->fbl; + EDIT_MESH_Data *ved = DRW_viewport_engine_data_get("EditMeshMode"); + EDIT_MESH_TextureList *txl = ved->txl; + EDIT_MESH_FramebufferList *fbl = ved->fbl; float *viewport_size = DRW_viewport_size_get(); @@ -126,62 +137,62 @@ static void EDIT_MESH_engine_init(void) (int)viewport_size[0], (int)viewport_size[1], tex, 2); - if (!overlay_tri_sh) { - overlay_tri_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, + if (!e_data.overlay_tri_sh) { + e_data.overlay_tri_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, datatoc_edit_overlay_geom_tri_glsl, datatoc_edit_overlay_frag_glsl, "#define EDGE_FIX\n"); } - if (!overlay_tri_fast_sh) { - overlay_tri_fast_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, + if (!e_data.overlay_tri_fast_sh) { + e_data.overlay_tri_fast_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, datatoc_edit_overlay_geom_tri_glsl, datatoc_edit_overlay_frag_glsl, NULL); } - if (!overlay_tri_vcol_sh) { - overlay_tri_vcol_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, + if (!e_data.overlay_tri_vcol_sh) { + e_data.overlay_tri_vcol_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, datatoc_edit_overlay_geom_tri_glsl, datatoc_edit_overlay_frag_glsl, "#define EDGE_FIX\n" "#define VERTEX_SELECTION\n"); } - if (!overlay_tri_vcol_fast_sh) { - overlay_tri_vcol_fast_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, + if (!e_data.overlay_tri_vcol_fast_sh) { + e_data.overlay_tri_vcol_fast_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, datatoc_edit_overlay_geom_tri_glsl, datatoc_edit_overlay_frag_glsl, "#define VERTEX_SELECTION\n"); } - if (!overlay_edge_sh) { - overlay_edge_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, + if (!e_data.overlay_edge_sh) { + e_data.overlay_edge_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, datatoc_edit_overlay_geom_edge_glsl, datatoc_edit_overlay_frag_glsl, NULL); } - if (!overlay_edge_vcol_sh) { - overlay_edge_vcol_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, + if (!e_data.overlay_edge_vcol_sh) { + e_data.overlay_edge_vcol_sh = DRW_shader_create(datatoc_edit_overlay_vert_glsl, datatoc_edit_overlay_geom_edge_glsl, datatoc_edit_overlay_frag_glsl, "#define VERTEX_SELECTION\n"); } - if (!overlay_vert_sh) { - overlay_vert_sh = DRW_shader_create(datatoc_edit_overlay_loosevert_vert_glsl, NULL, + if (!e_data.overlay_vert_sh) { + e_data.overlay_vert_sh = DRW_shader_create(datatoc_edit_overlay_loosevert_vert_glsl, NULL, datatoc_edit_overlay_frag_glsl, "#define VERTEX_SELECTION\n"); } - if (!overlay_facedot_sh) { - overlay_facedot_sh = DRW_shader_create(datatoc_edit_overlay_facedot_vert_glsl, NULL, + if (!e_data.overlay_facedot_sh) { + e_data.overlay_facedot_sh = DRW_shader_create(datatoc_edit_overlay_facedot_vert_glsl, NULL, datatoc_edit_overlay_facedot_frag_glsl, NULL); } - if (!overlay_mix_sh) { - overlay_mix_sh = DRW_shader_create_fullscreen(datatoc_edit_overlay_mix_frag_glsl, NULL); + if (!e_data.overlay_mix_sh) { + e_data.overlay_mix_sh = DRW_shader_create_fullscreen(datatoc_edit_overlay_mix_frag_glsl, NULL); } - if (!overlay_facefill_sh) { - overlay_facefill_sh = DRW_shader_create(datatoc_edit_overlay_facefill_vert_glsl, NULL, + if (!e_data.overlay_facefill_sh) { + e_data.overlay_facefill_sh = DRW_shader_create(datatoc_edit_overlay_facefill_vert_glsl, NULL, datatoc_edit_overlay_facefill_frag_glsl, NULL); } - if (!normals_face_sh) { - normals_face_sh = DRW_shader_create(datatoc_edit_normals_vert_glsl, datatoc_edit_normals_geom_glsl, + if (!e_data.normals_face_sh) { + e_data.normals_face_sh = DRW_shader_create(datatoc_edit_normals_vert_glsl, datatoc_edit_normals_geom_glsl, datatoc_gpu_shader_uniform_color_frag_glsl, "#define FACE_NORMALS\n"); } - if (!normals_sh) { - normals_sh = DRW_shader_create(datatoc_edit_normals_vert_glsl, datatoc_edit_normals_geom_glsl, + if (!e_data.normals_sh) { + e_data.normals_sh = DRW_shader_create(datatoc_edit_normals_vert_glsl, datatoc_edit_normals_geom_glsl, datatoc_gpu_shader_uniform_color_frag_glsl, NULL); } - if (!depth_sh) { - depth_sh = DRW_shader_create_3D_depth_only(); + if (!e_data.depth_sh) { + e_data.depth_sh = DRW_shader_create_3D_depth_only(); } } @@ -196,20 +207,20 @@ static DRWPass *edit_mesh_create_overlay_pass(DRWShadingGroup **face_shgrp, DRWS ToolSettings *tsettings = scene->toolsettings; if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) { - ledge_sh = overlay_edge_vcol_sh; + ledge_sh = e_data.overlay_edge_vcol_sh; if ((rv3d->rflag & RV3D_NAVIGATING) != 0) - tri_sh = overlay_tri_vcol_fast_sh; + tri_sh = e_data.overlay_tri_vcol_fast_sh; else - tri_sh = overlay_tri_vcol_sh; + tri_sh = e_data.overlay_tri_vcol_sh; } else { - ledge_sh = overlay_edge_sh; + ledge_sh = e_data.overlay_edge_sh; if ((rv3d->rflag & RV3D_NAVIGATING) != 0) - tri_sh = overlay_tri_fast_sh; + tri_sh = e_data.overlay_tri_fast_sh; else - tri_sh = overlay_tri_sh; + tri_sh = e_data.overlay_tri_sh; } DRWPass *pass = DRW_pass_create("Edit Mesh Face Overlay Pass", DRW_STATE_WRITE_COLOR | DRW_STATE_POINT | statemod); @@ -223,12 +234,12 @@ static DRWPass *edit_mesh_create_overlay_pass(DRWShadingGroup **face_shgrp, DRWS DRW_shgroup_uniform_vec2(*ledges_shgrp, "viewportSize", DRW_viewport_size_get(), 1); if ((tsettings->selectmode & (SCE_SELECT_VERTEX)) != 0) { - *lverts_shgrp = DRW_shgroup_create(overlay_vert_sh, pass); + *lverts_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, pass); DRW_shgroup_uniform_vec2(*lverts_shgrp, "viewportSize", DRW_viewport_size_get(), 1); } if ((tsettings->selectmode & (SCE_SELECT_FACE)) != 0) { - *facedot_shgrp = DRW_shgroup_create(overlay_facedot_sh, pass); + *facedot_shgrp = DRW_shgroup_create(e_data.overlay_facedot_sh, pass); } return pass; @@ -240,9 +251,9 @@ static float size_normal; static void EDIT_MESH_cache_init(void) { - EDIT_MESH_Data *vedata = DRW_viewport_engine_data_get("EditMeshMode"); - EDIT_MESH_TextureList *txl = vedata->txl; - EDIT_MESH_PassList *psl = vedata->psl; + g_data.vedata = DRW_viewport_engine_data_get("EditMeshMode"); + EDIT_MESH_TextureList *txl = g_data.vedata->txl; + EDIT_MESH_PassList *psl = g_data.vedata->psl; DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); const struct bContext *C = DRW_get_context(); @@ -255,47 +266,47 @@ static void EDIT_MESH_cache_init(void) { /* 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); - depth_shgrp_hidden_wire = DRW_shgroup_create(depth_sh, psl->depth_hidden_wire); + 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); - fnormals_shgrp = DRW_shgroup_create(normals_face_sh, psl->normals); - DRW_shgroup_uniform_float(fnormals_shgrp, "normalSize", &size_normal, 1); - DRW_shgroup_uniform_vec4(fnormals_shgrp, "color", ts.colorNormal, 1); + 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); - vnormals_shgrp = DRW_shgroup_create(normals_sh, psl->normals); - DRW_shgroup_uniform_float(vnormals_shgrp, "normalSize", &size_normal, 1); - DRW_shgroup_uniform_vec4(vnormals_shgrp, "color", ts.colorVNormal, 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); - lnormals_shgrp = DRW_shgroup_create(normals_sh, psl->normals); - DRW_shgroup_uniform_float(lnormals_shgrp, "normalSize", &size_normal, 1); - DRW_shgroup_uniform_vec4(lnormals_shgrp, "color", ts.colorLNormal, 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); } if (!do_zbufclip) { - psl->edit_face_overlay = edit_mesh_create_overlay_pass(&face_overlay_shgrp, &ledges_overlay_shgrp, &lverts_overlay_shgrp, - &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(&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); } 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(&face_occluded_shgrp, &ledges_occluded_shgrp, &lverts_occluded_shgrp, - &facedot_occluded_shgrp, &zero, DRW_STATE_DEPTH_LESS | DRW_STATE_WRITE_DEPTH); + 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); /* 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); - facefill_occluded_shgrp = DRW_shgroup_create(overlay_facefill_sh, psl->facefill_occlude); - DRW_shgroup_uniform_block(facefill_occluded_shgrp, "globalsBlock", globals_ubo, 0); + 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); /* we need a full screen pass to combine the result */ struct Batch *quad = DRW_cache_fullscreen_quad_get(); static float mat[4][4]; /* not even used but avoid crash */ psl->mix_occlude = DRW_pass_create("Mix Occluded Wires", DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND); - DRWShadingGroup *mix_shgrp = DRW_shgroup_create(overlay_mix_sh, psl->mix_occlude); + DRWShadingGroup *mix_shgrp = DRW_shgroup_create(e_data.overlay_mix_sh, psl->mix_occlude); DRW_shgroup_call_add(mix_shgrp, quad, mat); DRW_shgroup_uniform_float(mix_shgrp, "alpha", &backwire_opacity, 1); DRW_shgroup_uniform_buffer(mix_shgrp, "wireColor", &txl->occlude_wire_color_tx, 0); @@ -349,31 +360,31 @@ static void EDIT_MESH_cache_populate(Object *ob) if (do_occlude_wire) { geom = DRW_cache_surface_get(ob); - DRW_shgroup_call_add(depth_shgrp_hidden_wire, geom, ob->obmat); + DRW_shgroup_call_add(g_data.depth_shgrp_hidden_wire, geom, ob->obmat); } if (fnormals_do) { geom = DRW_cache_face_centers_get(ob); - DRW_shgroup_call_add(fnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(g_data.fnormals_shgrp, geom, ob->obmat); } if (vnormals_do) { geom = DRW_cache_verts_get(ob); - DRW_shgroup_call_add(vnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(g_data.vnormals_shgrp, geom, ob->obmat); } if (lnormals_do) { geom = DRW_cache_surface_verts_get(ob); - DRW_shgroup_call_add(lnormals_shgrp, geom, ob->obmat); + DRW_shgroup_call_add(g_data.lnormals_shgrp, geom, ob->obmat); } if ((v3d->flag & V3D_ZBUF_SELECT) == 0) { - edit_mesh_add_ob_to_pass(scene, ob, face_occluded_shgrp, ledges_occluded_shgrp, - lverts_occluded_shgrp, facedot_occluded_shgrp, facefill_occluded_shgrp); + 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); } else { - edit_mesh_add_ob_to_pass(scene, ob, face_overlay_shgrp, ledges_overlay_shgrp, - lverts_overlay_shgrp, facedot_overlay_shgrp, NULL); + 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); } } } @@ -381,9 +392,9 @@ static void EDIT_MESH_cache_populate(Object *ob) static void EDIT_MESH_draw_scene(void) { - EDIT_MESH_Data *vedata = DRW_viewport_engine_data_get("EditMeshMode"); - EDIT_MESH_PassList *psl = vedata->psl; - EDIT_MESH_FramebufferList *fbl = vedata->fbl; + EDIT_MESH_Data *ved = DRW_viewport_engine_data_get("EditMeshMode"); + EDIT_MESH_PassList *psl = ved->psl; + EDIT_MESH_FramebufferList *fbl = ved->fbl; DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); @@ -429,30 +440,30 @@ void EDIT_MESH_collection_settings_create(CollectionEngineSettings *ces) static void EDIT_MESH_engine_free(void) { - if (overlay_tri_sh) - DRW_shader_free(overlay_tri_sh); - if (overlay_tri_fast_sh) - DRW_shader_free(overlay_tri_fast_sh); - if (overlay_tri_vcol_sh) - DRW_shader_free(overlay_tri_vcol_sh); - if (overlay_tri_vcol_fast_sh) - DRW_shader_free(overlay_tri_vcol_fast_sh); - if (overlay_edge_sh) - DRW_shader_free(overlay_edge_sh); - if (overlay_edge_vcol_sh) - DRW_shader_free(overlay_edge_vcol_sh); - if (overlay_vert_sh) - DRW_shader_free(overlay_vert_sh); - if (overlay_facedot_sh) - DRW_shader_free(overlay_facedot_sh); - if (overlay_mix_sh) - DRW_shader_free(overlay_mix_sh); - if (overlay_facefill_sh) - DRW_shader_free(overlay_facefill_sh); - if (normals_face_sh) - DRW_shader_free(normals_face_sh); - if (normals_sh) - DRW_shader_free(normals_sh); + if (e_data.overlay_tri_sh) + DRW_shader_free(e_data.overlay_tri_sh); + if (e_data.overlay_tri_fast_sh) + DRW_shader_free(e_data.overlay_tri_fast_sh); + if (e_data.overlay_tri_vcol_sh) + DRW_shader_free(e_data.overlay_tri_vcol_sh); + if (e_data.overlay_tri_vcol_fast_sh) + DRW_shader_free(e_data.overlay_tri_vcol_fast_sh); + if (e_data.overlay_edge_sh) + DRW_shader_free(e_data.overlay_edge_sh); + if (e_data.overlay_edge_vcol_sh) + DRW_shader_free(e_data.overlay_edge_vcol_sh); + if (e_data.overlay_vert_sh) + DRW_shader_free(e_data.overlay_vert_sh); + if (e_data.overlay_facedot_sh) + DRW_shader_free(e_data.overlay_facedot_sh); + if (e_data.overlay_mix_sh) + DRW_shader_free(e_data.overlay_mix_sh); + if (e_data.overlay_facefill_sh) + DRW_shader_free(e_data.overlay_facefill_sh); + if (e_data.normals_face_sh) + DRW_shader_free(e_data.normals_face_sh); + if (e_data.normals_sh) + DRW_shader_free(e_data.normals_sh); } DrawEngineType draw_engine_edit_mesh_type = { diff --git a/source/blender/draw/modes/edit_metaball_mode.c b/source/blender/draw/modes/edit_metaball_mode.c index afb08abf0e8..6f3e11be4a7 100644 --- a/source/blender/draw/modes/edit_metaball_mode.c +++ b/source/blender/draw/modes/edit_metaball_mode.c @@ -33,6 +33,12 @@ #include "draw_mode_engines.h" +/* If needed, contains all global/Theme colors + * Add needed theme colors / values to DRW_globals_update() and update UBO + * Not needed for constant color. */ +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -85,26 +91,24 @@ typedef struct EDIT_METABALL_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in EDIT_METABALL_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in EDIT_METABALL_engine_init(); - * free in EDIT_METABALL_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static EDIT_METABALL_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in EDIT_METABALL_engine_init(); + * free in EDIT_METABALL_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +117,10 @@ static EDIT_METABALL_Data *vedata; * (Optional) */ static void EDIT_METABALL_engine_init(void) { - vedata = DRW_viewport_engine_data_get("EditMetaballMode"); - EDIT_METABALL_TextureList *txl = vedata->txl; - EDIT_METABALL_FramebufferList *fbl = vedata->fbl; - EDIT_METABALL_StorageList *stl = vedata->stl; + EDIT_METABALL_Data *ved = DRW_viewport_engine_data_get("EditMetaballMode"); + EDIT_METABALL_TextureList *txl = ved->txl; + EDIT_METABALL_FramebufferList *fbl = ved->fbl; + EDIT_METABALL_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +139,8 @@ static void EDIT_METABALL_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +148,9 @@ static void EDIT_METABALL_engine_init(void) * Assume that all Passes are NULL */ static void EDIT_METABALL_cache_init(void) { - vedata = DRW_viewport_engine_data_get("EditMetaballMode"); - EDIT_METABALL_PassList *psl = vedata->psl; - EDIT_METABALL_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("EditMetaballMode"); + EDIT_METABALL_PassList *psl = g_data.vedata->psl; + EDIT_METABALL_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +161,16 @@ static void EDIT_METABALL_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +178,8 @@ static void EDIT_METABALL_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void EDIT_METABALL_cache_populate(Object *ob) { - EDIT_METABALL_PassList *psl = vedata->psl; - EDIT_METABALL_StorageList *stl = vedata->stl; + EDIT_METABALL_PassList *psl = g_data.vedata->psl; + EDIT_METABALL_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +188,15 @@ static void EDIT_METABALL_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void EDIT_METABALL_cache_finish(void) { - EDIT_METABALL_PassList *psl = vedata->psl; - EDIT_METABALL_StorageList *stl = vedata->stl; + EDIT_METABALL_PassList *psl = g_data.vedata->psl; + EDIT_METABALL_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +207,7 @@ static void EDIT_METABALL_draw_scene(void) { EDIT_METABALL_Data *ved = DRW_viewport_engine_data_get("EditMetaballMode"); EDIT_METABALL_PassList *psl = ved->psl; - EDIT_METABALL_FramebufferList *fbl = vedata->fbl; + EDIT_METABALL_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/edit_surface_mode.c b/source/blender/draw/modes/edit_surface_mode.c index c3904ad3bab..286ba7f9818 100644 --- a/source/blender/draw/modes/edit_surface_mode.c +++ b/source/blender/draw/modes/edit_surface_mode.c @@ -33,6 +33,12 @@ #include "draw_mode_engines.h" +/* If needed, contains all global/Theme colors + * Add needed theme colors / values to DRW_globals_update() and update UBO + * Not needed for constant color. */ +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -85,26 +91,24 @@ typedef struct EDIT_SURFACE_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in EDIT_SURFACE_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in EDIT_SURFACE_engine_init(); - * free in EDIT_SURFACE_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static EDIT_SURFACE_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in EDIT_SURFACE_engine_init(); + * free in EDIT_SURFACE_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +117,10 @@ static EDIT_SURFACE_Data *vedata; * (Optional) */ static void EDIT_SURFACE_engine_init(void) { - vedata = DRW_viewport_engine_data_get("EditSurfaceMode"); - EDIT_SURFACE_TextureList *txl = vedata->txl; - EDIT_SURFACE_FramebufferList *fbl = vedata->fbl; - EDIT_SURFACE_StorageList *stl = vedata->stl; + EDIT_SURFACE_Data *ved = DRW_viewport_engine_data_get("EditSurfaceMode"); + EDIT_SURFACE_TextureList *txl = ved->txl; + EDIT_SURFACE_FramebufferList *fbl = ved->fbl; + EDIT_SURFACE_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +139,8 @@ static void EDIT_SURFACE_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +148,9 @@ static void EDIT_SURFACE_engine_init(void) * Assume that all Passes are NULL */ static void EDIT_SURFACE_cache_init(void) { - vedata = DRW_viewport_engine_data_get("EditSurfaceMode"); - EDIT_SURFACE_PassList *psl = vedata->psl; - EDIT_SURFACE_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("EditSurfaceMode"); + EDIT_SURFACE_PassList *psl = g_data.vedata->psl; + EDIT_SURFACE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +161,16 @@ static void EDIT_SURFACE_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +178,8 @@ static void EDIT_SURFACE_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void EDIT_SURFACE_cache_populate(Object *ob) { - EDIT_SURFACE_PassList *psl = vedata->psl; - EDIT_SURFACE_StorageList *stl = vedata->stl; + EDIT_SURFACE_PassList *psl = g_data.vedata->psl; + EDIT_SURFACE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +188,15 @@ static void EDIT_SURFACE_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void EDIT_SURFACE_cache_finish(void) { - EDIT_SURFACE_PassList *psl = vedata->psl; - EDIT_SURFACE_StorageList *stl = vedata->stl; + EDIT_SURFACE_PassList *psl = g_data.vedata->psl; + EDIT_SURFACE_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +207,7 @@ static void EDIT_SURFACE_draw_scene(void) { EDIT_SURFACE_Data *ved = DRW_viewport_engine_data_get("EditSurfaceMode"); EDIT_SURFACE_PassList *psl = ved->psl; - EDIT_SURFACE_FramebufferList *fbl = vedata->fbl; + EDIT_SURFACE_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/edit_text_mode.c b/source/blender/draw/modes/edit_text_mode.c index f7210496544..dfe91daea9f 100644 --- a/source/blender/draw/modes/edit_text_mode.c +++ b/source/blender/draw/modes/edit_text_mode.c @@ -33,6 +33,12 @@ #include "draw_mode_engines.h" +/* If needed, contains all global/Theme colors + * Add needed theme colors / values to DRW_globals_update() and update UBO + * Not needed for constant color. */ +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -85,26 +91,24 @@ typedef struct EDIT_TEXT_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in EDIT_TEXT_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in EDIT_TEXT_engine_init(); - * free in EDIT_TEXT_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static EDIT_TEXT_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in EDIT_TEXT_engine_init(); + * free in EDIT_TEXT_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +117,10 @@ static EDIT_TEXT_Data *vedata; * (Optional) */ static void EDIT_TEXT_engine_init(void) { - vedata = DRW_viewport_engine_data_get("EditTextMode"); - EDIT_TEXT_TextureList *txl = vedata->txl; - EDIT_TEXT_FramebufferList *fbl = vedata->fbl; - EDIT_TEXT_StorageList *stl = vedata->stl; + EDIT_TEXT_Data *ved = DRW_viewport_engine_data_get("EditTextMode"); + EDIT_TEXT_TextureList *txl = ved->txl; + EDIT_TEXT_FramebufferList *fbl = ved->fbl; + EDIT_TEXT_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +139,8 @@ static void EDIT_TEXT_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +148,9 @@ static void EDIT_TEXT_engine_init(void) * Assume that all Passes are NULL */ static void EDIT_TEXT_cache_init(void) { - vedata = DRW_viewport_engine_data_get("EditTextMode"); - EDIT_TEXT_PassList *psl = vedata->psl; - EDIT_TEXT_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("EditTextMode"); + EDIT_TEXT_PassList *psl = g_data.vedata->psl; + EDIT_TEXT_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +161,16 @@ static void EDIT_TEXT_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +178,8 @@ static void EDIT_TEXT_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void EDIT_TEXT_cache_populate(Object *ob) { - EDIT_TEXT_PassList *psl = vedata->psl; - EDIT_TEXT_StorageList *stl = vedata->stl; + EDIT_TEXT_PassList *psl = g_data.vedata->psl; + EDIT_TEXT_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +188,15 @@ static void EDIT_TEXT_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void EDIT_TEXT_cache_finish(void) { - EDIT_TEXT_PassList *psl = vedata->psl; - EDIT_TEXT_StorageList *stl = vedata->stl; + EDIT_TEXT_PassList *psl = g_data.vedata->psl; + EDIT_TEXT_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +207,7 @@ static void EDIT_TEXT_draw_scene(void) { EDIT_TEXT_Data *ved = DRW_viewport_engine_data_get("EditTextMode"); EDIT_TEXT_PassList *psl = ved->psl; - EDIT_TEXT_FramebufferList *fbl = vedata->fbl; + EDIT_TEXT_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index 8cb09a4e14f..93fb24f32ec 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -42,6 +42,11 @@ #include "draw_mode_engines.h" #include "draw_common.h" +extern GlobalsUboStorage ts; + +extern char datatoc_object_occluded_outline_frag_glsl[]; + +/* *********** LISTS *********** */ /* keep it under MAX_PASSES */ typedef struct OBJECT_PassList { struct DRWPass *non_meshes; @@ -60,86 +65,90 @@ typedef struct OBJECT_Data { void *stl; } OBJECT_Data; -/* Empties */ -static DRWShadingGroup *plain_axes; -static DRWShadingGroup *cube; -static DRWShadingGroup *circle; -static DRWShadingGroup *sphere; -static DRWShadingGroup *cone; -static DRWShadingGroup *single_arrow; -static DRWShadingGroup *single_arrow_line; -static DRWShadingGroup *arrows; -static DRWShadingGroup *axis_names; - -/* Speaker */ -static DRWShadingGroup *speaker; - -/* Lamps */ -static DRWShadingGroup *lamp_center; -static DRWShadingGroup *lamp_center_group; -static DRWShadingGroup *lamp_groundpoint; -static DRWShadingGroup *lamp_groundline; -static DRWShadingGroup *lamp_circle; -static DRWShadingGroup *lamp_circle_shadow; -static DRWShadingGroup *lamp_sunrays; -static DRWShadingGroup *lamp_distance; -static DRWShadingGroup *lamp_buflimit; -static DRWShadingGroup *lamp_buflimit_points; -static DRWShadingGroup *lamp_area; -static DRWShadingGroup *lamp_hemi; -static DRWShadingGroup *lamp_spot_cone; -static DRWShadingGroup *lamp_spot_blend; -static DRWShadingGroup *lamp_spot_pyramid; -static DRWShadingGroup *lamp_spot_blend_rect; - -/* Helpers */ -static DRWShadingGroup *relationship_lines; - -/* Objects Centers */ -static DRWShadingGroup *center_active; -static DRWShadingGroup *center_selected; -static DRWShadingGroup *center_deselected; - -/* Camera */ -static DRWShadingGroup *camera; -static DRWShadingGroup *camera_tria; -static DRWShadingGroup *camera_focus; -static DRWShadingGroup *camera_clip; -static DRWShadingGroup *camera_clip_points; -static DRWShadingGroup *camera_mist; -static DRWShadingGroup *camera_mist_points; - -/* Outlines */ -static DRWShadingGroup *outlines_active; -static DRWShadingGroup *outlines_active_group; -static DRWShadingGroup *outlines_select; -static DRWShadingGroup *outlines_select_group; -static DRWShadingGroup *outlines_transform; -static DRWShadingGroup *outlines_transp_select; -static DRWShadingGroup *outlines_transp_select_group; -static DRWShadingGroup *outlines_transp_active; -static DRWShadingGroup *outlines_transp_active_group; -static DRWShadingGroup *outlines_transp_transform; - -extern GlobalsUboStorage ts; - -static OBJECT_Data *vedata; - -static struct GPUShader *outline_sh = NULL; - -extern char datatoc_object_occluded_outline_frag_glsl[]; +/* *********** STATIC *********** */ + +static struct { + /* Empties */ + DRWShadingGroup *plain_axes; + DRWShadingGroup *cube; + DRWShadingGroup *circle; + DRWShadingGroup *sphere; + DRWShadingGroup *cone; + DRWShadingGroup *single_arrow; + DRWShadingGroup *single_arrow_line; + DRWShadingGroup *arrows; + DRWShadingGroup *axis_names; + + /* Speaker */ + DRWShadingGroup *speaker; + + /* Lamps */ + DRWShadingGroup *lamp_center; + DRWShadingGroup *lamp_center_group; + DRWShadingGroup *lamp_groundpoint; + DRWShadingGroup *lamp_groundline; + DRWShadingGroup *lamp_circle; + DRWShadingGroup *lamp_circle_shadow; + DRWShadingGroup *lamp_sunrays; + DRWShadingGroup *lamp_distance; + DRWShadingGroup *lamp_buflimit; + DRWShadingGroup *lamp_buflimit_points; + DRWShadingGroup *lamp_area; + DRWShadingGroup *lamp_hemi; + DRWShadingGroup *lamp_spot_cone; + DRWShadingGroup *lamp_spot_blend; + DRWShadingGroup *lamp_spot_pyramid; + DRWShadingGroup *lamp_spot_blend_rect; + + /* Helpers */ + DRWShadingGroup *relationship_lines; + + /* Objects Centers */ + DRWShadingGroup *center_active; + DRWShadingGroup *center_selected; + DRWShadingGroup *center_deselected; + + /* Camera */ + DRWShadingGroup *camera; + DRWShadingGroup *camera_tria; + DRWShadingGroup *camera_focus; + DRWShadingGroup *camera_clip; + DRWShadingGroup *camera_clip_points; + DRWShadingGroup *camera_mist; + DRWShadingGroup *camera_mist_points; + + /* Outlines */ + DRWShadingGroup *outlines_active; + DRWShadingGroup *outlines_active_group; + DRWShadingGroup *outlines_select; + DRWShadingGroup *outlines_select_group; + DRWShadingGroup *outlines_transform; + DRWShadingGroup *outlines_transp_select; + DRWShadingGroup *outlines_transp_select_group; + DRWShadingGroup *outlines_transp_active; + DRWShadingGroup *outlines_transp_active_group; + DRWShadingGroup *outlines_transp_transform; + + OBJECT_Data *vedata; +} g_data = {NULL}; /* Transient data */ + +static struct { + struct GPUShader *outline_sh; +} e_data = {NULL}; /* Engine data */ + +/* *********** FUNCTIONS *********** */ static void OBJECT_engine_init(void) { - if (!outline_sh) { - outline_sh = DRW_shader_create_3D(datatoc_object_occluded_outline_frag_glsl, NULL); + if (!e_data.outline_sh) { + e_data.outline_sh = DRW_shader_create_3D(datatoc_object_occluded_outline_frag_glsl, NULL); } } static void OBJECT_engine_free(void) { - if (outline_sh) - DRW_shader_free(outline_sh); + if (e_data.outline_sh) + DRW_shader_free(e_data.outline_sh); } static DRWShadingGroup *shgroup_outline(DRWPass *pass, int state_flag, const float col[4], struct GPUShader *sh) @@ -154,8 +163,8 @@ static DRWShadingGroup *shgroup_outline(DRWPass *pass, int state_flag, const flo static void OBJECT_cache_init(void) { /* DRW_viewport_engine_data_get is rather slow, better not do it on every objects */ - vedata = DRW_viewport_engine_data_get("ObjectMode"); - OBJECT_PassList *psl = vedata->psl; + g_data.vedata = DRW_viewport_engine_data_get("ObjectMode"); + OBJECT_PassList *psl = g_data.vedata->psl; { DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS | DRW_STATE_WIRE_LARGE; @@ -164,15 +173,15 @@ static void OBJECT_cache_init(void) struct GPUShader *sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); /* Select */ - outlines_select = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_SELECT, ts.colorSelect, sh); - outlines_select_group = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_SELECT, ts.colorGroupActive, sh); + g_data.outlines_select = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_SELECT, ts.colorSelect, sh); + g_data.outlines_select_group = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_SELECT, ts.colorGroupActive, sh); /* Transform */ - outlines_transform = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_SELECT, ts.colorTransform, sh); + g_data.outlines_transform = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_SELECT, ts.colorTransform, sh); /* Active */ - outlines_active = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_ACTIVE, ts.colorActive, sh); - outlines_active_group = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_ACTIVE, ts.colorGroupActive, sh); + g_data.outlines_active = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_ACTIVE, ts.colorActive, sh); + g_data.outlines_active_group = shgroup_outline(psl->outlines, DRW_STATE_TEST_STENCIL_ACTIVE, ts.colorGroupActive, sh); } { @@ -181,15 +190,15 @@ static void OBJECT_cache_init(void) psl->outlines_transp = DRW_pass_create("See-through Outlines Pass", state); /* Select */ - outlines_transp_select = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_SELECT, ts.colorSelect, outline_sh); - outlines_transp_select_group = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_SELECT, ts.colorGroupActive, outline_sh); + g_data.outlines_transp_select = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_SELECT, ts.colorSelect, e_data.outline_sh); + g_data.outlines_transp_select_group = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_SELECT, ts.colorGroupActive, e_data.outline_sh); /* Transform */ - outlines_transp_transform = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_SELECT, ts.colorTransform, outline_sh); + g_data.outlines_transp_transform = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_SELECT, ts.colorTransform, e_data.outline_sh); /* Active */ - outlines_transp_active = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_ACTIVE, ts.colorActive, outline_sh); - outlines_transp_active_group = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_ACTIVE, ts.colorGroupActive, outline_sh); + g_data.outlines_transp_active = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_ACTIVE, ts.colorActive, e_data.outline_sh); + g_data.outlines_transp_active_group = shgroup_outline(psl->outlines_transp, DRW_STATE_TEST_STENCIL_ACTIVE, ts.colorGroupActive, e_data.outline_sh); } { @@ -214,53 +223,53 @@ static void OBJECT_cache_init(void) /* Empties */ geom = DRW_cache_plain_axes_get(); - plain_axes = shgroup_instance(psl->non_meshes, geom); + g_data.plain_axes = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_cube_get(); - cube = shgroup_instance(psl->non_meshes, geom); + g_data.cube = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_circle_get(); - circle = shgroup_instance(psl->non_meshes, geom); + g_data.circle = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_empty_sphere_get(); - sphere = shgroup_instance(psl->non_meshes, geom); + g_data.sphere = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_empty_cone_get(); - cone = shgroup_instance(psl->non_meshes, geom); + g_data.cone = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_single_arrow_get(); - single_arrow = shgroup_instance(psl->non_meshes, geom); + g_data.single_arrow = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_get(); - single_arrow_line = shgroup_instance(psl->non_meshes, geom); + g_data.single_arrow_line = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_arrows_get(); - arrows = shgroup_instance(psl->non_meshes, geom); + g_data.arrows = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_axis_names_get(); - axis_names = shgroup_instance_axis_names(psl->non_meshes, geom); + g_data.axis_names = shgroup_instance_axis_names(psl->non_meshes, geom); /* Speaker */ geom = DRW_cache_speaker_get(); - speaker = shgroup_instance(psl->non_meshes, geom); + g_data.speaker = shgroup_instance(psl->non_meshes, geom); /* Camera */ geom = DRW_cache_camera_get(); - camera = shgroup_camera_instance(psl->non_meshes, geom); + g_data.camera = shgroup_camera_instance(psl->non_meshes, geom); geom = DRW_cache_camera_tria_get(); - camera_tria = shgroup_camera_instance(psl->non_meshes, geom); + g_data.camera_tria = shgroup_camera_instance(psl->non_meshes, geom); geom = DRW_cache_plain_axes_get(); - camera_focus = shgroup_instance(psl->non_meshes, geom); + g_data.camera_focus = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_get(); - camera_clip = shgroup_distance_lines_instance(psl->non_meshes, geom); - camera_mist = shgroup_distance_lines_instance(psl->non_meshes, geom); + g_data.camera_clip = shgroup_distance_lines_instance(psl->non_meshes, geom); + g_data.camera_mist = shgroup_distance_lines_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_endpoints_get(); - camera_clip_points = shgroup_distance_lines_instance(psl->non_meshes, geom); - camera_mist_points = shgroup_distance_lines_instance(psl->non_meshes, geom); + 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); /* Lamps */ /* TODO @@ -269,48 +278,48 @@ static void OBJECT_cache_init(void) /* start with buflimit because we don't want stipples */ geom = DRW_cache_single_line_get(); - lamp_buflimit = shgroup_distance_lines_instance(psl->non_meshes, geom); + g_data.lamp_buflimit = shgroup_distance_lines_instance(psl->non_meshes, geom); - lamp_center = shgroup_dynpoints_uniform_color(psl->non_meshes, ts.colorLampNoAlpha, &ts.sizeLampCenter); - lamp_center_group = shgroup_dynpoints_uniform_color(psl->non_meshes, ts.colorGroup, &ts.sizeLampCenter); + 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); geom = DRW_cache_lamp_get(); - lamp_circle = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircle); - lamp_circle_shadow = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircleShadow); + 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); geom = DRW_cache_lamp_sunrays_get(); - lamp_sunrays = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircle); + g_data.lamp_sunrays = shgroup_instance_screenspace(psl->non_meshes, geom, &ts.sizeLampCircle); - lamp_groundline = shgroup_groundlines_uniform_color(psl->non_meshes, ts.colorLamp); - lamp_groundpoint = shgroup_groundpoints_uniform_color(psl->non_meshes, ts.colorLamp); + 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); geom = DRW_cache_lamp_area_get(); - lamp_area = shgroup_instance(psl->non_meshes, geom); + g_data.lamp_area = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_lamp_hemi_get(); - lamp_hemi = shgroup_instance(psl->non_meshes, geom); + g_data.lamp_hemi = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_get(); - lamp_distance = shgroup_distance_lines_instance(psl->non_meshes, geom); + g_data.lamp_distance = shgroup_distance_lines_instance(psl->non_meshes, geom); geom = DRW_cache_single_line_endpoints_get(); - lamp_buflimit_points = shgroup_distance_lines_instance(psl->non_meshes, geom); + g_data.lamp_buflimit_points = shgroup_distance_lines_instance(psl->non_meshes, geom); geom = DRW_cache_lamp_spot_get(); - lamp_spot_cone = shgroup_spot_instance(psl->non_meshes, geom); + g_data.lamp_spot_cone = shgroup_spot_instance(psl->non_meshes, geom); geom = DRW_cache_circle_get(); - lamp_spot_blend = shgroup_instance(psl->non_meshes, geom); + g_data.lamp_spot_blend = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_lamp_spot_square_get(); - lamp_spot_pyramid = shgroup_instance(psl->non_meshes, geom); + g_data.lamp_spot_pyramid = shgroup_instance(psl->non_meshes, geom); geom = DRW_cache_square_get(); - lamp_spot_blend_rect = shgroup_instance(psl->non_meshes, geom); + g_data.lamp_spot_blend_rect = shgroup_instance(psl->non_meshes, geom); /* Relationship Lines */ - relationship_lines = shgroup_dynlines_uniform_color(psl->non_meshes, ts.colorWire); - DRW_shgroup_state_set(relationship_lines, DRW_STATE_STIPPLE_3); + 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); } { @@ -332,17 +341,17 @@ static void OBJECT_cache_init(void) 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); - center_active = grp; + 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); - center_selected = grp; + 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); - center_deselected = grp; + g_data.center_deselected = grp; } } @@ -355,29 +364,29 @@ static void DRW_shgroup_lamp(Object *ob) /* Don't draw the center if it's selected or active */ if (theme_id == TH_GROUP) - DRW_shgroup_dynamic_call_add(lamp_center_group, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(g_data.lamp_center_group, ob->obmat[3]); else if (theme_id == TH_LAMP) - DRW_shgroup_dynamic_call_add(lamp_center, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(g_data.lamp_center, ob->obmat[3]); /* First circle */ - DRW_shgroup_dynamic_call_add(lamp_circle, ob->obmat[3], color); + DRW_shgroup_dynamic_call_add(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(lamp_circle_shadow, ob->obmat[3], color); + DRW_shgroup_dynamic_call_add(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(lamp_distance, color, &zero, &la->dist, ob->obmat); + DRW_shgroup_dynamic_call_add(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(lamp_sunrays, ob->obmat[3], color); + DRW_shgroup_dynamic_call_add(g_data.lamp_sunrays, ob->obmat[3], color); } else if (la->type == LA_SPOT) { float size[3], sizemat[4][4]; @@ -397,33 +406,33 @@ static void DRW_shgroup_lamp(Object *ob) mul_m4_m4m4(la->spotblendmat, la->spotconemat, sizemat); if (la->mode & LA_SQUARE) { - DRW_shgroup_dynamic_call_add(lamp_spot_pyramid, color, &one, la->spotconemat); + DRW_shgroup_dynamic_call_add(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(lamp_spot_blend_rect, color, &one, la->spotblendmat); + DRW_shgroup_dynamic_call_add(g_data.lamp_spot_blend_rect, color, &one, la->spotblendmat); } } else { - DRW_shgroup_dynamic_call_add(lamp_spot_cone, color, la->spotconemat); + DRW_shgroup_dynamic_call_add(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(lamp_spot_blend, color, &one, la->spotblendmat); + DRW_shgroup_dynamic_call_add(g_data.lamp_spot_blend, color, &one, la->spotblendmat); } } normalize_m4(la->shapemat); - DRW_shgroup_dynamic_call_add(lamp_buflimit, color, &la->clipsta, &la->clipend, ob->obmat); - DRW_shgroup_dynamic_call_add(lamp_buflimit_points, color, &la->clipsta, &la->clipend, ob->obmat); + 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); } else if (la->type == LA_HEMI) { static float hemisize = 2.0f; - DRW_shgroup_dynamic_call_add(lamp_hemi, color, &hemisize, la->shapemat); + DRW_shgroup_dynamic_call_add(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]; @@ -434,12 +443,12 @@ static void DRW_shgroup_lamp(Object *ob) mul_m4_m4m4(la->shapemat, la->shapemat, sizemat); } - DRW_shgroup_dynamic_call_add(lamp_area, color, &la->area_size, la->shapemat); + DRW_shgroup_dynamic_call_add(g_data.lamp_area, color, &la->area_size, la->shapemat); } /* Line and point going to the ground */ - DRW_shgroup_dynamic_call_add(lamp_groundline, ob->obmat[3]); - DRW_shgroup_dynamic_call_add(lamp_groundpoint, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(g_data.lamp_groundline, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(g_data.lamp_groundpoint, ob->obmat[3]); } static void DRW_shgroup_camera(Object *ob) @@ -477,11 +486,11 @@ static void DRW_shgroup_camera(Object *ob) 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(camera, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); + DRW_shgroup_dynamic_call_add(g_data.camera, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); /* Active cam */ if (is_active) { - DRW_shgroup_dynamic_call_add(camera_tria, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); + DRW_shgroup_dynamic_call_add(g_data.camera_tria, color, cam->drwcorners, &cam->drwdepth, cam->drwtria, ob->obmat); } /* draw the rest in normalize object space */ @@ -498,10 +507,10 @@ static void DRW_shgroup_camera(Object *ob) size_to_mat4(sizemat, size); mul_m4_m4m4(cam->drwfocusmat, cam->drwfocusmat, sizemat); - DRW_shgroup_dynamic_call_add(camera_focus, (is_active ? col_hi : col), &cam->drawsize, cam->drwfocusmat); + DRW_shgroup_dynamic_call_add(g_data.camera_focus, (is_active ? col_hi : col), &cam->drawsize, cam->drwfocusmat); - DRW_shgroup_dynamic_call_add(camera_clip, color, &cam->clipsta, &cam->clipend, cam->drwnormalmat); - DRW_shgroup_dynamic_call_add(camera_clip_points, (is_active ? col_hi : col), &cam->clipsta, &cam->clipend, cam->drwnormalmat); + 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); } if (cam->flag & CAM_SHOWMIST) { @@ -510,8 +519,8 @@ static void DRW_shgroup_camera(Object *ob) 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(camera_mist, color, &world->miststa, &world->mistend, cam->drwnormalmat); - DRW_shgroup_dynamic_call_add(camera_mist_points, (is_active ? col_hi : col), &world->miststa, &world->mistend, cam->drwnormalmat); + 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); } } } @@ -523,27 +532,27 @@ static void DRW_shgroup_empty(Object *ob) switch (ob->empty_drawtype) { case OB_PLAINAXES: - DRW_shgroup_dynamic_call_add(plain_axes, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(g_data.plain_axes, color, &ob->empty_drawsize, ob->obmat); break; case OB_SINGLE_ARROW: - DRW_shgroup_dynamic_call_add(single_arrow, color, &ob->empty_drawsize, ob->obmat); - DRW_shgroup_dynamic_call_add(single_arrow_line, color, &ob->empty_drawsize, ob->obmat); + 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); break; case OB_CUBE: - DRW_shgroup_dynamic_call_add(cube, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(g_data.cube, color, &ob->empty_drawsize, ob->obmat); break; case OB_CIRCLE: - DRW_shgroup_dynamic_call_add(circle, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(g_data.circle, color, &ob->empty_drawsize, ob->obmat); break; case OB_EMPTY_SPHERE: - DRW_shgroup_dynamic_call_add(sphere, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(g_data.sphere, color, &ob->empty_drawsize, ob->obmat); break; case OB_EMPTY_CONE: - DRW_shgroup_dynamic_call_add(cone, color, &ob->empty_drawsize, ob->obmat); + DRW_shgroup_dynamic_call_add(g_data.cone, color, &ob->empty_drawsize, ob->obmat); break; case OB_ARROWS: - DRW_shgroup_dynamic_call_add(arrows, color, &ob->empty_drawsize, ob->obmat); - DRW_shgroup_dynamic_call_add(axis_names, color, &ob->empty_drawsize, ob->obmat); + 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); break; } } @@ -554,24 +563,24 @@ static void DRW_shgroup_speaker(Object *ob) static float one = 1.0f; DRW_object_wire_theme_get(ob, &color); - DRW_shgroup_dynamic_call_add(speaker, color, &one, ob->obmat); + DRW_shgroup_dynamic_call_add(g_data.speaker, color, &one, ob->obmat); } static void DRW_shgroup_relationship_lines(Object *ob) { if (ob->parent) { - DRW_shgroup_dynamic_call_add(relationship_lines, ob->obmat[3]); - DRW_shgroup_dynamic_call_add(relationship_lines, ob->parent->obmat[3]); + 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]); } } static void DRW_shgroup_object_center(Object *ob) { if ((ob->base_flag & BASE_SELECTED) != 0) { - DRW_shgroup_dynamic_call_add(center_selected, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(g_data.center_selected, ob->obmat[3]); } else if (0) { - DRW_shgroup_dynamic_call_add(center_deselected, ob->obmat[3]); + DRW_shgroup_dynamic_call_add(g_data.center_deselected, ob->obmat[3]); } } @@ -595,20 +604,20 @@ static void OBJECT_cache_populate(Object *ob) struct Batch *geom = DRW_cache_wire_outline_get(ob); switch (theme_id) { case TH_ACTIVE: - DRW_shgroup_call_add(outlines_active, geom, ob->obmat); - DRW_shgroup_call_add(outlines_transp_active, geom, ob->obmat); + DRW_shgroup_call_add(g_data.outlines_active, geom, ob->obmat); + DRW_shgroup_call_add(g_data.outlines_transp_active, geom, ob->obmat); break; case TH_SELECT: - DRW_shgroup_call_add(outlines_select, geom, ob->obmat); - DRW_shgroup_call_add(outlines_transp_select, geom, ob->obmat); + DRW_shgroup_call_add(g_data.outlines_select, geom, ob->obmat); + DRW_shgroup_call_add(g_data.outlines_transp_select, geom, ob->obmat); break; case TH_GROUP_ACTIVE: - DRW_shgroup_call_add(outlines_select_group, geom, ob->obmat); - DRW_shgroup_call_add(outlines_transp_select_group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.outlines_select_group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.outlines_transp_select_group, geom, ob->obmat); break; case TH_TRANSFORM: - DRW_shgroup_call_add(outlines_transform, geom, ob->obmat); - DRW_shgroup_call_add(outlines_transp_transform, geom, ob->obmat); + DRW_shgroup_call_add(g_data.outlines_transform, geom, ob->obmat); + DRW_shgroup_call_add(g_data.outlines_transp_transform, geom, ob->obmat); break; } } @@ -631,9 +640,9 @@ static void OBJECT_cache_populate(Object *ob) { bArmature *arm = ob->data; if (arm->edbo == NULL) { - DRW_shgroup_armature_object(ob, vedata->psl->bone_solid, - vedata->psl->bone_wire, - relationship_lines); + DRW_shgroup_armature_object(ob, g_data.vedata->psl->bone_solid, + g_data.vedata->psl->bone_wire, + g_data.relationship_lines); } } break; diff --git a/source/blender/draw/modes/paint_texture_mode.c b/source/blender/draw/modes/paint_texture_mode.c index c084955a6b2..3ec60e93a1b 100644 --- a/source/blender/draw/modes/paint_texture_mode.c +++ b/source/blender/draw/modes/paint_texture_mode.c @@ -33,6 +33,12 @@ #include "draw_mode_engines.h" +/* If needed, contains all global/Theme colors + * Add needed theme colors / values to DRW_globals_update() and update UBO + * Not needed for constant color. */ +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -85,26 +91,24 @@ typedef struct PAINT_TEXTURE_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in PAINT_TEXTURE_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in PAINT_TEXTURE_engine_init(); - * free in PAINT_TEXTURE_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static PAINT_TEXTURE_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in PAINT_TEXTURE_engine_init(); + * free in PAINT_TEXTURE_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +117,10 @@ static PAINT_TEXTURE_Data *vedata; * (Optional) */ static void PAINT_TEXTURE_engine_init(void) { - vedata = DRW_viewport_engine_data_get("PaintTextureMode"); - PAINT_TEXTURE_TextureList *txl = vedata->txl; - PAINT_TEXTURE_FramebufferList *fbl = vedata->fbl; - PAINT_TEXTURE_StorageList *stl = vedata->stl; + PAINT_TEXTURE_Data *ved = DRW_viewport_engine_data_get("PaintTextureMode"); + PAINT_TEXTURE_TextureList *txl = ved->txl; + PAINT_TEXTURE_FramebufferList *fbl = ved->fbl; + PAINT_TEXTURE_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +139,8 @@ static void PAINT_TEXTURE_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +148,9 @@ static void PAINT_TEXTURE_engine_init(void) * Assume that all Passes are NULL */ static void PAINT_TEXTURE_cache_init(void) { - vedata = DRW_viewport_engine_data_get("PaintTextureMode"); - PAINT_TEXTURE_PassList *psl = vedata->psl; - PAINT_TEXTURE_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("PaintTextureMode"); + PAINT_TEXTURE_PassList *psl = g_data.vedata->psl; + PAINT_TEXTURE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +161,16 @@ static void PAINT_TEXTURE_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +178,8 @@ static void PAINT_TEXTURE_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void PAINT_TEXTURE_cache_populate(Object *ob) { - PAINT_TEXTURE_PassList *psl = vedata->psl; - PAINT_TEXTURE_StorageList *stl = vedata->stl; + PAINT_TEXTURE_PassList *psl = g_data.vedata->psl; + PAINT_TEXTURE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +188,15 @@ static void PAINT_TEXTURE_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void PAINT_TEXTURE_cache_finish(void) { - PAINT_TEXTURE_PassList *psl = vedata->psl; - PAINT_TEXTURE_StorageList *stl = vedata->stl; + PAINT_TEXTURE_PassList *psl = g_data.vedata->psl; + PAINT_TEXTURE_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +207,7 @@ static void PAINT_TEXTURE_draw_scene(void) { PAINT_TEXTURE_Data *ved = DRW_viewport_engine_data_get("PaintTextureMode"); PAINT_TEXTURE_PassList *psl = ved->psl; - PAINT_TEXTURE_FramebufferList *fbl = vedata->fbl; + PAINT_TEXTURE_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index b5f594b7f8e..bac81c9b81c 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -33,6 +33,12 @@ #include "draw_mode_engines.h" +/* If needed, contains all global/Theme colors + * Add needed theme colors / values to DRW_globals_update() and update UBO + * Not needed for constant color. */ +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -85,26 +91,24 @@ typedef struct PAINT_VERTEX_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in PAINT_VERTEX_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in PAINT_VERTEX_engine_init(); - * free in PAINT_VERTEX_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static PAINT_VERTEX_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in PAINT_VERTEX_engine_init(); + * free in PAINT_VERTEX_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +117,10 @@ static PAINT_VERTEX_Data *vedata; * (Optional) */ static void PAINT_VERTEX_engine_init(void) { - vedata = DRW_viewport_engine_data_get("PaintVertexMode"); - PAINT_VERTEX_TextureList *txl = vedata->txl; - PAINT_VERTEX_FramebufferList *fbl = vedata->fbl; - PAINT_VERTEX_StorageList *stl = vedata->stl; + PAINT_VERTEX_Data *ved = DRW_viewport_engine_data_get("PaintVertexMode"); + PAINT_VERTEX_TextureList *txl = ved->txl; + PAINT_VERTEX_FramebufferList *fbl = ved->fbl; + PAINT_VERTEX_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +139,8 @@ static void PAINT_VERTEX_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +148,9 @@ static void PAINT_VERTEX_engine_init(void) * Assume that all Passes are NULL */ static void PAINT_VERTEX_cache_init(void) { - vedata = DRW_viewport_engine_data_get("PaintVertexMode"); - PAINT_VERTEX_PassList *psl = vedata->psl; - PAINT_VERTEX_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("PaintVertexMode"); + PAINT_VERTEX_PassList *psl = g_data.vedata->psl; + PAINT_VERTEX_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +161,16 @@ static void PAINT_VERTEX_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +178,8 @@ static void PAINT_VERTEX_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void PAINT_VERTEX_cache_populate(Object *ob) { - PAINT_VERTEX_PassList *psl = vedata->psl; - PAINT_VERTEX_StorageList *stl = vedata->stl; + PAINT_VERTEX_PassList *psl = g_data.vedata->psl; + PAINT_VERTEX_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +188,15 @@ static void PAINT_VERTEX_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void PAINT_VERTEX_cache_finish(void) { - PAINT_VERTEX_PassList *psl = vedata->psl; - PAINT_VERTEX_StorageList *stl = vedata->stl; + PAINT_VERTEX_PassList *psl = g_data.vedata->psl; + PAINT_VERTEX_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +207,7 @@ static void PAINT_VERTEX_draw_scene(void) { PAINT_VERTEX_Data *ved = DRW_viewport_engine_data_get("PaintVertexMode"); PAINT_VERTEX_PassList *psl = ved->psl; - PAINT_VERTEX_FramebufferList *fbl = vedata->fbl; + PAINT_VERTEX_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c index c083aaaae82..06f73436760 100644 --- a/source/blender/draw/modes/paint_weight_mode.c +++ b/source/blender/draw/modes/paint_weight_mode.c @@ -33,6 +33,12 @@ #include "draw_mode_engines.h" +/* If needed, contains all global/Theme colors + * Add needed theme colors / values to DRW_globals_update() and update UBO + * Not needed for constant color. */ +extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ +extern struct GlobalsUboStorage ts; /* draw_common.c */ + /* *********** LISTS *********** */ /* All lists are per viewport specific datas. * They are all free when viewport changes engines @@ -85,26 +91,24 @@ typedef struct PAINT_WEIGHT_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in PAINT_WEIGHT_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in PAINT_WEIGHT_engine_init(); - * free in PAINT_WEIGHT_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static PAINT_WEIGHT_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in PAINT_WEIGHT_engine_init(); + * free in PAINT_WEIGHT_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +117,10 @@ static PAINT_WEIGHT_Data *vedata; * (Optional) */ static void PAINT_WEIGHT_engine_init(void) { - vedata = DRW_viewport_engine_data_get("PaintWeightMode"); - PAINT_WEIGHT_TextureList *txl = vedata->txl; - PAINT_WEIGHT_FramebufferList *fbl = vedata->fbl; - PAINT_WEIGHT_StorageList *stl = vedata->stl; + PAINT_WEIGHT_Data *ved = DRW_viewport_engine_data_get("PaintWeightMode"); + PAINT_WEIGHT_TextureList *txl = ved->txl; + PAINT_WEIGHT_FramebufferList *fbl = ved->fbl; + PAINT_WEIGHT_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +139,8 @@ static void PAINT_WEIGHT_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +148,9 @@ static void PAINT_WEIGHT_engine_init(void) * Assume that all Passes are NULL */ static void PAINT_WEIGHT_cache_init(void) { - vedata = DRW_viewport_engine_data_get("PaintWeightMode"); - PAINT_WEIGHT_PassList *psl = vedata->psl; - PAINT_WEIGHT_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("PaintWeightMode"); + PAINT_WEIGHT_PassList *psl = g_data.vedata->psl; + PAINT_WEIGHT_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +161,16 @@ static void PAINT_WEIGHT_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +178,8 @@ static void PAINT_WEIGHT_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void PAINT_WEIGHT_cache_populate(Object *ob) { - PAINT_WEIGHT_PassList *psl = vedata->psl; - PAINT_WEIGHT_StorageList *stl = vedata->stl; + PAINT_WEIGHT_PassList *psl = g_data.vedata->psl; + PAINT_WEIGHT_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +188,15 @@ static void PAINT_WEIGHT_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void PAINT_WEIGHT_cache_finish(void) { - PAINT_WEIGHT_PassList *psl = vedata->psl; - PAINT_WEIGHT_StorageList *stl = vedata->stl; + PAINT_WEIGHT_PassList *psl = g_data.vedata->psl; + PAINT_WEIGHT_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +207,7 @@ static void PAINT_WEIGHT_draw_scene(void) { PAINT_WEIGHT_Data *ved = DRW_viewport_engine_data_get("PaintWeightMode"); PAINT_WEIGHT_PassList *psl = ved->psl; - PAINT_WEIGHT_FramebufferList *fbl = vedata->fbl; + PAINT_WEIGHT_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/particle_mode.c b/source/blender/draw/modes/particle_mode.c index 4c36e1dd1a7..393268f81c2 100644 --- a/source/blender/draw/modes/particle_mode.c +++ b/source/blender/draw/modes/particle_mode.c @@ -85,26 +85,24 @@ typedef struct PARTICLE_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in PARTICLE_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in PARTICLE_engine_init(); - * free in PARTICLE_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static PARTICLE_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in PARTICLE_engine_init(); + * free in PARTICLE_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +111,10 @@ static PARTICLE_Data *vedata; * (Optional) */ static void PARTICLE_engine_init(void) { - vedata = DRW_viewport_engine_data_get("ParticleMode"); - PARTICLE_TextureList *txl = vedata->txl; - PARTICLE_FramebufferList *fbl = vedata->fbl; - PARTICLE_StorageList *stl = vedata->stl; + PARTICLE_Data *ved = DRW_viewport_engine_data_get("ParticleMode"); + PARTICLE_TextureList *txl = ved->txl; + PARTICLE_FramebufferList *fbl = ved->fbl; + PARTICLE_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +133,8 @@ static void PARTICLE_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +142,9 @@ static void PARTICLE_engine_init(void) * Assume that all Passes are NULL */ static void PARTICLE_cache_init(void) { - vedata = DRW_viewport_engine_data_get("ParticleMode"); - PARTICLE_PassList *psl = vedata->psl; - PARTICLE_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("ParticleMode"); + PARTICLE_PassList *psl = g_data.vedata->psl; + PARTICLE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +155,16 @@ static void PARTICLE_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +172,8 @@ static void PARTICLE_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void PARTICLE_cache_populate(Object *ob) { - PARTICLE_PassList *psl = vedata->psl; - PARTICLE_StorageList *stl = vedata->stl; + PARTICLE_PassList *psl = g_data.vedata->psl; + PARTICLE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +182,15 @@ static void PARTICLE_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void PARTICLE_cache_finish(void) { - PARTICLE_PassList *psl = vedata->psl; - PARTICLE_StorageList *stl = vedata->stl; + PARTICLE_PassList *psl = g_data.vedata->psl; + PARTICLE_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +201,7 @@ static void PARTICLE_draw_scene(void) { PARTICLE_Data *ved = DRW_viewport_engine_data_get("ParticleMode"); PARTICLE_PassList *psl = ved->psl; - PARTICLE_FramebufferList *fbl = vedata->fbl; + PARTICLE_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/pose_mode.c b/source/blender/draw/modes/pose_mode.c index 3e22643bbdd..184d8ae85e5 100644 --- a/source/blender/draw/modes/pose_mode.c +++ b/source/blender/draw/modes/pose_mode.c @@ -85,26 +85,24 @@ typedef struct POSE_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in POSE_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in POSE_engine_init(); - * free in POSE_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static POSE_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in POSE_engine_init(); + * free in POSE_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +111,10 @@ static POSE_Data *vedata; * (Optional) */ static void POSE_engine_init(void) { - vedata = DRW_viewport_engine_data_get("PoseMode"); - POSE_TextureList *txl = vedata->txl; - POSE_FramebufferList *fbl = vedata->fbl; - POSE_StorageList *stl = vedata->stl; + POSE_Data *ved = DRW_viewport_engine_data_get("PoseMode"); + POSE_TextureList *txl = ved->txl; + POSE_FramebufferList *fbl = ved->fbl; + POSE_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +133,8 @@ static void POSE_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +142,9 @@ static void POSE_engine_init(void) * Assume that all Passes are NULL */ static void POSE_cache_init(void) { - vedata = DRW_viewport_engine_data_get("PoseMode"); - POSE_PassList *psl = vedata->psl; - POSE_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("PoseMode"); + POSE_PassList *psl = g_data.vedata->psl; + POSE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +155,16 @@ static void POSE_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +172,8 @@ static void POSE_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void POSE_cache_populate(Object *ob) { - POSE_PassList *psl = vedata->psl; - POSE_StorageList *stl = vedata->stl; + POSE_PassList *psl = g_data.vedata->psl; + POSE_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +182,15 @@ static void POSE_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void POSE_cache_finish(void) { - POSE_PassList *psl = vedata->psl; - POSE_StorageList *stl = vedata->stl; + POSE_PassList *psl = g_data.vedata->psl; + POSE_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +201,7 @@ static void POSE_draw_scene(void) { POSE_Data *ved = DRW_viewport_engine_data_get("PoseMode"); POSE_PassList *psl = ved->psl; - POSE_FramebufferList *fbl = vedata->fbl; + POSE_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); diff --git a/source/blender/draw/modes/sculpt_mode.c b/source/blender/draw/modes/sculpt_mode.c index d67ff581f39..f25f21bfbda 100644 --- a/source/blender/draw/modes/sculpt_mode.c +++ b/source/blender/draw/modes/sculpt_mode.c @@ -85,26 +85,24 @@ typedef struct SCULPT_Data { /* *********** STATIC *********** */ -/* This keeps the references of the shading groups for - * easy access in SCULPT_cache_populate() */ -static DRWShadingGroup *group; - -/* If needed, contains all global/Theme colors - * Add needed theme colors / values to DRW_globals_update() and update UBO - * Not needed for constant color. */ -extern struct GPUUniformBuffer *globals_ubo; /* draw_common.c */ -extern struct GlobalsUboStorage ts; /* draw_common.c */ - -/* Custom shaders : - * Add sources to source/blender/draw/modes/shaders - * init in SCULPT_engine_init(); - * free in SCULPT_engine_free(); */ -static struct GPUShader *custom_shader = NULL; - -/* 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 */ -static SCULPT_Data *vedata; +static struct { + /* Custom shaders : + * Add sources to source/blender/draw/modes/shaders + * init in SCULPT_engine_init(); + * free in SCULPT_engine_free(); */ + struct GPUShader *custom_shader; +} e_data = {NULL}; /* Engine data */ + +static struct { + /* 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 */ /* *********** FUNCTIONS *********** */ @@ -113,10 +111,10 @@ static SCULPT_Data *vedata; * (Optional) */ static void SCULPT_engine_init(void) { - vedata = DRW_viewport_engine_data_get("SculptMode"); - SCULPT_TextureList *txl = vedata->txl; - SCULPT_FramebufferList *fbl = vedata->fbl; - SCULPT_StorageList *stl = vedata->stl; + SCULPT_Data *ved = DRW_viewport_engine_data_get("SculptMode"); + SCULPT_TextureList *txl = ved->txl; + SCULPT_FramebufferList *fbl = ved->fbl; + SCULPT_StorageList *stl = ved->stl; UNUSED_VARS(txl, fbl, stl); @@ -135,8 +133,8 @@ static void SCULPT_engine_init(void) * tex, 2); */ - if (!custom_shader) { - custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + if (!e_data.custom_shader) { + e_data.custom_shader = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); } } @@ -144,9 +142,9 @@ static void SCULPT_engine_init(void) * Assume that all Passes are NULL */ static void SCULPT_cache_init(void) { - vedata = DRW_viewport_engine_data_get("SculptMode"); - SCULPT_PassList *psl = vedata->psl; - SCULPT_StorageList *stl = vedata->stl; + g_data.vedata = DRW_viewport_engine_data_get("SculptMode"); + SCULPT_PassList *psl = g_data.vedata->psl; + SCULPT_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(stl); @@ -157,16 +155,16 @@ static void SCULPT_cache_init(void) /* Create a shadingGroup using a function in draw_common.c or custom one */ /* - * group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); + * g_data.group = shgroup_dynlines_uniform_color(psl->pass, ts.colorWire); * -- or -- - * group = DRW_shgroup_create(custom_shader, psl->pass); + * g_data.group = DRW_shgroup_create(e_data.custom_shader, psl->pass); */ - group = DRW_shgroup_create(custom_shader, psl->pass); + 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(group, "color", color, 1); + DRW_shgroup_uniform_vec4(g_data.group, "color", color, 1); } } @@ -174,8 +172,8 @@ static void SCULPT_cache_init(void) /* Add geometry to shadingGroups. Execute for each objects */ static void SCULPT_cache_populate(Object *ob) { - SCULPT_PassList *psl = vedata->psl; - SCULPT_StorageList *stl = vedata->stl; + SCULPT_PassList *psl = g_data.vedata->psl; + SCULPT_StorageList *stl = g_data.vedata->stl; UNUSED_VARS(psl, stl); @@ -184,15 +182,15 @@ static void SCULPT_cache_populate(Object *ob) struct Batch *geom = DRW_cache_surface_get(ob); /* Add geom to a shading group */ - DRW_shgroup_call_add(group, geom, ob->obmat); + DRW_shgroup_call_add(g_data.group, geom, ob->obmat); } } /* Optional: Post-cache_populate callback */ static void SCULPT_cache_finish(void) { - SCULPT_PassList *psl = vedata->psl; - SCULPT_StorageList *stl = vedata->stl; + SCULPT_PassList *psl = g_data.vedata->psl; + SCULPT_StorageList *stl = g_data.vedata->stl; /* Do something here! dependant on the objects gathered */ UNUSED_VARS(psl, stl); @@ -203,7 +201,7 @@ static void SCULPT_draw_scene(void) { SCULPT_Data *ved = DRW_viewport_engine_data_get("SculptMode"); SCULPT_PassList *psl = ved->psl; - SCULPT_FramebufferList *fbl = vedata->fbl; + SCULPT_FramebufferList *fbl = ved->fbl; /* Default framebuffer and texture */ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); |