Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r374 - in swig: Core/Math Engine/PixelSamplers


Chronological Thread 
  • From: bigler@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r374 - in swig: Core/Math Engine/PixelSamplers
  • Date: Fri, 10 Jun 2005 09:42:19 -0600 (MDT)

Author: bigler
Date: Fri Jun 10 09:42:16 2005
New Revision: 374

Modified:
   swig/Core/Math/MT_RNG.cc
   swig/Core/Math/MT_RNG.h
   swig/Core/Math/vector2d.h
   swig/Engine/PixelSamplers/HammersleySampler.cc
   swig/Engine/PixelSamplers/InterLeaveSampler.cc
   swig/Engine/PixelSamplers/JitterSampler.cc
   swig/Engine/PixelSamplers/JitterSampler.h
   swig/Engine/PixelSamplers/MultiJitterSampler.cc
   swig/Engine/PixelSamplers/NRooksSampler.cc
   swig/Engine/PixelSamplers/Sample.cc
   swig/Engine/PixelSamplers/Sample.h
Log:

Core/Math/MT_RNG.cc
Core/Math/MT_RNG.h

        Put class into Manta namespace.  Added templated genRealRand
        function that is specialized for float and doubles.  The idea
        is that you use this function typed on real like so:
        genRealRand<Real>() and you get the function that matches the
        Real type.

Core/Math/vector2d.h

        Use the VectorT class type instead of a separate
        implementation.  Put the typedef in the Manta namespace.

Engine/PixelSamplers/HammersleySampler.cc
Engine/PixelSamplers/InterLeaveSampler.cc
Engine/PixelSamplers/MultiJitterSampler.cc
Engine/PixelSamplers/NRooksSampler.cc

        Updates to use the VectorT version of vector2d.

Engine/PixelSamplers/JitterSampler.cc
Engine/PixelSamplers/JitterSampler.h

        Samples are now computed on the fly without the use of
        Sample::jitter.  Maximum number of samples is not capped now.
        You can ask for as many samples as you want.  Number of
        samples need not be a square; the closest multiples to the
        square root are used.  Attemping to use Real instead of double
        where I can.

Engine/PixelSamplers/Sample.cc
Engine/PixelSamplers/Sample.h

        Put everthing in the Manta namespace.  Use
        genReadlRand<Real>() instead of gendrand().  Update for use of
        VectorT instead of vector2d.  Sample::jitter() now takes nx
        and ny and computes nx*ny sample points.  Added
        nearest_square_finder function which computes nx*ny == size,
        such that |nx-ny| is minimized.


Modified: swig/Core/Math/MT_RNG.cc
==============================================================================
--- swig/Core/Math/MT_RNG.cc    (original)
+++ swig/Core/Math/MT_RNG.cc    Fri Jun 10 09:42:16 2005
@@ -29,7 +29,9 @@
 /* matumoto@math.keio.ac.jp                                        */
 
 #include <stdio.h> // used only for test_print
-#include "MT_RNG.h"
+#include <Core/Math/MT_RNG.h>
+
+using namespace Manta;
 
 /* Period parameters */  
 #define MATRIX_A 0x9908b0df   /* constant vector a */
@@ -110,5 +112,17 @@
     if (j%8==7) printf("\n");
   }
   printf("\n");
+}
+
+template<>
+float MT_RNG::genRealRand<float>()
+{
+  return genfrand();
+}
+
+template<>
+double MT_RNG::genRealRand<double>()
+{
+  return gendrand();
 }
 

Modified: swig/Core/Math/MT_RNG.h
==============================================================================
--- swig/Core/Math/MT_RNG.h     (original)
+++ swig/Core/Math/MT_RNG.h     Fri Jun 10 09:42:16 2005
@@ -31,7 +31,7 @@
 #ifndef __MT19937_H__
 #define __MT19937_H__
 
