DIRECTORY Commander, CommanderOps, Controls, Draw2d, FileNames, G3dBasic, G3dControl, G3dMatrix, G3dNavigate, G3dDraw, G3dModel, G3dPolygon, G3dShape, G3dTool, IO, Rope, ViewerAbort, ViewerClasses, ViewerOps; G3dNavigateCmdImpl: CEDAR PROGRAM IMPORTS CommanderOps, Controls, Draw2d, FileNames, G3dControl, G3dDraw, G3dModel, G3dPolygon, G3dTool, Rope, ViewerAbort, ViewerOps ~ BEGIN ROPE: TYPE ~ Rope.ROPE; STREAM: TYPE ~ IO.STREAM; Viewer: TYPE ~ ViewerClasses.Viewer; OuterData: TYPE ~ Controls.OuterData; Pair: TYPE ~ G3dBasic.Pair; CameraControl: TYPE ~ G3dControl.CameraControl; Matrix: TYPE ~ G3dMatrix.Matrix; Model: TYPE ~ G3dModel.Model; Shape: TYPE ~ G3dShape.Shape; ScreenSequence: TYPE ~ G3dShape.ScreenSequence; NavigateData: TYPE ~ REF NavigateDataRep; NavigateDataRep: TYPE ~ RECORD [ name: ROPE ¬ NIL, -- name of file tool3d: G3dTool.Tool ¬ NIL, graphics: Viewer ¬ NIL, -- graphical LF viewer outerData: OuterData ¬ NIL, -- Control's data record camera: CameraControl ¬ NIL, -- viewing control pick: INTEGER ¬ -1, -- picked vertex index backFaces: BOOL ¬ TRUE, -- show back faces or not screens: ScreenSequence ¬ NIL, -- 2d projected vertices shape: Shape ¬ NIL, -- the polygonal object model: Model ¬ NIL -- and ancillary information ]; Navigate: Commander.CommandProc ~ { d: NavigateData ¬ NEW[NavigateDataRep]; argv: CommanderOps.ArgumentVector ¬ CommanderOps.Parse[cmd]; IF argv.argc # 2 THEN RETURN[$Failure, usage]; d.name ¬ FileNames.ResolveRelativePath[argv[1]]; d.shape ¬ G3dModel.ShapeFromFile[ d.name, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE]; d.model ¬ G3dModel.GetModel[d.shape]; G3dPolygon.SetPolygonNeighbors[d.model.polygons]; d.tool3d ¬ G3dTool.MakeTool[ name: Rope.Concat["3dNavigate ", d.name], extraButtons: LIST[Controls.ClickButton["Toggle BackFaces", TogBackFaces, d]], graphicsHeight: 300, client: [draw: NavigateDraw, mouse: NavigateMouse, data: d]]; G3dTool.AddShape[d.tool3d, d.shape]; }; TogBackFaces: Controls.ClickProc ~ { d: NavigateData ¬ NARROW[clientData]; d.backFaces ¬ NOT d.backFaces; G3dTool.Repaint[d.tool3d]; }; NavigateMouse: Controls.MouseProc ~ { d: NavigateData ¬ NARROW[clientData]; p: G3dBasic.Pair ¬ [mouse.pos.x, mouse.pos.y]; d.pick ¬ ScreenPick[d.screens, p]; G3dTool.Repaint[d.tool3d]; }; ScreenPick: PROC [screens: ScreenSequence, screen: Pair] RETURNS [picked: CARDINAL ¬ 0] ~ { dist, max: REAL ¬ 100000.0; FOR n: NAT IN [0..screens.length) DO p: Pair ¬ screens[n].pos; dx: REAL ¬ screen.x-p.x; dy: REAL ¬ screen.y-p.y; IF (dist ¬ dx*dx+dy*dy) < max THEN {max ¬ dist; picked ¬ n}; ENDLOOP; }; NavigateDraw: G3dTool.DrawProc ~ { d: NavigateData ¬ NARROW[clientData]; s: Shape ¬ d.shape; Action: PROC ~ { d.screens ¬ G3dDraw.Shape[ context, s, view,, vp,, d.screens, TRUE, [backFaces: IF d.backFaces THEN on ELSE off]]; IF d.pick # -1 THEN G3dDraw.Mark[context, s.faces[d.pick].center, view, vp,, asterisk]; }; IF s.vertices#NIL AND s.surfaces#NIL AND (s.vertices.length>1000 OR s.surfaces.length>500) THEN ViewerAbort.CallWithAbortEnabled[viewer, Action] ELSE Draw2d.DoWithBuffer[context, Action]; }; CameraControlProc: Controls.ControlProc ~ { d: NavigateData ¬ NARROW[clientData]; IF control.whatChanged = $TypedIn OR (control.mouse.button = right AND control.mouse.state # up) THEN { G3dControl.UpdateCameraControl[d.camera]; ViewerOps.PaintViewer[d.graphics, client, FALSE, control.whatChanged]; }; }; usage: Rope.ROPE ¬ "navigate "; G3dTool.Register["Navigate", Navigate, "navigate "]; END. β G3dNavigateCmdImpl.mesa Copyright Σ 1985, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, April 9, 1993 4:13 pm PDT Navigate Command miscellany: viewers: display information: shape information: Start Code Κ–"cedarcode" style•NewlineDelimiter ™™Jšœ Οeœ6™BJ™&J˜JšΟk œΗ˜ΠJ˜—šΠblœžœž˜!Jšžœ|˜ƒJ˜—šœž˜J˜Jšžœžœžœ˜Jšžœžœžœžœ˜Jšœžœ˜'Jšœ žœ˜'Jšœžœ˜Jšœžœ˜0Jšœ žœ˜#Jšœžœ˜ Jšœž œ˜!Jšœžœ˜0—headšΟl™Jšœ žœžœ˜,šœžœžœ˜"™ Jšœ žœžœΟc˜*—™Jšœžœ˜ Jšœžœ‘˜5Jšœžœ‘˜9Jšœžœ‘˜4Jšœ žœ ‘˜2Jšœžœžœ‘˜7—™Jšœžœ‘˜<—™Jšœžœ‘˜4Jšœžœ‘˜7—J˜J˜—šΟnœ˜#Jšœžœ˜'J˜