home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume21 / rayshade / part15 (.txt) < prev    next >
LaTeX Document  |  1991-07-21  |  47KB  |  1,158 lines

  1. Newsgroups: comp.sources.misc
  2. From: Rayshade Construction Co. <rayshade@weedeater.math.YALE.EDU>
  3. Subject:  v21i018:  rayshade - A raytracing package for UNIX, Part15/19
  4. Message-ID: <1991Jul21.033921.29419@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: d11e96fffc02505dfbe7c6a125ba4161
  6. Date: Sun, 21 Jul 1991 03:39:21 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8. Submitted-by: Rayshade Construction Co. <rayshade@weedeater.math.YALE.EDU>
  9. Posting-number: Volume 21, Issue 18
  10. Archive-name: rayshade/part15
  11. Environment: UNIX, !16BIT
  12. #! /bin/sh
  13. # This is a shell archive.  Remove anything before this line, then unpack
  14. # it by saving it into a file and typing "sh file".  To overwrite existing
  15. # files, type "sh file -c".  You can also feed this as standard input via
  16. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  17. # will see the following message at the end:
  18. #        "End of archive 15 (of 19)."
  19. # Contents:  Doc/Guide/objects.tex Doc/Guide/running.tex
  20. #   etc/rsconvert/yacc.y
  21. # Wrapped by kolb@woody on Wed Jul 17 17:56:54 1991
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. if test -f 'Doc/Guide/objects.tex' -a "${1}" != "-c" ; then 
  24.   echo shar: Will not clobber existing file \"'Doc/Guide/objects.tex'\"
  25. echo shar: Extracting \"'Doc/Guide/objects.tex'\" \(16377 characters\)
  26. sed "s/^X//" >'Doc/Guide/objects.tex' <<'END_OF_FILE'
  27. X\chapter{Object Definition}
  28. XObjects in \rayshade are composed of relatively simple {\em primitive}
  29. Xobjects.  These primitives may be used by themselves, or they
  30. Xmay be combined to form more complex objects known as {\em aggregates}.
  31. XA special family of aggregate objects,
  32. X{\em Constructive Solid Geometry} or CSG
  33. Xobjects, are the result of a boolean operations applied to
  34. Xprimitive, aggregate, or CSG objects.
  35. XThis chapter describes objects from a strictly geometric point of
  36. Xview.  Later chapters on surfaces, textures, and shading describe
  37. Xhow object appearances are defined.
  38. XAn {\em instance} is an object that has optionally been transformed
  39. Xtextured.  They are the entities that are actually rendered by
  40. X{\em rayshade}; when you specify that, for example, a textured
  41. Xsphere is to be rendered, you are said to be instantiating
  42. Xthe textured sphere.
  43. XAn instance
  44. Xis specified as a primitive, aggregate, or CSG object that
  45. Xis followed by optional transformation and texturing information.
  46. XTransformations and textures are described in Chapters 7 and 8 respectively.
  47. X\section{The World Object}
  48. XWriting a \rayshade input file is principally
  49. Xa matter of defining a special aggregate object, the World object,
  50. Xwhich is a list of the objects in the scene.  When writing a \rayshade
  51. Xinput file, all objects that are instantiated outside of object-definition
  52. Xblocks are added to the World object; you need not (not should you)
  53. Xdefine the World object explicitly in the input file.
  54. X\section{Primitives}
  55. XPrimitive objects are the building box with which other objects are
  56. Xcreated.  Each primitive type has associated with it specialized
  57. Xmethods for
  58. Xcreation,
  59. Xintersection with a ray,
  60. Xbounding box calculation,
  61. Xsurface normal calculation,
  62. Xray enter/exit classification,
  63. Xand for the computation 2D texture coordinates termed {\em u-v}
  64. Xcoordinates.
  65. XThis latter method is often referred to as the {\em inverse mapping}
  66. Xmethod.
  67. XWhile most of these methods should be of little concern to you, the
  68. Xinverse mapping methods
  69. Xwill affect the way in which certain textures are applied to primitives.
  70. XInverse mapping is a matter of computing normalized $u$ and $v$ coordinates
  71. Xfor a given point on the surface of the primitive.  For planar objects,
  72. Xthe $u$ and $v$ coordinates of a point are computed
  73. Xby linear interpolation based upon the $u$ and $v$ coordinates assigned
  74. Xto vertices or other known points on the primitive.  For non-planar
  75. Xobjects, $uv$ computation can be considerably more involved.
  76. XThis section briefly describes each primitive and
  77. Xthe syntax that should be used to create an instance of the primitive.
  78. XIt also describes the inverse mapping method, if any, for each type.
  79. X\begin{defprim}{blob}{{\em thresh st r} \evec{p} [{\em st r} \evec{p} \ldots]}
  80. X    Defines a blob with consisting of a threshold equal to {\em thresh},
  81. X    and a
  82. X    group of one or more metaballs.  Each metaball is defined by 
  83. X    its position \evec{p}, radius {\em r}, and strength {\em st}.
  84. X\end{defprim}
  85. XFor now, see the source code for more explicit documentation.
  86. XThere is no inverse mapping method for blobs.
  87. X\begin{defprim}{box}{\evec{corner1} \evec{corner2}}
  88. X    Creates an axis-aligned box
  89. X    which has \evec{corner1} and \evec{corner2} as
  90. X    opposite corners.
  91. X\end{defprim}
  92. XTransformations may be applied to the box if a non-axis-aligned instance
  93. Xis required.  There is no inverse mapping method for boxes.
  94. X\begin{defprim}{sphere}{{\em radius} \evec{center}}
  95. X    Creates a sphere with the given {\em radius} and centered at the
  96. X    given position.
  97. X\end{defprim}
  98. XNote that ellipsoids may be created by applying the proper scaling
  99. Xto a sphere.  Inverse mapping on the sphere is accomplished
  100. Xby computing the longitude and latitude of the point on the sphere,
  101. Xwith the $u$ value corresponding to longitude and $v$ to latitude.
  102. XOn an untransformed sphere, the $z$ axis defines the poles, and the
  103. X$x$ axis intersects the sphere at $u = 0$, $v = 0.5$.  There are
  104. Xdegeneracies at the poles: the south pole contains all points of
  105. Xlatitude 0., the north all points of latitude 1.
  106. X\begin{defprim}{torus}{{\em rmajor rminor} \evec{center} \evec{up}}
  107. X    Creates a torus centered at \evec{center} by rotating
  108. X    a circle with the given minor radius around the center
  109. X    point at a distance equal to the major radius. 
  110. X\end{defprim}
  111. XIn tori inverse mapping,
  112. Xthe $u$ value is computed using the angle of rotation about the
  113. Xup vector, and the $v$ value is computing the angle of rotation
  114. Xaround the tube, with $v=0$ occuring on the innermost point of the tube.
  115. X\begin{defprim}{triangle}{\evec{p1} \evec{p2} \evec{p3}}
  116. X    Creates a triangle with the given vertices.
  117. X\end{defprim}
  118. X\begin{defprim}{triangle}{\evec{p1} \evec{n1} \evec{p2} \evec{n2}
  119. X    \evec{p3} \evec{n3}}
  120. X    Creates a Phong-shaded triangle with the given vertices and
  121. X    vertex normals.
  122. X\end{defprim}
  123. XFor both Phong- and flat-shaded triangles, the $u$ axis is the
  124. Xvector from \evec{p1} to \evec{p2}, and the $v$ axis the vector
  125. Xfrom \evec{p1} to \evec{p3}.  There is a degeneracy at
  126. X\evec{p3}, which contains all points with $v = 1.0$.  This default
  127. Xmapping may be modified using the {\tt triangleuv} primitive described
  128. Xbelow.
  129. X\begin{defprim}{triangleuv}{\evec{p1} \evec{n1} \evec{uv1}
  130. X  \evec{p2} \evec{n2} \evec{uv2}
  131. X  \evec{p3} \evec{n3} \evec{uv3}}
  132. X    Creates a Phong-shaded triangle with the given vertices,
  133. X    vertex normals.  When performing texturing, the
  134. X    {\em uv} given for each vertex are used instead of the
  135. X    default values.
  136. X\end{defprim}
  137. XWhen computing $uv$ coordinates within the interior of the
  138. Xtriangle, linear interpolation of the coordinates associated with
  139. Xeach triangle vertex is used.
  140. X\begin{defprim}{poly}{\evec{p1} \evec{p2} \evec{p3} [\evec{p4} \ldots ]}
  141. X    Creates a polygon with the given vertices. The vertices
  142. X    should be given in counter-clockwise order as one is
  143. X    looking at the ``top'' side of the polygon.  The number of
  144. X    vertices in a polygon is limited only by available memory.
  145. X\end{defprim}
  146. XInverse mapping for arbitrary polygons is problematical.
  147. X\Rayshade
  148. Xpunts and equate $u$ with the $x$ coordinate of the point of intersection,
  149. Xand $v$ with the $y$ coordinate.
  150. X\begin{defprim}{hf}{{\em file}}
  151. X    Creates a height field defined by the altitude data stored
  152. X    in the named {\em file}.  The height field is based upon
  153. X    perturbations of the unit square in the $z=0$ plane, and is
  154. X    rendered as a surface tessellated by right isosceles triangles.
  155. X\end{defprim}
  156. XSee Appendix B for a discussion of the format of a height field file.
  157. XHeight field inverse mapping is straight-forward:  $u$ is the
  158. X$x$ coordinate of the point of intersection, $v$ the $y$ coordinate.
  159. X\begin{defprim}{plane}{\evec{point} \evec{normal}}
  160. X    Creates a plane that passes through the given point and
  161. X    has the specified normal.
  162. X\end{defprim}
  163. XInverse mapping on the plane is identical to polygonal inverse mapping.
  164. X\begin{defprim}{cylinder}{{\em radius} \evec{bottom} \evec{top}}
  165. X    Creates a cylinder that extends from \evec{bottom} to \evec{top}
  166. X    and has the indicated {\em radius}.  Cylinders are rendered
  167. X    {\em without} endcaps.
  168. X\end{defprim}
  169. XThe cylinder's axis defines the $v$ axis.  The $u$ axis wraps around the
  170. Xcylinder, with $u=0$ dependent upon the orientation of the cylinder.
  171. X\begin{defprim}{cone}{$rad_{bottom}$ \evec{bottom} $rad_{top}$ \evec{top}}
  172. X    Creats a (truncated) cone that extends from \evec{bottom} to
  173. X    \evec{top}.  The cone will have a radius of $rad_{bottom}$ at
  174. X    \evec{bottom} and a radius of $rad_{top}$ at \evec{top}.
  175. X    Cones are rendered {\em without} endcaps.
  176. X\end{defprim}
  177. XCone inverse mapping is analogous to cylinder mapping.
  178. X\begin{defprim}{disc}{{\em radius} \evec{pos} \evec{normal}}
  179. X    Creates a disc centered at the given position and with the
  180. X    indicated surface normal.
  181. X\end{defprim}
  182. XDiscs are useful for placing
  183. Xendcaps on cylinders and cones.
  184. XInverse mapping for the disc is based on the computation of the
  185. Xnormalized polar coordinates of the point of intersection.  The
  186. Xnormalized radius
  187. Xof the point of intersection is assigned to $u$, while the normalized angle
  188. Xfrom a reference vector is assigned to $v$.
  189. X\section{Aggregate Objects}
  190. XAn aggregate is a collection of primitives, aggregate, and CSG
  191. Xobjects.  An aggregate, once defined, may be instantiated at will,
  192. Xwhich means that
  193. Xcopies that are optionally transformed and textured may be made.
  194. XIf a scene calls for the presence of many geometrically identical
  195. Xobjects, only one such object need be defined; the one defined object
  196. Xmay then be instantiated many times.
  197. XAn aggregate is one of several possible types.  These aggregate types
  198. Xare differentiated by the type of ray/aggregate intersection algorithm
  199. X(often termed an {\em acceleration technique} or {\em efficiency scheme})
  200. Xthat is used.
  201. XAggregates are defined by giving a keyword that defines the
  202. Xtype of the aggregate, followed by
  203. Xa series of object instantiations and
  204. Xsurface definitions, and terminated using the {\tt end} keyword.
  205. XIf a defined object contains no instantiations, a warning message
  206. Xis printed.
  207. XThe most basic type of aggregate, the {\em list}, performs
  208. Xintersection testing in the simplest possible way:  Each object in the
  209. Xlist is tested for intersection with the ray in turn, and the closest
  210. Xintersection is returned.
  211. X\begin{defkey}{list}{\ldots {\tt end}}
  212. X    Create a List object containing those objects instantiated between
  213. X    the {\tt list}/{\tt end} pair.
  214. X\end{defkey}
  215. XThe {\em grid} aggregate
  216. Xdivides the region of space it occupies into a number of discrete
  217. Xbox-shaped
  218. Xvoxels.  Each of these voxels contains a list of the objects that
  219. Xintersect the voxel.  This discretization makes it possible to
  220. Xrestrict the objects
  221. Xtested for intersection to those that are likely to hit the ray,
  222. Xand to test
  223. Xthe objects in nearly ``closest-first'' order.
  224. X\begin{defkey}{grid}{{\em xvox yvox zvox} \ldots {\tt end}}
  225. X    Create a Grid objects composed of {\em xvox} by {\em yvox} by
  226. X    {\em zvox} voxels containing those objects
  227. X    instantiated between the {\tt grid}/{\tt end} pair.
  228. X\end{defkey}
  229. XIt is usually only worthwhile to ``engrid'' rather large,
  230. Xcomplex collections of objects.  Grids also use a great deal more
  231. Xmemory than List objects.
  232. X\section {Constructive Solid Geometry}
  233. XConstructive Solid Geometry is
  234. Xthe process of building solid objects from other solids.
  235. XThe three CSG
  236. Xoperators are Union, Intersection, and Difference.  Each operator
  237. Xacts upon two objects and produces a single object result.
  238. XBy combining multiple levels of CSG operators, complex
  239. Xobjects can be produced from simple primitives.
  240. XThe union of two objects results in an
  241. Xobject that encloses the space occupied by the two given objects.
  242. XIntersection results in an object that encloses the space where the two
  243. Xgiven objects overlap.  Difference is an order dependent operator; it
  244. Xresults in the
  245. Xfirst given object minus the space where the second intersected
  246. Xthe first.
  247. X\subsection{CSG in Rayshade}
  248. XCSG in \rayshade will generally operate properly when applied to
  249. Xconjunction with
  250. Xon boxes, spheres,
  251. Xtori, and blobs.
  252. XThese primitives are by nature consistent, as they all
  253. Xenclose a portion of space (no hole from the "inside" to the
  254. X"outside"), have surface normals which point outward (they
  255. Xare not "inside-out"), and do not have any extraneous surfaces.
  256. XCSG objects may also be constructed from aggregate objects.
  257. XThese aggregates contain
  258. Xwhatever is listed inside, and may therefore be inconsistent.
  259. XFor example, an object which contains a single triangle will not
  260. Xproduce correct results in CSG models, because the triangle does not enclose
  261. Xspace.  However, a collection of four triangles which form a pyramid
  262. Xdoes enclose space, and if the triangle normals
  263. Xare oriented correctly,
  264. Xthe CSG operators should work correctly on the pyramid.
  265. XCSG objects are specified by surrounding the objects upon
  266. Xwhich to operate, as well as any associated surface-binding commands,
  267. Xby the operator verb on one side and the {\tt end}
  268. Xkeyword on the other:
  269. X\begin{defkey}{union}{$<${\em Object}$>$ $<${\em Object}$>$
  270. X[$<${\em Object}$>$ \ldots] {\tt end}}
  271. X    Specify a new object defined as the union of the
  272. X    given objects.
  273. X\end{defkey}
  274. X\begin{defkey}{difference}{$<${\em Object}$>$ $<${\em Object}$>$ 
  275. X[$<${\em Object}$>$ \ldots] {\tt end}}
  276. X    Specify a new object defined as the difference of the
  277. X    given objects.
  278. X\end{defkey}
  279. X\begin{defkey}{intersect}{$<${\em Object}$>$ $<${\em Object}$>$
  280. X[$<${\em Object}$>$ \ldots] {\tt end}}
  281. X    Specify a new object defined as the intersection of the
  282. X    given objects.
  283. X\end{defkey}
  284. XNote that the current implementation does not support more that two
  285. Xobjects in a CSG list (but it is planned for a future version).
  286. X% The following aren simple CSG objects using the four consistent
  287. X% primitives:
  288. X% union box ... difference ...
  289. X\subsection{Potential CSG Problems}
  290. XA consistent CSG model is one which is made
  291. Xup of solid objects with no dangling surfaces.  In {\em rayshade},
  292. Xit is quite easy to construct inconsistent models, which will usually
  293. Xappear incorrect in the final images.
  294. XIn {\em rayshade}, CSG is implemented by maintaining
  295. Xthe tree structure of the CSG operations.  This tree is traversed,
  296. Xand the operators therein applied, on a per-ray basis.
  297. XIt is therefore difficult to verify the consistency of
  298. Xthe model ``on the fly.''
  299. XOne class of CSG problems occur when
  300. Xsurfaces of objects being operated upon
  301. Xcoincide.  For example, when subtracting a box from another box to make a
  302. Xsquare cup, the result will be wrong if the tops of the two boxes
  303. Xcoincide.  To correct this, the inner box should be made
  304. Xslightly taller than the outer box.
  305. XA related problem that must be
  306. Xavoided occurs when two coincident surfaces are assigned
  307. Xdifferent surface properties.
  308. XIt may seem that the union operator is unnecessary, since
  309. Xlisting two objects together in an aggregate results
  310. Xin an image that appears to be the same.
  311. XWhile the result of such a short-cut
  312. Xmay appear the same on the exterior, the interior
  313. Xof the resulting object will contain
  314. Xextraneous surfaces.
  315. XThe following examples show this quite clearly.
  316. X\begin{verbatim}
  317. X    difference
  318. X      box -2 0 -3  2 3 3
  319. X      union  /* change to list; note bad internal surfaces */
  320. X        sphere 2 1 0 0
  321. X        sphere 2 -1 0 0
  322. X      end
  323. X    end rotate 1 0 0 -40  rotate 0 0 1 50
  324. X\end{verbatim}
  325. XThe visual evidence of an inconsistent CSG object varies depending
  326. Xupon the operator being used.
  327. XWhen subtracting a consistent object from and
  328. Xinconsistent one, the resulting object will appear to be
  329. Xthe union of the two objects, but the shading will be incorrect.
  330. XIt will appear to be inside-out in places, while correct
  331. Xin other places.  The inside-out sections indicate the areas
  332. Xwhere the problems occur.
  333. XSuch problems are often caused by
  334. Xpolygons with incorrectly specified
  335. Xnormals, or by surfaces that exactly coincide (which
  336. Xappear as partial ``swissh-cheese'' objects).
  337. XThe following example illustrates an attempt to subtract a sphere from
  338. Xa pyramid defined using an incorrectly facing triangle.  Note
  339. Xthat the resulting image obviously points to which triangle is
  340. Xreversed.
  341. X\begin{verbatim}
  342. X    name pyramid list
  343. X        triangle 1 0 0  0 1 0  0 0 1
  344. X        triangle 1 0 0  0 0 0  0 1 0
  345. X        triangle 0 1 0  0 0 0  0 0 1
  346. X        triangle 0 0 1  1 0 0  0 0 0  /* wrong order */
  347. X    end
  348. X    difference
  349. X        object pyramid scale 3 3 3 rotate 0 0 1 45
  350. X            rotate 1 0 0 -30 translate 0 -3.5 0
  351. X        sphere 2.4 0 0 0
  352. X    end
  353. X\end{verbatim}
  354. XBy default, cylinders and cones do not have end caps, and thus
  355. Xare not consistent primitives.  One must usually
  356. Xadd endcaps by listing the
  357. Xcylinder or cone with (correctly-oriented) endcap discs in an aggregate.
  358. X\section {Named Objects}
  359. XA name may be associated with any primitive, aggregate, or CS
  360. Xobject through the use of the {\tt name}
  361. Xkeyword:
  362. X\begin{defkey}{name}{{\em objname} $<${\em Instance\/}$>$}
  363. X    Associate {\em objname} with the given object.  The
  364. X    specified object is not actually instantiated; it
  365. X    is only stored under the given name.
  366. X\end{defkey}
  367. XAn object thus named may then be instantiated (with possible
  368. Xadditional transforming and texturing) via the {\tt object} keyword:
  369. X\begin{defkey}{object}{{\em objname} [$<$Transformations$>$] [$<$Textures$>$]}
  370. X    Instantiate a copy of the object associated with {\em objname}.
  371. X    If given, the transformations and textures are composed
  372. X    with any already associated with
  373. X    the object being instantiated.
  374. X\end{defkey}
  375. END_OF_FILE
  376. if test 16377 -ne `wc -c <'Doc/Guide/objects.tex'`; then
  377.     echo shar: \"'Doc/Guide/objects.tex'\" unpacked with wrong size!
  378. # end of 'Doc/Guide/objects.tex'
  379. if test -f 'Doc/Guide/running.tex' -a "${1}" != "-c" ; then 
  380.   echo shar: Will not clobber existing file \"'Doc/Guide/running.tex'\"
  381. echo shar: Extracting \"'Doc/Guide/running.tex'\" \(13163 characters\)
  382. sed "s/^X//" >'Doc/Guide/running.tex' <<'END_OF_FILE'
  383. X\chapter{Running Rayshade}
  384. X{\em Rayshade}
  385. Xcan take anywhere from seconds to weeks to render an image.  The exact
  386. Xtime required is a function of the speed of the
  387. Xmachine(s) on which
  388. Xyou're working, the complexity of the scene, and how ``good'' you want
  389. Xthe final image to be.
  390. XCreating a finished ray-traced image is an iterative process.  Usually, many
  391. Xtest renderings are made at low resolution and with
  392. Xnon-essential features turned off.  After each test image is created,
  393. Xsurface definitions might be modified, the eye or look positions may be
  394. Xslightly changed, or the intensity of a light source changed.
  395. XThis chapter describes the basic operation of \rayshade and some of
  396. Xthe options that control that operation.
  397. XSetting these options properly can greatly reduce
  398. Xrendering time, improve the quality of your images, and make you a better
  399. Xperson.
  400. X{\em Rayshade} usually works as a filter, reading a description from
  401. Xthe standard input and writing
  402. Xan image file to the standard output.  As it is working, {\em rayshade} reports
  403. Xon the progress of the rendering by writing messages to the standard
  404. Xerror.
  405. X\section{The Input File}
  406. XThe scene description read by \rayshade consists of a number of
  407. Xkeywords, each followed by a set of arguments.  These keywords can
  408. Xbe thought of as commands that direct rayshade to do various things,
  409. Xsuch as create objects, set the eye's position, and change an object's
  410. Xappearance.
  411. XMany of the keywords have related command-line options for turning
  412. Xon special features and setting values.
  413. XThese options override the values given in the input file,
  414. Xand are explained in detail in Appendix A.
  415. XRayshade is ``case sensitive,'' which means that typing
  416. X{\tt SPHERE} or {\tt Sphere} instead of {\tt sphere} won't work.
  417. X{\em Rayshade} keywords are all lower-case.  Many people choose to
  418. Xcapitalize the first letter of names that they give to objects
  419. Xor surfaces in order to make then ``stand out'' in an input file.
  420. XKeywords, numbers and strings in the input file are separated by spaces,
  421. Xtabs, or new lines (carriage returns).  These ``whitespace'' characters
  422. Xare handled identically by {\em rayshade}, which means that you can separate
  423. Xkeywords from keywords, key words from arguments, and arguments from
  424. Xarguments using any combination of whitespace characters that you choose.
  425. X\begin{table}
  426. X\centering
  427. X\begin{tabular}{|c|c|l|}\hline\hline
  428. XOperator &    Use    & Operation \\ \hline \hline
  429. X\verb+^+ &  \verb!a ^ b!  & Exponentiation \\  \hline
  430. X\verb+-+ &  \verb! -a  !  & Negation  \\   \hline
  431. X\verb+*+ &  \verb!a * b!  & Multiplication  \\  \hline
  432. X\verb+/+ &  \verb!a / b!  & Division     \\  \hline
  433. X\verb+%+ &  \verb!a % b!  & Remainder    \\  \hline
  434. X\verb-+- &  \verb!a + b!  & Addition     \\ \hline
  435. X\verb+-+ &  \verb!a - b!  & Subtraction  \\ \hline \hline
  436. X\end{tabular}
  437. X\caption{Operators, in order of decreasing precedence.}
  438. X\label{tab:operators}
  439. X\end{table}
  440. XNumbers may be entered directly as reals or as parenthesized expressions.
  441. XReals may be written in exponential notation if you wish, and
  442. Xintegers may be written with or without a trailing decimal point.
  443. XWhen an integer value is called for and a real is given,
  444. Xthe real value is truncated and the resulting integer is used.
  445. XTable \ref{tab:operators} lists the available operators
  446. Xavailable for use in expressions, in order of decreasing precedence.
  447. XThe upshot of all this is that the strings
  448. X{\tt $42$}, {\tt $42.$},
  449. X{\tt $(20 + 22)$}, and {\tt $(7^2 - 7)$} mean the same thing
  450. Xto {\em rayshade}.
  451. XVariables may also be defined and used in expressions.  Several
  452. Xbuilt-in functions are also provided.  See appendix B for further details.
  453. X\Rayshade will automatically run the input it receives
  454. Xthrough the C preprocessor if it is available.  This
  455. Xallows you to use C preprocessor directives, such as {\tt \#include},
  456. X{\tt \#define}, and {\tt \#ifdef} when designing your input files.
  457. XComments may be included in \rayshade input files by enclosing
  458. Xtext between the strings \verb!/*! and \verb!*/!, as in the C
  459. Xprogramming
  460. Xlanguage.
  461. X\section{Images}
  462. XThe end result of running \rayshade is an image file.  Depending upon
  463. Xhow it was installed, \rayshade writes images in either the Utah Raster
  464. X{\em RLE} format or a generic but easily-manipulated {\em mtv} format
  465. Xused by Mark VandeWettering in his {\em mtv} ray tracer.  The {\em mtv}
  466. Xformat consists of a header giving the resolution of the image followed
  467. Xby interleaved red-green-blue values for each pixel.  The {\em RLE} format
  468. Xsupports an arbitrary number of color channels,
  469. Xan alpha channel, comments, a history field, and the ability
  470. Xto treat images as windows into a larger image.  As a result of this
  471. Xflexibility, a number of {\em rayshade}'s features
  472. Xare not
  473. Xsupported if the {\em mtv} format is being used. You are thus strongly
  474. Xencouraged to obtain a copy of the Utah Raster Toolkit.
  475. XIf the {\em mtv}
  476. Xformat is used, the image will (and must) consist of three eight-bit
  477. Xcolor channels.
  478. XIf the {\em RLE} format is used, the image file consists of three
  479. Xeight-bit color channels plus an eight-bit alpha channel.  \Rayshade
  480. Xalso documents in the {\em RLE} header the command line and {\em gamma}
  481. Xvalue used in creating the image.
  482. XIf more than one frame is rendered, the resulting images are appended
  483. Xin turn
  484. Xto the image file.  The various utilities provided by the
  485. XUtah Raster Toolkit can be used to manipulate the resulting ``movie''
  486. Xfiles.
  487. XIf the Toolkit is not being used, you will probably need to write
  488. Xutility programs to handle the decidedly non-standard mult-image ``mtv''
  489. Xformat files.
  490. XBy default, \rayshade writes the computed image to the standard output.
  491. XThe image file may be written to a file instead by specifying a file name
  492. Xin the input stream.
  493. X\begin{defkey}{outfile}{{\em filename}}
  494. X    Write the computed image to the named file.
  495. X\end{defkey}
  496. XThe output file name may also be specified on the command line by
  497. Xusing the {\tt -O} option.
  498. XThe size of the output image is measured in pixels.  The {\em x} size
  499. Xis the number of pixels left-to-right, while the {\em y} size is
  500. Xthe number of pixels top-to-bottom.
  501. X\begin{defkey}{screen}{{\em xsize ysize}}
  502. X    Use a screen {\em xsize} pixels wide by {\em ysize} pixels high.
  503. X\end{defkey}
  504. XThe screen size may also be set on the command line through
  505. Xthe {\tt -R} option.
  506. XThe default
  507. Xscreen size is 512 by 512 pixels.
  508. XWhen rendering an image, it is often advantageous to split the image
  509. Xinto a number of disjoint windows, each of which is rendered
  510. Xon a different machine.  One then combines the images corresponding to
  511. Xthe windows into a final image.
  512. X\begin{defkey}{window}{{\em minx maxx miny maxy}}
  513. X    Render the image in the given screen subwindow,
  514. X    specified in normalized units.
  515. X\end{defkey}
  516. XThe window must be properly
  517. Xcontained within the screen, i.e., {\em minx} and {\em miny} must
  518. Xbe greater than or equal to zero, while {\em maxx} and
  519. X{\em maxy} must be less than or equal to one.
  520. XThe {\em mtv} image file format does not support windows.  The
  521. XUtah Raster tool
  522. X{\em rlecomp\/} is useful for reconstructing the full image from
  523. Xsub-images.
  524. XBy default, the window
  525. Xis equal to ($0., 1., 0, 1$), or the entire screen.
  526. X{\em Gamma correction} may also be applied to the three output color
  527. Xchannels.  See Appendix A for more details.
  528. X\section{Statistics Reporting}
  529. XAs it is working, \rayshade informs you of its progress by writing
  530. Xmessages to a ``report file''.  By default, the report file is the
  531. Xstandard error.  The report itself consists of a number of
  532. Xprogress report lines consisting of the number of eye rays traced,
  533. Xthe total elapsed time, and the elapsed time since the last progress report.
  534. XThe end of the report contains detailed statistics about intersection
  535. Xtests performed, the number of rays traced, and the like.
  536. X\begin{defkey}{report}{[{\tt verbose}] [{\tt quiet}] [{\em freq}] [{\em file}]}
  537. X    Specify the kind of
  538. X    information included in the report and to which
  539. X    file it should be written.
  540. X    If {\tt verbose} is specified, the
  541. X    report will also include a listing of the options selected,
  542. X    the 
  543. X    bounding volumes of each aggregate,
  544. X    and the total number of primitives in each aggregate.
  545. X    {\tt quiet} causes warning
  546. X    messages to be suppressed.  {\em freq} specifies the frequency,
  547. X    in scanlines rendered, that progress reports are made.
  548. X    If given, {\em file} names a file to which the report
  549. X    will be written.
  550. X\end{defkey}
  551. XBy default, a non-verbose, non-quiet report is 
  552. Xwritten to the standard error once every 10 lines.
  553. XThe {\tt -V} option may also be used to direct the report to a named file.
  554. X\section{Antialiasing}
  555. XGiven a screen of a fixed size, creating an image is accomplished by
  556. Xsampling each pixel one or more times in order to determine what can
  557. Xbe seen ``through'' that pixel by the camera.  A pixel thus covers
  558. Xa square area of the image plane, not just a single point.
  559. XIf a pixel is not sampled at the proper rate, aliasing will result.
  560. XAliasing usually appears as ``jaggies'' or ``stair steps'' in the image.
  561. XIn order to reduce these and other artifacts, \rayshade provides
  562. Xan adaptive jittered antialiasing scheme that attempts to detect where
  563. Xincreased sampling rates are needed.
  564. XIn jittered sampling, the location at which a sample is taken is
  565. Xperturbed by a random amount.  This perturbation reduces aliasing
  566. Xbut adds noise to the image.  Appendix B describes how jittered
  567. Xtime sampling is implemented in {\em rayshade}.
  568. XThe adaptive sampling scheme implemented in \rayshade begins
  569. Xby sampling each pixel on the current scanline once.
  570. XFor each pixel on the scanline, the contrast between it and its
  571. Xfour immediate neighbors is computed.  If this contrast is greater
  572. Xthan a user-specified maximum in any color channel,
  573. Xthe pixel and its
  574. Xneighbors are all supersampled by firing an additional
  575. X{$numsamples^2 -1$} rays through those pixels that have not already been
  576. Xsupersampled.  This process is repeated for the current scanline
  577. Xuntil a pass is made without any
  578. Xpixel being supersampled.
  579. X\begin{defkey}{contrast}{{\em redcont greencont bluecont}}
  580. X    Set the maximum allowed contrast between four color
  581. X    samples when adaptive supersampling is used.
  582. X    The contrast test is applied to each color
  583. X    channel separately.
  584. X\end{defkey}
  585. XThe default maximum contrast values for the red, green, and blue
  586. Xchannels are 0.25, 0.2, and 0.4, respectively.
  587. X\begin{defkey}{sample}{{\em n} [{\tt nojitter}]}
  588. X    Use $n^{2} $ samples when performing jittered
  589. X    sampling.  The maximum legal value is 5.
  590. X    If {\tt nojitter} is specified, sample locations
  591. X    and times will not be jittered.
  592. X\end{defkey}
  593. XBy default, $3^{2}$ jittered samples are taken.
  594. XA given set of sample values must be filtered
  595. Xin order to
  596. Xassign a color to a pixel.  Ideally, when performing filtering
  597. Xfor a specific pixel,
  598. Xthe filter will consider samples from neighboring regions.  In
  599. X{\em rayshade}, the filtering applied to a pixel makes use of samples
  600. Xtaken for that pixel alone.  However, one may increase the size
  601. Xof the filter that is applied in order to approximate the results
  602. Xa more robust filtering scheme.
  603. X\begin{defkey}{filter}{{\em type} [{\em width}]}
  604. X    Use the indicated filter type with the given width,
  605. X    in pixels.
  606. X    Supported filter types are {\tt gauss} (gaussian)
  607. X    and {\tt box} (the default).
  608. X\end{defkey}
  609. XThe default filter width is 1.0 for a box filter, 1.8 for a gaussian
  610. Xfilter.  The filter and pixel centers always coincide.
  611. XWhen sampling a pixel, samples are taken over the area of
  612. Xthe pixel filter, which is not necessarily the same as the area
  613. Xof the pixel itself.
  614. XJittered sampling is used in \rayshade to sample extended light
  615. Xsources as well.  A total of $samples^2$ samples are taken of
  616. Xeach extended light source in order to determine the extent of shadowing.
  617. X\section{The Ray Tree}
  618. XWhen ray tracing a scene, reflected or transmitted rays may strike
  619. Xother reflective or transparent objects.  Further reflected or
  620. Xtransmitted rays will be spawned, and so on.  Taken together, such
  621. Xa family of rays is termed the {\em ray tree}.  Care must be taken
  622. Xto control the depth of this tree:  If it is allowed to grow too deeply,
  623. Xone may spend a great deal of time computing rays that contribute little
  624. Xto the final picture; if it is not allowed to grow far enough, this
  625. Xpremature tree pruning may be evident in the image.
  626. X{\em Rayshade} provides two complimentary methods for controlling the depth
  627. Xof the ray tree.  One method sets an absolute maximum for the tree.  The
  628. Xother allows one to adaptively prune a tree as it grows so that ``unimportant''
  629. Xrays are not spawned.
  630. X\begin{defkey}{maxdepth}{{\em level}}
  631. X    Do not spawn rays deeper than those at the given {\em level}.
  632. X\end{defkey}
  633. XRays from the eye are of depth zero.  The default value for
  634. X{\em level} is 15.
  635. XThis depth may also be set from the command line through the {\tt -D} option.
  636. X\begin{defkey}{cutoff}{{\em threshold}}
  637. X    Do not spawn rays whose contribution to the final color of
  638. X    the eye ray is less than {\em threshold} for each color channel.
  639. X    Threshold may be given as a single floating-point value,
  640. X    or as a red-green-blue triple.
  641. X\end{defkey}
  642. XThe default value is 0.002.  This threshold may also be set from
  643. Xthe command line through the {\tt -T} option.
  644. END_OF_FILE
  645. if test 13163 -ne `wc -c <'Doc/Guide/running.tex'`; then
  646.     echo shar: \"'Doc/Guide/running.tex'\" unpacked with wrong size!
  647. # end of 'Doc/Guide/running.tex'
  648. if test -f 'etc/rsconvert/yacc.y' -a "${1}" != "-c" ; then 
  649.   echo shar: Will not clobber existing file \"'etc/rsconvert/yacc.y'\"
  650. echo shar: Extracting \"'etc/rsconvert/yacc.y'\" \(13171 characters\)
  651. sed "s/^X//" >'etc/rsconvert/yacc.y' <<'END_OF_FILE'
  652. X/* yacc.y                                   */
  653. X/*                                       */
  654. X/* Copyright (C) 1989, 1991, Craig E. Kolb                   */
  655. X/* All rights reserved.                               */
  656. X/*                                       */
  657. X/* This software may be freely copied, modified, and redistributed,       */
  658. X/* provided that this copyright notice is preserved on all copies.       */
  659. X/*                                       */
  660. X/* You may not distribute this software, in whole or in part, as part of   */
  661. X/* any commercial product without the express consent of the authors.      */
  662. X/*                                        */
  663. X/* There is no warranty or other guarantee of fitness of this software       */
  664. X/* for any purpose.  It is provided solely "as is".               */
  665. X/* $Id: yacc.y,v 4.0 91/07/17 17:11:26 kolb Exp Locker: kolb $ */
  666. X#include <stdio.h>
  667. X#include "libcommon/common.h"
  668. X/*#define NEWLINE()    WriteString("\n")*/
  669. X#define NEWLINE()    printf("\n")
  670. X#define LIST    0
  671. X#define GRID    1
  672. Xchar yyfilename[BUFSIZ];
  673. Xextern int yylineno;
  674. X%union {
  675. X    char *c;
  676. X    int i;
  677. X    double d;
  678. X    Color col;
  679. X    Vector v;
  680. X%token <d> tFLOAT
  681. X%token <c> tSTRING
  682. X%token <i> tINT
  683. X%type <d> Fnumber sFnumber
  684. X%type <col> sColor
  685. X%type <v> sVector
  686. X%token tADAPTIVE tAPERTURE 
  687. X%token tBACKGROUND tBLOTCH tBOX tBUMP tCONE tCYL tDIRECTIONAL
  688. X%token tENDDEF tEXTENDED tEYEP tFBM tFBMBUMP tFOCALDIST tFOG tFOV tGLOSS tGRID
  689. X%token tHEIGHTFIELD tJITTERED tLIGHT tLIST tLOOKP tMARBLE tMAXDEPTH tMIST
  690. X%token tOBJECT tOUTFILE
  691. X%token tPLANE tPOINT tPOLY tROTATE tSAMPLES
  692. X%token tSCALE tSCREEN tSPHERE tSTARTDEF tSUPERQ tSURFACE tRESOLUTION
  693. X%token tTHRESH tTRANSLATE tTRANSFORM tTRIANGLE tUP tENDFILE
  694. X%token tTEXTURE tCHECKER tWOOD tCONTRAST tCUTOFF
  695. XItems        : /* empty */
  696. X        | Items Item
  697. XItem        : Eyep
  698. X        | Lookp
  699. X        | Up
  700. X        | Fov
  701. X        | Screen
  702. X        | Aperture
  703. X        | Focaldist
  704. X        | Maxdepth
  705. X        | Samples
  706. X        | Jittered
  707. X        | Adaptive
  708. X        | Contrast
  709. X        | Cutoff
  710. X        | Background
  711. X        | Light
  712. X        | Primitive
  713. X        | Child
  714. X        | Surface
  715. X        | Outfile
  716. X        | List
  717. X        | Grid
  718. X        | Object
  719. X        | Fog
  720. X        | Mist
  721. X        | ENDFILE        /* For backward compatibility */
  722. XList        : LIST
  723. X            NEWLINE();
  724. XGrid        : GRID
  725. X            NEWLINE();
  726. XPrimitive    : Prim Textures
  727. XPrim        : Primtype Transforms
  728. XPrimtype    : Plane
  729. X        | Sphere
  730. X        | Box
  731. X        | Triangle
  732. X        | Cylinder
  733. X        | Cone
  734. X        | Superq
  735. X        | Poly
  736. X        | HeightField
  737. XObject        : Objectdef Textures
  738. X            NEWLINE();
  739. XObjectdef    : Startdef Objdefs ENDDEF
  740. XStartdef    : STARTDEF
  741. X        /*
  742. X         * define <name>
  743. X         */
  744. X            NEWLINE();
  745. XObjdefs        : Objdefs Objdef
  746. XObjdef        : Primitive
  747. X        | Surface
  748. X        | Child
  749. X        | List
  750. X        | Grid
  751. X        | Object
  752. XTextures    : Textures Texture
  753. XTexture        : TEXTURE Texturetype Transforms
  754. X            NEWLINE();
  755. XTexturetype    : CHECKER String
  756. X            NEWLINE();
  757. X        | BLOTCH Fnumber String
  758. X            NEWLINE();
  759. X        | BUMP Fnumber
  760. X            NEWLINE();
  761. X        | MARBLE
  762. X            NEWLINE();
  763. X        | MARBLE String
  764. X            NEWLINE();
  765. X        | FBM Fnumber Fnumber Fnumber Fnumber Int Fnumber
  766. X            NEWLINE();
  767. X        | FBM Fnumber Fnumber Fnumber Fnumber Int Fnumber tSTRING
  768. X            NEWLINE();
  769. X        | FBMBUMP Fnumber Fnumber Fnumber Fnumber Int
  770. X            NEWLINE();
  771. X        | WOOD
  772. X            NEWLINE();
  773. X        | GLOSS Fnumber
  774. X            NEWLINE();
  775. XChild        : Childdef Textures
  776. X            NEWLINE();
  777. XChilddef    : OBJECT String Transforms
  778. X            NEWLINE();
  779. XTransforms    : Transforms Transform
  780. X        | /* empty */
  781. XTransform    : TRANSLATE Vector
  782. X            NEWLINE();
  783. X        | ROTATE Vector sFnumber
  784. X            WriteFloat(-$3);
  785. X            NEWLINE();
  786. X        | SCALE Fnumber Fnumber Fnumber
  787. X            NEWLINE();
  788. X        | TRANSFORM sFnumber sFnumber sFnumber
  789. X                sFnumber sFnumber sFnumber
  790. X                sFnumber sFnumber sFnumber
  791. X            /* have to transpose... */
  792. X            WriteFloat($2); WriteFloat($5); WriteFloat($8);
  793. X            WriteFloat($3); WriteFloat($6); WriteFloat($9);
  794. X            WriteFloat($4); WriteFloat($7); WriteFloat($10);
  795. X            NEWLINE();
  796. X        | TRANSFORM sFnumber sFnumber sFnumber
  797. X                sFnumber sFnumber sFnumber
  798. X                sFnumber sFnumber sFnumber
  799. X                sFnumber sFnumber sFnumber
  800. X            /* transpose it */
  801. X            WriteFloat($2); WriteFloat($5); WriteFloat($8);
  802. X            WriteFloat($3); WriteFloat($6); WriteFloat($9);
  803. X            WriteFloat($4); WriteFloat($7); WriteFloat($10);
  804. X            WriteFloat($11); WriteFloat($12); WriteFloat($13);
  805. X            NEWLINE();
  806. XEyep        : EYEP Vector Transforms
  807. X            NEWLINE();
  808. XLookp        : LOOKP Vector
  809. X            NEWLINE();
  810. XUp        : UP Vector
  811. X            NEWLINE();
  812. XFov        : FOV Fnumber Fnumber
  813. X            NEWLINE();
  814. X        | FOV Fnumber
  815. X            NEWLINE();
  816. XSamples        : SAMPLES Int
  817. X            NEWLINE();
  818. XAdaptive    : ADAPTIVE Int
  819. X            NEWLINE();
  820. XContrast    : CONTRAST Fnumber Fnumber Fnumber
  821. X            NEWLINE();
  822. XCutoff        : CUTOFF Fnumber
  823. X            NEWLINE();
  824. XJittered    : JITTERED
  825. X            NEWLINE();
  826. XScreen        : SCREEN Int Int
  827. X            NEWLINE();
  828. X        | RESOLUTION Int Int
  829. X            NEWLINE();
  830. XAperture    : APERTURE Fnumber
  831. X            NEWLINE();
  832. XFocaldist    : FOCALDIST Fnumber
  833. X            NEWLINE();
  834. XMaxdepth    : MAXDEPTH Int
  835. X            NEWLINE();
  836. XBackground    : BACKGROUND Color
  837. X            NEWLINE();
  838. XLight        : Lightdef POINT Vector
  839. X            NEWLINE();
  840. X        | Lightdef DIRECTIONAL Vector
  841. X            NEWLINE();
  842. X        | Lightdef EXTENDED sVector sFnumber
  843. X            WriteFloat($4);
  844. X            WriteVector(&$3);
  845. X            NEWLINE();
  846. XLightdef    : LIGHT Fnumber
  847. X            NEWLINE();
  848. X        | LIGHT Color
  849. X            NEWLINE();
  850. XSurface        : SURFACE String
  851. X            sColor sColor sColor
  852. X            sFnumber sFnumber sFnumber sFnumber
  853. X            if ($3.r || $3.g || $3.b) {
  854. X                WriteString("\tambient");
  855. X                WriteColor(&$3);
  856. X                WriteNewline();
  857. X            }
  858. X            if ($4.r || $4.g || $4.b) {
  859. X                WriteString("\tdiffuse");
  860. X                WriteColor(&$4);
  861. X                WriteNewline();
  862. X            }
  863. X            if ($5.r || $5.g || $5.b) {
  864. X                WriteString("\tspecular");
  865. X                WriteColor(&$5);
  866. X                WriteNewline();
  867. X                if ($6) {
  868. X                    WriteString("\tspecpow");
  869. X                    WriteFloat($6);
  870. X                    WriteNewline();
  871. X                }
  872. X            }
  873. X            if ($7) {
  874. X                WriteString("\treflect");
  875. X                WriteFloat($7);
  876. X                WriteNewline();
  877. X            }
  878. X            if ($8) {
  879. X                WriteString("\ttransp");
  880. X                WriteFloat($8);
  881. X                WriteString("index");
  882. X                WriteFloat($9);
  883. X                WriteNewline();
  884. X            }
  885. X        | SURFACE String sColor sColor sColor
  886. X            sFnumber sFnumber sFnumber sFnumber sFnumber sFnumber
  887. X            if ($3.r || $3.g || $3.b) {
  888. X                WriteString("\tambient");
  889. X                WriteColor(&$3);
  890. X                WriteNewline();
  891. X            }
  892. X            if ($4.r || $4.g || $4.b) {
  893. X                WriteString("\tdiffuse");
  894. X                WriteColor(&$4);
  895. X                WriteNewline();
  896. X            }
  897. X            if ($5.r || $5.g || $5.b) {
  898. X                WriteString("\tspecular");
  899. X                WriteColor(&$5);
  900. X                WriteNewline();
  901. X                if ($6) {
  902. X                    WriteString("\tspecpow");
  903. X                    WriteFloat($6);
  904. X                    WriteNewline();
  905. X                }
  906. X            }
  907. X            if ($7) {
  908. X                WriteString("\treflect");
  909. X                WriteFloat($7);
  910. X                WriteNewline();
  911. X            }
  912. X            if ($8) {
  913. X                WriteString("\ttransp");
  914. X                WriteFloat($8);
  915. X                WriteString("index");
  916. X                WriteFloat($9);
  917. X                WriteNewline();
  918. X            }
  919. X            if ($10) {
  920. X                WriteString("\ttranslu");
  921. X                WriteFloat($10);
  922. X                WriteFloat($11);
  923. X            }
  924. XHeightField    : HEIGHTFIELD String String
  925. X            NEWLINE();
  926. XPoly        : POLY String Polypoints
  927. X            NEWLINE();
  928. XPolypoints    : /* empty */
  929. X        | Polypoints Polypoint
  930. XPolypoint    : Vector
  931. X            NEWLINE();
  932. XCone        : CONE String sVector sVector sFnumber sFnumber
  933. X            /* Radii now precede points */
  934. X            WriteFloat($5);
  935. X            WriteVector(&$3);
  936. X            WriteFloat($6);
  937. X            WriteVector(&$4);
  938. X            NEWLINE();
  939. XCylinder    : CYL String sVector sVector sFnumber
  940. X            /* Radius now goes first */
  941. X            WriteFloat($5);
  942. X            WriteVector(&$3);
  943. X            WriteVector(&$4);
  944. X            NEWLINE();
  945. XSphere        : SPHERE String Fnumber Vector
  946. X            NEWLINE();
  947. XBox        : BOX String
  948. X            sFnumber sFnumber sFnumber
  949. X            sFnumber sFnumber sFnumber
  950. X            /* give box corners */
  951. X            WriteFloat($3 - $6);
  952. X            WriteFloat($4 - $7);
  953. X            WriteFloat($5 - $8);
  954. X            WriteFloat($3 + $6);
  955. X            WriteFloat($4 + $7);
  956. X            WriteFloat($5 + $8);
  957. X            NEWLINE();
  958. XTriangle    : TRIANGLE String Vector Vector Vector
  959. X            NEWLINE();
  960. X        | TRIANGLE String Vector Vector Vector Vector Vector Vector
  961. X            NEWLINE();
  962. XSuperq        : SUPERQ String
  963. X            Fnumber Fnumber Fnumber
  964. X            Fnumber Fnumber Fnumber
  965. X            Fnumber
  966. X            NEWLINE();
  967. XPlane        : PLANE String sVector sVector
  968. X            /* reverse order of point/normal */
  969. X            WriteVector(&$4);
  970. X            WriteVector(&$3);
  971. X            NEWLINE();
  972. XOutfile        : OUTFILE String
  973. X            NEWLINE();
  974. XMist        : MIST Color Color Fnumber Fnumber
  975. X            NEWLINE();
  976. XFog        : FOG Fnumber Color
  977. X            NEWLINE();
  978. XColor        : Fnumber Fnumber Fnumber
  979. XsColor        : sFnumber sFnumber sFnumber
  980. X            $$.r = $1; $$.g = $2; $$.b = $3;
  981. XVector        : Fnumber Fnumber Fnumber
  982. XsVector        : sFnumber sFnumber sFnumber
  983. X            $$.x = $1; $$.y = $2; $$.z = $3;
  984. XFnumber        : tFLOAT
  985. X        { WriteFloat($1); }
  986. X        | tINT
  987. X        { WriteFloat((Float)$1); }
  988. XInt        : tINT
  989. X        { WriteFloat((Float)$1); };
  990. XsFnumber    : tFLOAT
  991. X        | tINT
  992. X        { $$ = (double)$1; }
  993. XString        : tSTRING
  994. X        { WriteString($1); }
  995. XADAPTIVE    : tADAPTIVE    { WriteString("adaptive"); }
  996. XAPERTURE    : tAPERTURE    { WriteString("aperture"); }
  997. XBACKGROUND    : tBACKGROUND    { WriteString("background"); }
  998. XBLOTCH        : tBLOTCH    { WriteString("blotch"); }
  999. XBOX        : tBOX        { WriteString("box"); }
  1000. XBUMP        : tBUMP        { WriteString("bump"); }
  1001. XCONE        : tCONE        { WriteString("cone"); }
  1002. XCYL        : tCYL        { WriteString("cylinder"); }
  1003. XDIRECTIONAL    : tDIRECTIONAL    { WriteString("directional"); }
  1004. XENDDEF        : tENDDEF    { EndDefine(); }
  1005. XEXTENDED    : tEXTENDED    { WriteString("extended"); }
  1006. XEYEP        : tEYEP        { WriteString("eyep"); }
  1007. XFBM        : tFBM        { WriteString("fbm"); }
  1008. XFBMBUMP        : tFBMBUMP    { WriteString("fbmbump"); }
  1009. XFOCALDIST    : tFOCALDIST    { WriteString("focaldist"); }
  1010. XFOG        : tFOG        { WriteString("fog"); }
  1011. XFOV        : tFOV        { WriteString("fov"); }
  1012. XGLOSS        : tGLOSS    { WriteString("gloss"); }
  1013. XGRID        : tGRID    tINT tINT tINT    { SetTypeGrid($2,$3,$4); }
  1014. XHEIGHTFIELD    : tHEIGHTFIELD    { WriteString("heightfield"); }
  1015. XJITTERED    : tJITTERED    { WriteString("jittered"); }
  1016. XLIGHT        : tLIGHT    { WriteString("light"); }
  1017. XLIST        : tLIST        { SetTypeList(); }
  1018. XLOOKP        : tLOOKP    { WriteString("lookp"); }
  1019. XMARBLE        : tMARBLE    { WriteString("marble"); }
  1020. XMAXDEPTH    : tMAXDEPTH    { WriteString("maxdepth"); }
  1021. XMIST        : tMIST        { WriteString("mist"); }
  1022. XOBJECT        : tOBJECT    { WriteString("object"); }
  1023. XOUTFILE        : tOUTFILE    { WriteString("outfile"); }
  1024. XPLANE        : tPLANE    { WriteString("plane"); }
  1025. XPOINT        : tPOINT    { WriteString("point"); }
  1026. XPOLY        : tPOLY        { WriteString("poly"); }
  1027. XROTATE        : tROTATE    { WriteString("rotate"); }
  1028. XSAMPLES        : tSAMPLES    { WriteString("samples"); }
  1029. XSCALE        : tSCALE    { WriteString("scale"); }
  1030. XSCREEN        : tSCREEN    { WriteString("screen"); }
  1031. XSPHERE        : tSPHERE    { WriteString("sphere"); }
  1032. XSTARTDEF    : tSTARTDEF tSTRING    { StartDefine($2); }
  1033. XSUPERQ        : tSUPERQ    { WriteString("superq"); }
  1034. XSURFACE        : tSURFACE    { WriteString("surface"); }
  1035. XRESOLUTION    : tRESOLUTION    { WriteString("resolution"); }
  1036. XTRANSLATE    : tTRANSLATE    { WriteString("translate"); }
  1037. XTRANSFORM    : tTRANSFORM    { WriteString("transform"); }
  1038. XTRIANGLE    : tTRIANGLE    { WriteString("triangle"); }
  1039. XUP        : tUP        { WriteString("up"); }
  1040. XENDFILE        : tENDFILE    { /* Don't do a thing. */ }
  1041. XTEXTURE        : tTEXTURE    { WriteString("texture"); }
  1042. XCHECKER        : tCHECKER    { WriteString("checker"); }
  1043. XWOOD        : tWOOD        { WriteString("wood"); }
  1044. XCONTRAST    : tCONTRAST    { WriteString("contrast"); }
  1045. XCUTOFF        : tCUTOFF    { WriteString("cutoff"); }
  1046. X#define STARTBUFSIZ    (1 << 18)
  1047. Xtypedef struct db {
  1048. X    int bufsiz, curpos;
  1049. X    int type, x, y, z;
  1050. X    char *name;
  1051. X    struct db *next;
  1052. X    char *memory;
  1053. X} DefBuf;
  1054. XDefBuf *defbuf = NULL;
  1055. Xyyerror(s)
  1056. X    fprintf(stderr,"yyerror: %s\n",s);
  1057. XStartDefine(name)
  1058. Xchar *name;
  1059. X    DefBuf *new;
  1060. X     * Push new buffer onto define stack.
  1061. X     */    
  1062. X    new = (DefBuf *)Malloc(sizeof(DefBuf));
  1063. X    new->bufsiz = STARTBUFSIZ;
  1064. X    new->type = LIST;
  1065. X    new->curpos = 0;
  1066. X    new->name = name;
  1067. X    new->memory = (char *)Calloc(new->bufsiz, sizeof(char));
  1068. X    new->next = defbuf;
  1069. X    defbuf = new;
  1070. XEndDefine()
  1071. X    char buf[BUFSIZ];
  1072. X    DefBuf *old;
  1073. X    old = defbuf;
  1074. X    defbuf = defbuf->next;
  1075. X    if (old->type == LIST) {
  1076. X        sprintf(buf, "name %s list", old->name);
  1077. X    } else {
  1078. X        sprintf(buf, "name %s grid %d %d %d", old->name,
  1079. X                old->x, old->y, old->z);
  1080. X     * dump goodies
  1081. X     */
  1082. X    WriteVerbatim(buf);
  1083. X    WriteVerbatim(old->memory);
  1084. X    WriteVerbatim("end");
  1085. X    free((voidstar)old->memory);
  1086. X    free((voidstar)old);
  1087. XWriteString(str)
  1088. Xchar *str;
  1089. X    WriteVerbatim(str);
  1090. X    WriteChar(' ');
  1091. XWriteVerbatim(str)
  1092. Xchar *str;
  1093. X    int n;
  1094. X    for (n = strlen(str); n; n--)
  1095. X        WriteChar(*(str++));
  1096. XWriteChar(c)
  1097. Xchar c;
  1098. X    if (defbuf) {
  1099. X        if (defbuf->curpos == defbuf->bufsiz -1) {
  1100. X            defbuf->bufsiz *= 2;
  1101. X            defbuf->memory = (char *)realloc(defbuf->memory,
  1102. X                defbuf->bufsiz * sizeof(char));
  1103. X            if (defbuf->memory == (char *)NULL) {
  1104. X                fprintf(stderr,"realloc failed!\n");
  1105. X                exit(-1);
  1106. X            }
  1107. X        defbuf->memory[defbuf->curpos++] = c;
  1108. X        defbuf->memory[defbuf->curpos] = (char)NULL;
  1109. X    } else
  1110. X        putchar(c);
  1111. XWriteVector(v)
  1112. XVector *v;
  1113. X    WriteFloat(v->x);
  1114. X    WriteFloat(v->y);
  1115. X    WriteFloat(v->z);
  1116. XWriteFloat(x)
  1117. XFloat x;
  1118. X    char buf[BUFSIZ];
  1119. X    sprintf(buf, "%g ", x);
  1120. X    WriteVerbatim(buf);
  1121. XWriteNewline()
  1122. X    WriteVerbatim("\n");
  1123. XSetTypeList()
  1124. X    if (defbuf)
  1125. X        defbuf->type = LIST;
  1126. X    /* else set world type */
  1127. XSetTypeGrid(x,y,z)
  1128. Xint x, y, z;
  1129. X    if (defbuf) {
  1130. X        defbuf->type = GRID;
  1131. X        defbuf->x = x; defbuf->y = y; defbuf->z = z;
  1132. X    } /* else set world type */
  1133. XWriteColor(c)
  1134. XColor *c;
  1135. X    WriteFloat(c->r);
  1136. X    WriteFloat(c->g);
  1137. X    WriteFloat(c->b);
  1138. END_OF_FILE
  1139. if test 13171 -ne `wc -c <'etc/rsconvert/yacc.y'`; then
  1140.     echo shar: \"'etc/rsconvert/yacc.y'\" unpacked with wrong size!
  1141. chmod +x 'etc/rsconvert/yacc.y'
  1142. # end of 'etc/rsconvert/yacc.y'
  1143. echo shar: End of archive 15 \(of 19\).
  1144. cp /dev/null ark15isdone
  1145. MISSING=""
  1146. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
  1147.     if test ! -f ark${I}isdone ; then
  1148.     MISSING="${MISSING} ${I}"
  1149.     fi
  1150. if test "${MISSING}" = "" ; then
  1151.     echo You have unpacked all 19 archives.
  1152.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1153.     echo You still need to unpack the following archives:
  1154.     echo "        " ${MISSING}
  1155. ##  End of shell archive.
  1156. exit 0
  1157. exit 0 # Just in case...
  1158.