ThreeDMisc.mesa 
Last Edited by: Crow, December 16, 1986 4:50:59 pm PST
DIRECTORY
IO      USING [STREAM],
Terminal    USING [Virtual],
Rope     USING [ROPE],
Imager    USING [Context],
ImagerColor   USING [RGB],
Vector3d    USING [Triple, Pair, Quad],
Pixels     USING [Extent, BYTE, SampleSet],
ScanConvert   USING [RealSequence, GetColorProc],
ThreeDSurfaces  USING [PatchDisplayProc],
ThreeDBasics  USING [ClipState, Context, VtxToRealSeqProc];
 
 
ThreeDMisc: 
CEDAR 
DEFINITIONS
~ BEGIN
Types
Context: TYPE ~ ThreeDBasics.Context;
Triple: TYPE ~ Vector3d.Triple;
Pair: TYPE ~ Vector3d.Pair;           -- RECORD [ x, y: REAL];
RGB: TYPE ~ ImagerColor.RGB;
Rectangle: TYPE ~ Pixels.Extent;
RealSequence: TYPE ~ ScanConvert.RealSequence;
 
Utility Procedures
RGBtoPixelValue: PROC[context: REF ThreeDBasics.Context, clr: RGB, values: Pixels.SampleSet]
      RETURNS[ Pixels.SampleSet ];   -- get color for low-level functions
PutPixel: PROC[context: REF Context, x, y: NAT, clr: RGB]; -- a very slow way to set a pixel
ClipLineWithPlane: PROC[plane: Vector3d.Quad, p1, p2: Triple]    -- clips 3D lines
       RETURNS[ insidePt, clippedPt: Triple, state: ThreeDBasics.ClipState ];
DrawRGBLine: PROC[context: REF Context, inP1, inP2: Triple, clr: RGB]; -- 3D lines, clipped
PrependWorkingDirectory: PROC[context: REF Context, file: Rope.ROPE]           RETURNS[Rope.ROPE];       -- adds working directory from context to name
UpdateDisplay: 
PUBLIC 
PROC[context: 
REF Context] 
RETURNS[changed: 
BOOLEAN];
Gets new pixels from display if viewers has changed something
 
CopyContextData: PROC [dstCtx, srcCtx: REF Context];   -- copies all but display
CopyDisplayData: PROC [dstCtx, srcCtx: REF Context];   -- copies nothing but display
RegisterSurfaceType: 
PROC[context: 
REF Context, type: 
ATOM];
Set up display procs for some surface types
 
RegisterSurfaceDisplayProc: 
PROC[context: 
REF Context, type: 
ATOM, 
        proc: ThreeDSurfaces.PatchDisplayProc, lines: 
BOOLEAN ← 
FALSE ];
Substitute a new display proc for the surface type
 
StartLog: PROC [context: REF Context] RETURNS[IO.STREAM]; -- open typescript log 
FlushLog: PUBLIC PROC [context: REF Context];     
CloseLog: PUBLIC PROC [context: REF Context];
 
Colors and Text
GetMappedColor: 
PROC[context: 
REF Context, clr: 
RGB] 
RETURNS[Pixels.
BYTE];
Finds closest entry in color map
 
SetNamedColor: PROC [imagerCtx: Imager.Context, color: Rope.ROPE];
SetRGBColor: PROC [imagerCtx: Imager.Context, clr: RGB];
LoadStd8BitClrMap: PROC [vt: Terminal.Virtual];
Rotate8BitClrMap: PROC [vt: Terminal.Virtual, firstValue, lastValue, duration: NAT ← 0];
Show8BitClrMap: PROC [context: REF Context];
ShowMapOnLog: PROC [context: REF Context, vt: Terminal.Virtual];
LoadColorRamp: PROC [vt: Terminal.Virtual, clr1, clr2, exponent: RGB];
LoadMultiRamps: PROC [vt: Terminal.Virtual, colors: LIST OF RGB];
AdjustValueRamp: PROC[context: REF Context, exponent: RGB];
AdjustSaturation: PROC[context: REF Context, percent: REAL];
LoadOldStd8BitClrMap: PUBLIC PROC [vt: Terminal.Virtual];
SetUpTerrainColors: PROC[vt: Terminal.Virtual];
ShowRope: PROC[context: REF Context, x, y: REAL, rope: Rope.ROPE, 
     color: Rope.ROPE ← NIL, fontRope: Rope.ROPE ← NIL, size: REAL ← 20];
 
