*** 1 1

Selecting this option will pop up a menu to allow you to:

  *DRAW the X-Y profile to be revolved (mouse required)

  *EDIT a current or retrieved profile

  *READ a previously saved profile

  *SAVE an X-Y profile you have just drawn

  *Set X and Y LIMITS on the drawing board when drawing X-Y points.

      The LIMITS option allows setting 'snap' values for drawing the
      profile (for example, one pixel = .01 unit or .1 unit etc., kind
      of like AutoCad).

*** 1 2

Selecting this option pops up a menu to allow you to:

  *REVOLVE the current X-Y profile 360 degrees about the Y-axis

  *Create a HELICAL shape by rotating the X-Y profile N*360 degrees
   about the Y-axis while increasing the height with the PITCH value

  *Define the SETTINGS relevant to SPIN, like:

      The Number_Of_Segments (snapshots) to make as the X-Y profile
      is revolved

      The number of 360 degree revolutions to do (HELICAL only)

      The PITCH for HELICAL spins

*** 1 3

Selecting this option pops up a menu to allow you to:

  *SCALE the spun object in X, Y, or Z

  *TRANSLATE the spun object in X, Y, or Z

  *ROTATE the spun object a number of degrees about the X, Y, or Z axis

  *Reset the spun object to its ORIGINAL shape when it was spun
   (cancels all previous transformations)

*** 1 4

Selecting this option shows you the spun object.  Any previous
tranformations are applied.  Hidden lines are not removed in this
version.

Note that in this version, for viewing purposes only, the object is
automatically scaled to fit on the screen and automatically translated
to be in the middle of the screen.  Thus, the object will always
appear to be the same overall size and will appear not to move.

However, your transformations entered with XFORM are still there.  You
can see this if you scale the object say on just one axis.

*** 1 5

Selecting this option pops up a menu to allow you to:

  *Enter the margin to be added to the maximum X,Y and Z dimensions of
   the spun and transformed object when preparing to write a bounding
   cube to the PV data file.  (BOUNDING_CLEARANCE)

  *Enter textures strings to be included between TEXTURE and
   END_TEXTURE keywords in the PV data file.

  *GENERATE the PV data file (after prompting for a filename).  The
   data file is created by converting the spun object to 'smooth
   triangles'.  The triangles are given the TEXTURE entered, and
   enclosed in COMPOSITE END_COMPOSITE keywords.  The COMPOSITE is
   BOUNDED by a cube.

*** 1 6

Selecting this option pops up an information screen showing you most
of the various settings as well as some statistics about the current
object.

Among other things, the current overall dimensions of the object are
given.  This is useful for deciding which transformations to apply
next in order to get the object the way you want it, especially since
my VIEW routine is pretty limited.  The dimensions are that of a cube
whose sides are perpendicular to the X, Y, and Z axes and that just
contains the object.

*** 1 7

Quit the program

*** 2 1

Allows drawing an X-Y profile to be spun about the Y axis.  The + and
- Y axis is at the very left of the screen and is split by the
positive X axis running horizontally across the screen.

If the profile begins and ends on the Y axis, a solid body of
revolution will result.  If a closed polygon is drawn away from the Y
axis, (like a circle), a torus-like object will result.  A profile
does not need to close on the Y axis or on itself.  If it doesn't, an
infinitely thin surface will result in the trace, which is a perfectly
useful thing.

Move the mouse to the first vertex.  Hit the left button.  Drag to
next vertex, hit the left button, etc.  When done, hit right button
once.  If you are happy with the profile, hit the right button again.
Otherwise, move the mouse close to an offending vertex, and hit the
left button.  Move this vertex where you want it and hit the left
button.  Repeat as necessary.  Finally hit the right button to end.

You cannot add more vertices after you have hit the right button the
first time.  I'll work on making the editing procedure more flexible.

*** 2 2

Allow editing the current profile or one retrieved from a file.

