This directory contains the source code to the Inventor program
`ivnorm'.

This program attempts to find outward-facing normals for all the
SoIndexedFaceSet nodesfound in an Inventor scene file that do not
ALREADY have Normal or NormalBinding nodes. It then computes face
normals for each face set, inserts them into the database, and writes
the result.

It does not delete existing properties or hierarchy.

By default, it generates facet normals, and determines the orientation
of the polygons itself (the polygons do not have to be oriented
consistently).

To generate normals for other shapes, use 'ivquicken'.  However, note
that 'ivquicken' assumes that your polygons are already consistently
oriented; it will not re-orient them for you (yes, we should merge
them, but we never seem to have enough time-- you have the source
code, so if you manage to merge them, please send us the source!
(gavin@sgi.com)).

How to Run
----------
ivnorm [-c -C -v -V -a angle] [in_file] [out_file]

-c       : Assume that all polygons are oriented counter-clockwise.
-C       : Assume that all polygons are oriented clockwise.
-v       : Find vertex normals  (default is face normals).
-V       : Be verbose; prints messages as it works.
-a angle : Use the given angle (given in degrees) as the "crease
           angle".  If vertex normals are being generated and the
           angle between two faces is greater than this angle, two
           different normals will generated, creating a sharp crease.
           Default is 30 degrees.

It may be given 0, 1, or 2 filename arguments.  With 0 arguments, it
will read from standard input and write to standard output.  With 1
argument, it will read from the specified file and write to standard
output.  With 2 filenames, it will read from the first file and write
to the second.


Examples:
--------
ivnorm foo.iv fooWithNormals.iv

yourProgram myfile.other | ivnorm -C > myfile.iv


Algorithm to attempt to find outward-facing normals:
---------------------------------------------------
First, mark all faces as UNKNOWN.

Then create an edge dictionary that allows you to find all of the
faces sharing a given edge (where an edge is two integers representing
the two shared vertices).

Pick an arbitrary face and mark it COUNTER_CLOCKWISE.  Using the edge
dictionary, orient all surrounding faces based on the orientation of
this face.  And recurse for all surrounding faces, consistently
orienting the entire surface.

Find the average of the vertices in this surface.  Using that point,
calculate a volume measurement, taking into account the face's
orientation.  If the volume turns out to be positive, assume the faces
are oriented correctly.  If it is negative, reverse their orientations.

If any faces are still UNKNOWN after this, choose another direction
and go through the algorithm again.

At the end, faces marked CLOCKWISE must have their indices reversed
before facet normals are found.
