Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/draw/modes/shaders')
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl4
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl31
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl20
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl51
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl52
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl41
-rw-r--r--source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl89
7 files changed, 152 insertions, 136 deletions
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
index bdf3ef267e9..b37862f2037 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_common_lib.glsl
@@ -12,6 +12,10 @@
#define VERTEX_SELECTED (1 << 1)
#define VERTEX_EXISTS (1 << 2)
+#define FACE_ACTIVE (1 << 3)
+#define FACE_SELECTED (1 << 4)
+#define FACE_FREESTYLE (1 << 5)
+
uniform bool doEdges = true;
vec4 EDIT_MESH_edge_color_outer(int edge_flag, bool face_active, float crease, float bweight)
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
index 92eb00d4dcc..31cebc84461 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
@@ -2,13 +2,6 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
-/* This is not perfect. Only a subset of intel gpus are affected.
- * This fix have some performance impact.
- * TODO Refine the range to only affect GPUs. */
-
uniform float faceAlphaMod;
uniform float edgeScale;
@@ -23,12 +16,12 @@ in vec3 vertexColor;
in float facing;
#endif
-flat in vec2 ssPos[3];
+in vec3 barycentric;
out vec4 FragColor;
/* Vertex flag is shifted and combined with the edge flag */
-#define FACE_ACTIVE (1 << (3 + 8))
+#define FACE_ACTIVE_ (FACE_ACTIVE << 8)
#define LARGE_EDGE_SIZE 3.0
@@ -61,12 +54,15 @@ void colorDistEdge(vec4 color, float dist)
void main()
{
- vec3 e, p;
-
/* Step 1 : Computing Distances */
- distToEdgeAndPoint((ssPos[1] - ssPos[0]) + 1e-8, ssPos[0], e.z, p.x);
- distToEdgeAndPoint((ssPos[2] - ssPos[1]) + 1e-8, ssPos[1], e.x, p.y);
- distToEdgeAndPoint((ssPos[0] - ssPos[2]) + 1e-8, ssPos[2], e.y, p.z);
+ vec3 dx = dFdx(barycentric);
+ vec3 dy = dFdy(barycentric);
+ vec3 d = vec3(
+ length(vec2(dx.x, dy.x)),
+ length(vec2(dx.y, dy.y)),
+ length(vec2(dx.z, dy.z))
+ );
+ vec3 e = abs(vec3(barycentric / d));
/* Step 2 : coloring (order dependent) */
@@ -82,7 +78,7 @@ void main()
/* Outer large edge */
float largeEdge = e[v] - sizeEdgeFinal * LARGE_EDGE_SIZE;
- vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0]& FACE_ACTIVE) != 0, edgesCrease[v], edgesBweight[v]);
+ vec4 large_edge_color = EDIT_MESH_edge_color_outer(flag[v], (flag[0] & FACE_ACTIVE_) != 0, edgesCrease[v], edgesBweight[v]);
if (large_edge_color.a != 0.0) {
colorDistEdge(large_edge_color, largeEdge);
@@ -97,12 +93,13 @@ void main()
#ifdef VERTEX_SELECTION
colorDistEdge(vec4(vertexColor, 1.0), innerEdge);
#else
- vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0]& FACE_ACTIVE) != 0);
+ vec4 inner_edge_color = EDIT_MESH_edge_color_inner(flag[v], (flag[0] & FACE_ACTIVE_) != 0);
colorDistEdge(inner_edge_color, innerEdge);
#endif
}
}
+#if 0
/* Points */
#ifdef VERTEX_SELECTION
for (int v = 0; v < 3; ++v) {
@@ -120,11 +117,11 @@ void main()
}
}
#endif
+#endif
#ifdef VERTEX_FACING
FragColor.a *= 1.0 - abs(facing) * 0.4;
#endif
-
/* don't write depth if not opaque */
if (FragColor.a == 0.0) discard;
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
index 68fcc33acff..0368f170cb1 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
@@ -2,11 +2,8 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
layout(lines) in;
-layout(triangle_strip, max_vertices=6) out;
+layout(triangle_strip, max_vertices=4) out;
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
@@ -24,6 +21,7 @@ flat out vec3 edgesCrease;
flat out vec3 edgesBweight;
flat out vec4 faceColor;
flat out ivec3 flag;
+out vec3 barycentric;
#ifdef VERTEX_SELECTION
out vec3 vertexColor;
#endif
@@ -34,9 +32,6 @@ out float facing;
/* See fragment shader */
flat out vec2 ssPos[3];
-#define FACE_ACTIVE (1 << 3)
-#define FACE_SELECTED (1 << 4)
-
/* project to screen space */
vec2 proj(vec4 pos)
{
@@ -94,20 +89,21 @@ void main()
ssPos[1] = pos[1];
flag[0] = flag[2] = (vData[0].x << 8);
flag[1] = (vData[1].x << 8);
-
- doVertex(0, pPos[0] + vec4(-dirs1.xy, 0.0, 0.0));
+ barycentric = vec3(1.0);
doVertex(0, pPos[0] + vec4( dirs1.zw, 0.0, 0.0));
+
+ barycentric[2] = -1.0;
doVertex(0, pPos[0] + vec4(-dirs1.zw, 0.0, 0.0));
flag[2] |= vData[0].y;
edgesCrease[2] = vData[0].z / 255.0;
edgesBweight[2] = vData[0].w / 255.0;
+ barycentric = vec3(1.0);
doVertex(1, pPos[1] + vec4( dirs2.zw, 0.0, 0.0));
- doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0));
- flag[2] = 0;
- doVertex(1, pPos[1] + vec4( dirs2.xy, 0.0, 0.0));
+ barycentric[2] = -1.0;
+ doVertex(1, pPos[1] + vec4(-dirs2.zw, 0.0, 0.0));
EndPrimitive();
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
index d020bcc6951..ccdf81bff7d 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
@@ -2,30 +2,14 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
layout(triangles) in;
-/* This is not perfect. Only a subset of intel gpus are affected.
- * This fix have some performance impact.
- * TODO Refine the range to only affect GPUs. */
-
-#ifdef EDGE_FIX
/* To fix the edge artifacts, we render
* an outline strip around the screenspace
* triangle. Order is important.
* TODO diagram
*/
-
-#ifdef VERTEX_SELECTION
-layout(triangle_strip, max_vertices=23) out;
-#else
-layout(triangle_strip, max_vertices=17) out;
-#endif
-#else
-layout(triangle_strip, max_vertices=3) out;
-#endif
+layout(triangle_strip, max_vertices=15) out;
uniform mat4 ProjectionMatrix;
uniform vec2 viewportSize;
@@ -43,7 +27,8 @@ flat out vec3 edgesCrease;
flat out vec3 edgesBweight;
flat out vec4 faceColor;
flat out ivec3 flag;
-flat out int clipCase;
+
+out vec3 barycentric;
#ifdef VERTEX_SELECTION
out vec3 vertexColor;
#endif
@@ -51,13 +36,6 @@ out vec3 vertexColor;
out float facing;
#endif
-/* See fragment shader */
-flat out vec2 ssPos[3];
-
-#define FACE_ACTIVE (1 << 3)
-#define FACE_SELECTED (1 << 4)
-#define FACE_FREESTYLE (1 << 5)
-
/* project to screen space */
vec2 proj(vec4 pos)
{
@@ -73,8 +51,9 @@ void doVertex(int v)
#ifdef VERTEX_FACING
facing = vFacing[v];
#endif
-
gl_Position = pPos[v];
+ barycentric = vec3(0.0);
+ barycentric[v % 3] = 1.0;
EmitVertex();
}
@@ -84,6 +63,7 @@ void doLoopStrip(int v, vec3 offset)
doVertex(v);
gl_Position.xyz += offset;
+ barycentric = vec3(1.0);
EmitVertex();
}
@@ -115,6 +95,7 @@ void main()
faceColor = colorFace;
/* Vertex */
+ vec2 ssPos[3];
ssPos[0] = proj(pPos[0]);
ssPos[1] = proj(pPos[1]);
ssPos[2] = proj(pPos[2]);
@@ -123,10 +104,8 @@ void main()
doVertex(1);
doVertex(2);
-#ifdef EDGE_FIX
vec2 fixvec[6];
vec2 fixvecaf[6];
- vec2 cornervec[3];
/* This fix the case when 2 vertices are perfectly aligned
* and corner vectors have nowhere to go.
@@ -150,8 +129,6 @@ void main()
vec2 dir = normalize(v2 - v1);
vec2 dir2 = normalize(v3 - v1);
- cornervec[i] = -normalize(dir + dir2);
-
/* perpendicular to dir */
vec2 perp = vec2(-dir.y, dir.x);
@@ -162,7 +139,6 @@ void main()
/* Make it view independent */
perp *= sizeEdgeFix / viewportSize;
- cornervec[i] *= sizeEdgeFix / viewportSize;
fixvec[i] = fixvecaf[i] = perp;
/* Perspective */
@@ -171,7 +147,6 @@ void main()
* our fixvec to be flipped */
fixvec[i] *= -vPos[i].z;
fixvecaf[i] *= -vPos[i1].z;
- cornervec[i] *= -vPos[i].z;
}
}
@@ -195,16 +170,6 @@ void main()
flag[v] &= ~EDGE_EXISTS;
doLoopStrip(vaf, vec3(fixvecaf[v], Z_OFFSET));
- /* corner vertices should not draw edges but draw point only */
- flag[vbe] &= ~EDGE_EXISTS;
-#ifdef VERTEX_SELECTION
- doLoopStrip(vaf, vec3(cornervec[vaf], Z_OFFSET));
-#endif
+ EndPrimitive();
}
-
- /* finish the loop strip */
- doLoopStrip(2, vec3(fixvec[2], Z_OFFSET));
-#endif
-
- EndPrimitive();
}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
deleted file mode 100644
index 13d824c2410..00000000000
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
+++ /dev/null
@@ -1,52 +0,0 @@
-
-/* Solid Wirefram implementation
- * Mike Erwin, Clément Foucault */
-
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
-uniform mat4 ModelViewProjectionMatrix;
-uniform vec2 viewportSize;
-
-in vec3 pos;
-in ivec4 data;
-
-/* these are the same for all vertices
- * and does not need interpolation */
-flat out vec3 edgesCrease;
-flat out vec3 edgesBweight;
-flat out vec4 faceColor;
-flat out ivec3 flag;
-#ifdef VERTEX_SELECTION
-out vec3 vertexColor;
-#endif
-
-/* See fragment shader */
-flat out vec2 ssPos[3];
-
-/* project to screen space */
-vec2 proj(vec4 pos)
-{
- return (0.5 * (pos.xy / pos.w) + 0.5) * viewportSize;
-}
-
-void main()
-{
- edgesCrease = vec3(0.0);
- edgesBweight = vec3(0.0);
-
- vec4 pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
-
- /* there is no face */
- faceColor = vec4(0.0);
-
-#ifdef VERTEX_SELECTION
- vertexColor = vec3(0.0);
-#endif
-
- ssPos[0] = ssPos[1] = ssPos[2] = proj(pPos);
- flag[0] = flag[1] = flag[2] = (data.x << 8);
-
- gl_PointSize = sizeEdgeFix;
- gl_Position = pPos;
-}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl
new file mode 100644
index 00000000000..484a017e171
--- /dev/null
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_points_vert.glsl
@@ -0,0 +1,41 @@
+
+uniform mat3 NormalMatrix;
+uniform mat4 ProjectionMatrix;
+uniform mat4 ModelViewMatrix;
+uniform mat4 ModelViewProjectionMatrix;
+uniform float ofs = 5e-5;
+
+in vec3 pos;
+in ivec4 data;
+#ifdef VERTEX_FACING
+in vec3 vnor;
+#endif
+
+out vec4 finalColor;
+
+void main()
+{
+ finalColor = colorVertex;
+ finalColor = ((data.x & VERTEX_SELECTED) != 0) ? colorVertexSelect : finalColor;
+ finalColor = ((data.x & VERTEX_ACTIVE) != 0) ? vec4(colorEditMeshActive.xyz, 1.0) : finalColor;
+
+ gl_PointSize = sizeVertex * 2.0;
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ gl_Position -= ofs;
+
+#ifdef VERTEX_FACING
+ vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
+ vec3 view_normal = normalize(NormalMatrix * vnor);
+ vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
+ ? normalize(vPos.xyz)
+ : vec3(0.0, 0.0, 1.0);
+ float facing = dot(view_vec, view_normal);
+
+ finalColor.a *= 1.0 - abs(facing) * 0.4;
+#endif
+
+ if ((data.x & VERTEX_EXISTS) == 0) {
+ gl_Position = vec4(0.0);
+ gl_PointSize = 0.0;
+ }
+}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
index 7cab2a5035f..8715ab69181 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
@@ -2,38 +2,103 @@
/* Solid Wirefram implementation
* Mike Erwin, Clément Foucault */
-/* This shader follows the principles of
- * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
-
+uniform mat3 NormalMatrix;
+uniform mat4 ProjectionMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 ModelViewProjectionMatrix;
uniform ivec4 dataMask = ivec4(0xFF);
+uniform float ofs = 1e-5;
+
+uniform isamplerBuffer dataBuffer;
+
in vec3 pos;
+#ifdef VERTEX_FACING
+in vec3 vnor;
+#endif
+
+#ifdef EDGE_FIX
in ivec4 data;
out vec4 vPos;
out vec4 pPos;
out ivec4 vData;
-
-#ifdef VERTEX_FACING
-uniform mat4 ProjectionMatrix;
-uniform mat3 NormalMatrix;
-
-in vec3 vnor;
+# ifdef VERTEX_FACING
out float vFacing;
-#endif
+# endif
void main()
{
vPos = ModelViewMatrix * vec4(pos, 1.0);
pPos = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ pPos.z -= ofs;
vData = data & dataMask;
-#ifdef VERTEX_FACING
+# ifdef VERTEX_FACING
vec3 view_normal = normalize(NormalMatrix * vnor);
vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
? normalize(vPos.xyz)
: vec3(0.0, 0.0, 1.0);
vFacing = dot(view_vec, view_normal);
-#endif
+# endif
}
+
+#else /* EDGE_FIX */
+
+flat out vec3 edgesCrease;
+flat out vec3 edgesBweight;
+flat out vec4 faceColor;
+flat out ivec3 flag;
+# ifdef VERTEX_SELECTION
+out vec3 vertexColor;
+# endif
+# ifdef VERTEX_FACING
+out float facing;
+# endif
+
+out vec3 barycentric;
+
+void main()
+{
+ gl_Position = ModelViewProjectionMatrix * vec4(pos, 1.0);
+ gl_Position.z -= ofs;
+
+ int v_0 = (gl_VertexID / 3) * 3;
+ int vidx = gl_VertexID % 3;
+ barycentric = vec3(0.0);
+ barycentric[vidx] = 1.0;
+
+ /* Edge */
+ ivec4 vData[3], data = ivec4(0);
+ ivec3 eflag;
+ for (int v = 0; v < 3; ++v) {
+ data = texelFetch(dataBuffer, v_0 + v);
+ vData[v] = data & dataMask;
+ flag[v] = eflag[v] = vData[v].y | (vData[v].x << 8);
+ edgesCrease[v] = vData[v].z / 255.0;
+ edgesBweight[v] = vData[v].w / 255.0;
+ }
+
+ /* Face */
+ if ((vData[0].x & FACE_ACTIVE) != 0)
+ faceColor = colorFaceSelect;
+ else if ((vData[0].x & FACE_SELECTED) != 0)
+ faceColor = colorFaceSelect;
+ else if ((vData[0].x & FACE_FREESTYLE) != 0)
+ faceColor = colorFaceFreestyle;
+ else
+ faceColor = colorFace;
+
+# ifdef VERTEX_SELECTION
+ vertexColor = EDIT_MESH_vertex_color(vData[vidx].x).rgb;
+# endif
+# ifdef VERTEX_FACING
+ vec4 vPos = ModelViewMatrix * vec4(pos, 1.0);
+ vec3 view_normal = normalize(NormalMatrix * vnor);
+ vec3 view_vec = (ProjectionMatrix[3][3] == 0.0)
+ ? normalize(vPos.xyz)
+ : vec3(0.0, 0.0, 1.0);
+ facing = dot(view_vec, view_normal);
+# endif
+}
+
+#endif \ No newline at end of file