[Bf-blender-cvs] [c403508e41c] master: DRW: changes to object mode engine needed to support clipping
Campbell Barton
noreply at git.blender.org
Wed Jan 23 02:40:18 CET 2019
Commit: c403508e41c67367d1fdd725065951063d5ae7b2
Author: Campbell Barton
Date: Wed Jan 23 12:37:12 2019 +1100
Branches: master
https://developer.blender.org/rBc403508e41c67367d1fdd725065951063d5ae7b2
DRW: changes to object mode engine needed to support clipping
Split out shader struct, no function changes.
===================================================================
M source/blender/draw/modes/object_mode.c
===================================================================
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 2705f4b834d..f43fca7177d 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -144,6 +144,28 @@ typedef struct OBJECT_Data {
OBJECT_StorageList *stl;
} OBJECT_Data;
+typedef struct OBJECT_Shaders {
+ /* fullscreen shaders */
+ GPUShader *outline_prepass;
+ GPUShader *outline_prepass_wire;
+ GPUShader *outline_resolve;
+ GPUShader *outline_resolve_aa;
+ GPUShader *outline_detect;
+ GPUShader *outline_detect_wire;
+ GPUShader *outline_fade;
+ GPUShader *outline_fade_large;
+
+ /* regular shaders */
+ GPUShader *object_empty_image;
+ GPUShader *object_empty_image_wire;
+ GPUShader *grid;
+ GPUShader *part_dot;
+ GPUShader *part_prim;
+ GPUShader *part_axis;
+ GPUShader *lightprobe_grid;
+ GPUShader *loose_points;
+} OBJECT_Shaders;
+
/* *********** STATIC *********** */
typedef struct OBJECT_ShadingGroupList {
@@ -305,25 +327,9 @@ static struct {
struct GPUVertFormat *empty_image_format;
struct GPUVertFormat *empty_image_wire_format;
- /* fullscreen shaders */
- GPUShader *outline_prepass_sh;
- GPUShader *outline_prepass_wire_sh;
- GPUShader *outline_resolve_sh;
- GPUShader *outline_resolve_aa_sh;
- GPUShader *outline_detect_sh;
- GPUShader *outline_detect_wire_sh;
- GPUShader *outline_fade_sh;
- GPUShader *outline_fade_large_sh;
+ /* 0: normal, 1: clipped. */
+ OBJECT_Shaders sh_data[2];
- /* regular shaders */
- GPUShader *object_empty_image_sh;
- GPUShader *object_empty_image_wire_sh;
- GPUShader *grid_sh;
- GPUShader *part_dot_sh;
- GPUShader *part_prim_sh;
- GPUShader *part_axis_sh;
- GPUShader *lightprobe_grid_sh;
- GPUShader *loose_points_sh;
float camera_pos[3];
float grid_settings[5];
float grid_mesh_size;
@@ -362,6 +368,14 @@ 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;
@@ -401,39 +415,42 @@ static void OBJECT_engine_init(void *vedata)
}
/* Shaders */
- if (!e_data.outline_resolve_sh) {
+ 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)];
+
+ if (!sh_data->outline_resolve) {
/* Outline */
- e_data.outline_prepass_sh = DRW_shader_create_3D(datatoc_object_outline_prepass_frag_glsl, NULL);
+ sh_data->outline_prepass = DRW_shader_create_3D(datatoc_object_outline_prepass_frag_glsl, NULL);
- e_data.outline_prepass_wire_sh = DRW_shader_create(
+ sh_data->outline_prepass_wire = DRW_shader_create(
datatoc_object_outline_prepass_vert_glsl,
datatoc_object_outline_prepass_geom_glsl,
datatoc_object_outline_prepass_frag_glsl, NULL);
- e_data.outline_resolve_sh = DRW_shader_create_fullscreen(datatoc_object_outline_resolve_frag_glsl, NULL);
+ sh_data->outline_resolve = DRW_shader_create_fullscreen(datatoc_object_outline_resolve_frag_glsl, NULL);
- e_data.outline_resolve_aa_sh = DRW_shader_create_with_lib(
+ sh_data->outline_resolve_aa = DRW_shader_create_with_lib(
datatoc_common_fullscreen_vert_glsl, NULL,
datatoc_object_outline_resolve_frag_glsl,
datatoc_common_fxaa_lib_glsl,
"#define FXAA_ALPHA\n"
"#define USE_FXAA\n");
- e_data.outline_detect_sh = DRW_shader_create_with_lib(
+ sh_data->outline_detect = DRW_shader_create_with_lib(
datatoc_common_fullscreen_vert_glsl, NULL,
datatoc_object_outline_detect_frag_glsl,
datatoc_common_globals_lib_glsl,
NULL);
- e_data.outline_detect_wire_sh = DRW_shader_create_with_lib(
+ sh_data->outline_detect_wire = DRW_shader_create_with_lib(
datatoc_common_fullscreen_vert_glsl, NULL,
datatoc_object_outline_detect_frag_glsl,
datatoc_common_globals_lib_glsl,
"#define WIRE\n");
- e_data.outline_fade_sh = DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, NULL);
- e_data.outline_fade_large_sh = DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, "#define LARGE_OUTLINE\n");
+ sh_data->outline_fade = DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, NULL);
+ sh_data->outline_fade_large = DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, "#define LARGE_OUTLINE\n");
/* Empty images */
# define EMPTY_IMAGE_SHADER_DEFINES \
@@ -441,12 +458,12 @@ static void OBJECT_engine_init(void *vedata)
"#define DEPTH_FRONT " STRINGIFY(OB_EMPTY_IMAGE_DEPTH_FRONT) "\n" \
"#define DEPTH_BACK " STRINGIFY(OB_EMPTY_IMAGE_DEPTH_BACK) "\n"
- e_data.object_empty_image_sh = DRW_shader_create(
+ sh_data->object_empty_image = DRW_shader_create(
datatoc_object_empty_image_vert_glsl, NULL,
datatoc_object_empty_image_frag_glsl,
EMPTY_IMAGE_SHADER_DEFINES);
- e_data.object_empty_image_wire_sh = DRW_shader_create(
+ sh_data->object_empty_image_wire = DRW_shader_create(
datatoc_object_empty_image_vert_glsl, NULL,
datatoc_object_empty_image_frag_glsl,
EMPTY_IMAGE_SHADER_DEFINES
@@ -455,35 +472,34 @@ static void OBJECT_engine_init(void *vedata)
# undef EMPTY_IMAGE_SHADER_DEFINES
/* Grid */
- e_data.grid_sh = DRW_shader_create_with_lib(
+ sh_data->grid = DRW_shader_create_with_lib(
datatoc_object_grid_vert_glsl, NULL,
datatoc_object_grid_frag_glsl,
datatoc_common_globals_lib_glsl, NULL);
/* Particles */
- e_data.part_prim_sh = DRW_shader_create(
+ sh_data->part_prim = DRW_shader_create(
datatoc_object_particle_prim_vert_glsl, NULL, datatoc_gpu_shader_flat_color_frag_glsl, NULL);
- e_data.part_axis_sh = DRW_shader_create(
+ sh_data->part_axis = DRW_shader_create(
datatoc_object_particle_prim_vert_glsl, NULL, datatoc_gpu_shader_flat_color_frag_glsl,
"#define USE_AXIS\n");
- e_data.part_dot_sh = DRW_shader_create(
+ sh_data->part_dot = DRW_shader_create(
datatoc_object_particle_dot_vert_glsl, NULL, datatoc_object_particle_dot_frag_glsl, NULL);
/* Lightprobes */
- e_data.lightprobe_grid_sh = DRW_shader_create(
+ sh_data->lightprobe_grid = DRW_shader_create(
datatoc_object_lightprobe_grid_vert_glsl, NULL, datatoc_gpu_shader_flat_id_frag_glsl, NULL);
/* Loose Points */
- e_data.loose_points_sh = DRW_shader_create_3D(datatoc_object_loose_points_frag_glsl, NULL);
+ sh_data->loose_points = DRW_shader_create_3D(datatoc_object_loose_points_frag_glsl, NULL);
}
{
/* Grid precompute */
float invviewmat[4][4], invwinmat[4][4];
float viewmat[4][4], winmat[4][4];
- const DRWContextState *draw_ctx = DRW_context_state_get();
View3D *v3d = draw_ctx->v3d;
Scene *scene = draw_ctx->scene;
RegionView3D *rv3d = draw_ctx->rv3d;
@@ -638,22 +654,14 @@ static void OBJECT_engine_free(void)
MEM_SAFE_FREE(e_data.particle_format);
MEM_SAFE_FREE(e_data.empty_image_format);
MEM_SAFE_FREE(e_data.empty_image_wire_format);
- DRW_SHADER_FREE_SAFE(e_data.outline_prepass_sh);
- DRW_SHADER_FREE_SAFE(e_data.outline_prepass_wire_sh);
- DRW_SHADER_FREE_SAFE(e_data.outline_resolve_sh);
- DRW_SHADER_FREE_SAFE(e_data.outline_resolve_aa_sh);
- DRW_SHADER_FREE_SAFE(e_data.outline_detect_sh);
- DRW_SHADER_FREE_SAFE(e_data.outline_detect_wire_sh);
- DRW_SHADER_FREE_SAFE(e_data.outline_fade_sh);
- DRW_SHADER_FREE_SAFE(e_data.outline_fade_large_sh);
- DRW_SHADER_FREE_SAFE(e_data.object_empty_image_sh);
- DRW_SHADER_FREE_SAFE(e_data.object_empty_image_wire_sh);
- DRW_SHADER_FREE_SAFE(e_data.grid_sh);
- DRW_SHADER_FREE_SAFE(e_data.part_prim_sh);
- DRW_SHADER_FREE_SAFE(e_data.part_axis_sh);
- DRW_SHADER_FREE_SAFE(e_data.part_dot_sh);
- DRW_SHADER_FREE_SAFE(e_data.lightprobe_grid_sh);
- DRW_SHADER_FREE_SAFE(e_data.loose_points_sh);
+
+ for (int sh_data_index = 0; sh_data_index < ARRAY_SIZE(e_data.sh_data); sh_data_index++) {
+ OBJECT_Shaders *sh_data = &e_data.sh_data[sh_data_index];
+ GPUShader **sh_data_as_array = (GPUShader **)sh_data;
+ for (int i = 0; i < (sizeof(OBJECT_Shaders) / sizeof(GPUShader *)); i++) {
+ DRW_SHADER_FREE_SAFE(sh_data_as_array[i]);
+ }
+ }
}
static DRWShadingGroup *shgroup_outline(DRWPass *pass, const int *ofs, GPUShader *sh)
@@ -899,7 +907,8 @@ static void image_calc_aspect(Image *ima, const int size[2], float r_image_aspec
}
static void DRW_shgroup_empty_image(
- OBJECT_ShadingGroupList *sgl, Object *ob, const float color[3], RegionView3D *rv3d)
+ OBJECT_Shaders *sh_data, OBJECT_ShadingGroupList *sgl,
+ Object *ob, const float color[3], RegionView3D *rv3d)
{
/* TODO: 'StereoViews', see draw_empty_image. */
@@ -929,7 +938,7 @@ static void DRW_shgroup_empty_image(
* ob->col[3] == 1.0f, we could remove it from the sorting pass. */
if (tex && (ob->col[3] > 0.0f)) {
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.object_empty_image_sh, sgl->image_empties);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh_data->object_empty_image, sgl->image_empties);
DRW_shgroup_uniform_texture(grp, "image", tex);
/* TODO(fclem) implement DRW_shgroup_uniform_vec2_copy */
DRW_shgroup_uniform_float_copy(grp, "aspectX", image_aspect[0]);
@@ -942,7 +951,7 @@ static void DRW_shgroup_empty_image(
}
{
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.object_empty_image_wire_sh, sgl->non_meshes);
+ DRWShadingGroup *grp = DRW_shgroup_create(sh_data->object_empty_image_wire, sgl->non_meshes);
/* TODO(fclem) implement DRW_shgroup_uniform_vec2_copy */
DRW_shgroup_uniform_float_copy(grp, "aspectX", image_aspect[0]);
DRW_shgroup_uniform_float_copy(grp, "aspectY", image_aspect[1]);
@@ -962,6 +971,7 @@ static void OBJECT_cache_init(void *vedata)
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
OBJECT_PrivateData *g_data;
const DRWConte
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list