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_RGBColorWAVELENGTHS_H
00024 #define LUX_RGBColorWAVELENGTHS_H
00025
00026 #include "lux.h"
00027 #include "spectrum.h"
00028 #include "spd.h"
00029
00030 #include "data/xyzbasis.h"
00031
00032 namespace lux
00033 {
00034
00035 class SpectrumWavelengths {
00036 public:
00037
00038
00039 SpectrumWavelengths();
00040 ~SpectrumWavelengths();
00041
00042 inline void Sample(float u1, float u2) {
00043 single = false;
00044 single_w = Floor2Int(u2 * WAVELENGTH_SAMPLES);
00045
00046
00047 const float offset = float(WAVELENGTH_END - WAVELENGTH_START) * inv_WAVELENGTH_SAMPLES;
00048 const float scale = 683.f * offset;
00049 float waveln = WAVELENGTH_START + u1 * offset;
00050 for (u_int i = 0; i < WAVELENGTH_SAMPLES; ++i) {
00051
00052 spect_w.c[i] = spd_w->sample(waveln);
00053 spect_c.c[i] = spd_c->sample(waveln);
00054 spect_m.c[i] = spd_m->sample(waveln);
00055 spect_y.c[i] = spd_y->sample(waveln);
00056 spect_r.c[i] = spd_r->sample(waveln);
00057 spect_g.c[i] = spd_g->sample(waveln);
00058 spect_b.c[i] = spd_b->sample(waveln);
00059
00060 const float w0 = waveln - CIEstart;
00061 int i0 = Floor2Int(w0);
00062 const float b0 = w0 - i0;
00063 cie_X[i] = Lerp(b0, CIE_X[i0], CIE_X[i0 + 1]) * scale;
00064 cie_Y[i] = Lerp(b0, CIE_Y[i0], CIE_Y[i0 + 1]) * scale;
00065 cie_Z[i] = Lerp(b0, CIE_Z[i0], CIE_Z[i0 + 1]) * scale;
00066 w[i] = waveln;
00067 waveln += offset;
00068 }
00069 }
00070
00071 inline float SampleSingle() {
00072 if (!single) {
00073 single = true;
00074 for (int i = 0; i < WAVELENGTH_SAMPLES; ++i) {
00075 cie_X[i] *= WAVELENGTH_SAMPLES;
00076 cie_Y[i] *= WAVELENGTH_SAMPLES;
00077 cie_Z[i] *= WAVELENGTH_SAMPLES;
00078 }
00079 }
00080 return w[single_w];
00081 }
00082
00083 float w[WAVELENGTH_SAMPLES];
00084 float cie_X[WAVELENGTH_SAMPLES], cie_Y[WAVELENGTH_SAMPLES], cie_Z[WAVELENGTH_SAMPLES];
00085
00086 bool single;
00087 int single_w;
00088
00089 SWCSpectrum spect_w, spect_c, spect_m;
00090 SWCSpectrum spect_y, spect_r, spect_g;
00091 SWCSpectrum spect_b;
00092
00093
00094 private:
00095 SPD *spd_w, *spd_c, *spd_m, *spd_y,
00096 *spd_r, *spd_g, *spd_b;
00097 };
00098
00099
00100 }
00101
00102 #endif // LUX_RGBColorWAVELENGTHS_H