DIRECTORY FileInterpreter, FS, G3dInterpret, G3dBasic, G3dRender, G3dScene, G3dShape, G3dTool, ImagerColor, IO, List, Rope, StatementInterpreter, ViewerClasses; G3dInterpretImpl: CEDAR PROGRAM IMPORTS FileInterpreter, FS, G3dRender, G3dScene, G3dTool, IO, Rope, StatementInterpreter EXPORTS G3dInterpret ~ BEGIN InterpretTool: TYPE ~ G3dInterpret.InterpretTool; RenderTool: TYPE ~ G3dTool.Tool; ROPE: TYPE ~ Rope.ROPE; Error: PUBLIC SIGNAL [reason: ROPE] = CODE; Draw: G3dScene.SceneProc ~ { tool: G3dTool.Tool ¬ NARROW[data]; tool.shapes ¬ ps.context.shapes; G3dTool.PrepareForDrawing[tool]; G3dTool.Repaint[tool]; }; MakeInterpretTool: PUBLIC PROC [ fileName: ROPE, column: ViewerClasses.Column ¬ left, log: BOOL ¬ TRUE, renderTool: RenderTool ¬ NIL] RETURNS [a: InterpretTool] ~ { IF fileName # NIL THEN { symbols: FileInterpreter.Symbols ¬ FileInterpreter.CreateSymbolTable[NIL]; err: ROPE ¬ StatementInterpreter.InterpretStatement[ "{ OPEN G3dInterpret; NULL }",, LIST[symbols]]; IF err # NIL THEN Error[err]; a ¬ NEW[G3dInterpret.InterpretToolRep]; a.fileTool ¬ FileInterpreter.CreateTool[ symbols, fileName, "3dInterpret", column, a, log,,, Repeat, Abort, LIST[["Help", Help]]]; IF a.fileTool = NIL THEN Error["Can't find file"]; IF (a.renderTool ¬ renderTool) = NIL THEN a.renderTool ¬ G3dTool.MakeTool[name: "3dInterpret", nViews: 0, client: [data: a]]; IF NOT G3dTool.Context3dOk[a.renderTool] THEN Error["Bad 3d context!"]; G3dScene.RegisterProc["Draw", Draw, a.renderTool]; FileInterpreter.Execute[a.fileTool]; }; }; Log: G3dScene.LogProc ~ { a: InterpretTool ¬ NARROW[clientData]; FileInterpreter.WriteToLog[a.fileTool, rope]; }; Parse: PUBLIC PROC [rope: ROPE] ~ { a: InterpretTool ¬ GetInterpretTool[]; { ENABLE { FS.Error => {Log[error.explanation, a]; CONTINUE}; G3dScene.ParseError => {Log[explanation, a]; CONTINUE}; }; IF NOT G3dTool.Context3dOk[a.renderTool] THEN Error["Can't create 3d context"]; a.parseState ¬ G3dScene.Parse[ a.renderTool.context3d, rope, a.fileTool.cmd.out, Log,, a.fileTool.fileName, a, a.parseState]; IF a.parseState.errorMessage # NIL THEN Log[a.parseState.errorMessage, a]; }; }; Parses: PROC [key: ROPE, reals: LIST OF REAL ¬ NIL, ints: LIST OF INT ¬ NIL] ~ { AddToList: PROC [value: IO.Value] ~ { IF tail = NIL THEN values ¬ tail ¬ LIST[value] ELSE {tail.rest ¬ LIST[value]; tail ¬ tail.rest}; }; format: ROPE ¬ Rope.Cat[key, ": "]; values, tail: LIST OF IO.Value ¬ NIL; IF reals # NIL THEN FOR l: LIST OF REAL ¬ reals, l.rest WHILE l # NIL DO AddToList[IO.real[l.first]]; format ¬ Rope.Cat[format, "%g "]; ENDLOOP ELSE FOR l: LIST OF INT ¬ ints, l.rest WHILE l # NIL DO AddToList[IO.int[l.first]]; format ¬ Rope.Cat[format, "%g "]; ENDLOOP; IF values # NIL THEN Parse[IO.PutFLR[format, values]]; }; ParseReals: PUBLIC PROC [key: ROPE, values: LIST OF REAL] ~ {Parses[key, values]}; ParseInts: PUBLIC PROC [key: ROPE, values: LIST OF INT] ~ {Parses[key,, values]}; GetInterpretTool: PUBLIC PROC RETURNS [InterpretTool] ~ { RETURN[NARROW[FileInterpreter.GetClientData[]]]; }; Help: ViewerClasses.ClickProc ~ {G3dTool.OpenHelp["3dInterpret"]}; Repeat: FileInterpreter.ClientProc ~ { renderTool: G3dTool.Tool ¬ NARROW[clientData, InterpretTool].renderTool; renderTool.context3d ¬ NIL; renderTool.shapes ¬ NIL; }; Abort: FileInterpreter.ClientProc ~ { G3dRender.AbortRender[NARROW[clientData, InterpretTool].renderTool.context3d]; }; END. ..  G3dInterpretImpl.mesa Copyright Σ 1988, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, July 19, 1992 11:20 am PDT Heckbert, August 10, 1988 6:36:38 pm PDT Glassner, November 18, 1989 12:25:38 pm PST Type Declarations Tool Creation and Use Previous procs used before we relied on OPEN MakeInterpretTool: PUBLIC PROC [script: ROPE, log: BOOL _ TRUE, fork: BOOL _ FALSE] RETURNS [data: InterpretTool] ~ { IF script # NIL THEN { FillTable: FileInterpreter.ClientFillTableProc ~ { RegisterProc[NEW[RealProc _ CameraFieldOfView]]; RegisterProc[NEW[Real3Proc _ CameraPosition]]; RegisterProc[NEW[Real3Proc _ CameraLookAt]]; RegisterProc[NEW[Real3Proc _ CameraUpDirection]]; RegisterProc[NEW[RopeReal7Proc _ ShapeRotate]]; RegisterProc[NEW[RopeReal3Proc _ ShapePlace]]; RegisterProc[NEW[RopeProc _ AddShape]]; RegisterProc[NEW[RopeProc _ DeleteShape]]; RegisterProc[NEW[RopeSwitchProc _ BackFaces]]; RegisterProc[NEW[RopeProc _ InvertShapeNormals]]; RegisterProc[NEW[RopeRealProc _ SetShapeShininess]]; RegisterProc[NEW[RopeReal3Proc _ SetShapeColor]]; RegisterProc[NEW[RopeRenderModeProc _ SetShapeRenderMode]]; RegisterProc[NEW[RopeRenderStyleProc _ SetShapeRenderStyle]]; RegisterProc[NEW[Rope2Proc _ ReadTextureMap]]; RegisterProc[NEW[Rope2Proc _ ReadBumpMap]]; RegisterProc[NEW[RopeRealProc _ SetBumpScale]]; RegisterProc[NEW[RopeReal2Proc _ ScaleTextureMap]]; RegisterProc[NEW[RopeProc _ RemoveTextureAndBumpMapping]]; RegisterProc[NEW[RopeLightStyleProc _ SetShapeLighting]]; RegisterProc[NEW[RopeReal6Proc _ AddLight]]; RegisterProc[NEW[RopeProc _ DeleteLight]]; RegisterProc[NEW[Real3Proc _ SetAmbientLight]]; RegisterProc[NEW[PROC _ Render]]; RegisterProc[NEW[RopeProc _ RenderToFile]]; RegisterProc[NEW[RopeProc _ SavePicture]]; RegisterProc[NEW[Real3Proc _ SetBackground]]; RegisterProc[NEW[SwitchProc _ SetAntiAliasing]]; RegisterProc[NEW[Real4Proc _ SetViewPort]]; RegisterProc[NEW[DisplayModeProc _ SetDisplayMode]]; FOR l: List.LORA _ G3dInterpret.GetScriptProcRegistry[], l.rest WHILE l # NIL DO RegisterProc[l.first]; ENDLOOP; }; symbols: FileInterpreter.Symbols _ FileInterpreter.CreateSymbolTable[FillTable]; data _ NEW[InterpretToolRep]; data.tool _ FileInterpreter.CreateTool[ symbols, script, "G3dInterpret", cmd, data, log,, AbortProc, LIST[["Help", Help]]]; IF data.tool = NIL THEN Error["Can't find file"]; IF log THEN data.tool.out _ cmd.out; FileInterpreter.Execute[data.tool, fork]; }; }; scriptProcRegistry: LIST OF REF ANY _ NIL; RegisterScriptProc: PUBLIC PROC [refAny: REF ANY] ~ { scriptProcRegistry _ LIST[scriptProcRegistry, refAny]; }; UnRegisterAllScriptProcs: PUBLIC PROC ~ { scriptProcRegistry _ NIL; }; GetScriptProcRegistry: PUBLIC PROC RETURNS [LIST OF REF ANY] ~ { RETURN[scriptProcRegistry]; }; Κt•NewlineDelimiter –"cedarcode" style™™Jšœ Οeœ6™BJ™'J™(J™+J˜JšΟk œ—˜ J˜—šΡblnœžœž˜JšžœR˜YJšžœ ˜J˜—Jšœž˜headšΟl™Jšœžœ˜1Jšœ žœ˜ šžœžœžœ˜J˜—Jš œž œžœ žœžœ˜-—š ™šΟnœ˜Jšœžœ˜"J˜ Jšœ ˜ Jšœ˜J˜J˜—š‘œž œ˜ Jšœ ž˜J˜$Jšœžœžœ˜Jšœžœ˜Jšžœ˜J˜šžœ žœžœ˜JšœEžœ˜Jšœžœ+˜4JšœΟsœ’œžœ ˜/—Jšžœžœžœ ˜Jšœžœ ˜'˜(JšœCžœ˜Y—Jšžœžœžœ˜2šžœžœžœ˜8Jšœ’œ-˜D—Jšžœžœ#žœ˜GJ˜2J˜$J˜—˜J˜——š‘œ˜Jšœžœ ˜&Jšœ-˜-J˜J˜—š‘œžœžœžœ˜#J˜&˜šžœ˜Jšžœ&žœ˜2Jšœ,ž œ˜7J˜—Jšžœžœ#žœ"˜O˜Jšœ’œ’œ’œ,˜^—Jšžœžœžœ#˜JJ˜—J˜J˜—š‘œžœžœ žœžœžœžœžœžœžœžœ˜PšΠbn œžœ žœ ˜%šžœž˜ Jšžœžœ˜ Jšžœžœ˜1—J˜—Jšœžœ˜#Jš œžœžœžœ žœ˜%šžœ ž˜š žœžœžœžœžœžœž˜9Jšœ žœ˜J˜!Jšž˜—šžœžœžœžœžœžœžœž˜7Jšœ žœ˜J˜!Jšžœ˜——Jšžœ žœžœžœ˜6J˜J˜—Jš‘ œžœžœžœ žœžœžœ˜Rš‘ œžœžœžœ žœžœžœ˜QJ˜—š‘œžœžœžœ˜9Jšžœžœ#˜0J˜J˜—š‘œ>˜BJ˜—š‘œ ˜&Jšœžœ'˜HJšœžœ˜Jšœžœ˜J˜J˜—š‘œ ˜%Jšœžœ2˜NJ˜J˜——Jšžœ˜J˜šΠbl,™,š‘œž œ žœžœžœžœžœ™SJšžœ™J™šžœ žœžœ™š‘ œ)™2Jšœ žœ#™3Jšœ žœ!™1Jšœ žœ™/Jšœ žœ$™4Jšœ žœ!™1Jšœ žœ ™0Jšœ žœ™*Jšœ žœ™-Jšœ žœ™/Jšœ žœ$™4Jšœ žœ&™6Jšœ žœ#™3Jšœ žœ+™;Jšœ žœ-™=Jšœ žœ!™1Jšœ žœ™.Jšœ žœ!™1Jšœ žœ%™5Jšœ žœ-™=Jšœ žœ)™9Jšœ žœ™.Jšœ žœ™-Jšœ žœ"™2Jšœ žœž œ ™&Jšœ žœ žœ™.Jšœ žœ™-Jšœ žœ ™0Jšœ žœ#™3Jšœ žœ™.Jšœ žœ%™5š žœ žœ0žœžœž™PJ™Jšžœ™—J™—J™PJšœžœ™™'Jšœ=žœ™S—Jšžœ žœžœ™1Jšžœžœ™$J™)J™—J™J™—š œžœžœžœžœžœ™*J˜—š ‘œžœžœ žœžœ™5Jšœžœ™6J™J™—š‘œžœžœ™)Jšœžœ™J™J™—š‘œžœžœžœžœžœžœžœ™@Jšžœ™J™J™——J˜—…— NΠ