-
+namespace Manta {
 
 // Period parameters
 #define MT_RNG_N 624
@@ -47,7 +47,21 @@
   double gendrand();
   float genfrand();
 
+  // Default to returning a double.  In actuallity this should never
+  // be used.
+  template<class T>
+  T genRealRand() { return static_cast<T>(gendrand()); }
+
+  
   void test_print(); // prints some random numbers to the console
 };
+
+template<>
+float MT_RNG::genRealRand<float>();
+
+template<>
+double MT_RNG::genRealRand<double>();
+
+} // end namespace Manta
 
 #endif // __MT19937_H__

Modified: swig/Core/Math/vector2d.h
==============================================================================
--- swig/Core/Math/vector2d.h   (original)
+++ swig/Core/Math/vector2d.h   Fri Jun 10 09:42:16 2005
@@ -4,47 +4,13 @@
 #ifndef Manta_Core_vector2d_h
 #define Manta_Core_vector2d_h
 
-class vector2d  {
-public:
-  vector2d()
-  {
-    e[0] = 0.0;
-    e[1] = 0.0;
-  }
-
-
-  vector2d(float a, float b)
-    {
-      e[0] = a;
-      e[1] = b;
-    }
-
-  //vector3d(double e0, double e1, double e2);
-
-  void setX(float num)
-  {
-    e[0] = num;
-  }
-
-  void setY(float num)
-  {
-    e[1] = num;
-  }
-
-  float x()
-  {
-    return e[0];
-  }
-
-  float y()
-  {
-    return e[1];
-  }
-
-  float e[2];
-};
+#include <MantaTypes.h>
+#include <Core/Geometry/PointVector.h>
 
+namespace Manta {
+  typedef VectorT<Real, 2> vector2d;
 
+} // end namespace Manta
 
 #endif
 

