[Bf-blender-cvs] [78d2abd9c16] master: DRW: Support wire overlay clipping

Campbell Barton noreply at git.blender.org
Mon Jan 21 09:10:16 CET 2019


Commit: 78d2abd9c16f97be2ab272ee38ba7e398f57a742
Author: Campbell Barton
Date:   Mon Jan 21 19:08:42 2019 +1100
Branches: master
https://developer.blender.org/rB78d2abd9c16f97be2ab272ee38ba7e398f57a742

DRW: Support wire overlay clipping

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

M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_common.h
M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/overlay_mode.c
M	source/blender/draw/modes/shaders/overlay_face_orientation_vert.glsl
M	source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
M	source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index 48212757969..250b0a1f1ab 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -298,6 +298,14 @@ void DRW_globals_free(void)
 	}
 }
 
+void DRW_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);
+}
+
 DRWShadingGroup *shgroup_dynlines_flat_color(DRWPass *pass)
 {
 	GPUShader *sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_FLAT_COLOR);
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index b79902bf4e3..5b55e93af3d 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -125,6 +125,8 @@ BLI_STATIC_ASSERT_ALIGN(GlobalsUboStorage, 16)
 void DRW_globals_update(void);
 void DRW_globals_free(void);
 
+void DRW_shgroup_world_clip_planes_from_rv3d(struct DRWShadingGroup *shgrp, const RegionView3D *rv3d);
+
 struct DRWShadingGroup *shgroup_dynlines_flat_color(struct DRWPass *pass);
 struct DRWShadingGroup *shgroup_dynlines_dashed_uniform_color(struct DRWPass *pass, float color[4]);
 struct DRWShadingGroup *shgroup_dynpoints_uniform_color(struct DRWPass *pass, float color[4], float *size);
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index dfd4b213c7c..1a3d7fb4cb4 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -174,14 +174,6 @@ static int EDIT_MESH_sh_data_index_from_rv3d(const RegionView3D *rv3d)
 	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;
@@ -415,7 +407,7 @@ static DRWPass *edit_mesh_create_overlay_pass(
 		DRW_shgroup_state_enable(*r_lverts_shgrp, DRW_STATE_WRITE_DEPTH);
 		DRW_shgroup_state_disable(*r_lverts_shgrp, DRW_STATE_BLEND);
 		if (rv3d->rflag & RV3D_CLIPPING) {
-			EDIT_MESH_shgroup_world_clip_planes_from_rv3d(*r_lverts_shgrp, rv3d);
+			DRW_shgroup_world_clip_planes_from_rv3d(*r_lverts_shgrp, rv3d);
 		}
 
 		*r_verts_shgrp = DRW_shgroup_create(sh_data->overlay_vert, pass);
@@ -425,7 +417,7 @@ static DRWPass *edit_mesh_create_overlay_pass(
 		DRW_shgroup_state_enable(*r_verts_shgrp, DRW_STATE_WRITE_DEPTH);
 		DRW_shgroup_state_disable(*r_verts_shgrp, DRW_STATE_BLEND);
 		if (rv3d->rflag & RV3D_CLIPPING) {
-			EDIT_MESH_shgroup_world_clip_planes_from_rv3d(*r_verts_shgrp, rv3d);
+			DRW_shgroup_world_clip_planes_from_rv3d(*r_verts_shgrp, rv3d);
 		}
 	}
 
@@ -435,7 +427,7 @@ static DRWPass *edit_mesh_create_overlay_pass(
 		DRW_shgroup_uniform_float(*r_facedot_shgrp, "edgeScale", edge_width_scale, 1);
 		DRW_shgroup_state_enable(*r_facedot_shgrp, DRW_STATE_WRITE_DEPTH);
 		if (rv3d->rflag & RV3D_CLIPPING) {
-			EDIT_MESH_shgroup_world_clip_planes_from_rv3d(*r_facedot_shgrp, rv3d);
+			DRW_shgroup_world_clip_planes_from_rv3d(*r_facedot_shgrp, rv3d);
 		}
 	}
 
@@ -454,7 +446,7 @@ static DRWPass *edit_mesh_create_overlay_pass(
 		DRW_shgroup_state_enable(*r_face_shgrp, DRW_STATE_FIRST_VERTEX_CONVENTION);
 	}
 	if (rv3d->rflag & RV3D_CLIPPING) {
-		EDIT_MESH_shgroup_world_clip_planes_from_rv3d(*r_face_shgrp, rv3d);
+		DRW_shgroup_world_clip_planes_from_rv3d(*r_face_shgrp, rv3d);
 	}
 
 	/* Cage geom needs to be offseted to avoid Z-fighting. */
@@ -468,7 +460,7 @@ static DRWPass *edit_mesh_create_overlay_pass(
 	DRW_shgroup_uniform_ivec4(*r_ledges_shgrp, "dataMask", data_mask, 1);
 	DRW_shgroup_uniform_bool_copy(*r_ledges_shgrp, "doEdges", do_edges);
 	if (rv3d->rflag & RV3D_CLIPPING) {
-		EDIT_MESH_shgroup_world_clip_planes_from_rv3d(*r_ledges_shgrp, rv3d);
+		DRW_shgroup_world_clip_planes_from_rv3d(*r_ledges_shgrp, rv3d);
 	}
 
 	return pass;
@@ -556,7 +548,7 @@ static void EDIT_MESH_cache_init(void *vedata)
 		DRW_shgroup_uniform_texture(stl->g_data->fweights_shgrp, "colorramp", globals_weight_ramp);
 		DRW_shgroup_uniform_block(stl->g_data->fweights_shgrp, "globalsBlock", globals_ubo);
 		if (rv3d->rflag & RV3D_CLIPPING) {
-			EDIT_MESH_shgroup_world_clip_planes_from_rv3d(stl->g_data->fweights_shgrp, rv3d);
+			DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->fweights_shgrp, rv3d);
 		}
 	}
 
