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/gpu/shaders/gpu_shader_3D_polyline_geom.glsl')
-rw-r--r--source/blender/gpu/shaders/gpu_shader_3D_polyline_geom.glsl40
1 files changed, 29 insertions, 11 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_3D_polyline_geom.glsl b/source/blender/gpu/shaders/gpu_shader_3D_polyline_geom.glsl
index b28205b349e..fd9b7e221e6 100644
--- a/source/blender/gpu/shaders/gpu_shader_3D_polyline_geom.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_3D_polyline_geom.glsl
@@ -20,13 +20,30 @@ noperspective out float smoothline;
#define SMOOTH_WIDTH 1.0
-void do_vertex(const int i, vec2 ofs)
+/* Clips point to near clip plane before perspective divide. */
+vec4 clip_line_point_homogeneous_space(vec4 p, vec4 q)
+{
+ if (p.z < -p.w) {
+ /* Just solves p + (q - p) * A; for A when p.z / p.w = -1.0. */
+ float denom = q.z - p.z + q.w - p.w;
+ if (denom == 0.0) {
+ /* No solution. */
+ return p;
+ }
+ float A = (-p.z - p.w) / denom;
+ p = p + (q - p) * A;
+ }
+ return p;
+}
+
+void do_vertex(const int i, vec4 pos, vec2 ofs)
{
#if defined(UNIFORM)
finalColor = color;
#elif defined(FLAT)
- finalColor = finalColor_g[0];
+ /* WATCH: Assuming last provoking vertex. */
+ finalColor = finalColor_g[1];
#elif defined(SMOOTH)
finalColor = finalColor_g[i];
@@ -37,21 +54,22 @@ void do_vertex(const int i, vec2 ofs)
#endif
smoothline = (lineWidth + SMOOTH_WIDTH) * 0.5;
- gl_Position = gl_in[i].gl_Position;
- gl_Position.xy += ofs * gl_Position.w;
+ gl_Position = pos;
+ gl_Position.xy += ofs * pos.w;
EmitVertex();
smoothline = -(lineWidth + SMOOTH_WIDTH) * 0.5;
- gl_Position = gl_in[i].gl_Position;
- gl_Position.xy -= ofs * gl_Position.w;
+ gl_Position = pos;
+ gl_Position.xy -= ofs * pos.w;
EmitVertex();
}
void main(void)
{
- vec2 p0 = gl_in[0].gl_Position.xy / gl_in[0].gl_Position.w;
- vec2 p1 = gl_in[1].gl_Position.xy / gl_in[1].gl_Position.w;
- vec2 e = normalize((p1 - p0) * viewportSize.xy);
+ vec4 p0 = clip_line_point_homogeneous_space(gl_in[0].gl_Position, gl_in[1].gl_Position);
+ vec4 p1 = clip_line_point_homogeneous_space(gl_in[1].gl_Position, gl_in[0].gl_Position);
+ vec2 e = normalize(((p1.xy / p1.w) - (p0.xy / p0.w)) * viewportSize.xy);
+
#if 0 /* Hard turn when line direction changes quadrant. */
e = abs(e);
vec2 ofs = (e.x > e.y) ? vec2(0.0, 1.0 / e.x) : vec2(1.0 / e.y, 0.0);
@@ -61,8 +79,8 @@ void main(void)
ofs /= viewportSize.xy;
ofs *= lineWidth + SMOOTH_WIDTH;
- do_vertex(0, ofs);
- do_vertex(1, ofs);
+ do_vertex(0, p0, ofs);
+ do_vertex(1, p1, ofs);
EndPrimitive();
}