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

  1. Newsgroups: comp.sources.misc
  2. From: Rayshade Construction Co. <rayshade@weedeater.math.YALE.EDU>
  3. Subject:  v21i015:  rayshade - A raytracing package for UNIX, Part12/19
  4. Message-ID: <1991Jul21.033750.29232@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 659b41552716715c348d36c3e751450a
  6. Date: Sun, 21 Jul 1991 03:37:50 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 15
  10. Archive-name: rayshade/part12
  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 12 (of 19)."
  19. # Contents:  Doc/Guide/lights.tex Doc/quickref.txt libray/libobj/geom.c
  20. #   libray/libobj/torus.c libshade/options.c
  21. # Wrapped by kolb@woody on Wed Jul 17 17:56:51 1991
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. if test -f 'Doc/Guide/lights.tex' -a "${1}" != "-c" ; then 
  24.   echo shar: Will not clobber existing file \"'Doc/Guide/lights.tex'\"
  25. echo shar: Extracting \"'Doc/Guide/lights.tex'\" \(8326 characters\)
  26. sed "s/^X//" >'Doc/Guide/lights.tex' <<'END_OF_FILE'
  27. X\chapter{Light Sources}
  28. XThe lighting in a scene is determined by the number, type, and nature
  29. Xof the light sources defined in the input file.  Available light sources
  30. Xrange from simple directional sources to more realistic but computationally
  31. Xcostly quadrilateral area light sources.  Typically, you will want to use
  32. Xpoint or directional light sources while developing images.  When
  33. Xfinal renderings are made, these simple light sources may be replaced by
  34. Xthe more complex ones.
  35. XNo matter what kind of light source you use, you will need to
  36. Xspecify its intensity.
  37. XIn this chapter, an {\em Intensity\/} is either a red-green-blue triple
  38. Xindicating the color of the light source, or a single value that is
  39. Xinterpreted as the intensity of a ``white'' light.
  40. XIn the current version of {\em rayshade}, the intensity of a light does
  41. Xnot decrease as
  42. Xone moves farther from it.
  43. XIf you do not define a light source, \rayshade will create a directional
  44. Xlight source of intensity 1.0 defined by the vector (1., -1., 1.).
  45. XThis default light source is designed to work well when default
  46. Xviewing parameters and surface values are being used.
  47. XYou may define any number of light sources, but keep in mind that
  48. Xit will require more time to render images that include many
  49. Xlight sources.  It should also be noted that the light sources themselves
  50. Xwill not appear in the image, even if they are placed in frame.
  51. X\section{Light Source Types}
  52. XThe amount of ambient light present in a scene is controlled by a
  53. Xpseudo light source of type {\em ambient}.
  54. X\begin{defkey}{light}{{\em Intensity\/} ambient}
  55. X    Define the amount of ambient light present in the entire
  56. X    scene.
  57. X\end{defkey}
  58. XThere is only one ambient light source; its default intensity is
  59. X{1, 1, 1}.  If more than one ambient light source is defined,
  60. Xonly the last instance is used.  A surface's ambient color
  61. Xis multiplied by the intensity of the ambient source to give the
  62. Xtotal ambient light reflected from the surface.
  63. XDirectional sources are described by a direction alone, and are useful
  64. Xfor modeling light sources that are effectively infinitely far away
  65. Xfrom the objects they illuminate.   
  66. X\begin{defkey}{light}{{\em Intensity\/} {\tt directional} \evec{direction}}
  67. X    Define a light source with the given intensity that is
  68. X    defined to be in the given direction from every point
  69. X    it illuminates.  The direction need not be normalized.
  70. X\end{defkey}
  71. XPoint sources are defined as a single point in space.  They produce
  72. Xshadows with sharp edges and are a good replacement for extended
  73. Xand other computationally expensive light source.
  74. X\begin{defkey}{light}{{\em Intensity\/} {\tt point} \evec{pos}}
  75. X    Place a point light source with the given intensity at the
  76. X    given position.
  77. X\end{defkey}
  78. XSpotlights are useful for creating dramatic localized lighting effects.
  79. XThey are defined by their position, the direction in which they
  80. Xare pointing, and the width of the beam of light they produce.
  81. X\begin{defkey}{light}{{\em Intensity\/} {\tt spot} \evec{pos} \evec{to}
  82. X    {$\alpha$} [ $\theta_{in}$ $\theta_{out}$ ]}
  83. X    Place a spotlight at \evec{pos}, oriented as to be pointing at
  84. X    \evec{to}.  The intensity of the light falls off as
  85. X    $(cosine \theta)^{\alpha}$, where $\theta$ is the angle between the
  86. X    spotlight's main axis and the vector from the spotlight to the
  87. X    point being illuminated.  $\theta_{in}$ and
  88. X    $\theta_{out}$ may be used to control the radius of the cone of light
  89. X    produced by the spotlight.
  90. X\end{defkey}
  91. X$\theta_{in}$ is the the angle at which
  92. Xthe light source begins to be attenuated.  At $\theta_{out}$,
  93. Xthe spotlight intensity is zero.
  94. XThis affords control
  95. Xover how ``fuzzy'' the edges of the spotlight are.  If neither angle
  96. Xis given, they both are effectively set to 180 degrees.
  97. XExtended sources are meant to model spherical light sources.  Unlike
  98. Xpoint sources, extended sources actually possess a radius, and as such
  99. Xare capable or producing shadows with fuzzy edges ({\em penumbrae}).  If
  100. Xyou do not specifically desire penumbrae in your image, use a point
  101. Xsource instead.
  102. X\begin{defkey}{light}{{\em Intensity\/} {\tt extended} {\em radius} \evec{pos} }
  103. X    Create an extended light source at the given position and with
  104. X    the given {\em radius}.
  105. X\end{defkey}
  106. XThe shadows cast by
  107. Xextended sources are modeled by taking samples of the source at
  108. Xdifferent locations on its surface.  When the source is partially
  109. Xhidden from a given point in space, that point is in partial shadow
  110. Xwith respect to the extended source, and the sampling process is
  111. Xusually able to determine this fact.
  112. XQuadrilateral light sources are computationally more expensive than extended
  113. Xlight sources, but are more flexible and produce more realistic results.
  114. XThis is due to the fact that an area source is approximated by a
  115. Xnumber of point sources whose positions are jittered to reduce aliasing.
  116. XBecause each of these point sources has shading calculations performed
  117. Xindividually, area sources may be placed relatively close to the
  118. Xobjects it illuminates, and a reasonable image will result.
  119. X\begin{defkey}{light}{{\em Intensity\/} {\tt area} \evec{p1} \evec{p2} {\em usamp}
  120. X    \evec{p3} {\em vsamp}}
  121. X    Create a quadrilateral area light source.
  122. X    The $u$ axis
  123. X    is defined by the vector from \evec{p1} to \evec{p2}.  Along
  124. X    this axis a total of {\em usamp} samples will be taken.
  125. X    The $v$ axis of the light source is defined by the vector
  126. X    from \evec{p1} to \evec{p3}.  Along this axis a total of
  127. X    {\em vsamp} samples will be taken.
  128. X\end{defkey}
  129. XThe values of {\em usamp} and {\em vsamp} are usually chosen to be
  130. Xproportional to the lengths of the $u$ and $v$ axes.  Choosing a
  131. Xrelatively high number of samples will result in a good approximation
  132. Xto a ``real'' quadrilateral source.  However, because complete
  133. Xlighting calculations are performed for each sample,
  134. Xthe computational cost is directly proportional to the product
  135. Xof {\em usamp} and {\em vsamp}.
  136. X\section{Shadows}
  137. XIn order to determine the color of a point on the surface
  138. Xof any object, it is necessary
  139. Xto determine if that point is in shadow with respect to each
  140. Xdefined light source.  If the point is totally in shadow with respect to
  141. Xa light source, then the light source makes no contribution to the
  142. Xpoint's final color.
  143. XThis shadowing determination is made by tracing rays from the point
  144. Xof intersection to each light source.  These ``shadow feeler'' rays
  145. Xcan add substantially to the overall rendering time.  This is especially
  146. Xtrue if extended or area light sources are used.  If at any point you
  147. Xwish to disable shadow determination on a global scale, there is
  148. Xa command-line option ({\tt -n}) that allows you to do so.  It is also
  149. Xpossible
  150. Xto disable the casting of shadows onto given objects through the use
  151. Xof the {\tt noshadow} keyword in surface descriptions.  In addition,
  152. Xthe {\tt noshadow} keyword may be given following the definition
  153. Xof a light source, causing the light source to cast no shadows onto
  154. Xany surface.
  155. XDetermining if a point is in shadow with respect to a light source
  156. Xis relatively simple if all the objects in a scene are opaque.  In
  157. Xthis case, one simply traces a ray from the point to the light source.
  158. XIf the ray hits an object before it reaches the light source, then
  159. Xthe point is in shadow.
  160. XShadow determination
  161. Xbecomes more complicated if there are one or more objects with
  162. Xnon-zero transparency between the point and the light source.
  163. XTransparent objects may not completely block the light from a source,
  164. Xbut merely attenuate it. In such cases, it is necessary to compute the
  165. Xamount of attenuation at each intersection and to continue
  166. Xthe shadow ray until it either reaches the light source or until
  167. Xthe light is completely attenuated.
  168. XBy default, \rayshade computes shadow attenuation by assuming
  169. Xthat the index of refraction of the transparent object is the
  170. Xsame as that of the medium through which the ray is traveling.
  171. XTo disable
  172. Xpartial shadowing due to transparent objects, the {\em shadowtransp}
  173. Xkeyword should be given somewhere in the input file.
  174. X\begin{defkey}{shadowtransp}{}
  175. X    The intensity of light striking a point is {\em not} affected by
  176. X    intervening transparent objects.
  177. X\end{defkey}
  178. XIf you enclose an object behind a transparent surface, and you wish
  179. Xthe inner object to be illuminated, you must not use the {\tt shadowtransp}
  180. Xkeyword or the {\tt -o} option.
  181. END_OF_FILE
  182. if test 8326 -ne `wc -c <'Doc/Guide/lights.tex'`; then
  183.     echo shar: \"'Doc/Guide/lights.tex'\" unpacked with wrong size!
  184. # end of 'Doc/Guide/lights.tex'
  185. if test -f 'Doc/quickref.txt' -a "${1}" != "-c" ; then 
  186.   echo shar: Will not clobber existing file \"'Doc/quickref.txt'\"
  187. echo shar: Extracting \"'Doc/quickref.txt'\" \(9588 characters\)
  188. sed "s/^X//" >'Doc/quickref.txt' <<'END_OF_FILE'
  189. X                      Rayshade Quick Reference
  190. X-------------------------------------------------------------------------------
  191. XKey:
  192. X[thing]  Optional item              <Thing>  Production
  193. XThing    Number or String           (thing)  Default value(s)
  194. Xthing    Keyword
  195. X-------------------------------------------------------------------------------
  196. XReals and integers may be written in exponential notation, with or without a
  197. Xdecimal point.  Reals are truncated to integers when need be.  Numbers may also
  198. Xbe written as expressions surrounded by a matched pair of parentheses.
  199. XSubexpressions may be parenthesized to control order of evaluation.  Variables
  200. Xmay be defined and used in parenthesized expressions.  Predefined variables
  201. Xinclude time (current time) and frame (current frame number, 0 - frames-1), pi,
  202. Xdtor (pi/180), rotd (180/pi).  Available operators are '+' (addition),
  203. X'-' (subtraction and negation), '*' (multiplication), '/' (division),
  204. X'%' (remainder), '^' (exponentiation).  Functions include sin, cos, tan, asin,
  205. Xacos, atan, sqrt, hypot.
  206. XStrings are written as non-quoted strings that may include include the
  207. Xspecial characters '/' ("slash"), '-' ("dash"), '_' ("underscore), and '.'
  208. X("period"), in addition to upper and lowercase letters and non-leading digits.
  209. X-------------------------------------------------------------------------------
  210. XCommand-line options (override options set in input file):
  211. X-A frame       First frame to render 
  212. X-a             Toggle alpha channel   -C cutoff      Adaptive tree cutoff 
  213. X-c             Continued rendering    -D depth       Maximum ray tree depth.
  214. X-E eye_sep     Eye separation         -e             Exponential RLE output
  215. X-F freq        Report frequency       -f             Flip triangle normals
  216. X-G gamma       Gamma exponent         -g             Use gaussian filter
  217. X-h             Help                   -j             Toggle jittered sampling
  218. X-l             Render left eye view   -m             Produce sample map
  219. X-N frames      Total frames to render -n             No shadows
  220. X-O outfile     Output file name       -o             Toggle opaque shadows 
  221. X-P cpp-args    Arguments for cpp      -p             Preview-quality
  222. X-q             Run quietly            -R xres yres   Resolution
  223. X-r             Right eye view         -S samples     Use Samples^2 samples
  224. X-s             Toggle shadow caching  -T r g b       Contrast threshold
  225. X-V filename    Verbose file output    -v             Verbose output
  226. X-W lx ly hx hy Render subwindow
  227. X-------------------------------------------------------------------------------
  228. XFile: /* Input file consists of...*/
  229. X        <Item> [<Item> ... ]
  230. XItem:
  231. X        <Viewing>
  232. X        <Light>
  233. X        <Atmosphere>
  234. X        <RenderOption>
  235. X        <ObjItem>
  236. X        <Definition>
  237. XObjItem: /* Items used in object definition blocks */
  238. X        <SurfDef>
  239. X        <ApplySurf>
  240. X        <Instance>
  241. X        <ObjDef>
  242. XViewing:
  243. X        eyep Xpos Ypos Zpos     /* Eye position (0 -10 0) */
  244. X        lookp Xpos Ypos Zpos    /* Look position (0 0 0) */
  245. X        up Xup Yup Zup          /* "up" vector (0 0 1) */
  246. X        fov Hfov [Vfov]         /* Field of view in degrees (horiontal=45) */
  247. X        aperture Width          /* Aperture width (0) */
  248. X        focaldist Distance      /* focal distance (|eyep - lookp|) */
  249. X        shutter Speed           /* Shutter speed (0 --> no blur) */
  250. X        framelength Length      /* Length of a singelf frame (1) */
  251. X        screen Xsize Ysize      /* Screen size */
  252. X        window Xmin Ymin Xmax Ymax /* Window (0 0 xsize-1 ysize-1) */
  253. X        eyesep Separation       /* eye separation (0) */
  254. XSurfDef: /* Give a name to a set of surface attributes. */
  255. X        surface Name <SurfSpec> [<SurfSpec> ...]
  256. XSurface: /* Surface specification */
  257. X        <SurfSpec>                /* Use gven attributes */
  258. X        Surfname [<SurfSpec> ...] /* Use named surface w/ optional mods. */
  259. X        cursurf  [<SurfSpec> ...] /* Use cur. surface w/mods - see ApplySurf */
  260. XSurfSpec: /* Surface attribute specification */
  261. X        ambient R G B           /* Ambient contribution */
  262. X        diffuse R G B           /* Diffuse color */
  263. X        specular R G B          /* Specular color */
  264. X        specpow Exponent        /* Phong exponent */
  265. X        body R G B              /* Body color */
  266. X        extinct Coef            /* Extinction coefficient */
  267. X        transp Ktr              /* Transparency */
  268. X        reflect Kr              /* Reflectivity */
  269. X        index N                 /* Index of refraction */
  270. X        translu Ktl R G B Stpow /* Translucency, transmit diffuse, spec exp */
  271. X        noshadow                /* No shadows cast on this surface */
  272. XEffect: /* Atmospheric Effects */
  273. X        mist   R G B Rtrans Gtrans Btrans Zero Scale
  274. X        fog    R G B Rtrans Gtrans Btrans
  275. XAtmosphere: /* Global atmosphere */
  276. X        atmosphere [Index] <Effect> [<Effect>...] /* Global index, effects */
  277. XApplySurf:
  278. X        applysurf <Surface> /* apply surf to all following objs w/o surface */
  279. XInstance: /* Instance of an object */
  280. X        <Object> [<Transforms>] [<Textures>] 
  281. XObject:
  282. X        Primitive        /* Primitive object */
  283. X        Aggregate        /* Named aggregate */
  284. XObjDef: /* define a named object */
  285. X        name Objname <Instance>
  286. X        
  287. XPrimitive: /* Primitive object */
  288. X        plane    [<Surface>] Xpos Ypos Zpos Xnorm Ynorm Znorm
  289. X        disc     [<Surface>] Radius Xpos Ypos Zpos Xnorm Ynorm Znorm
  290. X        sphere   [<Surface>] Radius Xpos Ypos Zpos
  291. X        triangle [<Surface>] Xv1 Yv1 Zv1
  292. X                             Xv2 Yv2 Zv2  Xv3 Yv3 Zv3/* flat-shaded triangle */
  293. X        triangle [<Surface>] Xv1 Yv1 Zv1 Xn1 Yn1 Zn1
  294. X                             Xv2 Yv2 Zv2 Xn2 Yn2 Zn2
  295. X                             Xv3 Yv3 Zv3 Xn3 Yn3 Zn3/* Phong-shaded triangle */
  296. X        polygon  [<Surface>] Xv1 Yv1 Zv1
  297. X                             Xv2 Yv2 Zv2  Xv3 Yv3 Zv3 [Xv3 Yv4 Zv4 ...]
  298. X        box      [<Surface>] Xlow Ylow Zlow
  299. X                             Xhi  Yhi  Zhi
  300. X        cylinder [<Surface>] Radius Xbase Ybase Zbase Xapex Yapex Zapex
  301. X        cone     [<Surface>] Rbase Xbase Ybase Zbase  Rapex Xapex Yapex Zapex
  302. X        torus    [<Surface>] Rswept Rtube Xpos Ypos Zpos Xnorm Ynorm Znorm
  303. X        blob     [<Surface>] Thresh Stren Rad Xpos Ypos Zpos
  304. X                             [Stren Rad X Y Z ...]
  305. X        heightfield [<Surface>] Filename
  306. XAggregate:
  307. X        Grid
  308. X        List
  309. X        Csg
  310. XGrid:
  311. X        grid X Y Z <ObjItem> [<ObjItem> ...]  end
  312. XList:
  313. X        list <ObjItem> [<ObjItem> ...] end
  314. XCsg:
  315. X        union      <Object> <Object> [<Object> ...] end
  316. X        intersect  <Object> <Object> [<Object> ...] end
  317. X        difference <Object> <Object> [<Object> ...] end
  318. X        /* CSG will only work properly when applied to closed objects, e.g.:
  319. X         * sphere, box, torus, blob, closed Aggregate, other Csg object
  320. X         */
  321. XTransforms: /* Transformations */
  322. X        translate  Xtrans Ytrans Ztrans
  323. X        scale      Xscale Yscale Zscale
  324. X        rotate     Xaxis Yaxis Zaxis Degrees
  325. X        transform  A   B   C
  326. X                   D   E   F
  327. X                   G   H   I
  328. X                  [Xt  Yt  Zt]
  329. XTextures:
  330. X        texture <TextType> [Transforms] [<Texture> [Transforms] ...]
  331. XTexture:
  332. X        checker    <Surface>
  333. X        blotch    Scale <Surface>
  334. X        bump      Bumpscale
  335. X        marble    [Colormapname]
  336. X        fbm       Offset Scale H Lambda Octaves Thresh [Colormapname]
  337. X        fbmbump   Offset Scale H Lambda Octaves
  338. X        wood
  339. X        gloss     Glossiness
  340. X        cloud     Offset Scale H Lambda Octaves Cthresh Lthresh Transcale
  341. X        sky       Scale H Lambda Octaves Cthresh Lthresh
  342. X        stripe    <Surface> Width Bumpscale
  343. X        image     Imagefile [<ImageTextOption> [<ImageTextOption> ...]]
  344. XImageTextOption:
  345. X        component <SufComp>
  346. X        range     Lo Hi
  347. X        smooth
  348. X        textsurf  <Surface>
  349. X        tile      U V
  350. X        <Mapping>
  351. XSurfComp:
  352. X        ambient
  353. X        diffuse
  354. X        reflect
  355. X        transp
  356. X        specular
  357. X        specpow
  358. XMapping:
  359. X        map uv
  360. X        map cylindrical [Xorigin Yorigin Zorigin Xup Yup Zup Xu Yu Zu] 
  361. X        map linear      [Xorigin Yorigin Zorigin Xv  Yv  Zv  Xu Yu Zu]
  362. X        map spherical   [Xorigin Yorigin Zorigin Xup Yup Zup Xu Yu Zu]
  363. XLight:
  364. X        light R G B <LightType> [noshadow]
  365. X        light Intensity <LightType> [noshadow]
  366. XLightType:
  367. X        ambient
  368. X        point       Xpos Ypos Zpos
  369. X        directional Xdir Ydir Zdir
  370. X        extended    Xpos Ypos Zpos Radius
  371. X        spot        Xpos Ypos Zpos Xat Yat Zat Coef Thetain Thetaout
  372. X        area        Xorigin Yorigin Zorigin Xu Yu Zu Usamples Xv Yv Zv Vsamples
  373. XRenderOption:
  374. X        samples      Nsamp [jitter | nojitter]
  375. X                                /* Use Nsamp^2 pixel samples (3^2 jittered) */
  376. X        background   R G B      /* Background color (0 0 0) */
  377. X        outfile      Filename   /* Output file name (written to stdout) */
  378. X        frames       Nframes    /* Number of frames to render (1) */
  379. X        starttime    Time       /* Time corresponding to start of frame 0 */
  380. X        contrast     R G B      /* Maximum contrast w/o supersampling */
  381. X        maxdepth     Depth      /* Maximum ray tree depth (5) */
  382. X        cutoff       Factor     /* Minium spawned ray contribution (.001) */
  383. X        report [verbose] [quiet] [Freq] [Statfile]
  384. X                                /* Reporting mode (false false 10 stderr) */
  385. X        shadowtransp            /* Toggle object opacity affects shadows */
  386. XDefinition: /* Variable definition */
  387. X        define Name Expr        /* Assign value for Name */
  388. END_OF_FILE
  389. if test 9588 -ne `wc -c <'Doc/quickref.txt'`; then
  390.     echo shar: \"'Doc/quickref.txt'\" unpacked with wrong size!
  391. # end of 'Doc/quickref.txt'
  392. if test -f 'libray/libobj/geom.c' -a "${1}" != "-c" ; then 
  393.   echo shar: Will not clobber existing file \"'libray/libobj/geom.c'\"
  394. echo shar: Extracting \"'libray/libobj/geom.c'\" \(9132 characters\)
  395. sed "s/^X//" >'libray/libobj/geom.c' <<'END_OF_FILE'
  396. X * object.c
  397. X * Copyright (C) 1989, 1991, Craig E. Kolb
  398. X * All rights reserved.
  399. X * This software may be freely copied, modified, and redistributed
  400. X * provided that this copyright notice is preserved on all copies.
  401. X * You may not distribute this software, in whole or in part, as part of
  402. X * any commercial product without the express consent of the authors.
  403. X * There is no warranty or other guarantee of fitness of this software
  404. X * for any purpose.  It is provided solely "as is".
  405. X * $Id: geom.c,v 4.0 91/07/17 14:37:47 kolb Exp Locker: kolb $
  406. X * $Log:    geom.c,v $
  407. X * Revision 4.0  91/07/17  14:37:47  kolb
  408. X * Initial version.
  409. X#include "geom.h"
  410. X#include "list.h"
  411. X#include "libcommon/sampling.h"
  412. Xstatic void GeomBounds(), GeomBoundsAnimated();
  413. Xvoid GeomResolveAssoc();    /* probably static */
  414. XGeom *
  415. XGeomCreate(objptr, methods)
  416. XGeomRef objptr;
  417. XMethods *methods;
  418. X    Geom *obj;
  419. X    if (objptr == (GeomRef)NULL)
  420. X        return (Geom *)NULL;
  421. X    obj = (Geom *)share_calloc(1, sizeof(Geom));
  422. X    obj->obj = objptr;
  423. X    obj->methods = methods;
  424. X    obj->animtrans = FALSE;
  425. X    obj->trans = obj->transtail = (Trans *) NULL;
  426. X    obj->frame = -1;    /* impossible value */
  427. X    BoundsInit(obj->bounds);
  428. X#ifdef SHAREDMEM
  429. X     * If the counter is in shared memory, processes will
  430. X     * be modifying it left-and-right.  So, we cheat and
  431. X     * make counter a pointer to a non-shared location and
  432. X     * store the value there.
  433. X     */
  434. X    new->counter = (unsigned long *)Malloc(sizeof(unsigned long));
  435. X    *new->counter = 0;
  436. X#endif
  437. X    return obj;
  438. X * Return a copy of the given object.
  439. X * Note that surface, texturing, and transformation information
  440. X * is copied by reference.
  441. XGeom *
  442. XGeomCopy(obj)
  443. XGeom *obj;
  444. X    Geom *new;
  445. X    new = GeomCreate(obj->obj, obj->methods);
  446. X    /* Share texturing, name, #prims, surface info */
  447. X    new->name = obj->name;
  448. X    new->texture = obj->texture;
  449. X    new->surf = obj->surf;
  450. X    new->prims = obj->prims;
  451. X    new->trans = obj->trans;
  452. X    new->animtrans = obj->animtrans;
  453. X    new->transtail = obj->transtail;
  454. X    /* copy bounds */
  455. X    BoundsCopy(obj->bounds, new->bounds);
  456. X    return new;
  457. X * Report bounding box and number of primitives in object.
  458. Xvoid
  459. XAggregatePrintInfo(obj, fp)
  460. XGeom *obj;
  461. XFILE *fp;
  462. X    if (fp) {
  463. X        if (obj->name && obj->name[0])
  464. X            fprintf(fp,"%s \"%s\":\n", GeomName(obj), obj->name);
  465. X        else
  466. X            fprintf(fp,"%s:\n", GeomName(obj));
  467. X        if (!UNBOUNDED(obj))
  468. X            BoundsPrint(obj->bounds, fp);
  469. X        fprintf(fp,"\t%lu primitive%c\n",obj->prims,
  470. X            obj->prims == 1 ? ' ' : 's');
  471. X * Convert the given object from a linked list of objects to
  472. X * the desired aggregate type.
  473. XAggregateConvert(obj, objlist)
  474. XGeom *obj, *objlist;
  475. X    if (!IsAggregate(obj)) {
  476. X        RLerror(RL_ABORT, "A %s isn't an aggregate.\n",
  477. X            GeomName(obj));
  478. X        return 0;
  479. X    return (*obj->methods->convert)(obj->obj, objlist);
  480. X * This should really be called
  481. X * GeomInitialize
  482. X * or something.
  483. Xvoid
  484. XGeomComputeBounds(obj)
  485. XGeom *obj;
  486. X    if (obj->frame == Sampling.framenum)
  487. X        return;
  488. X    if (!obj->animtrans) {
  489. X        /*
  490. X         * If it isn't animated,
  491. X         * just compute bbox directly 
  492. X         */
  493. X        GeomBounds(obj, obj->bounds);
  494. X    } else {
  495. X        /*
  496. X         * Animated things are gonna get a bbox
  497. X         * which is large enough to enclose all
  498. X         * the places where the object goes.
  499. X         */
  500. X        GeomBoundsAnimated(obj);
  501. X     * Enlarge by EPSILON in each direction just to
  502. X     * be on the safe side.
  503. X     */
  504. X    obj->bounds[LOW][X] -= EPSILON;
  505. X    obj->bounds[HIGH][X] += EPSILON;
  506. X    obj->bounds[LOW][Y] -= EPSILON;
  507. X    obj->bounds[HIGH][Y] += EPSILON;
  508. X    obj->bounds[LOW][Z] -= EPSILON;
  509. X    obj->bounds[HIGH][Z] += EPSILON;
  510. X     * Mark the fact that that the obj is initialized
  511. X     * for this frame.
  512. X     */
  513. X    obj->frame = Sampling.framenum;
  514. X    obj->counter = 0;
  515. Xstatic void
  516. XGeomBoundsAnimated(obj)
  517. XGeom *obj;
  518. X    int i, m;
  519. X    Float newbounds[2][3];
  520. X    Float window, subwindow, jitter, subjitter;
  521. X     * For each possible screen sample,
  522. X     * choose TIME_SUB_SAMPLES times and recompute the
  523. X     * bounds of obj at that time,
  524. X     * expanding the computed bounding box appropriately.
  525. X     */
  526. X    BoundsInit(obj->bounds);
  527. X    jitter = Sampling.shutter / Sampling.totsamples;
  528. X    subjitter = jitter / (Float)TIME_SUB_SAMPLES;
  529. X    window = Sampling.starttime;
  530. X    for (i = 0; i < Sampling.totsamples; i++, window += jitter) {
  531. X        subwindow = window;
  532. X        for (m = 0; m < TIME_SUB_SAMPLES; m++, subwindow += subjitter) {
  533. X            /*
  534. X             * Set the current time.
  535. X             */
  536. X            TimeSet(subwindow + subjitter*nrand());
  537. X            /*
  538. X             * Resolve the objects geometric associations
  539. X             */
  540. X            GeomResolveAssoc(obj);
  541. X            /*
  542. X             * Compute bounds and expand current bounds.
  543. X             */
  544. X            GeomBounds(obj, newbounds);
  545. X            BoundsEnlarge(obj->bounds, newbounds);
  546. X     * Also sample at time extremes, as for many
  547. X     * movements, extremes occur at beginning/end times.
  548. X     */
  549. X    TimeSet(Sampling.starttime);
  550. X    GeomResolveAssoc(obj);
  551. X    GeomBounds(obj, newbounds);
  552. X    BoundsEnlarge(obj->bounds, newbounds);
  553. X    TimeSet(Sampling.starttime + Sampling.shutter);
  554. X    GeomResolveAssoc(obj);
  555. X    GeomBounds(obj, newbounds);
  556. X    BoundsEnlarge(obj->bounds, newbounds);
  557. Xvoid
  558. XGeomResolveAssoc(obj)
  559. XGeom *obj;
  560. X     * PrimResolveAssoc(obj);
  561. X     */
  562. X    TransResolveAssoc(obj->trans);
  563. X * Set "bounds" of object to be the extent of the primitive.
  564. Xstatic void
  565. XGeomBounds(obj, bounds)
  566. XGeom *obj;
  567. XFloat bounds[2][3];
  568. X    Trans *trans;
  569. X    if (!obj || !obj->methods->bounds)
  570. X        RLerror(RL_ABORT, "Can't compute bounds of \"%s\".\n",
  571. X            GeomName(obj));
  572. X    (*obj->methods->bounds) (obj->obj, bounds);
  573. X    if (obj->trans) {
  574. X        for (trans = obj->trans; trans; trans = trans->next)
  575. X            BoundsTransform(&trans->trans, bounds);
  576. Xchar *
  577. XGeomName(obj)
  578. XGeom *obj;
  579. X    if (obj->methods->name)
  580. X        return (*obj->methods->name)();
  581. X    return "unknown";
  582. Xvoid
  583. XGeomStats(obj, tests, hits)
  584. XGeom *obj;
  585. Xunsigned long *tests, *hits;
  586. X    if (obj && obj->methods->stats)
  587. X        (*obj->methods->stats)(tests, hits);
  588. X    else {
  589. X        *tests = *hits = 0;
  590. X * Push an object onto the head of the given stack, returning
  591. X * the new head.
  592. XGeomList *
  593. XGeomStackPush(obj, list)
  594. XGeom *obj;
  595. XGeomList *list;
  596. X    GeomList *new;
  597. X     * Pretty simple.
  598. X     * Make new element point to old head and return new head.
  599. X     */
  600. X    new = (GeomList *)Malloc(sizeof(GeomList));
  601. X    new->obj = obj;
  602. X    new->next = list;
  603. X    return new;
  604. X * Pop the topmost object off of the given stack, returning the new head.
  605. X * The old head is freed, but the object it points to is not.
  606. XGeomList *
  607. XGeomStackPop(list)
  608. XGeomList *list;
  609. X    GeomList *ltmp;
  610. X    ltmp = list->next;    /* Save new head. */
  611. X    free((voidstar)list);    /* Free old head. */
  612. X    return ltmp;        /* Return new head. */
  613. XMethods *
  614. XMethodsCreate()
  615. X    return (Methods *)share_calloc(1, sizeof(Methods));
  616. X * Call appropriate routine to compute UV and, if non-null,
  617. X * dpdu and dpdv at given point on the given primitive.  The
  618. X * normal is used to facilitate computation of u, v, and the
  619. X * partial derivatives.
  620. Xvoid
  621. XPrimUV(prim, pos, norm, uv, dpdu, dpdv)
  622. XGeom *prim;
  623. XVector *pos, *norm, *dpdu, *dpdv;
  624. XVec2d *uv;
  625. X     * Call appropriate inverse mapping routine
  626. X     */
  627. X    if (prim->methods->uv == NULL) {
  628. X        uv->u = uv->v = 0.;
  629. X        if (dpdu) {
  630. X            dpdu->y = dpdu->z = 0.;
  631. X            dpdu->x = 1.;
  632. X        if (dpdv) {
  633. X            dpdv->x = dpdv->z = 0.;
  634. X            dpdv->y = 1.;
  635. X        }    
  636. X    } else
  637. X        (*prim->methods->uv)(prim->obj,pos,norm,uv,dpdu,dpdv);
  638. XPrimNormal(prim, pos, norm, gnorm)
  639. XGeom *prim;
  640. XVector *pos, *norm, *gnorm;
  641. X     * Call appropriate normal routine
  642. X     */
  643. X    return (*prim->methods->normal) (prim->obj, pos, norm, gnorm);
  644. XPrimEnter(obj, ray, mind, hitd)
  645. XGeom *obj;
  646. XRay *ray;
  647. XFloat mind, hitd;
  648. X     * Call appropriate enter/leave routine
  649. X     */
  650. X    if (obj->methods->enter == NULL) {
  651. X        Vector pos, nrm, gnrm;
  652. X        /*
  653. X         * Sleazy method:  Use hit point, find normal 
  654. X         * and take dot prod with ray 
  655. X         */
  656. X        VecAddScaled(ray->pos, hitd, ray->dir, &pos);
  657. X        PrimNormal(obj, &pos, &nrm, &gnrm);
  658. X        return dotp(&ray->dir, &gnrm) < 0.0;
  659. X    else
  660. X        return (*obj->methods->enter) (obj->obj, ray, mind, hitd);
  661. X * Walk through a linked-list of objects.  If the object is unbounded,
  662. X * unlink it it from the list and add it to the 'unbounded' list.
  663. X * If the object is bounded, enlarge the given bounding box if
  664. X * necessary.  Return pointer to unbounded list.
  665. XGeom *
  666. XGeomComputeAggregateBounds(bounded, unbounded, bounds)
  667. XGeom **bounded, *unbounded;
  668. XFloat bounds[2][3];
  669. X    Geom *ltmp, *prev, *nextobj;
  670. X    BoundsInit(bounds);
  671. X    prev = (Geom *)0;
  672. X    for (ltmp = *bounded; ltmp; ltmp = nextobj) {
  673. X        nextobj = ltmp->next;
  674. X        GeomComputeBounds(ltmp);
  675. X        if (UNBOUNDED(ltmp)) {
  676. X            /*
  677. X             * Geom is unbounded -- unlink it...
  678. X             */
  679. X            if (prev)
  680. X                prev->next = ltmp->next;
  681. X            else
  682. X                *bounded = ltmp->next;
  683. X            /*
  684. X             * And add it to unbounded object list.
  685. X             */
  686. X            ltmp->next = unbounded;
  687. X            unbounded = ltmp;
  688. X        } else {
  689. X            /*
  690. X             * Geom is bounded.
  691. X             */
  692. X            BoundsEnlarge(bounds, ltmp->bounds);
  693. X            prev = ltmp;
  694. X    return unbounded;
  695. X * Find 'highest' animated object on the hitlist.
  696. XFirstAnimatedGeom(hitlist)
  697. XHitList *hitlist;
  698. X    int i;
  699. X    for (i = hitlist->nodes -1; i; i--)
  700. X        /*
  701. X         * If object itself is animated, have
  702. X         * to check other flag, too...
  703. X         */
  704. X        if (hitlist->data[i].obj->animtrans)
  705. X            return i;
  706. X    return 0;
  707. END_OF_FILE
  708. if test 9132 -ne `wc -c <'libray/libobj/geom.c'`; then
  709.     echo shar: \"'libray/libobj/geom.c'\" unpacked with wrong size!
  710. # end of 'libray/libobj/geom.c'
  711. if test -f 'libray/libobj/torus.c' -a "${1}" != "-c" ; then 
  712.   echo shar: Will not clobber existing file \"'libray/libobj/torus.c'\"
  713. echo shar: Extracting \"'libray/libobj/torus.c'\" \(8916 characters\)
  714. sed "s/^X//" >'libray/libobj/torus.c' <<'END_OF_FILE'
  715. X * torus.c
  716. X * Copyright (C) 1990, 1991, Mark Podlipec, Craig E. Kolb
  717. X * All rights reserved.
  718. X * This software may be freely copied, modified, and redistributed
  719. X * provided that this copyright notice is preserved on all copies.
  720. X * You may not distribute this software, in whole or in part, as part of
  721. X * any commercial product without the express consent of the authors.
  722. X * There is no warranty or other guarantee of fitness of this software
  723. X * for any purpose.  It is provided solely "as is".
  724. X * $Id: torus.c,v 4.0 91/07/17 14:39:28 kolb Exp Locker: kolb $
  725. X * $Log:    torus.c,v $
  726. X * Revision 4.0  91/07/17  14:39:28  kolb
  727. X * Initial version.
  728. X#include "geom.h"
  729. X#include "torus.h"
  730. Xstatic Methods *iTorusMethods = NULL;
  731. Xstatic char torusName[] = "torus";
  732. Xunsigned long TorusTests, TorusHits;
  733. X * Create & return reference to a torus.
  734. XTorus *
  735. XTorusCreate(a, b, pos, norm)
  736. XFloat a, b;
  737. XVector *pos, *norm;
  738. X    Torus  *torus;
  739. X    Vector tmpnrm;
  740. X    if ((a < EPSILON) || (b < EPSILON)) {
  741. X        RLerror(RL_WARN, "Degenerate torus.\n");
  742. X        return (Torus *)NULL;
  743. X    tmpnrm = *norm;
  744. X    if (VecNormalize(&tmpnrm) == 0.) {
  745. X        RLerror(RL_WARN, "Degenerate torus normal.\n");
  746. X        return (Torus *)NULL;
  747. X    torus = (Torus *)share_malloc(sizeof(Torus));
  748. X     * torus->aa holds the square of the swept radius.
  749. X     * torus->bb holds the square of the tube radius.
  750. X     */
  751. X    torus->a = a;
  752. X    torus->b = b;
  753. X    torus->aa = a*a;
  754. X    torus->bb = b*b;
  755. X    CoordSysTransform(pos, &tmpnrm, 1., 1., &torus->trans);
  756. X    return torus;
  757. X * Ray/torus intersection test.
  758. XTorusIntersect(torus, inray, mindist, maxdist)
  759. XTorus *torus;
  760. XRay *inray;
  761. XFloat mindist, *maxdist;
  762. X    Vector pos,ray;
  763. X    double c[5],s[4], dist, nmin;
  764. X    Float distfactor;
  765. X    register int num,i;
  766. X    TorusTests++;
  767. X    /* Transform ray into toroid space */
  768. X        Ray tmpray;
  769. X        tmpray = *inray;
  770. X        distfactor = RayTransform(&tmpray, &torus->trans.itrans);
  771. X        ray = tmpray.dir;
  772. X        pos = tmpray.pos;
  773. X        nmin = mindist * distfactor;
  774. X * Original Equations for Toroid with position of (0,0,0) and axis (0,0,1)
  775. X * Equation for two circles of radius b centered at (-a,0,0) and (a,0,0) 
  776. X *      ((R-a)^2 + z*2 - b*b) * ((R+a)^2 + z*z - b*b) = 0 
  777. X *       a         is swept radius
  778. X *       b         is tube  radius
  779. X * subsitute R*R = x*x + y*y  to rotate about z-axis
  780. X * and substitute the parametric ray equations:
  781. X *       x = x0 + t * x1;
  782. X *       y = y0 + t * y1;
  783. X *       z = z0 + t * z1;
  784. X * to get a Quartic in t.
  785. X *       c4*t^4 + c3*t^3 + c2*t^2 + c1*t + c0 = 0
  786. X * where the coefficients are:
  787. X *       c4 =   (x1s + y1s + z1s) * (x1s + y1s + z1s); 
  788. X *       c3 =   4.0 * (tx + ty + tz) * (x1s + y1s + z1s);
  789. X *       c2 =   2.0 * (x1s + y1s + z1s) * (x0s + y0s + z0s - as - bs)
  790. X *            + 4.0 * (tx + ty + tz)    * (tx + ty + tz)
  791. X *            + 4.0 * as * z1s;
  792. X *       c1 =   4.0 * (tx + ty + tz) * (x0s + y0s + z0s - as - bs)
  793. X *            + 8.0 * as * tz;
  794. X *       c0 =   (x0s + y0s + z0s - as - bs) * (x0s + y0s + z0s - as - bs)
  795. X *            + 4.0 * as * (z0s - bs);
  796. X *       as        is swept radius squared
  797. X *       bs        is tube  radius squared
  798. X *      (x0,y0,z0) is origin of ray to be tested
  799. X *      (x1,y1,z1) is direction vector of ray to be tested
  800. X *       tx        is x0 * x1
  801. X *       ty        is y0 * y1
  802. X *       tz        is z0 * z1
  803. X *   Since the direction vector (x1,y1,z1) is normalized:
  804. X *              (x1s + y1s + z1s) = 1.0
  805. X *   Also let     g2s = (x1 * x0) + (y1 * y0) + (z1 * z0)
  806. X *    and let     g0s = (x0 * x0) * (y0 * y0) + (z0 * z0) - as - bs 
  807. X *    since these terms are used fairly often
  808. X        register Float g0s,g2s;
  809. X        register Float as,bs;
  810. X        register Float z0s,z1s,tz;
  811. X        as  = torus->aa;
  812. X        bs  = torus->bb;
  813. X        z0s = pos.z * pos.z;
  814. X        z1s = ray.z * ray.z;
  815. X        tz  = pos.z * ray.z;
  816. X        g0s = pos.x * pos.x  +  pos.y * pos.y  +  z0s  -  as  -  bs;
  817. X        g2s = pos.x * ray.x  +  pos.y * ray.y  +  tz;
  818. X        c[4] =   1.0;
  819. X        c[3] =   4.0 * g2s;
  820. X        c[2] =   2.0 * (g0s  +  2.0 * g2s * g2s  +  2.0 * as * z1s);
  821. X        c[1] =   4.0 * (g2s*g0s  +  2.0*as*tz);
  822. X        c[0] =   g0s * g0s  +  4.0 * as * (z0s - bs);
  823. X    /* use GraphGem's Solve Quartic to find roots */
  824. X    num = SolveQuartic(c,s);
  825. X    /* no roots - return 0. */
  826. X    if (num==0) return FALSE;
  827. X    /* of roots return the smallest root > EPSILON */
  828. X    dist = 0.0;
  829. X    for(i=0;i<num;i++)
  830. X        /* if root is in front of ray origin */
  831. X        if (s[i] > nmin) {
  832. X            /* first valid root */
  833. X            if (dist == 0.0) dist = s[i];
  834. X            /* else update only if it's closer to ray origin */
  835. X            else if (s[i] < dist) dist = s[i];
  836. X    dist /= distfactor;
  837. X    if (dist > mindist && dist < *maxdist) {
  838. X        *maxdist = dist;
  839. X        TorusHits++;
  840. X        return TRUE;
  841. X    return FALSE;
  842. X * Compute the normal to a torus at a given location on its surface
  843. XTorusNormal(torus, rawpos, nrm, gnrm)
  844. XTorus *torus;
  845. XVector *rawpos, *nrm, *gnrm;
  846. X    Vector pos;
  847. X    register Float dist,posx,posy,xm,ym;
  848. X    /* Transform intersection point to torus space. */
  849. X    pos = *rawpos;
  850. X    PointTransform(&pos, &torus->trans.itrans);
  851. X *  The code for the toroid is simpified by always having the axis
  852. X *  be the z-axis and then transforming information to and from
  853. X *  toroid space.
  854. X *  Flatten toroid by ignoring z. Now imagine a knife cutting from
  855. X *  center of toroid to the ray intersection point(x,y). The point
  856. X *  on the tube axis(a circle about the origin with radius 'a') 
  857. X *  where the knife cuts is (xm,ym,zm=0). Unflattening the toroid,
  858. X *  the normal at the point [x,y,z] is (x-xm,y-ym,z). Of course, we
  859. X *  must transform the normal back into world coordinates.
  860. X *  Instead of messing with tan-1,sin and cos, we can find (xm,ym)
  861. X *  by using the proportions:
  862. X *     xm     x           ym     y
  863. X *    ---- = ----   and  ---- = ----
  864. X *     a     dist         a     dist
  865. X *       a         is the swept radius
  866. X *    [x,y,z]      is the point on the toroids surface
  867. X *      dist       is the distance from the z-axis (x*x + y*y).
  868. X *    [xm,ym,zm=0] is the point on the tube's axis 
  869. X    /* find distance from axis */
  870. X    posx = pos.x;
  871. X    posy = pos.y;
  872. X    dist = sqrt(posx * posx + posy * posy);
  873. X    if (dist > EPSILON)
  874. X        xm = torus->a * posx / dist;
  875. X        ym = torus->a * posy / dist;
  876. X    else /* ERROR - dist should not be < EPSILON (should never happen)*/
  877. X        xm = 0.0;
  878. X        ym = 0.0;
  879. X    /* normal is vector from [xm,ym,zm] to [x,y,z] */
  880. X    nrm->x = posx - xm;
  881. X    nrm->y = posy - ym;
  882. X    nrm->z = pos.z;   /* note by default zm is 0 */
  883. X    /* Transform normal back to world space. */
  884. X    NormalTransform(nrm, &torus->trans.itrans);
  885. X    *gnrm = *nrm;
  886. X    return FALSE;
  887. Xvoid
  888. XTorusUV(torus, pos, norm, uv, dpdu, dpdv)
  889. XTorus *torus;
  890. XVector *pos, *norm, *dpdu, *dpdv;
  891. XVec2d *uv;
  892. X    Vector npos;
  893. X    Float costheta, sintheta, rad, cosphi;
  894. X    npos = *pos;
  895. X    PointTransform(&npos, &torus->trans.itrans);
  896. X     * u = theta / 2PI
  897. X     */
  898. X    rad = sqrt(npos.x*npos.x + npos.y*npos.y);
  899. X    costheta = npos.x / rad;
  900. X    sintheta = npos.y / rad;
  901. X    if (costheta > 1.)    /* roundoff */
  902. X        uv->u = 0.;
  903. X    else if (costheta < -1.)
  904. X        uv->u = 0.5;
  905. X    else
  906. X        uv->u = acos(costheta) / TWOPI;
  907. X    if (sintheta < 0.)
  908. X        uv->u = 1. - uv->u;
  909. X    if (dpdu) {
  910. X        dpdu->x = -npos.y;
  911. X        dpdu->y = npos.x;
  912. X        dpdu->z = 0.;
  913. X        VecTransform(dpdu, &torus->trans.trans);
  914. X        (void)VecNormalize(dpdu);
  915. X     * sinphi = npos.z / tor->b;
  916. X     * cosphi = rad - tor->a;
  917. X     * cosphi is negated in order to make texture 'seam'
  918. X     * occur on the interior of the torus.
  919. X     */
  920. X    cosphi = -(rad - torus->a) / torus->b;
  921. X    if (cosphi > 1.)
  922. X        uv->v = 0.;
  923. X    else if (cosphi < -1.)
  924. X        uv->v = 0.5;
  925. X    else
  926. X        uv->v = acos(cosphi) / TWOPI;
  927. X    if (npos.z > 0.)    /* if sinphi > 0... */
  928. X        uv->v = 1. - uv->v;
  929. X     * dpdv = norm X dpdu
  930. X     */
  931. X    if (dpdv) {
  932. X        VecCross(norm, dpdu, dpdv);
  933. X        VecTransform(dpdv, &torus->trans.trans);
  934. X        (void)VecNormalize(dpdv);
  935. X * Return the extent of a torus.
  936. Xvoid
  937. XTorusBounds(torus, bounds)
  938. XTorus *torus;
  939. XFloat bounds[2][3];
  940. X    bounds[LOW][X]  = bounds[LOW][Y]  = -(torus->a+torus->b);
  941. X    bounds[HIGH][X] = bounds[HIGH][Y] =  torus->a+torus->b;
  942. X    bounds[LOW][Z]  = -torus->b;
  943. X    bounds[HIGH][Z] =  torus->b;
  944. X         * Transform bounding box to world space.
  945. X         */
  946. X    BoundsTransform(&torus->trans.trans, bounds);
  947. Xchar *
  948. XTorusName()
  949. X    return torusName;
  950. Xvoid
  951. XTorusStats(tests, hits)
  952. Xunsigned long *tests, *hits;
  953. X    *tests = TorusTests;
  954. X    *hits = TorusHits;
  955. XMethods *
  956. XTorusMethods()
  957. X    if (iTorusMethods == NULL) {
  958. X        iTorusMethods = MethodsCreate();
  959. X        iTorusMethods->create = (GeomCreateFunc *)TorusCreate;
  960. X        iTorusMethods->methods  = TorusMethods;
  961. X        iTorusMethods->name = TorusName;
  962. X        iTorusMethods->intersect = TorusIntersect;
  963. X        iTorusMethods->bounds = TorusBounds;
  964. X        iTorusMethods->normal = TorusNormal;
  965. X        iTorusMethods->uv = TorusUV;
  966. X        iTorusMethods->stats = TorusStats;
  967. X        iTorusMethods->checkbounds = TRUE;
  968. X        iTorusMethods->closed = TRUE;
  969. X    return iTorusMethods;
  970. Xvoid
  971. XTorusMethodRegister(meth)
  972. XUserMethodType meth;
  973. X    if (iTorusMethods)
  974. X        iTorusMethods->user = meth;
  975. END_OF_FILE
  976. if test 8916 -ne `wc -c <'libray/libobj/torus.c'`; then
  977.     echo shar: \"'libray/libobj/torus.c'\" unpacked with wrong size!
  978. # end of 'libray/libobj/torus.c'
  979. if test -f 'libshade/options.c' -a "${1}" != "-c" ; then 
  980.   echo shar: Will not clobber existing file \"'libshade/options.c'\"
  981. echo shar: Extracting \"'libshade/options.c'\" \(8699 characters\)
  982. sed "s/^X//" >'libshade/options.c' <<'END_OF_FILE'
  983. X * options.c
  984. X * Copyright (C) 1989, 1991, Craig E. Kolb
  985. X * All rights reserved.
  986. X * This software may be freely copied, modified, and redistributed
  987. X * provided that this copyright notice is preserved on all copies.
  988. X * You may not distribute this software, in whole or in part, as part of
  989. X * any commercial product without the express consent of the authors.
  990. X * There is no warranty or other guarantee of fitness of this software
  991. X * for any purpose.  It is provided solely "as is".
  992. X * $Id: options.c,v 4.0 91/07/17 14:46:47 kolb Exp Locker: kolb $
  993. X * $Log:    options.c,v $
  994. X * Revision 4.0  91/07/17  14:46:47  kolb
  995. X * Initial version.
  996. X#include "rayshade.h"
  997. X#include "options.h"
  998. X#include "stats.h"
  999. X#include "viewing.h"
  1000. XRSOptions    Options;
  1001. Xstatic void usage();
  1002. Xvoid
  1003. XRSOptionsSet(argc, argv)
  1004. Xint argc;
  1005. Xchar **argv;
  1006. X    extern void OpenStatsFile();
  1007. X    Options.progname = strsave(argv[0]);
  1008. X    Options.inputname = (char *)NULL;
  1009. X    while (--argc) {
  1010. X        argv++;
  1011. X        if (argv[0][0] != '-') {
  1012. X            /*
  1013. X             * Must be the input file name.
  1014. X             * If already given, complain and then exit.
  1015. X             */
  1016. X            if (Options.inputname != (char *)NULL) {
  1017. X                usage();    
  1018. X                exit(1);
  1019. X            }
  1020. X            Options.inputname = strsave(argv[0]);
  1021. X            continue;
  1022. X        /* else */
  1023. X        switch(argv[0][1]) {
  1024. X            case 'A':
  1025. X                /*
  1026. X                 * First frame number
  1027. X                 */
  1028. X                Options.startframe = atoi(argv[1]);
  1029. X                argv++; argc--;
  1030. X                break;
  1031. X#ifdef URT
  1032. X            case 'a':
  1033. X                Options.alpha = !Options.alpha;
  1034. X                break;
  1035. X#endif
  1036. X            case 'C':
  1037. X                Options.cutoff.r = atof(argv[1]);
  1038. X                Options.cutoff.g = atof(argv[2]);
  1039. X                Options.cutoff.b = atof(argv[3]);
  1040. X                Options.cutoff_set = TRUE;
  1041. X                argv += 3; argc -= 3;
  1042. X                break;
  1043. X#ifdef URT
  1044. X            case 'c':
  1045. X                Options.appending = TRUE;
  1046. X                break;
  1047. X#endif
  1048. X            case 'D':
  1049. X                Options.maxdepth = atoi(argv[1]);
  1050. X                Options.maxdepth_set = TRUE;
  1051. X                argv++; argc--;
  1052. X                break;
  1053. X            case 'E':
  1054. X                Options.eyesep = atof(argv[1]);
  1055. X                Options.eyesep_set = TRUE;
  1056. X                argc--; argv++;
  1057. X                break;
  1058. X#ifdef URT
  1059. X            case 'e':
  1060. X                Options.exp_output = TRUE;
  1061. X                break;
  1062. X#endif
  1063. X            case 'F':
  1064. X                Options.report_freq = atoi(argv[1]);
  1065. X                if (Options.report_freq < 1)
  1066. X                    Options.report_freq = 1;
  1067. X                Options.freq_set = TRUE;
  1068. X                argv++; argc--;
  1069. X                break;
  1070. X            case 'f':
  1071. X                Options.flipnorm = !Options.flipnorm;
  1072. X                break;
  1073. X            case 'G':
  1074. X                Options.gamma = atof(argv[1]);
  1075. X                argv++; argc--;
  1076. X                break;
  1077. X            case 'g':
  1078. X                Options.gaussian = !Options.gaussian;
  1079. X                break;
  1080. X            case 'h':
  1081. X                usage();
  1082. X                exit(0);
  1083. X                break;
  1084. X            case 'j':
  1085. X                Options.jitter = !Options.jitter;
  1086. X                Options.jitter_set = TRUE;
  1087. X                break;
  1088. X            case 'l':
  1089. X                Options.stereo = LEFT;
  1090. X                break;
  1091. X#ifdef URT
  1092. X            case 'm':
  1093. X                Options.samplemap = !Options.samplemap;
  1094. X                break;
  1095. X#endif
  1096. X            case 'N':
  1097. X                Options.totalframes = atof(argv[1]);
  1098. X                Options.totalframes_set = TRUE;
  1099. X                argv++; argc--;
  1100. X                break;
  1101. X            case 'n':
  1102. X                Options.no_shadows = !Options.no_shadows;
  1103. X                break;
  1104. X            case 'O':
  1105. X                Options.imgname = strsave(argv[1]);
  1106. X                argv++;
  1107. X                argc--;
  1108. X                break;
  1109. X            case 'o':
  1110. X                Options.shadowtransp = !Options.shadowtransp;
  1111. X                break;
  1112. X            case 'P':
  1113. X                Options.cppargs = argv[1];
  1114. X                argv++; argc--;
  1115. X                break;
  1116. X            case 'p':
  1117. X                /*
  1118. X                 * Preview-quality rendering
  1119. X                 * no shadows
  1120. X                 * max depth of 0
  1121. X                 * 1 jittered sample/pixel
  1122. X                 */
  1123. X                Options.no_shadows = TRUE;
  1124. X                Options.maxdepth = 0;
  1125. X                Options.maxdepth_set = TRUE;
  1126. X                Options.jitter = TRUE;
  1127. X                Options.jitter_set = TRUE;
  1128. X                Options.samples = 1;
  1129. X                Options.samples_set = TRUE;
  1130. X                break;
  1131. X            case 'q':
  1132. X                Options.quiet = TRUE;
  1133. X                break;
  1134. X            case 'R':
  1135. X                Screen.xres = atoi(argv[1]);
  1136. X                Screen.yres = atoi(argv[2]);
  1137. X                Options.resolution_set = TRUE;
  1138. X                argv += 2;
  1139. X                argc -= 2;
  1140. X                break;
  1141. X            case 'r':
  1142. X                Options.stereo = RIGHT;
  1143. X                break;
  1144. X            case 'S':
  1145. X                Options.samples = atoi(argv[1]);
  1146. X                if (Options.samples < 1)
  1147. X                    Options.samples = 1;
  1148. X                Options.samples_set = TRUE;
  1149. X                argv++; argc--;
  1150. X                break;
  1151. X            case 's':
  1152. X                Options.cache = !Options.cache;
  1153. X                break;
  1154. X            case 'T':
  1155. X                Options.contrast.r = atof(argv[1]);
  1156. X                Options.contrast.g = atof(argv[2]);
  1157. X                Options.contrast.b = atof(argv[3]);
  1158. X                Options.contrast_set = TRUE;
  1159. X                argv += 3;
  1160. X                argc -= 3;
  1161. X                break;
  1162. X            case 'v':
  1163. X                Options.verbose = TRUE;
  1164. X                break;
  1165. X            case 'V':
  1166. X                Options.verbose = TRUE;
  1167. X                if (argv[1][0] == '-') {
  1168. X                    /* User probably blew it, and
  1169. X                     * it's difficult to remove a file
  1170. X                     * that begins with '-'...
  1171. X                     */
  1172. X                    usage();
  1173. X                    exit(2);
  1174. X                }
  1175. X                Options.statsname = strsave(argv[1]);
  1176. X                OpenStatsFile();
  1177. X                argv++; argc--;
  1178. X                break;
  1179. X#ifdef URT
  1180. X            case 'W':
  1181. X                Options.xmin = atof(argv[1]);
  1182. X                Options.xmax = atof(argv[2]);
  1183. X                Options.ymin = atof(argv[3]);
  1184. X                Options.ymax = atof(argv[4]);
  1185. X                Options.window_set = TRUE;
  1186. X                argv += 4; argc -= 4;
  1187. X                break;
  1188. X#endif
  1189. X#ifdef LINDA
  1190. X            case 'X':
  1191. X                Options.workers = atoi(argv[1]);
  1192. X                if (Options.workers<0 || Options.workers>17) {
  1193. X                    RLerror(RL_PANIC, "%d workers?\n",
  1194. X                            Options.workers);
  1195. X                }
  1196. X                argv++; argc--;
  1197. X                break;
  1198. X            case 'w':
  1199. X                Options.verbose_worker =
  1200. X                    !Options.verbose_worker;
  1201. X                break;
  1202. X#endif
  1203. X            default:
  1204. X                RLerror(RL_PANIC,"Bad argument: %s\n",argv[0]);
  1205. Xvoid
  1206. XRSOptionsList()
  1207. X    if (Options.totalframes > 1) {
  1208. X        fprintf(Stats.fstats,"Rendering frames %d through %d.\n",
  1209. X            Options.startframe, Options.endframe);
  1210. X    } else {
  1211. X        fprintf(Stats.fstats,"Rendering frame %d.\n", Options.startframe);
  1212. X    fprintf(Stats.fstats,"Screen resolution: %d x %d\n",
  1213. X        Screen.xres,Screen.yres);
  1214. X    fprintf(Stats.fstats,"Image window: (%d - %d), (%d - %d).\n",
  1215. X            Screen.minx, Screen.maxx, Screen.miny, Screen.maxy);
  1216. X    if (Options.jitter)
  1217. X        fprintf(Stats.fstats,"Using jittered sampling, ");
  1218. X    fprintf(Stats.fstats,"Max sampling rate %d %s/pixel.\n",
  1219. X        Options.samples*Options.samples,
  1220. X        Options.samples == 1 ? "sample" : "samples");
  1221. X    fprintf(Stats.fstats,
  1222. X        "Maximum contrast: %g red, %g green, %g blue.\n",
  1223. X        Options.contrast.r, Options.contrast.g,
  1224. X        Options.contrast.b);
  1225. X    fprintf(Stats.fstats,"Maximum ray depth: %d.  Cutoff thresh: %g %g %g.\n",
  1226. X            Options.maxdepth,
  1227. X            Options.cutoff.r, Options.cutoff.g, Options.cutoff.b);
  1228. X    if (Options.stereo == LEFT)
  1229. X        fprintf(Stats.fstats,"Rendering image for left eye.\n");
  1230. X    else if (Options.stereo == RIGHT)
  1231. X        fprintf(Stats.fstats,"Rendering image for right eye.\n");
  1232. X    if (Options.no_shadows) {
  1233. X        fprintf(Stats.fstats,"No shadows are rendered.\n");
  1234. X    } else if (Options.shadowtransp) {
  1235. X        fprintf(Stats.fstats,
  1236. X            "Object opacity affects depth of shadowing.\n");
  1237. X    if (!Options.cache)
  1238. X        fprintf(Stats.fstats,"Shadow caching is disabled.\n");
  1239. X    if (Options.totalframes != 1)
  1240. X        fprintf(Stats.fstats,"Rendering %d frames.\n",
  1241. X            Options.totalframes);
  1242. Xstatic void
  1243. Xusage()
  1244. X    fprintf(stderr,"usage: %s [options] [filename]\n", Options.progname);
  1245. X    fprintf(stderr,"Where options include:\n");
  1246. X    fprintf(stderr,"\t-A frame\t(Begin with given frame #.)\n");
  1247. X#ifdef URT
  1248. X    fprintf(stderr,"\t-a \t\t(Toggle writing of alpha channel.)\n");
  1249. X#endif
  1250. X    fprintf(stderr,"\t-C thresh\t(Set adaptive ray tree cutoff value.)\n");
  1251. X#ifdef URT
  1252. X    fprintf(stderr,"\t-c \t\t(Continue interrupted rendering.)\n");
  1253. X#endif
  1254. X    fprintf(stderr,"\t-D depth\t(Set maximum ray tree depth.)\n");
  1255. X    fprintf(stderr,"\t-E eye_sep\t(Set eye separation in stereo pairs.)\n");
  1256. X#ifdef URT
  1257. X    fprintf(stderr,"\t-e \t\t(Write exponential RLE file.)\n");
  1258. X#endif
  1259. X    fprintf(stderr,"\t-F freq\t\t(Set frequency of status report.)\n");
  1260. X    fprintf(stderr,"\t-G gamma\t(Use given gamma correction exponent.)\n");
  1261. X    fprintf(stderr,"\t-h \t\t(Print this message.)\n");
  1262. X    fprintf(stderr,"\t-l \t\t(Render image for left eye view.)\n");
  1263. X    fprintf(stderr,"\t-N number\t(Render given number of frames.)\n");
  1264. X    fprintf(stderr,"\t-n \t\t(Do not render shadows.)\n");
  1265. X    fprintf(stderr,"\t-O outfile \t(Set output file name.)\n");
  1266. X    fprintf(stderr,"\t-o \t\t(Toggle opacity effect on shadowing.)\n");
  1267. X    fprintf(stderr,"\t-P cpp-args\t(Options to pass to C pre-processor.\n");
  1268. X    fprintf(stderr,"\t-p \t\t(Preview-quality rendering.)\n");
  1269. X    fprintf(stderr,"\t-q \t\t(Run quietly.)\n");
  1270. X    fprintf(stderr,"\t-R xres yres\t(Render at given resolution.)\n");
  1271. X    fprintf(stderr,"\t-r \t\t(Render image for right eye view.)\n");
  1272. X    fprintf(stderr,"\t-S samples\t(Max density of samples^2 samples.)\n");
  1273. X    fprintf(stderr,"\t-s \t\t(Don't cache shadowing information.)\n");
  1274. X    fprintf(stderr,"\t-T r g b\t(Set contrast threshold (0. - 1.).)\n");
  1275. X    fprintf(stderr,"\t-V filename \t(Write verbose output to filename.)\n");
  1276. X    fprintf(stderr,"\t-v \t\t(Verbose output.)\n");
  1277. X#ifdef URT
  1278. X    fprintf(stderr,"\t-W x y x y \t(Render subwindow.)\n");
  1279. X#endif
  1280. X#ifdef LINDA
  1281. X    fprintf(stderr,"\t-X workers\t(Number of workers.)\n");
  1282. X    fprintf(stderr,"\t-w \t\t(Verbose worker output.)\n");
  1283. X#endif
  1284. END_OF_FILE
  1285. if test 8699 -ne `wc -c <'libshade/options.c'`; then
  1286.     echo shar: \"'libshade/options.c'\" unpacked with wrong size!
  1287. # end of 'libshade/options.c'
  1288. echo shar: End of archive 12 \(of 19\).
  1289. cp /dev/null ark12isdone
  1290. MISSING=""
  1291. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
  1292.     if test ! -f ark${I}isdone ; then
  1293.     MISSING="${MISSING} ${I}"
  1294.     fi
  1295. if test "${MISSING}" = "" ; then
  1296.     echo You have unpacked all 19 archives.
  1297.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1298.     echo You still need to unpack the following archives:
  1299.     echo "        " ${MISSING}
  1300. ##  End of shell archive.
  1301. exit 0
  1302. exit 0 # Just in case...
  1303.