ImplicitDefs.mesa
Copyright Ó 1985, 1990 by Xerox Corporation. All rights reserved.
Bloomenthal, September 15, 1992 6:15 pm PDT
DIRECTORY G3dBasic, G3dOctree, G3dShape, G3dSpline, Imager, Real, Rope, ViewerClasses;
ImplicitDefs: CEDAR DEFINITIONS ~ BEGIN
Notes
Triangles should be defined clockwise when viewed from the outside.
Imported Types
Octree:     TYPE ~ G3dOctree.Octree;
Cube:      TYPE ~ G3dOctree.Cube;
Corner:     TYPE ~ G3dOctree.Corner;
CrossSequence:   TYPE ~ G3dOctree.CrossSequence;
NatSequence:    TYPE ~ G3dBasic.NatSequence;
NatSequenceRep:   TYPE ~ G3dBasic.NatSequenceRep;
Pair:      TYPE ~ G3dBasic.Pair;
Triple:      TYPE ~ G3dBasic.Triple;
TripleSequence:   TYPE ~ G3dBasic.TripleSequence;
TripleSequenceRep:  TYPE ~ G3dBasic.TripleSequenceRep;
ScreenSequence:   TYPE ~ G3dShape.ScreenSequence;
Validity:     TYPE ~ G3dShape.Validity;
SplineSequence:   TYPE ~ G3dSpline.SplineSequence;
ROPE:      TYPE ~ Rope.ROPE;
Context:     TYPE ~ Imager.Context;
Viewer:     TYPE ~ ViewerClasses.Viewer;
Modes
Use:      TYPE ~ {unknown, animateClient, animateSurface};
EdgeMode:    TYPE ~ {
regulaFalsi,              -- methods of converging
binarySectioning            -- along a segment
};
DistanceMode:   TYPE ~ {
inverse,               -- value a inverse dist. to p
inverseSqrd,              -- a inverse distance-squared
wtInverse,              -- value a inverse weighted d
wtInverseSqrd             -- a inverse weighted d2
};
Proc Definitions
ConnectProc:   TYPE ~ PROC [p0, p1: Triple];
ValueProc:    TYPE ~ PROC [
         point: Triple,
         clientData: REF ANY ¬ NIL,
         corner: Corner ¬ NIL]
         RETURNS [value: REAL ¬ 0.0];
         Return the value at point (> 0 inside, < 0 outside surface).
         corner is available for setting .nearest or .outOfRange.
         corner.outOfRange ¬ TRUE if point out of function range.
StartProc:    TYPE ~ PROC [
         clientData: REF ANY ¬ NIL,
         use: Use ¬ unknown,
         frame, nFrames: NAT ¬ 0]
         RETURNS [point: Triple];
         Return a start point for implicit tracking.
         frame and nFrames meaningful if use is an animation.
CubeOkProc:   TYPE ~ PROC [cube: Cube, clientData: REF ANY ¬ NIL]
         RETURNS [ok: BOOL];
         Return FALSE to eliminate cube from the octree.
VertexOkProc:   TYPE ~ PROC [point: Triple, clientData: REF ANY ¬ NIL]
         RETURNS [ok: BOOL];
         Return FALSE to eliminate point (and any polygons
         containing it) from the surface.
PolygonOkProc:  TYPE ~ PROC [points: TripleSequence, clientData: REF ANY ¬ NIL]
         RETURNS [ok: BOOL];
         Return FALSE to eliminate polygon from the surface.
NormalProc:   TYPE ~ PROC [
         point: Triple,
         value: REAL ¬ 0.0,
         clientData: REF ANY ¬ NIL]
         RETURNS [normal: Triple ¬ [0.0, 0.0, 0.0]];
         Return the surface normal at point, presumably unitized.
ColorProc:    TYPE ~ PROC [vertex: Vertex, clientData: REF ANY ¬ NIL]
         RETURNS [color: Triple ¬ [1.0, 1.0, 1.0]];
         Return the color at vertex.
TextureProc:   TYPE ~ PROC [vertex: Vertex, clientData: REF ANY ¬ NIL]
         RETURNS [texture: Pair ¬ [0.0, 0.0]];
         Return the u, v texture coordinates at vertex.
