[Bf-blender-cvs] [07673a3460c] master: DRW: Support edit-mesh clipping

Campbell Barton noreply at git.blender.org
Mon Jan 21 06:14:44 CET 2019


Commit: 07673a3460cd0dc37aa9435ade76fabbc78d2c1e
Author: Campbell Barton
Date:   Mon Jan 21 15:57:10 2019 +1100
Branches: master
https://developer.blender.org/rB07673a3460cd0dc37aa9435ade76fabbc78d2c1e

DRW: Support edit-mesh clipping

===================================================================

M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_deferred.c
M	source/blender/draw/engines/workbench/workbench_forward.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_vert.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
M	source/blender/draw/modes/shaders/edit_normals_geom.glsl
M	source/blender/draw/modes/shaders/edit_normals_vert.glsl
M	source/blender/draw/modes/shaders/paint_weight_vert.glsl

===================================================================

diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 6c65bafb4e3..60bcae3eee3 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -184,13 +184,6 @@ void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, floa
 	DRW_uniformbuffer_update(wpd->world_ubo, wd);
 }
 
-void workbench_private_draw_finish(WORKBENCH_PrivateData *wpd)
-{
-	if (wpd->world_clip_planes_len) {
-		DRW_state_clip_planes_reset();
-	}
-}
-
 void workbench_private_data_free(WORKBENCH_PrivateData *wpd)
 {
 	BLI_ghash_free(wpd->material_hash, NULL, MEM_freeN);
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 5868ad90206..3f537f6c6d0 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -1081,7 +1081,6 @@ void workbench_deferred_draw_finish(WORKBENCH_Data *vedata)
 	WORKBENCH_StorageList *stl = vedata->stl;
 	WORKBENCH_PrivateData *wpd = stl->g_data;
 
-	workbench_private_draw_finish(wpd);
 	workbench_private_data_free(wpd);
 	workbench_volume_smoke_textures_free(wpd);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c
index 0ccc95d6b94..94cbb20ef5f 100644
--- a/source/blender/draw/engines/workbench/workbench_forward.c
+++ b/source/blender/draw/engines/workbench/workbench_forward.c
@@ -647,7 +647,6 @@ void workbench_forward_draw_finish(WORKBENCH_Data *vedata)
 	WORKBENCH_StorageList *stl = vedata->stl;
 	WORKBENCH_PrivateData *wpd = stl->g_data;
 
-	workbench_private_draw_finish(wpd);
 	workbench_private_data_free(wpd);
 	workbench_volume_smoke_textures_free(wpd);
 }
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index e38c7ae424d..a4cfd297516 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -321,7 +321,6 @@ bool studiolight_camera_in_object_shadow(WORKBENCH_PrivateData *wpd, Object *ob,
 /* workbench_data.c */
 void workbench_effect_info_init(WORKBENCH_EffectInfo *effect_info);
 void workbench_private_data_init(WORKBENCH_PrivateData *wpd);
-void workbench_private_draw_finish(WORKBENCH_PrivateData *wpd);
 void workbench_private_data_free(WORKBENCH_PrivateData *wpd);
 void workbench_private_data_get_light_direction(WORKBENCH_PrivateData *wpd, float r_light_direction[3]);
 
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index 569ec59c93d..9ff4211572e 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -101,10 +101,11 @@ typedef struct EDIT_MESH_Data {
 	EDIT_MESH_StorageList *stl;
 } EDIT_MESH_Data;
 
-/* *********** STATIC *********** */
 #define MAX_SHADERS 16
 
-static struct {
+#define DEF_WORLD_CLIP_STR "#define USE_WORLD_CLIP_PLANES\n"
+
+typedef struct EDIT_MESH_ShaderData {
 	/* weight */
 	GPUShader *weight_face_shader;
 
@@ -122,6 +123,13 @@ static struct {
 	GPUShader *normals_sh;
 	GPUShader *depth_sh;
 	GPUShader *ghost_clear_depth_sh;
+} EDIT_MESH_ShaderData;
+
+/* *********** STATIC *********** */
+static struct {
+	/* 0: normal, 1: clipped. */
+	EDIT_MESH_ShaderData sh_data[2];
+
 	/* temp buffer texture */
 	struct GPUTexture *occlude_wire_depth_tx;
 	struct GPUTexture *occlude_wire_color_tx;
@@ -156,6 +164,23 @@ typedef struct EDIT_MESH_PrivateData {
 } EDIT_MESH_PrivateData; /* Transient data */
 
 /* *********** FUNCTIONS *********** */
+
+static int EDIT_MESH_sh_data_index_from_rv3d(const RegionView3D *rv3d)
+{
+	if (rv3d->rflag & RV3D_CLIPPING) {
+		return 1;
+	}
+	return 0;
+}
+
+static void EDIT_MESH_shgroup_world_clip_planes_from_rv3d(DRWShadingGroup *shgrp, const RegionView3D *rv3d)
+{
+	int world_clip_planes_len = (rv3d->viewlock & RV3D_BOXCLIP) ? 4 : 6;
+	DRW_shgroup_uniform_vec4(shgrp, "WorldClipPlanes", rv3d->clip[0], world_clip_planes_len);
+	DRW_shgroup_uniform_int_copy(shgrp, "WorldClipPlanesLen", world_clip_planes_len);
+	DRW_shgroup_state_enable(shgrp, DRW_STATE_CLIP_PLANES);
+}
+
 static int EDIT_MESH_sh_index(ToolSettings *tsettings, RegionView3D *rv3d, bool supports_fast_mode)
 {
 	int result = tsettings->selectmode << 1;
@@ -196,6 +221,9 @@ static char *EDIT_MESH_sh_defines(ToolSettings *tsettings, RegionView3D *rv3d, b
 	if (!looseedge) {
 		BLI_dynstr_append(ds, "#define VERTEX_FACING\n");
 	}
+	if (rv3d->rflag & RV3D_CLIPPING) {
+		BLI_dynstr_append(ds, DEF_WORLD_CLIP_STR);
+	}
 
 	str = BLI_dynstr_get_cstring(ds);
 	BLI_dynstr_free(ds);
@@ -215,15 +243,16 @@ static char *EDIT_MESH_sh_lib(void)
 }
 
 static GPUShader *EDIT_MESH_ensure_shader(
+        EDIT_MESH_ShaderData *sh_data,
         ToolSettings *tsettings, RegionView3D *rv3d, bool supports_fast_mode, bool looseedge)
 {
 	const int index = EDIT_MESH_sh_index(tsettings, rv3d, supports_fast_mode);
 	const int fast_mode = rv3d->rflag & RV3D_NAVIGATING;
 	if (looseedge) {
-		if (!e_data.overlay_loose_edge_sh_cache[index]) {
+		if (!sh_data->overlay_loose_edge_sh_cache[index]) {
 			char *defines = EDIT_MESH_sh_defines(tsettings, rv3d, true, true);
 			char *lib = EDIT_MESH_sh_lib();
-			e_data.overlay_loose_edge_sh_cache[index] = DRW_shader_create_with_lib(
+			sh_data->overlay_loose_edge_sh_cache[index] = DRW_shader_create_with_lib(
 			        datatoc_edit_mesh_overlay_vert_glsl,
 			        datatoc_edit_mesh_overlay_geom_edge_glsl,
 			        datatoc_edit_mesh_overlay_frag_glsl,
@@ -232,13 +261,13 @@ static GPUShader *EDIT_MESH_ensure_shader(
 			MEM_freeN(lib);
 			MEM_freeN(defines);
 		}
-		return e_data.overlay_loose_edge_sh_cache[index];
+		return sh_data->overlay_loose_edge_sh_cache[index];
 	}
 	else {
-		if (!e_data.overlay_tri_sh_cache[index]) {
+		if (!sh_data->overlay_tri_sh_cache[index]) {
 			char *defines = EDIT_MESH_sh_defines(tsettings, rv3d, true, false);
 			char *lib = EDIT_MESH_sh_lib();
-			e_data.overlay_tri_sh_cache[index] = DRW_shader_create_with_lib(
+			sh_data->overlay_tri_sh_cache[index] = DRW_shader_create_with_lib(
 			        datatoc_edit_mesh_overlay_vert_glsl,
 			        fast_mode ? NULL : datatoc_edit_mesh_overlay_geom_tri_glsl,
 			        datatoc_edit_mesh_overlay_frag_glsl,
@@ -247,7 +276,7 @@ static GPUShader *EDIT_MESH_ensure_shader(
 			MEM_freeN(lib);
 			MEM_freeN(defines);
 		}
-		return e_data.overlay_tri_sh_cache[index];
+		return sh_data->overlay_tri_sh_cache[index];
 	}
 }
 
@@ -255,6 +284,10 @@ 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_ShaderData *sh_data = &e_data.sh_data[EDIT_MESH_sh_data_index_from_rv3d(draw_ctx->rv3d)];
+	const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0;
+
 	const float *viewport_size = DRW_viewport_size_get();
 	const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
 
@@ -268,66 +301,85 @@ static void EDIT_MESH_engine_init(void *vedata)
 		GPU_ATTACHMENT_TEXTURE(e_data.occlude_wire_color_tx)
 	});
 
-	if (!e_data.weight_face_shader) {
-		e_data.weight_face_shader = DRW_shader_create_with_lib(
+	if (is_clip) {
+		DRW_state_clip_planes_len_set((draw_ctx->rv3d->viewlock & RV3D_BOXCLIP) ? 4 : 6);
+	}
+
+	if (!sh_data->weight_face_shader) {
+		sh_data->weight_face_shader = DRW_shader_create_with_lib(
 		        datatoc_paint_weight_vert_glsl, NULL,
 		        datatoc_paint_weight_frag_glsl,
-		        datatoc_common_globals_lib_glsl, NULL);
+		        datatoc_common_globals_lib_glsl,
+		        is_clip ? DEF_WORLD_CLIP_STR : NULL);
 	}
 
-	if (!e_data.overlay_vert_sh) {
+	if (!sh_data->overlay_vert_sh) {
 		char *lib = EDIT_MESH_sh_lib();
-		e_data.overlay_vert_sh = DRW_shader_create_with_lib(
+		const char *defs =
+			DEF_WORLD_CLIP_STR
+			"#define VERTEX_FACING\n" ;
+		sh_data->overlay_vert_sh = DRW_shader_create_with_lib(
 		        datatoc_edit_mesh_overlay_points_vert_glsl, NULL,
 		        datatoc_gpu_shader_point_varying_color_frag_glsl, lib,
-		        "#define VERTEX_FACING\n");
-		e_data.overlay_lvert_sh = DRW_shader_create_with_lib(
+		        defs + (is_clip ? 0 : strlen(DEF_WORLD_CLIP_STR)));
+		sh_data->overlay_lvert_sh = DRW_shader_create_with_lib(
 		        datatoc_edit_mesh_overlay_points_vert_glsl, NULL,
 		        datatoc_gpu_shader_point_varying_color_frag_glsl, lib,
-		        NULL);
+		        is_clip ? DEF_WORLD_CLIP_STR : NULL);
 		MEM_freeN(lib);
 	}
-	if (!e_data.overlay_facedot_sh) {
-		e_data.overlay_facedot_sh = DRW_shader_create_with_lib(
+	if (!sh_data->overlay_facedot_sh) {
+		const char *defs =
+			DEF_WORLD_CLIP_STR
+			"#define VERTEX_FACING\n" ;
+		sh_data->overlay_facedot_sh = DRW_shader_create_with_lib(
 		        datatoc_edit_mesh_overlay_facedot_vert_glsl, NULL,
 		        datatoc_edit_mesh_overlay_facedot_frag_glsl,
 		        datatoc_common_globals_lib_glsl,
-		        "#define VERTEX_FACING\n");
+		        defs + (is_clip ? 0 : strlen(DEF_WORLD_CLIP_STR)));
 	}
-	if (!e_data.overlay_mix_sh) {
-		e_data.overlay_mix_sh = DRW_shader_create_fullscreen(datatoc_edit_mesh_overlay_mix_frag_glsl, NULL);
+	if (!sh_data->overlay_mix_sh) {
+		sh_data->overlay_mix_sh = DRW_shader_create_fullscreen(datatoc_edit_mesh_overlay_mix_frag_glsl, NULL);
 	}
-	if (!e_data.overlay_facefill_sh) {
-		e_data.overlay_facefill_sh = DRW_shader_create_with_lib(
+	if (!sh_data->overlay_facefill_sh) {
+		sh_data->overlay_facefill_sh = DRW_shader_create_with_lib(
 		        datatoc_edit_mesh_overlay_facefill_vert_glsl, NULL,
 		        datatoc_edit_mesh_overlay_facefill_frag_glsl,
-		        datatoc_common_globals_lib_glsl, NULL);
+		        datatoc_common_globals_lib_glsl,
+		        is_clip ? DEF_WORLD_CLIP_STR : NULL);
 	}
-	if (!e_data.normals_face_sh) {
-		e_data.normals_face_sh = DRW_shader_create(
+	if (!sh_data->normals_face_sh) {
+		const char *defs =
+			DEF_WORLD_CLIP_STR
+			"#define FACE_NORMALS\n";
+		sh_data->no

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list