@@ -589,21 +581,21 @@ static void EDIT_MESH_cache_init(void *vedata)
 		DRW_shgroup_uniform_float(stl->g_data->fnormals_shgrp, "normalSize", &size_normal, 1);
 		DRW_shgroup_uniform_vec4(stl->g_data->fnormals_shgrp, "color", ts.colorNormal, 1);
 		if (rv3d->rflag & RV3D_CLIPPING) {
-			EDIT_MESH_shgroup_world_clip_planes_from_rv3d(stl->g_data->fnormals_shgrp, rv3d);
+			DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->fnormals_shgrp, rv3d);
 		}
 
 		stl->g_data->vnormals_shgrp = DRW_shgroup_create(sh_data->normals, psl->normals);
 		DRW_shgroup_uniform_float(stl->g_data->vnormals_shgrp, "normalSize", &size_normal, 1);
 		DRW_shgroup_uniform_vec4(stl->g_data->vnormals_shgrp, "color", ts.colorVNormal, 1);
 		if (rv3d->rflag & RV3D_CLIPPING) {
-			EDIT_MESH_shgroup_world_clip_planes_from_rv3d(stl->g_data->vnormals_shgrp, rv3d);
+			DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->vnormals_shgrp, rv3d);
 		}
 
 		stl->g_data->lnormals_shgrp = DRW_shgroup_create(sh_data->normals_loop, psl->normals);
 		DRW_shgroup_uniform_float(stl->g_data->lnormals_shgrp, "normalSize", &size_normal, 1);
 		DRW_shgroup_uniform_vec4(stl->g_data->lnormals_shgrp, "color", ts.colorLNormal, 1);
 		if (rv3d->rflag & RV3D_CLIPPING) {
-			EDIT_MESH_shgroup_world_clip_planes_from_rv3d(stl->g_data->lnormals_shgrp, rv3d);
+			DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->lnormals_shgrp, rv3d);
 		}
 	}
 
@@ -639,7 +631,7 @@ static void EDIT_MESH_cache_init(void *vedata)
 		DRW_shgroup_uniform_block(stl->g_data->facefill_occluded_shgrp, "globalsBlock", globals_ubo);
 		DRW_shgroup_uniform_ivec4(stl->g_data->facefill_occluded_shgrp, "dataMask", stl->g_data->data_mask, 1);
 		if (rv3d->rflag & RV3D_CLIPPING) {
-			EDIT_MESH_shgroup_world_clip_planes_from_rv3d(stl->g_data->facefill_occluded_shgrp, rv3d);
+			DRW_shgroup_world_clip_planes_from_rv3d(stl->g_data->facefill_occluded_shgrp, rv3d);
 		}
 
 		/* we need a full screen pass to combine the result */
