From bc0958cc863083b4082161bf12456fdf28ab1c77 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 31 Jan 2026 02:51:16 +0000 Subject: Rename shader source in keeping with glsl expectations Swaps name/type of generated files to match class names and source files. --- gfx/gl/shaders/networkCurve.tese | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 gfx/gl/shaders/networkCurve.tese (limited to 'gfx/gl/shaders/networkCurve.tese') diff --git a/gfx/gl/shaders/networkCurve.tese b/gfx/gl/shaders/networkCurve.tese new file mode 100644 index 0000000..a02503c --- /dev/null +++ b/gfx/gl/shaders/networkCurve.tese @@ -0,0 +1,30 @@ +#version 460 core +layout(isolines, equal_spacing, cw) in; + +flat in ivec3 c_apos[]; +flat in ivec3 c_bpos[]; +flat in ivec3 c_cpos[]; +flat in float c_reps[]; +flat in float c_aangle[]; +flat in float c_bangle[]; +flat in float c_radius[]; + +flat out ivec3 pos; +flat out mat2 rot; +flat out float tpos; + +mat2 +getRot(float angle) +{ + return mat2(cos(angle), sin(angle), -sin(angle), cos(angle)); +} + +void +main() +{ + float angle = mix(c_bangle[0], c_aangle[0], gl_TessCoord.x); + int height = int(mix(c_bpos[0].z, c_apos[0].z, gl_TessCoord.x)) - c_cpos[0].z; + rot = getRot(angle); + tpos = c_reps[0] * gl_TessCoord.x; + pos = c_cpos[0] + ivec3(rot * vec2(c_radius[0], 0), height); +} -- cgit v1.2.3 From 1d77f1ca38f88b79a39b418fe3dc7899887d186a Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 31 Jan 2026 12:02:06 +0000 Subject: Tidy networkCurve shaders Arrays for start/end position/angle, smaller centre position, dynamic segment count based on max error, calculate distance in tessellation evaluation, use start/end position directly to avoid rounding errors at joins. See https://schneide.blog/2025/05/21/calculating-the-number-of-segments-for-accurate-circle-rendering/ --- gfx/gl/shaders/networkCurve.geom | 8 +++++--- gfx/gl/shaders/networkCurve.tesc | 38 ++++++++++++++++---------------------- gfx/gl/shaders/networkCurve.tese | 31 +++++++++++++++++++++++-------- gfx/gl/shaders/networkCurve.vert | 22 ++++++++-------------- 4 files changed, 52 insertions(+), 47 deletions(-) (limited to 'gfx/gl/shaders/networkCurve.tese') diff --git a/gfx/gl/shaders/networkCurve.geom b/gfx/gl/shaders/networkCurve.geom index 1002fd4..4a5b3db 100644 --- a/gfx/gl/shaders/networkCurve.geom +++ b/gfx/gl/shaders/networkCurve.geom @@ -1,15 +1,17 @@ #version 460 core +layout(lines) in; +layout(triangle_strip, max_vertices = 10) out; + flat in ivec3 pos[]; flat in mat2 rot[]; flat in float tpos[]; +flat in float dist[]; -layout(lines) in; -layout(triangle_strip, max_vertices = 10) out; include(`networkCommon.glsl') void main() { - doSeg(segDist(pos[0], pos[1]), pos[0], pos[1], tpos[0], tpos[1], rot[0], rot[1]); + doSeg(min(dist[0], dist[1]), pos[0], pos[1], tpos[0], tpos[1], rot[0], rot[1]); } diff --git a/gfx/gl/shaders/networkCurve.tesc b/gfx/gl/shaders/networkCurve.tesc index 4221e64..5a6e449 100644 --- a/gfx/gl/shaders/networkCurve.tesc +++ b/gfx/gl/shaders/networkCurve.tesc @@ -1,43 +1,37 @@ #version 460 core layout(vertices = 1) out; -flat in ivec3 apos[]; -flat in ivec3 bpos[]; -flat in ivec3 cpos[]; + +flat in ivec3 pos[][2]; +flat in ivec2 cpos[]; flat in float reps[]; -flat in float aangle[]; -flat in float bangle[]; +flat in float angles[][2]; flat in float radius[]; -flat out ivec3 c_apos[]; -flat out ivec3 c_bpos[]; -flat out ivec3 c_cpos[]; +flat out ivec3 c_pos[][2]; +flat out ivec2 c_cpos[]; flat out float c_reps[]; -flat out float c_aangle[]; -flat out float c_bangle[]; +flat out float c_angles[][2]; flat out float c_radius[]; -int -min2pow(float target) +float +segments() { - int x = 1; - while (x < target) { - x <<= 1; - } - return x; + const float arc = angles[gl_InvocationID][0] - angles[gl_InvocationID][1]; + const float error = 100.; + const float diff = acos(1.f - (error / radius[gl_InvocationID])); + return clamp(arc / diff, arc, 180); } void main() { - c_apos[gl_InvocationID] = apos[gl_InvocationID]; - c_bpos[gl_InvocationID] = bpos[gl_InvocationID]; + c_pos[gl_InvocationID] = pos[gl_InvocationID]; c_cpos[gl_InvocationID] = cpos[gl_InvocationID]; c_reps[gl_InvocationID] = reps[gl_InvocationID]; - c_aangle[gl_InvocationID] = aangle[gl_InvocationID]; - c_bangle[gl_InvocationID] = bangle[gl_InvocationID]; + c_angles[gl_InvocationID] = angles[gl_InvocationID]; c_radius[gl_InvocationID] = radius[gl_InvocationID]; gl_TessLevelOuter[0] = 1; - gl_TessLevelOuter[1] = min2pow(reps[gl_InvocationID]); + gl_TessLevelOuter[1] = segments(); } diff --git a/gfx/gl/shaders/networkCurve.tese b/gfx/gl/shaders/networkCurve.tese index a02503c..82e6a13 100644 --- a/gfx/gl/shaders/networkCurve.tese +++ b/gfx/gl/shaders/networkCurve.tese @@ -1,17 +1,22 @@ #version 460 core + layout(isolines, equal_spacing, cw) in; -flat in ivec3 c_apos[]; -flat in ivec3 c_bpos[]; -flat in ivec3 c_cpos[]; +uniform ivec3 viewPoint; + +flat in ivec3 c_pos[][2]; +flat in ivec2 c_cpos[]; flat in float c_reps[]; -flat in float c_aangle[]; -flat in float c_bangle[]; +flat in float c_angles[][2]; flat in float c_radius[]; flat out ivec3 pos; flat out mat2 rot; flat out float tpos; +flat out float dist; + +const float startTolerance = 1. / 200.; +const float endTolerance = 1. - startTolerance; mat2 getRot(float angle) @@ -22,9 +27,19 @@ getRot(float angle) void main() { - float angle = mix(c_bangle[0], c_aangle[0], gl_TessCoord.x); - int height = int(mix(c_bpos[0].z, c_apos[0].z, gl_TessCoord.x)) - c_cpos[0].z; + const float angle = mix(c_angles[0][1], c_angles[0][0], gl_TessCoord.x); rot = getRot(angle); + if (gl_TessCoord.x < startTolerance) { + pos = c_pos[0][1]; + } + else if (gl_TessCoord.x > endTolerance) { + pos = c_pos[0][0]; + } + else { + const int height = int(mix(c_pos[0][1].z, c_pos[0][0].z, gl_TessCoord.x)); + pos = ivec3(c_cpos[0] + ivec2(rot * vec2(c_radius[0], 0)), height); + } + tpos = c_reps[0] * gl_TessCoord.x; - pos = c_cpos[0] + ivec3(rot * vec2(c_radius[0], 0), height); + dist = length(vec3(viewPoint - pos)); } diff --git a/gfx/gl/shaders/networkCurve.vert b/gfx/gl/shaders/networkCurve.vert index 9cf149b..7e363d3 100644 --- a/gfx/gl/shaders/networkCurve.vert +++ b/gfx/gl/shaders/networkCurve.vert @@ -1,29 +1,23 @@ #version 460 core -layout(location = 0) in ivec3 v_apos; -layout(location = 1) in ivec3 v_bpos; +layout(location = 0) in ivec3 v_pos[2]; layout(location = 2) in ivec3 v_centre; layout(location = 3) in float v_reps; -layout(location = 4) in float v_aangle; -layout(location = 5) in float v_bangle; +layout(location = 4) in float v_angles[2]; layout(location = 6) in float v_radius; -flat out ivec3 apos; -flat out ivec3 bpos; -flat out ivec3 cpos; +flat out ivec3 pos[2]; +flat out ivec2 cpos; flat out float reps; -flat out float aangle; -flat out float bangle; +flat out float angles[2]; flat out float radius; void main() { - apos = v_apos; - bpos = v_bpos; - cpos = v_centre; + pos = v_pos; + cpos = v_centre.xy; reps = v_reps; - aangle = v_aangle; - bangle = v_bangle; + angles = v_angles; radius = v_radius; } -- cgit v1.2.3 From 44ceac7cc09ddbd06302c639128088ba0a4b2530 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 31 Jan 2026 14:20:08 +0000 Subject: Make similar array tidy-up to networkStraight shaders And merge common functionality from networkCurve. --- gfx/gl/shaders/networkCommon.glsl | 8 +++++++- gfx/gl/shaders/networkCurve.tese | 6 +++--- gfx/gl/shaders/networkStraight.geom | 10 +++++----- gfx/gl/shaders/networkStraight.vert | 11 ++++------- 4 files changed, 19 insertions(+), 16 deletions(-) (limited to 'gfx/gl/shaders/networkCurve.tese') diff --git a/gfx/gl/shaders/networkCommon.glsl b/gfx/gl/shaders/networkCommon.glsl index 4ff24e8..7aa911d 100644 --- a/gfx/gl/shaders/networkCommon.glsl +++ b/gfx/gl/shaders/networkCommon.glsl @@ -11,10 +11,16 @@ uniform float flatDistance = 1000000; out vec2 texCoord; out vec3 rposition; +float +viewPointDist(const ivec3 position) +{ + return length(vec3(viewPoint - position)); +} + float segDist(const ivec3 a, const ivec3 b) { - return min(length(vec3(viewPoint - a)), length(vec3(viewPoint - b))); + return min(viewPointDist(a), viewPointDist(b)); } ifelse( diff --git a/gfx/gl/shaders/networkCurve.tese b/gfx/gl/shaders/networkCurve.tese index 82e6a13..9cc31e2 100644 --- a/gfx/gl/shaders/networkCurve.tese +++ b/gfx/gl/shaders/networkCurve.tese @@ -2,8 +2,6 @@ layout(isolines, equal_spacing, cw) in; -uniform ivec3 viewPoint; - flat in ivec3 c_pos[][2]; flat in ivec2 c_cpos[]; flat in float c_reps[]; @@ -18,6 +16,8 @@ flat out float dist; const float startTolerance = 1. / 200.; const float endTolerance = 1. - startTolerance; +include(`networkCommon.glsl') + mat2 getRot(float angle) { @@ -41,5 +41,5 @@ main() } tpos = c_reps[0] * gl_TessCoord.x; - dist = length(vec3(viewPoint - pos)); + dist = viewPointDist(pos); } diff --git a/gfx/gl/shaders/networkStraight.geom b/gfx/gl/shaders/networkStraight.geom index 6abcecb..a0e57c8 100644 --- a/gfx/gl/shaders/networkStraight.geom +++ b/gfx/gl/shaders/networkStraight.geom @@ -1,17 +1,17 @@ #version 460 core -flat in ivec3 apos[]; -flat in ivec3 bpos[]; +layout(points) in; +layout(triangle_strip, max_vertices = 10) out; + +flat in ivec3 pos[][2]; flat in mat2 rot[]; flat in float reps[]; flat in float dist[]; -layout(points) in; -layout(triangle_strip, max_vertices = 10) out; include(`networkCommon.glsl') void main() { - doSeg(dist[0], apos[0], bpos[0], 0.f, reps[0], rot[0], rot[0]); + doSeg(dist[0], pos[0][0], pos[0][1], 0.f, reps[0], rot[0], rot[0]); } diff --git a/gfx/gl/shaders/networkStraight.vert b/gfx/gl/shaders/networkStraight.vert index 2834613..91ba955 100644 --- a/gfx/gl/shaders/networkStraight.vert +++ b/gfx/gl/shaders/networkStraight.vert @@ -1,12 +1,10 @@ #version 460 core -layout(location = 0) in ivec3 v_apos; -layout(location = 1) in ivec3 v_bpos; +layout(location = 0) in ivec3 v_pos[2]; layout(location = 2) in mat2 v_rot; layout(location = 4) in float v_reps; -flat out ivec3 apos; -flat out ivec3 bpos; +flat out ivec3 pos[2]; flat out mat2 rot; flat out float reps; flat out float dist; @@ -16,9 +14,8 @@ include(`networkCommon.glsl') void main() { - apos = v_apos; - bpos = v_bpos; + pos = v_pos; rot = v_rot; reps = v_reps; - dist = segDist(v_apos, v_bpos); + dist = segDist(v_pos[0], v_pos[1]); } -- cgit v1.2.3