diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-01-23 05:21:49 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-01-23 05:34:55 +0300 |
commit | 14d947dcadea7c9debe6c8a078a571eba6cb828c (patch) | |
tree | baed2bc9dd567ab509133cd72984b11fec919f2e /source | |
parent | c403508e41c67367d1fdd725065951063d5ae7b2 (diff) |
DRW: generalize selecting between regular/clipped shaders
Each engine was doing this on its own.
Move to DRWContextState, use an enum.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 12 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 5 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_lattice_mode.c | 15 | ||||
-rw-r--r-- | source/blender/draw/modes/edit_mesh_mode.c | 17 | ||||
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 19 | ||||
-rw-r--r-- | source/blender/draw/modes/overlay_mode.c | 15 | ||||
-rw-r--r-- | source/blender/draw/modes/paint_vertex_mode.c | 14 | ||||
-rw-r--r-- | source/blender/draw/modes/paint_weight_mode.c | 14 |
8 files changed, 37 insertions, 74 deletions
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index bc1b156c1f6..72c55657748 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -567,6 +567,16 @@ bool DRW_state_show_text(void); bool DRW_state_draw_support(void); bool DRW_state_draw_background(void); +/** + * Support selecting shaders with different options compiled in. + * Needed for clipping support because it means using a separate set of shaders. + */ +typedef enum eDRW_ShaderSlot { + DRW_SHADER_SLOT_DEFAULT = 0, + DRW_SHADER_SLOT_CLIPPED = 1, +} eDRW_ShaderSlot; +#define DRW_SHADER_SLOT_LEN 2 + /* Avoid too many lookups while drawing */ typedef struct DRWContextState { @@ -586,6 +596,8 @@ typedef struct DRWContextState { eObjectMode object_mode; + eDRW_ShaderSlot shader_slot; + /* Last resort (some functions take this as an arg so we can't easily avoid). * May be NULL when used for selection or depth buffer. */ const struct bContext *evil_C; diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 4f79f4e46c1..c47ab00c841 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -543,6 +543,11 @@ static void drw_context_state_init(void) else { DST.draw_ctx.object_pose = NULL; } + + DST.draw_ctx.shader_slot = DRW_SHADER_SLOT_DEFAULT; + if (DST.draw_ctx.rv3d && DST.draw_ctx.rv3d->rflag & RV3D_CLIPPING) { + DST.draw_ctx.shader_slot = DRW_SHADER_SLOT_CLIPPED; + } } /* It also stores viewport variable to an immutable place: DST diff --git a/source/blender/draw/modes/edit_lattice_mode.c b/source/blender/draw/modes/edit_lattice_mode.c index 908bc1db7a9..c98a68f13b2 100644 --- a/source/blender/draw/modes/edit_lattice_mode.c +++ b/source/blender/draw/modes/edit_lattice_mode.c @@ -105,8 +105,7 @@ static struct { * init in EDIT_LATTICE_engine_init(); * free in EDIT_LATTICE_engine_free(); */ - /* 0: normal, 1: clipped. */ - EDIT_LATTICE_Shaders sh_data[2]; + EDIT_LATTICE_Shaders sh_data[DRW_SHADER_SLOT_LEN]; } e_data = {NULL}; /* Engine data */ @@ -119,14 +118,6 @@ typedef struct EDIT_LATTICE_PrivateData { /* *********** FUNCTIONS *********** */ -static int EDIT_LATTICE_sh_data_index_from_rv3d(const RegionView3D *rv3d) -{ - if (rv3d->rflag & RV3D_CLIPPING) { - return 1; - } - return 0; -} - /* Init Textures, Framebuffers, Storage and Shaders. * It is called for every frames. * (Optional) */ @@ -154,7 +145,7 @@ static void EDIT_LATTICE_engine_init(void *vedata) */ const DRWContextState *draw_ctx = DRW_context_state_get(); - EDIT_LATTICE_Shaders *sh_data = &e_data.sh_data[EDIT_LATTICE_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + EDIT_LATTICE_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0; if (is_clip) { DRW_state_clip_planes_set_from_rv3d(draw_ctx->rv3d); @@ -191,7 +182,7 @@ static void EDIT_LATTICE_cache_init(void *vedata) const DRWContextState *draw_ctx = DRW_context_state_get(); RegionView3D *rv3d = draw_ctx->rv3d; - EDIT_LATTICE_Shaders *sh_data = &e_data.sh_data[EDIT_LATTICE_sh_data_index_from_rv3d(rv3d)]; + EDIT_LATTICE_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; if (!stl->g_data) { /* Alloc transient pointers */ diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c index a6a9b030184..48a3d003a37 100644 --- a/source/blender/draw/modes/edit_mesh_mode.c +++ b/source/blender/draw/modes/edit_mesh_mode.c @@ -126,8 +126,7 @@ typedef struct EDIT_MESH_Shaders { /* *********** STATIC *********** */ static struct { - /* 0: normal, 1: clipped. */ - EDIT_MESH_Shaders sh_data[2]; + EDIT_MESH_Shaders sh_data[DRW_SHADER_SLOT_LEN]; /* temp buffer texture */ struct GPUTexture *occlude_wire_depth_tx; @@ -164,14 +163,6 @@ typedef struct EDIT_MESH_PrivateData { /* *********** FUNCTIONS *********** */ -static int EDIT_MESH_sh_data_index_from_rv3d(const RegionView3D *rv3d) -{ - if (rv3d->rflag & RV3D_CLIPPING) { - return 1; - } - return 0; -} - static int EDIT_MESH_sh_index(ToolSettings *tsettings, RegionView3D *rv3d, bool supports_fast_mode) { int result = tsettings->selectmode << 1; @@ -263,7 +254,7 @@ static void EDIT_MESH_engine_init(void *vedata) EDIT_MESH_FramebufferList *fbl = ((EDIT_MESH_Data *)vedata)->fbl; const DRWContextState *draw_ctx = DRW_context_state_get(); - EDIT_MESH_Shaders *sh_data = &e_data.sh_data[EDIT_MESH_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + EDIT_MESH_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0; const float *viewport_size = DRW_viewport_size_get(); @@ -364,7 +355,7 @@ static DRWPass *edit_mesh_create_overlay_pass( Scene *scene = draw_ctx->scene; ToolSettings *tsettings = scene->toolsettings; const int fast_mode = rv3d->rflag & RV3D_NAVIGATING; - EDIT_MESH_Shaders *sh_data = &e_data.sh_data[EDIT_MESH_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + EDIT_MESH_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; ledge_sh = EDIT_MESH_ensure_shader(sh_data, tsettings, rv3d, false, true); tri_sh = EDIT_MESH_ensure_shader(sh_data, tsettings, rv3d, true, false); @@ -455,7 +446,7 @@ static void EDIT_MESH_cache_init(void *vedata) RegionView3D *rv3d = draw_ctx->rv3d; Scene *scene = draw_ctx->scene; ToolSettings *tsettings = scene->toolsettings; - EDIT_MESH_Shaders *sh_data = &e_data.sh_data[EDIT_MESH_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + EDIT_MESH_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; static float zero = 0.0f; if (!stl->g_data) { diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index f43fca7177d..7a10763c1b7 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -327,8 +327,7 @@ static struct { struct GPUVertFormat *empty_image_format; struct GPUVertFormat *empty_image_wire_format; - /* 0: normal, 1: clipped. */ - OBJECT_Shaders sh_data[2]; + OBJECT_Shaders sh_data[DRW_SHADER_SLOT_LEN]; float camera_pos[3]; float grid_settings[5]; @@ -368,14 +367,6 @@ static void DRW_shgroup_empty_ex(OBJECT_ShadingGroupList *sgl, float mat[4][4], /* *********** FUNCTIONS *********** */ -static int OBJECT_sh_data_index_from_rv3d(const RegionView3D *rv3d) -{ - if (rv3d->rflag & RV3D_CLIPPING) { - return 1; - } - return 0; -} - static void OBJECT_engine_init(void *vedata) { OBJECT_FramebufferList *fbl = ((OBJECT_Data *)vedata)->fbl; @@ -416,7 +407,7 @@ static void OBJECT_engine_init(void *vedata) /* Shaders */ const DRWContextState *draw_ctx = DRW_context_state_get(); - OBJECT_Shaders *sh_data = &e_data.sh_data[OBJECT_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + OBJECT_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; if (!sh_data->outline_resolve) { /* Outline */ @@ -971,7 +962,7 @@ static void OBJECT_cache_init(void *vedata) DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); OBJECT_PrivateData *g_data; const DRWContextState *draw_ctx = DRW_context_state_get(); - OBJECT_Shaders *sh_data = &e_data.sh_data[OBJECT_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + OBJECT_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; const float outline_width = UI_GetThemeValuef(TH_OUTLINE_WIDTH); const bool do_outline_expand = (U.pixelsize > 1.0) || (outline_width > 2.0f); @@ -2866,9 +2857,7 @@ static void OBJECT_cache_populate(void *vedata, Object *ob) ModifierData *md = NULL; int theme_id = TH_UNDEFINED; const int ob_visibility = DRW_object_visibility_in_active_context(ob); - - /* TODO(campbell): we shouldn't need to get this per object. */ - OBJECT_Shaders *sh_data = &e_data.sh_data[OBJECT_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + OBJECT_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; /* Handle particles first in case the emitter itself shouldn't be rendered. */ if (ob_visibility & OB_VISIBLE_PARTICLES) { diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c index 55596797a4f..1888bd85246 100644 --- a/source/blender/draw/modes/overlay_mode.c +++ b/source/blender/draw/modes/overlay_mode.c @@ -79,8 +79,7 @@ typedef struct OVERLAY_Shaders { /* *********** STATIC *********** */ static struct { - /* 0: normal, 1: clipped. */ - OVERLAY_Shaders sh_data[2]; + OVERLAY_Shaders sh_data[DRW_SHADER_SLOT_LEN]; } e_data = {NULL}; extern char datatoc_common_world_clip_lib_glsl[]; @@ -94,14 +93,6 @@ extern char datatoc_overlay_face_wireframe_geom_glsl[]; extern char datatoc_overlay_face_wireframe_frag_glsl[]; extern char datatoc_gpu_shader_depth_only_frag_glsl[]; -static int OVERLAY_sh_data_index_from_rv3d(const RegionView3D *rv3d) -{ - if (rv3d->rflag & RV3D_CLIPPING) { - return 1; - } - return 0; -} - /* Functions */ static void overlay_engine_init(void *vedata) { @@ -109,7 +100,7 @@ static void overlay_engine_init(void *vedata) OVERLAY_StorageList *stl = data->stl; const DRWContextState *draw_ctx = DRW_context_state_get(); - OVERLAY_Shaders *sh_data = &e_data.sh_data[OVERLAY_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0; if (is_clip) { @@ -162,7 +153,7 @@ static void overlay_cache_init(void *vedata) const DRWContextState *draw_ctx = DRW_context_state_get(); RegionView3D *rv3d = draw_ctx->rv3d; - OVERLAY_Shaders *sh_data = &e_data.sh_data[OVERLAY_sh_data_index_from_rv3d(rv3d)]; + OVERLAY_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; const DRWContextState *DCS = DRW_context_state_get(); diff --git a/source/blender/draw/modes/paint_vertex_mode.c b/source/blender/draw/modes/paint_vertex_mode.c index d6197700ca6..9fb307b556d 100644 --- a/source/blender/draw/modes/paint_vertex_mode.c +++ b/source/blender/draw/modes/paint_vertex_mode.c @@ -84,7 +84,7 @@ typedef struct PAINT_VERTEX_Shaders { /* *********** STATIC *********** */ static struct { - PAINT_VERTEX_Shaders sh_data[2]; + PAINT_VERTEX_Shaders sh_data[DRW_SHADER_SLOT_LEN]; } e_data = {NULL}; /* Engine data */ typedef struct PAINT_VERTEX_PrivateData { @@ -96,18 +96,10 @@ typedef struct PAINT_VERTEX_PrivateData { /* *********** FUNCTIONS *********** */ -static int PAINT_VERTEX_sh_data_index_from_rv3d(const RegionView3D *rv3d) -{ - if (rv3d->rflag & RV3D_CLIPPING) { - return 1; - } - return 0; -} - static void PAINT_VERTEX_engine_init(void *UNUSED(vedata)) { const DRWContextState *draw_ctx = DRW_context_state_get(); - PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[PAINT_VERTEX_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0; if (is_clip) { @@ -147,7 +139,7 @@ static void PAINT_VERTEX_cache_init(void *vedata) const DRWContextState *draw_ctx = DRW_context_state_get(); const View3D *v3d = draw_ctx->v3d; const RegionView3D *rv3d = draw_ctx->rv3d; - PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[PAINT_VERTEX_sh_data_index_from_rv3d(rv3d)]; + PAINT_VERTEX_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; if (!stl->g_data) { /* Alloc transient pointers */ diff --git a/source/blender/draw/modes/paint_weight_mode.c b/source/blender/draw/modes/paint_weight_mode.c index 5d8b02d872d..7d4b3cac41b 100644 --- a/source/blender/draw/modes/paint_weight_mode.c +++ b/source/blender/draw/modes/paint_weight_mode.c @@ -86,7 +86,7 @@ typedef struct PAINT_WEIGHT_Shaders { /* *********** STATIC *********** */ static struct { - PAINT_WEIGHT_Shaders sh_data[2]; + PAINT_WEIGHT_Shaders sh_data[DRW_SHADER_SLOT_LEN]; int actdef; } e_data = {NULL}; /* Engine data */ @@ -100,18 +100,10 @@ typedef struct PAINT_WEIGHT_PrivateData { /* *********** FUNCTIONS *********** */ -static int PAINT_WEIGHT_sh_data_index_from_rv3d(const RegionView3D *rv3d) -{ - if (rv3d->rflag & RV3D_CLIPPING) { - return 1; - } - return 0; -} - static void PAINT_WEIGHT_engine_init(void *UNUSED(vedata)) { const DRWContextState *draw_ctx = DRW_context_state_get(); - PAINT_WEIGHT_Shaders *sh_data = &e_data.sh_data[PAINT_WEIGHT_sh_data_index_from_rv3d(draw_ctx->rv3d)]; + PAINT_WEIGHT_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0; if (is_clip) { @@ -151,7 +143,7 @@ static void PAINT_WEIGHT_cache_init(void *vedata) const DRWContextState *draw_ctx = DRW_context_state_get(); const View3D *v3d = draw_ctx->v3d; RegionView3D *rv3d = draw_ctx->rv3d; - PAINT_WEIGHT_Shaders *sh_data = &e_data.sh_data[PAINT_WEIGHT_sh_data_index_from_rv3d(rv3d)]; + PAINT_WEIGHT_Shaders *sh_data = &e_data.sh_data[draw_ctx->shader_slot]; if (!stl->g_data) { /* Alloc transient pointers */ |