Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r297 - in trunk: Engine/Control Engine/ImageTraversers Image Interface


Chronological Thread 
  • From: abhinav@sci.utah.edu
  • To: rtrt@sci.utah.edu
  • Subject: [MANTA] r297 - in trunk: Engine/Control Engine/ImageTraversers Image Interface
  • Date: Thu, 12 May 2005 16:55:12 -0600 (MDT)

Author: abhinav
Date: Thu May 12 16:55:11 2005
New Revision: 297

Added:
   trunk/Engine/ImageTraversers/FramelessImageTraverser.cc
   trunk/Engine/ImageTraversers/FramelessImageTraverser.h
Modified:
   trunk/Engine/Control/RTRT_register.cc
   trunk/Engine/ImageTraversers/CMakeLists.txt
   trunk/Image/SimpleImage.h
   trunk/Interface/Fragment.h
   trunk/Interface/RTRTInterface.h
Log:
SimpleImage - fixed the consecutiveX flag
RTRTInterface.h added FixedSamplingRate to TimeMode (not yet used)
Fragment.h: added empty constructor and a frameless fragment of rendomply 
placed samples in a tile.
RTRT_register.cc: registered framelessImageTraverser

FramelessImageTraveser.cc/.h: implements a traditional frameless renderer by 
a fixed amount of random samples per frame.  Still need to fix the display 
which seems double buffered.
CMakeLists.txt; added the new files for compilation.

- Abhinav



Modified: trunk/Engine/Control/RTRT_register.cc
==============================================================================
--- trunk/Engine/Control/RTRT_register.cc       (original)
+++ trunk/Engine/Control/RTRT_register.cc       Thu May 12 16:55:11 2005
@@ -4,6 +4,7 @@
 #include <Engine/IdleModes/ZoomIdleMode.h>
 #include <Engine/ImageTraversers/NullImageTraverser.h>
 #include <Engine/ImageTraversers/TiledImageTraverser.h>
+#include <Engine/ImageTraversers/FramelessImageTraverser.h>
 #include <Engine/LoadBalancers/CyclicLoadBalancer.h>
 #include <Engine/LoadBalancers/SimpleLoadBalancer.h>
 #include <Engine/LoadBalancers/WQLoadBalancer.h>
@@ -43,6 +44,8 @@
     rtrt->registerComponent("null", &NullImageTraverser::create);
    
     rtrt->registerComponent("tiled", &TiledImageTraverser::create);
+         
+    rtrt->registerComponent("frameless", &FramelessImageTraverser::create);
 
     // Register image types
     rtrt->registerComponent("null", &NullImage::create);

Modified: trunk/Engine/ImageTraversers/CMakeLists.txt
==============================================================================
--- trunk/Engine/ImageTraversers/CMakeLists.txt (original)
+++ trunk/Engine/ImageTraversers/CMakeLists.txt Thu May 12 16:55:11 2005
@@ -2,4 +2,5 @@
 SET (Manta_ImageTraversers_SRCS
      ImageTraversers/NullImageTraverser.cc
      ImageTraversers/TiledImageTraverser.cc
+     ImageTraversers/FramelessImageTraverser.cc
      )

