parviz (parviz++at++pxp.stlaurent.sgi.com)
Tue, 9 Apr 1996 15:33:51 -0400
"I modified the distortion correction demo program "hemisphere.c" that
I found on sgigate.sgi.com in the distribution file
/pub/Performer/RealityCentre/distort.tar.Z. The modification works fine
under IrisGL. I then attempted to convert the modified program to
OpenGL without much success; none of the OpenGL commands seem to draw
anything. Could you ask one of your Performer/OpenGL gurus to have a look
at the program please? I've attached copies of both the IrisGL and OpenGL
versions of the program. Running the programs requires the .flt-format
models and textures found in the distributon file. Thanks
PS - can I copy the frame buffer into a 1024x1280 texture map? I'm not
sure what the restrictions on texture map size are.
----- IrisGL version (hemisphere.c) -----
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <getopt.h> /* for cmdline handler */
#include <gl/device.h>
#include <Performer/pf.h>
#include <Performer/pfdu.h>
#include "pfutil.h"
#include "pfflt.h"
#include "gl.h"
static void CullChannel(pfChannel *, void *);
static void DrawChannel(pfChannel *, void *);
static void OpenPipeline(int, uint);
static void UpdateView(void);
static void GetGLInput(void);
static void drawDistort(void);
/*
* structure that resides in shared memory so that the
* application, cull, and draw processes can access it.
*/
typedef struct
{
long exitFlag;
pfCoord view;
float sceneSize;
int drawStats;
pfChannel *chan;
} SharedData;
static SharedData *Shared;
/* light source created and updated in draw-process */
static pfLight *Sun;
/* for configuring multi-process */
static long ProcSplit = PFMP_APPCULLDRAW;
/* write out scene upon read-in - uses pfDebugPrint */
static long WriteScene = 0;
/*
* docmdline() -- use getopt to get command-line arguments,
* executed at the start of the application process.
*/
static long
docmdline(int argc, char *argv[])
{
long opt;
/* process command-line arguments */
while ((opt = getopt(argc, argv, "wp:?")) != -1)
{
switch (opt)
{
case 'w':
WriteScene = 1;
break;
case 'p':
ProcSplit = atoi(optarg);
break;
}
}
return optind;
}
/*
* main() -- program entry point. this procedure
* is executed in the application process.
*/
int
main (int argc, char *argv[])
{
int arg;
int found;
int i;
pfNode *root;
pfScene *scene;
pfPipe *p;
pfEarthSky *eSky;
pfBox bbox;
float far = 40000.0f;
pfVec3 xyz, hpr;
pfPipeWindow* pw;
arg = docmdline(argc, argv);
pfInit();
/* configure multi-process selection */
pfMultiprocess(ProcSplit);
/* allocate shared before fork()'ing parallel processes */
Shared = (SharedData*)pfMalloc(sizeof(SharedData), pfGetSharedArena());
Shared->exitFlag = 0;
Shared->drawStats = 0;
/* initiate multi-processing mode set in pfMultiprocess call */
pfConfig();
scene = pfNewScene();
/* specify directories where geometry and textures exist */
if (!(getenv("PFPATH")))
pfFilePath(".");
/* load files named by command line arguments */
for (found = 0; arg < argc; arg++)
{
if ((root = pfdLoadFile(argv[arg])) != NULL)
{
pfAddChild(scene, root);
found++;
}
}
/* if no files successfully loaded, terminate program */
if (!found) exit(0);
p = pfGetPipe(0);
pfPhase(PFPHASE_FREE_RUN);
/* Open and configure full screen GL window. */
pw = pfNewPWin(pfGetPipe(0));
/* pfPWinOriginSize(pw,0,0,511,511); */
pfPWinOriginSize(pw,0,0,1024,1024);
pfPWinName(pw,"IRIS Performer");
pfOpenPWin(pw);
pfStageConfigFunc( -1, PFPROC_DRAW, OpenPipeline );
pfConfigStage( -1, PFPROC_DRAW );
pfFrame();
pfFrameRate(30.0f);
Shared->chan = pfNewChan(p);
pfChanTravFunc(Shared->chan, PFTRAV_CULL, CullChannel );
pfChanTravFunc(Shared->chan, PFTRAV_DRAW, DrawChannel );
pfChanScene(Shared->chan, scene);
pfChanNearFar(Shared->chan, 0.1f, far);
/* window(-2.5, 2.5, -1.05, 1.05, 1.0, 100.0);*/
pfChanFOV(Shared->chan, 136.0f, 92.5f);
/* 512 x 512 */
pfChanViewport( Shared->chan, 0.0, 1.0, 0.000, 1.0 );
/* 256 x 256
pfChanViewport( Shared->chan, 0.0, .5, 0.000, 0.5 );
*/
pfSetVec3(xyz, 0.0f, 0.0f, 0.0f);
pfSetVec3(hpr, 0.0f, 45.0f, 0.0f);
pfChanViewOffsets(Shared->chan, xyz, hpr);
/* Create an earth/sky model that draws sky/ground/horizon */
eSky = pfNewESky();
pfESkyMode(eSky, PFES_BUFFER_CLEAR, PFES_FAST);
pfChanESky(Shared->chan, eSky);
pfChanLODAttr( Shared->chan, PFLOD_SCALE, 0.125 );
/* main simulation loop */
while (!Shared->exitFlag)
{
/* wait until next frame boundary */
pfSync();
/* Set view parameters. */
UpdateView();
pfChanView(Shared->chan, Shared->view.xyz, Shared->view.hpr);
/* initiate traversal using current state */
pfFrame();
}
/* terminate cull and draw processes (if they exist) */
pfExit();
/* exit to operating system */
exit(0);
}
/*
* UpdateView() updates the eyepoint based on the information
* placed in shared memory by GetGLInput().
*/
static void
UpdateView(void)
{
static float speed = 0.0f;
pfCoord *view = &Shared->view;
/* update view direction */
view->hpr[PF_H] = 0.0;
view->hpr[PF_P] ++; /*= 0.0;*/
view->hpr[PF_R] = 0.0;
/* update view position */
view->xyz[PF_X] = 0.0;
view->xyz[PF_Y] = 0.0;
view->xyz[PF_Z] = 50.0;
/* view->xyz[PF_X] = 15023;
view->xyz[PF_Y] = -7199.4;
view->xyz[PF_Z] = -204.7 + 1000;
*/
}
/*
* OpenPipeline() -- create a pipeline: setup the window system,
* the IRIS GL, and IRIS Performer. this procedure is executed in
* the draw process (when there is a separate draw process).
*/
static void
OpenPipeline(int pipe, uint stage )
{
float xSize = 800;
float ySize = 500;
/* register events of note with event-queue manager */
qdevice(ESCKEY);
qdevice(F1KEY);
/* negotiate with GL */
gconfig();
/* create a light source in the "south-west" (QIII) */
Sun = pfNewLight(NULL);
pfLightPos(Sun, -0.3f, -0.3f, 1.0f, 0.0f);
/* create a default texture environment */
pfApplyTEnv(pfNewTEnv(NULL));
/* create a default lighting model */
pfApplyLModel(pfNewLModel(NULL));
pfApplyMtl(pfNewMtl(NULL));
/* enable culling of back-facing polygons */
pfCullFace(PFCF_BACK);
/*
* These enables should be set to reflect the majority of the
* database. If most geometry is not textured, then texture
* should be disabled. However, you then need to change the
* FLIGHT-format file reader. (pfflt.c)
*/
pfEnable(PFEN_TEXTURE);
pfDisable(PFEN_WIREFRAME);
pfDisable(PFEN_LIGHTING);
pfDisable(PFEN_FOG);
}
/*
* CullChannel() -- traverse the scene graph and generate a
* display list for the draw process. This procedure is
* executed in the cull process.
*/
static void
CullChannel(pfChannel *channel, void *data)
{
pfCull();
}
static void
DrawChannel (pfChannel *channel, void *data)
{
/* rebind light so it stays fixed in position */
pfLightOn(Sun);
/* erase framebuffer and draw Earth-Sky model */
pfClearChan(channel);
/* invoke Performer draw-processing for this frame */
pfDraw();
/* draw Performer throughput statistics */
if (Shared->drawStats)
pfDrawChanStats(channel);
GetGLInput();
drawDistort();
}
static void
GetGLInput(void)
{
while (qtest())
{
short value;
long device = qread(&value);
/* only act on key-down transitions */
if (value)
{
switch (device)
{
/* ESC-key signals end of simulation */
case ESCKEY:
Shared->exitFlag = 1;
break;
/* F1-key toggles channel-stats display */
case F1KEY:
Shared->drawStats = !Shared->drawStats;
break;
}
}
}
}
#include "newuvarray.h"
float texprops[] = { TX_MAGFILTER, TX_BILINEAR,
TX_MINFILTER, TX_BILINEAR,
TX_WRAP, TX_REPEAT,
TX_INTERNAL_FORMAT, TX_RGB_5,
TX_FAST_DEFINE, TX_NULL};
Matrix ident = { 1.,0.,0.,0.,
0.,1.,0.,0.,
0.,0.,1.,0.,
0.,0.,0.,1.};
static void
drawDistort(void)
{
static unsigned long map[1024 * 1024], flags;
static int first = 1;
int i, j;
float vert[2];
float tvert[2];
if(first)
{
texdef2d(1024, 3, 1024, 1024, map, 10, texprops);
first = 0;
}
viewport( 0, 1023, 0 , 1023);
texbind(TX_TEXTURE_0, 1024);
fbsubtexload(0, 0, TX_TEXTURE_0, 1024, 0.0, 1.0, 0.0, 1.0, flags);
ortho2(0.0, 16.0, 0.0, 16.0);
loadmatrix(ident);
zbuffer(0);
backface(0);
cpack(0xffffffff);
for( i = 0; i < 16; i++) /* sixteen tmesh strips */
{
float yup, ydown;
int tindexup, tindexdown;
ydown = (float) (i);
yup = (float) (i + 1);
tindexdown = i * 17;
tindexup = (i + 1) * 17;
bgntmesh();
tvert[0] = uvarray[tindexdown][0];
tvert[1] = uvarray[tindexdown][1];
t2f (tvert);
vert[0] = 0.0;
vert[1] = ydown;
v2f (vert);
tvert[0] = uvarray[tindexup][0];
tvert[1] = uvarray[tindexup][1];
t2f (tvert);
vert[1] = yup;
v2f (vert);
for (j = 1; j < 17; j ++) {
tvert[0] = uvarray[tindexdown + j][0];
tvert[1] = uvarray[tindexdown + j][1];
t2f (tvert);
vert[0] = (float) (j);
vert[1] = ydown;
v2f (vert);
tvert[0] = uvarray[tindexup + j][0];
tvert[1] = uvarray[tindexup + j][1];
t2f (tvert);
vert[1] = yup;
v2f (vert);
}
endtmesh();
}
zbuffer(1);
}
----- Makefile for hemisphere.c -----
OPT = -g
LFLAGS = \
-lpfdu_igl \
-lpfutil_igl \
-lpf_igl \
-lmpc -limage -lgl -lX11 -lm -lfpe -lC
CFLAGS = -c \
-DIRISGL \
-I/home/camus2/Performer/include/Performer/pfdb \
-I/home/camus2/Performer/include/Performer
OBJS = hemisphere.o
ALL = hemisphere
$(ALL): $(OBJS)
$(CC) $(OPT) $(OBJS) -o $(ALL) $(LFLAGS)
++at++echo "DONE"
.c.o:
$(CC) $(OPT) $(CFLAGS) $<
----- OpenGL version (hemiGL.c) -----
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <getopt.h> /* for cmdline handler */
#include <Performer/pf.h>
#include <Performer/pfdu.h>
#include "pfutil.h"
#include "pfflt.h"
#include "gl.h"
static void CullChannel(pfChannel *, void *);
static void DrawChannel(pfChannel *, void *);
static void OpenPipeline(int, uint);
static void UpdateView(void);
static void drawDistort(void);
/*
* structure that resides in shared memory so that the
* application, cull, and draw processes can access it.
*/
typedef struct
{
long exitFlag;
pfCoord view;
float sceneSize;
int drawStats;
pfChannel *chan;
} SharedData;
static SharedData *Shared;
/* light source created and updated in draw-process */
static pfLight *Sun;
/* for configuring multi-process */
static long ProcSplit = PFMP_APPCULLDRAW;
/* write out scene upon read-in - uses pfDebugPrint */
static long WriteScene = 0;
/*
* docmdline() -- use getopt to get command-line arguments,
* executed at the start of the application process.
*/
static long
docmdline(int argc, char *argv[])
{
long opt;
/* process command-line arguments */
while ((opt = getopt(argc, argv, "wps:?")) != -1)
{
switch (opt)
{
case 'w':
WriteScene = 1;
break;
case 'p':
ProcSplit = atoi(optarg);
break;
case 's':
Shared->drawStats = 1;
break;
}
}
return optind;
}
/*
* main() -- program entry point. this procedure
* is executed in the application process.
*/
int
main (int argc, char *argv[])
{
int arg;
int found;
int i;
pfNode *root;
pfScene *scene;
pfPipe *p;
pfEarthSky *eSky;
pfBox bbox;
float far = 40000.0f;
pfVec3 xyz, hpr;
pfPipeWindow* pw;
pfInit();
/* allocate shared before fork()'ing parallel processes */
Shared = (SharedData*)pfMalloc(sizeof(SharedData), pfGetSharedArena());
Shared->exitFlag = 0;
Shared->drawStats = 0;
arg = docmdline(argc, argv);
/* configure multi-process selection */
pfMultiprocess(ProcSplit);
/* initiate multi-processing mode set in pfMultiprocess call */
pfConfig();
scene = pfNewScene();
/* specify directories where geometry and textures exist */
if (!(getenv("PFPATH")))
pfFilePath(".");
/* load files named by command line arguments */
for (found = 0; arg < argc; arg++)
{
if ((root = pfdLoadFile(argv[arg])) != NULL)
{
pfAddChild(scene, root);
found++;
}
}
/* if no files successfully loaded, terminate program */
if (!found) exit(0);
p = pfGetPipe(0);
pfPhase(PFPHASE_FREE_RUN);
/* Open and configure full screen GL window. */
pw = pfNewPWin(pfGetPipe(0));
pfPWinOriginSize(pw,0,0,1024,1024);
pfPWinName(pw,"IRIS Performer");
pfOpenPWin(pw);
pfStageConfigFunc( -1, PFPROC_DRAW, OpenPipeline );
pfConfigStage( -1, PFPROC_DRAW );
pfFrame();
pfFrameRate(30.0f);
Shared->chan = pfNewChan(p);
pfChanTravFunc(Shared->chan, PFTRAV_CULL, CullChannel );
pfChanTravFunc(Shared->chan, PFTRAV_DRAW, DrawChannel );
pfChanScene(Shared->chan, scene);
pfChanNearFar(Shared->chan, 0.1f, far);
pfChanFOV(Shared->chan, 136.0f, 92.5f);
pfChanViewport( Shared->chan, 0.0, 1.0, 0.000, 1.0 );
pfSetVec3(xyz, 0.0f, 0.0f, 0.0f);
pfSetVec3(hpr, 0.0f, 45.0f, 0.0f);
pfChanViewOffsets(Shared->chan, xyz, hpr);
/* Create an earth/sky model that draws sky/ground/horizon */
eSky = pfNewESky();
pfESkyMode(eSky, PFES_BUFFER_CLEAR, PFES_FAST);
pfChanESky(Shared->chan, eSky);
pfChanLODAttr( Shared->chan, PFLOD_SCALE, 0.125 );
/* main simulation loop */
while (!Shared->exitFlag)
{
/* wait until next frame boundary */
pfSync();
/* Set view parameters. */
UpdateView();
pfChanView(Shared->chan, Shared->view.xyz, Shared->view.hpr);
/* initiate traversal using current state */
pfFrame();
}
/* terminate cull and draw processes (if they exist) */
pfExit();
/* exit to operating system */
exit(0);
}
/*
* UpdateView() updates the eyepoint based on the information
* placed in shared memory by GetGLInput().
*/
static void
UpdateView(void)
{
static float speed = 0.0f;
pfCoord *view = &Shared->view;
/* update view direction */
view->hpr[PF_H] = 0.0;
view->hpr[PF_P] ++; /*= 0.0;*/
view->hpr[PF_R] = 0.0;
/* update view position */
view->xyz[PF_X] = 0.0;
view->xyz[PF_Y] = 0.0;
view->xyz[PF_Z] = 50.0;
/* view->xyz[PF_X] = 15023;
view->xyz[PF_Y] = -7199.4;
view->xyz[PF_Z] = -204.7 + 1000;
*/
}
/*
* OpenPipeline() -- create a pipeline: setup the window system,
* the IRIS GL, and IRIS Performer. this procedure is executed in
* the draw process (when there is a separate draw process).
*/
static void
OpenPipeline(int pipe, uint stage )
{
float xSize = 800;
float ySize = 500;
/* negotiate with GL */
/* gconfig(); */
/* create a light source in the "south-west" (QIII) */
Sun = pfNewLight(NULL);
pfLightPos(Sun, -0.3f, -0.3f, 1.0f, 0.0f);
/* create a default texture environment */
pfApplyTEnv(pfNewTEnv(NULL));
/* create a default lighting model */
pfApplyLModel(pfNewLModel(NULL));
pfApplyMtl(pfNewMtl(NULL));
/* enable culling of back-facing polygons */
pfCullFace(PFCF_BACK);
/*
* These enables should be set to reflect the majority of the
* database. If most geometry is not textured, then texture
* should be disabled. However, you then need to change the
* FLIGHT-format file reader. (pfflt.c)
*/
pfEnable(PFEN_TEXTURE);
pfDisable(PFEN_WIREFRAME);
pfDisable(PFEN_LIGHTING);
pfDisable(PFEN_FOG);
}
/*
* CullChannel() -- traverse the scene graph and generate a
* display list for the draw process. This procedure is
* executed in the cull process.
*/
static void
CullChannel(pfChannel *channel, void *data)
{
pfCull();
}
static void
DrawChannel (pfChannel *channel, void *data)
{
/* rebind light so it stays fixed in position */
pfLightOn(Sun);
/* erase framebuffer and draw Earth-Sky model */
pfClearChan(channel);
/* invoke Performer draw-processing for this frame */
pfDraw();
/* draw Performer throughput statistics */
if (Shared->drawStats)
pfDrawChanStats(channel);
drawDistort(channel);
}
#include "newuvarray.h"
/* float texprops[] = { TX_MAGFILTER, TX_BILINEAR,
TX_MINFILTER, TX_BILINEAR,
TX_WRAP, TX_REPEAT,
TX_INTERNAL_FORMAT, TX_RGB_5,
TX_FAST_DEFINE, TX_NULL}; */
static void
drawDistort(void)
{
static unsigned long map[1024 * 1024], flags;
static int first = 1;
int i, j;
float vert[2];
float tvert[2];
if(first)
{
glEnable (GL_TEXTURE_2D);
first = 0;
}
/* texdef2d(1024, 3, 1024, 1024, map, 10, texprops); */
glTexImage2D (
GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGB, GL_UNSIGNED_INT, map
);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glViewport( 0, 0, 1024, 1024);
/* texbind(TX_TEXTURE_0, 1024);
fbsubtexload(0, 0, TX_TEXTURE_0, 1024, 0.0, 1.0, 0.0, 1.0, flags); */
/* glCopyTexImage2DEXT (...); */ /* Don't know arguments yet */
gluOrtho2D(0.0, 16.0, 0.0, 16.0);
glLoadIdentity();
glDisable(GL_DEPTH_TEST); /* turn off z-buffer */
glDisable(GL_CULL_FACE); /* turn off culling */
glColor4f (1.0, 1.0, 1.0, 1.0);
for( i = 0; i < 16; i++) /* sixteen tmesh strips */
{
float yup, ydown;
int tindexup, tindexdown;
ydown = (float) (i);
yup = (float) (i + 1);
tindexdown = i * 17;
tindexup = (i + 1) * 17;
glBegin(GL_TRIANGLE_STRIP);
tvert[0] = uvarray[tindexdown][0];
tvert[1] = uvarray[tindexdown][1];
glTexCoord2fv (tvert);
vert[0] = 0.0;
vert[1] = ydown;
glVertex2fv (vert);
tvert[0] = uvarray[tindexup][0];
tvert[1] = uvarray[tindexup][1];
glTexCoord2fv (tvert);
vert[1] = yup;
glVertex2fv (vert);
for (j = 1; j < 17; j ++) {
tvert[0] = uvarray[tindexdown + j][0];
tvert[1] = uvarray[tindexdown + j][1];
glTexCoord2fv (tvert);
vert[0] = (float) (j);
vert[1] = ydown;
glVertex2fv (vert);
tvert[0] = uvarray[tindexup + j][0];
tvert[1] = uvarray[tindexup + j][1];
glTexCoord2fv (tvert);
vert[1] = yup;
glVertex2fv (vert);
}
glEnd();
}
glEnable (GL_DEPTH_TEST); /* turn the z-buffer back on */
}
----- Makefile for hemiGL.c -----
OPT = -g
LFLAGS = \
-lpfdu_ogl \
-lpfutil_ogl \
-lpf_ogl \
-lmpc -limage -lGL -lX11 -lm -lfpe -lC
CFLAGS = -c \
-I/home/camus2/Performer/include/Performer/pfdb \
-I/home/camus2/Performer/include/Performer
OBJS = hemiGL.o
ALL = hemiGL
$(ALL): $(OBJS)
$(CC) $(OPT) $(OBJS) -o $(ALL) $(LFLAGS)
++at++echo "DONE"
.c.o:
$(CC) $(OPT) $(CFLAGS) $<
----- newuvarray.h (for both versions) -----
float uvarray[289][2] = {
0.067185, 0.080706,
0.174310, 0.155577,
0.250074, 0.203457,
0.308217, 0.235680,
0.355695, 0.257851,
0.396468, 0.273009,
0.433026, 0.282886,
0.467093, 0.288472,
0.500000, 0.290281,
0.532907, 0.288472,
0.566974, 0.282886,
0.603532, 0.273009,
0.644305, 0.257851,
0.691783, 0.235680,
0.749926, 0.203457,
0.825690, 0.155577,
0.932815, 0.080706,
0.067185, 0.150102,
0.174310, 0.212581,
0.250074, 0.252537,
0.308217, 0.279427,
0.355695, 0.297929,
0.396468, 0.310577,
0.433026, 0.318820,
0.467093, 0.323481,
0.500000, 0.324991,
0.532907, 0.323481,
0.566974, 0.318820,
0.603532, 0.310577,
0.644305, 0.297929,
0.691783, 0.279427,
0.749926, 0.252537,
0.825690, 0.212581,
0.932815, 0.150102,
0.067185, 0.211489,
0.174310, 0.263007,
0.250074, 0.295953,
0.308217, 0.318125,
0.355695, 0.333381,
0.396468, 0.343811,
0.433026, 0.350607,
0.467093, 0.354451,
0.500000, 0.355695,
0.532907, 0.354451,
0.566974, 0.350607,
0.603532, 0.343811,
0.644305, 0.333381,
0.691783, 0.318125,
0.749926, 0.295953,
0.825690, 0.263007,
0.932815, 0.211489,
0.067185, 0.266976,
0.174310, 0.308586,
0.250074, 0.335195,
0.308217, 0.353104,
0.355695, 0.365425,
0.396468, 0.373849,
0.433026, 0.379338,
0.467093, 0.382443,
0.500000, 0.383448,
0.532907, 0.382443,
0.566974, 0.379338,
0.603532, 0.373849,
0.644305, 0.365425,
0.691783, 0.353104,
0.749926, 0.335195,
0.825690, 0.308586,
0.932815, 0.266976,
0.067185, 0.318114,
0.174310, 0.350593,
0.250074, 0.371363,
0.308217, 0.385341,
0.355695, 0.394958,
0.396468, 0.401534,
0.433026, 0.405818,
0.467093, 0.408241,
0.500000, 0.409026,
0.532907, 0.408241,
0.566974, 0.405818,
0.603532, 0.401534,
0.644305, 0.394958,
0.691783, 0.385341,
0.749926, 0.371363,
0.825690, 0.350593,
0.932815, 0.318114,
0.067185, 0.366098,
0.174310, 0.390008,
0.250074, 0.405298,
0.308217, 0.415589,
0.355695, 0.422669,
0.396468, 0.427510,
0.433026, 0.430664,
0.467093, 0.432448,
0.500000, 0.433026,
0.532907, 0.432448,
0.566974, 0.430664,
0.603532, 0.427510,
0.644305, 0.422669,
0.691783, 0.415589,
0.749926, 0.405298,
0.825690, 0.390008,
0.932815, 0.366098,
0.067185, 0.411884,
0.174310, 0.427618,
0.250074, 0.437680,
0.308217, 0.444452,
0.355695, 0.449111,
0.396468, 0.452297,
0.433026, 0.454373,
0.467093, 0.455547,
0.500000, 0.455927,
0.532907, 0.455547,
0.566974, 0.454373,
0.603532, 0.452297,
0.644305, 0.449111,
0.691783, 0.444452,
0.749926, 0.437680,
0.825690, 0.427618,
0.932815, 0.411884,
0.067185, 0.456279,
0.174310, 0.464086,
0.250074, 0.469079,
0.308217, 0.472439,
0.355695, 0.474750,
0.396468, 0.476331,
0.433026, 0.477361,
0.467093, 0.477943,
0.500000, 0.478132,
0.532907, 0.477943,
0.566974, 0.477361,
0.603532, 0.476331,
0.644305, 0.474750,
0.691783, 0.472439,
0.749926, 0.469079,
0.825690, 0.464086,
0.932815, 0.456279,
0.067185, 0.500000,
0.174310, 0.500000,
0.250074, 0.500000,
0.308217, 0.500000,
0.355695, 0.500000,
0.396468, 0.500000,
0.433026, 0.500000,
0.467093, 0.500000,
0.500000, 0.500000,
0.532907, 0.500000,
0.566974, 0.500000,
0.603532, 0.500000,
0.644305, 0.500000,
0.691783, 0.500000,
0.749926, 0.500000,
0.825690, 0.500000,
0.932815, 0.500000,
0.067185, 0.543721,
0.174310, 0.535914,
0.250074, 0.530921,
0.308217, 0.527561,
0.355695, 0.525250,
0.396468, 0.523669,
0.433026, 0.522639,
0.467093, 0.522057,
0.500000, 0.521868,
0.532907, 0.522057,
0.566974, 0.522639,
0.603532, 0.523669,
0.644305, 0.525250,
0.691783, 0.527561,
0.749926, 0.530921,
0.825690, 0.535914,
0.932815, 0.543721,
0.067185, 0.588116,
0.174310, 0.572382,
0.250074, 0.562320,
0.308217, 0.555548,
0.355695, 0.550889,
0.396468, 0.547703,
0.433026, 0.545627,
0.467093, 0.544453,
0.500000, 0.544073,
0.532907, 0.544453,
0.566974, 0.545627,
0.603532, 0.547703,
0.644305, 0.550889,
0.691783, 0.555548,
0.749926, 0.562320,
0.825690, 0.572382,
0.932815, 0.588116,
0.067185, 0.633902,
0.174310, 0.609992,
0.250074, 0.594702,
0.308217, 0.584411,
0.355695, 0.577331,
0.396468, 0.572490,
0.433026, 0.569336,
0.467093, 0.567552,
0.500000, 0.566974,
0.532907, 0.567552,
0.566974, 0.569336,
0.603532, 0.572490,
0.644305, 0.577331,
0.691783, 0.584411,
0.749926, 0.594702,
0.825690, 0.609992,
0.932815, 0.633902,
0.067185, 0.681886,
0.174310, 0.649407,
0.250074, 0.628637,
0.308217, 0.614659,
0.355695, 0.605042,
0.396468, 0.598466,
0.433026, 0.594182,
0.467093, 0.591759,
0.500000, 0.590974,
0.532907, 0.591759,
0.566974, 0.594182,
0.603532, 0.598466,
0.644305, 0.605042,
0.691783, 0.614659,
0.749926, 0.628637,
0.825690, 0.649407,
0.932815, 0.681886,
0.067185, 0.733024,
0.174310, 0.691414,
0.250074, 0.664805,
0.308217, 0.646896,
0.355695, 0.634575,
0.396468, 0.626151,
0.433026, 0.620662,
0.467093, 0.617557,
0.500000, 0.616552,
0.532907, 0.617557,
0.566974, 0.620662,
0.603532, 0.626151,
0.644305, 0.634575,
0.691783, 0.646896,
0.749926, 0.664805,
0.825690, 0.691414,
0.932815, 0.733024,
0.067185, 0.788511,
0.174310, 0.736993,
0.250074, 0.704047,
0.308217, 0.681875,
0.355695, 0.666619,
0.396468, 0.656189,
0.433026, 0.649393,
0.467093, 0.645549,
0.500000, 0.644305,
0.532907, 0.645549,
0.566974, 0.649393,
0.603532, 0.656189,
0.644305, 0.666619,
0.691783, 0.681875,
0.749926, 0.704047,
0.825690, 0.736993,
0.932815, 0.788511,
0.067185, 0.849898,
0.174310, 0.787419,
0.250074, 0.747463,
0.308217, 0.720573,
0.355695, 0.702071,
0.396468, 0.689423,
0.433026, 0.681180,
0.467093, 0.676519,
0.500000, 0.675009,
0.532907, 0.676519,
0.566974, 0.681180,
0.603532, 0.689423,
0.644305, 0.702071,
0.691783, 0.720573,
0.749926, 0.747463,
0.825690, 0.787419,
0.932815, 0.849898,
0.067185, 0.919294,
0.174310, 0.844423,
0.250074, 0.796543,
0.308217, 0.764320,
0.355695, 0.742149,
0.396468, 0.726991,
0.433026, 0.717114,
0.467093, 0.711528,
0.500000, 0.709719,
0.532907, 0.711528,
0.566974, 0.717114,
0.603532, 0.726991,
0.644305, 0.742149,
0.691783, 0.764320,
0.749926, 0.796543,
0.825690, 0.844423,
0.932815, 0.919294
};
"
-- RegardsParviz Parandeh SE , Montreal Canada parviz++at++stlaurent.sgi.com Voice mail: 58479 Tel: 514-745-2440 Fax: 514-745-2660
This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:52:41 PDT