G3dNavigateCmdImpl.mesa
Copyright Ó 1985, 1992 by Xerox Corporation. All rights reserved.
Bloomenthal, April 9, 1993 4:13 pm PDT
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;
Navigate Command
NavigateData:    TYPE ~ REF NavigateDataRep;
NavigateDataRep:   TYPE ~ RECORD [
miscellany:
name:       ROPE ¬ NIL,    -- name of file
viewers:
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
display information:
screens:      ScreenSequence ¬ NIL, -- 2d projected vertices
shape information:
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];
};
};
Start Code
usage: Rope.ROPE ¬ "navigate <shape file>";
G3dTool.Register["Navigate", Navigate, "navigate <shape file>"];
END.