diff options
Diffstat (limited to 'src/shaders/math/sdf_shapes.wgsl')
| -rw-r--r-- | src/shaders/math/sdf_shapes.wgsl | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/shaders/math/sdf_shapes.wgsl b/src/shaders/math/sdf_shapes.wgsl new file mode 100644 index 0000000..2dfae3e --- /dev/null +++ b/src/shaders/math/sdf_shapes.wgsl @@ -0,0 +1,30 @@ +// 3D SDF primitives +fn sdSphere(p: vec3f, r: f32) -> f32 { + return length(p) - r; +} + +fn sdBox(p: vec3f, b: vec3f) -> f32 { + let q = abs(p) - b; + return length(max(q, vec3f(0.0))) + min(max(q.x, max(q.y, q.z)), 0.0); +} + +fn sdTorus(p: vec3f, t: vec2f) -> f32 { + let q = vec2f(length(p.xz) - t.x, p.y); + return length(q) - t.y; +} + +fn sdPlane(p: vec3f, n: vec3f, h: f32) -> f32 { + return dot(p, n) + h; +} + +// 2D SDF primitives +fn sdBox2D(p: vec2f, b: vec2f) -> f32 { + let d = abs(p) - b; + return length(max(d, vec2f(0.0))) + min(max(d.x, d.y), 0.0); +} + +// Approximate +fn sdEllipse(p: vec2f, ab: vec2f) -> f32 { + let d = length(p / ab); + return length(p) * (1.0 - 1.0 / d); +} |
