[Bf-blender-cvs] [a3cb9c82380] blender2.8: Wireframe Overlay: Add back the per edge hiding

Clément Foucault noreply at git.blender.org
Sun Jun 24 00:00:41 CEST 2018


Commit: a3cb9c8238072285c0c15c1f0a00aca6c0d5b746
Author: Clément Foucault
Date:   Sun Jun 24 00:01:02 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBa3cb9c8238072285c0c15c1f0a00aca6c0d5b746

Wireframe Overlay: Add back the per edge hiding

This method is a bit more optimized than the very first one
because it does not rely on the adjacent faces properties.

That said it's still a bit slower than the per vertex method.

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

M	source/blender/draw/modes/shaders/overlay_face_wireframe_frag.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/modes/shaders/overlay_face_wireframe_frag.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
index 00ababc624d..5dfbb4352e4 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_frag.glsl
@@ -7,7 +7,7 @@ flat in vec3 ssVec2;
 in float facing;
 
 #ifdef LIGHT_EDGES
-in float edgeSharpness;
+flat in vec3 edgeSharpness;
 #endif
 
 out vec4 fragColor;
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
index 6e833a4e16b..eb69af92435 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_geom.glsl
@@ -20,7 +20,7 @@ in vec3 obPos[];
 in vec3 vNor[];
 in float forceEdge[];
 
-out float edgeSharpness;
+flat out vec3 edgeSharpness;
 #endif
 
 #define NO_EDGE vec3(10000.0);
@@ -33,6 +33,14 @@ vec3 compute_vec(vec2 v0, vec2 v1)
 	return vec3(v, -dot(v, v0));
 }
 
+vec3 get_edge_normal(vec3 n1, vec3 n2, vec3 edge)
+{
+	edge = normalize(edge);
+	vec3 n = n1 + n2;
+	float p = dot(edge, n);
+	return normalize(n - p * edge);
+}
+
 float get_edge_sharpness(vec3 fnor, vec3 vnor)
 {
 	float sharpness = abs(dot(fnor, vnor));
@@ -50,27 +58,27 @@ void main(void)
 	ssVec2 = do_edge.z ? compute_vec(ssPos[2], ssPos[0]) : NO_EDGE;
 
 #ifdef LIGHT_EDGES
-	vec3 fnor = normalize(cross(obPos[1] - obPos[0], obPos[2] - obPos[0]));
-
-	edgeSharpness = get_edge_sharpness(fnor, vNor[0]);
-	edgeSharpness = (forceEdge[0] == 1.0 || forceEdge[2] == 1.0) ? 1.0 : edgeSharpness;
+	vec3 edges[3];
+	edges[0] = obPos[1] - obPos[0];
+	edges[1] = obPos[2] - obPos[1];
+	edges[2] = obPos[0] - obPos[2];
+	vec3 fnor = normalize(cross(edges[0], -edges[2]));
+
+	edgeSharpness.x = get_edge_sharpness(fnor, get_edge_normal(vNor[0], vNor[1], edges[0]));
+	edgeSharpness.y = get_edge_sharpness(fnor, get_edge_normal(vNor[1], vNor[2], edges[1]));
+	edgeSharpness.z = get_edge_sharpness(fnor, get_edge_normal(vNor[2], vNor[0], edges[2]));
+	edgeSharpness.x = (forceEdge[0] == 1.0) ? 1.0 : edgeSharpness.x;
+	edgeSharpness.y = (forceEdge[1] == 1.0) ? 1.0 : edgeSharpness.y;
+	edgeSharpness.z = (forceEdge[2] == 1.0) ? 1.0 : edgeSharpness.z;
 #endif
 	gl_Position = gl_in[0].gl_Position;
 	facing = facings.x;
 	EmitVertex();
 
-#ifdef LIGHT_EDGES
-	edgeSharpness = get_edge_sharpness(fnor, vNor[1]);
-	edgeSharpness = (forceEdge[1] == 1.0 || forceEdge[0] == 1.0) ? 1.0 : edgeSharpness;
-#endif
 	gl_Position = gl_in[1].gl_Position;
 	facing = facings.y;
 	EmitVertex();
 
-#ifdef LIGHT_EDGES
-	edgeSharpness = get_edge_sharpness(fnor, vNor[2]);
-	edgeSharpness = (forceEdge[2] == 1.0 || forceEdge[1] == 1.0) ? 1.0 : edgeSharpness;
-#endif
 	gl_Position = gl_in[2].gl_Position;
 	facing = facings.z;
 	EmitVertex();
diff --git a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
index 616cd5379e9..fe3c2021b7e 100644
--- a/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
+++ b/source/blender/draw/modes/shaders/overlay_face_wireframe_vert.glsl
@@ -27,7 +27,7 @@ out vec3 obPos;
 out vec3 vNor;
 out float forceEdge;
 #else
-out float edgeSharpness;
+flat out vec3 edgeSharpness;
 #endif
 #endif
 
@@ -80,6 +80,14 @@ vec3 get_vertex_pos(uint id)
 	return pos;
 }
 
+vec3 get_edge_normal(vec3 n1, vec3 n2, vec3 edge)
+{
+	edge = normalize(edge);
+	vec3 n = n1 + n2;
+	float p = dot(edge, n);
+	return normalize(n - p * edge);
+}
+
 float get_edge_sharpness(vec3 fnor, vec3 vnor)
 {
 	float sharpness = abs(dot(fnor, vnor));
@@ -152,24 +160,30 @@ void main()
 
 	gl_Position = p_pos[v_n];
 
+#  ifndef LIGHT_EDGES
 	vec3 nor = get_vertex_nor(v_id[v_n]);
-	facing = normalize(NormalMatrix * nor).z;
-
-#  ifdef LIGHT_EDGES
-	vec3 fnor = normalize(cross(pos[1] - pos[0], pos[2] - pos[0]));
-	edgeSharpness = get_edge_sharpness(fnor, nor);
-
-	/* Fix disapearing edges. */
-	if (v_n == 0) {
-		force_edge.xy = force_edge.xz;
-	}
-	else if (v_n == 2) {
-		force_edge.xy = force_edge.yz;
-	}
-	if (any(force_edge.xy)) {
-		edgeSharpness = 1.0;
-	}
+#  else
+	vec3 edges[3];
+	edges[0] = pos[1] - pos[0];
+	edges[1] = pos[2] - pos[1];
+	edges[2] = pos[0] - pos[2];
+	vec3 fnor = normalize(cross(edges[0], -edges[2]));
+
+	vec3 nors[3];
+	nors[0] = get_vertex_nor(v_id.x);
+	nors[1] = get_vertex_nor(v_id.y);
+	nors[2] = get_vertex_nor(v_id.z);
+	edgeSharpness.x = get_edge_sharpness(fnor, get_edge_normal(nors[0], nors[1], edges[0]));
+	edgeSharpness.y = get_edge_sharpness(fnor, get_edge_normal(nors[1], nors[2], edges[1]));
+	edgeSharpness.z = get_edge_sharpness(fnor, get_edge_normal(nors[2], nors[0], edges[2]));
+	edgeSharpness.x = force_edge.x ? 1.0 : edgeSharpness.x;
+	edgeSharpness.y = force_edge.y ? 1.0 : edgeSharpness.y;
+	edgeSharpness.z = force_edge.z ? 1.0 : edgeSharpness.z;
+
+	vec3 nor = nors[v_n];
 #  endif
 
+	facing = normalize(NormalMatrix * nor).z;
+
 #endif
 }



More information about the Bf-blender-cvs mailing list