GEM ONLINE DOCUMENTATION CHAPTER 5: RELEASE NOTES

---------------------------------------------------------------
---------------------------- 0.91 -----------------------------
this is the first release for 3 years, codename 'tigital'
it includes many changes, so probably i have forgotten most...

openGL runtime checks: GEM now uses GLEW to detect openGL-features 
	at runtime this allows you to use all the cool features of 
	your brand-new graphics card with the same binary as you 
	used for your old gfx-card...cool

w32-installer: there is now a w32 installer (based on NSIS) to 
	ease the installation of GEM on windows.

single vs dual context: GEM uses a dual context approach to establish
	a valid openGL-context at startup;
	you can now turn this OFF by setting the environmental
	variable "GEM_SINGLE_CONTEXT=1"
	this should allow you to work if GEM crashes otherwise

SIMD: better MMX/SSE2 handling

pixes:	fiducial tracking, artoolkit,
	multitexture, texture sharing
	recording streams of images into movies,
	better movie reading support, better video in support,
	more sophisticated pix_buffer handling
	shared memory objects

text:	allow unicode characters
	use vera.ttf as default font instead of the
	copyrighted arial.ttf
	allow to override the default font with the environment
	variable "GEM_DEFAULT_FONT"


bugfixes: like always we have removed (and introduced) numerous
	bugs, so all in all GEM should now run more stable
	for an incomplete list of fixed bug see the bug-tracker
	at http://sourceforge.net/projects/pd-gem

openGL: generally use openGL-2.0 (if available)
	vertex/fragment shaders (GLSL and ARB/NV)
	framebuffers


deletion:
	MarkEX has been removed from GEM and is now available as
	a separate library;
	hardware-interfacing objects like [gemorb] and [gemtablet]
	have been removed




---------------------------- 0.90 -----------------------------
this is the same as 0.888
just a naming issue

---------------------------------------------------------------
---------------------------- 0.888 ----------------------------

this has taken a long time (2 years...)

development is now done by several people:
	chris clepper
	günter geiger
	daniel heckenberg
	james tittle
	IOhannes m zmölnig <zmoelnig@iem.at>
günter has removed himself from the splash-screen, but he still contributes stuff

supported platforms: windows (XP,2000,...), linux, and (tadah:) macOS-X(>10.2)
irix-support seems to be broken, but i cannot prove it

architecture: up till now, the rendering-tree was statically built when rendering was
	turned on, so you couldn't add objects dynamically and editing was painful.
	now, Gem utilizes the normal pd-messaging system all the time: you can disable 
	parts of the rendering tree with [spigot], render sub-trees multiple times with
	[t a a] and put objects into the gem-tree on the fly.

documentation: added help for (almost ?) all Gem-objects (excluding openGL-wrappers)
	new reference-patches are now working out of the box (not the old "abstract" way)
	added a small pdf-tutorial


openGL: GEM features now a full openGL-wrapper (supporting openGL-1.2)
	you can use any openGL-command like "glNormal3f" by creating a pd-object like
	[GEMglNormal3f] (note the "GEM"-prefix); this should be very powerful, 
	however most of the objects are not (yet) tested. 
	if you intend to use them and think they don't 	work, 
	send me a bug report for the objects you need; 
	i will try to fix them gradually.
	there will be not much help in GEM, since you might consult any openGL-reference

text:	we now use FTGL instead of GLTT (which is still available at compile time)
	for freetype-rendering. this is supported on all 3 platforms, 
	looks better (at all sizes!) and allows the new [textextruded]

geos:	tube, curve3d, rubber, ripple, slideSquares, newWave

manips:	polygon_smooth for anti-aliasing of single objects
	[camera]

