hide random home http://www.sgi.com/tech/Performer/relnotes.html (Silicon Surf Promotional CD, 01/1995)

IRIS Performer 1.2 Release Notes

IRIS Performer 1.2 Release Notes

Silicon Graphics Computer Systems

"The Performer"

This document contains the following chapters:

  1. Introduction
  2. Installation Information
  3. IRIS Performer Source Code
  4. Known Problems and Workarounds
  5. Documentation Errors
  6. Differences Between 1.0/1.1 and 1.2

1. Introduction

IRIS Performer is a toolkit tailored for high-performance graphics and visual simulation applications on IRIS workstations. Its core consists of two libraries: libpr.a and libpf.a. libpr is a low-level library that provides high-speed rendering functions, state control, and other machine-oriented functions. libpf is a rapid prototyping environment that uses libpr functions to create a multiprocessing, automated database rendering system that incorporates many features useful to visual simulation applications.

In addition to libpr.a and libpf.a, IRIS Performer provides a library of utility functions, libpfutil.a and the libpfsgi.a library which contains file loaders for many popular database formats. Source code is provided for both libpfutil.a and libpfsgi.a. For aid in application development IRIS Performer includes sample application source code which ranges from simple programs that illustrate a particular feature to a comprehensive, GUI- driven file viewer called perfly.

And lastly, this distribution includes a wide variety of source code, demos, models, and utilities that have been provided by 3rd party vendors for your use. We call these vendors "friends of Performer" and we encourage you to sample their wares.

1.1 Release Identification Information

Following is the release identification information for IRIS Performer:

Software Option Product        IRIS Performer
Version                        1.2
Product Code                   SC4-PERF-1.2
System Software Requirements   4D1-4.0.5 for Irix4 version 
			       and 4D1-5.2 for Irix5 version
Note that 1.2 is shipped for both 4.0.5 and 5.2 systems. You should only install that version of IRIS Performer that is appropriate for your machine. The IRIS Performer version is indicated by the "Irix4" or "Irix5" string in each product name. Irix4 products should only be installed on 4.0.5 systems and Irix5 products should only be installed on 5.2 systems.

When a choice is possible between IRIX 5.2 and IRIX 4.0.5, IRIX 5.2 is preferable. IRIX 5.2 is the current operating system release and contains many bug fixes and enhancements utilized by IRIX Performer 1.2. IRIS Performer 1.2 for IRIX 4.0.5 is intended only for users who are unable to upgrade to IRIX 5.2.

1.2 On-Line Release Notes

After you install the on-line documentation for a product (the relnotes subsystem), you can view the release notes on your screen.

If you have a graphics system, select ``Release Notes'' from the Tools submenu of the Toolchest. This displays the grelnotes(1) graphical browser for the on-line release notes.

Refer to the grelnotes(1) man page for information on options to this command.

1.3 Product Support

Silicon Graphics, Inc., provides a comprehensive product support maintenance program for its products.

If you are in North America and would like support for your Silicon Graphics-supported products, contact the Technical Assistance Center at 1-800-800-4SGI.

If you are outside North America, contact the Silicon Graphics subsidiary or authorized distributor in your country.

2. Installation Information

This chapter lists information supplemental to the IRIS Software Installation Guide. The information listed here is product-specific; use it with the Installation Guide to install this product.

2.1 IRIS Performer Subsystems

IRIS Performer includes these subsystems:

