DIRECTORY Commander, CommanderOps, Convert, FS, G2dBasic, G3dTool, IO, PFS, Rope; G3dRenderCmdImpl: CEDAR PROGRAM IMPORTS CommanderOps, Convert, FS, G3dTool, IO, PFS, Rope ~ BEGIN ROPE: TYPE ~ Rope.ROPE; Triple: TYPE ~ G2dBasic.Triple; IntegerPair: TYPE ~ G2dBasic.IntegerPair; format: ERROR = CODE; RenderCmd: Commander.CommandProc ~ {msg ¬ Process[cmd, render]}; MatteCmd: Commander.CommandProc ~ {msg ¬ Process[cmd, matte]}; Process: PROC [cmd: Commander.Handle, op: {render, matte}] RETURNS [err: ROPE ¬ NIL] ~ { ENABLE { format, Convert.Error => {err ¬ "bad command argument"; GOTO Bad}; PFS.Error => {err ¬ "can't open rib file"; GOTO Bad}; IO.Error, IO.EndOfStream => {err ¬ "can't find Format statement in rib file"; GOTO Bad}; }; GetSize: PROC [file: ROPE] RETURNS [wh: IntegerPair] ~ { contents: IO.STREAM ¬ PFS.StreamOpen[PFS.PathFromRope[file]]; DO IF Rope.Equal[IO.GetCedarTokenRope[contents].token, "Format", FALSE] THEN {wh.x ¬ IO.GetInt[contents]; wh.y ¬ IO.GetInt[contents]; EXIT}; ENDLOOP; }; ModifyFile: PROC [file: ROPE, wh: IntegerPair, light: Triple] ~ { in: IO.STREAM ¬ PFS.StreamOpen[PFS.PathFromRope[file]]; out: IO.STREAM ¬ FS.StreamOpen[file, $create]; DO line: ROPE ¬ IO.GetLineRope[in ! IO.EndOfStream => EXIT]; SELECT TRUE FROM Rope.Find[line, "Format", 0, FALSE] # -1 => IF wh # [] THEN line ¬ IO.PutFR["Format %g %g 1", IO.int[wh.x], IO.int[wh.y]]; Rope.Find[line, "distantlight\" 2", 0, FALSE] # -1 => IF light # [] THEN line ¬ IO.PutFR["LightSource \"distantlight\" 2 \"lightcolor\" [1.0 1.0 1.0] \"intensity\" [1.0] \"from\" [%g %g %g] \"to\" [0.0 0.0 0.0]", IO.real[light.x], IO.real[light.y], IO.real[light.z]]; ENDCASE; IO.PutF1[out, "%g\n", IO.rope[line]]; ENDLOOP; IO.Close[out]; }; DoCommand: PROC [command: ROPE] ~ { IO.PutF1[cmd.out, "%g\n", IO.rope[command]]; [] ¬ CommanderOps.DoCommand[command, cmd]; }; BaseRIB: PROC [name: ROPE] RETURNS [base: ROPE] ~ { i: INT ¬ Rope.FindBackward[name, ".rib",, FALSE]; base ¬ Rope.Substr[name, 0, IF i = -1 THEN Rope.Length[name] ELSE i]; }; i: INTEGER ¬ 1; base, name: ROPE ¬ NIL; light: Triple ¬ []; wh: IntegerPair ¬ []; args: CommanderOps.ArgumentVector ¬ CommanderOps.Parse[cmd]; WHILE i < args.argc DO GetInt: PROC RETURNS [n: INTEGER] ~ { IF (i ¬ i+1) = args.argc THEN ERROR format; n ¬ Convert.IntFromRope[args[i]]; }; GetReal: PROC RETURNS [r: REAL] ~ { IF (i ¬ i+1) = args.argc THEN ERROR format; r ¬ Convert.RealFromRope[args[i]]; }; SELECT TRUE FROM Rope.Equal[args[i], "-light"] => {light.x¬GetReal[]; light.y¬GetReal[]; light.z¬GetReal[]}; Rope.Equal[args[i], "-size"] => {wh.x ¬ GetInt[]; wh.y ¬ GetInt[]}; ENDCASE => IF name = NIL THEN name ¬ args[i] ELSE RETURN[IO.PutFR1["redundant name: %g", IO.rope[args[i]]]]; i ¬ i+1; ENDLOOP; IF name = NIL THEN RETURN["missing file name"]; base ¬ BaseRIB[name]; IF wh # [] OR light # [] THEN ModifyFile[name, wh, light]; IF wh = [] THEN wh ¬ GetSize[name]; SELECT op FROM render => { DoCommand[Rope.Concat["WritePlain ", name]]; DoCommand[Rope.Concat["! render ", name]]; DoCommand[IO.PutFR["! tiffcopy -none -noalpha %g.tiff %g.dump", IO.rope[base], IO.rope[base]]]; DoCommand[IO.PutFLR["Ct RawDumpToAIS %g.dump %g -w %g -h %g", LIST[IO.rope[base], IO.rope[base], IO.int[wh.x], IO.int[wh.y]]]]; DoCommand[Rope.Cat["Ct View ", base, "-red.ais"]]; }; matte => { matteName: ROPE ¬ Rope.Concat[base, ".Matte"]; DoCommand[IO.PutFR["! tiffsize -src White.tiff -sw 0 0 100 100 -dst Temp.tiff -db 0 0 %g %g", IO.int[wh.x], IO.int[wh.y]]]; DoCommand[IO.PutFR["! tiffcomp \"%g.tiff = %g.tiff over Temp.tiff\"", IO.rope[matteName], IO.rope[base]]]; DoCommand[IO.PutFR["! tiffcopy -none -noalpha %g.tiff %g.dump", IO.rope[matteName], IO.rope[matteName]]]; DoCommand[IO.PutFLR["ct RawDumpToAIS %g.dump %g -w %g -h %g", LIST[IO.rope[matteName], IO.rope[matteName], IO.int[wh.x], IO.int[wh.y]]]]; DoCommand[Rope.Cat["Ct View ", matteName, "-red.ais"]]; DoCommand["Delete Temp.tiff"]; }; ENDCASE; EXITS Bad => NULL; }; G3dTool.Register["Render", RenderCmd, "render <'rib' file> [-size ] [-light ]"]; G3dTool.Register["Matte", MatteCmd, "matte <'rib' file>"]; END. ˆ G3dRenderCmdImpl.mesa Copyright Σ 1985, 1992 by Xerox Corporation. All rights reserved. Bloomenthal, July 23, 1992 10:44 am PDT Κz•NewlineDelimiter –"cedarcode" style™šœ™Jšœ Οeœ6™BJ™'J˜—šΟk œ:žœžœ˜QJ˜—šΡblnœžœž˜Jšžœžœ žœžœ˜9J˜—šœž˜J˜Jšžœžœžœ˜Jšœžœ˜šœ žœ˜)J˜—Jšœžœžœ˜J˜JšΟn œ7˜@š œ6˜>J˜—š  œžœ-žœžœžœ˜Xšžœ˜Jšœ8žœ˜BJšžœ(žœ˜5JšžœžœBžœ˜XJ˜—š œžœžœžœ˜8Jš œ žœžœžœ žœ˜=šž˜šžœ žœ.žœ˜DJšžœ žœžœžœ˜D—Jšžœ˜—J˜—š  œžœžœ%˜AJš œžœžœžœ žœ˜7Jšœžœžœžœ˜.šž˜Jš œžœžœžœžœ˜9šžœžœž˜šœžœ ˜+Jš žœ žœžœžœ žœ ˜N—šœ'žœ ˜5šžœ žœžœ‚˜žJšžœžœžœ˜6——Jšžœ˜—Jšžœžœ ˜%Jšžœ˜—Jšžœ ˜J˜—š  œžœ žœ˜#Jšžœžœ˜,J˜*J˜—š  œžœžœžœžœ˜3Jšœžœ$žœ˜1JšœΟsœ‘œ‘œ‘ž‘œ‘œ‘œ‘ž‘œ‘ž‘œ˜EJ˜—Jšœžœ˜Jšœ žœžœ˜J˜J˜J˜<šžœž˜š œžœžœžœ˜%Jšžœžœžœ˜+J˜!J˜—š œžœžœžœ˜#Jšžœžœžœ˜+J˜"J˜—šžœžœž˜J˜[J˜Cšžœžœž˜Jšžœ˜Jšžœžœžœžœ˜?——J˜Jšžœ˜—Jšžœžœžœžœ˜/J˜Jšžœ žœ žœ˜:Jšžœ žœ˜#šžœž˜˜ J˜,J˜*šœ žœ3˜?Jšžœ žœ˜—šœ žœ1˜=Jš žœžœ žœ žœ žœ˜A—Jšœ2˜2J˜—˜ Jšœ žœ˜.Jšœ žœQžœ žœ ˜{šœ žœ9˜EJšžœžœ˜$—šœ žœ3˜?Jšžœžœ˜)—šœ žœ1˜=Jš žœžœžœžœ žœ˜K—Jšœ7˜7J˜J˜—Jšžœ˜—Jšžœžœ˜J˜J˜—Jšœ‘œ ‘œ‘œ‘œ‘œ‘œ‘œ‘œ‘œ‘œ‘œ˜\J˜:J˜—Jšžœ˜J˜—…—