[Bf-blender-cvs] [23c24cead58] blender2.8: T55456: EditMode Drawing

Jeroen Bakker noreply at git.blender.org
Wed Jun 13 12:40:36 CEST 2018


Commit: 23c24cead582f8d766e87ba9adc0f612b16bceea
Author: Jeroen Bakker
Date:   Wed Jun 13 08:17:14 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB23c24cead582f8d766e87ba9adc0f612b16bceea

T55456: EditMode Drawing

- Hide facedots, except when in V3D_ZBUF_SELECT mode
`use_occluded_geometry`
- Different theme (wire_inactive) when not in edge selection mode

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

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/shaders/common_globals_lib.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_frag.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/editors/include/UI_resources.h
M	source/blender/editors/interface/resources.c
M	source/blender/makesdna/DNA_userdef_types.h
M	source/blender/makesrna/intern/rna_userdef.c

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

diff --git a/source/blender/draw/intern/draw_common.c b/source/blender/draw/intern/draw_common.c
index fb8833f40c3..61bbb7be1c1 100644
--- a/source/blender/draw/intern/draw_common.c
+++ b/source/blender/draw/intern/draw_common.c
@@ -50,6 +50,7 @@ struct GPUTexture *globals_ramp = NULL;
 void DRW_globals_update(void)
 {
 	UI_GetThemeColor4fv(TH_WIRE, ts.colorWire);
+	UI_GetThemeColor4fv(TH_WIRE_INACTIVE, ts.colorWireInactive);
 	UI_GetThemeColor4fv(TH_WIRE_EDIT, ts.colorWireEdit);
 	UI_GetThemeColor4fv(TH_ACTIVE, ts.colorActive);
 	UI_GetThemeColor4fv(TH_SELECT, ts.colorSelect);
@@ -64,6 +65,7 @@ void DRW_globals_update(void)
 	UI_GetThemeColor4fv(TH_VERTEX_SELECT, ts.colorVertexSelect);
 	UI_GetThemeColor4fv(TH_EDITMESH_ACTIVE, ts.colorEditMeshActive);
 	UI_GetThemeColor4fv(TH_EDGE_SELECT, ts.colorEdgeSelect);
+	
 	UI_GetThemeColor4fv(TH_EDGE_SEAM, ts.colorEdgeSeam);
 	UI_GetThemeColor4fv(TH_EDGE_SHARP, ts.colorEdgeSharp);
 	UI_GetThemeColor4fv(TH_EDGE_CREASE, ts.colorEdgeCrease);
diff --git a/source/blender/draw/intern/draw_common.h b/source/blender/draw/intern/draw_common.h
index 6227130fb05..5e29831624b 100644
--- a/source/blender/draw/intern/draw_common.h
+++ b/source/blender/draw/intern/draw_common.h
@@ -41,6 +41,7 @@ struct PTCacheEdit;
 typedef struct GlobalsUboStorage {
 	/* UBOs data needs to be 16 byte aligned (size of vec4) */
 	float colorWire[4];
+	float colorWireInactive[4];
 	float colorWireEdit[4];
 	float colorActive[4];
 	float colorSelect[4];
diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index b50fb554a51..1a271fadd6b 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -91,12 +91,23 @@ typedef struct EDIT_MESH_Data {
 static struct {
 	/* weight/vert-color */
 	GPUShader *vcolor_face_shader;
+
+	/* Geometry */
 	GPUShader *overlay_tri_sh;
 	GPUShader *overlay_tri_fast_sh;
 	GPUShader *overlay_tri_vcol_sh;
 	GPUShader *overlay_tri_vcol_fast_sh;
-	GPUShader *overlay_edge_sh;
-	GPUShader *overlay_edge_vcol_sh;
+	GPUShader *overlay_tri_edgesel_sh;
+	GPUShader *overlay_tri_edgesel_fast_sh;
+	GPUShader *overlay_tri_vcol_edgesel_sh;
+	GPUShader *overlay_tri_vcol_edgesel_fast_sh;
+
+	/* Loose Edges */
+	GPUShader *overlay_loose_edge_sh;
+	GPUShader *overlay_loose_edge_vcol_sh;
+	GPUShader *overlay_loose_edge_edgesel_sh;
+	GPUShader *overlay_loose_edge_vcol_edgesel_sh;
+
 	GPUShader *overlay_vert_sh;
 	GPUShader *overlay_facedot_sh;
 	GPUShader *overlay_mix_sh;
@@ -195,22 +206,88 @@ static void EDIT_MESH_engine_init(void *vedata)
 		        "#define ANTI_ALIASING\n"
 		        "#define VERTEX_FACING\n");
 	}
-	if (!e_data.overlay_edge_sh) {
-		e_data.overlay_edge_sh = DRW_shader_create_with_lib(
+
+	if (!e_data.overlay_tri_edgesel_sh) {
+		e_data.overlay_tri_edgesel_sh = DRW_shader_create_with_lib(
+		        datatoc_edit_mesh_overlay_vert_glsl,
+		        datatoc_edit_mesh_overlay_geom_tri_glsl,
+		        datatoc_edit_mesh_overlay_frag_glsl,
+		        datatoc_common_globals_lib_glsl,
+		        "#define EDGE_FIX\n"
+		        "#define EDGE_SELECTION\n"
+		        "#define ANTI_ALIASING\n"
+		        "#define VERTEX_FACING");
+	}
+	if (!e_data.overlay_tri_edgesel_fast_sh) {
+		e_data.overlay_tri_edgesel_fast_sh = DRW_shader_create_with_lib(
+		        datatoc_edit_mesh_overlay_vert_glsl,
+		        datatoc_edit_mesh_overlay_geom_tri_glsl,
+		        datatoc_edit_mesh_overlay_frag_glsl,
+		        datatoc_common_globals_lib_glsl,
+		        "#define ANTI_ALIASING\n"
+		        "#define EDGE_SELECTION\n"
+		        "#define VERTEX_FACING\n");
+	}
+	if (!e_data.overlay_tri_vcol_edgesel_sh) {
+		e_data.overlay_tri_vcol_edgesel_sh = DRW_shader_create_with_lib(
+		        datatoc_edit_mesh_overlay_vert_glsl,
+		        datatoc_edit_mesh_overlay_geom_tri_glsl,
+		        datatoc_edit_mesh_overlay_frag_glsl,
+		        datatoc_common_globals_lib_glsl,
+		        "#define EDGE_FIX\n"
+		        "#define VERTEX_SELECTION\n"
+		        "#define EDGE_SELECTION\n"
+		        "#define ANTI_ALIASING\n"
+		        "#define VERTEX_FACING\n");
+	}
+	if (!e_data.overlay_tri_vcol_edgesel_fast_sh) {
+		e_data.overlay_tri_vcol_edgesel_fast_sh = DRW_shader_create_with_lib(
+		        datatoc_edit_mesh_overlay_vert_glsl,
+		        datatoc_edit_mesh_overlay_geom_tri_glsl,
+		        datatoc_edit_mesh_overlay_frag_glsl,
+		        datatoc_common_globals_lib_glsl,
+		        "#define VERTEX_SELECTION\n"
+		        "#define EDGE_SELECTION\n"
+		        "#define ANTI_ALIASING\n"
+		        "#define VERTEX_FACING\n");
+	}
+
+	if (!e_data.overlay_loose_edge_sh) {
+		e_data.overlay_loose_edge_sh = DRW_shader_create_with_lib(
+		        datatoc_edit_mesh_overlay_vert_glsl,
+		        datatoc_edit_mesh_overlay_geom_edge_glsl,
+		        datatoc_edit_mesh_overlay_frag_glsl,
+		        datatoc_common_globals_lib_glsl,
+		        "#define ANTI_ALIASING\n"
+		        "#define VERTEX_FACING\n");
+	}
+	if (!e_data.overlay_loose_edge_vcol_sh) {
+		e_data.overlay_loose_edge_vcol_sh = DRW_shader_create_with_lib(
+		        datatoc_edit_mesh_overlay_vert_glsl,
+		        datatoc_edit_mesh_overlay_geom_edge_glsl,
+		        datatoc_edit_mesh_overlay_frag_glsl,
+		        datatoc_common_globals_lib_glsl,
+		        "#define VERTEX_SELECTION\n"
+		        "#define VERTEX_FACING\n");
+	}
+	if (!e_data.overlay_loose_edge_edgesel_sh) {
+		e_data.overlay_loose_edge_edgesel_sh = DRW_shader_create_with_lib(
 		        datatoc_edit_mesh_overlay_vert_glsl,
 		        datatoc_edit_mesh_overlay_geom_edge_glsl,
 		        datatoc_edit_mesh_overlay_frag_glsl,
 		        datatoc_common_globals_lib_glsl,
 		        "#define ANTI_ALIASING\n"
+		        "#define EDGE_SELECTION\n"
 		        "#define VERTEX_FACING\n");
 	}
-	if (!e_data.overlay_edge_vcol_sh) {
-		e_data.overlay_edge_vcol_sh = DRW_shader_create_with_lib(
+	if (!e_data.overlay_loose_edge_vcol_edgesel_sh) {
+		e_data.overlay_loose_edge_vcol_edgesel_sh = DRW_shader_create_with_lib(
 		        datatoc_edit_mesh_overlay_vert_glsl,
 		        datatoc_edit_mesh_overlay_geom_edge_glsl,
 		        datatoc_edit_mesh_overlay_frag_glsl,
 		        datatoc_common_globals_lib_glsl,
 		        "#define VERTEX_SELECTION\n"
+		        "#define EDGE_SELECTION\n"
 		        "#define VERTEX_FACING\n");
 	}
 	if (!e_data.overlay_vert_sh) {
@@ -271,22 +348,23 @@ static DRWPass *edit_mesh_create_overlay_pass(
 	RegionView3D *rv3d = draw_ctx->rv3d;
 	Scene *scene = draw_ctx->scene;
 	ToolSettings *tsettings = scene->toolsettings;
+	const bool in_edge_mode = (tsettings->selectmode & SCE_SELECT_EDGE) > 0;
 
 	if ((tsettings->selectmode & SCE_SELECT_VERTEX) != 0) {
-		ledge_sh = e_data.overlay_edge_vcol_sh;
+		ledge_sh = in_edge_mode? e_data.overlay_loose_edge_vcol_edgesel_sh: e_data.overlay_loose_edge_vcol_sh;
 
 		if ((rv3d->rflag & RV3D_NAVIGATING) != 0)
-			tri_sh = e_data.overlay_tri_vcol_fast_sh;
+			tri_sh = in_edge_mode? e_data.overlay_tri_vcol_edgesel_fast_sh: e_data.overlay_tri_vcol_fast_sh;
 		else
-			tri_sh = e_data.overlay_tri_vcol_sh;
+			tri_sh = in_edge_mode? e_data.overlay_tri_vcol_edgesel_sh: e_data.overlay_tri_vcol_sh;
 	}
 	else {
-		ledge_sh = e_data.overlay_edge_sh;
+		ledge_sh = in_edge_mode? e_data.overlay_loose_edge_edgesel_sh: e_data.overlay_loose_edge_sh;
 
 		if ((rv3d->rflag & RV3D_NAVIGATING) != 0)
-			tri_sh = e_data.overlay_tri_fast_sh;
+			tri_sh = in_edge_mode? e_data.overlay_tri_edgesel_fast_sh: e_data.overlay_tri_fast_sh;
 		else
-			tri_sh = e_data.overlay_tri_sh;
+			tri_sh = in_edge_mode? e_data.overlay_tri_edgesel_sh: e_data.overlay_tri_sh;
 	}
 
 	DRWPass *pass = DRW_pass_create(
@@ -435,7 +513,7 @@ static void edit_mesh_add_ob_to_pass(
 		DRW_shgroup_call_add(lverts_shgrp, geo_ovl_lverts, ob->obmat);
 	}
 
-	if ((tsettings->selectmode & SCE_SELECT_FACE) != 0) {
+	if (facedot_shgrp && (tsettings->selectmode & SCE_SELECT_FACE) != 0 ) {
 		geo_ovl_fcenter = DRW_cache_face_centers_get(ob);
 		DRW_shgroup_call_add(facedot_shgrp, geo_ovl_fcenter, ob->obmat);
 	}
@@ -505,7 +583,7 @@ static void EDIT_MESH_cache_populate(void *vedata, Object *ob)
 			else {
 				edit_mesh_add_ob_to_pass(
 				        scene, ob, stl->g_data->face_overlay_shgrp, stl->g_data->ledges_overlay_shgrp,
-				        stl->g_data->lverts_overlay_shgrp, stl->g_data->facedot_overlay_shgrp, NULL);
+				        stl->g_data->lverts_overlay_shgrp, NULL, NULL);
 			}
 
 			/* 3D text overlay */
@@ -561,8 +639,14 @@ static void EDIT_MESH_engine_free(void)
 	DRW_SHADER_FREE_SAFE(e_data.overlay_tri_fast_sh);
 	DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_sh);
 	DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_fast_sh);
-	DRW_SHADER_FREE_SAFE(e_data.overlay_edge_sh);
-	DRW_SHADER_FREE_SAFE(e_data.overlay_edge_vcol_sh);
+	DRW_SHADER_FREE_SAFE(e_data.overlay_tri_edgesel_sh);
+	DRW_SHADER_FREE_SAFE(e_data.overlay_tri_edgesel_fast_sh);
+	DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_edgesel_sh);
+	DRW_SHADER_FREE_SAFE(e_data.overlay_tri_vcol_edgesel_fast_sh);
+	DRW_SHADER_FREE_SAFE(e_data.overlay_loose_edge_sh);
+	DRW_SHADER_FREE_SAFE(e_data.overlay_loose_edge_vcol_sh);
+	DRW_SHADER_FREE_SAFE(e_data.overlay_loose_edge_edgesel_sh);
+	DRW_SHADER_FREE_SAFE(e_data.overlay_loose_edge_vcol_edgesel_sh);
 	DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh);
 	DRW_SHADER_FREE_SAFE(e_data.overlay_facedot_sh);
 	DRW_SHADER_FREE_SAFE(e_data.overlay_mix_sh);
diff --git a/source/blender/draw/modes/shaders/common_globals_lib.glsl b/source/blender/draw/modes/shaders/common_globals_lib.glsl
index c55457bb6d2..f8a8f3b9203 100644
--- a/source/blender/draw/modes/shaders/common_globals_lib.glsl
+++ b/source/blender/draw/modes/shaders/common_globals_lib.glsl
@@ -2,6 +2,7 @@
 /* keep in sync with GlobalsUboStorage */
 layout(std140) uniform globalsBlock {
 	vec4 colorWire;
+	vec4 colorWireInactive;
 	vec4 colorWireEdit;
 	vec4 colorActive;
 	vec4 colorSelect;
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl
index 07b36079884..71cc1ccde8d 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_frag.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_facedot_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list