2017-02-26 21:07:37 +01:00
|
|
|
|
|
|
|
|
/* Solid Wirefram implementation
|
|
|
|
|
* Mike Erwin, Clément Foucault */
|
|
|
|
|
|
2017-03-03 02:48:34 +01:00
|
|
|
uniform float faceAlphaMod;
|
2018-08-30 15:45:58 +10:00
|
|
|
uniform float edgeScale;
|
2018-11-04 20:01:25 +01:00
|
|
|
uniform bool isXray = false;
|
2018-06-16 15:15:37 +02:00
|
|
|
|
2017-02-26 21:07:37 +01:00
|
|
|
flat in vec3 edgesCrease;
|
|
|
|
|
flat in vec3 edgesBweight;
|
|
|
|
|
flat in vec4 faceColor;
|
2018-01-12 15:09:13 -02:00
|
|
|
flat in ivec3 flag;
|
2017-03-01 18:54:58 +01:00
|
|
|
#ifdef VERTEX_SELECTION
|
2017-05-19 16:12:13 -04:00
|
|
|
in vec3 vertexColor;
|
2017-03-01 18:54:58 +01:00
|
|
|
#endif
|
2018-10-13 16:54:53 +02:00
|
|
|
|
|
|
|
|
#ifdef EDGE_FIX
|
|
|
|
|
flat in vec2 ssPos[3];
|
|
|
|
|
#else
|
|
|
|
|
in vec3 barycentric;
|
|
|
|
|
#endif
|
|
|
|
|
|
2017-09-22 02:42:57 +02:00
|
|
|
#ifdef VERTEX_FACING
|
|
|
|
|
in float facing;
|
|
|
|
|
#endif
|
2017-02-26 21:07:37 +01:00
|
|
|
|
|
|
|
|
out vec4 FragColor;
|
|
|
|
|
|
|
|
|
|
/* Vertex flag is shifted and combined with the edge flag */
|
2018-10-12 15:09:43 +02:00
|
|
|
#define FACE_ACTIVE_ (FACE_ACTIVE << 8)
|
2017-02-26 21:07:37 +01:00
|
|
|
|
2018-11-02 15:07:06 +01:00
|
|
|
#define LARGE_EDGE_SIZE 2.15
|
|
|
|
|
|
|
|
|
|
/* Enough to visually fill gaps and not enough to mess the AA gradient too much. */
|
2018-11-04 20:01:25 +01:00
|
|
|
#define EDGE_FIX_ALPHA 0.67
|
2017-02-26 21:07:37 +01:00
|
|
|
|
2018-10-13 16:54:53 +02:00
|
|
|
void distToEdgesAndPoints(out vec3 edges, out vec3 points)
|
2017-02-26 21:07:37 +01:00
|
|
|
{
|
2018-10-13 16:54:53 +02:00
|
|
|
#ifdef EDGE_FIX
|
|
|
|
|
vec2 e0 = normalize(ssPos[1] - ssPos[0] + 1e-8);
|
|
|
|
|
vec2 e1 = normalize(ssPos[2] - ssPos[1] + 1e-8);
|
|
|
|
|
vec2 e2 = normalize(ssPos[0] - ssPos[2] + 1e-8);
|
|
|
|
|
e0 = vec2(-e0.y, e0.x);
|
|
|
|
|
e1 = vec2(-e1.y, e1.x);
|
|
|
|
|
e2 = vec2(-e2.y, e2.x);
|
|
|
|
|
vec2 p0 = gl_FragCoord.xy - ssPos[0];
|
|
|
|
|
vec2 p1 = gl_FragCoord.xy - ssPos[1];
|
|
|
|
|
vec2 p2 = gl_FragCoord.xy - ssPos[2];
|
|
|
|
|
edges.z = abs(dot(e0, p0));
|
|
|
|
|
edges.x = abs(dot(e1, p1));
|
|
|
|
|
edges.y = abs(dot(e2, p2));
|
|
|
|
|
#else
|
|
|
|
|
vec3 dx = dFdx(barycentric);
|
|
|
|
|
vec3 dy = dFdy(barycentric);
|
|
|
|
|
/* per component derivative */
|
|
|
|
|
vec2 d0 = vec2(dx.x, dy.x);
|
|
|
|
|
vec2 d1 = vec2(dx.y, dy.y);
|
|
|
|
|
vec2 d2 = vec2(dx.z, dy.z);
|
|
|
|
|
vec3 d = vec3(length(d0), length(d1), length(d2));
|
|
|
|
|
|
|
|
|
|
edges = abs(vec3(barycentric / d));
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if defined(VERTEX_SELECTION) && defined(EDGE_FIX)
|
|
|
|
|
points.x = dot(p0, p0);
|
|
|
|
|
points.y = dot(p1, p1);
|
|
|
|
|
points.z = dot(p2, p2);
|
|
|
|
|
points = sqrt(points);
|
|
|
|
|
#else
|
|
|
|
|
points = vec3(1e10);
|
|
|
|
|
#endif
|
2017-02-26 21:07:37 +01:00
|
|
|
}
|
|
|
|
|
|
2018-06-16 15:15:37 +02:00
|
|
|
void colorDist(vec4 color, float dist)
|
2017-02-26 21:07:37 +01:00
|
|
|
{
|
2018-06-16 15:15:37 +02:00
|
|
|
FragColor = (dist < 0) ? color : FragColor;
|
2017-02-26 21:07:37 +01:00
|
|
|
}
|
|
|
|
|
|
2017-09-21 22:00:48 +02:00
|
|
|
#ifdef ANTI_ALIASING
|
|
|
|
|
void colorDistEdge(vec4 color, float dist)
|
|
|
|
|
{
|
2018-06-14 21:45:02 +02:00
|
|
|
FragColor.rgb *= FragColor.a;
|
2017-09-21 22:00:48 +02:00
|
|
|
FragColor = mix(color, FragColor, clamp(dist, 0.0, 1.0));
|
2018-06-15 22:09:10 +02:00
|
|
|
FragColor.rgb /= max(1e-8, FragColor.a);
|
2017-09-21 22:00:48 +02:00
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
#define colorDistEdge colorDist
|
|
|
|
|
#endif
|
|
|
|
|
|
2017-02-26 21:07:37 +01:00
|
|
|
void main()
|
|
|
|
|
{
|
2018-10-13 16:54:53 +02:00
|
|
|
vec3 e, p;
|
|
|
|
|
distToEdgesAndPoints(e, p);
|
2017-02-26 21:07:37 +01:00
|
|
|
|
2018-06-16 15:15:37 +02:00
|
|
|
/* Face */
|
2017-02-26 21:07:37 +01:00
|
|
|
FragColor = faceColor;
|
2018-06-14 08:51:42 +02:00
|
|
|
FragColor.a *= faceAlphaMod;
|
2017-03-01 18:54:58 +01:00
|
|
|
|
2017-02-26 21:07:37 +01:00
|
|
|
/* Edges */
|
2018-08-30 15:45:58 +10:00
|
|
|
float sizeEdgeFinal = sizeEdge * edgeScale;
|
|
|
|
|
|
2017-02-26 21:07:37 +01:00
|
|
|
for (int v = 0; v < 3; ++v) {
|
2017-03-01 18:54:58 +01:00
|
|
|
if ((flag[v] & EDGE_EXISTS) != 0) {
|
2017-09-21 22:00:48 +02:00
|
|
|
/* Outer large edge */
|
2018-08-30 15:45:58 +10:00
|
|
|
float largeEdge = e[v] - sizeEdgeFinal * LARGE_EDGE_SIZE;
|
2017-09-21 22:00:48 +02:00
|
|
|
|
2018-10-12 15:09:43 +02:00
|
|
|
vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0] & FACE_ACTIVE_) != 0, edgesCrease[v], edgesBweight[v]);
|
2018-11-02 15:07:06 +01:00
|
|
|
#ifdef EDGE_FIX
|
2018-11-04 20:01:25 +01:00
|
|
|
large_edge_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
|
2018-11-02 15:07:06 +01:00
|
|
|
#endif
|
2017-09-22 03:44:06 +02:00
|
|
|
if (large_edge_color.a != 0.0) {
|
2017-09-21 22:00:48 +02:00
|
|
|
colorDistEdge(large_edge_color, largeEdge);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Inner thin edge */
|
2018-08-30 15:45:58 +10:00
|
|
|
float innerEdge = e[v] - sizeEdgeFinal;
|
2017-09-21 22:00:48 +02:00
|
|
|
#ifdef ANTI_ALIASING
|
2018-06-15 20:09:38 +02:00
|
|
|
innerEdge += 0.4;
|
2017-09-21 22:00:48 +02:00
|
|
|
#endif
|
2017-03-01 18:54:58 +01:00
|
|
|
|
2017-09-21 22:00:48 +02:00
|
|
|
#ifdef VERTEX_SELECTION
|
2018-11-02 15:07:06 +01:00
|
|
|
vec4 inner_edge_color = vec4(vertexColor, 1.0);
|
2017-03-02 01:07:03 +01:00
|
|
|
#else
|
2018-10-12 15:09:43 +02:00
|
|
|
vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0] & FACE_ACTIVE_) != 0);
|
2018-11-16 00:12:45 +01:00
|
|
|
#endif
|
|
|
|
|
#ifdef EDGE_FIX
|
2018-11-04 20:01:25 +01:00
|
|
|
inner_edge_color *= isXray ? 1.0 : EDGE_FIX_ALPHA;
|
2017-03-01 18:54:58 +01:00
|
|
|
#endif
|
2018-11-16 00:12:45 +01:00
|
|
|
colorDistEdge(inner_edge_color, innerEdge);
|
2017-03-01 18:54:58 +01:00
|
|
|
}
|
2017-02-26 21:07:37 +01:00
|
|
|
}
|
|
|
|
|
|
2018-10-13 16:54:53 +02:00
|
|
|
#if defined(VERTEX_SELECTION) && defined(EDGE_FIX)
|
2017-02-26 21:07:37 +01:00
|
|
|
/* Points */
|
|
|
|
|
for (int v = 0; v < 3; ++v) {
|
2018-11-16 00:12:45 +01:00
|
|
|
if ((flag[v] & EDGE_VERTEX_EXISTS) != 0) {
|
2018-10-11 13:45:50 +11:00
|
|
|
float size = p[v] - sizeVertex;
|
|
|
|
|
vec4 point_color = colorVertex;
|
|
|
|
|
point_color = ((flag[v] & EDGE_VERTEX_SELECTED) != 0) ? colorVertexSelect : point_color;
|
|
|
|
|
point_color = ((flag[v] & EDGE_VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : point_color;
|
|
|
|
|
colorDist(point_color, size);
|
|
|
|
|
}
|
2017-02-26 21:07:37 +01:00
|
|
|
}
|
2017-03-02 01:07:03 +01:00
|
|
|
#endif
|
2017-03-01 14:08:58 +01:00
|
|
|
|
2017-09-22 02:42:57 +02:00
|
|
|
#ifdef VERTEX_FACING
|
2018-12-10 18:30:37 +01:00
|
|
|
FragColor.rgb = mix(colorEditMeshMiddle.rgb, FragColor.rgb, 1.0 - abs(facing) * 0.4);
|
2017-09-22 02:42:57 +02:00
|
|
|
#endif
|
2018-11-02 15:07:06 +01:00
|
|
|
|
2017-03-01 14:08:58 +01:00
|
|
|
/* don't write depth if not opaque */
|
2019-01-25 07:10:13 +11:00
|
|
|
if (FragColor.a == 0.0) {
|
|
|
|
|
discard;
|
|
|
|
|
}
|
2017-02-26 21:07:37 +01:00
|
|
|
}
|