Eric Heft (eheft++at++dnaco.net)
Wed, 6 Nov 1996 16:19:29 -0500 (EST)
I was wondering if there is anything in the first function
initLPoints, that would have to be emulated while running under a
small pixel depth.
Thanks,
Eric
#include <stdlib.h>
#include <Performer/pf.h>
#include <Performer/pfdu.h>
#include <Performer/pr.h>
#define TRACE() { fprintf(stderr,"Line #%d\n",__LINE__); fflush(stderr); }
/* This section ripped from lpstate.c */
pfVec3 *norms, *coords;
static pfGeode*
initLPoints(int NPOINTS)
{
pfLPointState *lps;
pfTexGen *tgen;
pfTexture *tex;
pfGeoState *gst;
pfGeode *gd;
pfGeoSet *gs;
pfVec4 *colors;
float phi, dphi, theta, dtheta;
int i, j, k;
void *arena = pfGetSharedArena();
lps = pfNewLPState(arena);
pfLPStateMode(lps, PFLPS_SIZE_MODE, PF_ON);
pfLPStateVal(lps, PFLPS_SIZE_MIN_PIXEL, 0.25f);
pfLPStateVal(lps, PFLPS_SIZE_MAX_PIXEL, 1.0f);
pfLPStateVal(lps, PFLPS_SIZE_ACTUAL, .45f);
pfLPStateVal(lps, PFLPS_TRANSP_PIXEL_SIZE, 1.0f);
pfLPStateVal(lps, PFLPS_TRANSP_EXPONENT, 1.0f);
pfLPStateVal(lps, PFLPS_TRANSP_SCALE, .6f);
pfLPStateVal(lps, PFLPS_TRANSP_CLAMP, .1f);
pfLPStateVal(lps, PFLPS_FOG_SCALE, .25f);
pfLPStateMode(lps, PFLPS_RANGE_MODE, PFLPS_RANGE_MODE_TRUE);
pfLPStateMode(lps, PFLPS_SHAPE_MODE, PFLPS_SHAPE_MODE_UNI);
pfLPStateBackColor(lps, 1.f, 0.0f, 1.f, 1.0f);
pfLPStateShape(lps, 60.0f, 90.0f, 0.0f, 1, .9f);
gst = pfNewGState(arena);
pfGStateMode(gst, PFSTATE_TRANSPARENCY,
PFTR_BLEND_ALPHA | PFTR_NO_OCCLUDE);
pfGStateVal(gst, PFSTATE_ALPHAREF, 0.0f);
pfGStateMode(gst, PFSTATE_ALPHAFUNC, PFAF_GREATER);
pfGStateMode(gst, PFSTATE_ANTIALIAS, PFAA_OFF);
pfGStateMode(gst, PFSTATE_ENFOG, 0);
pfGStateMode(gst, PFSTATE_ENLIGHTING, 0);
pfGStateMode(gst, PFSTATE_ENTEXTURE, 0);
pfGStateMode(gst, PFSTATE_ENLPOINTSTATE, 1);
pfGStateAttr(gst, PFSTATE_LPOINTSTATE, lps);
tgen = pfNewTGen(arena);
tex = pfNewTex(arena);
pfLPStateMode(lps, PFLPS_DIR_MODE, PFLPS_DIR_MODE_ALPHA);
pfLPStateMode(lps, PFLPS_TRANSP_MODE, PFLPS_TRANSP_MODE_TEX);
pfLPStateMode(lps, PFLPS_FOG_MODE, PFLPS_FOG_MODE_TEX);
pfuMakeLPStateRangeTex(lps, tex, 256, pfNewFog(NULL));
pfGStateAttr(gst, PFSTATE_TEXTURE, tex);
pfTGenPlane(tgen, PF_S, 0.0f, 0.0f, 1.0f, 0.0f);
pfTGenPlane(tgen, PF_T, 0.0f, 0.0f, 1.0f, 0.0f);
pfTGenMode(tgen, PF_S, PFTG_EYE_LINEAR_IDENT);
pfTGenMode(tgen, PF_T, PFTG_EYE_LINEAR_IDENT);
pfGStateAttr(gst, PFSTATE_TEXGEN, tgen);
pfGStateMode(gst, PFSTATE_ENTEXGEN, 0);
gd = pfNewGeode();
gs = pfNewGSet(arena);
pfGSetPrimType(gs, PFGS_POINTS);
pfGSetNumPrims(gs, NPOINTS);
colors = pfMalloc(sizeof(pfVec4) * NPOINTS, arena);
coords = pfMalloc(sizeof(pfVec3) * NPOINTS, arena);
norms = pfMalloc(sizeof(pfVec3) * NPOINTS, arena);
pfGSetAttr(gs, PFGS_NORMAL3, PFGS_PER_VERTEX, norms, NULL);
pfGSetAttr(gs, PFGS_COLOR4, PFGS_PER_VERTEX, colors, NULL);
pfGSetAttr(gs, PFGS_COORD3, PFGS_PER_VERTEX, coords, NULL);
pfGSetGState(gs, gst);
pfAddGSet(gd, gs);
for (i=0; i<NPOINTS; i++)
{
pfSetVec3(norms[i],0,-1,0);
pfSetVec3(coords[i],rand()%100-50,rand()%1000,rand()%100-50);
pfSetVec4(colors[i],1,1,1,1);
}
return gd;
}
/* This section is from multichannel.c */
int
main (int argc, char *argv[])
{
float t = 0.0f;
pfScene *scene;
pfPipe *p;
pfPipeWindow *pw;
pfChannel *left,*center,*right;
char str[PF_MAXSTRING];
int i;
pfCoord view;
long share;
int SPEED,NPOINTS,DEBUG,MODE,REFRESH,loop;
argc--; argv++;
NPOINTS = 0;
SPEED = 0;
DEBUG = 0;
MODE = 0;
REFRESH = 0;
while (argc)
{
if (argv[0][0] == '-')
switch (argv[0][1])
{
case 'n':
NPOINTS = atoi(argv[0]+2);
break;
case 's':
SPEED = atoi(argv[0]+2);
break;
case 'd':
DEBUG = 1;
break;
case 'm':
MODE = atoi(argv[0]+2);
break;
case 'r':
REFRESH = atoi(argv[0]+2);
break;
}
else
printf(" Unknown argument %s ",argv[0]);
argc--;
argv++;
}
if (!SPEED) SPEED = 5;
if (!NPOINTS) NPOINTS = 100;
if (!REFRESH)
REFRESH = 30;
printf("Loading using :\n");
printf(" -n%d -s%d -m%d -r%d\n",NPOINTS,SPEED,MODE,REFRESH);
printf("\n");
pfInit();
switch (MODE)
{
case 0:
pfMultiprocess(PFMP_DEFAULT);
break;
case 1:
pfMultiprocess(PFMP_APPCULLDRAW);
break;
case 2:
pfMultiprocess(PFMP_APPCULL_DRAW);
break;
case 3:
pfMultiprocess(PFMP_APP_CULLDRAW);
break;
case 4:
pfMultiprocess(PFMP_APPCULLoDRAW);
break;
default:
pfMultiprocess(PFMP_DEFAULT);
break;
}
pfConfig();
pfFrameRate(REFRESH);
pfFieldRate(REFRESH);
pfPhase(PFPHASE_LOCK);
scene = pfNewScene();
pfAddChild(scene, pfNewLSource());
pfAddChild(scene, initLPoints(NPOINTS));
/* Configure and open GL window */
p = pfGetPipe(0);
pw = pfNewPWin(p);
sprintf(str, "IRIS Performer");
pfPWinName(pw, str);
pfPWinOriginSize(pw, 0, 0, 960, 680*3);
pfConfigPWin(pw);
left = pfNewChan(p);
center = pfNewChan(p);
right = pfNewChan(p);
pfAttachChan(center,left);
pfAttachChan(center,right);
share = PFCHAN_SCENE | PFCHAN_EARTHSKY | PFCHAN_STRESS;
share |= PFCHAN_LOD | PFCHAN_APPFUNC;
share |= PFCHAN_CULLFUNC | PFCHAN_DRAWFUNC ;
pfChanShare(left, share);
pfChanShare(center, share);
pfChanShare(right, share);
pfChanScene(center, scene);
pfChanNearFar(center, 1.0f, 1001.0f);
pfChanFOV(left, 45.0f, 0.0f);
pfChanFOV(center, 45.0f, 0.0f);
pfChanFOV(right, 45.0f, 0.0f);
pfChanViewport (left , 0.0, 1.0, 0/3.0, 1/3.0);
pfChanViewport (center, 0.0, 1.0, 1/3.0, 2/3.0);
pfChanViewport (right , 0.0, 1.0, 2/3.0, 3/3.0);
/*
pfChanViewport (left , 0/3.0, 1/3.0, 0, 1.0);
pfChanViewport (center, 1/3.0, 2/3.0, 0, 1.0);
pfChanViewport (right , 2/3.0, 3/3.0, 0, 1.0);
*/
pfSetVec3(view.xyz, 1 , 0 , 0 );
pfSetVec3(view.hpr, -45 , 0, 0);
pfChanView(left,view.xyz,view.hpr);
pfSetVec3(view.hpr, 0 , 0, 0);
pfChanView(center,view.xyz,view.hpr);
pfSetVec3(view.hpr, +45 , 0, 0);
pfChanView(right,view.xyz,view.hpr);
/* Simulate for twenty seconds. */
while (t < 60.0f)
{
float s, c;
pfCoord view;
/* Go to sleep until next frame time. */
pfSync();
/* Compute new view position. */
t = pfGetTime();
i=NPOINTS;
while (i)
{
i--;
if (coords[i][1] < 0)
{
pfSetVec3(coords[i],rand()%200-100,1000,rand()%200-100);
}
else
coords[i][1] -= SPEED;
}
if (DEBUG)
{
pfDrawChanStats(left);
pfDrawChanStats(center);
pfDrawChanStats(right);
}
/* Initiate cull/draw for this frame. */
pfFrame();
}
/* Terminate parallel processes and exit. */
pfExit();
return 0;
}
Here's the Hardware: (onyx)
2 R4400 CPU's.
2 RM's
1 gfx pipe
1 MCO board.
Here's gfxinfo:
Managed (":0.0") 960x2040
MCO Display 0 960x680 ++at++ 60Hz, origin (0, 0)
MCO Display 1 960x680 ++at++ 60Hz, origin (0, 680)
MCO Display 2 960x680 ++at++ 60Hz, origin (0, 1360)
12 GE (GE10 rev. 0x7)
2 RM4 boards
Small pixel depth
10-bit RGB pixels
Driving Multi-Channel Option
=======================================================================
List Archives, FAQ, FTP: http://www.sgi.com/Technology/Performer/
Submissions: info-performer++at++sgi.com
Admin. requests: info-performer-request++at++sgi.com
This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:53:54 PDT