DIRECTORY CedarProcess, Commander, Controls, Draw2d, G3dBasic, G3dControl, G3dDraw, G3dLight, G3dMatrix, G3dRender, G3dShape, G3dTimeTrees, G3dView, Imager, ImagerColor, ImagerSample, IO, Prop, Rope, SF, UnixSpawnTCP, UnixTypes, ViewerClasses; G3dTool: CEDAR DEFINITIONS ~ BEGIN Process: TYPE ~ CedarProcess.Process; CommandHandle: TYPE ~ Commander.Handle; ButtonList: TYPE ~ Controls.ButtonList; ClickProc: TYPE ~ Controls.ClickProc; ControlList: TYPE ~ Controls.ControlList; ControlSizes: TYPE ~ Controls.ControlSizes; OuterData: TYPE ~ Controls.OuterData; Typescript: TYPE ~ Controls.Typescript; Viewer: TYPE ~ Controls.Viewer; Zip: TYPE ~ Draw2d.Zip; IntegerPair: TYPE ~ G3dBasic.IntegerPair; Pair: TYPE ~ G3dBasic.Pair; Plane: TYPE ~ G3dBasic.Quad; Triple: TYPE ~ G3dBasic.Triple; CameraControl: TYPE ~ G3dControl.CameraControl; Light: TYPE ~ G3dLight.Light; LightSequence: TYPE ~ G3dLight.LightSequence; Matrix: TYPE ~ G3dMatrix.Matrix; TransformOrder: TYPE ~ G3dMatrix.TransformOrder; Viewport: TYPE ~ G3dMatrix.Viewport; Context3d: TYPE ~ G3dRender.Context3d; DrawOptions: TYPE ~ G3dDraw.Options; Shape: TYPE ~ G3dShape.Shape; ShapeProc: TYPE ~ G3dShape.ShapeProc; ShapeSequence: TYPE ~ G3dShape.ShapeSequence; ScreenSequence: TYPE ~ G3dShape.ScreenSequence; TTNode: TYPE ~ G3dTimeTrees.Node; TimeTree: TYPE ~ G3dTimeTrees.TimeTree; Camera: TYPE ~ G3dView.Camera; CameraRep: TYPE ~ G3dView.CameraRep; Context: TYPE ~ Imager.Context; RGB: TYPE ~ ImagerColor.RGB; Rectangle: TYPE ~ Imager.Rectangle; SampleMap: TYPE ~ ImagerSample.SampleMap; STREAM: TYPE ~ IO.STREAM; PropList: TYPE ~ Prop.PropList; ROPE: TYPE ~ Rope.ROPE; SFBox: TYPE ~ SF.Box; SpawnData: TYPE ~ UnixSpawnTCP.SpawnData; FileDescriptor: TYPE ~ UnixTypes.FileDescriptor; IconFlavor: TYPE ~ ViewerClasses.IconFlavor; ForkableProc: TYPE ~ CedarProcess.ForkableProc; ControlProc: TYPE ~ Controls.ControlProc; MouseProc: TYPE ~ Controls.MouseProc; DestroyProc: TYPE ~ Controls.DestroyProc; DrawProc: TYPE ~ PROC [ context: Context, viewer: Viewer, whatChanged: REF ANY, view: Matrix, vp: Viewport, v: View, tool: Tool, clientData: REF ANY]; StopProc: TYPE ~ PROC [clientData: REF ANY, reason: ROPE]; ChangeProc: TYPE ~ PROC [lastTool, activeTool: Tool, clientData: REF ANY]; AnimateProc: TYPE ~ PROC [frame: NAT, alpha, time: REAL, clientData: REF ANY]; Animation: TYPE ~ REF AnimationRep; AnimationRep: TYPE ~ RECORD [ name: ROPE ¬ NIL, length: CARDINAL ¬ 0, element: SEQUENCE maxLength: CARDINAL OF SampleMap ]; Animations: TYPE ~ REF AnimationsRep; AnimationsRep: TYPE ~ RECORD [ length: CARDINAL ¬ 0, element: SEQUENCE maxLength: CARDINAL OF Animation ]; NamedBuffer: TYPE ~ RECORD [id: ATOM, map: SampleMap]; WhichVertices: TYPE ~ {selectedOnly, all}; ShapeScreens: TYPE ~ REF ShapeScreensRep; ShapeScreensRep: TYPE ~ RECORD [ length: CARDINAL ¬ 0, element: SEQUENCE maxLength: CARDINAL OF ScreenSequence ]; View: TYPE ~ REF ViewRep; ViewRep: TYPE ~ RECORD [ tool: Tool ¬ NIL, once: BOOL ¬ FALSE, index: NAT ¬ 0, viewer: Viewer ¬ NIL, viewport: Viewport ¬ [], camera: Camera ¬ NIL, spare: Matrix ¬ NIL, idBuffer: LIST OF NamedBuffer ¬ NIL, -- buffer with id screens: ShapeScreens ¬ NIL, extent, previousExtent: SF.Box ¬ [[0, 0], [0, 0]] -- integer screen space ]; ViewProc: TYPE ~ PROC [view: View] RETURNS [continue: BOOL ¬ TRUE]; ViewSequence: TYPE ~ REF ViewSequenceRep; ViewSequenceRep: TYPE ~ RECORD [element: SEQUENCE length: CARDINAL OF View]; Register: PROC [name: ROPE, proc: Commander.CommandProc, usage: ROPE]; Client: TYPE ~ RECORD [ mouse: MouseProc ¬ NIL, -- client supplied mouse proc camera: ControlProc ¬ NIL, -- client supplied camera control proc draw: DrawProc ¬ NIL, -- client supplied draw proc destroy: DestroyProc ¬ NIL, -- client supplied destroy proc animate: AnimateProc ¬ NIL, -- client supplied animation proc stop: StopProc ¬ NIL, -- response to STOP button change: ChangeProc ¬ NIL, -- response to active tool change data: REF ANY ¬ NIL -- client supplied data ]; Operations: TYPE ~ RECORD [ lines: BOOL ¬ FALSE, -- provide Line Drawing Ops button render: BOOL ¬ FALSE, -- provide Render Ops button shape: BOOL ¬ FALSE, -- provide Shape Ops button scene: BOOL ¬ FALSE, -- provide Scene Ops button texture: BOOL ¬ FALSE, -- provide Texture Ops button light: BOOL ¬ FALSE, -- provide Light Ops button io: BOOL ¬ FALSE, -- provide IO Ops button animation: BOOL ¬ FALSE, -- provide Animation Ops button stop: BOOL ¬ FALSE, -- provide Stop button help: BOOL ¬ FALSE -- provide Help button ]; allOps: Operations ~ [TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE]; noOps: Operations ~ []; DisplayMode: TYPE ~ {lined, shaded}; RIBMode: TYPE ~ {spawn, file}; Tool: TYPE ~ REF ToolRep; ToolRep: TYPE ~ RECORD [ ops: Operations ¬ allOps, -- generic operations supported by tool directory: ROPE ¬ NIL, -- directory whence tool was made name: ROPE ¬ NIL, -- name of tool cmd: CommandHandle ¬ NIL, -- commander command: ROPE ¬ NIL, -- to execute after forked process process: Process ¬ NIL, -- the current, forked process clock: REAL ¬ 0.0, -- for timing props: PropList ¬ NIL, -- miscellaneous storage client: Client ¬ [], -- one client per tool outer: Viewer ¬ NIL, -- parent viewer graphics: Viewer ¬ NIL, -- graphical viewer bounds: Rectangle ¬ [0,0,0,0], -- for subsequent draw use outerData: OuterData ¬ NIL, -- Control's data record camera: CameraControl ¬ NIL, -- viewing control controls: ControlList ¬ NIL, -- list of controls buttons: ButtonList ¬ NIL, -- menu typescript: Typescript ¬ NIL, -- for user IO displayMode: DisplayMode ¬ lined, -- lines or shaded regions? ipStrokeWidth: REAL ¬ 2.0, -- for interpress output views: ViewSequence ¬ NIL, -- multiple views activeViews: LIST OF NAT ¬ NIL, -- currently controlled view sprite: Triple ¬ [], -- user-positionable 3d sprite spritePlane: Plane ¬ [], -- plane in which sprite moves drawSprite: BOOL ¬ FALSE, -- display 3d sprite buffering: Buffering ¬ default, -- single, double or depends background: Triple ¬ [1.0, 1.0, 1.0], -- background color for line drawing nVerticesAndPolys: NAT ¬ 0, -- used to estimate display time previousDisplayTime: REAL ¬ 0.0, -- in seconds drawOptions: DrawOptions ¬ [], -- draw for drawing the shape drawPendant: BOOL ¬ FALSE, -- if display of axes "pendant" drawClient: BOOL ¬ TRUE, -- draw any client graphics forInterpress: BOOL ¬ FALSE, -- if output is to an ip file drawCurves: BOOL ¬ FALSE, -- draw shape as curves queryVertices: BOOL ¬ FALSE, -- interactively query vertex info timing: BOOL ¬ FALSE, -- if display line-drawing time drawLights: BOOL ¬ FALSE, -- draw light sources drawAxes: BOOL ¬ FALSE, -- x, y, z axes (also for rendering) previousWhatChanged: REF ANY ¬ NIL, -- previous reason for paint context3d: Context3d ¬ NIL, -- for shaded imaging color: BOOL ¬ FALSE, -- or black/white? rMap, gMap, bMap: SampleMap ¬ NIL, -- to buffer image lights: LightSequence ¬ NIL, -- lights for shaded images frameSize: IntegerPair ¬ [400, 300], -- render size unixSpawn: REF SpawnData ¬ NIL, -- spawn data for Unix renderer ribMode: RIBMode ¬ spawn, -- spawn or via file annotation: BOOL ¬ FALSE, -- if annotate rendered images autoRender: BOOL ¬ FALSE, -- if render image when new view antiAliasing: BOOL ¬ FALSE, -- if anti-aliasing depthBuffering: BOOL ¬ FALSE, -- if z-buffer normalCoding: BOOL ¬ FALSE, -- if normal encoding is on textureFiltering: BOOL ¬ FALSE, -- sum area tables if true hitList: LIST OF NAT, -- indices into shape list shapes: ShapeSequence ¬ NIL, -- central shape collection selectedLight: INT ¬ -1, -- index to currently selected light selectedShape: INT ¬ -1, -- index to currently selected shape selectedVertex: INT ¬ -1, -- currently selected vertex timeTree: TimeTree ¬ NIL, -- root of the time tree focusNode: TTNode ¬ NIL, -- the currently active time tree node time0: REAL ¬ 0.0, -- time at first frame of animation time1: REAL ¬ 0.0, -- time at last frame of animation nFrames: NAT ¬ 0, -- number of frames in animation time: REAL ¬ 0.0, -- the current time frame: NAT ¬ 0, -- current frame of animation playbackPause: REAL ¬ 0.0, -- if positive, just run-through playback: Animation ¬ NIL, -- the current animation animations: Animations ¬ NIL, -- saved for possible playback animateIPName: ROPE ¬ NIL -- root for ip file(s) ]; MakeTool: PUBLIC PROC [ name: ROPE, -- name of the tool extraButtons: ButtonList ¬ NIL, -- extra buttons desired by the client extraControls: ControlList ¬ NIL, -- extra controls desired by the client controlSizes: ControlSizes ¬ [], -- adjust size of controls ops: Operations ¬ allOps, -- default operations provided by the tool client: Client ¬ [], -- client supplied data and procs nViews: NAT ¬ 1, -- number views (0 if tool only: no viewers) noOpen: BOOL ¬ FALSE, -- if noOpen, leave the viewer iconic useArcBalls: BOOL ¬ TRUE, -- arc ball for orientations, or separate controls arcBallSize: INTEGER ¬ 136, -- size in pixels of the arc ball controllers graphicsHeight: INTEGER ¬ 475, -- height of main graphics viewer icon: IconFlavor ¬ document, -- for client-supplied icon useExistingTool: BOOL ¬ FALSE, -- latch onto last moused tool, if one exists camera: CameraRep ¬ [[0, 2, 0], [], 1, 60], -- client can preset camera background: Triple ¬ [1.0, 1.0, 1.0], -- background for line drawing display typescriptHeight: INT ¬ 36, -- height of typescript (0 for no typescript) toolSettings: ToolRep ¬ []] -- client can preset tool RETURNS [t: Tool]; Context3dOk: PROC [t: Tool]; SetActiveTool: PROC [tool: Tool]; GetActiveTool: PROC RETURNS [Tool]; GetActiveClients: PROC RETURNS [LIST OF Client]; ToolBusy: PROC [tool: Tool] RETURNS [BOOL]; MaybeFork: PROC [tool: Tool, proc: ForkableProc, data: REF ANY ¬ NIL] RETURNS [forked: BOOL]; ForceFork: PROC [tool: Tool, proc: ForkableProc]; Stop: PROC [tool: Tool, reason: ROPE ¬ NIL, waitTilAborted: BOOL ¬ FALSE]; Finish: PROC [tool: Tool, reason: ROPE ¬ NIL]; MakeViews: PROC [tool: Tool, nViews: NAT] RETURNS [ViewSequence]; DoWithViews: PROC [tool: Tool, action: ViewProc, activeOnly: BOOL ¬ TRUE]; GetFirstActiveView: PROC [tool: Tool] RETURNS [View]; GetView: PROC [viewer: Viewer, tool: Tool ¬ NIL] RETURNS [View]; GetViewTransform: PROC [viewer: Viewer ¬ NIL, tool: Tool ¬ NIL, out: Matrix ¬ NIL] RETURNS [Matrix]; GetBufferedSampleMap: PROC [view: View, id: ATOM ¬ $Frame] RETURNS [SampleMap]; SetBufferedSampleMap: PROC [map: SampleMap, view: View, id: ATOM ¬ $Frame]; InvalidateViewScreens: PROC [view: View]; SetRenderView: PROC [context3d: Context3d, camera: CameraControl]; UpdateCamera: PROC [tool: Tool]; MatrixFromCamera: PROC [scale: REAL, moves, rotates: Triple, leftHanded: BOOL] RETURNS [Matrix]; SetCameraToIdentity: PROC [camera: CameraControl]; Buffering: TYPE ~ {single, double, default}; SetMinFPS: PROC [fps: NAT]; Repaint: PROC [tool: Tool, whatChanged: REF ¬ $Client, buffering: Buffering ¬ default]; Store: PROC [context: Context, view: View, id: ATOM ¬ $Frame]; Restore: PROC [context: Context, view: View, id: ATOM ¬ $Frame]; InvalidateVertexScreens: PROC [t: Tool, which: WhichVertices]; Draw: DrawProc; EnableClear: PROC [tool: Tool, on: BOOL]; SetAntiAliasing: PROC [tool: Tool, antiAliasing: BOOL]; SetDepthBuffering: PROC [tool: Tool, depthBuffering: BOOL]; SetNormalCoding: PROC [tool: Tool, normalBuffering: BOOL]; Render: PROC [tool: Tool, fork: BOOL ¬ TRUE]; RenderFromCamera: PROC [ context3d: Context3d, context: Context, camera: CameraControl, fork: BOOL ¬ TRUE]; RenderToFile: PROC [ context3d: Context3d, camera: CameraControl, fileName: ROPE, width: NAT ¬ 1024, height: NAT ¬ 768, fork: BOOL ¬ TRUE]; WriteProc: TYPE ~ PROC [rope: ROPE] RETURNS [continue: BOOL ¬ TRUE]; WriteRIBtoFile: PROC [tool: Tool, fileName: ROPE]; WriteRIBtoStream: PROC [tool: Tool, out: IO.STREAM]; ToRIB: PROC [ imageName: ROPE ¬ NIL, frameSize: G3dBasic.IntegerPair, color: BOOL, scale, fieldOfView: REAL, moves, rotates: Triple, shapes: G3dShape.ShapeSequence, lights: G3dLight.LightSequence, writer: WriteProc, comment: ROPE ¬ NIL]; ReadFromShapeFile: PROC [tool: Tool, name: ROPE, autoScale: BOOL ¬ FALSE] RETURNS [err: ROPE ¬ NIL]; AddShape: PROC [tool: Tool, shape: Shape]; DeleteShape: PROC [tool: Tool, name: ROPE]; DeleteShapeEntry: PROC [tool: Tool, shapeID: NAT]; ChooseShape: PROC [t: Tool, header: ROPE ¬ NIL] RETURNS [choice: INT]; DoWithSelectedShapes: PROC [shapes: ShapeSequence, proc: ShapeProc, choice: INT]; SelectShape: PROC [t: Tool, s: Shape, mb: Controls.MouseButton ¬ none]; GetShape: PROC [t: Tool, name: ROPE] RETURNS [Shape]; GetSelectedShape: PROC [t: Tool] RETURNS [Shape]; GetSelectedLight: PROC [t: Tool] RETURNS [Light]; SaveShape: PROC [s: Shape]; RestoreShape: PROC [s: Shape]; PrepareForDrawing: PROC [tool: Tool]; ShapePoint: TYPE ~ RECORD [shape, point: INTEGER ¬ -1]; ScreenPick: PROC [tool: Tool, viewer: Viewer, screen: IntegerPair] RETURNS [ShapePoint]; LightOptions: PROC [lights: LightSequence, eyeView: Triple, ts: Typescript] RETURNS [LightSequence]; Mouse: MouseProc; Controller: ControlProc; IOOpsButton: ClickProc; LightOpsButton: ClickProc; TextureOpsButton: ClickProc; ShapeOpsButton: ClickProc; DrawOpsButton: ClickProc; RenderOpsButton: ClickProc; SceneOpsButton: ClickProc; AnimateOpsButton: ClickProc; AbortButton: ClickProc; HelpButton: ClickProc; FinishButton: ClickProc; StopButton: ClickProc; StartTimer: PROC [tool: Tool]; ElapsedTime: PROC [tool: Tool] RETURNS [seconds: REAL]; PrintElapsedTime: PROC [tool: Tool, elapsedTime: REAL ¬ 0.0, action: ROPE ¬ NIL]; OpenHelp: PROC [key: ROPE]; TSWrite: PROC [tool: Tool, message: ROPE]; SetCursor: PROC [tool: Tool, waiting: BOOL]; LeftRight: TYPE ~ {left, right}; Traversal: TYPE ~ {selfOnly, childrenOnly, selfAndChildren}; ParentObjectNode: PROC [node: TTNode] RETURNS [parent: TTNode]; Sibling: PROC [node: TTNode, which: LeftRight] RETURNS [TTNode]; DoWithShape: PROC [node: TTNode, action: ShapeProc, traversal: Traversal ¬ selfAndChildren]; SelectNodeShapes: PROC [node: TTNode, traversal: Traversal ¬ selfAndChildren]; PropagateShapeMatrices: PROC [node: TTNode]; TransformAndPropagateNode: PROC [ node: TTNode, matrix: Matrix, order: TransformOrder]; ChangeShapeFromMenu: PROC [t: Tool, s: Shape]; CleanAllShapes: PROC [t: Tool]; CleanShape: PROC [s: Shape]; LatchAllShapes: PROC [t: Tool]; LatchShape: PROC [s: Shape]; END. !^ G3dTool.mesa Copyright Ó 1985, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, February 19, 1993 4:39 pm PST Glassner, July 17, 1990 2:16:39 pm PDT Shoemake, November 6, 1989 11:57:52 pm PST Imported Types Procedure Types alpha = (frame-firstFrame)/(lastFrame-firstFrame) Animation Types A Viewer and Camera Control 3d Command Registration Register the given command, to be subsequently invoked via: 3d [arguments]. The command line passed to the command has "3d " removed. A Tool for 3d Rendering and Drawing Book-keeping: Client Supplied: Viewer Miscellany: Views: The Sprite: Line Drawing: Rendering: Selection Shapes and Hierarchy Animation: Tool Creation and Control Create a tool for line drawing and shaded imaging of shapes. In addition to optional client buttons, provide those buttons specified by `operations.' In additon to optional client controls, this tool provides these controls: field of view arcball translation and rotation -- or -- camera mode, scale, translate, and rotate. The client DrawProc may be called with whatChanged: NIL: the entire tool is redrawn $Camera: the user has modified the viewing parameters $Moused: the user moused in the display $Sprite: the user CONTROL-moused in the display; this moves the `sprite' $Vertex: the user SHIFT-moused in the display; this locates the nearest shape vertex $DrawOps: the user selected a line-drawing operation; the display is redrawn $ShapeOps: the user selected a Shape operation; the display is redrawn $Shape: a new shape is added to the scene; the display is redrawn $Scene: the scene description is modified; the display is redrawn $Overlay: the client DrawProc is prompted for any display that is not to be buffered. Whenever the display is redrawn and all mouse buttons are up, the display is buffered (in view.contextBuffer), allowing a subsequent call to Restore. This permits the sprite (or a client defined object), to be overlayed on a (possibly complex) displayed object without redrawing the object. Test that the 3d context is okay; initializing it if necessary. Set tool to be the currently active tool. Usually, this is the tool most recently moused. Return the currently active tool. Usually, this is the tool most recently moused. Return the currently active clients. Return true if the tool is currently busy with a forked process. Fork the forkable proc if the tool isn't busy; proc must not be nested. If data is NIL, then tool is passed to proc as data. Terminate any existing forked procs, and fork the given proc. This will halt any forked tool operation and print the reason in the typescript. Execute tool.command. View Operations Create the specified number of viewports with graphics as the parent viewer. Perform action on currently active views within the tool, if activeOnly; otherwise, perform action on all views within the tool. Return the first active view of the tool. Return the view (if any) associated with the viewer; otherwise, return tool's active view. Return current view transformation; use out if non-NIL. viewer is the preferred argument. Return the named sample map associated with the view. Set the named sample map associated with the view. Set screen.valid to FALSE. Camera Operations Set the context3d's view given the camera. Update the user camera controls according to tool.context3d. Derive matrix from given camera parameters. Set the camera controls and matrix to identity. Line Drawing Operations Set minimum number frames-per-second for double-buffering. Request a repaint of the graphics viewer belonging to the tool. If default buffering, double-buffer if draw time < 1/fps (draw time est. from last display). whatChanged = $Pose will cause the contents of the display to be stored after displaying shapes only; the display is then completed (showing lights, clients, etc.); this stored display may be restored via Restore[]. Save current view's display. Restore previously saved display. Invalidate the specified vertex screen coordinates. Perform the line drawing actions (data presumed to be REF Tool). Do not call this proc via Imager.DoWithBuffer! Shaded Rendering Operations If disabled (on = FALSE) images may be composited using successive renderings. Set the anti-aliasing mode for rendering. Set up or destroy normal buffer when rendering. Set up or destroy depth buffer when rendering. Render an image on the color display if tool not presently rendering. Updates lights; checks for consistency of anti-aliasing, texture filtering, and normal coding. Calls RenderFromCamera; annotates image if requested. Render the 3d context, if not already rendering. First sets the context3d's view from camera. Create AIS file(s) at the specified resolution. 8 or 24 bit is determined by context3d. Nothing is rendered on the color display. Write tool's scene as RIB output to named file. Write tool's scene as RIB output to stream. Low level access for creating RIB output; if imageName = NIL, use frame buffer, else save image as imageName (tiff format Shape Operations Read the named shape into the Tool. If autoScale, adjust Tool scale. Add the given shape to the tool. Delete first encountered instance of the named shape from the tool. Delete the shape according to its index. Create a pop up menu from which to select a shape. Apply proc to the selected shapes, depending on choice: -2: no op, -1: apply to all shapes; else, apply to shapes[choice]. Usually called in response to a user selection of a shape. If the shape is an element of a time-tree: the tool's time-tree focus is set to the shape, and the .selected field is set for s and its children, depending on the mouse button: left: select s only middle or right: select s and its children. If the shape is not part of a time-tree: the tool's time-tree focus is set to NIL, and only s is selected. Return the selected shape; it is part of a time-tree, select tool's time-tree focus to the shape. Return the selected shape; if it is part of a time-tree, set tool's time-tree focus to the shape. Return the selected light. Save s.matrix in a safe place for future restoration. Restore s.matrix from a safe place. Ensure tool's shapes all have .edges (see G3dShape), .matrix; ensure tool's views can support the number of shapes in tool; update tool.nVertsAndPolys. Return [shape, index] if shape's point closest to screen. Light Operations Choose from a pop-up menu to: delete a light, add a light, adjust the specular or diffuse portion of lighting, list the lights, set the shadow proportion. ts is used to query the user. If context3d # NIL, update those shapes affected by lights. Public Procs Provide pointing response for user Camera/orientation controller. Provide IO options to user. Provide light options to user. Provide texture options to user. Provide shape options to user. Provide lf display options to user. Provide rendering options and direct render to user. Provide scene and hierarchy options to user. Provide animation options to user. Provide abort option to user. Provide help option to user. Allow user to specify command to be executed upon completion of a forked process. Stop the current forked process. Timing Set the starting time for elapsed time. Return the elapsed time since the previous call on StartTimer. Print the current elapsed time to the typescript. action is the action being timed. If elapsedTime = 0.0, compute elapsed time from tool.time to present time. Miscellany Open Graphics3dDoc.tioga and scroll to the key. Write the message to the tool's typescript, if it exists; otherwise to the Commander. Set the cursor to be an hourglass or not. TimeTree Operations Return first parent node that contains a non-NIL object. Return NIL if no such node. Return the specified sibling node. Apply action to the self and/or its children. Set selected shapes associated with node according to the specified traversal. Build the inherited transformations for this node and all descendents, and store the result in the corresponding shape.matrix fields. Apply the matrix to the node in the specified order and propagate the matrices to children nodes, storing resulting global transforms in shape.matrix fields. Interactive Shape Changing Give user a menu to change all programmable parameters for this shape. Mark all shapes in the tool as free of changes. Mark this shape as free of changes. Save the changes to all shapes in the tool. Save the changes to this shape. ÊBÖ"cedarcode" style•NewlineDelimiter ™™ Jšœ Ïeœ6™BJ™*J™&™*J˜—JšÏk œ­žœ;˜óJ˜—–0.320 0.931 0.362 textColoršÐblœÐbkÏb  ˜J˜—Jšœž˜head–0.0 24 .div 1 1 textColoršÏl™J• CharProps'Postfix16.0 24 .div 1 1 textColor"š¡œžœ˜*J–'Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜(J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜*J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜(J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜+J–' Postfix16.0 24 .div 1 1 textColor š¡ œžœ˜-J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜(J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜*J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜#J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜+J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜ J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜ J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜#J–'Postfix16.0 24 .div 1 1 textColor"š¡ œžœ˜0J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜!J–'Postfix16.0 24 .div 1 1 textColor š¡ œžœ˜.J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜$J–'Postfix16.0 24 .div 1 1 textColor"š¡œžœ˜1J–' Postfix16.0 24 .div 1 1 textColorš¡œžœ˜'J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜)J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜&J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜!J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜(J–'Postfix16.0 24 .div 1 1 textColor š¡ œžœ˜.J–'Postfix16.0 24 .div 1 1 textColor!š¡œžœ˜0J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜%J–' Postfix16.0 24 .div 1 1 textColor!š¡œžœ˜*J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜"J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜'J–'Postfix16.0 24 .div 1 1 textColorš¡œžœ˜#J–'Postfix16.0 24 .div 1 1 textColorš œžœžœ˜!J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜&J–' Postfix16.0 24 .div 1 1 textColor š¡ œžœ˜+J–'Postfix16.0 24 .div 1 1 textColorš œžœžœžœ˜J–' Postfix16.0 24 .div 1 1 textColorš¡œžœ˜"J–'Postfix16.0 24 .div 1 1 textColorš œžœžœ˜J–'Postfix16.0 24 .div 1 1 textColorš¡œžœžœ˜J–' Postfix16.0 24 .div 1 1 textColor"š¡ œžœ˜,J–'Postfix16.0 24 .div 1 1 textColor#š¡œžœÏc˜2J–' Postfix16.0 24 .div 1 1 textColor$š¡ œžœ˜/—–0.0 24 .div 1 1 textColorš¢™J–' Postfix16.0 24 .div 1 1 textColor&š¡ œžœ˜2J–' Postfix16.0 24 .div 1 1 textColor š¡ œžœ˜+J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜(–' Postfix16.0 24 .div 1 1 textColor š¡ œžœ˜+J˜—–'Postfix16.0 24 .div 1 1 textColorš¡œžœžœ˜J˜J˜Jšœ ž œ˜J˜J˜J˜J˜Jšœ ž œ˜J˜—–'Postfix16.0 24 .div 1 1 textColor5š ¡œžœžœžœžœ žœ˜=J˜—–' Postfix16.0 24 .div 1 1 textColorBš ¡ œžœžœ*žœžœ˜LJ˜—–' Postfix16.0 24 .div 1 1 textColorEš¡ œžœžœ žœžœžœžœ˜PJšœ:™:——–0.0 24 .div 1 1 textColorš¢™J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœžœ˜&–' Postfix16.0 24 .div 1 1 textColorš¡ œžœžœ˜Jšœ žœžœ˜Jšœ ž œ˜Jšœž œ žœžœ ˜8J˜J˜—J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœžœ˜'–' Postfix16.0 24 .div 1 1 textColorš¡ œžœžœ˜Jšœ ž œ˜Jšœž œ žœžœ ˜8J˜——–0.0 24 .div 1 1 textColorš¢™–' Postfix16.0 24 .div 1 1 textColor-š¡ œžœžœžœ˜8J˜—–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜+J˜—J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœžœ˜+–'Postfix16.0 24 .div 1 1 textColorš¡œžœžœ˜!Jšœ ž œ˜Jšœžœ žœžœ˜=J˜J˜—J–'Postfix16.0 24 .div 1 1 textColorš¡œžœžœ ˜–'Postfix16.0 24 .div 1 1 textColorš¡œžœžœ˜Jšœžœ˜Jšœ žœžœ˜Jšœžœ˜Jšœžœ˜J˜Jšœžœ˜Jšœžœ˜Jšœžœžœžœ£˜š ¡œžœžœžœ žœžœ˜FJ˜—J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœžœ˜*J–'Postfix16.0 24 .div 1 1 textColor=š ¡œžœžœ žœ žœžœ˜L—–0.0 24 .div 1 1 textColorš¢™code–(Postfix0.320 0.931 0.362 textColor>šÏnœžœžœ&žœ˜FJ–16.0 24 .div 1 1 textColor™RJ–16.0 24 .div 1 1 textColor™?——–0.0 24 .div 1 1 textColorš¢#™#–'Postfix16.0 24 .div 1 1 textColorš¡œžœžœ˜Jšœžœ£˜Jšœžœ£˜=Jšœ žœ £ ˜)Jšœžœ£˜7—™Jšœ£˜4—™Jšœžœ£˜-Jšœžœ£˜2Jšœ$£˜>Jšœžœ£˜9Jšœžœ£˜4Jšœžœ£˜6Jšœžœ£˜(Jšœžœ£˜1Jšœ&£˜AJšœžœ £˜9—™Jšœžœ£˜1Jš œžœžœžœžœ£˜A—™ Jšœ£˜Jšœžœžœ£˜4—™ Jšœ$£˜@Jšœ*£$˜NJšœžœ £ ˜BJšœžœ £ ˜2Jšœ$£˜AJšœžœžœ£˜?Jšœžœžœ£˜:Jšœžœžœ£˜@Jšœžœžœ£˜7Jšœžœžœ£"˜DJšœ žœžœ£˜Jšœ¦œ¦œ¦œ£˜7Jšœžœ žœ£˜CJšœ £˜4Jšœžœžœ£˜>Jšœžœžœ£ ˜@Jšœžœžœ£˜5Jšœžœžœ£˜1Jšœžœžœ£˜Jšœ žœ £ ˜;Jšœ žœ £˜.Jšœ žœ £˜7Jšœžœ £ ˜AJšœžœ£˜9Jšœžœ£˜AJšœžœžœ£˜6—J˜——–0.0 24 .div 1 1 textColorš¢™–(Postfix0.320 0.931 0.362 textColorš¥œž œ˜Jšœžœ £˜(Jšœžœ£&˜IJšœžœ£'˜LJšœ$£˜>Jšœ£*˜IJšœ£!˜=Jšœžœ £,˜DJšœžœžœ£%˜@Jšœ žœžœ£2˜PJšœ žœ £-˜MJšœžœ £!˜CJšœ!£˜š¥œ¦ž¦œ¦žœ¦œ¦œ¦œ¦œ žœ˜NJšžœ ˜J–16.0 24 .div 1 1 textColor™+J™—–(Postfix0.320 0.931 0.362 textColorš¥œžœ˜2J–16.0 24 .div 1 1 textColor™/——–0.0 24 .div 1 1 textColorš¢™–' Postfix16.0 24 .div 1 1 textColor#š¡ œžœ˜,J˜—–( Postfix0.320 0.931 0.362 textColorš¥ œžœžœ˜J–16.0 24 .div 1 1 textColor™:J™—–(Postfix0.320 0.931 0.362 textColorPš¥œžœžœ,˜WJ–16.0 24 .div 1 1 textColor™?J–16.0 24 .div 1 1 textColor™\J–16.0 24 .div 1 1 textColor™XJ–16.0 24 .div 1 1 textColor™_J–16.0 24 .div 1 1 textColor™J™—–(Postfix0.320 0.931 0.362 textColor9š¥œžœ$žœ ˜>J–16.0 24 .div 1 1 textColor™J™—–(Postfix0.320 0.931 0.362 textColor9š¥œžœ$žœ ˜@J–16.0 24 .div 1 1 textColor™!J™—–(Postfix0.320 0.931 0.362 textColor'š¥œžœ!˜>J–16.0 24 .div 1 1 textColor™3J˜—–(Postfix0.320 0.931 0.362 textColor š¥œ ˜J–16.0 24 .div 1 1 textColoršœ6¦œ™@J–16.0 24 .div 1 1 textColorš¡.™.——–0.0 24 .div 1 1 textColorš¢™–( Postfix0.320 0.931 0.362 textColorš¥ œžœžœ˜)J–16.0 24 .div 1 1 textColoršœ¦œ7™NJ˜—–(Postfix0.320 0.931 0.362 textColor(šÐbnœžœžœ˜7J–16.0 24 .div 1 1 textColor™)J™—–(Postfix0.320 0.931 0.362 textColor*š§œžœžœ˜;J–16.0 24 .div 1 1 textColor™/J˜—–(Postfix0.320 0.931 0.362 textColor+š§¥ œžœžœ˜:J–16.0 24 .div 1 1 textColor™.J™—–(Postfix0.320 0.931 0.362 textColor'š¥œžœžœžœ˜-J–16.0 24 .div 1 1 textColor™EJ–16.0 24 .div 1 1 textColor™^J–16.0 24 .div 1 1 textColor™5J™—–(Postfix0.320 0.931 0.362 textColorš¥œžœ˜Jšœ˜Jšœ˜Jšœ˜Jšœžœžœ˜J–16.0 24 .div 1 1 textColor™^J™—–( Postfix0.320 0.931 0.362 textColorš¥ œžœ˜J˜J˜Jšœ žœ˜Jšœžœ˜Jšœžœ˜Jšœžœžœ˜J–16.0 24 .div 1 1 textColor™XJ–16.0 24 .div 1 1 textColor™)J™—–' Postfix16.0 24 .div 1 1 textColor;š¡ œžœžœžœžœ žœžœ˜DJ˜—–(Postfix0.320 0.931 0.362 textColor$š¥œžœžœ˜2J–16.0 24 .div 1 1 textColor™/J˜—–(Postfix0.320 0.931 0.362 textColor$š¥œžœžœžœ˜4J–16.0 24 .div 1 1 textColor™+J˜—–(Postfix0.320 0.931 0.362 textColorš¥œžœ˜ Jšœ žœžœ˜Jšœ ˜ Jšœžœ˜ Jšœžœ˜J˜Jšœ˜Jšœ˜Jšœ˜Jšœ žœžœ˜J–16.0 24 .div 1 1 textColoršœ)™)J–16.0 24 .div 1 1 textColor™O——–0.0 24 .div 1 1 textColorš¢™–(Postfix0.320 0.931 0.362 textColor8š ¥œžœžœ žœžœ˜IJšžœžœžœ˜J–16.0 24 .div 1 1 textColor™EJ˜—–(Postfix0.320 0.931 0.362 textColor"š¥œžœ˜*J–16.0 24 .div 1 1 textColor™ J™—–( Postfix0.320 0.931 0.362 textColor š¥ œžœžœ˜+J–16.0 24 .div 1 1 textColor™CJ™—–(Postfix0.320 0.931 0.362 textColor"š¥œžœžœ˜2J–16.0 24 .div 1 1 textColor™(J™—–( Postfix0.320 0.931 0.362 textColor;š ¥ œžœžœžœžœ žœ˜FJ–16.0 24 .div 1 1 textColor™2J™—–(Postfix0.320 0.931 0.362 textColor=š¥œžœ2žœ˜Q–16.0 24 .div 1 1 textColor™7J–16.0 24 .div 1 1 textColor™BJ™——–( Postfix0.320 0.931 0.362 textColor<š¥ œžœ6˜GJ–16.0 24 .div 1 1 textColor™:–16.0 24 .div 1 1 textColor™*J–16.0 24 .div 1 1 textColor™3–16.0 24 .div 1 1 textColor™QJ–16.0 24 .div 1 1 textColor™J–16.0 24 .div 1 1 textColor™+——–16.0 24 .div 1 1 textColor™(J–16.0 24 .div 1 1 textColor™-J–16.0 24 .div 1 1 textColor™—J™—–(Postfix0.320 0.931 0.362 textColor-š¥œžœžœžœ ˜5J–16.0 24 .div 1 1 textColor™aJ™—–(Postfix0.320 0.931 0.362 textColor!š¥œžœ žœ ˜1J–16.0 24 .div 1 1 textColor™aJ™—–(Postfix0.320 0.931 0.362 textColor!š¥œžœ žœ ˜1J–16.0 24 .div 1 1 textColor™J™—–( Postfix0.320 0.931 0.362 textColorš¥ œžœ ˜J–16.0 24 .div 1 1 textColor™5J™—–( Postfix0.320 0.931 0.362 textColorš¥ œžœ ˜J–16.0 24 .div 1 1 textColor™#J™—–(Postfix0.320 0.931 0.362 textColorš¥œžœ˜%J–16.0 24 .div 1 1 textColoršœ=™=J–16.0 24 .div 1 1 textColor™YJ™—–' Postfix16.0 24 .div 1 1 textColor-š¡ œžœžœžœ˜7J˜—–( Postfix0.320 0.931 0.362 textColorNš¥ œžœ3žœ˜XJ–16.0 24 .div 1 1 textColor™9——–0.0 24 .div 1 1 textColorš¢™–( Postfix0.320 0.931 0.362 textColor?š¥ œžœ9˜KJšžœ˜–16.0 24 .div 1 1 textColor™J–16.0 24 .div 1 1 textColor™J–16.0 24 .div 1 1 textColor™ J–16.0 24 .div 1 1 textColor™3J–16.0 24 .div 1 1 textColor™J–16.0 24 .div 1 1 textColor™—J–16.0 24 .div 1 1 textColor™J–16.0 24 .div 1 1 textColoršœ¦œ)™;——–0.0 24 .div 1 1 textColorš¢ ™ –(Postfix0.320 0.931 0.362 textColor š¥œ ˜J–16.0 24 .div 1 1 textColor™"J˜—–( Postfix0.320 0.931 0.362 textColorš§ œ˜J–16.0 24 .div 1 1 textColor™J˜—–( Postfix0.320 0.931 0.362 textColor š¥ œ ˜J–16.0 24 .div 1 1 textColor™J™—–(Postfix0.320 0.931 0.362 textColor š¥œ ˜J–16.0 24 .div 1 1 textColor™J™—–(Postfix0.320 0.931 0.362 textColor š¥œ ˜J–16.0 24 .div 1 1 textColor™ J™—–(Postfix0.320 0.931 0.362 textColor š¥œ ˜J–16.0 24 .div 1 1 textColor™J™—–( Postfix0.320 0.931 0.362 textColor š¥ œ ˜J–16.0 24 .div 1 1 textColor™#J™—–(Postfix0.320 0.931 0.362 textColor š¥œ ˜J–16.0 24 .div 1 1 textColor™4J™—–(Postfix0.320 0.931 0.362 textColor š¥œ ˜J–16.0 24 .div 1 1 textColor™,J˜—–(Postfix0.320 0.931 0.362 textColor š¥œ ˜J–16.0 24 .div 1 1 textColor™"J˜—–( Postfix0.320 0.931 0.362 textColor š¥ œ ˜J–16.0 24 .div 1 1 textColor™J™—–( Postfix0.320 0.931 0.362 textColor š¥ œ ˜J–16.0 24 .div 1 1 textColor™J™—–( Postfix0.320 0.931 0.362 textColor š¥ œ ˜J–16.0 24 .div 1 1 textColor™QJ™—–( Postfix0.320 0.931 0.362 textColor š¥ œ ˜J–16.0 24 .div 1 1 textColor™ ——–0.0 24 .div 1 1 textColorš¢™–( Postfix0.320 0.931 0.362 textColorš¥ œžœ˜J–16.0 24 .div 1 1 textColor™'J™—–( Postfix0.320 0.931 0.362 textColor,š¥ œžœžœ žœ˜7J–16.0 24 .div 1 1 textColor™>J˜—–(Postfix0.320 0.931 0.362 textColorAš ¥œžœžœžœžœ˜QJ–16.0 24 .div 1 1 textColor™TJ–16.0 24 .div 1 1 textColor™J——–0.0 24 .div 1 1 textColorš¢ ™ –(Postfix0.320 0.931 0.362 textColorš¥œžœžœ˜J–16.0 24 .div 1 1 textColor™/J™—–(Postfix0.320 0.931 0.362 textColor#š¥œžœžœ˜*J–16.0 24 .div 1 1 textColor™UJ™—–( Postfix0.320 0.931 0.362 textColor#š¥ œžœžœ˜,J–16.0 24 .div 1 1 textColor™)——–0.0 24 .div 1 1 textColorš¢™J–' Postfix16.0 24 .div 1 1 textColorš¡ œžœ˜ –' Postfix16.0 24 .div 1 1 textColor3š¡ œžœ-˜š¥œžœ7¢˜NJ–16.0 24 .div 1 1 textColor™NJ™—–(Postfix0.320 0.931 0.362 textColorš¥œžœ¢˜,J–16.0 24 .div 1 1 textColor™FJ–16.0 24 .div 1 1 textColor™>J˜—–(Postfix0.320 0.931 0.362 textColorš¥œžœ˜!Jšœ˜Jšœ˜Jšœ˜J–16.0 24 .div 1 1 textColor™ZJ–16.0 24 .div 1 1 textColor™B——–0.0 24 .div 1 1 textColorš¢™–(Postfix0.320 0.931 0.362 textColorš¥œžœ˜.J–16.0 24 .div 1 1 textColor™FJ™—–(Postfix0.320 0.931 0.362 textColorš¥œžœ ˜J–16.0 24 .div 1 1 textColor™/J™—–( Postfix0.320 0.931 0.362 textColorš¥ œžœ ˜J™#J–16.0 24 .div 1 1 textColor™—–(Postfix0.320 0.931 0.362 textColorš¥œžœ ˜J–16.0 24 .div 1 1 textColor™+J™—–( Postfix0.320 0.931 0.362 textColorš¥ œžœ ˜J–16.0 24 .div 1 1 textColor™——J™Jšžœ˜J˜—…—;¾Ÿß