Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r517 - in branches/AFR: Engine/Control Engine/ImageTraversers Engine/ImageTraversers/AFR Interface Model/Cameras


Chronological Thread 
  • From: abhinav@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r517 - in branches/AFR: Engine/Control Engine/ImageTraversers Engine/ImageTraversers/AFR Interface Model/Cameras
  • Date: Tue, 30 Aug 2005 20:53:37 -0600 (MDT)

Author: abhinav
Date: Tue Aug 30 20:53:34 2005
New Revision: 517

Modified:
   branches/AFR/Engine/Control/AFRPipeline.cc
   branches/AFR/Engine/ImageTraversers/AFImageTraverser.cc
   branches/AFR/Engine/ImageTraversers/AFImageTraverser.h
   branches/AFR/Engine/ImageTraversers/AFR/kdtree.cc
   branches/AFR/Engine/ImageTraversers/AFR/kdtree.h
   branches/AFR/Engine/ImageTraversers/AFR/sample.h
   branches/AFR/Engine/ImageTraversers/AFR/tiles.cc
   branches/AFR/Engine/ImageTraversers/AFR/tiles.h
   branches/AFR/Interface/Camera.h
   branches/AFR/Model/Cameras/EnvironmentCamera.cc
   branches/AFR/Model/Cameras/EnvironmentCamera.h
   branches/AFR/Model/Cameras/FisheyeCamera.cc
   branches/AFR/Model/Cameras/FisheyeCamera.h
   branches/AFR/Model/Cameras/OrthogonalCamera.cc
   branches/AFR/Model/Cameras/OrthogonalCamera.h
   branches/AFR/Model/Cameras/PinholeCamera.cc
   branches/AFR/Model/Cameras/PinholeCamera.h
Log:
added support for stream files use -stream <filename> option in afr 
imagetraverser 
checking for infinite values in occlusion to disable false positives
corrected a bug where timestamp for temporal sample was not being defined.


M    Model/Cameras/EnvironmentCamera.cc
M    Model/Cameras/EnvironmentCamera.h
M    Model/Cameras/FisheyeCamera.cc
M    Model/Cameras/OrthogonalCamera.cc
M    Model/Cameras/FisheyeCamera.h
M    Model/Cameras/OrthogonalCamera.h
M    Model/Cameras/PinholeCamera.cc
M    Model/Cameras/PinholeCamera.h
M    Interface/Camera.h
M    Engine/Control/AFRPipeline.cc
M    Engine/ImageTraversers/AFR/kdtree.cc
M    Engine/ImageTraversers/AFR/kdtree.h
M    Engine/ImageTraversers/AFR/tiles.cc
M    Engine/ImageTraversers/AFR/tiles.h
M    Engine/ImageTraversers/AFR/sample.h
M    Engine/ImageTraversers/AFImageTraverser.cc
M    Engine/ImageTraversers/AFImageTraverser.h



Modified: branches/AFR/Engine/Control/AFRPipeline.cc
==============================================================================
--- branches/AFR/Engine/Control/AFRPipeline.cc  (original)
+++ branches/AFR/Engine/Control/AFRPipeline.cc  Tue Aug 30 20:53:34 2005
@@ -342,12 +342,12 @@
       }
     }
 
-               
///////////////////////////////////////////////////////////////////////////
-               
///////////////////////////////////////////////////////////////////////////
-               // Outer Loop: Pipeline Stage 1. 
-               // Callbacks & Transactions.
-               
///////////////////////////////////////////////////////////////////////////
-               
///////////////////////////////////////////////////////////////////////////
+    
///////////////////////////////////////////////////////////////////////////
+    
///////////////////////////////////////////////////////////////////////////
+    // Outer Loop: Pipeline Stage 1. 
+    // Callbacks & Transactions.
+    
///////////////////////////////////////////////////////////////////////////
+    
///////////////////////////////////////////////////////////////////////////
     
     doParallelAnimationCallbacks(changed, proc, workersAnimAndImage);
     doSerialAnimationCallbacks  (changed, proc, workersAnimAndImage);
@@ -359,26 +359,26 @@
     
     // What is "changed" used for?
     
-               
///////////////////////////////////////////////////////////////////////////
+    
///////////////////////////////////////////////////////////////////////////
     // Resize the image. rebuild per thread kd-trees.
-               // Note all threads call this, which is different from trunk/
+    // Note all threads call this, which is different from trunk/
     resizeImages(animFrameState.frameNumber);
                
-               // Note that the AFRPipeline doesn't support changing the 
number of processors.
-               
-               
///////////////////////////////////////////////////////////////////////////
+    // Note that the AFRPipeline doesn't support changing the number of 
processors.
+       
+    
///////////////////////////////////////////////////////////////////////////
     // Check to see if we need to setup a pipeline (after a state change for 
