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
00026
00027 namespace lux
00028 {
00029
00030 class Cone: public Shape {
00031 public:
00032
00033 Cone(const Transform &o2w, bool ro,
00034 float height, float rad, float tm );
00035 virtual ~Cone() { }
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,
00042 Normal *Ns) const {
00043 float z = u1 * height;
00044 float t = u2 * phiMax;
00045 Point p = Point(cosf(t), sinf(t), z);
00046 float nz = radius / sqrtf(radius*radius + height*height);
00047 *Ns = Normalize(ObjectToWorld(Normal(p.x, p.y, -nz)));
00048 p.x *= radius * (1 - u1);
00049 p.y *= radius * (1 - u1);
00050 if (reverseOrientation) *Ns *= -1.f;
00051 return ObjectToWorld(p);
00052 }
00053
00054 static Shape* CreateShape(const Transform &o2w, bool reverseOrientation, const ParamSet ¶ms);
00055
00056 protected:
00057
00058 float radius, height, phiMax;
00059 };
00060
00061 }
00062