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];
};
};