You can move the vertices, or close an un-closed polygon, but you
cannot add or insert more vertices into the profile.  You can change
the snap values if desired.

*** 2 3

When drawing the X-Y profile, the value of X_Snap determines the
amount the X coordinate of the mouse cursor increments per pixel of
mouse movement in the horizontal direction.

It defaults to a value of .01.

The X axis for drawing the profile always starts at 0.0 and extends in
the positive direction.

X_Snap also determines the X limits of the worksurface.  ie, if the
screen has 640 pixels horizontally, the maximum X coordinate possible
in the profile will be X_Snap * (640-1) or 6.39.

Enter a positive floating point number for X_Snap.

*** 2 4

When drawing the X-Y profile, the value of Y_Snap determines the
amount the Y coordinate of the mouse cursor increments per pixel of
mouse movement in the vertical direction.

It defaults to a value of .01.

Y=0 is at the middle of the vertical extent of the screen.  The Y axis
extends positively and negatively by an equal amount.

Y_Snap also determines the positive and negative Y limits of the
worksurface.  ie, if the screen has 480 pixels vertically, the
minimum and maximum Y coordinate possible in the profile will be

  + / -  Y_Snap*(480-2)/2  or  +/- 2.39

Enter a positive floating point number for Y_Snap.

*** 2 5

Selecting this option prompts you to enter the name of a file (with
extension) containing a previously saved X-Y profile.  The profile is
retrieved, and is ready to be SPUN.

The file is an ASCII file.  The first line contains an integer giving
the number of of X-Y pairs in the profile, a floating point number for
X-Snap, and a floating point number for Y-Snap.  Then, each subsequent
line contains two integers for the X and Y pixels, and two floats for
the X and Y coordinates of each vertex in the profile. This
information allows you to generate a profile outside this program and
then read it in.  (But that would defeat the purpose of this program)

*** 2 6

Selecting this option prompts you to enter a filename (with extension)
to save a profile to.  The profile can be read with PROFILE-READ.

*** 3 1

REVOLVE the profile 360 degrees about the Y axis.

The SPIN-SETTINGS-NUMBER_OF_SEGMENTS setting determines how many
'snapshots' are taken as the object is spun.  That is, how many facets
are generated by each line in the profile as it is spun.  If
NUMBER_OF_SEGMENTS is 10, then a facet will be generated after each 36
degrees of rotation.

Use HELICAL if you want the profile to be spun to create a helix type
object.

A profile beginning and ending on the Y axis will create a solid body
of revolution (like a sphere).  A profile drawn as a closed polygon not
touching the Y axis (like a circle) will create a torus if REVOLVED or
a spring if HELICAL'd.

*** 3 2

Spin the profile N * 360 degrees about the Y axis while continuously
incrementing the Y value of each vertex.

The SPIN-SETTINGS-REVOLUTIONS determines the value of N above.

The SPIN-SETTINGS-PITCH determines the distance beween each 'coil' of
the helical object.

The SPIN-SETTINGS-NUMBER_OF_SEGMENTS applies to both REVOLVE and
HELICAL.  It determines how many 'snapshots' are taken per 360 degrees
as the profile is spun.  That is, how many facets are generated by
each line in the profile as it is spun.  If NUMBER_OF_SEGMENTS is 10,
then a facet will be generated after each 36 degrees of rotation.

Also see help under REVOLVE.

A profile drawn as a closed circle not touching the Y axis will create
a torus if REVOLVED or a spring if HELICAL'd.

*** 3 3

Determines settings to be used during a SPIN-REVOLVE or SPIN-HELICAL.

SPIN-SETTINGS-REVOLUTIONS is only used for HELICAL spins.  It
determines how many complete 360 degree revolutions the profile will
make around the Y axis while generating a helix type object.

SPIN-SETTINGS-PITCH is only used for HELICAL spins.  It determines the
distance beween each 'coil' of the helical object.

