8 Aug 2007 Removed obsolete scene.apply that was still in C code Fixed bug detected by students: begin/end mismatch would be detected but not corrected at Python end of program, so got carried over into subsequent executions even though Python was now OK 6 Jul 2007 Moved style constants used by deck module into deck module where they belong 2 Jul 2007 Restored gradient code Code cleanup: replaced inc & return None sequences with built in Python macro, replaced parse "" args with METH_NOARGS Directory containing main script (if present) is added to Performer search path for files/fonts, so can run program that loads stuff from outside directory 26 June 2007 Moved RGB, RGBA render style constants into wire with the rest of them. TODO: duplicate whole lot into deck 15 Jun 2007 Renamed 'shader' module to 'material', as 'shaders' these days almost exclusively mean programmable GPU shaders. Moved RGB, RGBA render style constants into py3dmod 14 Jun 2007 Cleaned up code to avoid duplication of application root node in app and python controller, was causing lights to never be reclaimed. Will have to redo for shared worlds, but that isn't a priority right now and the previous code didn't work properly when shared either. Fixes (?) to Python memory management for input devices Overall, viewer runs demo code without crashing and without leaking too rapidly. 13 Jun 2007 More memory management checks. Probably leaking Performer objects now, but Python GC isn't complaining 12 Jun 2007 Fixed problems with Photoshop loader not sharing memory properly 8 Jun 2007 Memory management hunt declared: track down all GC problems! Nested modules need to be refcounted, PyModule_AddObject doesn't PyTuple_GetItem returns borrowed reference, but PySequence_GetItem incs refcount, so vertex/mesh lists passed to geometry methods never got released afterwards. 6 Jun 2007 Big problem: Python objects never being freed! Every scene reload just duplicates what's there already! Must be related to type refcounting somehow. Cleaned up code that sets Python sys.argv: now has name of script, not pfpy3d, as argv[0]. 31 May 2007 Python types now correctly refcounted and added to module, seems to fix previous abort() problem from garbage collector 15 Dec 2006 Geode object message transform renamed to reshape 13 Dec 2006 Fixed bug: geo.points reported 1D sequence of vertices as error due to improper checking Fixed bug: attempted to unload devices from non-existent device table Fixed wierd behaviour: scenes occasionally vanish entirely in the viewer. Reading fine print, Performer does visibility testing to the *Geode* level, not individual *GeoSet* level, for anything under a matrix. So any piece of geometry not fully visible isn't drawn, and on some scenes that was everything! 8 Dec 2006 Added copy method for py3d objects Copy for geodes uses new geoshape utility to duplicate vertex data as well Geode objects can be transformed by matrix 6 Dec 2006 Finished conversion of Python run3d code into class geo.points will accept 2D sequences of coords so can render mesh/curve geometry as point cloud Finally got animated texture matrices working animate.translate/rotate/etc now accept Python callable directly without needing to use engine.new 5 Dec 2006 Animated transforms also limit to one eval per frame Doco for Python input handlers said they received key up and passive motion events, which in fact they don't. Fixed up input handling code to properly disconnect all handlers when Python reloaded, so now can have multiple handlers per device if desired. Started redesigning run3d code to use PyController object, will be useful in future if want to handle multi-user environment 4 Dec 2006 Engines check frame number to only evaluate Python code max once per frame 22 Nov 2006 Included in most module header files 13 Oct 2006 Updated pfpy3d man page 8 Oct 2006 Cleaned up rendering style code so only one renderStyle used throughout instead of duplicated wire, shade 29 Sep 2006 Fixed bug: doco for spotlights said that None was valid for falloff angle, but doing so would be reported as error. Simplified back to just floating point, default zero. Added animate.scale Cleaned up a lot of duplicate code in animatemod 15 Sep 2006 Another multiprocessing bug on hyperthreaded x86 when installed latest version in R105. Default is now multiprocessing on SGI, single process on Linux, added -mp command line option to turn on multiprocessing as well as -nomap 13 Sep 2006 engine.call changed to engine.new Better error message when Python pulse engine returns NULL 12 Sep 2006 Changed animated matrix method names to same as normal matrix. I always get these wrong, can't expect others to do any better. Added animate.euler begin/end mismatch is reported to console as Python AssertionError as well as onscreen 23 Aug 2006 Fixed nasty bug: deck getViewpoint wasn't actually returning a value. Thank you SGI CC! 22 Aug 2006 Moved doco into py3dview/doc rather than inside viewer. Updated Makefiles 20 Aug 2006 The big rename: viewer code now pfpy3d/ not py3dview/ 19 Aug 2006 Removed references to sfxmod that I'd left in from experiment with billboards 13 Aug 2006 Rewrote image snapshot code to include sequence number, save in /tmp by default, report if unable to save Python code can invoke deck.snapshot() Application can override use of pfGetTime for engines, will be useful in making movies to slow down frame rate 12 Aug 2006 Fixed bug: didn't recalc FOV/aspect when window resized to different proportions Multiprocessing bug caused by 3.2.0, upgrade to 3.2.2 seems to have fixed it. 31 Jul 2006 Linux version hangs on pfExit on multiprocessor system. Force -nomp on until I figure out what's going on. Doc/reference.html becomes index.html 13 Jul 2006 Tested viewer with custom built libpython.a with annoying GC code removed, seems to work OK None is allowed as child of switch/animated nodes, just means invisible child 12 Jul 2006 Fixed bug: Python main.py3d couldn't import modules from the same directory unless running within it, which was pretty useless. 11 Jul 2006 Cleaned up deck viewpoint object code to use instance variable instead of icky global that I'd hacked together 30 Jun 2006 Fixed bug: Photoshop textures being loaded upside down because pfTexImage expects image data from bottom to top Planar, cylindrical, spherical texture mapping with post transform all working Texture shaders can have mode and alpha parameters, but texture matrix isn't working - must be doing something wrong :-( 28 June 2006 Started on full texture mapping. Decided to move texture coord generation in geoshape library. First planar projection of texture map with basic shader! 26 June 2006 Fixed some bugs in directory watcher logic 23 June 2006 Added daemon node engines which never get culled so always execute every frame. Put back modified directory watcher which executes main.py3d, also checks if any .py/.py3d files in same directory which are imported change and reloads them. Minor changes to man file to bring it up to date Fixed bug: queue resize wasn't working properly or something and crashed on directories with many files 21 June 2006 Changed scene engines into nodes with custom draw, so can be added to scene, controlled with visibility mask 20 June 2006 Added scene engines which get evaluated every frame without being attached to node 16 June 2006 Allow py3d.bitmask(0), returns 0 14 June 2006 Decided to always generate normals, so later version can switch between shaded/wireframe views Added py3d.ALLMASK constant 5 June 2006 3.2.2 release Fixed multiprocessing bug: couldn't create a stereo window on multiprocessor SGI system Fixed multiprocessing glitch: HUD code was generating constant 'Attempt to cull NULL node' debug messages 11 May 2006 Decided stdin watcher not useful, removed again 3.2.1 release 1 May 2006 3.2.0 release Synched Python code to recent interact event changes Tracker events have coords swapped from PF to LH 26 Apr 2006 Changed creation of Python joystick/tracker events to match minor change in interact 21 Apr 2006 Added event creation code for joysticks, trackers. Viewer program can config input devices from file and polls/dispatches in main loop 18 Apr 2006 Added stdin option for reading successive files to display, so can be used for slide shows, directory walking, etc. Tweaked code for IRIX build, not done for a while 13 Apr 2006 L key reloads current scene Standard scene loader doesn't allow input, extended initialization by viewer does Use of Skip() doesn't really match wxPython, went back to old design where handler returns special value instead Switched input handling to C++ object, moved a lot of state vars out of globals Cleaned up dispatch code from C++ object to Python handlers 4 Apr 2006 py3d.input devices are wrapper around redesigned interact device Switched Python events to embed interact LWEvent Event handlers stop dispatching when evt.Skip() applied 29 Mar 2006 Fixed glitch: keystroke handled by Python code wasn't stored in App->prevKey Forgot to increment Python refcount for each use deck viewpoint py3d.input adds device retrieval methods (keyboard(N) etc) to the deck module. Fixed bug: forgot to write code that responded to window show or hide events! Now CPU load actually drops when viewer isn't displaying. Added Py3dFinalize call from main to handle extended clean up which will be needed in future Resetting viewpoint with keystroke or Python code also works for orientation in 3rd person 25 Mar 2006 Correct py3d.input initialisation worked out after much and error. Events can be dispatched on individual input devices 24 Mar 2006 Online help only displayed for F1 or same key twice in a row If garbage collection error occurs in Python, report it but also put file on notify queue so automatically re-executed which usually fixes the problem Changed textmod to text3dmod, as want to handle 2D fonts in the future 23 Mar 2006 Added geo.quadricCurve primitive 10 Feb 2006 scene.end with parameter now unwinds to that group/matrix, can be used to replace sequences of ends() and makes apply unnecessary. 2 Feb 2006 Added geode.recolor message for changing after creation 30 Jan 2006 Fixed bug: toupper leaves cursor keys unchanged when they come from XEvents on local machine, but mangles them from synergy network keyboard/mouse sharer. Changed keystroke handler to explicitly handle upper/lowercase letters. 3 Jan 2006 Rewrote PF <-> LH matrix translation to just swap columns insteading of multiplying by rotation matrix 23 Dec 2005 Decided that animation engines should not be iterators in Python sense, as always return same value per frame. 'P' key also prints out current speed as well as location 21 Dec 2005 Added values() method to matrix objects that returns tuple of 16 floats 20 Dec 2005 Started again on texture module, this time sticking to minimal design. Texture loaded from file, displayed as simple quad, with alpha channels. Added Photoshop loading code 19 Dec 2005 Started on texture module, changed mind several times. 5 Oct 2005 Added engine.delta as time difference between this frame and the last, since constantly using in animation 27 Sep 2005 Changed light default on value to FALSE after watching students working with shading lab 25 Sep 2005 Built in pulse engines support Python iterator protocol 22 Sep 2005 Added traversemod which isn't actually a Python module yet but does have code for walking scene graph. Shaders can apply themselves recursively to branch as well as individual nodes 21 Sep 2005 Added non-animated switch nodes to group module. 19 Sep 2005 Decided that single intensity value only should apply to light levels, not all RGB. Decided having multiple -shader options was silly, just single -shade. (Default in future?) 16 Sep 2005 Fixed glitch: distant lights created with default position of (0,-1,0), not (0,1,0) RGBA colors can be passed as single floating point intensity level as well as tuple of 3/4. 15 Sep 2005 Shortened light.spotlight to light.spot Took light.set method out of doco for the moment, while I decide whether to keep it or write custom get/set attribute code Fixed bug: had two sided lighting turned on but also backface culling, so other side never visible! Cleaned up lighting config by using scene gstate rather than pfEnables Wrote better lights/materials demo, also for teaching CG 10 Sep 2005 Added spotlights Lights automatically added to top level of scene graph when switched on and no other parent exists 5 Sep 2005 Added -fn option for setting HUD font, later GUI? Cleaned up file watch checking/start code a bit, added user data parameter to notify callback. Added millisleep at end of main program so child threads get a chance to finish cleanly. 1 Sep 2005 Minor release number taken from top level build and displayed at runtime Accepts -window option for window size and offset Wanted to change light direction/position parameters to "from" to match RenderMan, but that's a Python reserved word :-( Changed distant lights to use "position" as equivalent to "from", even though IMHO more confusing than direction, as this matches OpenGL and RenderMan. 30 Aug 2005 Updated engine doco to mention new engine parameters. Removed unused state var from engine data 23 Aug 2005 Fixed problem: offseting for SWING engines didn't work properly, couldn't have exactly half out of phase. Most engine parameters can be floats, not ints. 16 Aug 2005 Fixed bug: scene.detach with parameter crashed because passed Python type by value rather than address to PyArg_ParseTuple. 11 Aug 2005 Added -python option which passes all subsequent command line options to Python sys.argv list. 9 Aug 2005 Fixed silly bug caused by name clash between parameter and instance variable, memory queue corrupted the heap on second use. Clicking on viewer window close box shuts down cleanly rather than clobbering program and leaving PF semaphores in use 5 Aug 2005 Update queue now warns and continues if unable to resize, although probably unlikely to ever happen Fixed silly bug: core dumped if file on command line didn't exist! If directory given on command line, looks for dir/main.py3d. Will be used in later point to point network version (?) Added general memory insert to message queue 31 Jul 2005 Updated pfpy3d man page to match current program 15 Jul 2005 Changed light.RGB, etc to shader.RGB Fixed bug: text.style parameters got reordered while I was updating type checking code, broke existing presentations 14 Jul 2005 Lighting model has plain RGB, RGBA with transparency Deck can set lighting style as well as wire Moved Python fog from deck to scene module. Cleaned up implementation code and removed separate fog global 13 Jul 2005 Created matte material from Python and applied to geometry Wrote implementations for plastic, metal, and direct material specification methods Changed App->lighting globals into a style rather than boolean 12 Jul 2005 Distant lights check that direction vector not all zero Added on() method for lights Added set() method and printable representation 11 Jul 2005 Added distant and point light sources 9 Jul 2005 Wrote custom argument parsing function for RGB colors, replaced hand written code in various modules Cleaned up Python routines to use standard O! type checking where appropriate instead of checking by hand. Removed pf prefix from Python type names, less confusing if future implementation uses open scene graph Cleaned up ambient lighting code 8 Jul 2005 Created ambient light from Python 4 Jul 2005 Python scene module now has access to app pfScene if needed Added stubs for light module Moved file modification time out of global shared data, so future version can store for multiple files 3.1 release 2 Jul 2005 -wire option now sets wireframe rendering, will have similar -shade option for texturing, etc Added matrix.inverse method 1 Jul 2005 After much hacking around, implemented deck.getView() as returning animated matrix that autoupdates with current deck view matrix. Can build HUDs, track user, etc 27 Jun 2005 Renamed deck options to pyFAR, etc. Considered changing message name as well and adding Performer enable/disable code, but decided too complicated. Added py3d.debug method for use by scripts 3 Jun 2005 Simplified mouse button code, previous code perhaps too clever and causing occasional mouse lockup problems. Deck C++ object now has access to Python deck module dict, can retrieve config values. 27 May 2005 Wrote placeholder geo.dynamic method for later animation Added signal handler/longjmp code to intercept Python garbage collector calling abort() if it finds a bad ref count. Fixed glitch: file got loaded explicitly by main viewer and then straight away again by file watcher 26 May 2005 Handles file becoming unreadable by removing from display pfQueue doesn't work for threads? Bug? Must be forked? Wrote simple thread-safe message queue class 3.0.1 release 25 May 2005 Added Python software license notice to startup message and onscreen reminder. Rewrote file watching code to use separate thread and queue, will be easier to add network listening later on. 13 May 2005 Fixed bug: geo color was carried over between script executions geo.gradient isn't much use because can't be applied over multiple bits of geometry: decided to remove for now. Rewrote detach to not return object, as that can create multiple Python objects wrapping single Performer node 12 May 2005 Tried storing Python reference in Performer data slot as cross-reference, caused new crashes rather than remove old 10 May 2005 Python errors in animation engines now printed to console like regular errors Wrote man page for pfpy3d 5 May 2005 Fixed bug: SWING didn't work for native pulse engines Fixed bug: text style couldn't have alpha value in color 3 May 2005 Added version retrieve and check for required version methods to py3dmod Decided to cut down pfpy3d to just file viewer, no whole directory. Networked LRMP will do full shared dir. Fixed Python reference counting problem on exit by doing Py_Finalize before pfExit Fixed bug: geo.box still used Performer coord order Changed geo Python methods to accept optional alpha in color, gradient 2 May 2005 Updated HTML references for matrix, etc to include group reference animated matrix, switch objects are also Python groups. Sequences are not: need delay per child. 29 Apr 2005 Decided that scene.branch() is not a good idea until work out better Python/Performer cross-referencing, as it would allow multiple Python objects referring to single PF Cleaned up code by writing utility functions to check if Python object is drawable node or group. Wrote group add, remove, swap methods and HTML reference. Tried implementing sprite node, didn't work. :-( Added layer groups. 28 Apr 2005 Started new group module for groups (duh), billboards, layers, maybe LOD nodes? 27 Apr 2005 Added scene.branch() to retrieve current branch scene.begin reported as error if scene.apply used within same branch, avoids confusion scene.draw(None) is treated as NOP rather than error 21 Apr 2005 Added keystroke to toggle programmable viewpoint on/off Can getDeck from C code as well as set 15 Apr 2005 Performer viewer renamed to pfpy3d 14 Apr 2005 Changed display to report position in standard left handed 3D coords by swapping Performer y,z Added -old option to revert to Performer coords in config and script files if necessary. Deck viewpoint can be set more than once by script, so can write guided tours and flythroughs. Deck viewpoint now in LH coords, not Performer All regular and animated matrices use LH coords in Python, converted to Performer internally. Geometry functions use LH coords. Left quadrics as is, just need to change doco that revolved around Y instead of Z (TODO: maybe should rotate around Z?) All demos updated to new LH coord space 3 Dec 2004 Fixed bug: wiremod created wrong value for STYLE_LINES 30 Nov 2004 Fixed memory leak bug: Python transform engine wasn't releasing Python object returned by function, which had a reference to Performer matrix as well, which eventually overflowed arena. 29 Nov 2004 Swapped order of scale, color parameters in text style because use color much more often than scale. 26 Nov 2004 Edited doco to show parameter default values Python book style rather than multiple definitions where appropriate. Add "." to sys.path in Python initialisation so scripts can import from same directory Shortened Python constant names for beat, clock 24 Nov 2004 Changed viewpoint setting to single function deck.view that takes either xyz,hpr or matrix 18 Nov 2004 Added standard Performer model load as well as wireframe. Dropped text fontpath function, replaced with general Performer path. 17 Nov 2004 Fixed bug where reloading script with switch animation caused crash. Engine mod over 1,000 lines: decided to split into engine and animate modules Tutorial had some old usage, brought up to date Fixed bug: path extension code didn't insert ':' when appending to existing 16 Nov 2004 Finished working and not too complex sequence 12 Nov 2004 Switch children can be given when created Big search and cleanup on error handling to use appropriate types and always generate message 11 Nov 2004 Added switch engine 10 Nov 2004 Generator functions work as pulse engines 8 Nov 2004 Added general purpose Python transformation engine 2 Nov 2004 Added Python pulse generators 23 Oct 2004 Added bias parameter to engine.pulse Implemented translation engine 8 Oct 2004 Decided that original matrix style with SCS by default better suited to usage, changed matrix methods back 6 Oct 2004 Fixed bug: deleting engines from Python that weren't referenced from the scene graph caused segfault. 3 Oct 2004 Worked out engine/flux hierarchy so can create pulse generator engines using clock/beat as source. Finished simple native pulse generator for cycle or swing range based on beat or clock 30 Sep 2004 Tweaked engine.tempo so always returns old/current value 23 Sep 2004 Added routines for changing tempo from Python or interactively 22 Sep 2004 Started task module, implemented clock and beat variables 21 Sep 2004 Cleaned up scenemod code to remove tiny C functions only called once from Python equivalent. Fog command line option now just enables, like lighting. Deck module can set parameters. 17 Sep 2004 Added scene.apply function so can add transformations without having to remove them again with prev(). 16 Sep 2004 Added skeleton geode class for geometry objects. Will be useful later on (I hope) Changed push/pop to grow/prev as people get confused since scene graph isn't really a stack. Left old names in Python dict for backwards compatibility. 14 Sep 2004 Decided 2D list/tuple structure for matrix.make more trouble than worth, back to 1D sequence. Added linear fog method to deck module 13 Sep 2004 Added matrix.make method for creating matrices directly from 4x4 or 4x3 Python matrix of numbers. Fixed bug: earlier mucking around with diagnostics had removed code that printed out executing filename to console 14 Aug 2004 Added Python interface for Bezier triangle patch 30 Jul 2004 Fixed bug: would crash when run with multiple channel VR config due to use of pfOverride from app process. 16 Jul 2004 Rewrote user navigation code to work with matrix instead of xyz, hpr pair. Revised deck module, wrote HTML doco Added string representation methods to Python matrix objects 15 Jul 2004 Rewrote bits of text module to have similar state-render usage pattern as geometry module. Wrote HTML doco for textmod 14 Jul 2004 Switched all scene graph objects to new wrapper PF type First scene with updated matrices! Added text module from slideshow View config overrides lighting to be on/off 13 Jul 2004 Implemented Python superclass type object for Python wrappers around Performer objects Implemented Python type object for matrices. First messages sent to Python object! 10 Jul 2004 Switched to unified key callback Use makedepend for Makefile dependencies Merged collect.cpp code into py3dmod 9 Jul 2004 All modules given py3d prefix to mimic package organisation 8 Jul 2004 Use Py_RunFile instead of Py_RunSimpleFile, catch error messages and display in window instead of stderr. (Viewer, not loader) Use snprintf instead of sprintf 9 Jun 2004 Changed tri, quad, bilinear, bezier mesh Python calls to take 2D sequence instead of explicitly passing nu, nv for 1D array. 8 Jun 2004 Added S key shortcut for taking screen snapshot. Result is SGI image format, GIMP can open Added pfInitClock and pfuEvalTimers to main event loop 17 Mar 2004 Makefile consistency tweaks for py3dview distrib 27 Feb 2004 Brought up to date with current versions geoshape, etc (HACK: quad, tri strips need to be replaced by mesh form) 9 Dec 2003 Added command line and keystroke options for culling 26 Nov 2003 Bezier, bilinear, polyhedron functions check that vertex lists have the right number of entries 21 Nov 2003 Matrix translate/rotate/euler functions accept (xyz) tuples as well as separate parameter values. Use Python 2.0 utilities for creating integer constants instead of creating entries in dictionaries (that could be modified!) Added Python interface for new geoshape polyhedron primitive. While doing so, shortened sequence handling code 30 Aug 2003 Builds linux shared library loader Decided "display" module had boring and not very accurate name, renamed as "deck" It is now official: this is not the shared world viewer! Removed directory code, will motivate me to finish networked shared world version 21 Aug 2003 Started new engine module for creating autonomous animations. Just rotation around axis per-frame for now. 18 Aug 2003 Command line options -1st, -3rd for view type and giving VR config only assumes 1st person if no command line option. Moved wireframe loading code into new module named 'wire' Added Python call for creating wrapped subtrees 8 Aug 2003 Removed animation matrix experimental code Put back P key for printing location, orientation Fixed bug: needed to export dynamic symbols when linking app for native imported modules such as math to work. 7 Aug 2003 Brought up to date with new versions of velab, interact, geoshape Successful build on Linux Added mouse wheel navigation 10 Jul Added matrix methods for creating shear and quaternion matrices 9 Jul Debug numerous glitches in how Python scripts and command line set display parameters 8 Jul Python scripts can set background color, viewpoint, render style if application permits 7 Jul Removed pfFrame() call when file reloaded Added checks for null node in Python draw, push methods to avoid crashing the program from cascaded errors. Matrices now dynamic by default, Python can force static 20 Jun Added new wire.load Python function and command line option so can use Performer database loader within py3d scripts. Wrote Performer database loader for importing Python3D into other Performer apps such as perfly 19 Jun Replaced various command line options with a single -style, including capability to not set at all 18 Jun Decided to put back directory watching code so can demo single/shared modelling with same program. Still has security/scaling issues of original. 16 Apr Wrote Python interface for new colorPoints and triMesh routines in wireframe library 24 Jan Found odd side effect: rendering state isn't preserved around scripts, so last color set is still in effect when reloaded. Difficult to fix due to way Python does lazy initialisation of modules, and only affects scenes that rely on the default color being white anyway 22 Jan push/pop mismatch check only done if script didn't have errors, prevents spurious report 20 Jan Initial viewer position now roughly calculated from scene bounds for better initial display Fixed bug: bilinear/bezier Python routines reported false pasing error when given optional size parameters 17 Jan Brought up to date with current wire lib release 15 Jan Added -wire option for non-hidden surface display 10 Jan Memory management code uses pfAsyncDelete, seems to have stopped crashes and doesn't leak Added check at end of script that pushes/pops balance 9 Jan Wireframe code uses custom channel draw proc which interferes with custom proc needed for stereo :-( Changed to code to use VRView for display, runs in window by default. 8 Jan Discovered still have bugs in memory management. Aaargghhhh!!! Added dynamic function to matrix mod for creating DCS nodes. Decided not to implement updates yet Python scene graph flattened after load Matrix module now creates SCS by default 7 Jan Changed Python modules to use common memory management routine instead of duplicating every mod Split reference into one page per module 6 Jan 2003 Removed directory scanning and deleted file code. Decided to create new individual use py3dview for single files, put shared world version on hold.