00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "stdafx.h"
00027 #include "volumes/volumegrid.h"
00028 #include "paramset.h"
00029
00030
00031 float VolumeGridDensity::Density(const Point &Pobj) const {
00032 if (!extent.Inside(Pobj)) return 0;
00033
00034 Vector vox = extent.Offset(Pobj);
00035 vox.x = vox.x * nx - .5f;
00036 vox.y = vox.y * ny - .5f;
00037 vox.z = vox.z * nz - .5f;
00038 int vx = Floor2Int(vox.x), vy = Floor2Int(vox.y), vz = Floor2Int(vox.z);
00039 float dx = vox.x - vx, dy = vox.y - vy, dz = vox.z - vz;
00040
00041
00042 float d00 = Lerp(dx, D(vx, vy, vz), D(vx+1, vy, vz));
00043 float d10 = Lerp(dx, D(vx, vy+1, vz), D(vx+1, vy+1, vz));
00044 float d01 = Lerp(dx, D(vx, vy, vz+1), D(vx+1, vy, vz+1));
00045 float d11 = Lerp(dx, D(vx, vy+1, vz+1), D(vx+1, vy+1, vz+1));
00046 float d0 = Lerp(dy, d00, d10);
00047 float d1 = Lerp(dy, d01, d11);
00048 return Lerp(dz, d0, d1);
00049 }
00050
00051
00052 VolumeGridDensity *CreateGridVolumeRegion(const Transform &volume2world,
00053 const ParamSet ¶ms) {
00054
00055 Spectrum sigma_a = params.FindOneSpectrum("sigma_a", 0.);
00056 Spectrum sigma_s = params.FindOneSpectrum("sigma_s", 0.);
00057 float g = params.FindOneFloat("g", 0.);
00058 Spectrum Le = params.FindOneSpectrum("Le", 0.);
00059 Point p0 = params.FindOnePoint("p0", Point(0,0,0));
00060 Point p1 = params.FindOnePoint("p1", Point(1,1,1));
00061 int nitems;
00062 const float *data = params.FindFloat("density", &nitems);
00063 if (!data) {
00064 Error("No \"density\" values provided for volume grid?");
00065 return NULL;
00066 }
00067 int nx = params.FindOneInt("nx", 1);
00068 int ny = params.FindOneInt("ny", 1);
00069 int nz = params.FindOneInt("nz", 1);
00070 if (nitems != nx*ny*nz) {
00071 Error("VolumeGridDensity has %d density values but nx*ny*nz = %d",
00072 nitems, nx*ny*nz);
00073 return NULL;
00074 }
00075 return new VolumeGridDensity(sigma_a, sigma_s, g, Le, BBox(p0, p1),
00076 volume2world, nx, ny, nz, data);
00077 }
00078
00079