Performer with Overlays

New Message Reply Date view Thread view Subject view Author view

Bill Moore (bmoore++at++world.northgrum.com)
Wed, 22 Dec 1999 11:42:10 -0700


I've been having trouble integrating an OpenGL display with my performer
app. Everything works, except the overlay planes. I've been trying to
get a modified version of simple.c to work, but have had no luck. I've
attached a modified copy of simple.c (overlay.c) where I try and draw a
rectangle and text in the overlay plane. If someone could look at it at
let me know what I'm doing wrong, I would appreciate it.

Thanks
Bill

/*
 * Copyright 1995, Silicon Graphics, Inc.
 * ALL RIGHTS RESERVED
 *
 * UNPUBLISHED -- Rights reserved under the copyright laws of the United
 * States. Use of a copyright notice is precautionary only and does not
 * imply publication or disclosure.
 *
 * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
 * Use, duplication or disclosure by the Government is subject to restrictions
 * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
 * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
 * in similar or successor clauses in the FAR, or the DOD or NASA FAR
 * Supplement. Contractor/manufacturer is Silicon Graphics, Inc.,
 * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
 *
 * Permission to use, copy, modify, distribute, and sell this software
 * and its documentation for any purpose is hereby granted without
 * fee, provided that (i) the above copyright notices and this
 * permission notice appear in all copies of the software and related
 * documentation, and (ii) the name of Silicon Graphics may not be
 * used in any advertising or publicity relating to the software
 * without the specific, prior written permission of Silicon Graphics.
 *
 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
 *
 * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR ANY SPECIAL,
 * INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY
 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY
 * THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OR PERFORMANCE OF THIS SOFTWARE.
 *
 * simple.c: simple Performer program for programmer's guide
 *
 * $Revision: 1.47 $ $Date: 1995/11/22 14:36:13 $
 *
 */
#include <GL/gl.h>
   
  
#include <stdlib.h>
#include <Performer/pf.h>
#include <Performer/pfutil.h>
#include <Performer/pfdu.h>

/*
 * Usage() -- print usage advice and exit. This
 * procedure is executed in the application process.
 */
static void
Usage (void)
{
    pfNotify(PFNFY_FATAL, PFNFY_USAGE, "Usage: simple file.ext ...\n");
    exit(1);
}

static void DrawFunc(pfChannel *chan, void *data);
static void OpenPipeWin(pfPipeWindow *pw);
static void DrawOverlay(void );

