00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "shape.h"
00024 #include "mc.h"
00025
00026 namespace lux
00027 {
00028
00029
00030 class Disk : public Shape {
00031 public:
00032
00033 Disk(const Transform &o2w, bool ro, float height,
00034 float radius, float innerRadius, float phiMax);
00035 virtual ~Disk() { }
00036 virtual BBox ObjectBound() const;
00037 virtual bool Intersect(const Ray &ray, float *tHit,
00038 DifferentialGeometry *dg) const;
00039 virtual bool IntersectP(const Ray &ray) const;
00040 virtual float Area() const;
00041 virtual Point Sample(float u1, float u2, float u3, Normal *Ns) const {
00042 Point p;
00043 ConcentricSampleDisk(u1, u2, &p.x, &p.y);
00044 p.x *= radius;
00045 p.y *= radius;
00046 p.z = height;
00047 *Ns = Normalize(ObjectToWorld(Normal(0,0,1)));
00048 if (reverseOrientation) *Ns *= -1.f;
00049 return ObjectToWorld(p);
00050 }
00051
00052 static Shape* CreateShape(const Transform &o2w, bool reverseOrientation, const ParamSet ¶ms);
00053 private:
00054
00055 float height, radius, innerRadius, phiMax;
00056 };
00057
00058 }
00059