-               // example)
-               int numProcs = workersAnimAndImage;
-               
-               // Note doIdleModeCallbacks is omitted -- the pipeline should 
never be idle.
-               
-               if (pipelineNeedsSetup || wait_for_transactions /*|| 
changed*/) {
-
-                       // Negotiate the image pipeline for each channel
-                       if ((proc == 0) && (pipelineNeedsSetup)) {
-                               setupPipelines(numProcs);
-                               resizeImages(renderFrameState.frameNumber);
+    // example)
+    int numProcs = workersAnimAndImage;
+       
+    // Note doIdleModeCallbacks is omitted -- the pipeline should never be 
idle.
+               
+    if (pipelineNeedsSetup || wait_for_transactions /*|| changed*/) {
+
+      // Negotiate the image pipeline for each channel
+      if ((proc == 0) && (pipelineNeedsSetup)) {
+        setupPipelines(numProcs);
+          resizeImages(renderFrameState.frameNumber);
       }
                        
       // Reset barrier conditions.
@@ -390,67 +390,64 @@
 
       wait_for_transactions = false;
       
-                       // Wait for all of the other processors to finish 
setup.
-                       // pipeline_setup_barrier.wait(numProcs);
+      // Wait for all of the other processors to finish setup.
+      // pipeline_setup_barrier.wait(numProcs);
       outer_loop_barrier.wait(numProcs);
-               }
-    
+    }
                
-               
///////////////////////////////////////////////////////////////////////////
-               
///////////////////////////////////////////////////////////////////////////
-               // Outer Loop: Pipeline Stage 2. 
-               // Image Display (Eventually reconstruction)
-               
///////////////////////////////////////////////////////////////////////////
-               
///////////////////////////////////////////////////////////////////////////
+    
///////////////////////////////////////////////////////////////////////////
+    
///////////////////////////////////////////////////////////////////////////
+    // Outer Loop: Pipeline Stage 2. 
+    // Image Display (Eventually reconstruction)
+    
///////////////////////////////////////////////////////////////////////////
+    
///////////////////////////////////////////////////////////////////////////
 
-               for(ChannelListType::iterator iter = channels.begin(); iter 
!= channels.end(); iter++){
+    for(ChannelListType::iterator iter = channels.begin(); iter != 
channels.end(); iter++){
                        
-                       Channel* channel = *iter;
-                       long displayFrame = 
(renderFrameState.frameNumber-1)%channel->pipelineDepth;
-                       Image* image = channel->images[displayFrame];
+      Channel* channel = *iter;
+      long displayFrame = 
(renderFrameState.frameNumber-1)%channel->pipelineDepth;
+      Image* image = channel->images[displayFrame];
                        
-                       if(image && image->isValid()){
-
-                         // Compute the current sampling rate.
-                         Real current_samples = 
currentImageTraverser->getSamplesDone();
-
-                         Real delta_samples = (current_samples-last_samples);
-                         Real currenttime = SCIRun::Time::currentSeconds();
-                         Real delta_time = currenttime - last_display_time;
-                         last_display_time = currenttime;
-
-                         Real sampling_rate = delta_samples / delta_time;
-
-                         currentImageTraverser->setSamplingRate( (unsigned 
int)sampling_rate );
-
-                         DisplayContext myContext(proc, workersAnimAndImage);
-                         channel->display->displayImage(myContext, image, 
(current_samples-last_samples) );
+      if(image && image->isValid()){
+        // Compute the current sampling rate.
+         Real current_samples = currentImageTraverser->getSamplesDone();
+
+         Real delta_samples = (current_samples-last_samples);
+         Real currenttime = SCIRun::Time::currentSeconds();
+         Real delta_time = currenttime - last_display_time;
+         last_display_time = currenttime;
+
+         Real sampling_rate = delta_samples / delta_time;
+
+         currentImageTraverser->setSamplingRate( (unsigned int)sampling_rate 
);
+          DisplayContext myContext(proc, workersAnimAndImage);
+          channel->display->displayImage(myContext, image, 
(current_samples-last_samples));
+          last_samples = current_samples;
         
-                         last_samples = current_samples;
-                       }
+      }
       
       // std::cout << "Total samples: " << 
currentImageTraverser->getSamplesDone() << std::endl;
-               }
+    }
                
     /////////////////////////////////////////////////////////////////////////
     // Pre-render callbacks
     doParallelPreRenderCallbacks(proc, workersRendering);
     doSerialPreRenderCallbacks(proc, workersRendering);                    
     
-// skipToRendering:
+    // skipToRendering:
     /////////////////////////////////////////////////////////////////////////
     /////////////////////////////////////////////////////////////////////////
     // Inner Loop
     /////////////////////////////////////////////////////////////////////////
     /////////////////////////////////////////////////////////////////////////
     int inner_iterations = 0;
-               for (double begin_time=SCIRun::Time::currentSeconds();
-         
(SCIRun::Time::currentSeconds()-begin_time)<currentImageTraverser->inner_loop_time;)
 {
-               
+    for (double begin_time=SCIRun::Time::currentSeconds();
+         
(SCIRun::Time::currentSeconds()-begin_time)<currentImageTraverser->inner_loop_time;)
 
+    {
       ++inner_iterations;
-    
-      for(int index = 0;index < static_cast<int>(channels.size());index++){
-        
+
+      for(int index = 0;index < static_cast<int>(channels.size());index++)
+      {
         Channel* channel = channels[index];
         long renderFrame = 
renderFrameState.frameNumber%channel->pipelineDepth;
         Image* image = channel->images[renderFrame];
@@ -459,6 +456,7 @@
                                 currentRenderer, currentShadowAlgorithm,
                                 channel->camera, scene);
     
+       if(inner_iterations==1) 
currentImageTraverser->write_Tile_and_Camera(myContext);
         
///////////////////////////////////////////////////////////////////////
         
///////////////////////////////////////////////////////////////////////
         // Inner Loop: Pipeline Stage 1. 
@@ -476,18 +474,17 @@
         currentImageTraverser->clientTask( myContext, image );
         
         image->setValid(true);
-                       }
+      }
                        
-                       // Determine how to break out of inner loop. 
!!!!!!!!!!!!!!!!!!!!!!!!!!
+      // Determine how to break out of inner loop. !!!!!!!!!!!!!!!!!!!!!!!!!!
                        
-               } // End of inner loop.
-               if(proc==0)
-               {
-                 if (currentImageTraverser->debug_window) 
-                       // do the display stuff here
-                       currentImageTraverser->display_stats();
-               }
-    
+    } // End of inner loop.
+    if(proc==0)
+    {
+      if (currentImageTraverser->debug_window) 
+       // do the display stuff here
+       currentImageTraverser->display_stats();
+    }
   } // End of outer loop.
 }
 