performer dev.man.performer   Man Pages
performer_dev.man.relnotes    Release Notes
performer_dev.src             Sample Code
performer_dev.src.pguide      Programmers Guide Examples
performer_dev.src.sample      Sample Application
performer_dev.sw              Development Environment
performer_dev.sw.debug        Debug Libraries
performer_dev.sw.performer    Libraries and Headers
performer_dev.sw.pfdwb        Sample DWB File Conversion Library
performer_dev.sw.pfflt        Sample Flight File Conversion Library
performer_dev.sw.pfsgi        Sample SGI File Conversion Library
performer_dev.sw.pfutil       Utility Library
performer_dev.sw.static       Non-Shared Libraries
performer_eoe.sw.data         Demo Databases
performer_eoe.sw.demo         Demos
performer_eoe.sw.performer    Dynamic Shared Libraries
performer_friends.sw.arpa     Friends of IRIS Performer: ARPA World
performer_friends.sw.avalon   Friends of IRIS Performer: Avalon FTP Site
performer_friends.sw.cad      Friends of IRIS Performer: Computer Arts & Dev
performer_friends.sw.coryphaeus Friends of IRIS Performer: Coryphaeus
performer_friends.sw.i3dm     Friends of IRIS Performer: Crystal Visions of Reality
performer_friends.sw.cvr      Friends of IRIS Performer: I3DM Modeler
performer_friends.sw.lightscape Friends of IRIS Performer: Lightscape Radiosity
performer_friends.sw.models   Friends of IRIS Performer: Various Models
performer_friends.sw.multigen Friends of IRIS Performer: Multigen Models
performer_friends.sw.oort     Friends of IRIS Performer: Oort Game
performer_friends.sw.paradigm Friends of IRIS Performer: Paradigm Simulation
performer_friends.sw.site     Friends of IRIS Performer: Building Site
performer_friends.sw.town     Friends of IRIS Performer: Town Database
performer_friends.sw.viewpoint Friends of IRIS Performer: Viewpoint Models
performer_friends.sw.wavefront Friends of IRIS Performer: Wavefront Models

2.2 IRIS Performer Subsystem Disk Space Requirements

This section lists the subsystems (and their sizes) of the IRIS Performer option.

If you are installing this option for the first time, the subsystems marked ``default'' are the ones that are installed if you use the ``go'' menu item. To install a different set of subsystems, use the ``install,'' ``remove,'' ``keep,'' and ``step'' commands in inst to customize the list of subsystems to be installed, then select the ``go'' menu item.

Note: The listed subsystem sizes are approximate. Refer to the IRIS Software Installation Guide for information on finding exact sizes.

Subsystem Name                                Subsystem Size
                                           (512-byte blocks)
                                                IRIX 4/IRIX5
performer_dev.man.performer (default)        2379 / 1679
performer_dev.man.relnotes (default)           179 / 179
performer_dev.src.pguide (default)             591 / 591
performer_dev.src.sample (default)             678 / 666
performer_dev.sw.debug (default)           10830 / 17688
performer_dev.sw.performer (default)           301 / 301
performer_dev.sw.pfdwb (default)               703 / 717
performer_dev.sw.pfflt (default)               654 / 807
performer_dev.sw.pfsgi (default)             4555 / 3492
performer_dev.sw.pfutil (default)            5706 / 4284
performer_dev.sw.static (default)            1757 / 4808
performer_eoe.sw.data (default)            24513 / 24513
performer_eoe.sw.demo (default)            24743 / 24254
performer_eoe.sw.performer (default)         4213 / 4221
performer_friends.sw.arpa                    3538 / 3538
performer_friends.sw.avalon                37982 / 37982
performer_friends.sw.cad                     7420 / 7420
performer_friends.sw.coryphaeus            44880 / 44880
performer_friends.sw.cvr                   21121 / 21121
performer_friends.sw.i3dm                  26598 / 26598
performer_friends.sw.lightscape           26598 / 184424
performer_friends.sw.models                80719 / 80719
performer_friends.sw.multigen            119561 / 119561
performer_friends.sw.oort                    8544 / 8544
performer_friends.sw.paradigm              81170 / 81170
performer_friends.sw.site                  20333 / 20333
performer_friends.sw.town                  38019 / 38019
performer_friends.sw.viewpoint             19468 / 19468
performer_friends.sw.wavefront               3222 / 3222

2.3 Installation_Method

All of the IRIS Performer subsystems can be installed using IRIX. You do not need to use the miniroot. Refer to the IRIS Software Installation Guide for complete installation instructions.

2.4 Prerequisites

To run IRIS Performer 1.2, your system must be running IRIX 4.0.5 or later for the IRIX 4.0.5 version and IRIX 5.2 or later for the IRIX 5.2 version.

2.5 Compatibility

2.6 Other_Installation_Information

IRIS Performer installs sample code, binaries, and database files in:

/usr/src/Performer/bin
Compiled versions of the perfly, lod, pickfly, and smallfly sample programs

