+ void init(const Vector& p, const Vector& o)
+ {
+ point = p;
+ radius = (o - p).length();
+ }
+
+
+ // a ray inside the sphere will not intersect on its way out
+ bool intersectRay(const Ray<D>& ray, typename Ray<D>::Intersection& hit)
+ {
+ Vector b = point - ray.point;
+ Scalar z = cml::dot(b, ray.direction);
+
+ // check if the ball is behind the ray
+ if (z < SCALAR(0.0)) return false;
+
+ Scalar d2 = cml::dot(b, b) - z*z;
+ Scalar r2 = radius * radius;
+
+ // check for an intersection
+ if (d2 > r2) return false;
+
+ hit.distance = z - std::sqrt(r2 - d2);
+ if (hit.distance < SCALAR(0.0)) return false;
+
+ Vector surfacePoint;
+ ray.solve(surfacePoint, hit.distance);
+ hit.normal = surfacePoint - point;
+ return true;
+ }
+
+
+ //void encloseVertices(const Vector vertices[], unsigned count);
+
+ //void draw(Scalar alpha = 0.0) const;
+ //bool isVisible(const Frustum& frustum) const;
+
+void encloseVertices(const Vector vertices[], unsigned count)
+{
+ // TODO
+}
+
+void draw(Scalar alpha = 0.0) const;
+//{
+ //GLUquadricObj* sphereObj = gluNewQuadric();
+ //gluQuadricDrawStyle(sphereObj, GLU_LINE);
+
+ //glPushMatrix();