AIS Files and Texture Images
DitherImage: PROC[dstContext, rgbContext: REF Context];
ScaleDownImage: PROC[dstContext, srcContext: REF Context];
MakeStripes: PROC[context: REF Context, numStripes, min, max, power: REAL];
MakeStretchedSpots: PROC[context: REF Context, 
        spotsAcross, min, max, power: REAL, stretched: BOOLEAN ← FALSE];
DrawQuad: 
PROC[context: 
REF Context, intensity: 
REAL, 
      x1, y1, x2, y2, x3, y3, x4, y4: 
REAL];
 
 
View and Lighting control
SetAmbientLight: PROC [context: REF Context, color: Rope.ROPE];
SetBackgroundColor: PROC [context: REF Context, color: Rope.ROPE];
SetBackgroundImage: PROC [context: REF Context, aisFile: Rope.ROPE];
SetBackgroundContext: PROC [context, bkGrdCtx: REF Context ];
GetBackgroundColor: PUBLIC PROC [context: REF Context] RETURNS [color: RGB];
 
Shape Manipulation
Hide: PROC[context: REF Context, shapeName: Rope.ROPE]; -- maintain data but don't display
Reveal: PROC[context: REF Context, shapeName: Rope.ROPE]; -- undo Hide
MakePlane: PROC[context: REF Context, shapeName: Rope.ROPE, 
      squaresPerSide: NAT];
AddShapeAt: PROC[context: REF Context, shapeName: Rope.ROPE, fileName: Rope.ROPE, 
         position: Triple ← [0.,0.,0.] ]; 
SetFacetedColor: PROC[context: REF Context, shapeName: Rope.ROPE, color: RGB];
SetSmoothColor: PROC[context: REF Context, shapeName: Rope.ROPE, color: RGB];
SetLinesColor: PUBLIC PROC[context: REF Context, shapeName: Rope.ROPE, color: RGB];
SetShininess: PROC[context: REF Context, shapeName: Rope.ROPE, shininess: REAL ← 12.0];
SetTransmittance: PROC[context: REF Context, shapeName: Rope.ROPE, t: REAL];
ShadingProcName: PROC[context: REF Context, shapeName, procName: Rope.ROPE ];
GetShadingProcs: PROC[context: REF Context, shapeName: Rope.ROPE, 
        storeProc: ThreeDBasics.VtxToRealSeqProc,
        shadeProc: ScanConvert.GetColorProc];
 
Scene Manipulation
CombineBoxes: PROC[context: REF Context];
SaveOnFile: PROC[context: REF Context, fileName: Rope.ROPE];
RestoreFromFile: PROC[context: REF Context, fileName: Rope.ROPE];
MakeFrameFromFile: 
PROC[context: 
REF Context, fileName: Rope.
ROPE];
Renders a scene described by a file without disturbing the current scene
 
 
Frame Generation and Animation
MakeFrame: PROC[context: REF Context];    -- makes new frame from context
MakeHiResFrame: PROC[context: REF ThreeDBasics.Context,   -- makes new context and
         width, height: NAT, name: Rope.ROPE];   -- outputs AIS file
MakeInterpressPage: PROC[context: REF Context, fileName: Rope.ROPE]; -- makes IP master
RemoteMakeFrame: 
PROC[context: 
REF ThreeDBasics.Context, numForksHint: 
NAT ← 0];
Implemented in DistributedDisplayImpl.mesa, makes frame using multiple machines
 
ShowShapes: PROC[context: REF Context];    -- adds to existing frame
ShowWireFrameShapes: PROC[context: REF Context]; -- for quick linedrawings
OrbitEye: PROC[ context: REF Context,  -- makes frames in elliptical path about "lookingAt"
     lookingFrom, lookingAt, axis: Triple, framesPerRev: NAT, 
     filename: Rope.ROPE ← NIL, numFrames: NAT ← 32767, startAt: NAT ← 0]; 
MakeFramesFromTo: PROC[context: REF Context,   -- makes frames in linear path
          lookingFrom, lookingAt, toLookingFrom, toLookingAt: Triple,  
          numFrames: NAT, startAt: NAT ← 0, filename: Rope.ROPE ← NIL];
END.