/usr/src/Performer/lib
Compiled versions of the database loading and utility libraries

/usr/src/Performer/include
Header files for the database loading libraries

/usr/src/Performer/src
Sample programs, database loading and utility library source code

/usr/src/Performer/data
Database files and textures

3. IRIS Performer Source Code

IRIS Performer supplies source code that illustrates how to load some database formats into IRIS Performer run-time data structures as well as sample source code which ranges from simple programs to perfly, a general framework for a visual simulation application. In addition, a utility library, libpfutil.a, provides both useful features and examples of programming with IRIS Performer. Scripts are also provided which convert your old IRIS Performer source code from 1.0/1.1 to 1.2. You are encouraged to understand and modify this code for your own purposes subject to the terms and conditions of the Software License Agreement.

3.1 IRIS Performer Makefile Conventions

The Makefiles shipped with IRIS Performer source code generally follow certain conventions. The make targets: dbg, opt, and dso will make static debug, static optimized and optimized, dynamic shared object (DSO) versions of libraries or executables. Object files are placed into DBG and OPT directories accordingly and library names indicate their version. For example, libpfutil-g.a, libpfutil.a, and libpfutil.so are the results of the dbg, opt, and dso make targets. Executables are given a single name but are a soft link into either the DBG or OPT directories. For example, perfly may be a link to OPT/perfly.OPT. Makefiles look for libraries first in /usr/src/Performer/lib and then in /usr/lib. In order to link with a custom library built in /usr/src/Performer/lib, the makefiles must be modified.

3.2 Database Loaders

A database loader converts a particular on-disk database format into IRIS Performer run-time data structures. Loaders are provided for some standard Silicon Graphics data formats (.bin, .sgo, .iv) as well as many third party formats such as Coryphaeus' .dwb, Software Systems .flt, Autodesk's .dxf, and Wavefront's .obj.

3.2.1 libpfsgi Database Loaders

libpfsgi consists of loaders for the following database formats:

The sources for these file loaders are located in /usr/src/Performer/src/lib/libpfsgi. Execute a make in this directory to create the library libpfsgi.a.

3.2.2 Software Systems Flight File Loader

libpfflt.a and libpfflt14.a are loaders for .flt versions up to and including version 13 and 14 respectively. Source code for these loaders is not provided in this release but you may contact Software Systems at (408) 247-4326 to obtain source code. libpfflt.a is the default loader used by the supplied Makefiles so if you wish to use the version 14 loader you must change the Makefile(s) to reference libpfflt14.a instead.

The .flt file converter does not support all MultiGen Flight features and attributes. See the README.V13 and README.V14 in the /usr/src/Performer/src/lib/libpfflt directory for details on non-supported features and attributes.

3.2.3 Coryphaeus .dwb Loader

Source code for the .dwb loader is found in /usr/src/Performer/src/lib/libpfdwb. Execute a make in this directory to create the library libpfdwb.a.

3.3 Programmer's Guide Source Code

Programming examples referenced in the IRIS Performer's programming guide may be found in /usr/src/Performer/src/pguide/. Source code is organized first by library, libpr, libpf, libpfutil, and then by example type, either example for code fragments or progs for standalone, runnable programs. This source code is a good place to start when learning IRIS Performer.

3.4 Sample Application Source Code

/usr/src/Performer/src/sample/ contains several sample applications which span a range of complexity and IRIS Performer features. Files shared by multiple applications are found in the common directory. If you wish to modify any of these files, copy them into the particular application directory you are working in. Together, common/main.c and common/generic.c illustrate the main framework of an IRIS Performer application so we encourage you to examine these files.

3.5 Utility Library

The utility library found in /usr/src/Performer/src/lib/libpfutil is a grab bag of features which you may find useful. Brief man pages are provided but be cautioned that the utility library can and will change between IRIS Performer releases.

3.6 Tools

/usr/src/Performer/src/tools/ contains software tools that ease the transition from IRIS Performer version 1.0/1.1 to 1.2.

4. Known Problems and Workarounds

This chapter lists the problems with the IRIS Performer libraries, libpr and libpf, and with the shared memory configurations.

Note that the IRIS Performer FAQ also contains an up-to-date list of problems and workarounds.

