summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-16 23:54:15 +0100
committerskal <pascal.massimino@gmail.com>2026-02-16 23:54:15 +0100
commit340dd11c44077ac121f9da27752ae97b3b7566e8 (patch)
treeb19052b760b379718fc10497c41fa2e175ac7d96
parent3b2bee705cfe5a250bb6049a90b5d734d3125f73 (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.wgsl13
-rw-r--r--src/effects/heptagon_effect.cc2
-rw-r--r--workspaces/test/timeline.seq4
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