The SPIN-SETTINGS-NUMBER_OF_SEGMENTS applies to both REVOLVE and
HELICAL.  It determines how many 'snapshots' are taken per 360 degrees
as the profile is spun.  That is, how many facets are generated by
each line in the profile as it is spun.  If NUMBER_OF_SEGMENTS is 10,
then a facet will be generated after each 36 degrees of rotation.

*** 5 1

REVOLUTIONS sets the number of times the X-Y profile should be spun
around the Y axis.

The profile is spun REVOLUTIONS x 360 degrees.  REVOLUTIONS must be a
positive integer.

REVOLUTIONS only applies to HELICAL spins.

*** 5 2

PITCH applies to HELCIAL spins only.  It determines the distance
between the 'coils' of a helix type object.  The Y values of the X-Y
profile are incremented by this amount each 360 degrees of revolution.

For a clean helical object, the value of PITCH should be large enough
to prevent the profile from coiling on top of itself, but I suspect
some interesting objects could be made by specifying small values of
PITCH (assuming no dreaded floating point error).

PITCH is a positive floating point number.

*** 5 3

NUMBER_OF_SEGMENTS applies to both REVOLVE and HELICAL spins.  It
determines how many 'snapshots' are taken per 360 degrees as the
profile is spun.  That is, how many facets are generated by each line
in the profile as it is spun.  If NUMBER_OF_SEGMENTS is 10, then a
facet will be generated after each 36 degrees of rotation.

*** 6 1

SCALE the spun object along the X, Y, or Z axis.

Enter three positive floating point numbers separated by spaces.  If a
particular vertex in the object has the coordinates  < 1.0  2.0  3.0 >,
then entering  4 .25 10  will result in that vertex having coordinates
< 4.0  0.5  30.0 >

Note that the object is scaled about the origin < 0 0 0 >, so a
translation of the object may also occur.  Use INFO (Maximum
Dimensions) to keep track of where the object is.

Note also that when the PV data file is generated, the object is
enclosed in COMPOSITE END_COMPOSITE keywords, so editing the generated
data file by using the PV SCALE, TRANSLATE, ROTATE keywords within
the COMPOSITE provides another way to transform the object.

*** 6 2

TRANSLATE the object in the X, Y, or Z directions.

Enter three positive or negative floating point numbers.  If a
particular vertex in the object has the coordinates  < 1.0  2.0  -3.0 >,
then entering  4 .25 10  will result in that vertex having coordinates
< 5.0  2.25  7.0 >.

Note also that when the PV data file is generated, the object is
enclosed in COMPOSITE END_COMPOSITE keywords, so editing the generated
data file by using the PV SCALE, TRANSLATE, ROTATE keywords within
the COMPOSITE provides another way to transform the object.

*** 6 3

ROTATE the object about the X, Y, or Z axis.

The rotation is clockwise as one looks from the positive axis to the
origin.  A left-handed coordinate system is used.

Enter the letter X, Y, or Z for the axis to rotate about, followed by
a positive or negative integer for the number of degrees to rotate.

If a particular vertex in the object has the coordinates
< 1.0  0.0  0.0 > , then entering  Z -90  will result in that vertex
having coordinates < 0.0 -1.0 0.0 >.

Note also that when the PV data file is generated, the object is
enclosed in COMPOSITE END_COMPOSITE keywords, so editing the generated
data file by using the PV SCALE, TRANSLATE, ROTATE keywords within
the COMPOSITE provides another way to transform the object.

*** 6 4

Undo all previous transformations  (Scale, Translate, Rotate).  That
is, return all vertex coordinates to the ORIGINAL coordinates
calculated immediately after the object was spun.

*** 7 1

After the profile has been spun and the object created, and as it is
transformed, the program keeps track of an imaginary cube that
completely contains the object.  The sides of the cube are always
perpendicular to the X, Y, and Z axis.

When the PV data file is finally generated, this cube is enlarged
slightly in the -X, X, -Y, Y, -Z, and Z directions by the
BOUNDING_CLEARANCE value, and the object is then BOUNDED_BY the
slightly enlarged cube.

