[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