Performance and small pixels.

New Message Reply Date view Thread view Subject view Author view

Eric Heft (eheft++at++dnaco.net)
Wed, 6 Nov 1996 16:19:29 -0500 (EST)


Hi all,

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


New Message Reply Date view Thread view Subject view Author view

This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:53:54 PDT

This message has been cleansed for anti-spam protection. Replace '++at++' in any mail addresses with the '@' symbol.