Added: trunk/Engine/ImageTraversers/FramelessImageTraverser.cc
==============================================================================
--- (empty file)
+++ trunk/Engine/ImageTraversers/FramelessImageTraverser.cc     Thu May 12 
16:55:11 2005
@@ -0,0 +1,182 @@
+
+#include <Engine/ImageTraversers/FramelessImageTraverser.h>
+#include <Interface/RayPacket.h>
+#include <Interface/Renderer.h>
+#include <Core/Exceptions/IllegalArgument.h>
+#include <Core/Util/Args.h>
+#include <Interface/Context.h>
+#include <Interface/Fragment.h>
+#include <Interface/Image.h>
+#include <Interface/LoadBalancer.h>
+#include <Interface/PixelSampler.h>
+#include <Core/Thread/Mutex.h>
+#include <Core/Util/NotFinished.h>
+
+using namespace Manta;
+
+// args are the command line options, if the user wants to pas to th eimage 
traverser
+// look in TiledimageTraverser.cc for usage
+ImageTraverser* FramelessImageTraverser::create(const vector<string>& args)
+{
+  return new FramelessImageTraverser(args);
+}
+
+FramelessImageTraverser::FramelessImageTraverser(const vector<string>& args)
+{
+  xtilesize = 16; // should be a decent tile, not very big and not very small
+  ytilesize = 16;
+  shuffledTiles = NULL;
+  myRandomNumber = NULL;
+  int argc = static_cast<int>(args.size());
+  for(int i = 0; i<argc;i++){
+    string arg = args[i];
+    if(arg == "-tilesize"){
+      if(!getResolutionArg(i, args, xtilesize, ytilesize))
+       throw IllegalArgument("FramelessImageTraverser -tilesize", i, args);
+    } else {
+      throw IllegalArgument("FramelessImageTraverser", i, args);
+    }
+  }
+}
+
+FramelessImageTraverser::~FramelessImageTraverser()
+{
+  //TODO
+  if(myRandomNumber!=NULL) delete [] myRandomNumber;
+  if(shuffledTiles!=NULL) delete [] shuffledTiles;
+}
+
+void FramelessImageTraverser::setupBegin(const SetupContext& context, int 
numChannels)
+{
+  //context.constrainPipelineDepth(1,1);
+  context.loadBalancer->setupBegin(context, numChannels);
+  // do not need a pixelSampler since we directly access renderer here
+  //context.pixelSampler->setupBegin(context, numChannels);
+}
+
+// shuffles the uniformly row ordered 2D tiles
+void FramelessImageTraverser::shuffleMyTiles()
+{
+       int i,j,k;
+       UniformTiles temp;
+       
+       for(i=0; i<xtiles*ytiles*2; i++)
+       {
+               j = (int)(myRandomNumber[0].genfrand()*(xtiles*ytiles-1));
+               k = (int)(myRandomNumber[0].genfrand()*(xtiles*ytiles-1));
+    ASSERT(j<xtiles*ytiles);
+    ASSERT(k<xtiles*ytiles);
+               temp = shuffledTiles[j];
+               shuffledTiles[j] = shuffledTiles[k];
+               shuffledTiles[k] = temp;
+       }
+}
+
+void FramelessImageTraverser::setupDisplayChannel(const SetupContext& 
context)
+{
+  bool stereo; // get whether it is stereo, (shoot two rays for left and 
right eye)
+  int i, j, k;
+  int xres,yres;
+  context.getResolution(stereo, xres, yres);
+  myRandomNumber = new MT_RNG[context.numProcs];
+  for(i=0; i<context.numProcs; i++)
+       myRandomNumber[i].seed_rng(1234); // just to begin give a simple seed
+  xtiles = (xres + xtilesize-1)/xtilesize;
+  ytiles = (yres + ytilesize-1)/ytilesize;
+       
+  // allocate unifrom row ordered tiles
+  shuffledTiles = new UniformTiles[xtiles*ytiles];
+  for(i=0; i<xtiles*ytiles; i++)
+  {
+         j = i%ytiles;
+         k = i/ytiles;
+         shuffledTiles[i].xstart = j*xtilesize;
+         shuffledTiles[i].xend = (j+1)*xtilesize;
+         shuffledTiles[i].ystart = k*ytilesize;
+         shuffledTiles[i].yend = (k+1)*ytilesize;
+         if(shuffledTiles[i].xend>xres)
+                 shuffledTiles[i].xend = xres;
+         if(shuffledTiles[i].yend>yres)
+                 shuffledTiles[i].yend = yres;  
+  }
+  
+  shuffleMyTiles(); // shuffle them up
+  
+  int numAssignments = xtiles * ytiles;        // these will be the number 
of assignments to make to threads
+  context.loadBalancer->setupDisplayChannel(context, numAssignments);
+  //context.pixelSampler->setupDisplayChannel(context);
+}
+
+void FramelessImageTraverser::setupFrame(const RenderContext& context)
+{
+  context.loadBalancer->setupFrame(context);
+  //context.pixelSampler->setupFrame(context); // we dont need a pixel 
sampler, we will access renderer directly
+}
+
+void FramelessImageTraverser::renderFragment(const RenderContext& context,
+                                  Fragment& fragment, int xres, int yres)
+{
+  int flags = RayPacket::HaveImageCoordinates;
+       
+  if(fragment.getFlags() & Fragment::ConstantEye)
+    flags |= RayPacket::ConstantEye;
+  
+  for(int f=0;f<fragment.getSize();f+=RayPacket::MaxSize)
+  {
+    int size = RayPacket::MaxSize;
+         if(size<fragment.getSize()) size = fragment.getSize();
+    if(size >= fragment.getSize()-f)
+      size = fragment.getSize()-f;
+    // Create a ray packet
+    int depth = 0;
+    RayPacketData raydata;
+    RayPacket rays(raydata, size, depth, flags);
+
+    for(int i=0;i<size;i++)
+       {
+               Fragment::Element& fe = fragment.get(f+i);
+               double px = (double)(-1.0 + 
2.0*(double)(fe.x+0.5)/(double)xres); // normalized
+               double py = (double)(-1.0 + 
2.0*(double)(fe.y+0.5)/(double)yres);
+    //printf("%f, %f\n", (float)px, (float)py);
+               rays.setPixel(i, 0, px, py, &fe.color);
+    }
+
+       // Trace the rays.  The results will automatically go into the 
fragment  
+       context.renderer->traceEyeRays(context, rays);
+  }
+}
+
+void FramelessImageTraverser::renderImage(const RenderContext& context, 
Image* image)
+{
+       /*
+       basically do the following, for every tile select some samples 
randomly
+       and ray trace them directly, thats all.
+       */
+       
+  bool stereo;
+  int xres, yres;
+  image->getResolution(stereo, xres, yres);
+  int s,e;
+// this is what every thread does: gets the next assignment and render it.
+  while(context.loadBalancer->getNextAssignment(context, s, e))
+  {
+    for(int assignment = s; assignment < e; assignment++)
+       {
+               int size = 8;
+               Fragment fragment;
+               fragment.createRandom(size, shuffledTiles[assignment].xstart, 
shuffledTiles[assignment].ystart,
+                                                       
shuffledTiles[assignment].xend, shuffledTiles[assignment].yend, 
+                                                       0, 
myRandomNumber[context.proc]);
+               renderFragment(context, fragment, xres, yres);
+    /*for(int i = 0; i < fragment.getSize(); i++) {
+      Fragment::Element& e = fragment.get(i);
+      //printf("%d,%d\n", e.x, e.y);
+      float val = ((float)e.x/xres)*((float)e.y/yres);
+      e.color = Color(GrayColor(val));
+    }*/
+               image->set(fragment);
+       }
+  }
+  if(context.proc == 0)
+    image->setValid(true);
+}

