home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Hacker 2003
/
Power_Hacker_2003.iso
/
Tutorial
/
GNUSoftwareManuals.chm
/
gnu
/
gleem.mht
< prev
next >
Wrap
Internet Message Format
|
2002-05-24
|
44KB
From: <╙╔ Microsoft Internet Explorer 5 ▒ú┤µ>
Subject: gleem (OpenGL Extremely Easy-to-use Manipulators) documentation
Date: Fri, 24 May 2002 07:27:17 +0800
MIME-Version: 1.0
Content-Type: multipart/related;
boundary="----=_NextPart_000_0000_01C202F4.6F17ED30";
type="text/html"
X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4522.1200
This is a multi-part message in MIME format.
------=_NextPart_000_0000_01C202F4.6F17ED30
Content-Type: text/html;
charset="gb2312"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.gnu.org/manual/gleem/gleem.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>gleem (OpenGL Extremely Easy-to-use Manipulators) =
documentation</TITLE>
<META content=3D"text/html; charset=3Dgb2312" http-equiv=3DContent-Type>
<META content=3D"MSHTML 5.00.3315.2870" name=3DGENERATOR></HEAD>
<BODY>
<H2>gleem: OpenGL Extremely Easy-to-use Manipulators Documentation </H2>
<CENTER><IMG alt=3D"[Picture of Manipulators]" height=3D250=20
src=3D"http://www.gnu.org/software/gleem/manips.jpg" width=3D640> =
</CENTER>
<P><B>Last modified</B>: 11/22/98. <B>Current gleem version</B>: 1.0=20
<UL>
<LI><A =
href=3D"http://www.gnu.org/manual/gleem/gleem.html#INTRO">Introduction=20
and Description</A>=20
<LI><A href=3D"http://www.gnu.org/manual/gleem/gleem.html#HOWTO">How =
to=20
Incorporate gleem Into Your Programs</A>=20
<UL>
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#HOWTO-COMPILE">Compili=
ng</A>=20
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#HOWTO-MANIPS">Manips</=
A>=20
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#HOWTO-EXAMINER">Examin=
erViewer</A>=20
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#HOWTO-MULTIWIN">Multip=
le=20
Window and Multi-Threading Support</A> </LI></UL>
<LI><A href=3D"http://www.gnu.org/manual/gleem/gleem.html#UI">User =
Interface</A>=20
<UL>
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#UI-TRANSLATE12">Transl=
ate1Manip,=20
Translate2Manip</A>=20
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#UI-HANDLEBOX">HandleBo=
xManip</A>=20
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#UI-EXAMINER">ExaminerV=
iewer</A>=20
</LI></UL>
<LI><A =
href=3D"http://www.gnu.org/manual/gleem/gleem.html#DEVELOPER">Developer=20
Information</A>=20
<UL>
<LI><A =
href=3D"http://www.gnu.org/manual/gleem/gleem.html#HIERARCHY">Class=20
Hierarchy</A>=20
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#DOCUMENTATION">Per-Cla=
ss=20
Documentation</A>=20
<LI><A =
href=3D"http://www.gnu.org/manual/gleem/gleem.html#OVERVIEW">Library=20
overview</A> </LI></UL>
<LI><A =
href=3D"http://www.gnu.org/manual/gleem/gleem.html#PROJECTS">Suggestions =
for Further Development</A>=20
<LI><A =
href=3D"http://www.gnu.org/manual/gleem/gleem.html#LICENSING">Licensing=20
Terms</A>=20
<LI><A =
href=3D"http://www.gnu.org/manual/gleem/gleem.html#FAQ">Frequently Asked =
Questions</A>=20
<LI><A=20
=
href=3D"http://www.gnu.org/manual/gleem/gleem.html#THANKS">Acknowledgemen=
ts,=20
Thanks and Other Interesting Links</A>=20
<LI><A =
href=3D"http://www.gnu.org/manual/gleem/gleem.html#HISTORY">Version=20
History</A> </LI></UL>
<H2><A name=3DINTRO>Introduction and Description </A></H2>
<P>gleem is a small, self-contained C++ library of 3D widgets that =
support=20
direct user interaction with a 3D scene. The user interfaces are roughly =
based=20
on the manipulators in <A href=3D"http://www.sgi.com/">Silicon =
Graphics'</A> <A=20
href=3D"http://www.sgi.com/Technology/Inventor/">Open Inventor</A>; the =
names are=20
borrowed from Inventor. </P>
<P>The currently implemented manipulators are:=20
<UL>
<LI>Translate1Manip: translation along a line=20
<LI>Translate2Manip: translation in a plane=20
<LI>HandleBoxManip: 3D translation and rotation </LI></UL>
<P></P>
<P>The most recent version of gleem is available from <A=20
href=3D"http://www.media.mit.edu/~kbrussel/gleem/">http://www.media.mit.e=
du/~kbrussel/gleem/</A>.=20
</P>
<P>gleem uses <A =
href=3D"http://reality.sgi.com/opengl/glut3/glut3.html">GLUT</A>=20
and <A href=3D"http://www.opengl.org/">OpenGL</A> for acquiring mouse =
events and=20
performing rendering. However, all of the data structures for storing =
shapes and=20
computing mouse pointer-object intersections are done within the =
library, not=20
using the OpenGL pick mechanism. Therefore it should be fairly simple to =
port=20
gleem to other graphics libraries such as <A=20
href=3D"http://java.sun.com/products/java-media/3D/index.html">Java3D.</A=
>=20
<P>gleem currently does not implement Inventor-style fields, =
field-to-field=20
connections, reference counting, run-time type checking, instantiation =
by type=20
ID, or any other of the basic mechanisms which made Inventor possible. =
It is=20
implemented entirely using virtual functions; there is no casting down =
the=20
hierarchy based on run-time type checks. </P>
<P>The most fundamental limitation of gleem is that, in the interest of=20
portability, it has no notion of a scene graph. It defines what little =
such=20
support it needs internally. All manipulators live conceptually in world =
coordinates. If you want to attach a manipulator to the end of a =
kinematic=20
chain, for example, you will need to manually keep the manipulator in =
place as=20
your application moves the links. </P>
<HR width=3D"50%">
<H2><A name=3DHOWTO>How to Incorporate gleem Into Your Programs =
</A></H2>
<H3><A name=3DHOWTO-COMPILE>Compiling gleem </A></H3>
<P>gleem was developed under SGI's Irix 6.5. The Makefile is currently =
set up=20
for SGI's CC and include directories. Type "make" in the gleem =
subdirectory to=20
build the library and tests. A precompiled version (built on a 6.5 Indy) =
is in=20
lib/iris. You will need to set your LD_LIBRARY_PATH to, for example,=20
/users/yourname/gleem-1.0/lib/iris before running any of the tests. </P>
<P>The sources should be quite portable and compilable with any recent =
C++=20
compiler. STL support is required and SGI's version of the STL is =
included in=20
the distribution. By default gleem puts all of its datatypes into the =
namespace=20
"gleem", but if your compiler doesn't support namespaces all of the =
macros gleem=20
uses to this end are in Namespace.h. If you port gleem to another =
platform,=20
please consider making a cross-platform Makefile for gmake and =
submitting your=20
work; see the <A=20
href=3D"http://www.gnu.org/manual/gleem/gleem.html#PROJECTS">suggested=20
projects</A>. The "machtype" script in the top-level directory may be =
useful for=20
this purpose. </P>
<H3><A name=3DHOWTO-MANIPS>Incorporating Manips </A></H3>
<P>To use gleem's manipulators, you need to add the following to your=20
OpenGL/GLUT application:=20
<OL>
<LI>A call to <CODE>ManipManager::init()</CODE> in =
<CODE>main()</CODE>. There=20
must be an open window at this point if you want the ManipManager to =
install=20
its callbacks. (To disable callback installation, call=20
<CODE>ManipManager::init(false)</CODE>.)=20
<LI>If you choose not to allow the ManipManager to install mouse =
motion,=20
passive motion, and mouse button callbacks (because you have already=20
overridden them in your application), you need to call the appropriate =
static=20
methods in ManipManager at the end of your callbacks.=20
<LI>Regular calls to =
<CODE>ManipManager::updateCameraParameters()</CODE> with=20
parameters of your viewing frustum (forward and up vectors, vertical =
FOV,=20
image plane aspect ratio, horizontal and vertical size of window). =
gleem=20
currently only handles frusta corresponding to symmetric truncated =
pyramids.=20
<LI>A call to <CODE>ManipManager::render()</CODE> in your display =
callback.=20
</LI></OL>
<P></P>
<P>You can then call methods such as <CODE>getTranslation()</CODE> and=20
<CODE>getRotation()</CODE> on the above manipulator classes in, for =
example, its=20
GLUT render callback, and feed those values elsewhere. You can also =
register a=20
motion callback via <CODE>Manip::addMotionCallback()</CODE> which will =
be called=20
each time the manipulator is moved. </P>
<P>See the sources Translate1Test.cpp, Translate2Test.cpp, and =
TestHandleBox.cpp=20
for specific, small examples of instantiating manipulators. </P>
<H3><A name=3DHOWTO-EXAMINER>Incorporating the Examiner Viewer </A></H3>
<P>The ExaminerViewer class implements trackball-style rotation, =
translation,=20
and dollying of the scene. To use it in conjunction with the =
ManipManager, you=20
need to do the following: </P>
<P>
<OL>
<LI>Instantiate an Examiner Viewer (i.e., <CODE>ExaminerViewer viewer =
=3D new=20
ExaminerViewer();</CODE>). This creates a new window internally and =
overrides=20
mouse and motion callbacks.=20
<LI>Call <CODE>ManipManager::init(false);</CODE>. It isn't possible to =
re-install the ExaminerViewer's callbacks if they're overridden, so =
it's=20
important not to let the ManipManager do so.=20
<LI>Set up the ManipManager as a mouse and motion delegate for the=20
ExaminerViewer. <PRE> =
viewer->setMouseDelegate(ManipManager::mouseFunc);
viewer->setMotionDelegate(ManipManager::motionFunc);
</PRE>
<LI>To get highlighting of manips to work, set up the ManipManager's =
passive=20
motion callback manually. <PRE> viewer->makeCurrent();
glutPassiveMotionFunc(ManipManager::passiveMotionFunc);
</PRE>
<LI>(Recommended) Give the ExaminerViewer a BSphereProvider so it can =
compute=20
the bounding sphere of the scene, and call viewAll() before the first =
render.=20
See TestExaminerViewer.cpp for an example of how you might compute a =
bounding=20
sphere for a manipulator.=20
<LI>Add a call to <CODE>viewer->update();</CODE> before you begin =
drawing=20
your geometry. This recomputes the ModelView and Projection matrices =
for the=20
current rendering context. You should then be able to push matrices on =
top of=20
the one loaded by the ExaminerViewer to effect a camera moving about =
the=20
scene. </LI></OL>
<P></P>
<H3><A name=3DHOWTO-MULTIWIN>Multiple Window and Multi-Threading Support =
</A></H3>
<P>gleem supports rendering manipulators in multiple windows. See=20
<CODE>ManipManager::windowCreated()</CODE>,=20
<CODE>ManipManager::windowDestroyed()</CODE>,=20
<CODE>ManipManager::addManipToWindow()</CODE>, and=20
<CODE>ManipManager::removeManipFromWindow</CODE>. By default, =
manipulators are=20
rendered in the window which was current at the time of their =
instantiation=20
(determined via <CODE>glutGetWindow()</CODE>.) See =
<CODE>TestMultiWin.cpp</CODE>=20
for an example of rendering the same manipulator into two windows. </P>
<P><B>gleem is not thread-safe</B>. You should not attempt to =
instantiate or use=20
gleem objects in more than one thread. </P>
<HR width=3D"50%">
<H2><A name=3DUI>User Interface </A></H2>
<H3><A name=3DUI-TRANSLATE12>Translate1Manip and Translate2Manip User =
Interface=20
</A></H3>
<P>The Translate1Manip and Translate2Manip are self-explanatory. Click =
and drag=20
to cause motion along a line or in a plane. </P>
<H3><A name=3DUI-HANDLEBOX>HandleBoxManip User Interface </A></H3>
<P>The HandleBoxManipulator contains a box with six faces. Clicking and =
dragging=20
on any of these six faces causes translational motion in the plane =
parallel to=20
the face. </P>
<P>This manipulator also contains six handles, each of which can be used =
to=20
rotate the manipulator about two possible axes. The one chosen at the =
start of a=20
drag motion is the one most parallel to the viewing direction. If you =
visualize=20
the two perpendicular planes which go through the handle and three =
others, the=20
one which is rotated about is the one which is facing the camera the =
most at the=20
current time. </P>
<P>Scaling of the HandleBoxManip still needs to be implemented. </P>
<H3><A name=3DUI-EXAMINER>ExaminerViewer User Interface </A></H3>
<P>The ExaminerViewer behaves similarly to Inventor's Examiner Viewer. =
It grabs=20
all drag motions when the Alt key is depressed. The ExaminerViewer has a =
conceptual "focal point" which is always defined as being the focal =
distance=20
directly in front of the viewer. </P>
<P>Drag motions with Alt key depressed:=20
<UL>
<LI>Button 1: Rotate about focal point=20
<LI>Button 2: Translate in plane parallel to image plane. Note that =
this=20
causes subsequent rotations to be performed about a point which is =
likely not=20
to be the precise center of the scene.=20
<LI>Buttons 1+2: Dolly in/out in direction perpendicular to image =
plane. This=20
motion increases or decreases the focal distance depending on the =
dollying=20
direction. </LI></UL>
<P></P>
<P>Calling the viewAll() method re-positions (but does not re-orient) =
the=20
ExaminerViewer so the bounding sphere given by the BSphereProvider is =
contained=20
entirely within the viewing frustum. The focal distance is reset to be =
the=20
distance between the camera and the center of the bounding sphere. </P>
<HR width=3D"50%">
<H2><A name=3DDEVELOPER>Developer Information </A></H2>
<H3><A name=3DHIERARCHY>Class Hierarchy </A></H3>
<P>gleem partitions its API into two sections, separate from the C++ =
access=20
rules. Classes and access qualifiers prefaced with GLEEM_INTERNAL are =
not=20
intended to be used by outside users, and have even fewer guarantees =
about=20
interface stability than the public interfaces (which have none). </P>
<P>"Public" classes are in <B>bold</B>. </P>
<P>Manipulator-related classes=20
<UL>
<LI><B>ManipManager</B>=20
<LI><B>Manip</B>=20
<UL>
<LI><B>Translate1Manip</B>=20
<LI><B>Translate2Manip</B>=20
<LI><B>HandleBoxManip</B> </LI></UL>
<LI><B>CameraParameters</B> </LI></UL>
<P></P>
<P>Application-level classes=20
<UL>
<LI><B>ExaminerViewer</B> </LI></UL>
<P></P>
<P>Manipulator parts (visible and/or intersectable geometry)=20
<UL>
<LI>ManipPart=20
<UL>
<LI>ManipPartGroup=20
<UL>
<LI>ManipPartTransform </LI></UL></LI></UL>
<LI>ManipPartTriBased=20
<UL>
<LI>ManipPartCube=20
<LI>ManipPartHollowCubeFace=20
<LI>ManipPartSquare=20
<LI>ManipPartTwoWayArrow </LI></UL></LI></UL>
<P></P>
<P>Linear algebra classes=20
<UL>
<LI>BSphere=20
<LI>Line=20
<LI>Plane=20
<LI>PlaneUV </LI></UL>
<P></P>
<P>Other math-related classes=20
<UL>
<LI>MathUtil=20
<LI>NormalCalc=20
<LI>RayTriangleIntersection=20
<LI>RightTruncPyrMapping </LI></UL>
<P></P>
<H3><A name=3DDOCUMENTATION>Per-Class Documentation </A></H3>
<P>gleem contains a fair amount of documentation in the form of =
javadoc-style=20
comments. I was not able to find a free document generator for C++ which =
could=20
turn these into html; please let me know if you know of one. In the =
meantime,=20
the headers contain all of the class-specific documentation. </P>
<H3><A name=3DOVERVIEW>Library Overview </A></H3>
<P>Manipulators contain Manipulator Parts. The ManipPart hierarchy is =
divided=20
into two sections, one containing triangle-based pieces of manipulators =
and one=20
which contains grouping nodes (analogues to Group and Transform nodes). =
This is=20
gleem's scene graph mechanism. A warning: shared instancing of "nodes"=20
(ManipParts) in this scene graph is not allowed (since reference =
counting is not=20
implemented). The ManipManager keeps track of all instantiated =
manipulators and=20
handles the picking mechanism as well as rendering. </P>
<P>The Manip base class only implements a minimal interface; it is =
intended that=20
you refer to manipulators through a pointer to the concrete type rather =
than the=20
abstract Manip type. The simple manipulators (Translate1Manip, =
Translate2Manip)=20
contain replaceGeometry() methods so you can customize the draggers with =
whatever geometry you like. It is not so simple to customize a more =
complex=20
manipulator like the HandleBoxManip, so it contains no such method. </P>
<P>Each manipulator understands its constraints and implements its =
drag() method=20
from scratch. Clearly there is some commonality between the =
Translate2Dragger=20
and the translation functionality of the HandleBoxManip. However, this=20
commonality has not been abstracted into a set of classes like =
Inventor's=20
projectors. Instead there are a few geometrical classes (Line, Plane, =
PlaneUV)=20
which encapsulate such functionality as ray casting and point =
projection, and=20
the manipulators determine how to use this information based on what =
manipulator=20
part was selected and the current configuration of the manipulator. </P>
<P>The linear algebra gleem uses is quite simple and should be =
accessible to=20
anyone with anyone who has taken an undergraduate linear algebra course. =
I=20
encourage you to experiment with more sophisticated algorithms for the =
drag=20
mechanisms. </P>
<P>Recommended texts:=20
<UL>
<LI>Gilbert Strang, <U>Introduction to Linear Algebra</U>, Wellesley, =
MA:=20
Wellesley-Cambridge Press, 1993=20
<LI>James D. Foley, Andries van Dam, Steven K. Feiner, and John F. =
Hughes,=20
<U>Computer Graphics: Principles and Practice</U>, Reading, MA:=20
Addison-Wesley, 1992 </LI></UL>
<P></P>
<HR width=3D"50%">
<H2><A name=3DPROJECTS>Suggestions for Further Development </A></H2>I =
had=20
originally intended to call gleem an acronym for "OpenGL Easily =
Extensible=20
Manipulators", but decided that I shouldn't try to make that claim until =
other=20
programmers had actually tried to do so. There is a lot of work still to =
be done=20
on this library.=20
<P></P>
<P>The one thing I strongly recommend <I>against</I> is attempting to =
turn=20
gleem's internal scene graph (the ManipPart hierarchy) into a full scene =
graph=20
library. The run-time support is not there, and the structure would need =
to be=20
fully redesigned for this purpose. On the other hand, I think a free, =
portable,=20
and high-performance scene graph library is a great idea. </P>
<P>Suggested projects:=20
<UL>
<LI>Makefile generalization; gmake and multiple platform support=20
<LI>Get the javadoc-style comments into actual html pages=20
<LI>Fix the OpenGL support so it does the right thing with respect to =
state=20
management coming into and out of the manipulator rendering routines=20
<LI>Generalize to asymmetric and orthographic viewing frusta=20
<LI>Implement scaling for HandleBoxManip=20
<LI>Incorporate into Eric Power's Apprentice project=20
<LI>Port to Linux (using Mesa) and create RPM=20
<LI>Port to Windows=20
<LI>Port to Java3D=20
<LI>Try running on a 3Dfx card, both windowed and fullscreen modes=20
<LI>Implement more of Inventor's manipulator hierarchy (in the =
interest of=20
time, I did only those manipulators which I absolutely needed)=20
<LI>Figure out the commonalities between manipulators and implement =
drag=20
policies as classes=20
<LI>... </LI></UL>
<P></P>
<P>Code contributions will be gladly accepted and incorporated into the=20
"official" distribution. Or you can redistribute your modifications =
yourself;=20
see below. </P>
<HR width=3D"50%">
<H2><A name=3DLICENSING>Licensing Terms </A></H2>
<P>gleem is distributed under the <A=20
href=3D"http://www.gnu.org/manual/gleem/LICENSE.txt">GNU Library General =
Public=20
License</A>, version 2.0, or any later version. If you want to =
incorporate gleem=20
into a commercial product, please contact me so we can discuss =
exceptions to the=20
license's requirement that you distribute object files as well as =
gleem's=20
(potentially modified) source code. </P>
<P>gleem includes a copy of SGI's STL implementation. Here is the =
copyright=20
notice from this library: <PRE>/*
*
* Copyright (c) 1994
* Hewlett-Packard Company
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Hewlett-Packard Company makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
*
* Copyright (c) 1996
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation. Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*/
</PRE>
<P></P>
<HR width=3D"50%">
<H2><A name=3DFAQ>Frequently Asked Questions </A></H2>
<P>Q: Why don't the manipulators show up in the right place in my =
application?=20
(Or, why can't I drag them?) </P>
<P>A: gleem expects the following from the rendering state at the time =
you call=20
ManipManager::render():=20
<UL>
<LI>Lighting is turned on and at least one light is on=20
<LI>Textures are disabled=20
<LI>The ModelView matrix stack contains only the camera translation =
and=20
orientation, and the Projection matrix a perspective projection =
matrix.=20
</LI></UL>The latter is likely to be the problem. gleem expects to be =
able to=20
render its manipulators in world coordinates, and the camera parameters =
you give=20
the library must correspond to the current state of the ModelView and =
Projection=20
matrices. See <CODE>TestExaminerViewer.cpp</CODE> for an example of how =
an=20
application using gleem might be structured.=20
<P></P>
<HR width=3D"50%">
<H2><A name=3DTHANKS>Acknowledgments, Thanks and Other Interesting Links =
</A></H2>
<UL>
<LI><A href=3D"http://reality.sgi.com/pauli">Paul Isaacs</A>, David =
Mott, and=20
Howard Look (judging from the header files) wrote Inventor's dragger =
and=20
manipulator hierarchies.=20
<LI>Mark Kilgard wrote <A=20
href=3D"http://reality.sgi.com/opengl/glut3/glut3.html">GLUT</A>, an =
elegant=20
abstraction layer allowing development of window system-independent =
OpenGL=20
programs.=20
<LI>Thanks to the designers of Open Inventor for a system still =
unmatched in=20
scope (after over five years!)=20
<LI><A href=3D"http://www.ssec.wisc.edu/~brianp/home.html">Brian =
Paul's</A> <A=20
href=3D"http://www.ssec.wisc.edu/~brianp/Mesa.html">Mesa</A>, a free =
OpenGL=20
clone=20
<LI><A href=3D"http://users.deltanet.com/~powerg/">Eric Powers's</A> =
<A=20
href=3D"http://users.deltanet.com/~powerg/Apprentice/">Apprentice</A>, =
a free=20
(though incomplete) Open Inventor clone=20
<LI><A href=3D"http://wwwmath.uni-muenster.de/~mam">MAM/VRS</A>: a =
large and=20
free 3D library </LI></UL>
<P></P>
<HR width=3D"50%">
<H2><A name=3DHISTORY>Version History </A></H2>
<P>
<UL>
<LI>Version 1.0 - November 23, 1998=20
<UL>
<LI>First public release </LI></UL></LI></UL>
<P></P>
<HR>
<I><A href=3D"http://www.media.mit.edu/~kbrussel">Kenneth B. Russell</A> =
- <A=20
href=3D"mailto:kbrussel@media.mit.edu">kbrussel@media.mit.edu</A> </I>
<H6>$Id: index.html,v 1.9 1998/12/11 04:47:31 kbrussel Exp =
$</H6></BODY></HTML>
------=_NextPart_000_0000_01C202F4.6F17ED30
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
Content-Location: http://www.gnu.org/software/gleem/manips.jpg
/9j/4AAQSkZJRgABAQAAAQABAAD//gBIQ1JFQVRPUjogWFYgVmVyc2lvbiAzLjEwYSAgUmV2OiAx
Mi8yOS85NCAgUXVhbGl0eSA9IDc1LCBTbW9vdGhpbmcgPSAwCv/bAEMACAYGBwYFCAcHBwkJCAoM
FA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJ
DAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy
MjIyMv/AABEIAPoCgAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/
xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKC
CQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaH
iImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp
6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAME
BwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYn
KCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeY
mZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/
2gAMAwEAAhEDEQA/APn+iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooo
oAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig
AooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiitrw/YR31xHE+399MsQLJu25I5/X9KA
MWivcbvwjoF5s83SrddmceSDF19dmM9O9eWeLtGstC1lbKynklUQq8nmOrMrEng4Axxg/jQBg0UU
UAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQ
AUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUoVm+6pP0
FACUVs2vhLxFelhBot8xXGcwsvX61mXVrNZXk9pcJsngkaORCc7WU4I/MUAQ0UUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV1Xg7VdO03UbaS9nMATfk+WSCSCBnHbnr7fjXK0UAe+2
Ws6ZqIU2d9BKXyAquN3HX5eteOeLrv7Z4s1KXZs2zGLGc/cATP47c/jWLRQAUUUUAFFFFABRRRQA
UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABR
RRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAX9P0XVNWDHT9PuboIQrGGMsFJ6Zx0rpbT4W
eKbkZktIbYbtp86Zc49cDPFc/wCH/EF94b1RL6xkww4eM/dkXurD0r6F8N+JLHxPpa3tk2GGBNCx
+aJvQ+3oe9AHm9r8F7xgTd6zbxkHgQxM+R9Ttx+Vb1t8H9Ai3efd30+cbcMqY/Q5r0GigDm7XwB4
VtN/l6NA+7GfOZpMfTcTit63s7a0Ura20MAOMiKMLnHTOBzU1aFra7MPIPm7D0oAYiizt5LucFvJ
RpNo64Ayfx4r5GuJTPcyzMWYyOWJY5Jyc8+9fVPjS/8A7M8E6zdiUxMtq6o4GSGb5V/VhXylQAUU
UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRR
QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFA
BRRRQAUUVraPpiXW6adSYhwozjJoAygpY4UEn0FXRo2onT5L/wCxy/ZYyA8mOBmu70LQBeS/uoxD
bIfndRyfYeprvIYIreBYYo1WNRgLjigD56or0Pxb4EIM2paQg2/ektVHI9Snt7fl6V55QAUUUUAF
FFFABRRRQAVo6LrmoaBfreadcNFIMBh/C4znaw7is6r2laVc6veLb26+7ueiD1NAH0H4U8V2XivT
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
U9Sb7lvZSxKDwJHmUwhQf7wV3kxySIm9yMavqm48JeEtb0W5sLew05ba4CsZLFI0YMAdjhlHUZOD
0wSOQSD80+IPD+o+GdXl0zU4fLnTlWHKSL2dT3U4/mDggigDMooooAKKKKACiiigAooooAKKKKAC
iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACrFim+9iHPBzx7VXp8UskL742KtjG
RQB1kUWPmI5/lT2kRBl3VR6k4rk3u7mQ5aeQnp941DQB1b39pHndcJkdQDmoG1qzUjDO3+6v+Nc3
RQBuPr6Y+S3Yn/aamJ4ku4J0mtQIZUOUdWIZT6gjGKxqKALOoahdarqE19ey+bcztukfAG4+uBxV
aiigAooooAKKKKACiiigAp8U0kL742KmmUUAb+m+JJ7GYSRSSW8ndozkH6jvXe6N8QLe5Cx36qG/
56xDj8V6j8K8joBIORwaAPoy3uIbuETW8qSxnoyHIrqPB10Y9SktT0nTIH+0v/1s18u6dr2paVMJ
bS6dG7jqD9R3r0Hwv8V1tNQtZNWtypikVvPhGeh5yv59PyoA5H4hTxXPxD8QTQSLJG19KVZeh+Y1
zVX9bniutf1G4gcPDLdSujDupYkH8qoUAFFFFABRRRQAUUUUAFFFFABRRRQBPZXC2l/b3LxCZIpV
kaNujgEHB+td9/wtT/qDf+TX/wBhXnVFAHU+KfGJ8SWNtAtu1sscjPIm4OG4AU5wDnl+Pcde3LUU
UAFT2VncajfQWVpGZLi4kWKJAQNzE4AyeBz61BVzS03XoOcbFJ+vb+tAHUf8Km8b/wDQE/8AJqH/
AOLrjpoZbeeSCeN4po2KPG6lWVgcEEHoQa+q/wDhKv8Apy/8i/8A1q+dviAIP+E61V7eHyUlkWUp
vLfM6qzHJ9WJPtmgDmqKKKACiiigArTtPEeu2FsltZ61qNtbpnZFDdOirk5OADgckmsyigDZ/wCE
v8Tf9DFq/wD4Gyf/ABVbuk6nqPiiW0sL29ubr94oYzy73QAfMVZskZGSR3IGc4FcTVrT9Ru9KvFu
7KXyp1BAbaGxkYPBBFAH0DXivjbUTqPiq7OW8u3P2dAwAxt4PTqN24/j+FO/4TvxL/0Ev/IEf/xN
c5QAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFF
FABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUU
AFFFFABRRRQAUUUUAFFFFABRRRQAVb0u+/s3VLW98vzPIkD7N2N2O2e1VKKAPV/+FnaL/wA+t/8A
9+0/+LrzHULv7fqV1ebNnnzPLsznbuJOM9+tVqKACiiigAooooAKKKKACiiigAooooAKKKKACiii
gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA
CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK
KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP//Z
------=_NextPart_000_0000_01C202F4.6F17ED30--