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 #include "sampling.h"
00026 #include "paramset.h"
00027 #include "film.h"
00028
00029 class LDSampler : public Sampler {
00030 public:
00031
00032 LDSampler(int xstart, int xend,
00033 int ystart, int yend,
00034 int nsamp);
00035 ~LDSampler() {
00036 delete[] imageSamples;
00037 for (int i = 0; i < n1D; ++i)
00038 delete[] oneDSamples[i];
00039 for (int i = 0; i < n2D; ++i)
00040 delete[] twoDSamples[i];
00041 delete[] oneDSamples;
00042 delete[] twoDSamples;
00043 }
00044 int RoundSize(int size) const {
00045 return RoundUpPow2(size);
00046 }
00047 bool GetNextSample(Sample *sample);
00048 private:
00049
00050 int xPos, yPos, pixelSamples;
00051 int samplePos;
00052 float *imageSamples, *lensSamples, *timeSamples;
00053 float **oneDSamples, **twoDSamples;
00054 int n1D, n2D;
00055 };
00056
00057 LDSampler::LDSampler(int xstart, int xend,
00058 int ystart, int yend, int ps)
00059 : Sampler(xstart, xend, ystart, yend, RoundUpPow2(ps)) {
00060 xPos = xPixelStart - 1;
00061 yPos = yPixelStart;
00062 if (!IsPowerOf2(ps)) {
00063 Warning("Pixel samples being"
00064 " rounded up to power of 2");
00065 pixelSamples = RoundUpPow2(ps);
00066 }
00067 else
00068 pixelSamples = ps;
00069 samplePos = pixelSamples;
00070 oneDSamples = twoDSamples = NULL;
00071 imageSamples = new float[5*pixelSamples];
00072 lensSamples = imageSamples + 2*pixelSamples;
00073 timeSamples = imageSamples + 4*pixelSamples;
00074 n1D = n2D = 0;
00075 }
00076 bool LDSampler::GetNextSample(Sample *sample) {
00077 if (!oneDSamples) {
00078
00079 oneDSamples = new float *[sample->n1D.size()];
00080 n1D = sample->n1D.size();
00081 for (u_int i = 0; i < sample->n1D.size(); ++i)
00082 oneDSamples[i] = new float[sample->n1D[i] *
00083 pixelSamples];
00084 twoDSamples = new float *[sample->n2D.size()];
00085 n2D = sample->n2D.size();
00086 for (u_int i = 0; i < sample->n2D.size(); ++i)
00087 twoDSamples[i] = new float[2 * sample->n2D[i] *
00088 pixelSamples];
00089 }
00090 if (samplePos == pixelSamples) {
00091
00092 if (++xPos == xPixelEnd) {
00093 xPos = xPixelStart;
00094 ++yPos;
00095 }
00096 if (yPos == yPixelEnd)
00097 return false;
00098 samplePos = 0;
00099
00100 LDShuffleScrambled2D(1, pixelSamples, imageSamples);
00101 LDShuffleScrambled2D(1, pixelSamples, lensSamples);
00102 LDShuffleScrambled1D(1, pixelSamples, timeSamples);
00103 for (u_int i = 0; i < sample->n1D.size(); ++i)
00104 LDShuffleScrambled1D(sample->n1D[i], pixelSamples,
00105 oneDSamples[i]);
00106 for (u_int i = 0; i < sample->n2D.size(); ++i)
00107 LDShuffleScrambled2D(sample->n2D[i], pixelSamples,
00108 twoDSamples[i]);
00109 }
00110
00111 sample->imageX = xPos + imageSamples[2*samplePos];
00112 sample->imageY = yPos + imageSamples[2*samplePos+1];
00113 sample->time = timeSamples[samplePos];
00114 sample->lensU = lensSamples[2*samplePos];
00115 sample->lensV = lensSamples[2*samplePos+1];
00116 for (u_int i = 0; i < sample->n1D.size(); ++i) {
00117 int startSamp = sample->n1D[i] * samplePos;
00118 for (u_int j = 0; j < sample->n1D[i]; ++j)
00119 sample->oneD[i][j] = oneDSamples[i][startSamp+j];
00120 }
00121 for (u_int i = 0; i < sample->n2D.size(); ++i) {
00122 int startSamp = 2 * sample->n2D[i] * samplePos;
00123 for (u_int j = 0; j < 2*sample->n2D[i]; ++j)
00124 sample->twoD[i][j] = twoDSamples[i][startSamp+j];
00125 }
00126 ++samplePos;
00127 return true;
00128 }
00129 extern "C" DLLEXPORT Sampler *CreateSampler(const ParamSet ¶ms, const Film *film) {
00130
00131 int xstart, xend, ystart, yend;
00132 film->GetSampleExtent(&xstart, &xend, &ystart, ¥d);
00133 int nsamp = params.FindOneInt("pixelsamples", 4);
00134 return new LDSampler(xstart, xend, ystart, yend, nsamp);
00135 }