Added: trunk/Engine/ImageTraversers/FramelessImageTraverser.h
==============================================================================
--- (empty file)
+++ trunk/Engine/ImageTraversers/FramelessImageTraverser.h      Thu May 12 
16:55:11 2005
@@ -0,0 +1,39 @@
+
+#ifndef Manta_Engine_FramelessImageTraverser_h
+#define Manta_Engine_FramelessImageTraverser_h
+
+#include <Interface/ImageTraverser.h>
+#include <Interface/Fragment.h>
+#include <sgi_stl_warnings_off.h>
+#include <string>
+#include <vector>
+#include <sgi_stl_warnings_on.h>
+
+namespace Manta {
+  using namespace std;
+  struct UniformTiles
+  {
+         int xstart, ystart, xend, yend;
+  };
+  class FramelessImageTraverser : public ImageTraverser {
+  public:
+    FramelessImageTraverser(const vector<string>& args);
+    virtual ~FramelessImageTraverser();
+    virtual void setupBegin(const SetupContext&, int numChannels);
+    virtual void setupDisplayChannel(const SetupContext&);
+    virtual void setupFrame(const RenderContext& context);
+    virtual void renderImage(const RenderContext& context, Image* image);
+       void shuffleMyTiles();
+    void renderFragment(const RenderContext& context, Fragment& fragment, 
int xres, int yres);
+    static ImageTraverser* create(const vector<string>& args);
+  private:
+    FramelessImageTraverser(const FramelessImageTraverser&);
+    FramelessImageTraverser& operator=(const FramelessImageTraverser&);
+       int xtilesize, ytilesize;
+       UniformTiles *shuffledTiles;
+    int xtiles,ytiles;
+       MT_RNG *myRandomNumber;
+  };
+}
+
+#endif

