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 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 occured. 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.