int
main (int argc, char *argv[])
{
    float t = 0.0f;
    pfScene *scene;
    pfNode *root;
    pfPipe *p;
    pfPipeWindow *pw;
    pfChannel *chan;
    pfSphere bsphere;
    int i=0;
     
    if (argc < 2)
        Usage();

    /* Initialize Performer */
    pfInit();

    /* Use multiprocessing mode - APP_CULL_DRAW */
     pfMultiprocess( PFMP_APP_CULL_DRAW);
                             

    /* Load all loader DSO's before pfConfig() forks */
    pfdInitConverter(argv[1]);

    /* initiate multi-processing mode set in pfMultiprocess call
     * FORKs for Performer processes, CULL and DRAW, etc. happen here.
     */
    pfuInit();
    pfConfig();

    /* Append to Performer search path, PFPATH, files in
     * /usr/share/Performer/data */
    pfFilePath(".:/usr/share/Performer/data");

    /* Read a single file, of any known type. */
    if ((root = pfdLoadFile(argv[1])) == NULL)
    {
        pfExit();
        exit(-1);
    }

    /* Attach loaded file to a new pfScene. */
    scene = pfNewScene();
    pfAddChild(scene, root);
    /* Create a pfLightSource and attach it to scene. */
    pfAddChild(scene, pfNewLSource());
     
    /* Configure and open GL window */
    p = pfGetPipe(0);
    pw = pfNewPWin(p);
    pfPWinType(pw, PFPWIN_TYPE_X);
    pfPWinMode(pw, PFWIN_HAS_OVERLAY, PF_ON);
    pfPWinName(pw, "IRIS Performer");
    pfPWinOriginSize(pw, 0, 0, 500, 500);
  

    /* set up WinConfig callback */
    pfPWinConfigFunc(pw, OpenPipeWin);
    pfConfigPWin(pw);
  
  
     
    /* Create and configure a pfChannel. */
    chan = pfNewChan(p);
    pfChanScene(chan, scene);
    pfChanFOV(chan, 45.0f, 0.0f);
  
    /* Set up Draw Callback */
    pfChanTravFunc(chan, PFTRAV_DRAW, DrawFunc);

    /* determine extent of scene's geometry */
    pfGetNodeBSphere (root, &bsphere);
    pfChanNearFar(chan, 1.0f, 10.0f * bsphere.radius);

    /* Simulate for twenty seconds. */
    while (t < 50.0f)
    {
        pfCoord view;
        float s, c;

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

        /* Initiate cull/draw for this frame. */
        pfFrame();
         
         
        /* Compute new view position. */
        t = pfGetTime();
        pfSinCos(45.0f*t, &s, &c);
        pfSetVec3(view.hpr, 45.0f*t, -10.0f, 0);
        pfSetVec3(view.xyz, 2.0f * bsphere.radius * s,
                -2.0f * bsphere.radius *c,
                 0.5f * bsphere.radius);
        pfChanView(chan, view.xyz, view.hpr);
    }

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

/*
 * OpenPipeWin() -- create a win: setup the GL and IRIS Performer.
 * This procedure is executed in the DRAW process
 * (when there is a separate draw process).
 */
  
static void
OpenPipeWin(pfPipeWindow *pw)
{
    pfPipe *p;
    Window w;
    Display *dsp;
    int xs, ys;
    pfWindow *over;
    static char str[] = "OVERLAY !!!";
    static first = 1;

    /* define color table colors */
    static pfVec3 clrs[20] = {
        {0.0f , 0.0f , 0.0f},
        {0.0f , 0.0f , 1.0f},
        {0.719f, 0.477f, 0.412f},
        {0.359f, 0.160f, 0.0f},
        {0.466f, 0.466f, 0.466f},
        {0.0f , 1.0f , 1.0f},
        {0.0f , 1.0f , 0.0f},
        {0.266f, 0.266f, 0.266f},
        {0.199f, 0.199f, 1.0f},
        {0.199f, 0.531f, 0.531f},
        {0.0f , 0.066f, 0.0f},
        {0.066f, 0.066f, 0.066f},
        {1.0f , 0.0f , 1.0f},
        {0.789f, 0.270f, 0.0f},
        {1.0f , 0.422f, 0.973f},
        {1.0f , 0.0f , 0.0f},
        {0.25f , 0.875f, 0.813f},
        {1.0f , 1.0f , 1.0f},
        {1.0f , 1.0f , 0.0f},
        {0.0f , 0.0f , 0.0f}};

    pfNotify(PFNFY_NOTICE,PFNFY_PRINT,"In OpenPipeWin 0x%p ", pw );
     
    /* configure overlay window */
    over = pfNewWin(NULL);
    pfWinName(over, "Iris Performer Overlay");
    pfWinType(over, PFWIN_TYPE_X | PFWIN_TYPE_OVERLAY);
    pfPWinOverlayWin(pw, over);
    
    pfOpenPWin(pw);
     
     
    pfPrint(pw, 1, PFPRINT_VB_ON, 0);
    pfuPrintPWinFBConfig(pw, 0);
    pfPrint(over, 1, PFPRINT_VB_ON, 0);

     
    /* load color table
    /* pfSelectWin(over); */ /* this works too... */
    pfPWinIndex(pw, PFWIN_OVERLAY_WIN);
    pfSelectPWin(pw);
    pfuMapWinColors(over, clrs, 1, 20);

     
    pfPWinIndex(pw, PFWIN_GFX_WIN);
    pfSelectPWin(pw);

  
}

static int count = 0;
/* Channel draw process drawing function */
static void DrawFunc(pfChannel *chan, void *data )
{

    
    pfPipeWindow *pwin;
    pwin = pfGetChanPWin(chan);
     
     
    pfClearChan(chan);
    count++;
     
    /* Draw into overlay plane every 10th frame */
    if (!(count%10))
    {
         
        pfPushState();
        pfBasicState();
         
            pfPWinIndex(pwin, PFWIN_OVERLAY_WIN);
            pfSelectPWin(pwin);
       
            /* Draw overlay image */
            DrawOverlay();
         
            pfuDrawMessageCI(chan, "Drawing Overlay", PFU_MSG_CHAN, PFU_RIGHT_JUSTIFIED, 1.0f, 1.0f, PFU_FONT_SMALL, 5, 2);
       
            /* Put back the normal drawing window */
            pfPWinIndex(pwin, PFWIN_GFX_WIN);
            /* Indicate that we will now draw to the window */
            pfSelectPWin(pwin);
            
                   
        pfPopState();
     }
      
      
     /* call the main IRIS Performer drawing function */
     pfDraw();
}

static void DrawOverlay(void )
{
    
         
        /* select a color index */
        glIndexi(8);
        glRectf (-1.0, -1.0, 1.0, 1.0);
         
         
}


New Message Reply Date view Thread view Subject view Author view

This archive was generated by hypermail 2.0b2 on Wed Dec 22 1999 - 11:42:44 PST

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