BOUNDING_CLEARANCE is a floating point number whose default value is
0.01.

I hope to add cylindrical bounding volumes in the future, which should
be more efficient for these types of objects.

*** 7 2

Convert all the polygons in the object to smooth triangles and write
the PV data file.  The data file is written as:

COMPOSITE
   OBJECT
      SMOOTH_TRIANGLE
         { Vertex and Normal information }
      END_SMOOTH_TRIANGLE
      TEXTURE
         { Your texture strings }
      END_TEXTURE
   END_OBJECT

   { A lot more smooth triangle objects }

   BOUNDED_BY
      INTERSECTION
         { Six planes bounding the object }
      END_INTERSECTION
   END_BOUND
END_COMPOSITE
*** 7 3

Allows entry of up to three 70 character lines of PV texture
information.  The texture information is included in each smooth
triangle written.  Like:

   OBJECT
      SMOOTH_TRIANGLE
         { Vertex and Normal information }
      END_SMOOTH_TRIANGLE
      TEXTURE
         { Your texture strings }
      END_TEXTURE
   END_OBJECT

   { A lot more smooth triangle objects }
   .
   .

You must use nomenclature defined by PV (like that in TEXTURES.DAT).
Do not type in the TEXTURE END_TEXTURE keywords.

You must use the CLEAR_TEXTURE option to erase texture entries.
*** 7 4

Clears all three of the texture strings that may have been input with
TEXTURE.

***

MOUSE HELP

The work surface that you see is the +X half of the X-Y plane.  The +
and -Y axis is at the very left of the screen and is split by the
positive X axis running horizontally across the screen.

Use the mouse to draw and edit the profile that is to be spun about
the Y axis.

PG-DN,  (Esc to end)

If the profile begins and ends on the Y axis, a solid body of
revolution will result.  That is, if a semicircle is drawn that begins
and ends on the Y axis, a sphere will result.

If a closed polygon is drawn not touching the Y axis, (like a circle),
a torus-like object will result if the profile is REVOLVED, or a
helix-like object will result if the profile is HELICAL'd.

A profile does not need to be a closed polygon and does not need to
begin or end on the Y axis.  If it doesn't, an infinitely thin surface
will result in the trace, which is a perfectly useful thing.

PG-DN, PG-UP, (Esc to end)

If DRAWing, that is, creating a new profile, move the mouse to where
you want the first vertex.  Hit the left button.  Drag to the next
vertex, hit the left button, etc.  When done, hit the right button
once. If you are happy with the profile, hit the right button again.

If you are unhappy with the profile, or if you are EDITing a profile,
move the mouse close to an offending vertex, and hit the left button.
Move this vertex where you want it and hit the left button.  Repeat as
necessary.  Finally hit the right button to end.

In this version, you cannot add any more vertices to an existing
profile.  I'll work on making the editing procedure more flexible.

PG-DN, PG-UP, (Esc to end)

When you finally hit the right button to exit, the program checks to
see whether the object begins and ends on the Y axis or if you have
drawn a closed polygon.  If true, then the program continues with the
exit procedure.

If false, a prompt asks you if you want to close the profile you
have drawn by connecting the last vertex to the first.  You don't have
to, but it is useful if you really want a closed polygon but are not
sure whether you closed it or not.  You can close the profile by
hitting A or M.

PG-DN, PG-UP, (Esc to end)

A, for Add, adds a line segment between the last anchored vertex and
the first vertex.  It thus creates a new line segment and a new vertex
with the same coordinates as the first vertex.

M, for Move, actually moves the last anchored vertex to on top of the
first vertex drawn. No additional vertex is added, and the last line
segment you drew moves.

You don't have to wait until you are ready to exit to close the
profile.  You can hit A or M almost any time.

Once the profile has been closed, it cannot be 'broken' again.

PG-UP, (Esc to end)
END MOUSE HELP
