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 class RandomSampler : public Sampler {
00029 public:
00030 RandomSampler(int xstart, int xend, int ystart,
00031 int yend, int xs, int ys);
00032 ~RandomSampler() {
00033 FreeAligned(imageSamples);
00034 }
00035 bool GetNextSample(Sample *sample);
00036 int RoundSize(int sz) const { return sz; }
00037 private:
00038
00039 bool jitterSamples;
00040 int xPos, yPos, xPixelSamples, yPixelSamples;
00041 float *imageSamples, *lensSamples, *timeSamples;
00042 int samplePos;
00043 };
00044
00045 RandomSampler::RandomSampler(int xstart, int xend,
00046 int ystart, int yend, int xs, int ys)
00047 : Sampler(xstart, xend, ystart, yend, xs * ys) {
00048 xPos = xPixelStart;
00049 yPos = yPixelStart;
00050 xPixelSamples = xs;
00051 yPixelSamples = ys;
00052
00053 imageSamples = (float *)AllocAligned(5 * xPixelSamples *
00054 yPixelSamples * sizeof(float));
00055 lensSamples = imageSamples +
00056 2 * xPixelSamples * yPixelSamples;
00057 timeSamples = lensSamples +
00058 2 * xPixelSamples * yPixelSamples;
00059
00060 for (int i = 0;
00061 i < 5 * xPixelSamples * yPixelSamples;
00062 ++i) {
00063 imageSamples[i] = RandomFloat();
00064 }
00065
00066
00067 for (int o = 0;
00068 o < 2 * xPixelSamples * yPixelSamples;
00069 o += 2) {
00070 imageSamples[o] += xPos;
00071 imageSamples[o+1] += yPos;
00072 }
00073 samplePos = 0;
00074 }
00075
00076 bool RandomSampler::GetNextSample(Sample *sample) {
00077
00078 if (samplePos == xPixelSamples * yPixelSamples) {
00079
00080 if (++xPos == xPixelEnd) {
00081 xPos = xPixelStart;
00082 ++yPos;
00083 }
00084 if (yPos == yPixelEnd)
00085 return false;
00086
00087 for (int i = 0;
00088 i < 5 * xPixelSamples * yPixelSamples;
00089 ++i) {
00090 imageSamples[i] = RandomFloat();
00091 }
00092
00093
00094 for (int o = 0;
00095 o < 2 * xPixelSamples * yPixelSamples;
00096 o += 2) {
00097 imageSamples[o] += xPos;
00098 imageSamples[o+1] += yPos;
00099 }
00100 samplePos = 0;
00101 }
00102
00103 sample->imageX = imageSamples[2*samplePos];
00104 sample->imageY = imageSamples[2*samplePos+1];
00105 sample->lensU = lensSamples[2*samplePos];
00106 sample->lensV = lensSamples[2*samplePos+1];
00107 sample->time = timeSamples[samplePos];
00108
00109 for (u_int i = 0; i < sample->n1D.size(); ++i)
00110 for (u_int j = 0; j < sample->n1D[i]; ++j)
00111 sample->oneD[i][j] = RandomFloat();
00112 for (u_int i = 0; i < sample->n2D.size(); ++i)
00113 for (u_int j = 0; j < 2*sample->n2D[i]; ++j)
00114 sample->twoD[i][j] = RandomFloat();
00115 ++samplePos;
00116 return true;
00117 }
00118
00119 extern "C" DLLEXPORT
00120 Sampler *CreateSampler(const ParamSet ¶ms,
00121 const Film *film) {
00122 int xsamp = params.FindOneInt("xsamples", 2);
00123 int ysamp = params.FindOneInt("ysamples", 2);
00124 int xstart, xend, ystart, yend;
00125 film->GetSampleExtent(&xstart, &xend, &ystart, ¥d);
00126 return new RandomSampler(xstart, xend,
00127 ystart, yend,
00128 xsamp, ysamp);
00129 }