00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef LUX_SPECTRUMWAVELENGTHS_H
00024 #define LUX_SPECTRUMWAVELENGTHS_H
00025
00026 #include "lux.h"
00027 #include "spd.h"
00028 #include "spectrum.h"
00029
00030 #include "data/xyzbasis.h"
00031
00032 namespace lux
00033 {
00034
00035 class SpectrumWavelengths {
00036 public:
00037
00038
00039 SpectrumWavelengths();
00040
00041 inline void Sample(float u1, float u2) {
00042 single = false;
00043 single_w = Floor2Int(u2 * WAVELENGTH_SAMPLES);
00044
00045
00046 const float offset = float(WAVELENGTH_END - WAVELENGTH_START) * inv_WAVELENGTH_SAMPLES;
00047 float waveln = WAVELENGTH_START + u1 * offset;
00048 for (u_int i = 0; i < WAVELENGTH_SAMPLES; ++i) {
00049
00050 spect_w.c[i] = spd_w->sample(waveln);
00051 spect_c.c[i] = spd_c->sample(waveln);
00052 spect_m.c[i] = spd_m->sample(waveln);
00053 spect_y.c[i] = spd_y->sample(waveln);
00054 spect_r.c[i] = spd_r->sample(waveln);
00055 spect_g.c[i] = spd_g->sample(waveln);
00056 spect_b.c[i] = spd_b->sample(waveln);
00057
00058 const float w0 = waveln - CIEstart;
00059 int i0 = Floor2Int(w0);
00060 const float b0 = w0 - i0;
00061 cie_X[i] = Lerp(b0, CIE_X[i0], CIE_X[i0 + 1]);
00062 cie_Y[i] = Lerp(b0, CIE_Y[i0], CIE_Y[i0 + 1]);
00063 cie_Z[i] = Lerp(b0, CIE_Z[i0], CIE_Z[i0 + 1]);
00064 w[i] = waveln;
00065 waveln += offset;
00066 }
00067 }
00068
00069 inline float SampleSingle() {
00070 single = true;
00071 return w[single_w];
00072 }
00073
00074 float w[WAVELENGTH_SAMPLES];
00075
00076 bool single;
00077 int single_w;
00078
00079 SWCSpectrum spect_w, spect_c, spect_m;
00080 SWCSpectrum spect_y, spect_r, spect_g;
00081 SWCSpectrum spect_b;
00082
00083 float *cie_X, *cie_Y, *cie_Z;
00084
00085 private:
00086 SPD *spd_w, *spd_c, *spd_m, *spd_y,
00087 *spd_r, *spd_g, *spd_b;
00088 };
00089
00090
00091 }
00092
00093 #endif // LUX_SPECTRUMWAVELENGTHS_H