4.1 libpr

4.2 libpf

4.3 libpfutil

4.4 libpfsgi

4.5 Sample Programs

4.6 Friends of Performer

4.7 Notes on Shared Memory Configurations

IRIS Performer requires shared memory and uses a memory- mapped file, the location of which depends on the value of the PFTMPDIR environment variable:

5. Documentation Errors

This chapter lists the problems with the documentation.

5.1 Reference Pages

6. Differences Between 1.2 and previous releases

This chapter elucidates the changes and enhancements between the 1.2 and the previous 1.0 and 1.1 releases of IRIS Performer. If you are new to IRIS Performer you can skip this chapter, since the information contained here is provided to ease porting efforts.

1.0 was the initial release of IRIS Performer and defined a programming interface. With the exception of a few bug fixes, 1.1 was identical to 1.0 except that 1.1 was compiled to run on systems running the 5.0 operating system. However, 1.2 has both functional and programming differences from 1.0 and 1.1 that you should be aware of if you have developed programs for 1.0 and 1.1. In addition, 1.2 has many new features that you may with to take advantage of.

6.1 Functional and Programmatic Changes in 1.2

Functional differences are those that are not reflected in the programming interface. An example is pfInitGfx which now enables backface culling but which did not in 1.0 and 1.1. Programmatic differences are changes to routine and token names and changes to routine arguments. Some programmatic changes are purely cosmetic and were made for consistency sake while some are a result of new or modified functionality.

Your most important aid in porting from the 1.0 and 1.1 versions of IRIS Performer to the 1.2 version is the port1.2 script found in /usr/src/Performer/src/tools. This script will change routine and token names to those defined in 1.2. While port1.2 can automatically complete the majority of the 1.2 port, it will highlight code that it cannot adequately convert with the #error directive so that you can easily find which code fragments need fixing by hand. port1.2 will also add comments that highlight important functional changes. These comments are flagged with the "PORT1.2" string. The output of port1.2 is a file whose name is that of the input file's but is suffixed with "pf1.2".

After processing your files you will need to search them for "PORT1.2" tokens which may have been inserted. These identify locations where code could not be automatically converted or where suggestions for better use of IRIS Performer have been inserted as comments. See the comments in the port1.2 shell script for more details.

6.2 New Features in 1.2

An overview of the major new features of the IRIS Performer 1.2 release are provided in the following paragraphs. In many cases these are significant new features that will facilitate and enhance your work. The following brief list reviews the major new features, refer to the IRIS Performer Programming Guide and the IRIS Performer Reference Pages for full details.

6.3 Details of API changes

What follows is a topical list of changes and new features which distinguish IRIS Performer 1.0 and 1.1 from IRIS Performer 1.2.

6.3.1 New Shared Memory and Temporary Data Directory API

The new function pfSharedArenaSize() can be used to control the amount of memory allocated for the IRIS Performer shared memory arena. There is a default maximum of 256 Megabytes, so most users will not need to specify this. Those whose memory needs exceed the default can use this function to specify the amount of RAM that IRIS Performer will attempt to allocate. This new libpr API consists of:

       ulong           pfGetSharedArenaSize(void);
       void            pfSharedArenaSize(ulong size);
       void            pfTmpDir(char *dirname);
       const char *    pfGetTmpDir(void);
Also, the accounting mechanisms for tracking memory required by an application are much stricter in IRIX 5.x than in IRIX 4.x. By default, IRIS Performer allocates a shared memory arena in the swap partition that may be much larger than necessary. If allocation of this arena is denied, there are three immediate possible solutions:

6.3.2 New default pfLayer decaling mechanism

pfLayer nodes use the libpr pfDecal() routine to render coplanar geometry known as "decals" or "subfaces". The default PFDECAL_BASE mode of pfDecal() now uses displacepolygon() (rather than stencil()) as its default mechanism on machines which support this feature. This mechanism can offer substantially higher rendering performance than the old default but can also result in visual anomalies where layer polygons incorrectly "poke" through other geometry. If you have these kinds of problems you can specify the PFDECAL_BASE_HIGH_QUALITY or PFDECAL_BASE_STENCIL token to pfLayerMode to force the pfLayer node to use the higher quality stencil() mechanism.

