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. Ξ ImplicitSolidCmdImpl.mesa Copyright Σ 1985, 1990 by Xerox Corporation. All rights reserved. Bloomenthal, March 15, 1991 6:01 pm PST Type Declarations Tool Buttons Render Display Support Start Code Κz•NewlineDelimiter ™™JšœB™BJ™'J˜JšΟk œ“˜œJ˜—šΠblœœ˜ J˜Jšœs˜zJ˜—Jšœ˜headšΟl™Jšœœ˜0Jšœ œ˜(Jšœœ˜+Jšœ œ˜'Jšœœ˜*Jšœœ˜(Jšœ œ˜&Jšœ œ˜#Jšœœ˜Jšœœ˜"Jšœœ˜0Jšœœ˜5Jšœœ˜0Jšœ œ˜#Jšœœœ˜Jšœ œ˜,Jšœ œ˜'—šŸ™Jšœœœ ˜šœ œœ˜Jšœœ˜Jšœ œ˜Jšœœ˜!JšœœΟc˜?Jšœœ ˜6Jšœœ ˜/Jšœœ ˜5Jšœœ ˜3Jšœœ ˜4J˜J˜—šœ œ˜J˜—šΠbnœ˜%Jšœ œ ˜J˜ J˜Pšœ#˜#J˜šœ œ˜J˜,J˜0J˜1—šœ œ˜J˜J˜>J˜>J˜&—J˜J˜J˜J˜—Jšœ˜J˜"J˜J˜—šΟn œœ˜J˜IJ˜J˜—š‘œ˜+Jšœ œ ˜šœ ˜$Jšœœœ ˜L—J˜J˜—Jš’œœ˜;—šŸ™š’œœ œ˜Jšœœ˜$J˜J˜J˜—š’ œ˜Jšœ œ ˜˜RJšœ/ œ˜;—J˜ J˜J˜—š’œ˜Jšœ œ ˜˜WJšœ0œ˜;—J˜J˜—š’ œ˜Jšœ œ ˜J˜J˜J˜—š‘ œœ#˜GJ˜—š’œœœœ˜,J˜Jšœ œœ˜(J˜——šŸ™š’ œ˜Jšœ œ˜J˜1Jšœœœ œ ˜CJšœ œœ˜1J˜ šœœœ˜Bšœœœ˜Bšœœœ˜BJšœœ˜J˜;J˜DJšœœ%˜3Jšœœœœ˜>Jšœ œ˜&J˜šœ ˜J˜5J˜>Jšœ˜—Jšœ˜—Jšœ˜—Jšœ˜—J˜——šŸ™š ’œœœœœ˜7Jšœ*œ˜>J˜J˜—šΟbœ˜Jšœ œ˜š’œœ˜šœ˜JšœE˜I—J˜XJ˜EJ˜—J˜;J˜%J˜——šŸ™š’ œœ"˜1šœ)˜+Jšœ˜"Jšœ5œ˜@—J˜J˜—Jš’œœœ=˜_—šŸ ™ J˜:—J˜Jšœ˜—…—€μ