12-bit imagery into performer

New Message Reply Date view Thread view Subject view Author view

From: Oller, Daniel (DANIEL.OLLER++at++ca.com)
Date: 12/15/2000 13:12:44


Hi All,

I work in Technical Support for Multigen Paradigm, and I've been speaking with a customer who is having trouble getting his 12-bit images into performer. We wrote a small performer app to test performers ability to work with 12-bit images, and we cannot get the images to load properly. I am curious if anyone else out there is working with, or has worked with in the past, 12-bit imagery? Have you been able to load the imagery into performer, was there anything special you had to do to get the images to load? We have tried loading the imagery with multiple attr files, with different Internal/External format parameters (PFTEX_INTERNAL_FORMAT and PFTEX_EXTERNAL_FORMAT).

If anyone wants to know, here is the source we used to test:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include <Performer/pf.h>

pfVec2 texcoords[]={ {0.0f, 0.0f},
                                {1.0f, 0.0f},
                                {1.0f, 1.0f},
                                {0.0f, 1.0f} };

ushort texlist[] = { 0, 1, 2, 3 };

pfVec3 coords[] ={ {-1.0f, 0.0f, -1.0f },
                                { 1.0f, 0.0f, -1.0f },
                                { 1.0f, 0.0f, 1.0f },
                                {-1.0f, 0.0f, 1.0f } };

ushort vertexlist[] = { 0, 1, 2, 3 };

pfVec4 colors[] ={ {1.0f, 1.0f, 1.0f, 1.0f},
                                {1.0f, 1.0f, 1.0f, 1.0f},
                                {1.0f, 1.0f, 1.0f, 1.0f},
                                {1.0f, 1.0f, 1.0f, 1.0f} };

ushort colorlist[] = { 0, 1, 2, 3 };

/*
 * Usage() -- print usage advice and exit. This
 * procedure is executed in the application process.
 */
static void
Usage (void)
{
    fprintf(stderr, "Usage: texture texfile ...\n");
    exit(1);
}

