<<>> <> <> <> DIRECTORY CedarProcess, CtBasic, Commander, Controls, Draw2d, G3dBasic, G3dControl, G3dDraw, G3dMatrix, MessageWindow, Real, Rope, ViewerClasses, ViewerOps; ImplicitSolidImpl: CEDAR PROGRAM IMPORTS CedarProcess, CtBasic, Commander, Controls, Draw2d, G3dControl, G3dDraw, G3dMatrix, MessageWindow, Real, ViewerOps ~ BEGIN <> ForkableProc: TYPE ~ CedarProcess.ForkableProc; Process: TYPE ~ CedarProcess.Process; CommandProc: TYPE ~ Commander.CommandProc; OuterData: TYPE ~ Controls.OuterData; IntegerPair: TYPE ~ CtBasic.IntegerPair; SampleMaps: TYPE ~ CtBasic.SampleMaps; SampleMap: TYPE ~ CtBasic.SampleMap; DrawProc: TYPE ~ Draw2d.DrawProc; Pair: TYPE ~ G3dBasic.Pair; Triple: TYPE ~ G3dBasic.Triple; TripleSequence: TYPE ~ G3dBasic.TripleSequence; TripleSequenceRep: TYPE ~ G3dBasic.TripleSequenceRep; CameraControl: TYPE ~ G3dControl.CameraControl; Matrix: TYPE ~ G3dMatrix.Matrix; ROPE: TYPE ~ Rope.ROPE; ClickProc: TYPE ~ ViewerClasses.ClickProc; Viewer: TYPE ~ ViewerClasses.Viewer; <> Tool: TYPE ~ REF ToolRep; ToolRep: TYPE ~ RECORD [ resolution: REAL _ 40.0, radius: REAL _ 0.25, sphere: TripleSequence _ NIL, process: Process _ NIL, -- the current, forked process camera: CameraControl _ NIL, -- viewing control outer: Viewer _ NIL, -- parent viewer outerData: OuterData _ NIL, -- associated data graphics: Viewer _ NIL, -- graphics viewer view: Matrix _ NIL -- view transformation ]; sphereRes: NAT ~ 10; ImplicitSolidCommand: CommandProc ~ { t: Tool _ NEW[ToolRep]; NewPoints[t]; t.camera _ G3dControl.InitCameraControl[proc: CameraControlProc, clientData: t]; t.outerData _ Controls.OuterViewer[ name: "Implicit Solid", buttons: LIST[ Controls.ClickButton["Stop", StopButton, t], Controls.ClickButton["Render", RenderButton, t], Controls.ClickButton["Radius", RadiusButton, t]], controls: LIST[ t.camera.proxySelect, t.camera.proxy.xMov, t.camera.proxy.yMov, t.camera.proxy.zMov, t.camera.proxy.xRot, t.camera.proxy.yRot, t.camera.proxy.zRot, t.camera.scale, t.camera.fieldOfView], graphicsHeight: 300, drawProc: Draw, typescriptHeight: 18, clientData: t]; t.outer _ t.outerData.parent; t.graphics _ t.outerData.graphics; }; NewPoints: PROC [t: Tool] ~ { t.sphere _ G3dDraw.GetSpherePoints[[0.0, 0.0, 0.0], t.radius, sphereRes]; }; CameraControlProc: Controls.ControlProc ~ { t: Tool ~ NARROW[clientData]; IF control.whatChanged = $TypedIn OR (control.mouse.button = right AND control.mouse.state # up) THEN Repaint[t]; }; Destroy: Controls.DestroyProc ~ {Stop[NARROW[clientData]]}; <> Blink: PROC [message: ROPE] ~ { MessageWindow.Append[message, TRUE]; MessageWindow.Blink[]; }; RadiusButton: ClickProc ~ { t: Tool _ NARROW[clientData]; t.radius _ Controls.TypescriptReadValue[t.outerData.typescript, "Radius", t.radius ! Controls.ControlError => {Blink["Bad Value"]; CONTINUE}]; NewPoints[t]; }; ResolutionButton: ClickProc ~ { t: Tool _ NARROW[clientData]; t.resolution _ Controls.TypescriptReadValue[t.outerData.typescript, "Res", t.resolution ! Controls.ControlError => {Blink["Bad Value"]; CONTINUE}]; }; RenderButton: ClickProc ~ { t: Tool _ NARROW[clientData]; MaybeFork[t, ForkRender]; }; StopButton: ClickProc ~ {Stop[NARROW[clientData], " . . . aborted\n"]}; Stop: PROC [t: Tool, reason: ROPE _ NIL] ~ { CedarProcess.Abort[t.process]; IF reason # NIL THEN TSWrite[t, reason]; }; <> ForkRender: ForkableProc ~ { t: Tool _ NARROW[data]; maps: SampleMaps _ CtBasic.GetColorDisplayMaps[]; map: SampleMap _ IF maps.bpp = 8 THEN maps[0].map ELSE maps[1].map; stepSize: REAL _ 4.0*t.radius/REAL[t.resolution]; CtBasic.FillMaps[maps, 0, 0, 0]; FOR z: REAL _ -2.0*t.radius, z+stepSize WHILE z <= 2.0*t.radius DO FOR y: REAL _ -2.0*t.radius, y+stepSize WHILE y <= 2.0*t.radius DO FOR x: REAL _ -2.0*t.radius, x+stepSize WHILE x <= 2.0*t.radius DO value: REAL _ x*x+y*y+z*z; p: Pair _ G3dMatrix.TransformD[[x, y, z], t.camera.matrix]; m: IntegerPair _ CtBasic.MapCoordsFromPair[[p.x, 1.33333*p.y], map]; oVal: CARDINAL _ CtBasic.GetBWPixel[map, m.x, m.y]; pVal: CARDINAL _ Real.Round[MIN[255.0, MAX[0., 255.0*value]]]; IF oVal # 0 THEN pVal _ (oVal+pVal)/2; CedarProcess.CheckAbort[]; SELECT maps.bpp FROM 8 => CtBasic.PutBWPixel[maps[0].map, m.x, m.y, pVal]; 24 => CtBasic.PutRGBPixel[maps, m.x, m.y, [pVal, pVal, pVal]]; ENDCASE; ENDLOOP; ENDLOOP; ENDLOOP; }; <> Repaint: PROC [t: Tool, whatChanged: REF ANY _ NIL] ~ { ViewerOps.PaintViewer[t.graphics, client, FALSE, whatChanged]; }; Draw: DrawProc ~ { t: Tool ~ NARROW[data]; Action: PROC ~ { IF whatChanged = NIL THEN t.view _ G3dControl.InitContext[context, t.camera, viewer,, t.view]; G3dDraw.DrawSphere[context, [0, 0, 0], t.radius, sphereRes, t.view, viewport, t.sphere]; G3dDraw.DrawCube[context, [0, 0, 0], 2.0*t.radius, t.view, viewport]; }; viewport: G3dMatrix.Viewport _ G3dView.GetViewport[viewer]; Draw2d.DoWithBuffer[context, Action]; }; <> MaybeFork: PROC [t: Tool, proc: ForkableProc] ~ { IF CedarProcess.GetStatus[t.process] = busy THEN TSWrite[t, "Tool is busy!\n"] ELSE t.process _ CedarProcess.Fork[proc, t, [background, TRUE]]; }; TSWrite: PROC [t: Tool, rope: ROPE] ~ {Controls.TypescriptWrite[t.outerData.typescript, rope]}; <> Commander.Register["ImplicitSolid", ImplicitSolidCommand]; END.