Modified: branches/AFR/Engine/ImageTraversers/AFImageTraverser.cc
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFImageTraverser.cc     (original)
+++ branches/AFR/Engine/ImageTraversers/AFImageTraverser.cc     Tue Aug 30 
20:53:34 2005
@@ -53,6 +53,8 @@
   samplingrate( 400000 ),
   displayClientId( 0 ),
   visScale( 1.0 ),
+  outputStreams( false ),
+  //streamlock( "streamlock" ),
   tmode(SOLID)
 {
 
@@ -72,6 +74,12 @@
         throw IllegalArgument("-samplingrate <Int>", i, args);
       }
     }
+    if (args[i] == "-stream") {
+      if (!getArg( i, args, streamfilename )) {
+        throw IllegalArgument("-streamfilename <string>", i, args);
+      }
+      outputStreams = true;
+    }
     if (args[i] == "-debug") {
       debug_window = true;
     }
@@ -299,6 +307,72 @@
   }
 }
 
+#define DESIRED_FRAME_RATE 15
+void AFImageTraverser::initStreams(int xres, int yres)
+{              // print the version info
+           char fname[80];
+               time_t t;
+               time(&t);
+               //streamlock.lock();
+               for(int i=0; i<num_clients; i++)
+               {
+                 sprintf(fname,"%s%03d",streamfilename.c_str(),i);
+                 streamfile[i] = fopen(fname,"wb");
+                 fprintf(streamfile[i], "Version 3.0\n");
+                 fprintf(streamfile[i],"Created on: %s", ctime(&t));
+                 // print the width and height
+                 fprintf(streamfile[i],"width %d\n", xres);
+                 fprintf(streamfile[i],"height %d\n", yres);
+                 fprintf(streamfile[i],"depth INF\n");
+                 // print the simulated frame rate
+                 fprintf(streamfile[i],"frame_rate %d\n",DESIRED_FRAME_RATE);
+                 fprintf(streamfile[i],"END\n");
+                 //streamlock.unlock();
+                 cout << "initialized stream for client " << i << endl;
+        }
+}
+
+void AFImageTraverser::write_Tile_and_Camera(RenderContext& context)
+{
+  if(!outputStreams) return;
+  
+  
+  //streamlock.lock();
+  int myID = context.proc;
+  
+  fprintf(streamfile[myID],"\n\nbegin_tiles\n");
+  fprintf(streamfile[myID],"num_tiles %d\n",kdtree[myID].number_of_tiles());
+  // call thread's tree, print to file function
+  kdtree[myID].writeToFile(streamfile[myID], 
(float)chunkTimeStamp[context.proc], samplingrate);
+  // have flag for camera and dump the camera
+  fprintf(streamfile[myID],"\n\nbegin_camera\n");
+  // print camera to file
+  context.camera->writeToFile(streamfile[myID]);
+  // have a flag saying sampling begun
+  fprintf(streamfile[myID],"\n\nbegin_samples\n");
+       
+  if(firsttime[myID]==1)
+    firsttime[myID] = 0;
+  else
+  // print the total samples done in this chunk in the space reserved for 
that before
+  {
+        int samplesDoneThisChunk = samples_done[myID].load() - 
last_samples_done[myID];
+       last_samples_done[myID] = samples_done[myID].load();
+        fpos_t tpos;
+       fgetpos(streamfile[myID], &tpos);
+       fsetpos(streamfile[myID],&numsamples_pos[myID]);
+       fprintf(streamfile[myID],"%d",samplesDoneThisChunk);
+       fsetpos(streamfile[myID], &tpos);
+  }
+  
+  // reserve space for total samples in this chunk
+  fprintf(streamfile[myID],"num_samples ");
+  fgetpos(streamfile[myID], &numsamples_pos[myID]);
+  fprintf(streamfile[myID],"                                               
\n");
+
+  //streamlock.unlock();
+}
+
 void AFImageTraverser::setupDisplayChannel(SetupContext& context) {
 
        // Specify that the rendering pipeline should use only one image 
buffer.
@@ -320,7 +394,7 @@
   samples_done = (SamplesDone *)malloc( sizeof(SamplesDone)*num_clients );
 #endif
   memset( samples_done, 0x0, sizeof(SamplesDone)*num_clients );
-  
+  last_samples_done = new int[num_clients];
   initpass = new bool[num_clients];
   chunkTimeStamp = new double[num_clients];
 
@@ -349,6 +423,7 @@
     
     initpass[i] = false;
     chunkTimeStamp[i] = 0.0;
+       last_samples_done[i] = 0;
     kdtree[i].setAB(samplingrate);
     int numlevels = kdtree[i].init(xres, yres, samplingrate);  // initialize 
the tree
   
@@ -359,14 +434,29 @@
   // chunk_size = 256; // this is a fixed number as of now
   maxQSize = qSize = (int)(samplingrate*0.1); // temporal queue size
   temporalQ = new CQ<Sample>[num_clients];
-  
+  newSample = new Sample* [num_clients];
+  newSampleSet = new SampleSet* [num_clients];
   // Initialize 
   for(i = 0; i<num_clients; i++)
+  {
     temporalQ[i].init(qSize+1);
+       // these are really overdimensioned I believe.
+       newSample[i] = new Sample [chunk_size];
+       newSampleSet[i] = new SampleSet [chunk_size];
+  }
+  if(outputStreams)
+  {
+    firsttime = new int[num_clients];
+       for(i=0; i<num_clients; i++)
+         firsttime[i] = 1;
+    numsamples_pos = (fpos_t*)malloc(num_clients*sizeof(fpos_t));
+    streamfile = (FILE**)malloc(num_clients*sizeof(FILE*));
+    initStreams(xres, yres);   
+  }
 }
 
 void AFImageTraverser::renderCrossHair(const RenderContext& context, int 
myID, 
-                                       Image *image, int xres, int yres, 
Sample *s)
+                                       Image *image, int xres, int yres, 
Sample *s, int sscount)
 {
 
   float sx, sy;
@@ -382,11 +472,10 @@
   int isx, isy;
   isx = (int)sx;
   isy = (int)sy;
-  SampleSet ss;
-  ss.set(TEMPORAL_SAMPLE, sx, sy, s->t, 
+  newSampleSet[myID][sscount].set(TEMPORAL_SAMPLE, sx, sy, s->t, 
          s->worldCoord[0], s->worldCoord[1], s->worldCoord[2],
          s->c[0], s->c[1], s->c[2]);
-  ss.tileindex = kdtree[context.proc].getTileforXY(sx, sy);
+  newSampleSet[myID][sscount].tileindex = 
kdtree[context.proc].getTileforXY(sx, sy);
   float t = (float)chunkTimeStamp[context.proc];
   Color color[5];
 
@@ -436,16 +525,16 @@
     RGBColor tempcol = color[i].convertRGB();
     Point p = re.hitPosition;
     
-    ss.set( i, sx, sy, t, p.x(), p.y(), p.z(),tempcol.r(), tempcol.g(), 
tempcol.b() ); 
+    newSampleSet[myID][sscount].set( i, sx, sy, t, p.x(), p.y(), 
p.z(),tempcol.r(), tempcol.g(), tempcol.b() ); 
     
     image->set( (int)(sx+offset[i][0]), (int)(sy+offset[i][1]), color[i] );
   }
   
   //cout << "computing gradients" << endl;
-  ss.computeGradients(t);
+  newSampleSet[myID][sscount].computeGradients(t);
   
   // add the sample to the corresponding kdtree
-  kdtree[context.proc].updateStatsAddSampleSet(&ss, 
(float)chunkTimeStamp[context.proc], samplingrate);
+  kdtree[context.proc].updateStatsAddSampleSet(&newSampleSet[myID][sscount], 
(float)chunkTimeStamp[context.proc], samplingrate);
   
   // samples_done[context.proc] += 5;
   samples_done[context.proc].addFive();
@@ -463,22 +552,23 @@
        
   // renders the fragment by jittering it and stores result in temporalQ
   int flags = RayPacket::HaveImageCoordinates | RayPacket::ConstantEye;
-  
+  int i,f;
   int myID = context.proc;
   int fsize = chunk_size;
-  if(initpass[myID])
+  float t = (float)chunkTimeStamp[myID];
+  /*if(initpass[myID])
   {
     fsize = (chunk_size>(qSize-temporalQ[myID].getN()))? chunk_size : 
qSize-temporalQ[myID].getN();
     if((fsize + temporalQ[myID].getN()) > temporalQ[myID].getMaxSize())
        fsize = temporalQ[myID].getMaxSize() - temporalQ[myID].getN() -1;
     //cout << "fsize = " << fsize << endl;
-  }
+  }*/
   Color color[RayPacket::MaxSize];
-  Sample newSample[RayPacket::MaxSize];
-  
+  //Sample newSample[RayPacket::MaxSize];
+  //cout << "fsize = " << fsize << ", myID = " << myID << endl;
   
/////////////////////////////////////////////////////////////////////////////
   // Create ray packets.
-  for(int f=0;f<fsize;f+=RayPacket::MaxSize) {
+  for(f=0;f<fsize;f+=RayPacket::MaxSize) {
     int size = RayPacket::MaxSize;
     if(size >= fsize-f)
       size = fsize-f;
@@ -489,13 +579,14 @@
     RayPacket rays(raydata, size, depth, flags);
     
     // Copy samples from the sampleQ into the fragment.
-    for(int i=0;i<size;i++) {
+    for(i=0;i<size;i++) {
       int cx, cy;
       int tindex = kdtree[myID].getRandomSample(cx, cy, 
myRandomNumber[myID]);
-      newSample[i].viewCoord[0] = cx;
-      newSample[i].viewCoord[1] = cy;
-      newSample[i].tileindex = tindex;
-      
+        // cout << "f+i = " << f+i << endl;
+      newSample[myID][f+i].viewCoord[0] = cx;
+      newSample[myID][f+i].viewCoord[1] = cy;
+      newSample[myID][f+i].tileindex = tindex;
+      newSample[myID][f+i].t = t;
       // normalized
       double px, py;
                        
@@ -528,30 +619,42 @@
                
     
///////////////////////////////////////////////////////////////////////////
     // okay now copy from fragment to temporalQ
-    for(int i=0;i<size;i++) {
+    for(i=0;i<size;i++) {
     
       RayPacket::Element& re = rays.get(i);
       RGBColor tempcol = color[i].convertRGB();      
-      newSample[i].c[0] = tempcol.r();
-      newSample[i].c[1] = tempcol.g();
-      newSample[i].c[2] = tempcol.b();
-      newSample[i].worldCoord[0] = re.hitPosition.x();
-      newSample[i].worldCoord[1] = re.hitPosition.y();
-      newSample[i].worldCoord[2] = re.hitPosition.z();
+      newSample[myID][f+i].c[0] = tempcol.r();
+      newSample[myID][f+i].c[1] = tempcol.g();
+      newSample[myID][f+i].c[2] = tempcol.b();
+      newSample[myID][f+i].worldCoord[0] = re.hitPosition.x();
+      newSample[myID][f+i].worldCoord[1] = re.hitPosition.y();
+      newSample[myID][f+i].worldCoord[2] = re.hitPosition.z();
       // newSample[i].print();
       
       
/////////////////////////////////////////////////////////////////////////////
       // Skip reconstruction and set the image pixel.
-      image->set((int)(newSample[i].viewCoord[0]), 
(int)(newSample[i].viewCoord[1]), color[i]);
+      image->set((int)(newSample[myID][f+i].viewCoord[0]), 
(int)(newSample[myID][f+i].viewCoord[1]), color[i]);
       
       // add sample to the corresponding kdtree
-      kdtree[myID].updateStatsAddSample(&newSample[i], 
(float)chunkTimeStamp[myID], 0.0, false, samplingrate);
+      kdtree[myID].updateStatsAddSample(&newSample[myID][f+i], 
(float)chunkTimeStamp[myID], 0.0, false, samplingrate);
       //kdtree[myID].ageStats(&newSample[i], (float)chunkTimeStamp[myID]);
       
       // add this sample into the temporalQ
-      temporalQ[myID].qInsert(&newSample[i]);
+      temporalQ[myID].qInsert(&newSample[myID][f+i]);
     }
   }
+  
+         // write to stream if required
+ if(outputStreams)
+ {
+   // get the lock
+   //streamlock.lock();
+
+   for(f=0; f<fsize; f++)
+     newSample[myID][f].writeToFile(streamfile[myID]);
+   // release the lock
+   //streamlock.unlock();
+ }
        
 }
 
@@ -604,10 +707,17 @@
 
     // initialization is done so we can reproject one chunk worth
     int i;
+       int sscount=0;
     Sample *sp;
     //cout << "now making xhairs" << endl;
-    int  fsize = (chunk_size>(temporalQ[myID].getN()-qSize))? chunk_size : 
temporalQ[myID].getN()-qSize;
-    for(i=0; i<fsize; i++) {
+       
+    int  fsize = temporalQ[myID].getN()-qSize;
+       for(i=0; i<fsize; i++)
+               temporalQ[myID].qDelete();
+               
+       //cout << "fsize = " << fsize << endl;
+       if(fsize>=0)
+    for(i=0; i<chunk_size; i++) {
                
       sp = temporalQ[myID].seekLast();
       if(sp!=NULL) {
@@ -634,10 +744,26 @@
         if(sp->viewCoord[0]<xres && sp->viewCoord[0]>=0 
              && sp->viewCoord[1]<yres && sp->viewCoord[1]>=0
              && sp->viewCoord[2]<=1.0)
-          renderCrossHair(context, myID, image, xres, yres, sp);
+           {
+          renderCrossHair(context, myID, image, xres, yres, sp, sscount);
+                 sscount++;
+           }
       }
       else break;
     }
+       // write to file
+       if(outputStreams)
+       {
+         // lock
+         //streamlock.lock();
+         for(i=0; i<sscount; i++)
+         {
+               // write each sample one by one
+               newSampleSet[myID][i].writeToFile(streamfile[myID]);
+         }
+         // unlock
+         //streamlock.unlock();
+       }
   }
 }
 

Modified: branches/AFR/Engine/ImageTraversers/AFImageTraverser.h
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFImageTraverser.h      (original)
+++ branches/AFR/Engine/ImageTraversers/AFImageTraverser.h      Tue Aug 30 
20:53:34 2005
@@ -45,7 +45,7 @@
                        virtual void renderImage(const RenderContext& 
context, Image* image) { /*Undefined for AFRPipeline. */ };
                        
                        void renderChunk(const RenderContext& context, Image* 
image, int xres, int yres);
-                       void renderCrossHair(const RenderContext& context, 
int myID, Image *image, int xres, int yres, Sample *s);
+                       void renderCrossHair(const RenderContext& context, 
int myID, Image *image, int xres, int yres, Sample *s, int sscount);
                        
                        // Master thread task.
                        void masterTask(const RenderContext& context, Image* 
image);
@@ -58,8 +58,10 @@
                        void createStatsWin();
                        void display_stats();
                        void toggleTileDisplayMode();
+                       void initStreams(int xres, int yres);
+                       void write_Tile_and_Camera(RenderContext& context);
                        inline int setSamplingRate(unsigned int srate)
-                        {
+            {
                          static int numUpdates=0;
                          //cout << "srate = " << srate << endl;
                          float rate = (float)srate/(float)num_clients;
@@ -84,10 +86,16 @@
                        int qSize, maxQSize;
                        // number of fragments a chunk is divided into. It is 
divided equally amongst all clients
                        int numFragments;
-                       
+                       bool outputStreams;
+                       string streamfilename;
+                       FILE **streamfile;
+                       //SCIRun::Mutex streamlock;
+                       fpos_t *numsamples_pos;
+                       int *firsttime;
                        // the reprojection queue per thread
                        CQ<Sample> *temporalQ;
-                       
+                       Sample **newSample;
+                       SampleSet **newSampleSet;
                        // Random number generator array??
                        MT_RNG *myRandomNumber;
                        // display stuff
@@ -113,6 +121,7 @@
       
/////////////////////////////////////////////////////////////////////////
       // Samples done.
       struct SamplesDone {
+           SamplesDone() : value (0) {};
         unsigned int value;
         unsigned int padding[31];
 #ifdef __ia64__
@@ -126,7 +135,7 @@
 #endif
       };
                        SamplesDone *samples_done;
-                       
+                       int *last_samples_done;
       // ??????????????
                        double *chunkTimeStamp;
                        bool   *initpass;

Modified: branches/AFR/Engine/ImageTraversers/AFR/kdtree.cc
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFR/kdtree.cc   (original)
+++ branches/AFR/Engine/ImageTraversers/AFR/kdtree.cc   Tue Aug 30 20:53:34 
2005
@@ -62,13 +62,13 @@
                Tile::leafMapping[tile[i].getLeft()/2][tile[i].getBottom()/2] 
= i;      
        }
        //exit(1);
-       Tile::meanLevel = (numLevels/2)+1;
+       Tile::meanLevel = (numLevels/2);
        Tile::max_tile_area = 1;
        for(i=0; i<Tile::meanLevel; i++)
                Tile::max_tile_area *= 2;
 
        minTiles = Tile::max_tile_area;
-       maxTiles = minTiles*8;
+       maxTiles = minTiles*16;
        setTileCut(Tile::meanLevel, 0, samplingrate);
        
        cout << "meanLevel = " << Tile::meanLevel << endl;
@@ -545,7 +545,7 @@
 #endif
 }
 
-int KDTree::printTiles_to_file(FILE *fp, Timestamp currenttime)
+int KDTree::writeToFile(FILE *fp, Timestamp currenttime, int samplingrate)
 {
        int tile_to_print;
        int count = 0;
@@ -553,8 +553,7 @@
        while(tile_to_print!=0)
        {
                count++;
-
-               tile[tile_to_print].print_to_file(fp, tile, numTiles, 
currenttime);
+               tile[tile_to_print].writeToFile(fp, tile, numTiles, 
currenttime, samplingrate);
                tile_to_print = tile[tile_to_print].getNextTile();
        }
        return count;

Modified: branches/AFR/Engine/ImageTraversers/AFR/kdtree.h
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFR/kdtree.h    (original)
+++ branches/AFR/Engine/ImageTraversers/AFR/kdtree.h    Tue Aug 30 20:53:34 
2005
@@ -81,7 +81,7 @@
       inline bool isValidTile(int index) { return tile[index].isValid(); }
       int getTileforXY(float x, float y);
       inline double getTotalError(int index) { return  
tile[index].getTotalError(); }
-      int printTiles_to_file(FILE *fp, Timestamp currenttime);
+      int writeToFile(FILE *fp, Timestamp currenttime, int samplingrate);
       inline bool isInside(int index, float x, float y)
       {
         return tile[index].isInside(x,y);

Modified: branches/AFR/Engine/ImageTraversers/AFR/sample.h
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFR/sample.h    (original)
+++ branches/AFR/Engine/ImageTraversers/AFR/sample.h    Tue Aug 30 20:53:34 
2005
@@ -106,7 +106,7 @@
                                tileindex = value.tileindex;
                        }
                
-                       void print_to_file(FILE *fp)
+                       void writeToFile(FILE *fp)
                        {
                                SamplePrintFormat spf;
                                spf.worldCoord[0] = worldCoord[0];
@@ -263,13 +263,13 @@
                                        //<TODO> set occlusion status here
                                }
                                
-                               void print_to_file(FILE *fp)
+                               void writeToFile(FILE *fp)
                                {
-                                       sample[LEFT_SAMPLE].print_to_file(fp);
-                                       
sample[RIGHT_SAMPLE].print_to_file(fp);
-                                       sample[TOP_SAMPLE].print_to_file(fp);
-                                       
sample[BOTTOM_SAMPLE].print_to_file(fp);
-                                       
sample[CENTER_SAMPLE].print_to_file(fp);
+                                       sample[CENTER_SAMPLE].writeToFile(fp);
+                                       sample[LEFT_SAMPLE].writeToFile(fp);
+                                       sample[RIGHT_SAMPLE].writeToFile(fp);
+                                       sample[TOP_SAMPLE].writeToFile(fp);
+                                       sample[BOTTOM_SAMPLE].writeToFile(fp);
                                }
                                
                                void print()
@@ -287,7 +287,15 @@
                                float      getIntensity(CrosshairSampleLoc 
sloc) { return sample[sloc].intensity(); }
                                Timestamp  
getSampleTimeStamp(CrosshairSampleLoc sloc) { return sample[sloc].t; } 
                                inline bool isOccluded() { 
-                                 const static float epsilon = 0.01;
+                                 const static float epsilon = 0.001;
+                                 
if(isinf(sample[TEMPORAL_SAMPLE].worldCoord[0]) 
+                                    || 
isinf(sample[TEMPORAL_SAMPLE].worldCoord[1])
+                                    || 
isinf(sample[TEMPORAL_SAMPLE].worldCoord[2])
+                                    || 
isinf(sample[CENTER_SAMPLE].worldCoord[0])
+                                    || 
isinf(sample[CENTER_SAMPLE].worldCoord[1])
+                                    || 
isinf(sample[CENTER_SAMPLE].worldCoord[2]))
+                                   return false;
+                       
                                  
if(fabsf(sample[TEMPORAL_SAMPLE].worldCoord[0]-sample[CENTER_SAMPLE].worldCoord[0])>
 epsilon 
                                     || 
fabsf(sample[TEMPORAL_SAMPLE].worldCoord[1]-sample[CENTER_SAMPLE].worldCoord[1])>
 epsilon 
                                     || 
fabsf(sample[TEMPORAL_SAMPLE].worldCoord[2]-sample[CENTER_SAMPLE].worldCoord[2])>
 epsilon )

Modified: branches/AFR/Engine/ImageTraversers/AFR/tiles.cc
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFR/tiles.cc    (original)
+++ branches/AFR/Engine/ImageTraversers/AFR/tiles.cc    Tue Aug 30 20:53:34 
2005
@@ -324,7 +324,7 @@
        }
 }
 
-void Tile::print_to_file(FILE *fp, Tile *tree, int nTiles, Timestamp 
currenttime)
+void Tile::writeToFile(FILE *fp, Tile *tree, int nTiles, Timestamp 
currenttime, int samplingrate)
 {
        // we have to output in binart, so make  a struct and use fwrite
        TilePrintFormat tpf;
@@ -333,36 +333,13 @@
        float r,g,b;
        r = xGradient.getMean();                
        g = yGradient.getMean();        
-       /*if(getOcclusionMeasure(tree, nTiles)>0.05)
-       {
-               int p = index/TG_FILTER_WIDTH;
-               while(tree[p].level<meanLevel) p *= 2;
-               b = tree[p].tGradient.getMean();
-               float sumspat = r+g;
-               if(sumspat>b) b = sumspat;
-       }
-       else
-       {
-               b = tGradient.getMean();
-       }
-       */
-       int p = index/TG_FILTER_WIDTH;
-       while(tree[p].level<meanLevel) p *= 2;
-       b = tree[p].tGradient.getMean();        
-       int cl = level;
-       while(r<0.001 && g<0.001 && b<0.001 && cl>1)
-       {
-               cl = cl/2;
-               r = tree[cl].xGradient.getMean();
-               g = tree[cl].yGradient.getMean();
-               b = tree[cl].tGradient.getMean();
-       }
+       b = tGradient.getMean();
        tpf.xGrad = r;
        tpf.yGrad = g;
        tpf.tGrad = b;
 
        // find the current sampling rate for this call
-       // tpf.oldest_sample_timestamp = currenttime - 
getNumSamples()*((float)nTiles/(float)samplingrate);
+       tpf.oldest_sample_timestamp = currenttime - 
getNumSamples()*((float)nTiles/(float)samplingrate);
        fwrite(&tpf, sizeof(tpf), 1, fp);
 }
 

Modified: branches/AFR/Engine/ImageTraversers/AFR/tiles.h
==============================================================================
--- branches/AFR/Engine/ImageTraversers/AFR/tiles.h     (original)
+++ branches/AFR/Engine/ImageTraversers/AFR/tiles.h     Tue Aug 30 20:53:34 
2005
@@ -177,7 +177,7 @@
                {
                        return (num_pixels<=MIN_VALID_TILE_AREA);
                }
-               void print_to_file(FILE *fp, Tile *tree, int nTiles, 
Timestamp currenttime);
+               void writeToFile(FILE *fp, Tile *tree, int nTiles, Timestamp 
currenttime, int samplingrate);
                inline bool isZeroGrad()
                {
                        return (xGradient.getMean()<MIN_GRAD && 
yGradient.getMean()<MIN_GRAD && tGradient.getMean()<MIN_GRAD);

Modified: branches/AFR/Interface/Camera.h
==============================================================================
--- branches/AFR/Interface/Camera.h     (original)
+++ branches/AFR/Interface/Camera.h     Tue Aug 30 20:53:34 2005
@@ -3,6 +3,7 @@
 #define Manta_Interface_Camera_h
 
 #include <MantaTypes.h>
+#include <stdio.h>
 
 namespace Manta {
   class RayPacket;
@@ -18,6 +19,7 @@
     virtual void translate(Vector v) = 0;
     virtual void dolly(double) = 0;
     virtual Point project(const Point &point) const = 0; // project the 3D 
point on to the camera image plane
+    virtual void writeToFile(FILE *fp) const = 0;
     enum TransformCenter {
       LookAt,
       Eye,

Modified: branches/AFR/Model/Cameras/EnvironmentCamera.cc
==============================================================================
--- branches/AFR/Model/Cameras/EnvironmentCamera.cc     (original)
+++ branches/AFR/Model/Cameras/EnvironmentCamera.cc     Tue Aug 30 20:53:34 
2005
@@ -170,3 +170,8 @@
   // NOT FINISHED
   return Point(0., 0., 0.);
 }
+
+void EnvironmentCamera::writeToFile(FILE *fp) const
+{
+  // NOT FINISHED
+}

Modified: branches/AFR/Model/Cameras/EnvironmentCamera.h
==============================================================================
--- branches/AFR/Model/Cameras/EnvironmentCamera.h      (original)
+++ branches/AFR/Model/Cameras/EnvironmentCamera.h      Tue Aug 30 20:53:34 
2005
@@ -25,6 +25,7 @@
     virtual void transform(AffineTransform t, TransformCenter);
     virtual void autoview(double fov);
     virtual Point project(const Point &point) const;  // project a 3D point 
to the camera image plane
+    virtual void writeToFile(FILE *fp) const;
     static Camera* create(const vector<string>& args);
   private:
     void setup();

Modified: branches/AFR/Model/Cameras/FisheyeCamera.cc
==============================================================================
--- branches/AFR/Model/Cameras/FisheyeCamera.cc (original)
+++ branches/AFR/Model/Cameras/FisheyeCamera.cc Tue Aug 30 20:53:34 2005
@@ -185,3 +185,8 @@
   // NOT FINISHED
   return Point(0,0,0); // just a placeholder
 }
+
+void FisheyeCamera::writeToFile(FILE *fp) const
+{
+  // NOT FINISHED
+}

Modified: branches/AFR/Model/Cameras/FisheyeCamera.h
==============================================================================
--- branches/AFR/Model/Cameras/FisheyeCamera.h  (original)
+++ branches/AFR/Model/Cameras/FisheyeCamera.h  Tue Aug 30 20:53:34 2005
@@ -25,6 +25,7 @@
     virtual void transform(AffineTransform t, TransformCenter);
     virtual void autoview(double fov);
     virtual Point project(const Point &point) const;  // project a 3D point 
to the camera image plane
+    virtual void writeToFile(FILE *fp) const;
     static Camera* create(const vector<string>& args);
   private:
     void setup();

Modified: branches/AFR/Model/Cameras/OrthogonalCamera.cc
==============================================================================
--- branches/AFR/Model/Cameras/OrthogonalCamera.cc      (original)
+++ branches/AFR/Model/Cameras/OrthogonalCamera.cc      Tue Aug 30 20:53:34 
2005
@@ -163,3 +163,8 @@
        // NOT FINISHED
        return Point(0,0,0); // just a placeholder
 }
+
+void OrthogonalCamera::writeToFile(FILE *fp) const
+{
+  // NOT FINISHED
+}

Modified: branches/AFR/Model/Cameras/OrthogonalCamera.h
==============================================================================
--- branches/AFR/Model/Cameras/OrthogonalCamera.h       (original)
+++ branches/AFR/Model/Cameras/OrthogonalCamera.h       Tue Aug 30 20:53:34 
2005
@@ -24,6 +24,7 @@
     virtual void transform(AffineTransform t, TransformCenter);
     virtual void autoview(double fov);
     virtual Point project(const Point &point) const;
+    virtual void writeToFile(FILE *fp) const;
     static Camera* create(const vector<string>& args);
   private:
     void setup();

Modified: branches/AFR/Model/Cameras/PinholeCamera.cc
==============================================================================
--- branches/AFR/Model/Cameras/PinholeCamera.cc (original)
+++ branches/AFR/Model/Cameras/PinholeCamera.cc Tue Aug 30 20:53:34 2005
@@ -231,3 +231,18 @@
                ((p2.y()/zval)+1.0)/2.0, 
                ((p2.z()/zval)+1.0)/2.0); 
 }
+
+void PinholeCamera::writeToFile(FILE *fp) const
+{
+  float wR, wT;
+
+  wR = nearZ*tan(hfov*0.5*M_PI/180.0);
+  wT = nearZ*tan(vfov*0.5*M_PI/180.0);
+  fprintf(fp,"origin %f %f %f\nU %f %f %f\nV %f %f %f\nN %f %f %f\nextents 
%f %f %f %f\nnear %f\nfar %f\n",
+              eye.x(), eye.y(), eye.z(),
+             u.x(), u.y(), u.z(),
+              v.x(), v.y(), v.z(),
+             direction.x(), direction.y(), direction.z(),
+             -wR, wR, -wT, wT,
+              nearZ, nearZ*1000.0);
+}

Modified: branches/AFR/Model/Cameras/PinholeCamera.h
==============================================================================
--- branches/AFR/Model/Cameras/PinholeCamera.h  (original)
+++ branches/AFR/Model/Cameras/PinholeCamera.h  Tue Aug 30 20:53:34 2005
@@ -24,7 +24,8 @@
     virtual void dolly(double);
     virtual void transform(AffineTransform t, TransformCenter);
     virtual void autoview(double fov);
-         virtual Point project(const Point &point) const;  // project a 3D 
point to the camera image plane
+    virtual Point project(const Point &point) const;  // project a 3D point 
to the camera image plane
+    virtual void writeToFile(FILE *fp) const;
     static Camera* create(const vector<string>& args);
   private:
     void setup();




  • [MANTA] r517 - in branches/AFR: Engine/Control Engine/ImageTraversers Engine/ImageTraversers/AFR Interface Model/Cameras, abhinav, 08/30/2005

Archive powered by MHonArc 2.6.16.

Top of page