Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1016 - in trunk: Engine/Display Engine/ImageTraversers Engine/PixelSamplers Image Interface Model/Textures


Chronological Thread 
  • From: sparker@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1016 - in trunk: Engine/Display Engine/ImageTraversers Engine/PixelSamplers Image Interface Model/Textures
  • Date: Thu, 27 Apr 2006 17:16:26 -0600 (MDT)

Author: sparker
Date: Thu Apr 27 17:16:25 2006
New Revision: 1016

Modified:
   trunk/Engine/Display/OpenGLDisplay.cc
   trunk/Engine/ImageTraversers/DissolveImageTraverser.cc
   trunk/Engine/ImageTraversers/DissolveTiledImageTraverser.cc
   trunk/Engine/ImageTraversers/FilteredImageTraverser.cc
   trunk/Engine/ImageTraversers/HardTile.cc
   trunk/Engine/ImageTraversers/TiledImageTraverser.cc
   trunk/Engine/PixelSamplers/FastSampler.cc
   trunk/Engine/PixelSamplers/JitterSampler.cc
   trunk/Engine/PixelSamplers/NullSampler.cc
   trunk/Engine/PixelSamplers/SingleSampler.cc
   trunk/Image/SimpleImage.h
   trunk/Interface/Fragment.h
   trunk/Interface/RayPacket.h
   trunk/Model/Textures/ImageTexture.h
Log:
Verticalize Fragment


Modified: trunk/Engine/Display/OpenGLDisplay.cc
==============================================================================
--- trunk/Engine/Display/OpenGLDisplay.cc       (original)
+++ trunk/Engine/Display/OpenGLDisplay.cc       Thu Apr 27 17:16:25 2006
@@ -440,12 +440,14 @@
 
   GLenum format;
   GLenum type;
+  bool have_alpha = true;
   if(typeid(*image) == typeid(SimpleImage<RGBA8Pixel>)){
     format = GL_RGBA;
     type = big_endian? GL_UNSIGNED_INT_8_8_8_8 : GL_UNSIGNED_INT_8_8_8_8_REV;
   } else if(typeid(*image) == typeid(SimpleImage<RGB8Pixel>)){
     format = GL_RGB;
     type = GL_UNSIGNED_BYTE;
+    have_alpha = false;
   } else if(typeid(*image) == typeid(SimpleImage<ABGR8Pixel>)){
     format = GL_RGBA;
     type = big_endian? GL_UNSIGNED_INT_8_8_8_8_REV : GL_UNSIGNED_INT_8_8_8_8;
@@ -457,12 +459,12 @@
   }
 
   // Load textures
-  glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGB,
+  glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, have_alpha? GL_RGBA : GL_RGB,
                xres, yres, 0, format, type,
                si->getRawData(0));
   if(stereo){
     glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[0]);
-    glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGB,
+    glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, have_alpha? GL_RGBA : GL_RGB,
                  xres, yres, 0, format, type,
                  si->getRawData(0));
     glBindTexture(GL_TEXTURE_RECTANGLE_EXT, texids[0]);

Modified: trunk/Engine/ImageTraversers/DissolveImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/DissolveImageTraverser.cc      (original)
+++ trunk/Engine/ImageTraversers/DissolveImageTraverser.cc      Thu Apr 27 
17:16:25 2006
@@ -174,7 +174,7 @@
         // I'm not sure you want to do stereo
       }
       // Check to see if your fragment is full.  If it is, then render it.
-      if (frag.getSize() == Fragment::MaxSize) {
+      if (frag.end() == Fragment::MaxSize) {
         context.pixelSampler->renderFragment(context, frag);
 #if 0
         for(int f = 0; f < frag.getSize(); f++)
@@ -201,7 +201,7 @@
     }
   }
   // Pick up strays
-  if (frag.getSize()) {
+  if (frag.end() != 0) {
     context.pixelSampler->renderFragment(context, frag);
     image->set(frag);
   }

Modified: trunk/Engine/ImageTraversers/DissolveTiledImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/DissolveTiledImageTraverser.cc (original)
+++ trunk/Engine/ImageTraversers/DissolveTiledImageTraverser.cc Thu Apr 27 
17:16:25 2006
@@ -183,7 +183,7 @@
           // I'm not sure you want to do stereo
         }
         // Check to see if your fragment is full.  If it is, then render it.
