File: TFO3dImpl.mesa
Last edited by Bier on July 14, 1987 10:36:53 pm PDT
Copyright © 1984 by Xerox Corporation. All rights reserved.
Contents: Useful functions for creating text files to describe 3d objects and scenes. (used by Fileout3dImpl, BasicObject3dImpl and intended for use by programs which define other master objects to implement their FileoutProc [see DisplayList3d]).
DIRECTORY
CoordSys, FileNames, Imager, IO, Rope, Shading, SV2d, SV3d, SVArtwork, SVGraphics, SVModelTypes, SVSceneTypes, TFO3d;
TFO3dImpl: CEDAR PROGRAM
IMPORTS CoordSys, FileNames, IO, Shading, SVArtwork, SVGraphics
EXPORTS TFO3d =
BEGIN
Artwork: TYPE = SVModelTypes.Artwork;
ArtworkClass: TYPE = SVModelTypes.ArtworkClass;
Box: TYPE = SVModelTypes.Box;
Color: TYPE = Imager.Color;
DrawStyle: TYPE = SVModelTypes.DrawStyle;
Point2d: TYPE = SV2d.Point2d;
FileCamera: TYPE = SVSceneTypes.FileCamera;
FrameBox: TYPE = SVModelTypes.FrameBox;
Material: TYPE = SVModelTypes.Material;
Matrix3by3: TYPE = SV2d.Matrix3by3;
Matrix4by4: TYPE = SV3d.Matrix4by4;
OMap: TYPE = SVModelTypes.OMap;
Plane: TYPE = SV3d.Plane;
Point3d: TYPE = SV3d.Point3d;
Slice: TYPE = SVSceneTypes.Slice;
SpaceFunction: TYPE = SVModelTypes.SpaceFunction;
Tube: TYPE = SVModelTypes.Tube;
SMap: TYPE = SVModelTypes.SMap;
FileoutBOOL: PUBLIC PROC [f: IO.STREAM, bool: BOOL] = {
IF bool THEN f.PutRope["TRUE"] ELSE f.PutRope["FALSE"];
};
FileoutMatrix: PUBLIC PROC [f: IO.STREAM, mat: Matrix4by4] = {
f.PutF["[[%g",[real[mat[1][1]]]];
FOR j: NAT IN[2..4] DO
f.PutF[",%g",[real[mat[1][j]]]];
ENDLOOP;
f.PutF["]"];
FOR i: NAT IN[2..3] DO
f.PutF[", [%g",[real[mat[i][1]]]];
FOR j: NAT IN[2..4] DO
f.PutF[",%g",[real[mat[i][j]]]];
ENDLOOP;
f.PutF["]"];
ENDLOOP;
f.PutF["]"];
};
FileoutMatrix3by3: PUBLIC PROC [f: IO.STREAM, mat: Matrix3by3] = {
Only writes the first 2 rows.
f.PutF["[[%g",[real[mat[1][1]]]];
FOR j: NAT IN[2..3] DO
f.PutF[",%g",[real[mat[1][j]]]];
ENDLOOP;
f.PutF["]"];
f.PutF[", [%g",[real[mat[2][1]]]];
FOR j: NAT IN[2..3] DO
f.PutF[",%g",[real[mat[2][j]]]];
ENDLOOP;
f.PutF["]]"];
};
FileoutPoint2d: PUBLIC PROC [f: IO.STREAM, point2d: Point2d] = {
f.PutF["[%g,%g]", [real[point2d[1]]], [real[point2d[2]]]];
};
FileoutPoint3d: PUBLIC PROC [f: IO.STREAM, point3d: Point3d] = {
f.PutF["[%g,%g,%g]",[real[point3d[1]]],[real[point3d[2]]],[real[point3d[3]]]];
};
FileoutPoint3dAsPoint2d: PUBLIC PROC [f: IO.STREAM, point3d: Point3d] = {
f.PutF["[%g,%g]",[real[point3d[1]]],[real[point3d[2]]]];
};
FileoutPlane: PUBLIC PROC [f: IO.STREAM, plane: Plane] = {
f.PutF["[%g,%g,%g,%g]", [real[plane.A]], [real[plane.B]], [real[plane.C]], [real[plane.D]]];
};
FileoutColor: PUBLIC PROC [f: IO.STREAM, color: Color] = {
r, g, b: REAL;
[r, g, b] ← Shading.ExtractRGB[color];
f.PutF["[%g,%g,%g]",[real[r]], [real[g]], [real[b]]];
};
FileoutSurface: PUBLIC PROC [f: IO.STREAM, surface: REF ANY] = {
IF surface = NIL THEN f.PutF["NIL"]
ELSE {
WITH surface SELECT FROM
tube: Tube => f.PutF["tube [radius: %g, height: %g]", [real[tube.R]], [real[tube.H]]];
box: Box =>{ f.PutF["box "];
FileoutPoint3d[f, [box.x, 2*box.halfY, box.z]];
};
spaceFunction: SpaceFunction => f.PutF["NIL "];
ENDCASE => ERROR;
};
};
FileoutMaterial: PUBLIC PROC [f: IO.STREAM, material: Material] = {
matRope: Rope.ROPE;
matRope ← SVArtwork.MaterialToRope[material];
f.PutRope[matRope];
};
FileoutSMap: PUBLIC PROC [f: IO.STREAM, sMap: SMap] = {
mapRope: Rope.ROPE;
mapRope ← SVArtwork.SMapToRope[sMap];
f.PutRope[mapRope];
};
FileoutOMap: PUBLIC PROC [f: IO.STREAM, oMap: OMap] = {
mapRope: Rope.ROPE;
mapRope ← SVArtwork.OMapToRope[oMap];
f.PutRope[mapRope];
};
FileoutCamera: PUBLIC PROC [f: IO.STREAM, fileCamera: FileCamera] = {
f.PutRope["Camera: "];
f.PutRope[fileCamera.name];
f.PutRope[" origin: "];
FileoutPoint3d[f, fileCamera.origin];
f.PutRope[" focusPoint: "];
FileoutPoint3d[f, fileCamera.focusPoint];
f.PutF[" slant: %g", [real[fileCamera.slant]]];
f.PutChar[IO.CR];
f.PutF["resolution: %g", [real[fileCamera.resolution]]];
f.PutF[" focalLength: %g", [real[fileCamera.focalLength]]];
f.PutF[" projection: %g", [rope[SVGraphics.ProjectionToRope[fileCamera.projection]]]];
f.PutChar[IO.CR];
f.PutRope[" frame: "];
FileoutFrame[f, fileCamera.frame];
f.PutChar[IO.CR];
f.PutRope["clippingPlanes: "];
FileoutClippingPlanes[f, fileCamera.clippingPlanes];
f.PutChar[IO.CR];
f.PutRope["visibleAssemblies: "];
FileoutListOfRope[f, fileCamera.visibleAssemblies];
f.PutChar[IO.CR];
};