Modified: trunk/Image/SimpleImage.h
==============================================================================
--- trunk/Image/SimpleImage.h   (original)
+++ trunk/Image/SimpleImage.h   Thu May 12 16:55:11 2005
@@ -104,7 +104,8 @@
   template<class Pixel>
   void SimpleImage<Pixel>::set(const Fragment& fragment)
   {
-    if(fragment.getFlags() & (Fragment::ConsecutiveX|Fragment::ConstantEye)){
+    if(fragment.getFlags() & (Fragment::ConsecutiveX|Fragment::ConstantEye) 
+         == (Fragment::ConsecutiveX|Fragment::ConstantEye)){
       int nf = fragment.getSize();
       Pixel* pix = 
eyeStart[fragment.get(0).which_eye][fragment.get(0).y]+fragment.get(0).x;
       for(int i=0;i<nf;i++)

Modified: trunk/Interface/Fragment.h
==============================================================================
--- trunk/Interface/Fragment.h  (original)
+++ trunk/Interface/Fragment.h  Thu May 12 16:55:11 2005
@@ -18,6 +18,7 @@
 
 #include <Core/Color/Color.h>
 #include <Core/Util/FancyAssert.h>
+#include <Core/Math/MT_RNG.h>
 
 // TODO:
 //
@@ -34,6 +35,7 @@
     static const int ConsecutiveX    = 0x01;  // Implies a constant Y:
     static const int ConstantEye = 0x02;
 
+       Fragment() {} // empty constructor
     // Creates a "Scan-line" fragment.
     Fragment(int which_eye, int xstart, int xend, int y) {
       ASSERTRANGE(xend-xstart, 0, MaxFragmentSize+1);
@@ -46,9 +48,25 @@
       flags = ConsecutiveX|ConstantEye;
       size = nx;
     }
+       
     ~Fragment() {
     }
-    
+       
+    void createRandom(int numElements, int xstart, int ystart, int xend, int 
yend, int which_eye, MT_RNG &myRandomNumber)
+       {
+               size = numElements;
+               flags = ConstantEye;
+               for(int i=0;i<size;i++)
+               {
+                       data[i].x = 
(int)(xstart+myRandomNumber.genfrand()*(xend - xstart));
+                       data[i].y = 
(int)(ystart+myRandomNumber.genfrand()*(yend - ystart));
+      //data[i].x = (int)(xstart+0.5*(xend - xstart));
+                       //data[i].y = (int)(ystart+0.5*(yend - ystart));
+      //printf("%d,%d\n", data[i].x, data[i].y);
+                       data[i].which_eye = which_eye;
+               }
+       }
+       
     int getFlags() const {
       return flags;
     }
@@ -65,7 +83,8 @@
 
     // Represents a Pixel
     struct Element {
-      int x, y;      // Pixel position in image space
+         // Pixel position in image space
+         int x, y;
       int which_eye; // monocular: always 0, stereo: 0=left, 1=right
       Color color;   // Final result
     };

Modified: trunk/Interface/RTRTInterface.h
==============================================================================
--- trunk/Interface/RTRTInterface.h     (original)
+++ trunk/Interface/RTRTInterface.h     Thu May 12 16:55:11 2005
@@ -120,7 +120,7 @@
     
     // Settings
     enum TimeMode {
-      RealTime, FixedRate, Static
+      RealTime, FixedRate, Static, FixedSamplingRate
     };
     virtual void setTimeMode(TimeMode tm, double rate) = 0;
 




  • [MANTA] r297 - in trunk: Engine/Control Engine/ImageTraversers Image Interface, abhinav, 05/12/2005

Archive powered by MHonArc 2.6.16.

Top of page