controls: the output of [gemmouse] can now be normalized (by giving the maxVal for x/y as
	arguments: [gemmouse 1 1] will output coordinates between 0..1, no matter what
	dimensions the screen has.

particles: now the underlying libparticle-engine can be used more directly.
	velocity-domains (like [part_velcone]) are deprecated and [part_velocity]
	should be used instead (allowing on-the-fly domain-switching)
	there are objects that allow to influence single particles 
	(like [part_vertex])
	most interesting: with [part_render] and [part_info] you can now use any
	geo as particles (e.g: .obj-models) not only points/lines as before.

texturing: [pix_texture] and [pix_texture2] has merged. so [pix_texture] will texture
	textures of any size (even non-power-of-2) and it will use hw-support if available
	(at least on macOS and on linux if the gfx-card supports it
	(at least nvidia does so))

pixes:	lots of new objects (too much to enumerate them here)
	we now support 3 different colorspaces: RGBA, YUV, Greyscale
	YUV is new and allows processing of coloured-images with far less memory/CPU
	than RGBA (factor 2) but without alpha.
	lots of pix-processing on apple-computers is ALTIVEC-enhanced (faster by numbers!)
	SIMD-enhancements for PCs (MMX/SSE2) is yet to come...
	as the new colorspace has been pushed, also a lot of objects has received 
	greyscale-support
	the TV-class has been deprecated and is now part of pix_* again
	lot's of color-space converters (most of them not available as objects)
	the "pix_fx"-stuff is now built into all pix-objects

video:	on mac-OS the [pix_video] object supports all cameras that are supported by the OS
	on windows there is now support for DirectShow, 
	which makes new (usb/ieee1394) cameras work most probably
	on linux there is some prelaminary(!) support for ieee1394 devices.
	the v4l-support is now multi-threaded which speeds up the whole thing significantly

film-formats:
	windows: AVI; there is also some QUICKTIME-support
	(needs the quicktime-sdk at compile time and quicktime installed on execution time),
	but this crashes sometimes (haven't found out when).
	it should enable "a lot" of file-formats (MPEG, MOV)
	macOS: quicktime serves your needs
	linux: support for libavifile, libmpeg3 (or libmpeg1 but libmpeg3 is preferred),
		libquicktime (or libquicktime4linux; doesn't matter) and ffmpeg.

codecs: macOS: everything that is supported by your system should work fine
	win: all codecs installed on your machine should work
	 (if another program can play a avi-file, Gem should be able to do so too)
	linux: depends on how you compiled Gem. libmpegX will decode mpegs,
	libquicktime will (most likely) decode quicktime-files with non-proprietary codecs,
	libavifile decodes a lot of formats (avi, quicktime, divx, asf,...)
	and you can utilize windows-codecs (.dll-files; if you have them ;-))
	which enables you to play-back 	proprietary codecs!

bug-fixes: probably lots of, but most of them seem to linger around for a while now.



---------------------------------------------------------------
---------------------------- 0.87 -----------------------------
Added much documentation

Added [gemkeyboard] and [gemkeyname] for keyboard-interaction in the GEM-window. However, Windows and Linux versions do not give the same results...

Added Red/Green stereo
Cleaned up the stereo-thing. we can switch between the different stereo-modes (including no-stereo) while rendering

You can set the title of the GEM-window with the "title"-message. Up till now only one symbol is allowed.
Added "fullscreen" mode
Fixed "border" under linux
"cursor" is now available on Windoze

readded "externals" with additional libraries to close up with the windows version::
Added pix_movie for Linux (mpeg2+quicktime-support)
Added pix_film, which is in fact like pix_movie but does not write the pix-buf directly into a texture
Fixed the model
Added the stupid "teapot"
Added a pix_write that let's you capture the current screen into a file (TIFF/JPEG)
Added pix_hsv2rgb, pix_rgb2hsv (colour-space converters)
Added pix_blob (center of gravity:: colour detection)
Added pix_curves, pix_histo
Added pix_set, pix_dump
Added pix_pix2sig~, pix_sig2pix~

Started a new class "tv" for pix-operations that change over time: like tv_movement (formerly: pix_movement), tv_biquad, tv_rtx; but i am not really happy with this...

Started a new pix_fx class for inserting pix-FX. there is not much about it, but you can now bend the image.data pointer to wherever you like (including size-changes, format-changes) it will be bent back in the postrender()-thing

Started to import classes from effecTV (by Fukuchi Kentarou): pix_aging, pix_puzzle; most of his FX are real crap, but some are ok and it's easy to import them
Made a pix_rgba


---------------------------------------------------------------
---------------------------0.84-5 -----------------------------
Bugfixes for gemwin "cursor" message (cursor [1|0])
Removed "externals" with additional libraries, they are separated now
Added a "freq" and "mode" message to Linux video object, you can watch
  TV now ...
It is possible to add the display to the create command for X windows,
  whole initialization stuff is moved into the create method,
  so you can look at the patches without having succesfully generated
  an OpenGl context.
Made the pix_video and pix_movie into real base classes of OS specific
  classes. The OS spezific classes for Windows and SGI have to be fixed ..


---------------------------------------------------------------
--------------------------0.84a -----------------------------
text2d:  added a message "alias", which toggles between antialiases
  and standard fonts. Usage "alias 1" or "alias 0"

gemwin:  additional message cursor, which hides the cursor in
  GEM windows




---------------------------------------------------------------
---------------------------- 0.84 -----------------------------
Fixed a bug where delete [] was called instead of delete.  This
could explain a lot of random crashes.

Fixed camera message routing.

---------------------------------------------------------------
---------------------------- 0.84 -----------------------------
I long time ago, I changed the behavior for gemhead, so that
matrices where automatically restored, etc.  However, this 
broke the camera object.  Use the view message to gemwin
instead.

Fixed a bug in GemMan.  If you didn't use "border 0" and you 
requested a window size with "dimen # #", then the window
size was likely to be wrong.  This is now fixed.

Fixed a bug in the view message to gemwin.  There was an offset
which should not have occurred.  You might need to change your
view messages to account for it.  Just subtract 4 from any
Z values.

There are some examples for pix_snap in
		examples/gemAdvanced/gemPixSnap.pd - Single buffered example
		examples/gemAdvanced/gemPixSnap2.pd - Double buffered example
Keep in mind that pix_snap is a fairly slow operation...I also fixed
a nasty memory bug which could easily cause crashes.

I added Miller Puckette's pix_video for linux into the
code base.

If you load a movie in pix_movie with an open message, the
object will output the number of frames to the right output.  This
will not work if you have a "pix_movie homer.avi" for your object
since the output message cannot get processed correctly at
startup.

The disk object has an inlet on the rightmost side for the
inner radius...turning the disk into a ring.  If the inner
radius value is just 0., then the disk is just a circle.

Fog can be turned on in gemwin.  Look at
		examples/gemAdvanced/gemFog.pd
for examples.  The various control messages are documented
in the gemwin.pd help patch.

These next objects are thanks to hannes - mailto:zmoelnig@iem.mhsg.ac.at
---------------------------
Added OpenGL material objects -
		ambient, ambientRGB, diffuse, diffuseRGB, emission,
		emissionRGB, shininess, specular, specularRGB
  They provide much greater control over the color of objects.
Look at
		examples/gemLighting/gem5.materials.pd
for examples.

Guenter found a bug in the ortho object.  It is now fixed.  The
ortho object has the same general unit size as the normal
perspective matrix.  Look at
		examples/gemAdvanced/gemOrtho.pd
for how to use the object.

---------------------------------------------------------------
---------------------------- 0.83 -----------------------------
Added another outlet to counter.  When the counter reaches
the "count to" value, the right outlet will send a bang.  The
bang happens after the left inlet sends its float.

Fixed a dumb bug in pix_2grey.  It didn't calculate the
number of pixels correctly.

Adding some comments to the FAQ that pix_draw is almost
always slower than pix_texture on PCs.  Basically, graphics
accelerators do not accelerate glDrawPixels().

Added rectangle and cylinder.

Cleaned up the text objects (text3d, etc).  Should display
text a bit better and manage memory more intelligently.

These next objects are thanks to hannes - mailto:zmoelnig@iem.mhsg.ac.at
---------------------------
Added pix_rectangle - creates a rectangle in a pix
Added pix_a_2grey - only changes the pixel to grey based
on the alpha component.  See the help page and the example
in manual/gem_pix/gemAlphaGrey.pd

---------------------------------------------------------------
---------------------------- 0.82 -----------------------------
Free-view sterescopic rendering is possible.  If you send 
'createStereo' message to the gemwin instead of a 'create'
message, then your rendering area will be split in two.  Send a
'stereoSep float' message to set the stereo seperation.  Send
a 'stereoFoc float' message to set the focal distance.  See the
example patch gem_advanced/gemStereo.pd patch for an example.

'color' message was registered twice in gemwin.  The second should
have been a 'perspec' message, for perspective.  This also fixes
the error which pd-0.29 gives about GEM now.

primTri is a new object.  It is a triangle primtive.  Unlike the
normal triangle object, it has 6 inlets.  The first three inlets
are for setting the vertex positions.  The last three inlets
are for setting the color at each vertex.  The color can
be either RGB or RGBA values.  Look at gem_advanced/gemPrimTri.pd
for an example.

The particle objects are now frame rate independent.  If you needed
them to run at a certain speed, you can send a multiplier into
part_head with the message 'speed float'.  Run the fountain
at 60fps to see how smooth it is.  The particles still default
to 20fps, which is GEM's default.  You can slow down the particle
systems or speed them up by sending a different speed value
into the part_head.

Thanks to Guenter for making the sgi image loader 64-bit compliant.

Received new Gnu makefiles for Linux from Guenter.

new particle objects - These all have help files.  See
gem_particles/gem6.target.pd for how the target objects work.
	part_damp - apply a damping force to the particles
	part_targetcolor - Change color of the particles toward
							the specified color.
	part_targetsize - Change size of the particles toward
								the specified size.

Added some help files, mainly for the particle objects.

Updated the FAQ.

---------------------------------------------------------------
---------------------------- 0.81 -----------------------------
On WinNT, you can remove the window border.  Send a 'border 0' message
to gemwin to remove it, or a 'border 1' to put it back.  The default
includes the border.

Fixed some bugs when in single buffer mode and in the pix_snap
object.

A bunch more help documentation is done. This includes reference pages
and the html manual pages.

The inlets for alternate and counter were backwards.

Integrated unix event handling into the code base.

Fixed other random bugs.

---------------------------------------------------------------
---------------------------- 0.80 -----------------------------
A real manual has been started!  This means that the doc directory
will not be as important.  The release notes will still be here and 
few of the other doc files, but hopefully most people will just be
able to use the on-line manual.  Look at gem/manual/index.html
to get started.

pix_movie has been added.  It automatically does the texture mapping
so you don't need to use pix_texture.  This also means that you can't
process the pix image.  This will change in the future, but I wanted
to get the object out and have people hammer on it.  Also, only
certain objects can texture the movie data correctly.  They are square,
triangle, circle, and cube.  Cone and sphere will have a black region
if the movie isn't a power of two (most movies are 320x160 or something).
This will be fixed in the future.  See gem_pix/gemMovie.pd for an example

hsv2rgb and rgb2hsv have been added.

There is no ambient lighting in the default case.  If you want
to have ambient lighting, send a message "ambient r g b" to gemwin.

On WinNT, if you hit Ctrl + r in the GEM window, then rendering
will stop.  This does not go through the normal Pd interface, so it can
be used if you accidentally create a patch which takes so much processing
that you cannot turn it off because the patch UI is unresponsive.

Fixed a really bad bug in the text rendering objects.

Various other random bugs.

---------------------------------------------------------------
---------------------------- 0.79 -----------------------------
The example patches have been organized a little bit.  There is 
now a collection of directories which are installed with GEM.
Eventually, they will be fleshed out a lot more (I hope), but for
the time being, at least there is some order to them.

The model and multimodel objects accept a "rescale 0" or "rescale 1"
message.  In previous versions, the model objects would resize your
model to fit within the unit cube (all vertices where within -1 to 1).
This made it dificult to coordinate diferent model files together,
because they would all be resized by diferent factors.  Now, if you
send a "rescale 0" message into model or multimodel, it will not
do resizing for any _SUBSEQUENT_ loading.  In other words, if you
have already loaded in a model, and you send a "rescale 0", the
currently loaded model (or models) will not change.  Look at the
example patch gem_advanced/gemModelRescale.pd for how this works.
The left model chain is much larger and a scaleXYZ object with a
value of .1 is needed to even get the model into the viewport.
The model and multimodel objects default to "rescale 1" so that it
doesn't break any existing patches.

The middle and right buttons work in gemtablet now.  The outlets
are all pretty close together now, so until you can resize objects,
it will be difficult to select the correct outlet.  Look in
examples/gemTablet.pd for all of the outlets.

I have upgraded to Visual C++ 6.0.  I doubt that the GEM library
is backwards compatible for people who are writing their own
libraries.  Sorry, but the IDE is a little less painful in 6.0.

I removed the position inlet from the light object.  If you want
to move/rotate a world_light/light, then just put a translate
or rotate object into the chain.  It was broken before, but now
there is no reason for the position inlet.

light and world_light accept a "debug" message with a value of
1 or 0.  Look at the gemLightSphere.pd patch for an example.
It was too hard to figure out where the light is, and this turns on
a sphere for the light object (since it is a point light), and 
a cone for the world_light object (since it is a directional
light).  The world_light is NOT a spot light, even though
its icon is a cone.  The icons are the color of the light.

MarkEx has been merged into GEM.  I was tired of maintaining
two libraries.  Also, people didn't seem to be downloading
MarkEx, and there are a lot of good objects in there, IMHO.

The camera object is finally useable.  It has an inlet for the
translation and rotation vectors.  Anyone who was using it
before is now broken, but the change was very necessary.

gemwin can accept a perspective message.  This will set up the
viewing paramaters for the window.  You need to pass in 6 floats
with the "perspective" message, for the left, right, bottom,
top, front, and back.  The defaults are -1., 1., -1., 1., 1., 20.
If you send a reset message to gemwin, it will reset the perspective
values as well.

The big change in this release is a particle system.  It is based
on code from David McAllister.  There are many new object, all
of which interact in certain ways.  One design issue is that
there are far too many controls and variables to be able to 
expose directly in GEM.  People who want to get complete control
over all aspects of the particle system are going to need to
write their own externals.  However, most people should be fine with
the particle objects.  The new objects are:

CREATION
--------
part_head - The start of a particle group
part_color - Set the range of colors for the new particles
part_size - Set the size of new particles
part_velsphere - Set the velocity based on a sphere distribution
				 You need 4 args - xvel, yvel, zvel, and radius
part_velcone - Set the velocity based on a cone distribution

part_source - Generate particles

MANIP
-----
part_follow - Particles will follow each other like a snake
part_gravity - Have the particles accelerate in a direction
part_killold - Remove particles past a certain age
part_killslow - Remove particles below a certain speed
part_orbitpoint - Orbit the particles around a specified point

part_draw - Apply the actions and render the particles.  Accepts a
	message "draw line" or "draw point" to change the drawing style.

Look in the example files to get some idea how to use the particle
objects.  Notice that you still need a gemhead starting off the
chain, but after that, you just use the part_* objects.  Regular
GEM manips like rotate, translateXYZ, and scale will affect the
particles.  In general, you start with part_head, then modify
the particle parameters with the creation objects like part_color
and part_velocity. Then use part_source to actual generate the
particles.  Next in the chain, use the manip objects to control 
the particles behavior.  When you actually want to display the
particles, use part_draw.  Make sure that you remove particles as
well.  The best method is probably with part_killold.  If you 
don't remove particles, then you will eventually not be able to
add any new ones (the default number of particles at once is
1000, set by part_head).  You can also slow down the rate of the
particle generation with the part_source object.

---------------------------------------------------------------
---------------------------- 0.78 -----------------------------
If you don't want GEM to take control of the tablet if it finds 
one, set the environment variable GEM_NO_TABLET to the
value "1" (no quotes of course).  There will be a print out if
GEM finds the environment variable.

I added a few more setup access function so that people who
use "-lib gem" or "-lib GEM" will work correctly.

Lighting will now work under single buffer mode, but you have
to destroy then create the graphics window to change the mode.  This
will not work with the GEM_SINGLE_CONTEXT variable.

pix_data is a new object.  It outputs color information from a pix.
    The first inlet accepts a bang to trigger it.
    The second inlet accepts a gem list (probably from pix_image)
    The third inlet is the x position (between 0 and 1)
    The fourth inlet is the y position (between 0 and 1)
    The first outlet is the gem list
    The second outlet is the color (an RGB list)
    The third outlet is the gray scale value (a float)
  See the example patches gemPixDataSimple.pd and gemPixDataComplex.pd
for possible use.

Fixed a pretty bad bug in the SGI image loading.  Basically, unless
the image was RGBA, it was going to core dump.  Also, the orientation
was wrong.

---------------------------------------------------------------
---------------------------- 0.77 -----------------------------
GEM is now under the Gnu Public License.  This should not affect
any one.  I also cleaned up the license information for the AuxLibs.
All of the license and usage information can be found in
GEM.LICENSE.TERMS

GEM has a new home - http://www.danks.org/mark/GEM

gemorb - a new object to interface with the SpaceTec SpaceOrb360.
It is a 6DoF ball with 6 buttons that connects to your serial port.
It is a very cool device, and is relatively cheap ($50 US).  If gemorb
is able to connect, it will print out a message, or an error if there
is a problem.  John Stone wrote the library.

There is a particle system with a number of new objects.  The system
uses a library by David McAllister.
ps I haven't had time to bring all of the objects online.  particle
is the only object right now.  It just creates a fountain.

accumrotate was added - three inlets to control the rotation.  Each
time a new value is sent in, it increases the rotation.  Sending
'reset' to the leftmost inlet sets the rotation matrix to
identity (ie, it resets it to no rotation).

rotateXYZ was added - three inlets to control the rotation.  Order
is X rotation, then Y, then Z.

The tablet cleanup is a little better now on WinNT.  There are still
some bugs, like it doesn't return to normal mouse usage after GEM exits.
However, the DLL is being released correctly...I just need to reset
to the default state somehow.

Cone and sphere have changed behavior as of 0.77.  The middle inlet
is now the size and the right inlet is the number of slices.

depth used to be sending '1' would turn on depth testing, but this
was conceptually wrong.  It should be 1 to turn on the depth
object (which would disable depth testing).  This is now the
current behavior.

ortho was added.  It changes the viewing from perspective to
orthogonal.  The size is the size of the window with (0, 0) 
being the lower left corner.  I made this object for creating
a background the size of the window, but you can probably
find other uses for it.

There is a matrix class for those who are writing objects.
It is in src/Base/Matrix.

---------------------------------------------------------------
---------------------------- 0.76 -----------------------------
Fixed a bug in spline-path.  I wasn't doing the knot logic 
correctly.  Thanks to Patrick Rost for finding this.

A bunch of internal changes to get GEM working with Pd 0.22
All instances of A_INT went away and the inlets and outlets are
created in the correct "logical" order now.

---------------------------------------------------------------
---------------------------- 0.75 -----------------------------
You can resize the window under WinNT and the viewport will change
to reflect the new size.

Also, the correct aspect ratio is maintained no matter what the
width/height ratio is for the GEM window.  The ratio is 
x:y -> (width/height):1.  This is currently only under WinNT.

gemmouse and gemtablet are new objects.  They currently only
work in WinNT.  You should be able to create the object in
the Irix/Linux versions, but you won't get any output.  See
gemmouse.pd and gemtablet.pd for examples.
gemmouse outputs the current mouse position and button up/down
for the GEM window.
gemtablet outputs the current pen position, pressure, orientation,
and pen up/down, with the GEM window mapped to the tablet.  If
GEM can connect to your tablet, a message will be printed at startup.
If you don't see a message at startup from GEM about connecting to
the tablet, then gemtablet will not output any values.  You must
have the wintab32.dll library installed.  Your tablet's installation
should do this.

Added a bunch of utility functions (spline, bias functions, etc).

linear_path and spline_path are new objects.  If you give them
an array, then they will generate a point from an index.  linear_path
will linearly interpolate between points.  spline_path uses the
points as knots for a curve.  See gemSplinePath.pd and
gemLinearPath.pd for examples.

Added __declspec declarations for Windows.  This should
make it easy for people to use GEM as a dll.

---------------------------------------------------------------
---------------------------- 0.74 -----------------------------
I replaced the images in the example directory with JPGs.  They
are alot smaller.  However, in gemMoveImages.pd, you can see
the effect that the compression has.  Look at the red dancer. All
of the "black" should be alpha masked out, yet there are little
bits which get all jaggy.

Got gltt-1.8  Looks like it fixes a bunch of bugs.

Finally put an alpha test into the alpha object.  This means that
if the alpha of a pixel == 0., then it won't be put written into
the frame buffer.  Look at the example file gemMoveImages.pd for
an example of this.  Notice that the dancer is texture mapped to
a sphere, yet you can always see her correctly.  You can disable
this behavior by sending a 'test 0' to the alpha object.

Oh boy, were my texture coordinates off.  Unknown to me, my reference
image (dancer.tif) was actually upside down.  This meant that all
of the texture coordinates in the Geos objects were compensating
for the rotation.  Sorry if this messes anyone up, but it is now
correct for all of the geos.

I also now load in images in OpenGL format.  This means that
data[0][0] == lower-left corner.  This shouldn't have any effect
on anyone unless you are doing position sensitive image processing.

Fixed the orientation problem when using pix_draw.

imageVert handles gray8 pixes

Fixed a problem if pix_multiimage loaded in images that were different
formats or sizes.

GEM supports search paths!  Basically, GEM will look for auxiliary
files (images, models, fonts, etc.) from whatever directory the
patch is in (unless you use an absolute path name with '/').

---------------------------------------------------------------
---------------------------- 0.73 -----------------------------
Fixed profiling on Unix

Added text2d, text3d, textoutline.  The text objects will render
a truetype font (I have provided a couple fonts in gem/examples).
text2d renders a flat bitmap...no rotation or Z movement.  text3d is
full polygonal text, so you can translate and rotate.  textoutline
is also polygonal, it is just a vectored outline.
    PS text2d has some problems...

JPEG and SGI image file formats are supported!  Depending on the number
of color components, GEM will automatically convert them to grayscale
or RGBA (just like TIFF files).

pix_video is working slightly on WinNT.  There are still some
serious problems, so consider this version a complete pre-alpha.  I'm
releasing a version now to find out if it even works on other systems.
I am using a Connectix QuickCam2.

Shifted all of the auxilary libraries into a common directory.  Considering
that I'm currently using 6 outside packages, it is just easier.

---------------------------------------------------------------
---------------------------- 0.72 -----------------------------

Did a bunch of cleaning so that the Linux compile is happier (and easier).
This involved getting rid of some warning messages and changing
the makefiles slightly.

The strange core dump on WinNT went away...

All of the code and extra files are under source code control (CVS).
You can just ignore the CVS directories. Eventually, I will try to keep
them out of the release build.

Added profiling.  If you send 'profile 1' to gemwin, then normal profiling
is turned on (GEM displays the number of milliseconds per frame).  If you 
send 'profile 2', then images will not be cached (ie, the pixes will always
be processed).  If you send 'profile 0', then profiling is turned off.

pix_multiply multiplies the color components of two images together.
It doesn't modify the alpha channel.

Optimized pix code.

Because Miller is removing the INT type, I have slowly been moving it
out of the code.  If any objects have stopped working, please let me know.
I redid the construction macros in CPPExtern to reflect this change. 
If you have made any new GEM objects, you will probably need to
change to the new macro format.

Most of the dual input pix objects will process gray8 and RGBA data
gracefully.

---------------------------------------------------------------
---------------------------- 0.71 -----------------------------

Guenter got GEM working under Linux!  The biggest impact is that I
have changed all of the #ifdef __sgi to #ifdef _UNIX_ If specific versions
of Un*x need certain things, then they can be #ifdef'ed with __sgi,
or LINUX, or whatever.

Fixed a bug in polygon and curve.  I'm not sure why it ever worked on
the SGI...

All pix objects accept a 0 or 1 to turn on and off their processing.
The 0 or 1 should just be sent to the first inlet.

The inlets were backwards for colorRGB.

Fixed a bug in turning on and off texture mapping in pix_texture.

GemMan::initGem is now called from Gem_setup.  There seems to be a problem
with Linux creating the dummy static class to initialize GEM.

Changes pix_texture so that it deal with OpenGL 1.1, GL_EXT_texture_obj,
and base OpenGL 1.0  I think that every OS has the texture_obj
extension, but just in case, I also have the OpenGL 1.0 technique of display
lists.

Removed some spurious print outs.

I looked into using GL_BGRA_EXT for images on Windows.  It is faster
in the software version, but my Intergraph card doesn't support it.
It only makes a difference for OpenGL in software...and texture
download time isn't the primary problem then.  With a 512x512 image
using glDrawPixels in software, I got 6 frames/sec with RGBA and 7
frames/sec with BGRA_EXT.  Older SGIs like ABGR_EXT, but the newer machines
want RGBA.  Looks like I'm going to stick with RGBA for a while.

You can now load in Gray8 and RGBA images and they will retain their
format.  Before, everything was slammed into an RGBA image, with A == 255.
This means that you can have alpha masks on images, etc. The only pix
object which can currently handle a gray8 is pix_mask.  All of the other
pixes throw errors if they get a gray8.  This will slowly be fixed.

Added some new functions to GemPixUtil (from a paper by Alvy Ray Smith).
They should speed things up. Currently, only pix_composite is using them.

The color channels of pixels should be gotten by the const ints that
are in GemPixUtil (for instance, chRed, chGreen, etc).  Using hard coded
offsets like 0 or 2 for red and blue is asking for trouble.

gemheads no longer push and pop the entire matrix state when renderGL is
called. This should be faster (push/pop is slow on some platforms).  Also,
all objects are required to "reset" the OpenGL state when they are done,
so it shouldn't be neccessary.

Strangeness: There is an unreferenced memory exception on WinNT when you
quit Pd. However, it only happens if you use pix_image.  It doesn't
happen while you are using Pd, only when you quit...

---------------------------------------------------------------
---------------------------- 0.70 -----------------------------

All geos can now accept a size argument (they default to 1.0)

I cleaned up the texture coordinate mapping.  The order was slightly
random before. The order is more logical now; it is counterclockwise
starting at 0, 0.  If you use pix_coordinate any where, you will need
to fix the values.

Fixed a bug in translateXYZ.  The inlets where backwards.

You can now move the GEM window under NT.  NT doesn't automatically
take care of the basic window functions unless you pass the messages
through (unlike X Windows).

Texture mapping can be turned on and off by sending a 0 or 1 to pix_texture

Texture mapping defaults to GL_LINEAR.  Send a quality message to pix_texture
to change this. A "quality 0" means GL_NEAREST, "quality 1" means GL_LINEAR.

---------------------------------------------------------------
---------------------------- 0.69 -----------------------------

Fixed a bunch of bugs in imageVert.

Cleaned up some lingering problems in various objects (the open message to 
pix_multiimage didn't work as advertised for instance).

Setting window color is now dynamic.

multimodel now exists.  Works just like pix_multiimage, only it reads in 
Alias/Wavefront files.  It also has a caching mechanism.

---------------------------------------------------------------
---------------------------- 0.68 -----------------------------

fixed pix_2grey so it uses real color weights, instead of just averaging
the three colors.

pix_image now works the same way as pix_multiimage.  If you load in an
image which another pix_image has already loaded, they will share the
image.  This means that if you create a bunch of dummy pix_image
objects, you can send an open message to pix_images which have a gemhead
connected to them and get instantaneous image changes.

Found a MAJOR bug in the NT version of pix_texture.  Basically, if you
used it, the program would core dump.

Found another bug in square.  It involved texture mapping and texture
coordinates (mainly when you don't designate them).

Changed the default values for scaleXYZ (to 1, 1, 1) and translateXYZ
(to 0, 0, 0)

---------------------------------------------------------------
---------------------------- 0.67 -----------------------------

Forgot to add the arguments for the scale object.  This has been fixed.

Added translateXYZ, scaleXYZ, and colorRGB.  These create three inlets
which you can modify, instead of having to mess with vector messages.

Fixed a bug in pix_image and pix_multiimage (or more, an unacceptable
response to user error).  Basically, if you started rendering without
an image being loaded (or if an image failed to load, then you were
_VERY_ likely to core dump.  A check has been added, so this shouldn't
be a problem anymore.

pix_multiimage HAS CHANGED!  It accepts up to four arguments:

filename, number : will load the image files from 0 up to AND INCLUDING
the number

filename, lownum, highnum : will load the image files from the lownum up
to AND INCLUDING the highnum

filename, lownum, highnum, skiprate : will load the image files from
the low num up to AND INCLUDING the highnum, but incrementing the counter
by the skiprate, not by one.

No matter how many images are loaded, you can change which image is
displayed by sending a number.  The number must be between 0 and the
number of images which were loaded (notice that this number may not be
the highnum!)  If you try to display an image out of range, you will
get an error.

pix_multiimage now uses a shared cache.  Basically, if you give two
pix_multiimage objects the EXACT same values (filename, base number,
top number and skip number), then they will use the same collection of
images.  This will save massive amounts of memory if there is any
commonality between pix_multiimages.

pix_flip - see help file

---------------------------------------------------------------
---------------------------- 0.66 -----------------------------

Finished the port to NT (mainly had to get images working).

Made pix_colormatrix - This is really good for things like saturation,
hue rotate, etc.  I will eventually include a bunch of matrices to do
cool stuff.  Check out Paul Haeberli's paper on color matrices at
http://www.sgi.com/grafica/index.html

I removed pix_color.  It was a hold over from earlier days and I
don't think that anyone (including myself) is using it any more.

I got a title bar onto the graphics window, but you still can't move it
around.  I am not certain why this is the case, but I'll keep looking.

I made general speed ups to most of the pix objects.  Mainly, I have
been removing GetPixel() and SetPixel() functions (they have a lot
of overhead).  I will continue to use Get/SetPixel() while I'm developing
because they make things easy to deal with, but as objects get finished,
I will remove them.

Some of the manipulators (color, rotate, and translate) accept arguments.
For instance, if you do color 1 0 0, it will automatically set the
color to red.  The objects try to be intelligent about their arguments.
For instance, if color receives three args, it sets RGB, but if it
gets 4, it sets RGBA.  If rotate or translate get 3 args, then they just
set the vector, but if they get 4, then they set both the vector and
the value.

---------------------------------------------------------------
---------------------------- 0.65 -----------------------------

GEM works under NT!  I got the port working last night.  I had to make some
major changes to the underlying classes (specifically CPPExtern) because
MS VisC++ puts the vtable pointer in the first four bytes...no matter what.
This is a different behavior than SGI's compiler (and I think that it requires
more work for MS VisC++'s compiler).  While it was a pain to change things, it
is good in the long run.  The C++ standard doesn't say where the vtable is 
located, so this would have bitten me at some point.

---------------------------------------------------------------
---------------------------- 0.64 -----------------------------

Because MS VisC++ really wants files to end in .cpp (how stupid...),
I renamed all of the C++ files.

I looked into making all of the pixes be float, instead of unsigned char. This
would give increased flexibility because we could use negative numbers, not
worry about wrap around on the unsigned char, etc. In running performance
tests on an SGI O2, the performance difference is fairly great.  If GEM
was only an image processing program (ie, PhotoShop), then I would definetely
have pixes be floats.  However, since GEM is meant for real-time, I will 
continue to use unsigned chars to represent pixels.

For the tech heads...I used to generate the rendering by creating a 
linked list of the GEM objects.  The problem was that objects like
separator weren't possible because it wasn't a true DAG.  That is now
fixed so that tree/leaf graphs are possible.

Made render_trigger so you can know exactly when the rendering is occuring.

Made pix_multiimage! Just give it a file with a * (like myfiles*.tif) and an
integer for a range (the number of images).

Made pix_invert, separator

---------------------------------------------------------------
---------------------------- 0.63 -----------------------------

The src directory has been made into a tree.

Made pix_add and pix_subtract
Added a scale object

---------------------------------------------------------------
---------------------------- 0.62 -----------------------------

A dummy glxContext is created at startup.  What this means is that
in the constructors of objects, OpenGL calls can be made, display
lists can be constructed, etc.  Eventually, I would like to have a 
single window which is always in existance that can change between
single and double buffering, but that may be a little while.

I put Sam Leffler's tiff library back in.  All image files must be in
TIFF format again.  Basically, I think that Win NT would have trouble
making SGI .rgb files, while anyone can make TIFF formats.  Currently
there is some code bloat because libtiff does more than just read in a
TIFF file.

The pix_coordinate object allows users to set the S,T texture coordinates
for geos.  For instance, by giving pix_coordinate 4 S,T pairs, the texture
coordinates for a square can be changed on the fly.  Not all of the geos
can support this ability right now (currently only square, triangle, and
polygon, but this will change in the near future).

A FAQ has been started, but there really aren't any questions in it yet.
As people think of them, please let me know and I'll add them.

---------------------------------------------------------------
---------------------------- 0.61 -----------------------------

Cocoon html help files for developers have been created.

GEM now uses an internally generated DAG for rendering.  This 
removes a serious bug where by objects could still try to reference
dangling pointers.  GEM objects act like the tidle objects do
from a users point of view.  Even if you break a connection
in a GEM chain, the GEM objects will continue to work.  This
means that it is safe to edit patches while a GEM chain is 
running.  To rebuild the GEM patch, rendering must be turned
off and then back on (just like the tilde objects).

Using the td library from Evans & Sutherland by Nate Robbins to display
Alias/Wavefront files (.obj).  It also takes care of image
loading, although it is only .rgb.  If people complain enough,
then I may return to the Sam's libTiff library, but it is so
big that the td library is better.  The td library can also be
compiled on Windows (or else I wouldn't have used it).  The new
object is called model (although it may change its name some day).

There is a new object which maps the color of a pix to the Z of
a polygon.  It is isn't overly useful right now, but it is a cool
demo.  It is called imageVert.

---------------------------------------------------------------
---------------------------- 0.60 -----------------------------

Major changes to the internals of GEM.  gemwin is now only
an access point to the window manager, instead of actually
being the window manager.  This should make it easier to have
multiple graphics windows.

While I was getting the O2 video camera to work, I seem to
have broken the Indycam object...

---------------------------------------------------------------
---------------------------- 0.50 -----------------------------

Made the port from Max over to Pd.  Redesigned the class 
heirarchy somewhat.

