00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "shape.h"
00025 #include "mc.h"
00026
00027 namespace lux
00028 {
00029
00030
00031 class Torus: public Shape {
00032 public:
00033
00034 Torus(const Transform &o2w, bool ro, float marad, float mirad,
00035 float zmin, float zmax, float phiMax);
00036 virtual ~Torus() { }
00037 virtual BBox ObjectBound() const;
00038 virtual bool Intersect(const Ray &ray, float *tHit,
00039 DifferentialGeometry *dg) const;
00040 virtual bool IntersectP(const Ray &ray) const;
00041 virtual float Area() const;
00042 virtual Point Sample(float u1, float u2, float u3, Normal *ns) const {
00043
00044 float phi = u1 * phiMax;
00045 float theta;
00046
00047 theta = thetaMin + u2 * (thetaMax - thetaMin);
00048
00049 float cosphi = cosf(phi);
00050 float sinphi = sinf(phi);
00051 float sintheta = sinf(theta);
00052
00053 Point p = Point((majorRadius+minorRadius*sintheta)*cosphi,
00054 (majorRadius+minorRadius*sintheta)*sinphi, minorRadius*cosf(theta));
00055
00056 Point cp = Point(majorRadius*cosphi, majorRadius*sinphi, 0);
00057
00058 *ns = Normalize(ObjectToWorld(Normal(p - cp)));
00059 if (reverseOrientation) *ns *= -1.f;
00060 return ObjectToWorld(p);
00061 }
00062
00063 static Shape* CreateShape(const Transform &o2w, bool reverseOrientation, const ParamSet ¶ms);
00064 private:
00065 bool FindIntersection(const Ray &ray, float *tHit, Point *pHit, float *phiHit, float *thetaHit) const;
00066
00067
00068 float majorRadius, minorRadius;
00069 float phiMax;
00070 float thetaMin, thetaMax;
00071
00072 float zmin, zmax;
00073 };
00074
00075 }