diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-16 23:54:15 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-16 23:54:15 +0100 |
| commit | 340dd11c44077ac121f9da27752ae97b3b7566e8 (patch) | |
| tree | b19052b760b379718fc10497c41fa2e175ac7d96 | |
| parent | 3b2bee705cfe5a250bb6049a90b5d734d3125f73 (diff) | |
fix: correct Heptagon effect rendering and SDF implementation
- Change draw call from 21 to 3 vertices (fullscreen triangle)
- Replace broken folding-based SDF with IQ's atan-based regular polygon formula
- Simplify test timeline to render Heptagon directly to sink
- Reduce heptagon radius from 0.5 to 0.3 for better visibility
The effect was not visible due to incorrect vertex count and broken SDF
returning negative values everywhere (showing only fill color).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
| -rw-r--r-- | common/shaders/heptagon.wgsl | 13 | ||||
| -rw-r--r-- | src/effects/heptagon_effect.cc | 2 | ||||
| -rw-r--r-- | workspaces/test/timeline.seq | 4 |
3 files changed, 8 insertions, 11 deletions
diff --git a/common/shaders/heptagon.wgsl b/common/shaders/heptagon.wgsl index 3bfc59d..078978a 100644 --- a/common/shaders/heptagon.wgsl +++ b/common/shaders/heptagon.wgsl @@ -19,12 +19,11 @@ struct VertexOutput { } fn sdf_heptagon(p: vec2<f32>, r: f32) -> f32 { - let k = vec3<f32>(0.868516, -0.495754, 0.357407); - var p_abs = abs(p); - p_abs -= 2.0 * k.xy * min(dot(k.xy, p_abs), 0.0); - p_abs -= 2.0 * vec2<f32>(-k.x, k.y) * min(dot(vec2<f32>(-k.x, k.y), p_abs), 0.0); - p_abs -= vec2<f32>(clamp(p_abs.x, -k.z * r, k.z * r), r); - return length(p_abs) * sign(p_abs.y); + let an = 3.141593 / 7.0; // PI/7 for heptagon + let acs = vec2<f32>(cos(an), sin(an)); + let bn = (atan2(p.x, p.y) % (2.0 * an)) - an; + let q = length(p) * vec2<f32>(cos(bn), abs(sin(bn))); + return length(q - r * acs) * sign(q.x - r * acs.x); } @fragment fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { @@ -39,7 +38,7 @@ fn sdf_heptagon(p: vec2<f32>, r: f32) -> f32 { uv.x * s + uv.y * c ); - let dist = sdf_heptagon(rot_uv, 0.5); + let dist = sdf_heptagon(rot_uv, 0.3); let color = mix(vec3<f32>(0.2, 0.4, 0.8), vec3<f32>(1.0, 0.8, 0.2), smoothstep(0.01, -0.01, dist)); diff --git a/src/effects/heptagon_effect.cc b/src/effects/heptagon_effect.cc index 755b6e3..1bc9d06 100644 --- a/src/effects/heptagon_effect.cc +++ b/src/effects/heptagon_effect.cc @@ -77,7 +77,7 @@ void Heptagon::render(WGPUCommandEncoder encoder, WGPURenderPassEncoder pass = wgpuCommandEncoderBeginRenderPass(encoder, &pass_desc); wgpuRenderPassEncoderSetPipeline(pass, pipeline_); wgpuRenderPassEncoderSetBindGroup(pass, 0, bind_group_, 0, nullptr); - wgpuRenderPassEncoderDraw(pass, 21, 1, 0, 0); // 7 triangles * 3 vertices + wgpuRenderPassEncoderDraw(pass, 3, 1, 0, 0); // Fullscreen triangle wgpuRenderPassEncoderEnd(pass); wgpuRenderPassEncoderRelease(pass); } diff --git a/workspaces/test/timeline.seq b/workspaces/test/timeline.seq index 9f698fe..2ae7e8e 100644 --- a/workspaces/test/timeline.seq +++ b/workspaces/test/timeline.seq @@ -7,6 +7,4 @@ EFFECT + Hybrid3D source -> temp1 0.00 4.00 EFFECT + GaussianBlur temp1 -> sink 0.00 4.00 SEQUENCE 4.0 0 "MainLoop" -EFFECT + Heptagon source -> temp1 0.0 16.0 -#EFFECT + RotatingCube temp1 -> temp2 2.0 16.0 -EFFECT + PeakMeter temp1 -> sink 4.0 16.0 +EFFECT + Heptagon source -> sink 0.0 16.0 |
