APP traversal bug -- pfAppFrame() and pfApp()

New Message Reply Date view Thread view Subject view Author view

Bernard Leclerc (bleclerc++at++cae.ca)
Tue, 6 Feb 1996 10:55:57 -0500


Hello you all,

Attached is a modified version of simple.C to illustrate a bug in the APP
traversal. One would expect the APP traversal to traverse the scene graph only
once per frame -- during pfSync() which calls pfAppFrame().

I'm surprised to realize that the virtual function appDCS::app() is called for
every channel instead of only once.

It appears to me that updating various DCS's through the APP traversal is the
most natural thing to do. This way, one can create a class of object
responsible for updating their own position when traversed during the APP
traversal. It's actually what's suggested by Rotor.[Ch] found in
/usr/share/Performer/src/lib/libpfdb/libpfiv.

Can the Performer team confirm that this is a bug?

What do you suggest as a workaround?

And, finally, is there a plan to issue a bug-fix release of Performer 2.0?

Thanks

--
      ___/      |        ___/	Bernard Leclerc		e-mail: bleclerc++at++cae.ca
     /        / |       /	Systems Engineer	voice: +1 514 341 2000
    /        /  |      __/	CAE Electronics Ltd.		extension 2275
   /        /   |     /		8585 Cote De Liesse	fax:   +1 514 340 5496
  /        ____ |    /		P.O. Box 1800
_____/   _/    _|  _____/	Saint-Laurent, Quebec, Canada, H4L-4X4

// // 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. // // // simpleC.C: simple Performer program for programmer's guide // // $Revision: 1.10 $ // $Date: 1995/11/22 14:35:21 $ //

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

#include <Performer/pf/pfChannel.h> #include <Performer/pf/pfLightSource.h> #include <Performer/pf/pfNode.h> #include <Performer/pf/pfScene.h> #include <Performer/pf/pfDCS.h> #include <Performer/pf/pfTraverser.h>

#include <Performer/pfutil.h> #include <Performer/pfdu.h>

// application specific class derived from a Performer DCS node. // // The virtual function app() simply counts the number of time // the function is called. class appDCS : public pfDCS {

public: int count;

appDCS() {count = 0;}

virtual int app(pfTraverser* trav) { count++; return pfDCS::app(trav); }

virtual int needsApp() { return TRUE; }

static void init();

static pfType* getClassType() { return classType; }

private:

static pfType* classType;

};

pfType *appDCS::classType = NULL;

void appDCS::init() { if (classType == NULL) { pfDCS::init(); classType = new pfType ( pfDCS::getClassType(), "appDCS"); } }

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

// // Main program // int main (int argc, char *argv[]) { float t = 0.0f; if (argc < 2) Usage(); // Initialize Performer pfInit();

// Initialize derived classes appDCS::init(); // Use default multiprocessing mode based on number of // processors. // pfMultiprocess( PFMP_DEFAULT ); // 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. // pfConfig(); // Append to Performer search path, PFPATH, files in // /usr/share/Performer/data */ pfFilePath(".:/usr/share/Performer/data"); pfNode *root = pfdLoadFile(argv[1]); if (root == NULL) { pfExit(); exit(-1); }

// Attach the loaded file to a new appDCS appDCS* dcs = new appDCS; dcs->addChild(root); // Attach the appDCS to a new pfScene pfScene *scene = new pfScene; scene->addChild(dcs); // Create a pfLightSource and attach it to scene scene->addChild(new pfLightSource); // Configure and open GL window pfPipe *p = pfGetPipe(0); pfPipeWindow *pw = new pfPipeWindow(p); pw->setWinType(PFPWIN_TYPE_X); pw->setName("IRIS Performer"); pw->setOriginSize(0,0,500,500); pw->open(); // Create and configure 2 channels. pfChannel *chan1 = new pfChannel(p); chan1->setScene(scene); chan1->setFOV(45.0f, 0.0f); chan1->setViewport(0.0f,1.0f,0.0f,0.5f); pfChannel *chan2 = new pfChannel(p); chan2->setScene(scene); chan2->setFOV(45.0f, 0.0f); chan2->setViewport(0.0f,1.0f,0.5f,1.0f); // determine extent of scene's geometry pfSphere bsphere; root->getBound(&bsphere); chan1->setNearFar(1.0f, 10.0f * bsphere.radius); chan2->setNearFar(1.0f, 10.0f * bsphere.radius); // Simulate for twenty seconds. int frames;

while (t < 20.0f) {

pfCoord view; float s, c; // Go to sleep until next frame time. pfSync(); // Initiate cull/draw for this frame. frames = pfFrame(); // Compute new view position. t = pfGetTime(); pfSinCos(45.0f*t, &s, &c); view.hpr.set(45.0f*t, -10.0f, 0); view.xyz.set(2.0f * bsphere.radius * s, -2.0f * bsphere.radius *c, 0.5f * bsphere.radius); chan1->setView(view.xyz, view.hpr); chan2->setView(view.xyz, view.hpr); }

printf("num frames: %d\n", frames); printf("appDCS count: %d\n", dcs->count);

// Terminate parallel processes and exit pfExit(); return 0; }


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:52:22 PDT

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