FileoutFrame: PUBLIC PROC [f: IO.STREAM, frame: FrameBox] = {
f.PutChar['[];
FileoutPoint2d[f, [frame.downLeft[1], frame.upRight[2]]];
f.PutRope[", "];
FileoutPoint2d[f, [frame.upRight[1], frame.downLeft[2]]];
f.PutRope[" fullScreen: "];
FileoutBOOL[f, frame.fullScreen];
f.PutChar[']];
};
FileoutClippingPlanes: PUBLIC PROC [f: IO.STREAM, clippingPlanes: LIST OF Plane] = {
firstPlane: Plane;
IF clippingPlanes = NIL THEN RETURN;
firstPlane ← clippingPlanes.first;
FileoutPlane[f, firstPlane];
FOR list: LIST OF Plane ← clippingPlanes.rest, list.rest UNTIL list = NIL DO
f.PutChar[',];
FileoutPlane[f, list.first];
ENDLOOP;
};
CountClippingPlanes: PROC [clippingPlanes: LIST OF Plane] RETURNS [count: NAT] = {
count ← 0;
FOR list: LIST OF Plane ← clippingPlanes, list.rest UNTIL list = NIL DO
count ← count + 1;
ENDLOOP;
};
FileoutVisibleAssemblies: PUBLIC PROC [f: IO.STREAM, assemblyList: LIST OF Slice] = {
IF assemblyList = NIL THEN RETURN;
f.PutRope[assemblyList.first.name];
FOR list: LIST OF Slice ← assemblyList.rest, list.rest UNTIL list = NIL DO
f.PutRope[", "];
f.PutRope[list.first.name];
ENDLOOP;
};
FileoutStyle: PUBLIC PROC [f: IO.STREAM, style: DrawStyle] = {
styleRope: Rope.ROPE ← SVGraphics.DrawStyleToRope[style];
f.PutRope[styleRope];
};
ArtworkClassToRope: PROC [class: ArtworkClass] RETURNS [className: Rope.ROPE] = {
SELECT class FROM
justColor => className ← "c";
simpleSurface => className ← "simpleSurface";
spaceFunction => className ← "spaceFunction";
ENDCASE => ERROR;
};
WriteArtwork: PUBLIC PROC [f: IO.STREAM, artwork: Artwork] = {
f.PutF["%g ", [rope[ArtworkClassToRope[artwork.class] ]] ];
FileoutMaterial[f, artwork.material];
f.PutChar[IO.SP];
SELECT artwork.class FROM
justColor => {
FileoutColor[f, artwork.color];
};
simpleSurface => {
aisName: Rope.ROPE;
IF artwork.coordSys = NIL THEN f.PutF["coordSys: %g ", IO.rope["NIL"]]
ELSE f.PutF["coordSys: %g ", IO.rope[CoordSys.Name[artwork.coordSys]] ];
f.PutF[" surface: "];
FileoutSurface[f, artwork.surface];
f.PutChar[IO.CR];
f.PutF["SMap: "];
FileoutSMap[f, artwork.sMap];
f.PutF[" OMap: "];
FileoutOMap[f, artwork.oMap];
f.PutChar[IO.SP];
aisName ← FileNames.GetShortName[artwork.source];
f.PutF["source: %g ", [rope[aisName]]];
IF artwork.isColorFile THEN f.PutF["colorFile"] ELSE f.PutF["bwFile"];
f.PutF[" resolution: %g\n", [real[artwork.resolution]]];
f.PutF["mat: "];
FileoutMatrix3by3[f, artwork.artWRTPad.mat];
f.PutF[" color: "];
FileoutColor[f, artwork.color];
};
spaceFunction => {
spaceFunction: SpaceFunction ← NARROW[artwork.surface];
IF artwork.coordSys = NIL THEN f.PutF["coordSys: %g ", IO.rope["NIL"]]
ELSE f.PutF["coordSys: %g ", IO.rope[CoordSys.Name[artwork.coordSys]] ];
f.PutF[" surface: "];
FileoutSurface[f, artwork.surface];
f.PutF[" scalars: "];
FileoutPoint3d[f, spaceFunction.scalars];
f.PutF[" func: colorcube"];
};
ENDCASE => ERROR;
};
FileoutListOfRope: PUBLIC PROC [f: IO.STREAM, ropeList: LIST OF Rope.ROPE] = {
IF ropeList = NIL THEN RETURN;
f.PutRope[ropeList.first];
FOR list: LIST OF Rope.ROPE ← ropeList.rest, list.rest UNTIL list = NIL DO
f.PutRope[", "];
f.PutRope[list.first];
ENDLOOP;
};
END.