StatusProc:    TYPE ~ PROC [ref: REF ¬ NIL] RETURNS [atom: ATOM ¬ $Continue];
         Called when making the surface or the octree.
         ref is usually one of:
         $MakeOctree, $AdaptOctree, $SetCorners, $MakeVertices
         $MakePolygons, $MakeNormals, $MakeTextures, $Done,
         ROPE, or Cube.
        atom = $Abort or $RejectCube is generally recognized.
SurfaceProc:   TYPE ~ PROC [cube: Cube] RETURNS [intersects: BOOL];
         True iff surface intersects the cube.
DocProc:     TYPE ~ PROC [clientData: REF ANY] RETURNS [doc: ROPE];
         Get client documentation when, for example, writing to a file.
DiagramProc:   TYPE ~ PROC [
context:       Context,
point:        Triple,
clientData:      REF ANY ¬ NIL,
whatChanged:     REF ANY ¬ NIL,
viewer:       Viewer ¬ NIL];
         Diagram an implicit function relative to given point in space.
The Surface
Vertex:     TYPE ~ G3dShape.Vertex;
VertexSequence:   TYPE ~ G3dShape.VertexSequence;
VertexSequenceRep:  TYPE ~ G3dShape.VertexSequenceRep;
Format for surface.polygons:
This is a list of nat sequences, thus allowing a practically unlimited number of polygons.
Each list is encoded: the first number is the number of vertices for the first polygon;
the indices to these vertices appear next on the list, followed again by a number
indicating the number of vertices of the next polygon, and so on.
Surface:     TYPE ~ REF SurfaceRep;
SurfaceRep:    TYPE ~ RECORD [
octree:       Octree ¬ NIL,     -- the octree
vertices:       VertexSequence ¬ NIL,   -- sequence of surface vertices
vertexValidities:     ARRAY Validity OF BOOL ¬ ALL[FALSE],
screens:       ScreenSequence ¬ NIL,   -- screen locations of vertices
nPolygons:      CARDINAL ¬ 0,     -- number of polygons
polygons:       LIST OF NatSequence ¬ NIL, -- run-encoded vertex indices
faceNormals:      TripleSequence ¬ NIL,   -- normal per polygon
faceCenters:      TripleSequence ¬ NIL,   -- center per polygon
curves:       SplineSequence ¬ NIL,   -- curves connecting vertices
curvesValid:      BOOL ¬ FALSE,     -- true if curves updated
clientData:      REF ANY ¬ NIL     -- client data 
];
MacroPolygons:   TYPE ~ RECORD [
nPolygons:      {none, one, many},
polygon:       CrossSequence
];
Implicit Tracking
Target:     TYPE ~ RECORD [
point:        Triple ¬ origin,
value:        REAL ¬ 0.0,
nTries:       NAT ¬ 0
];
Implicit Evaluation
Sample:     TYPE ~ RECORD [
value:        REAL ¬ 0.0,  -- value of point sampled in space      
near:        Triple ¬ origin, -- nearest point
vector:       Triple ¬ origin, -- from query point to nearest point
proximity:      REAL ¬ huge, -- client evaluated (~ ABS[value-threshold])
normalized:      BOOL ¬ FALSE, -- iff vector normalized
radius:       REAL ¬ 0.0,  -- radius of tube at nearest point
ratio:        REAL ¬ 0.0,  -- (distance-radius)/radius
squareDistance:     REAL ¬ 0.0,  -- distance-squared to nearest point
distance:       REAL ¬ 0.0,  -- distance to nearest point
distanceSet:      BOOL ¬ FALSE, -- iff distance field is correct
refAny:       REF ANY ¬ NIL-- probably pointer to nearest surface
];
Constants
origin:     Triple ~ G3dBasic.origin;
huge:      REAL ~ Real.LargestNumber;
maxNTriples:    CARDINAL ~ (LAST[CARDINAL]-4-SIZE[TripleSequenceRep[0]])/SIZE[Triple];
maxNNats:    CARDINAL ~ (LAST[CARDINAL]-4-SIZE[NatSequenceRep[0]])/SIZE[NAT];
maxNVertices:   CARDINAL ~ (LAST[CARDINAL]-4-SIZE[VertexSequenceRep[0]])/SIZE[Vertex];
END.