diff --git a/source/blender/draw/modes/overlay_mode.c b/source/blender/draw/modes/overlay_mode.c
index 274843ac289..2fc4cf3a765 100644
--- a/source/blender/draw/modes/overlay_mode.c
+++ b/source/blender/draw/modes/overlay_mode.c
@@ -65,14 +65,21 @@ typedef struct OVERLAY_PrivateData {
 	bool show_overlays;
 } OVERLAY_PrivateData; /* Transient data */
 
-/* *********** STATIC *********** */
-static struct {
+#define DEF_WORLD_CLIP_STR "#define USE_WORLD_CLIP_PLANES\n"
+
+typedef struct OVERLAY_ShaderData {
 	/* Face orientation shader */
 	struct GPUShader *face_orientation_sh;
 	/* Wireframe shader */
 	struct GPUShader *select_wireframe_sh;
 	struct GPUShader *face_wireframe_sh;
 	struct GPUShader *face_wireframe_sculpt_sh;
+} OVERLAY_ShaderData;
+
+/* *********** STATIC *********** */
+static struct {
+	/* 0: normal, 1: clipped. */
+	OVERLAY_ShaderData sh_data[2];
 } e_data = {NULL};
 
 /* Shaders */
@@ -86,43 +93,62 @@ extern char datatoc_gpu_shader_depth_only_frag_glsl[];
 
 extern struct GlobalsUboStorage ts; /* draw_common.c */
 
+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)
 {
 	OVERLAY_Data *data = vedata;
 	OVERLAY_StorageList *stl = data->stl;
 
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	OVERLAY_ShaderData *sh_data = &e_data.sh_data[OVERLAY_sh_data_index_from_rv3d(draw_ctx->rv3d)];
+	const bool is_clip = (draw_ctx->rv3d->rflag & RV3D_CLIPPING) != 0;
+
+	if (is_clip) {
+		DRW_state_clip_planes_len_set((draw_ctx->rv3d->viewlock & RV3D_BOXCLIP) ? 4 : 6);
+	}
+
 	if (!stl->g_data) {
 		/* Alloc transient pointers */
 		stl->g_data = MEM_mallocN(sizeof(*stl->g_data), __func__);
 	}
 	stl->g_data->ghost_stencil_test = false;
 
-	if (!e_data.face_orientation_sh) {
+	if (!sh_data->face_orientation_sh) {
 		/* Face orientation */
-		e_data.face_orientation_sh = DRW_shader_create(
+		sh_data->face_orientation_sh = DRW_shader_create(
 		        datatoc_overlay_face_orientation_vert_glsl, NULL,
-		        datatoc_overlay_face_orientation_frag_glsl, NULL);
+		        datatoc_overlay_face_orientation_frag_glsl,
+		        is_clip ? NULL : DEF_WORLD_CLIP_STR);
 	}
 
-	if (!e_data.face_wireframe_sh) {
-		e_data.select_wireframe_sh = DRW_shader_create(
+	if (!sh_data->face_wireframe_sh) {
+		sh_data->select_wireframe_sh = DRW_shader_create(
 		        datatoc_overlay_face_wireframe_vert_glsl,
 		        datatoc_overlay_face_wireframe_geom_glsl,
 		        datatoc_gpu_shader_depth_only_frag_glsl,
-		        "#define SELECT_EDGES\n");
+		        DEF_WORLD_CLIP_STR "#define SELECT_EDGES\n" +
+		        (is_clip ? 0 : strlen(DEF_WORLD_CLIP_STR)));
 
-		e_data.face_wireframe_sh = DRW_shader_create(
+		sh_data->face_wireframe_sh = DRW_shader_create(
 		        datatoc_overlay_face_wireframe_vert_glsl,
 		        NULL,
 		        datatoc_overlay_face_wireframe_frag_glsl,
-		        NULL);
+		        is_clip ? DEF_WORLD_CLIP_STR : NULL);
 
-		e_data.face_wireframe_sculpt_sh = DRW_shader_create(
+		sh_data->face_wireframe_sculpt_sh = DRW_shader_create(
 		        datatoc_overlay_face_wireframe_vert_glsl,
 		        datatoc_overla

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list