func (p Sphere) Intersect(ray, origin glm.Vec3) (b bool, raylen float64, normal glm.Vec3) { normal = glm.Vec3{} line := *p.Pos.Subtract(&origin) // Solve using cosine law for scalar coefficient of ray. raylens := quadraticRoots(ray.Dot(&ray), 2*line.Dot(&ray), line.Dot(&line)-p.Rad*p.Rad) switch len(raylens) { case 0: return false, 0, normal case 1: return ray_epsilon_check(-raylens[0], ray, line) case 2: if raylens[0] > raylens[1] { // NOTE: negative inversion tmp := raylens[0] raylens[0] = raylens[1] raylens[1] = tmp } if b, raylen, normal = ray_epsilon_check(-raylens[1], ray, line); b { return b, raylen, normal } else { return ray_epsilon_check(-raylens[0], ray, line) } } return false, 0, normal }