6.3.3 Control for handling floating-point arithmetic exceptions

This new libpr API consists of:

       pfFPConfig()
       pfGetFPConfig()

6.3.4 pfInitClock API Change

pfInitClock() now takes an initial time argument rather than using an implicit reset value of zero.

       old: void pfInitClock(void);
       new: void pfInitClock(double time);

6.3.5 New pfObject API

The pfObject API may be used on all libpr and libpf objects. These routines handle generic object operations. Reference counting is done on these objects so that they will not be deleted by pfDelete() until their reference counts are zero. This new libpr API consists of:

       long    pfUserData(prObject *obj, void *data);
       void *  pfGetUserData(prObject *obj);
       long    pfCopy(prObject *dst, prObject *src);
       long    pfDelete(prObject *obj);
       void    pfPrint(prObject *obj, ulong which, ulong verbose,
                FILE *file);
       long    pfGetGLHandle(pfObject *obj);

6.3.6 Improved Object Printing

All of the pfDebugPrint*() routines have been removed and replaced with a single pfPrint() function. The new libpr API consists of:

       void    pfPrint(pfObject *obj, ulong which, ulong verbose,
                FILE *file);
pfPrint prints information to a file about the the specified pfObject obj. The file argument specifies the file. If file is NULL, the listing is printed to stderr. pfPrint takes a verbosity indicator, verbose, to select in order of increasing verbosity are:

       PFPRINT_VB_OFF      - no printing
       PFPRINT_VB_ON       - default - minimal printing
       PFPRINT_VB_NOTICE   - default - minimal printing
       PFPRINT_VB_INFO     - interesting info about a given object
       PFPRINT_VB_DEBUG    - prints everything
If obj is a type of pfNode, then which specifies whether the print traversal should only traverse the current node (PFTRAV_SELF) or print out the entire scene graph rooted by node obj by traversing node and its descendents in the graph (PFTRAV_SELF | PFTRAV_DESCEND). If obj is a pfFrameStats, then which specifies a bitmask of frame statistics classes that should be printed. If obj is a pfGeoSet, then which is ignored and information about that pfGeoSet is printed according to the verbosity indicator. The output contains the types, names and bounds of the nodes and pfGeoSets in the hierarchy. This routine is provided for debugging purposes only and the content and format may change in future releases.

6.3.7 Math API Changes

pfMakePolarSeg() now returns segment with origin as +Y axis. In previous versions it returned a segment relative to +X axis.

pfRotMStack() has a new argument order to match the OpenGL convention:

       old:  pfRotMStack(pfMatStack* stack, 
		 float x, float y, float z, float degrees);
       new:  pfPreRotMStack(pfMatStack* stack, 
		 float degrees, float x, float y, float z);
pfScaleMat() has a changed argument list to match both man page and the function pfScaleMStack:

       old:  pfScaleMat(pfMatrix dst, float s, const pfMatrix m);
       new:  pfPreScaleMat(pfMatrix dst, float x, float y, float z,
               const pfMatrix m);
pfScaleMStack() has been renamed pfPreScaleMStack()

pfTransMStack() has been renamed pfPreTransMStack()

pfMakeRotOntoMat() no longer scales, it only rotates v1 to be proportional to v2

6.3.8 Math API Additions

       pfGetMatType()

       pfPostRotMat()
       pfPreRotMat()

       pfPostScaleMat()
       pfPreScaleMat()

       pfPostTransMat()
       pfPreTransMat()

       pfRotMat()

       pfPostRotMStack()
       pfPostScaleMStack()
       pfPostTransMStack()

       pfEqualMat()

       pfAlmostEqualVec2()
       pfAlmostEqualVec3()
       pfAlmostEqualVec4()
       pfAlmostEqualMat()

6.3.9 Intersection API Changes and Additions

Intersection API and some functionality has been changed and enhanced.

The pfIsect structure has been removed and is replaced by pfHit.

The arguments and functionality of the functions pfSegsIsectNode() and pfSegsIsectGSet() have changed. Routines have been added to libpfutil to be compatible with the previous functionality. These functions are:

       pfuSegsIsectNode()
       pfuSegTraceSetup()
       pfuSegTrace()