-        if (frag.getSize() == Fragment::MaxSize) {
+        if (frag.end() == Fragment::MaxSize) {
 //           // It might be useful to check for ConsecutiveX, but only if
 //           // certain conditions exist.
 //           if ((xend-xstart) == Fragment::MaxSize)
@@ -206,7 +206,7 @@
     
   }
   // Pick up strays
-  if (frag.getSize()) {
+  if (frag.end() != 0) {
     context.pixelSampler->renderFragment(context, frag);
     image->set(frag);
   }

Modified: trunk/Engine/ImageTraversers/FilteredImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/FilteredImageTraverser.cc      (original)
+++ trunk/Engine/ImageTraversers/FilteredImageTraverser.cc      Thu Apr 27 
17:16:25 2006
@@ -165,7 +165,7 @@
           ASSERT( total_fragments < total_allocated );
           
           Fragment &frag = fragment_array[total_fragments++];
-          frag.setConsecutiveX( 0, x, xend, y );
+          frag.setConsecutiveX( x, xend, y, 0, 999 );
           
         }
       }
@@ -182,29 +182,23 @@
             ASSERT( total_fragments < total_allocated );
             
             Fragment &frag = fragment_array[total_fragments++];
-            frag.setConsecutiveX( 1, x, xend, y );            
+            frag.setConsecutiveX( x, xend, y, 1, 999 );
           }
         }
       }
 
       
/////////////////////////////////////////////////////////////////////////
       // Render the fragments.
-      for (int i=0;i<total_fragments; ++i) {
+      for (int i=0;i<total_fragments; ++i)
         context.pixelSampler->renderFragment( context, fragment_array[i] );
-      }
 
       // Filter the fragments.
-      for (int i=0;i<total_fragments; ++i) {
-        for (int f=0;f<fragment_array[i].getSize();++f) {
-          Color &color = fragment_array[i].get(f).color;
-          color *= Color(RGB(0.5,0.5,0.5));
-        }
-      }
+      for (int i=0;i<total_fragments; ++i)
+        fragment_array[i].scaleColors(0.5);
 
       // Set image values.
-      for (int i=0;i<total_fragments; ++i) {
+      for (int i=0;i<total_fragments; ++i)
         image->set( fragment_array[i] );
-      }
     }
   }
   

Modified: trunk/Engine/ImageTraversers/HardTile.cc
==============================================================================
--- trunk/Engine/ImageTraversers/HardTile.cc    (original)
+++ trunk/Engine/ImageTraversers/HardTile.cc    Thu Apr 27 17:16:25 2006
@@ -133,7 +133,7 @@
           int xnarf = x+Fragment::MaxSize;
           if (xnarf > xend) xnarf = xend;
           // Create a Fragment that is consecutive in X pixels
-          Fragment frag(0, x, xnarf, y);
+          Fragment frag(x, xnarf, y, 0, 999);
           context.pixelSampler->renderFragment(context, frag);
           image->set(frag);
         }

Modified: trunk/Engine/ImageTraversers/TiledImageTraverser.cc
==============================================================================
--- trunk/Engine/ImageTraversers/TiledImageTraverser.cc (original)
+++ trunk/Engine/ImageTraversers/TiledImageTraverser.cc Thu Apr 27 17:16:25 
2006
@@ -131,13 +131,13 @@
           if (xnarf > xend) xnarf = xend;
 
           // Create a Fragment that is consecutive in X pixels
-          Fragment frag(0, x, xnarf, y);
+          Fragment frag(x, xnarf, y, 0, 999);
           context.pixelSampler->renderFragment(context, frag);
           image->set(frag);
 
           // Check to see if we need to render another copy in setero.
           if(stereo){
-            Fragment fragST(1, x, xnarf, y);
+            Fragment fragST(x, xnarf, y, 1, 999);
             context.pixelSampler->renderFragment(context, fragST);
             image->set(fragST);
           }

