Text archives Help
- 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.