package main // Sphere type Sphere struct { center Vector3 radius float64 material *Material } func (s Sphere) Distance(p Vector3) (float64, Material) { return p.Sub(s.center).Length() - s.radius, *s.material } // Box type Box struct { center Vector3 dimensions Vector3 material Material } func (s Box) Distance(p Vector3) (float64, Material) { q := p.Sub(s.center).Abs().Sub(s.dimensions) return q.Max(0.0).Length() + min(max(q.X, max(q.Y, q.Z)), 0.0), s.material } type Plane struct { normal Vector3 height float64 material Material } func (s Plane) Distance(p Vector3) (float64, Material) { return p.Dot(s.normal) - s.height, s.material }