// 3D SDF primitives fn sdSphere(p: vec3, r: f32) -> f32 { return length(p) - r; } fn sdBox(p: vec3, b: vec3) -> f32 { let q = abs(p) - b; return length(max(q, vec3(0.0))) + min(max(q.x, max(q.y, q.z)), 0.0); } fn sdTorus(p: vec3, t: vec2) -> f32 { let q = vec2(length(p.xz) - t.x, p.y); return length(q) - t.y; } fn sdPlane(p: vec3, n: vec3, h: f32) -> f32 { return dot(p, n) + h; } // 2D SDF primitives fn sdBox2D(p: vec2, b: vec2) -> f32 { let d = abs(p) - b; return length(max(d, vec2(0.0))) + min(max(d.x, d.y), 0.0); } // Approximate fn sdEllipse(p: vec2, ab: vec2) -> f32 { let d = length(p / ab); return length(p) * (1.0 - 1.0 / d); }