These routines are declared in pfutil.h and the source code for them is provided in "../../usr/src/Performer/src/lib/libpfutil". For optimal performance and efficiency, porting to the new intersection API is recommended.

Changed libpr and libpf intersection API:

       old: long pfSegsIsectNode(pfNode* node,
                  pfSeg** segs, long nseg,
                  long mode, ulong mask, pfCylinder* bcyl,
                  pfIsect* isects, long (*discFunc)(pfIsect* isect))

       new: long pfSegsIsectNode(pfNode *node, pfSegSet *segSet,
                  pfHit **hits[])

       old: long pfSegsIsectGSet(pfGeoSet* gset, pfSeg** segs, long nSeg,
                  ulong mask, long mode, pfCylinder* bcyl,
                  pfIsect* isects, long (*discFunc)(pfIsect* isect))

       new: long pfSegsIsectGSet(pfGeoSet *gset, pfSegSet *segSet,
                  pfHit **hits[])
The arguments to pfChanPick() have changed.

       old: long pfChanPick(pfChannel* chan,
                  long mode,
                  float px,
                  float py,
                  float radius,
                  pfIsect** picklist);

       new: long pfChanPick(pfChannel* chan,
                  long mode,
                  float px,
                  float py,
                  float radius,
                  pfHit** picklist[]);
Note: picklist must not be NULL and pfQueryHit() or prMQueryHit() should be used to get back picking information. Also, if mode includes PFTRAV_IS_PRIM, then radius must be 0.0f.

New libpr Structures:

       pfSegSet
       pfHit - replaces pfIsect exposed struct
New API:

       pfQueryHit()
       pfMQueryHit()

6.3.10 pfPartition node type

A pfPartition is a type of pfGroup which organizes the scene graphs of its children into a static data structure which can be more efficient for culling and intersections. The new libpf API consists of:

       pfPartition * pfNewPart(void);
       void          pfPartAttr(pfPartition* part, long attr, float val);
       float         pfGetPartAttr(pfPartition *part, long attr);
       void          pfBuildPart(pfPartition* cset, long type);
       void          pfUpdatePart(pfPartition* cset);
       long          pfGetPartType(pfPartition* part);

6.3.11 Video Refresh Rate Specification

       float   pfGetVideoRate(void);
       float   pfFrameRate(float rate);
       float   pfGetFrameRate(void);
       long    pfFieldRate(long fields);
       long    pfGetFieldRate(void);
Note: pfGetFrameCount now returns frame accurate count instead of the application process count.

6.3.12 X-window system interface

New libpf API:

       pfInitGLXGfx()
New libpf API for initializing GLX windows. libpfutil provides additional utilities for setting up a GLX application with asynchronous X-input handling. Example programs in the directory "../../usr/src/Performer/src/pguide/libpf/progs" demonstrate how to use these utilities.

6.3.13 Enhanced bounding volumes

You can now get and set bounding spheres as well as bounding boxes for libpf objects.

       long pfNodeBSphere(pfNode *node, pfSphere *bsph, long mode);
       long pfGetNodeBSphere(pfNode *node, pfSphere *bsph);

6.3.14 User control of gl swapbuffers() function

Normally a pfPipe swaps the image buffers at the end of each frame. However, if user control of buffer swapping is desired, pfPipeSwapFunc will register a function as the buffer swapping function for pipe. Instead of swapping buffers directly, the user's function will be called and will be expected to swap the buffers as desired. New libpf API:

       void pfPipeSwapFunc(pfPipe *pipe, void (*func)(pfPipe *pipe));

6.3.15 New texture processing options

New libpf API: pfGetTexFile() has been removed and has been replaced with pfGetTexName(). Textures can now be named with pfTexName().

New libpr API: pfIdleTex() signifies that tex is no longer needed in texture memory and may be replaced by new textures.

       void pfIdleTex(pfTexture *tex);
pfIsTexLoaded() returns TRUE or FALSE to indicate if a texture is already loaded in texture memory or not.

       long pfIsTexLoaded(pfTexture *tex);
With these two commands (pfIdleTex and pfIsTexLoaded) it is possible to implement a simple texture paging mechanism for IRIS Performer.

