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 Spectrum &sa, const Spectrum &ss,
00034 float gg, const Spectrum &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 BBox WorldBound() const { return WorldToVolume.GetInverse()(extent); }
00042 bool IntersectP(const Ray &r, float *t0, float *t1) const {
00043 Ray ray = WorldToVolume(r);
00044 return extent.IntersectP(ray, t0, t1);
00045 }
00046 float Density(const Point &Pobj) const {
00047 if (!extent.Inside(Pobj)) return 0;
00048 float height = Dot(Pobj - extent.pMin, upDir);
00049 return a * expf(-b * height);
00050 }
00051
00052 static VolumeRegion *CreateVolumeRegion(const Transform &volume2world, const ParamSet ¶ms);
00053 private:
00054
00055 BBox extent;
00056 float a, b;
00057 Vector upDir;
00058 };
00059
00060 }
00061