Modified: swig/Engine/PixelSamplers/HammersleySampler.cc
==============================================================================
--- swig/Engine/PixelSamplers/HammersleySampler.cc      (original)
+++ swig/Engine/PixelSamplers/HammersleySampler.cc      Fri Jun 10 09:42:16 
2005
@@ -123,8 +123,8 @@
        
        for(int x = 0; x < num_samples; x++)
          {
-           px = 
((fe0.x+samples[x].e[0])*ci.xscale+ci.xoffset)+count*ci.xscale;
-           py = (fe0.y+samples[x].e[1])*ci.yscale+ci.yoffset;
+           px = ((fe0.x+samples[x][0])*ci.xscale+ci.xoffset)+count*ci.xscale;
+           py = (fe0.y+samples[x][1])*ci.yscale+ci.yoffset;
            rays.setPixel(i, 0, px, py, &result[i]);
            
            i++;
@@ -152,8 +152,8 @@
        Sample::hammersley(samples, num_samples, random[thd_num]);
        for(int x = 0; x < num_samples; x++)
          {
-          px = 
((fe0.x+samples[x].e[0])*ci.xscale+ci.xoffset)+count*ci.xscale;
-          py = (fe0.y+samples[x].e[1])*ci.yscale+ci.yoffset;
+          px = ((fe0.x+samples[x][0])*ci.xscale+ci.xoffset)+count*ci.xscale;
+          py = (fe0.y+samples[x][1])*ci.yscale+ci.yoffset;
            rays.setPixel(i, 1, px, py, &result[i]);
            
            i++;

Modified: swig/Engine/PixelSamplers/InterLeaveSampler.cc
==============================================================================
--- swig/Engine/PixelSamplers/InterLeaveSampler.cc      (original)
+++ swig/Engine/PixelSamplers/InterLeaveSampler.cc      Fri Jun 10 09:42:16 
2005
@@ -128,8 +128,8 @@
       while(i < size){
        for(int x = 0; x < num_samples; x++)
          {
-           px = 
((fe0.x+interLeavedSamples[i%num_grid][x].e[0])*ci.xscale+ci.xoffset)+count*ci.xscale;
-           py = 
(fe0.y+interLeavedSamples[i%num_grid][x].e[1])*ci.yscale+ci.yoffset;
+           px = 
((fe0.x+interLeavedSamples[i%num_grid][x][0])*ci.xscale+ci.xoffset)+count*ci.xscale;
+           py = 
(fe0.y+interLeavedSamples[i%num_grid][x][1])*ci.yscale+ci.yoffset;
            rays.setPixel(i, 0, px, py, &result[i]);
            
            i++;
@@ -154,8 +154,8 @@
        Fragment::Element& fe0 = fragment.get(f+i);
        for(int x = 0; x < num_samples; x++)
          {
-          px = 
((fe0.x+interLeavedSamples[i%num_grid][x].e[0])*ci.xscale+ci.xoffset)+count*ci.xscale;
-           py = 
(fe0.y+interLeavedSamples[i%num_grid][x].e[1])*ci.yscale+ci.yoffset;
+          px = 
((fe0.x+interLeavedSamples[i%num_grid][x][0])*ci.xscale+ci.xoffset)+count*ci.xscale;
+           py = 
(fe0.y+interLeavedSamples[i%num_grid][x][1])*ci.yscale+ci.yoffset;
            rays.setPixel(i, 1, px, py, &result[i]);
            
            i++;

Modified: swig/Engine/PixelSamplers/JitterSampler.cc
==============================================================================
--- swig/Engine/PixelSamplers/JitterSampler.cc  (original)
+++ swig/Engine/PixelSamplers/JitterSampler.cc  Fri Jun 10 09:42:16 2005
@@ -22,7 +22,6 @@
 JitterSampler::JitterSampler(const vector<string>& args)
 {
   num_samples = 4;
-  samples = 0;
   int argc = static_cast<int>(args.size());
   for(int i = 0; i<argc;i++){
     string arg = args[i];
@@ -35,16 +34,14 @@
       throw IllegalArgument("JitterSampler", i, args);
     }
   }
-  if (num_samples > 25)
-    {
-      printf("Maximum number of samples allowed is 25\n\n");
-      exit(0);
-    }
+
+  // Compute nx and ny
+  Sample::nearest_square_finder(num_samples, nx, ny);
 }
 
 JitterSampler::~JitterSampler()
 {
-  delete [] samples;
+  if (random) delete[] random;
 }
 
 void JitterSampler::setupBegin(const SetupContext& context, int numChannels)
@@ -53,11 +50,8 @@
   random = new MT_RNG[context.numProcs];
   for(int i = 0; i < context.numProcs; i++)
     {
-      random[i] = MT_RNG();
-      random[i].seed_rng((unsigned long) i);
+      random[i].seed_rng(static_cast<unsigned long>(i));
     }
-  if(samples == 0)
-    samples = new vector2d[num_samples];
   context.renderer->setupBegin(context, numChannels);
 }
 
@@ -95,7 +89,7 @@
     flags |= RayPacket::ConstantEye;
   
 
-  for(int f=0;f<fragment.getSize();f+=(RayPacket::MaxSize)/num_samples){
+  for(int f=0;f<fragment.getSize();f+=(RayPacket::MaxSize)/num_samples) {
     int size = RayPacket::MaxSize;
 
     // Create a ray packet
@@ -103,18 +97,20 @@
     RayPacketData raydata;
     RayPacket rays(raydata, size, depth, flags);
     Color result[RayPacket::MaxSize];
-    if(fragment.getFlags() & Fragment::ConsecutiveX){
+    if(fragment.getFlags() & Fragment::ConsecutiveX) {
       Fragment::Element& fe0 = fragment.get(f);
       int i = 0;
       int count = 0;
-      double px, py;
+      Real px, py;
+
       while(i < size){
-       Sample::jitter(samples, num_samples, random[thd_num]);
-       
-       for(int x = 0; x < num_samples; x++)
+        for(int xs = 0; xs < nx; xs++)
+          for(int ys = 0; ys  < ny; ys++)
          {
-           px = 
((fe0.x+(samples[x].e[0]))*ci.xscale+ci.xoffset)+count*ci.xscale;
-           py = (fe0.y+(samples[x].e[1]))*ci.yscale+ci.yoffset;
+            Real x_sample = ((Real)xs + random[thd_num].genRealRand<Real>()) 
/ (Real)nx;
+            Real y_sample = ((Real)ys + random[thd_num].genRealRand<Real>()) 
/ (Real)ny;
+           px = ((fe0.x+(x_sample))*ci.xscale+ci.xoffset)+count*ci.xscale;
+           py = (fe0.y+(y_sample))*ci.yscale+ci.yoffset;
            rays.setPixel(i, 0, px, py, &result[i]);
            i++;
          } 
@@ -122,26 +118,22 @@
        if(i%num_samples == 0){
          count++;
        }
-       
       }
-      
-    }
-    
-    else {
+    } else {
       
       int i = 0;
       int count = 0;
-      
-      double px, py;
+      Real px, py;
+
       while(i < size){
        Fragment::Element& fe0 = fragment.get(f+i);
-       
-       
-       Sample::jitter(samples, num_samples, random[thd_num]);
-       for(int x = 0; x < num_samples; x++)
+        for(int xs = 0; xs < nx; xs++)
+          for(int ys = 0; ys  < ny; ys++)
          {
-           px = 
((fe0.x+samples[x].e[0])*ci.xscale+ci.xoffset)+count*ci.xscale;
-           py = (fe0.y+samples[x].e[1])*ci.yscale+ci.yoffset;
+            Real x_sample = ((Real)xs + random[thd_num].genRealRand<Real>()) 
/ (Real)nx;
+            Real y_sample = ((Real)ys + random[thd_num].genRealRand<Real>()) 
/ (Real)ny;
+           px = ((fe0.x+x_sample)*ci.xscale+ci.xoffset)+count*ci.xscale;
+           py = (fe0.y+y_sample)*ci.yscale+ci.yoffset;
            rays.setPixel(i, 1, px, py, &result[i]);
            
            i++;

Modified: swig/Engine/PixelSamplers/JitterSampler.h
==============================================================================
--- swig/Engine/PixelSamplers/JitterSampler.h   (original)
+++ swig/Engine/PixelSamplers/JitterSampler.h   Fri Jun 10 09:42:16 2005
@@ -29,6 +29,9 @@
     JitterSampler(const JitterSampler&);
     JitterSampler& operator=(const JitterSampler&);
     int num_samples;
+    // nx*ny == num_samples where nx~=ny (or as close as you can get it).
+    int nx, ny;
+    
     struct ChannelInfo {
       double xscale;
       double xoffset;
@@ -36,7 +39,6 @@
       double yoffset;
     };
 
-    vector2d *samples;
     MT_RNG *random;
     vector<ChannelInfo> channelInfo;
   };

Modified: swig/Engine/PixelSamplers/MultiJitterSampler.cc
==============================================================================
--- swig/Engine/PixelSamplers/MultiJitterSampler.cc     (original)
+++ swig/Engine/PixelSamplers/MultiJitterSampler.cc     Fri Jun 10 09:42:16 
2005
@@ -120,8 +120,8 @@
        
        for(int x = 0; x < num_samples; x++)
          {
-           px = 
((fe0.x+((samples[x].e[0]*2.0)-1.0))*ci.xscale+ci.xoffset)+count*ci.xscale;
-           py = (fe0.y+((samples[x].e[1]*2.0)-1.0))*ci.yscale+ci.yoffset;
+           px = 
((fe0.x+((samples[x][0]*2.0)-1.0))*ci.xscale+ci.xoffset)+count*ci.xscale;
+           py = (fe0.y+((samples[x][1]*2.0)-1.0))*ci.yscale+ci.yoffset;
            rays.setPixel(i, 0, px, py, &result[i]);
            
            i++;
@@ -149,8 +149,8 @@
        Sample::multiJitter(samples, num_samples, random[thd_num]);
        for(int x = 0; x < num_samples; x++)
          {
-          px = 
((fe0.x+samples[x].e[0])*ci.xscale+ci.xoffset)+count*ci.xscale;
-          py = (fe0.y+samples[x].e[1])*ci.yscale+ci.yoffset;
+          px = ((fe0.x+samples[x][0])*ci.xscale+ci.xoffset)+count*ci.xscale;
+          py = (fe0.y+samples[x][1])*ci.yscale+ci.yoffset;
            rays.setPixel(i, 1, px, py, &result[i]);
            
            i++;

Modified: swig/Engine/PixelSamplers/NRooksSampler.cc
==============================================================================
--- swig/Engine/PixelSamplers/NRooksSampler.cc  (original)
+++ swig/Engine/PixelSamplers/NRooksSampler.cc  Fri Jun 10 09:42:16 2005
@@ -124,8 +124,8 @@
        
        for(int x = 0; x < num_samples; x++)
          {
-           px = 
((fe0.x+(samples[x].e[0]))*ci.xscale+ci.xoffset)+count*ci.xscale;
-           py = (fe0.y+(samples[x].e[1]))*ci.yscale+ci.yoffset;
+           px = 
((fe0.x+(samples[x][0]))*ci.xscale+ci.xoffset)+count*ci.xscale;
+           py = (fe0.y+(samples[x][1]))*ci.yscale+ci.yoffset;
            rays.setPixel(i, 0, px, py, &result[i]);
            
            i++;
@@ -152,8 +152,8 @@
        Sample::nrooks(samples, num_samples, random[thd_num]);
        for(int x = 0; x < num_samples; x++)
          {
-          px = 
((fe0.x+samples[x].e[0])*ci.xscale+ci.xoffset)+count*ci.xscale;
-          py = (fe0.y+samples[x].e[1])*ci.yscale+ci.yoffset;
+          px = ((fe0.x+samples[x][0])*ci.xscale+ci.xoffset)+count*ci.xscale;
+          py = (fe0.y+samples[x][1])*ci.yscale+ci.yoffset;
            rays.setPixel(i, 1, px, py, &result[i]);
            
            i++;

Modified: swig/Engine/PixelSamplers/Sample.cc
==============================================================================
--- swig/Engine/PixelSamplers/Sample.cc (original)
+++ swig/Engine/PixelSamplers/Sample.cc Fri Jun 10 09:42:16 2005
@@ -5,28 +5,27 @@
 #include <math.h>
 #include <stdio.h>
 
-
+using namespace Manta;
 
 void Sample::random(vector2d *samples, int num_samples, MT_RNG seed)
 {
   for (int i = 0; i < num_samples; i++)
     {
-      samples[i].setX(seed.gendrand());
-      samples[i].setY(seed.gendrand());
+      samples[i][0] = seed.genRealRand<Real>();
+      samples[i][1] = seed.genRealRand<Real>();
     }
 }
 
 
-void Sample::jitter(vector2d *samples, int num_samples, MT_RNG seed)
+void Sample::jitter(vector2d *samples, int nx, int ny, MT_RNG seed)
 {
-  int sqrt_samples = (int)(sqrt(float(num_samples)));
-  for(int i = 0; i < sqrt_samples; i++)
-    for(int j = 0; j < sqrt_samples; j++)
+  for(int i = 0; i < nx; i++)
+    for(int j = 0; j < ny; j++)
       {
-       float x = ((double)i + seed.gendrand()) / (double)sqrt_samples;
-       float y = ((double)j + seed.gendrand()) / (double)sqrt_samples;
-       (samples[i*sqrt_samples +j]).setX(x);
-       (samples[i*sqrt_samples +j]).setY(y);
+        Real x = ((Real)i + seed.genRealRand<Real>()) / (Real)nx;
+        Real y = ((Real)j + seed.genRealRand<Real>()) / (Real)ny;
+        samples[i*nx +j][0] = x;
+        samples[i*nx +j][1] = y;
       }
 }
 
@@ -35,16 +34,16 @@
 {
   for (int i = 0; i < num_samples; i++)
     {
-      samples[i].setX(((double)i + seed.gendrand()) / (double)num_samples);
-      samples[i].setY(((double)i + seed.gendrand()) / (double)num_samples);
+      samples[i][0] = ((Real)i + seed.genRealRand<Real>()) / 
(Real)num_samples;
+      samples[i][1] = ((Real)i + seed.genRealRand<Real>()) / 
(Real)num_samples;
     }
   // shuffle the x coords
   for (int i = num_samples - 2; i >= 0; i--)
     {
-      int target = int(seed.gendrand() * (double)i);
+      int target = int(seed.genRealRand<Real>() * (Real)i);
       float temp = samples[i+1].x();
-      samples[i+1].setX(samples[target].x());
-      samples[target].setX(temp);
+      samples[i+1][0] = samples[target].x();
+      samples[target][0] = temp;
     }
 }
 
@@ -62,10 +61,10 @@
   for(int i = 0; i < sqrt_samples; i++)
     for(int j = 0; j < sqrt_samples; j++)
       {
-       samples[i*sqrt_samples + j].e[0] = i*sqrt_samples*subcell_width +
-         j*subcell_width + seed.gendrand() * subcell_width;
-       samples[i*sqrt_samples + j].e[1] = j*sqrt_samples *subcell_width +
-         i*subcell_width + seed.gendrand() * subcell_width;
+       samples[i*sqrt_samples + j][0] = i*sqrt_samples*subcell_width +
+         j*subcell_width + seed.genRealRand<Real>() * subcell_width;
+       samples[i*sqrt_samples + j][1] = j*sqrt_samples *subcell_width +
+         i*subcell_width + seed.genRealRand<Real>() * subcell_width;
 
       }
 
@@ -73,15 +72,15 @@
   for(int i = 0; i < sqrt_samples; i++)
     for(int j = 0; j < sqrt_samples; j++)
       {
-       int k = j + int(seed.gendrand() * (sqrt_samples - j - 1));
-       float t = samples[i*sqrt_samples + j].e[0];
-       samples[i*sqrt_samples + j].e[0] = samples[i*sqrt_samples + k].e[0];
-       samples[i*sqrt_samples + k].e[0] = t;
-
-       k = j+int(seed.gendrand() * (sqrt_samples - j - 1));
-       t = samples[j*sqrt_samples + i].e[1];
-       samples[j*sqrt_samples + i].e[1] = samples[k*sqrt_samples + i].e[1];
-       samples[k*sqrt_samples + i].e[1] = t;
+       int k = j + int(seed.genRealRand<Real>() * (sqrt_samples - j - 1));
+       float t = samples[i*sqrt_samples + j][0];
+       samples[i*sqrt_samples + j][0] = samples[i*sqrt_samples + k][0];
+       samples[i*sqrt_samples + k][0] = t;
+
+       k = j+int(seed.genRealRand<Real>() * (sqrt_samples - j - 1));
+       t = samples[j*sqrt_samples + i][1];
+       samples[j*sqrt_samples + i][1] = samples[k*sqrt_samples + i][1];
+       samples[k*sqrt_samples + i][1] = t;
       }
 }
 
@@ -90,8 +89,8 @@
 {
   double p, u, v;
   int k, kk;
-  double offu = (seed.gendrand() +.75f) / 2.0f;
-  double offv = (seed.gendrand() +.75f) / 2.0f;
+  double offu = (seed.genRealRand<Real>() +.75f) / 2.0f;
+  double offv = (seed.genRealRand<Real>() +.75f) / 2.0f;
 
   for (k=0 ; k<num_samples ; k++)
   {
@@ -114,7 +113,7 @@
 {
   for (int i = num_samples - 2; i >= 0; i--)
     {
-      int target = int(seed.gendrand() * (double)i);
+      int target = int(seed.genRealRand<Real>() * (double)i);
       vector2d temp = samples[i+1];
       samples[i+1] = samples[target];
       samples[target] = temp;
@@ -127,8 +126,8 @@
 {
   for (int i = 0; i < num_samples; i++)
     {
-      samples[i].setX(samples[i].x() - 0.5f);
-      samples[i].setY(samples[i].y() - 0.5f);
+      samples[i][0] = samples[i][0] - (Real)0.5;
+      samples[i][1] = samples[i][1] - (Real)0.5;
     }
 }
 
@@ -138,12 +137,16 @@
 
   for (int i = 0; i < num_samples; i++)
     {
-      float x = samples[i].x();
-      float y = samples[i].y();
-      if (x < 0.5f) samples[i].setX((float)sqrt(2.0*(double)x) - 1.0f);
-      else samples[i].setX(1.0f - (float)sqrt(2.0 - 2.0 * (double)x));
-      if (y < 0.5f) samples[i].setY((float)sqrt(2.0*(double)y) - 1.0f);
-      else samples[i].setY(1.0f - (float)sqrt(2.0 - 2.0 * (double)y));
+      Real x = samples[i].x();
+      Real y = samples[i].y();
+      if (x < 0.5f)
+        samples[i][0] = (Real)sqrt(2.0*(Real)x) - 1.0f;
+      else
+        samples[i][0] = 1.0f - (Real)sqrt(2.0 - 2.0 * x);
+      if (y < 0.5f)
+        samples[i][1] = (Real)sqrt(2.0*(Real)y) - 1.0f;
+      else
+        samples[i][1] = 1.0f - (Real)sqrt(2.0 - 2.0 * y);
     }
 }
 
@@ -153,10 +156,10 @@
 
   for (int i = 0; i < num_samples; i++)
     {
-      float x = samples[i].x();
-      float y = samples[i].y();
-      samples[i].e[0] = cubicFilter(x);
-      samples[i].e[1] = cubicFilter(y);
+      Real x = samples[i].x();
+      Real y = samples[i].y();
+      samples[i][0] = cubicFilter(x);
+      samples[i][1] = cubicFilter(y);
     }
   
 }
@@ -188,6 +191,26 @@
     }
 }
 
+
+void Sample::nearest_square_finder(const int size, int &nx, int &ny) {
+  int x,y;
+  x = y = (int) sqrt((double)size);
+  // now we are basically looking for a pair of multiples that are closest to
+  // the square root.
+  while ((x * y) != size) {
+    // look for another multiple
+    for(int i = x+1; i <= size; i++) {
+      if (size%i == 0) {
+       // we've found a root
+       x = i;
+       y = size/x;
+       break;
+      }
+    }
+  }
+  nx = x;
+  ny = y;
+}
 
 
 

Modified: swig/Engine/PixelSamplers/Sample.h
==============================================================================
--- swig/Engine/PixelSamplers/Sample.h  (original)
+++ swig/Engine/PixelSamplers/Sample.h  Fri Jun 10 09:42:16 2005
@@ -11,15 +11,17 @@
 #include <Core/Math/MT_RNG.h>
 #include <math.h>
 
-class Sample{
+namespace Manta {
+  
+class Sample {
 
  public:
   //2D sampling
   
   static void random(vector2d *samples, int num_samples, MT_RNG seed);
   
-  //jitter assumes num_samples is a perfect square
-  static void jitter(vector2d* samples, int num_samples, MT_RNG seed);
+  // This Assums you have nx*ny samples available in samples.
+  static void jitter(vector2d* samples, int nx, int ny, MT_RNG seed);
   
   static void nrooks(vector2d* samples, int num_samples, MT_RNG seed);
   //multiJitter assumes num_samples is a perfect square
@@ -66,10 +68,13 @@
        return 2 - pow(24.0f * (1.0f-x), 0.25f);
     }
 
-
+  static void nearest_square_finder(const int size, int &nx, int &ny);
   
   
 };
+
+} // end namespace Manta
+
 #endif
 
             




  • [MANTA] r374 - in swig: Core/Math Engine/PixelSamplers, bigler, 06/10/2005

Archive powered by MHonArc 2.6.16.

Top of page