Modified: trunk/Engine/PixelSamplers/FastSampler.cc
==============================================================================
--- trunk/Engine/PixelSamplers/FastSampler.cc   (original)
+++ trunk/Engine/PixelSamplers/FastSampler.cc   Thu Apr 27 17:16:25 2006
@@ -50,34 +50,34 @@
 {
   ChannelInfo& ci = channelInfo[context.channelIndex];
   int flags = RayPacket::HaveImageCoordinates;
-  if(fragment.getFlags() & Fragment::ConstantEye)
+  if(fragment.getFlag(Fragment::ConstantEye))
     flags |= RayPacket::ConstantEye;
-  for(int f=0;f<fragment.getSize();f+=RayPacket::MaxSize){
+  for(int f=fragment.begin();f<fragment.end();f+=RayPacket::MaxSize){
     // We want to fill our RayPacket with as many as
     // RayPacket::MaxSize rays.
     int size = RayPacket::MaxSize;
-    if(size >= fragment.getSize()-f)
+    if(size >= fragment.end()-f)
       // We don't have enough fragments left to fill a ray packet, so
       // set the size of the RayPacket to the number of fragments we
       // have left.
-      size = fragment.getSize()-f;
+      size = fragment.end()-f;
     // Create a ray packet
     int depth = 0;
     RayPacketData raydata;
     RayPacket rays(raydata, 0, size, depth, flags);
 
     // Check to see if the fragment is consecutive in x.
-    if(fragment.getFlags() & Fragment::ConsecutiveX){
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) == 
Fragment::ConsecutiveX|Fragment::ConstantEye){
 
       // If so place each pixel in the ray packet relative to the first
       // fragment.
-      Fragment::Element& fe0 = fragment.get(f);
-      Real px = fe0.x*ci.xscale+ci.xoffset;
-      Real py = fe0.y*ci.yscale+ci.yoffset;
-
-      for(int i=0;i<size;i++){
-        Fragment::Element& fe = fragment.get(f+i);
-        rays.setPixel(i, fe.which_eye, px, py);
+      int b = fragment.begin();
+      Real px = fragment.getX(b)*ci.xscale+ci.xoffset;
+      Real py = fragment.getY(b)*ci.yscale+ci.yoffset;
+      int eye = fragment.getWhichEye(b);
+
+      for(int i=fragment.begin();i<fragment.end();i++){
+        rays.setPixel(i, eye, px, py);
         px += ci.xscale;
       }
 
@@ -85,29 +85,20 @@
 
     // Otherwise, set each pixel individually.
     else {
-      for(int i=0;i<size;i++){
-        Fragment::Element& fe = fragment.get(f+i);
-        Real px = fe.x*ci.xscale+ci.xoffset;
-        Real py = fe.y*ci.yscale+ci.yoffset;
-        rays.setPixel(i, fe.which_eye, px, py);
+      for(int i=fragment.begin();i<fragment.end();i++){
+        Real px = fragment.getX(i)*ci.xscale+ci.xoffset;
+        Real py = fragment.getY(i)*ci.yscale+ci.yoffset;
+        rays.setPixel(i, fragment.getWhichEye(i), px, py);
       }
     }
 
     // Trace the rays.  The results will automatically go into the fragment
     context.renderer->traceEyeRays(context, rays);
 
-#if 0 // old code
-    for(int i=0;i<size;i++){
-      Fragment::Element& fe = fragment.get(f+i);
-      fe.color = rays.getColor(i);
-    }
-#else
     for(int i=0;i<size;i++)
     {
-        Fragment::Element& fe = fragment.get(f+i);
         for ( int c = 0; c < Color::NumComponents; c++ )
-            fe.color.data[c] = raydata.color[c][i];
+            fragment.color[c][i] = raydata.color[c][i];
     }
-#endif
   }
 }

Modified: trunk/Engine/PixelSamplers/JitterSampler.cc
==============================================================================
--- trunk/Engine/PixelSamplers/JitterSampler.cc (original)
+++ trunk/Engine/PixelSamplers/JitterSampler.cc Thu Apr 27 17:16:25 2006
@@ -104,7 +104,7 @@
     // We've collected enough samples, so compute the average and
     // assign it to the fragment.
     if(samples_collected == num_samples) {
-      fragment.get(current_fragment).color += fragment_color / num_samples;
+      fragment.addColor(current_fragment, fragment_color / num_samples);
       // Reset our accumulation variables
       fragment_color = Color::black();
       samples_collected = 0;
@@ -114,9 +114,9 @@
   // Pick up left over fragments.  It is OK if this is a partial sum.
   // The remaining sum will be picked up in the next call to
   // computeAverages.
-  if (samples_collected > 0) {
-    fragment.get(current_fragment).color += fragment_color / num_samples;
-  }
+  if (samples_collected > 0) 
+    fragment.addColor(current_fragment, fragment_color / num_samples);
+
   // Assign the values back to the parameters.
   samples_collected_return = samples_collected;
   current_fragment_return = current_fragment;
@@ -129,18 +129,18 @@
   int thd_num = context.proc;
     
   int flags = RayPacket::HaveImageCoordinates;
-  if(fragment.getFlags() & Fragment::ConstantEye)
+  if(fragment.getFlag(Fragment::ConstantEye))
     flags |= RayPacket::ConstantEye;
 
-  int consecutivex_flag = fragment.getFlags() & Fragment::ConsecutiveX;
+  int consecutivex_flag = fragment.getFlag(Fragment::ConsecutiveX);
 
   CheapRNG rng;
   if (consecutivex_flag) {
-    Fragment::Element& fe = fragment.get(0);
+    int b = fragment.begin();
     if (use_cheaprng)
-      rng.seed(fe.x*ci.xres+fe.y);
+      rng.seed(fragment.getX(b)*ci.xres+fragment.getY(b));
     else
-      random[thd_num].seed_rng(fe.x*ci.xres+fe.y);
+      random[thd_num].seed_rng(fragment.getX(b)*ci.xres+fragment.getY(b));
   }
 
   int depth = 0;
@@ -158,22 +158,22 @@
   int current_fragment = 0;
 
   // We can compute at most RayPacket::MaxSize number of rays at time.
-  for(int frag_index = 0; frag_index < fragment.getSize(); frag_index++) {
+  for(int frag_index = fragment.begin(); frag_index < fragment.end(); 
frag_index++) {
     // Initialize the color
-    fragment.get(frag_index).color = Color::black();
-
-    Fragment::Element& fe0 = fragment.get(frag_index);
+    fragment.setColor(frag_index, Color::black());
 
     if (!consecutivex_flag) {
       if (use_cheaprng)
-        rng.seed(fe0.x*ci.xres+fe0.y);
+        
rng.seed(fragment.getX(frag_index)*ci.xres+fragment.getY(frag_index));
       else
-        random[thd_num].seed_rng(fe0.x*ci.xres+fe0.y);
+        
random[thd_num].seed_rng(fragment.getX(frag_index)*ci.xres+fragment.getY(frag_index));
     }
     
     // For each fragment start filling up the RayPacket with samples.
     // When you filled up the empty_slots compute the rays, do the
     // average, and store the results in the fragment.
+    int fx = fragment.getX(frag_index);
+    int fy = fragment.getY(frag_index);
     for(int xs = 0; xs < nx; xs++)
       for(int ys = 0; ys  < ny; ys++)
         {
@@ -185,8 +185,8 @@
             x_sample = (xs + random[thd_num].genRealRand<Real>()) * inx;
             y_sample = (ys + random[thd_num].genRealRand<Real>()) * iny;
           }
-          px = (fe0.x+(x_sample))*ci.xscale+ci.xoffset;
-          py = (fe0.y+(y_sample))*ci.yscale+ci.yoffset;
+          px = (fx+x_sample)*ci.xscale+ci.xoffset;
+          py = (fy+y_sample)*ci.yscale+ci.yoffset;
           rays.setPixel(sample_count, 0, px, py);
           sample_count++;
           

Modified: trunk/Engine/PixelSamplers/NullSampler.cc
==============================================================================
--- trunk/Engine/PixelSamplers/NullSampler.cc   (original)
+++ trunk/Engine/PixelSamplers/NullSampler.cc   Thu Apr 27 17:16:25 2006
@@ -32,6 +32,6 @@
 
 void NullSampler::renderFragment(const RenderContext&, Fragment& fragment)
 {
-  for(int i=0;i<fragment.getSize();i++)
-    fragment.get(i).color = Color(RGBColor(0.3, 0.6, 0.9));
+  for(int i=fragment.begin();i<fragment.end();i++)
+    fragment.setColor(i, Color(RGBColor(0.3, 0.6, 0.9)));
 }

Modified: trunk/Engine/PixelSamplers/SingleSampler.cc
==============================================================================
--- trunk/Engine/PixelSamplers/SingleSampler.cc (original)
+++ trunk/Engine/PixelSamplers/SingleSampler.cc Thu Apr 27 17:16:25 2006
@@ -50,34 +50,34 @@
 {
   ChannelInfo& ci = channelInfo[context.channelIndex];
   int flags = RayPacket::HaveImageCoordinates;
-  if(fragment.getFlags() & Fragment::ConstantEye)
+  if(fragment.getFlag(Fragment::ConstantEye))
     flags |= RayPacket::ConstantEye;
-  for(int f=0;f<fragment.getSize();f+=RayPacket::MaxSize){
+  for(int f=fragment.begin();f<fragment.end();f+=RayPacket::MaxSize){
     // We want to fill our RayPacket with as many as
     // RayPacket::MaxSize rays.
     int size = RayPacket::MaxSize;
-    if(size >= fragment.getSize()-f)
+    if(size >= fragment.end()-f)
       // We don't have enough fragments left to fill a ray packet, so
       // set the size of the RayPacket to the number of fragments we
       // have left.
-      size = fragment.getSize()-f;
+      size = fragment.end()-f;
     // Create a ray packet
     int depth = 0;
     RayPacketData raydata;
     RayPacket rays(raydata, 0, size, depth, flags);
 
     // Check to see if the fragment is consecutive in x.
-    if(fragment.getFlags() & Fragment::ConsecutiveX){
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) == 
Fragment::ConsecutiveX|Fragment::ConstantEye){
 
       // If so place each pixel in the ray packet relative to the first
       // fragment.
-      Fragment::Element& fe0 = fragment.get(f);
-      Real px = fe0.x*ci.xscale+ci.xoffset;
-      Real py = fe0.y*ci.yscale+ci.yoffset;
+      int b = fragment.begin();
+      Real px = fragment.getX(b)*ci.xscale+ci.xoffset;
+      Real py = fragment.getY(b)*ci.yscale+ci.yoffset;
+      int eye = fragment.getWhichEye(b);
       
       for(int i=0;i<size;i++){
-        Fragment::Element& fe = fragment.get(f+i);
-        rays.setPixel(i, fe.which_eye, px, py);
+        rays.setPixel(i, eye, px, py);
         px += ci.xscale;
       }
 
@@ -86,19 +86,19 @@
     // Otherwise, set each pixel individually.
     else {
       for(int i=0;i<size;i++){
-        Fragment::Element& fe = fragment.get(f+i);
-        Real px = fe.x*ci.xscale+ci.xoffset;
-        Real py = fe.y*ci.yscale+ci.yoffset;
-        rays.setPixel(i, fe.which_eye, px, py);
+        Real px = fragment.getX(i)*ci.xscale+ci.xoffset;
+        Real py = fragment.getY(i)*ci.yscale+ci.yoffset;
+        rays.setPixel(i, fragment.getWhichEye(i), px, py);
       }
     }
     
     // Trace the rays.  The results will automatically go into the fragment
     context.renderer->traceEyeRays(context, rays);
 
-    for(int i=0;i<size;i++){
-      Fragment::Element& fe = fragment.get(f+i);
-      fe.color = rays.getColor(i);
+    for(int i=0;i<size;i++)
+    {
+        for ( int c = 0; c < Color::NumComponents; c++ )
+            fragment.color[c][i] = raydata.color[c][i];
     }
   }
 }

Modified: trunk/Image/SimpleImage.h
==============================================================================
--- trunk/Image/SimpleImage.h   (original)
+++ trunk/Image/SimpleImage.h   Thu Apr 27 17:16:25 2006
@@ -104,17 +104,15 @@
   template<class Pixel>
   void SimpleImage<Pixel>::set(const Fragment& fragment)
   {
-    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++)
-       convertToPixel(*pix++, fragment.get(i).color.convertRGB());
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
+       Fragment::ConsecutiveX|Fragment::ConstantEye){
+      int b = fragment.begin();
+      Pixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
+      for(int i=fragment.begin(); i< fragment.end();i++)
+       convertToPixel(*pix++, fragment.getColor(i).convertRGB());
     } else {
-      for(int i=0;i<fragment.getSize();i++){
-       const Fragment::Element& f = fragment.get(i);
-        if(f.x<xres && f.x>=0 && f.y<yres && f.y>=0)
-          convertToPixel(eyeStart[f.which_eye][f.y][f.x], 
f.color.convertRGB());
+      for(int i=fragment.begin();i<fragment.end();i++){
+        
convertToPixel(eyeStart[fragment.getWhichEye(i)][fragment.getY(i)][fragment.getX(i)],
 fragment.getColor(i).convertRGB());
       }
     }
   }
@@ -122,21 +120,20 @@
   template<class Pixel>
   void SimpleImage<Pixel>::get(Fragment& fragment) const
   {
-    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++) {
+    if(fragment.getFlag(Fragment::ConsecutiveX|Fragment::ConstantEye) ==
+       Fragment::ConsecutiveX|Fragment::ConstantEye){
+      int b = fragment.begin();
+      Pixel* pix = 
eyeStart[fragment.getWhichEye(b)][fragment.getY(b)]+fragment.getX(b);
+      for(int i=fragment.begin(); i < fragment.end();i++) {
         RGBColor color;
         convertToRGBColor(color, *pix++);
         // Convert from RGBColor to Color
         fragment.setColor(i, Color(color));
       }
     } else {
-      for(int i=0;i<fragment.getSize();i++){
-        const Fragment::Element& f = fragment.get(i);
+      for(int i=fragment.begin(); i < fragment.end(); i++){
         RGBColor color;
-        convertToRGBColor(color, eyeStart[f.which_eye][f.y][f.x]);
+        convertToRGBColor(color, 
eyeStart[fragment.getWhichEye(i)][fragment.getY(i)][fragment.getX(i)]);
         // Convert from RGBColor to Color
         fragment.setColor(i, Color(color));
       }

Modified: trunk/Interface/Fragment.h
==============================================================================
--- trunk/Interface/Fragment.h  (original)
+++ trunk/Interface/Fragment.h  Thu Apr 27 17:16:25 2006
@@ -21,6 +21,7 @@
 #include <Core/Util/Assert.h>
 
 #include <FragmentParameters.h>
+#include <Core/Util/Align.h>
 
 // TODO:
 //
@@ -31,82 +32,92 @@
 //
 
 namespace Manta {
-  class Fragment {
+  class MANTA_ALIGN(16) Fragment {
   public:
 
     static const int ConsecutiveX    = 0x01;  // Implies a constant Y:
-    static const int ConstantEye = 0x02;
+    static const int ConstantEye     = 0x02;
 
     
///////////////////////////////////////////////////////////////////////////
     // Empty Constructor    
     Fragment()
-      : flags(0), size(0), data(reinterpret_cast<Element*>(databuf))
+      : flags(0), pixelBegin(0), pixelEnd(0)
       {}
 
     // Creates a "Scan-line" fragment.
-    Fragment(int which_eye, int xstart, int xend, int y)
-      : data(reinterpret_cast<Element*>(databuf))
+    Fragment(int xstart, int xend, int y, int eye, int)
     {
-      ASSERTRANGE(xend-xstart, 0, MaxSize+1);
-      int nx = xend-xstart;
-      for(int i=0; i< nx;i++){
-        data[i].x = i+xstart;
-        data[i].y = y;
-        data[i].which_eye = which_eye;
-      }
-      flags = ConsecutiveX|ConstantEye;
-      size = nx;
+      setConsecutiveX(xstart, xend, y, eye, 999);
     }
        
     ~Fragment() {}
 
-    void addElement(int x, int y, int which_eye) {
-      ASSERT(size < MaxSize);
-      data[size].x = x;
-      data[size].y = y;
-      data[size].which_eye = which_eye;
-      size++;
+    void addElement(int x, int y, int eye) {
+      ASSERT(pixelEnd < MaxSize);
+      pixel[0][pixelEnd] = x;
+      pixel[1][pixelEnd] = y;
+      which_eye[pixelEnd] = eye;
+      pixelEnd++;
     }
       
-    void setElement( int i, int x, int y, int which_eye ) {
+    void setElement( int i, int x, int y, int eye ) {
       ASSERTRANGE(i, 0, MaxSize);
-      data[i].x = x;
-      data[i].y = y;
-      data[i].which_eye = which_eye;
+      pixel[0][i] = x;
+      pixel[1][i] = y;
+      which_eye[i] = eye;
     }
 
-    void setConsecutiveX(int which_eye, int xstart, int xend, int y) {
+    void setConsecutiveX(int xstart, int xend, int y, int eye, int) {
       ASSERTRANGE(xend-xstart, 0, MaxSize+1);
       int nx = xend-xstart;
       for(int i=0; i< nx;i++){
-        data[i].x = i+xstart;
-        data[i].y = y;
-        data[i].which_eye = which_eye;
+        pixel[0][i] = i+xstart;
+        pixel[1][i] = y;
+        which_eye[i] = eye;
       }
       flags = ConsecutiveX|ConstantEye;
-      size = nx;
+      pixelBegin = 0;
+      pixelEnd = nx;
     }
     
+    void resetSize() {
+      pixelBegin = 0;
+      pixelEnd = 0;
+    }
+
     
///////////////////////////////////////////////////////////////////////////
     // Accessors.
-    int getFlags() const {
+    // Fragment flags
+    int getAllFlags() const
+    {
       return flags;
     }
-    void setAllFlags(const int newflags) {
-      flags = newflags;
+
+    bool getFlag( int flag ) const
+    {
+      return (flags & flag) == flag;
     }
 
-    int getSize() const {
-      return size;
+    void setAllFlags(int new_flags)
+    {
+      flags = new_flags;
     }
-    void setSize(const int newSize) {
-      size = newSize;
+    void setFlag(int flag) {
+      flags |= flag;
     }
-    void resetSize() {
-      size = 0;
+    void resetFlag(int flag) {
+      flags &= ~flag;
+    }
+
+    int begin() const {
+      return pixelBegin;
+    }
+    int end() const {
+      return pixelEnd;
     }
     void resetAll() {
-      size = 0;
+      pixelBegin = 0;
+      pixelEnd = 0;
       flags = 0;
     }
 
@@ -115,8 +126,8 @@
     void testSetWhichEye() {
       // This will be true if size is <= 1.
       int test_passed = ConstantEye;
-      for(int i = 1; i < size; ++i)
-        if (data[i-1].which_eye != data[i].which_eye) {
+      for(int i = pixelBegin+1; i < pixelEnd; ++i)
+        if (which_eye[i-1] != which_eye[i]) {
           test_passed = 0;
           break;
         }
@@ -126,19 +137,61 @@
     }
     void testSetConsecutiveX() {
       int test_passed = ConsecutiveX;
-      for(int i = 1; i < size; ++i)
+      for(int i = pixelBegin+1; i < pixelEnd; ++i)
         // Test to see if the y's are the same as well as X being
         // consecutive.
-        if (data[i].y != data[i-1].y &&
-            (data[i].x - data[i-1].x) == 1) {
+        if (pixel[1][i] != pixel[1][i-1] ||
+            pixel[0][i] - pixel[0][i-1] != 1){
           test_passed = 0;
           break;
         }
       flags = test_passed | (flags & ~ConsecutiveX);
     }
-    
-    void setColor(int which, const Color& color) {
-      data[which].color = color;
+
+    // Pixel
+    int getX(int which) const
+    {
+      return pixel[0][which];
+    }
+    int getY(int which) const
+    {
+      return pixel[1][which];
+    }
+    int getWhichEye(int which) const
+    {
+      return which_eye[which];
+    }
+
+    // Color
+    void setColor(int which, const Color& newcolor)
+    {
+      for(int i=0;i<Color::NumComponents;i++)
+        color[i][which] = newcolor[i];
+    }
+    Color getColor(int which) const
+    {
+      Color result;
+      for(int i=0;i<Color::NumComponents;i++)
+        result[i] = color[i][which];
+      return result;
+    }
+
+    void scaleColors(Color::ComponentType scale)
+    {
+      for(int j=pixelBegin;j<pixelEnd;j++){
+        for(int i = 0 ; i < Color::NumComponents; i++)
+          color[i][j] *= scale;
+      }
+    }
+    void scaleColor(int which, Color::ComponentType scale)
+    {
+      for(int i = 0 ; i < Color::NumComponents; i++)
+        color[i][which] *= scale;
+    }
+    void addColor(int which, const Color& add)
+    {
+      for(int i = 0 ; i < Color::NumComponents; i++)
+        color[i][which] += add[i];
     }
 
     
///////////////////////////////////////////////////////////////////////////
@@ -148,32 +201,24 @@
     // dynamically allocate them.
     static const int MaxSize = FRAGMENT_MAXSIZE;
 
-    // Represents a Pixel
-    struct Element {
-      // Pixel position in image space
-      int x, y;
-      int which_eye; // monocular: always 0, stereo: 0=left, 1=right
-      Color color;   // Final result
-    };
-    const Element& get(int which) const {
-      return data[which];
-    }
-    Element& get(int which) {
-      return data[which];
-    }
-  private:
-    //Element data[MaxSize];
-    Element* data;
-    char databuf[MaxSize*sizeof(Element)];
+  public:
+    // Fragment data
+    MANTA_ALIGN(16) Color::ComponentType 
color[Manta::Color::NumComponents][MaxSize];
+    MANTA_ALIGN(16) int pixel[2][MaxSize];
+    MANTA_ALIGN(16) int which_eye[MaxSize];
 
-    // ConstantEye | ConsecutiveX
+    // Properties of this packet
     int flags;
 
-    // Number of Elements that are currently being used.
-    int size;
-  };
+    // Range of Elements that are currently being used.
+    int pixelBegin, pixelEnd;
 
-  
+  private:
+    // Prevent accidental copying of Fragments
+    Fragment(const Fragment&);
+    Fragment& operator=(const Fragment&);
+
+  };
 }
 
 #endif

Modified: trunk/Interface/RayPacket.h
==============================================================================
--- trunk/Interface/RayPacket.h (original)
+++ trunk/Interface/RayPacket.h Thu Apr 27 17:16:25 2006
@@ -26,7 +26,7 @@
   public:
     enum {
       MaxScratchpadSize = SCRATCHPAD_MAXSIZE,
-      Size              = RAYPACKET_MAXSIZE
+      MaxSize              = RAYPACKET_MAXSIZE
     };
     RayPacketData()
       {
@@ -44,38 +44,38 @@
     typedef Material const*  MaterialCP;
     typedef TexCoordMapper const* TexCoordMapperCP;
 
-    PrimitiveCP hitPrim[Size];
-    MaterialCP hitMatl[Size];
-    TexCoordMapperCP hitTex[Size];
+    PrimitiveCP hitPrim[MaxSize];
+    MaterialCP hitMatl[MaxSize];
+    TexCoordMapperCP hitTex[MaxSize];
 
     // Real-based arrays
-    MANTA_ALIGN(16) Real origin[3][Size];
-    MANTA_ALIGN(16) Real direction[3][Size];
-    MANTA_ALIGN(16) Real inverseDirection[3][Size];
-    MANTA_ALIGN(16) Real minT[Size];
-
-    Real image[2][Size];
-    Real normal[3][Size];
-    Real hitPosition[3][Size];
-    Real texCoords[3][Size];
+    MANTA_ALIGN(16) Real origin[3][MaxSize];
+    MANTA_ALIGN(16) Real direction[3][MaxSize];
+    MANTA_ALIGN(16) Real inverseDirection[3][MaxSize];
+    MANTA_ALIGN(16) Real minT[MaxSize];
+
+    Real image[2][MaxSize];
+    Real normal[3][MaxSize];
+    Real hitPosition[3][MaxSize];
+    Real texCoords[3][MaxSize];
 
 
     // Color-based arrays
-    Color::ComponentType color[Manta::Color::NumComponents][Size];
-    Color::ComponentType importance[Manta::Color::NumComponents][Size];   // 
1-attenuation, where eye rays have importance == 1
+    Color::ComponentType color[Manta::Color::NumComponents][MaxSize];
+    Color::ComponentType importance[Manta::Color::NumComponents][MaxSize];   
// 1-attenuation, where eye rays have importance == 1
 
     // Int-based arrays
-    int whichEye[Size];
-    int signs[3][Size]; // 1=negative, 0=zero, positive
+    int whichEye[MaxSize];
+    int signs[3][MaxSize]; // 1=negative, 0=zero, positive
 
     // Char-based arrays
-    char scratchpad_data[Size][MaxScratchpadSize];
+    char scratchpad_data[MaxSize][MaxScratchpadSize];
   };
 
   class RayPacket {
   public:
     enum {
-      MaxSize               = RayPacketData::Size,
+      MaxSize               = RayPacketData::MaxSize,
 
       // Flags.
       ConstantOrigin        = 0x0001,
@@ -561,6 +561,7 @@
     }
 
   private:
+    // Prevent accidental copying of RayPackets
     RayPacket(const RayPacket&);
     RayPacket& operator=(const RayPacket&);
 

Modified: trunk/Model/Textures/ImageTexture.h
==============================================================================
--- trunk/Model/Textures/ImageTexture.h (original)
+++ trunk/Model/Textures/ImageTexture.h Thu Apr 27 17:16:25 2006
@@ -215,10 +215,10 @@
       for(int x = 0; x < xres; x+=Fragment::MaxSize) {
         int end = x + Fragment::MaxSize;
         if (end > xres) end = xres;
-        Fragment fragment(0, x, end, y);
+        Fragment fragment(x, end, y, 0, 999);
         image->get(fragment);
-        for(int i = 0; i < fragment.getSize(); i++) {
-          texture(x+i, y) = fragment.get(i).color;
+        for(int i = fragment.begin(); i < fragment.end(); i++) {
+          texture(x+i, y) = fragment.getColor(i);
         }
       }
     }




  • [MANTA] r1016 - in trunk: Engine/Display Engine/ImageTraversers Engine/PixelSamplers Image Interface Model/Textures, sparker, 04/27/2006

Archive powered by MHonArc 2.6.16.

Top of page