int
main (int argc, char *argv[])
{
    float t = 0.0f;
    pfScene *scene;
    pfPipe *p;
    pfPipeWindow *pw;
    pfChannel *chan;
    pfSphere bsphere;
    pfGroup *root;
    pfGeoSet *gset;
    pfGeode *geode1;
    pfGeoState *gstate;
    pfTexture *tex;
    pfTexEnv *tev;
    pfDCS *dcs1;
    pfMatrix *mat;
    int texnum, numTextures = 0, rev = 0;
    void *arena;

   if (argc<2) Usage();

    /* Initialize Performer */
    pfInit();

    /* Use default multiprocessing mode based on number of
     * processors.
     */
    pfMultiprocess(0);

    /* Configure multiprocessing mode and start parallel
     * processes.
     */
    pfConfig();

    /* Append to PFPATH files in /usr/share/Performer/data */
    pfFilePath(".:/usr/share/Performer/data:/usr/demos/data/textures/");

    /* Configure and open GL window */
    p = pfGetPipe(0);
    pw = pfNewPWin(p);
    pfPWinName(pw, "TextureTest");
    pfPWinType(pw, PFPWIN_TYPE_X);
    pfPWinOriginSize(pw, 0, 0, 300, 300);
    /* Open and configure the GL window. */
    pfOpenPWin(pw);
    pfFrame();

    /* Set up textures & gstates structures */
    arena = pfGetSharedArena();
    tex = pfNewTex (arena);
    mat = (pfMatrix *) pfMalloc(sizeof(pfMatrix), arena);
    pfMakeScaleMat(*mat,4,4,4);
    /*pfTexFilter(tex, PFTEX_MINFILTER, PFTEX_BILINEAR);*/

    gstate = pfNewGState (arena);
    if (pfLoadTexFile (tex, argv[1]))
    {
        uint *i;
        int nc, sx, sy, sz;
        pfGetTexImage(tex, &i, &nc, &sx, &sy, &sz);
        /* if have alpha channel, enable transparency */
        if (nc != 3)
            pfGStateMode (gstate, PFSTATE_TRANSPARENCY, PFTR_HIGH_QUALITY);
        /* set alpha function to block pixels of 0 alpha for
           transparent textures */

        pfTexFormat( tex, PFTEX_INTERNAL_FORMAT, PFTEX_I_12A_4 );
        /*pfTexFormat( tex, PFTEX_EXTERNAL_FORMAT, PFTEX_PACK_16 );*/

        pfGStateMode (gstate, PFSTATE_ALPHAFUNC, PFAF_NOTEQUAL);
        pfGStateVal (gstate, PFSTATE_ALPHAREF, 0.0f);
        pfGStateAttr (gstate, PFSTATE_TEXTURE, tex);
        /*pfGStateAttr (gstate, PFSTATE_TEXMAT, mat);*/
        pfGStateMode (gstate, PFSTATE_ENTEXTURE, 1);
        pfGStateMode (gstate, PFSTATE_ENTEXMAT, 1);
        pfGStateMode (gstate, PFSTATE_ENLIGHTING, 0);
        pfGStateMode (gstate, PFSTATE_CULLFACE, PFCF_OFF);
        tev = pfNewTEnv (arena);

        pfTEnvMode(tev, PFTE_MODULATE);
        pfTEnvBlendColor(tev, 0.0f, 0.0f, 0.0f, 1.0f);

        pfGStateAttr (gstate, PFSTATE_TEXENV, tev);
        
        numTextures++;
    }

    /* Set up geosets */
    gset = pfNewGSet(arena);
    pfGSetAttr(gset, PFGS_COORD3, PFGS_PER_VERTEX, coords, vertexlist);
    pfGSetAttr(gset, PFGS_TEXCOORD2, PFGS_PER_VERTEX, texcoords, texlist);
    pfGSetAttr(gset, PFGS_COLOR4, PFGS_PER_VERTEX, colors, colorlist);
    pfGSetPrimType(gset, PFGS_QUADS);
    pfGSetNumPrims(gset, 1);
    pfGSetGState (gset, gstate);
    /* set up scene graph */
    geode1 = pfNewGeode();
    pfAddGSet(geode1, gset);

    dcs1 = pfNewDCS();
    
    pfAddChild(dcs1, geode1);
    root = pfNewGroup();
    pfAddChild(root, dcs1); /* first child is base */

    scene = pfNewScene();
    pfAddChild(scene, root);

    /* determine extent of scene's geometry */
    pfGetNodeBSphere (scene, &bsphere);

    /* Create and configure a pfChannel. */
    chan = pfNewChan(p);
    pfChanScene(chan, scene);
    pfChanNearFar(chan, 1.0f, 10.0f * bsphere.radius);
    /* 45 degrees wide, vertical=-1 to signal match window aspect */
    pfChanFOV(chan, 45.0f, -1.0f);

    /* Create an earth/sky model that draws sky/ground/horizon */
    {
        pfEarthSky *esky = pfNewESky();
#if 0
        pfESkyMode(esky, PFES_BUFFER_CLEAR, PFES_SKY_GRND );
        pfESkyAttr(esky, PFES_GRND_HT, -1.0f * bsphere.radius);
        pfESkyColor(esky, PFES_GRND_FAR, 0.3f, 0.1f, 0.0f, 1.0f);
        pfESkyColor(esky, PFES_GRND_NEAR, 0.5f, 0.3f, 0.1f, 1.0f);
#endif
        pfESkyMode(esky, PFES_BUFFER_CLEAR, PFES_FAST);
        pfESkyColor(esky, PFES_CLEAR, .3f, .3f, .7f, 0.5f);
            pfChanESky(chan, esky);
    }
    
    /* Simulate forever seconds. */
   while (1)
   {
        float s, c, r=0;
        pfCoord view;

        /* Go to sleep until next frame time. */
        pfSync();

        /* Initiate cull/draw for this frame. */
        pfFrame();

        t = pfGetTime();
        /* roll polygons around y axis */
        r += 5.0f;
        if (r >= 360.0f){
            r = 0.0f;
            rev++;
        }
        pfDCSRot (dcs1, 0.0f, 0.0f, r);
        
        
        /* Compute new view position for next frame. */
        pfSinCos(45.0f*t, &s, &c);
        pfSetVec3(view.hpr, 45.0f*t, -15.0f, 0);
        pfSetVec3(view.xyz, 2.0f * bsphere.radius * s,
                -2.0f * bsphere.radius *c,
                 0.5f * bsphere.radius);
        /* set view position for next frame */
        pfChanView(chan, view.xyz, view.hpr);
    }

    /* Terminate parallel processes and exit. */
    pfExit();

    return 0;
}

I would greatly appreciate any feedback anyone can provide.

Thanks in advance,

Dan Oller
API Technical Support
MultiGen - Paradigm Inc.
408.367.2600


New Message Reply Date view Thread view Subject view Author view

This archive was generated by hypermail 2b29 : Fri Dec 15 2000 - 13:10:39 PST

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