From 7f852de673bb687c5721c6a74367278f8ba62f56 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 20 Jan 2024 12:05:53 +0000 Subject: Implement complete network straight part shader --- gfx/gl/shaders/network.fs | 11 +++++++++++ gfx/gl/shaders/networkStraight.gs | 38 +++++++++++++++++++++++++++++++++++++- gfx/gl/shaders/networkStraight.vs | 8 ++++++-- 3 files changed, 54 insertions(+), 3 deletions(-) (limited to 'gfx') diff --git a/gfx/gl/shaders/network.fs b/gfx/gl/shaders/network.fs index d427da2..e7d15b3 100644 --- a/gfx/gl/shaders/network.fs +++ b/gfx/gl/shaders/network.fs @@ -1,6 +1,17 @@ #version 330 core +#extension GL_ARB_shading_language_420pack : enable + +include(`materialOut.glsl') +in vec3 rposition; +in vec2 texCoord; + +layout(binding = 0) uniform sampler2D texture0; +uniform ivec3 viewPoint; void main() { + gPosition = ivec4(viewPoint + rposition, 0); + gNormal = vec4(0, 0, 1, 1); + gAlbedoSpec = texture(texture0, texCoord); } diff --git a/gfx/gl/shaders/networkStraight.gs b/gfx/gl/shaders/networkStraight.gs index c2bfe3f..ccd456a 100644 --- a/gfx/gl/shaders/networkStraight.gs +++ b/gfx/gl/shaders/networkStraight.gs @@ -1,5 +1,14 @@ #version 330 core +const float RAIL_HEIGHT = 250; +const vec3[] profile = vec3[]( // + vec3(-1900.F, 0.F, 0.F), // + vec3(-608.F, 0.F, RAIL_HEIGHT), // + vec3(0, 0.F, RAIL_HEIGHT * .7F), // + vec3(608.F, 0.F, RAIL_HEIGHT), // + vec3(1900.F, 0.F, 0.F)); +const float[profile.length()] texturePos = float[](0, 0.34, 0.5, 0.65, 1); + flat in ivec3 apos[]; flat in ivec3 bpos[]; flat in mat2 rot[]; @@ -7,9 +16,36 @@ flat in float reps[]; flat in float dist[]; layout(points) in; -layout(triangle_strip, max_vertices = 20) out; +layout(triangle_strip, max_vertices = 10) out; + +uniform mat4 viewProjection; +uniform ivec3 viewPoint; + +uniform int clipDistance = 5000000; +uniform int flatDistance = 1000000; + +out vec2 texCoord; +out vec3 rposition; + +void +doEnd(const ivec3 end, int v, float texY) +{ + rposition = vec3(rot[0] * profile[v].xy, profile[v].z); + ivec3 vpos = end + ivec3(rposition); + gl_Position = viewProjection * vec4(vpos - viewPoint, 1); + texCoord = vec2(texturePos[v], texY); + EmitVertex(); +} void main() { + if (dist[0] < clipDistance) { + int vstep = (dist[0] < flatDistance) ? 1 : profile.length() - 1; + for (int v = 0; v < profile.length(); v += vstep) { + doEnd(bpos[0], v, reps[0]); + doEnd(apos[0], v, 0); + } + EndPrimitive(); + } } diff --git a/gfx/gl/shaders/networkStraight.vs b/gfx/gl/shaders/networkStraight.vs index 025ae8f..a0fa437 100644 --- a/gfx/gl/shaders/networkStraight.vs +++ b/gfx/gl/shaders/networkStraight.vs @@ -5,7 +5,7 @@ layout(location = 1) in ivec3 v_bpos; layout(location = 2) in mat2 v_rot; layout(location = 4) in float v_reps; -uniform mat4 viewProjection; +uniform ivec3 viewPoint; flat out ivec3 apos; flat out ivec3 bpos; @@ -16,5 +16,9 @@ flat out float dist; void main() { - dist = viewProjection[0][0]; + apos = v_apos; + bpos = v_bpos; + rot = v_rot; + reps = v_reps; + dist = min(distance(viewPoint, v_apos), distance(viewPoint, v_bpos)); } -- cgit v1.2.3