77 lines
1.9 KiB
GLSL
77 lines
1.9 KiB
GLSL
#version 430 core
|
|
layout (triangles) in;
|
|
layout (triangle_strip, max_vertices = 5) out;
|
|
in vec4 vColor[];
|
|
in vec2 vPosOff[];
|
|
in float vRadMag[];
|
|
out vec4 gColor;
|
|
out float wStart;
|
|
out float wEnd;
|
|
out vec3 gBoundingBox;
|
|
|
|
out vec2 box2 ;
|
|
|
|
vec2 normV2 (vec2 v)
|
|
{ return vec2(-v.y,v.x) ;
|
|
}
|
|
float lhs (vec2 da, vec2 db)
|
|
{ return sign(dot(da, normV2(db))) ;
|
|
}
|
|
|
|
float extrapolate (vec2 inOne, vec2 inZeroA, vec2 inZeroB, vec2 xy)
|
|
{
|
|
float det = inOne.x * (inZeroA.y - inZeroB.y)
|
|
+ inZeroA.x * (inZeroB.y - inOne.y)
|
|
+ inZeroB.x * (inOne.y - inZeroA.y)
|
|
;
|
|
float r = (inZeroA.y - inZeroB.y) ;
|
|
float s = (inZeroB.x - inZeroA.x) ;
|
|
float t = (inZeroA.x * inZeroB.y - inZeroB.x * inZeroA.y) ;
|
|
return r * xy.x + s * xy.y + t
|
|
/ det ;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
vec3 pa = gl_in[0].gl_Position.xyz;
|
|
vec3 pb = gl_in[1].gl_Position.xyz;
|
|
vec3 pc = gl_in[2].gl_Position.xyz;
|
|
|
|
wStart = vRadMag [0];
|
|
wEnd = vRadMag [2];
|
|
|
|
box2 = vec2 (1,0);
|
|
gBoundingBox = vec3 (0.9,0.1,0);
|
|
gColor = vColor[0];
|
|
gl_Position = vec4 (vPosOff[0] , pa.z , 1);
|
|
EmitVertex();
|
|
box2 = vec2 (0,1);
|
|
gBoundingBox = vec3 (0.1,0.9,0);
|
|
gColor = vColor[2];
|
|
gl_Position = vec4 (vPosOff[2] , pc.z , 1);
|
|
EmitVertex();
|
|
box2 = vec2( extrapolate(vPosOff[0],vPosOff[2],pb.xy,pa.xy)
|
|
, extrapolate(vPosOff[2],vPosOff[0],pb.xy,pa.xy)
|
|
) ;
|
|
box2 = vec2(0.2,0);
|
|
gBoundingBox = vec3 (1,0,1);
|
|
gColor = vColor[0];
|
|
gl_Position = vec4 (pa, 1);
|
|
EmitVertex();
|
|
box2 = vec2( extrapolate(vPosOff[0],vPosOff[2],pb.xy,pc.xy)
|
|
, extrapolate(vPosOff[2],vPosOff[0],pb.xy,pc.xy)
|
|
) ;
|
|
box2 = vec2(0,0.2);
|
|
gBoundingBox = vec3 (0,1,1);
|
|
gColor = vColor[2];
|
|
gl_Position = vec4 (pc, 1);
|
|
EmitVertex();
|
|
box2 = vec2( 0,0 ) ;
|
|
gBoundingBox = vec3 (0,0,0);
|
|
gColor = vColor[1];
|
|
gl_Position = vec4 (pb, 1);
|
|
EmitVertex();
|
|
|
|
EndPrimitive();
|
|
}
|