6.3.16 Material API and Functionality Changes

pfMtlShininess now takes float rather than long.

       void pfMtlShininess(pfMaterial *mtl, float shininess);
The default pfMtlColorMode is now PFMTL_CMODE_AD rather than PFMTL_CMODE_COLOR. This means that pfGeoSet colors will now change both the diffuse and ambient colors of the current front material.

       void pfMtlColorMode(pfMaterial *mtl, long side, long mode);

6.3.17 Enhanced display list features

Changed libpr API:

       old name: pfSelectDList(pfDispList *dlist);
       new name: void pfOpenDList(pfDispList *dlist);

       old name: void pfEndDList(void);
       new name: void pfCloseDList(void);

New libpr API:

       void         pfResetDList(pfDispList* dl);
       pfDispList * pfGetCurDList(void);
       long         pfGetDListType(pfDispList *dl);
       long         pfGetDListSize(pfDispList *dl);
Note: The display list size is in words, not in bytes.

6.3.18 Changed Color Table API

pfGSetCtabMode() has been replaced by:

       void    pfApplyCtab(pfColortable *ctab);
       void    pfEnable(PFEN_COLORTABLE);

6.3.19 pfClear API Change

The argument order has been changed:

       old: void pfClear(pfVec4 color, long type);
       new: void pfClear(long which, pfVec4 color);

6.3.20 Enhanced Channel Statistics Collection and Display

The statistics maintained by IRIS Performer have been greatly enhanced. There are functions to collect, manipulate, print, and query statistics on state operations, geometry, and graphics and system operations. The routines, structures, and constants are declared in "prStats.h". Refer to the following manual pages for information on these utilities:

New API:

       pfStats* pfNewStats(void* arena);
       ulong    pfStatsClass(pfStats *stats, ulong enmask, long val);
       ulong    pfGetStatsClass(pfStats *stats, ulong enmask);
       ulong    pfStatsClassMode(pfStats *stats, long class, ulong mask,
                 long val);
       ulong    pfGetStatsClassMode(pfStats *stats, long class);
       ulong    pfOpenStats(pfStats *stats, ulong enmask);
       ulong    pfCloseStats(ulong enmask);
       ulong    pfGetOpenStats(pfStats *stats, ulong enmask);
       pfStats* pfGetCurStats(void);
       void     pfEnableStatsHw(ulong which);
       void     pfDisableStatsHw(ulong which);
       void     pfStatsHwAttr(long attr, float val);
       float    pfGetStatsHwAttr(long attr);
       ulong    pfGetEnableStatsHw(ulong which);
       void     pfCopyStats(pfStats *dst, pfStats *src, ulong which);
       void     pfResetStats(pfStats *stats);
       void     pfClearStats(pfStats *stats, ulong which);
       void     pfStatsCountGSet(pfStats *stats, pfGeoSet *gset);
       void     pfAccumulateStats(pfStats *dst, pfStats *src, ulong which);
       void     pfAverageStats(pfStats *dst, pfStats *src, ulong which,
                 long num);
       long     pfQueryStats(pfStats *stats, ulong which, float *dst);
       long     pfMQueryStats(pfStats *stats, ulong *which, float *dst);

       pfFrameStats* pfNewFStats(void);
       void     pfDrawFStats(pfFrameStats* fstats, pfChannel *chan);
       ulong    pfStatsClass(pfStats *fstats, ulong enmask, long val);
       ulong    pfGetStatsClass(pfStats *fstats, ulong enmask);
       ulong    pfStatsClassMode(pfStats *fstats, long class, ulong mask,
                 long val);
       ulong    pfGetStatsClassMode(pfStats *fstats, long class);
       void     pfStatsAttr(pfStats *fstats, long attr, float val);
       float    pfGetStatsAttr(pfStats *fstats, long attr);
       void     pfCopyStats(pfStats *dst, pfStats *src, ulong which);
       void     pfResetStats(pfStats *fstats);
       void     pfClearStats(pfStats *fstats, ulong which);
       void     pfStatsCountGSet(pfStats * fstats, pfGeoSet * gset);
       void     pfAccumulateStats(pfStats* dst, pfStats* src, ulong which);
       void     pfAverageStats(pfStats* dst, pfStats* src, ulong which,
                 long num);
       long     pfQueryStats(pfStats *fstats, ulong which, float *dst);
       long     pfMQueryStats(pfStats *fstats, ulong *which, float *dst);
       void     pfStatsCountNode(pfFrameStats *fstats, long class,
                 ulong mode, pfNode * node);
