Bill Moore (bmoore++at++world.northgrum.com)
Wed, 22 Dec 1999 11:42:10 -0700
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);
}
This archive was generated by hypermail 2.0b2 on Wed Dec 22 1999 - 11:42:44 PST