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 "volume.h"
00025
00026 namespace lux
00027 {
00028
00029
00030 class ExponentialDensity : public DensityRegion {
00031 public:
00032
00033 ExponentialDensity(const RGBColor &sa, const RGBColor &ss,
00034 float gg, const RGBColor &emit, const BBox &e,
00035 const Transform &v2w, float aa, float bb,
00036 const Vector &up)
00037 : DensityRegion(sa, ss, gg, emit, v2w),
00038 extent(e), a(aa), b(bb) {
00039 upDir = Normalize(up);
00040 }
00041 virtual ~ExponentialDensity() { }
00042 virtual BBox WorldBound() const { return WorldToVolume.GetInverse()(extent); }
00043 virtual bool IntersectP(const Ray &r, float *t0, float *t1) const {
00044 Ray ray = WorldToVolume(r);
00045 return extent.IntersectP(ray, t0, t1);
00046 }
00047 virtual float Density(const Point &Pobj) const {
00048 if (!extent.Inside(Pobj)) return 0;
00049 float height = Dot(Pobj - extent.pMin, upDir);
00050 return a * expf(-b * height);
00051 }
00052
00053 static VolumeRegion *CreateVolumeRegion(const Transform &volume2world, const ParamSet ¶ms);
00054 private:
00055
00056 BBox extent;
00057 float a, b;
00058 Vector upDir;
00059 };
00060
00061 }
00062