Display of these statistics can be done as in IRIS Performer 1.0 using pfDrawChanStats(), or can be redirected to a separate channel with pfDrawFStats().

6.3.21 Changes to Flatten and Clone API

pfFlatten() and pfClone() now take an additional mode argument. This will be used to specify additional details of the clone and flatten operations.

       old: pfNode* pfClone(pfNode *node);
       new: pfNode* pfClone(pfNode *node, long mode);
       old: long pfFlatten(pfNode *node);
       new: long pfFlatten(pfNode *node, long mode);
Note: The mode must be zero in the IRIS Performer 1.2 release.

6.3.22 New View-point and Viewing Projection API

IRIS Performer 1.2 has a new view specification method to support the definition of orthographic and asymmetric perspective viewing volumes. Refer to the pfNewFrust() manual page for more details on pfFrustum.

pfChanViewOffsets have changed to support translational and rotational offsets for the viewpoint. Order of effect is rotation then translation.

       old: void pfChanViewOffsets(pfChannel *chan,
                  float h, float p, float r);
       new: void pfChanViewOffsets(pfChannel *chan,
                  pfVec3 xyz, pfVec3 hpr)
pfGetChanFrust() has been removed The pfChannel object is derived from pfFrustum so a channel pointer can be passed to any routine that expects a pointer to a pfFrustum.

pfChanFOVZoom() has been removed. Channel FOV must be scaled directly whenever scaling is desired.

6.3.23 pfPipe API changes

Changed libpf API:

       old name: pfGetWindowSize();
       new name: pfGetPipeSize(pfPipe *pipe, long *xsize, long *ysize);

       old name: pfGetWindowOrigin();
       new name: pfGetPipeOrigin(pfPipe *pipe, long *xorg, long *yorg);

       old name: pfGetScreen();
       new name: long pfGetPipeScreen(pfPipe *pipe);

       old name: pfSwapFunc();
       new name: void pfPipeSwapFunc(pfPipe *pipe,
                   void (*func)(pfPipe *pipe));
New libpf API:

       void pfGetChanOrigin(pfChannel* chan, long *xo, long *yo);
       void pfGetChanSize(pfChannel* chan, long *xs, long *ys);

6.3.24 pfDCS API changes

Changed libpf API:

       old name: pfDCSMatrix(pfDCS *dcs, pfMatrix m);
       new name: void pfDCSMat(pfDCS *dcs, pfMatrix m);

       old name: pfGetDCSMatrix(pfDCS *dcs, pfMatrix m);
       new name: void pfGetDCSMat(pfDCS *dcs, pfMatrix m);

       old name: pfGetSCSMatrix(pfSCS *scs, pfMatrix mat);
       new name: void pfGetSCSMat(pfSCS *scs, pfMatrix mat);

6.3.25 pfLPoint API changes

The arguments to pfLPointColor() have changed so that now you can set the color of an arbitrary light point in a pfLightPoint group.

       old: void pfLPointColor(pfLightPoint* lpoint, pfVec3 clr);
       new: void pfLPointColor(pfLightPoint* lpoint, long index, pfVec4 color);

6.3.26 New pfPhase mode - PFPHASE_LIMIT

PFPHASE_LIMIT behaves similarly to PFPHASE_FREE_RUN except that PFPHASE_LIMIT will limit the application frame rate to that specified by pfFrameRate.

6.3.27 Changed pfConfig behavior when running as root

Previously, root privilege caused pfConfig() to assign non- degrading priorities to Performer processes. Due to deadlock and "good neighbor" issues we have removed this function from pfConfig(). Instead, use the utility function, pfuPrioritizeProcs(TRUE), to assign non-degrading priorities to Performer processes or call schedctl() in conjunction with pfGetPID() to customize process priorities.

Compiled by: Allan Schaffer