home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume21 / rayshade / part07 < prev    next >
Encoding:
Text File  |  1991-07-21  |  53.5 KB  |  2,005 lines

  1. Newsgroups: comp.sources.misc
  2. From: Rayshade Construction Co. <rayshade@weedeater.math.YALE.EDU>
  3. Subject:  v21i010:  rayshade - A raytracing package for UNIX, Part07/19
  4. Message-ID: <1991Jul20.043518.11539@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 891ba98c5797ca603465455588656d8b
  6. Date: Sat, 20 Jul 1991 04:35:18 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: Rayshade Construction Co. <rayshade@weedeater.math.YALE.EDU>
  10. Posting-number: Volume 21, Issue 10
  11. Archive-name: rayshade/part07
  12. Environment: UNIX, !16BIT
  13.  
  14. #! /bin/sh
  15. # This is a shell archive.  Remove anything before this line, then unpack
  16. # it by saving it into a file and typing "sh file".  To overwrite existing
  17. # files, type "sh file -c".  You can also feed this as standard input via
  18. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  19. # will see the following message at the end:
  20. #        "End of archive 7 (of 19)."
  21. # Contents:  Doc/Guide/preface.tex Examples/pool.ray etc/nff2shade.awk
  22. #   libray/libcommon/sampling.c libray/libcommon/vecmath.c
  23. #   libray/liblight/spot.c libray/libobj/box.c libray/libobj/geom.h
  24. #   libray/libobj/intersect.c libray/libsurf/surface.c
  25. #   libshade/lightdef.c libshade/options.h libshade/symtab.c
  26. # Wrapped by kolb@woody on Wed Jul 17 17:56:46 1991
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'Doc/Guide/preface.tex' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'Doc/Guide/preface.tex'\"
  30. else
  31. echo shar: Extracting \"'Doc/Guide/preface.tex'\" \(3168 characters\)
  32. sed "s/^X//" >'Doc/Guide/preface.tex' <<'END_OF_FILE'
  33. X\chapter*{Preface}
  34. X\addcontentsline{toc}{chapter}{Preface}
  35. X
  36. X{\em Rayshade} is a program for creating ray-traced images.
  37. XIt reads a description of a scene to be
  38. Xrendered and produces a color image corresponding to the
  39. Xdescription.
  40. X{\em Rayshade} was designed to make it easy to
  41. Xcreate nice pictures.
  42. XIt was also meant to be flexible, easy to modify,
  43. Xand relatively fast.
  44. X
  45. XThe first version of \rayshade was written in 1987-1998 at
  46. XPrinceton University with help and encouragement from David Dobkin
  47. Xand David Hoffman.  That version was heavily based on a public-domain
  48. X``introductory'' ray tracer written by Roman Kuchkuda.
  49. XChanges to \rayshade from that point until version 4.0 were
  50. Xevolutionary in nature.
  51. XThe current version is to a large extent a re-write,
  52. Xand an attempt has been made to remove some of the fundamental
  53. Xproblems present in previous incarnations.
  54. X
  55. XI wish to thank the many people who have made
  56. Xcontributions to the development of {\em rayshade} during the past four years.
  57. XThanks to Marc Andreessen, Ray Bellis, Dominique Boisvert, William Bouma,
  58. XAllen Braunsdorf, Jeff Butterworth, Nick Carriero, Nancy Everson, Tom Friedel,
  59. XRobert Funchess, David Gelernter, Mike Gigante, Ed Herderick, John Knuston,
  60. XRaphael Manfredi, Lee Moore, Dietmar Saupe, Brian Wyvill,
  61. Xand everybody else for their bug-fixes, suggestions, input files,
  62. Xencouragement, support, and other feedback.
  63. X
  64. XDavid Dobkin first suggested that an extensible
  65. Xray tracer would be a worthwhile project.  Gavin Bell, David
  66. XHoffman, Lefteris Koutsofios, and Steven North
  67. Xwere the first users of the original \rayshade, and their feedback
  68. Xshowed that the project might indeed have a future.
  69. XIn the Fall of 1988,
  70. XPrzemyslaw Prusinkiewicz encouraged me
  71. Xto develop \rayshade further, and was, as always, full of ``insanely
  72. Xgreat'' ideas.  The resulting version of \rayshade was released
  73. Xon UseNet in 1989.  Allan Snider was particularly helpful in
  74. Xfinding bugs in version 3.0 and in making valuable suggestions
  75. Xas to how the program might be improved.
  76. X
  77. X{\em Rashade} version 4.0
  78. Xwas written by Craig Kolb and Rod Bogart during 1990-1991, with contributions
  79. Xof ideas and code made by many others.
  80. XPat Hanrahan's {\em OOGL} provided the spirit, if not the letter, of the
  81. Xmodularity of the version 4.0.  Thanks to Pat and to Mark VandeWettering
  82. Xfor the ``net tracer'' conversations and for the inspiration to do something
  83. Xto clean up {\em rayshade}.
  84. XEric Haines saved the day on more than one occasion by suggesting
  85. Ximprovements, finding bugs, and saying nice things about \rayshade
  86. Xwhen I was all but ready to throw in the towel.
  87. XRobert Skinner was kind enough to provide the {\em Noise()}, {\em DNoise()},
  88. Xand other texturing functions and to allow them to be redistributed.
  89. XMark Podlipec provided the blob object and torus object, which uses
  90. XJochen Schwarze's cubic and quartic root-finding functions.
  91. XMajor Thanks to Rod Bogart for being willing to take the plunge and
  92. Xplay such a large role in the development of version 4.0.
  93. XI am most grateful to Benoit Mandelbrot for his
  94. Xcontinued support and inspiration.
  95. X
  96. X\begin{flushright}
  97. X\parbox[t]{1.5in}{
  98. XC. Kolb \\
  99. XFebruary 13, 1991
  100. X}
  101. X\end{flushright}
  102. END_OF_FILE
  103. if test 3168 -ne `wc -c <'Doc/Guide/preface.tex'`; then
  104.     echo shar: \"'Doc/Guide/preface.tex'\" unpacked with wrong size!
  105. fi
  106. # end of 'Doc/Guide/preface.tex'
  107. fi
  108. if test -f 'Examples/pool.ray' -a "${1}" != "-c" ; then 
  109.   echo shar: Will not clobber existing file \"'Examples/pool.ray'\"
  110. else
  111. echo shar: Extracting \"'Examples/pool.ray'\" \(3791 characters\)
  112. sed "s/^X//" >'Examples/pool.ray' <<'END_OF_FILE'
  113. X/* Converted by rsconvert */
  114. X/*
  115. X * Example rayshade input file
  116. X *
  117. X * pool table from "Reds' Nightmare"
  118. X *
  119. X * C. Kolb 2/88
  120. X *
  121. X * $Id: pool.ray,v 4.0 91/07/17 14:26:36 kolb Exp Locker: kolb $
  122. X *
  123. X * $Log:    pool.ray,v $
  124. X * Revision 4.0  91/07/17  14:26:36  kolb
  125. X * Initial version.
  126. X * 
  127. X */
  128. Xup 0 0 1 
  129. Xfov 45 
  130. Xscreen 512 512 
  131. Xmaxdepth 2 
  132. Xbackground 0 0 0 
  133. Xlight 1.4 point 20 0 66 
  134. Xsurface blacktile 
  135. X    ambient 0.01 0.01 0.01 
  136. X    diffuse 0.01 0.01 0.01 
  137. Xsurface s0 
  138. X    ambient 0.862745 0.862745 0.862745 
  139. X    diffuse 0.039216 0.039216 0.039216 
  140. Xsurface s1 
  141. X        
  142. X    ambient 0.470588 0.156863 0.392157 
  143. X    diffuse 0.470588 0.156863 0.392157 
  144. X    specular 1 1 1
  145. Xsurface s2 
  146. X        
  147. X    ambient 0.117647 0.117647 0.392157 
  148. X    diffuse 0.117647 0.117647 0.392157 
  149. Xsurface s3 
  150. X        
  151. X    ambient 0.784314 0.078431 0.078431 
  152. X    diffuse 0.470588 0.039216 0.039216 
  153. Xsurface s4 
  154. X    ambient 0 0.2235 0.145 
  155. X    diffuse 0 0.2235 0.145 
  156. Xsurface mirror 
  157. X    ambient 0.04 0.04 0.04 
  158. X    diffuse 0.05 0.05 0.05 
  159. X    specular .8 .8 .8
  160. X    specpow 60 
  161. X    reflect 1.
  162. Xsurface s5 
  163. X    ambient 0.196078 0.392157 0.117647 
  164. X    diffuse 0.196078 0.392157 0.117647 
  165. X    specular 0.156863 0.156863 0.156863 
  166. X    specpow 7 
  167. X    reflect 1.
  168. Xsurface s6 
  169. X        
  170. X    ambient 0.588235 0.392157 0.117647 
  171. X    diffuse 0.196078 0.392157 0.117647 
  172. X    specular 0.156863 0.156863 0.156863 
  173. X    specpow 7 
  174. X    reflect 1.
  175. Xsurface s7 
  176. X    ambient 0.196078 0.392157 0.509804 
  177. X    diffuse 0.196078 0.392157 0.117647 
  178. X    specular 0.156863 0.156863 0.156863 
  179. X    specpow 7 
  180. X    reflect 1.
  181. Xsurface s8 
  182. X    ambient 0.980392 0.196078 0.117647 
  183. X    diffuse 0.196078 0.392157 0.117647 
  184. X    specular 0.156863 0.156863 0.156863 
  185. X    specpow 7 
  186. X    reflect 1.
  187. Xsurface s9 
  188. X        
  189. X    ambient 0.196078 0.392157 0.901961 
  190. X    diffuse 0.196078 0 0.117647 
  191. X    specular 0.156863 0.156863 0.156863 
  192. X    specpow 7 
  193. X    reflect 1.
  194. Xsurface s10 
  195. X    ambient 0.411765 0.411765 0.176471 
  196. X    diffuse 0.411765 0.411765 0.176471 
  197. Xsurface floor 
  198. X    ambient 0.1 0.1 0.1 
  199. X    diffuse 0.5 0.5 0.45 
  200. X    specular 0.8 0.8 0.8 
  201. X    specpow 18 
  202. Xsurface s12 
  203. X    ambient 0.313725 0.313725 0.313725 
  204. X    diffuse 0.745098 0.745098 0.745098 
  205. Xsurface s13 
  206. X    ambient 0.078431 0.862745 0.078431 
  207. X    diffuse 0.039216 0.039216 0.039216 
  208. X    specular 0.156863 0.156863 0.156863 
  209. X    specpow 7 
  210. Xsurface s14 
  211. X    ambient 0.784314 0.078431 0.078431 
  212. X    diffuse 0.470588 0.039216 0.039216 
  213. Xsurface s15 
  214. X    ambient 0.392157 0.098039 0.047059 
  215. X    diffuse 0.392157 0.098039 0.047059 
  216. X    specular 0.039216 0.039216 0.039216 
  217. X    specpow 3 
  218. Xsurface s16 
  219. X    ambient 0.509804 0.509804 0.509804 
  220. X    diffuse 0.509804 0.509804 0.509804 
  221. X    specular 0.156863 0.156863 0.156863 
  222. X    specpow 7 
  223. X    reflect 1.
  224. Xsphere s5 1.5 0     -21         1.5 
  225. X    sphere s6 1.5 1.5     -23.598     1.5 
  226. X    sphere s7 1.5 -1.5     -23.598     1.5 
  227. X    sphere s8 1.5 3     -26.1962     1.5 
  228. X    sphere s9 1.5 0     -26.1962     1.5 
  229. X    sphere s5 1.5 -3     -26.1962     1.5 
  230. X    sphere s6 1.5 4.5     -28.7942     1.5 
  231. X    sphere s7 1.5 1.5     -28.7942     1.5 
  232. X    sphere s8 1.5 -1.5     -28.7942     1.5 
  233. X    sphere s9 1.5 -4.5     -28.7942     1.5 
  234. X    sphere s5 1.5 6     -31.3923     1.5 
  235. X    sphere s6 1.5 3     -31.3923     1.5 
  236. X    sphere s7 1.5 0     -31.3923     1.5 
  237. X    sphere s8 1.5 -3     -31.3923     1.5 
  238. X    sphere s9 1.5 -6     -31.3923     1.5 
  239. X
  240. X    box s4 -30 -57 -2 30 57 0 
  241. X    box s15 27 -54 -1.5 33 54 1.5 texture wood scale 15 10 15 
  242. X    box s15 -33 -54 -1.5 -27 54 1.5 texture wood scale 15 10 15 
  243. X    box s15 -33 54 -1.5 33 60 1.5 texture wood scale 10 15 15 
  244. X    box s15 -33 -60 -1.5 33 -54 1.5 texture wood scale 10 15 15 
  245. X    sphere s16 1.5 0 0 0 translate 0 21 1.5 
  246. X    box mirror -11.3333 -144.1 10 31.3333 -143.9 50     /* was 40. -144 30. */
  247. X    /*
  248. X     * Walls
  249. X     */
  250. X    plane s10                     0 -144 0 0 1 0 
  251. X    plane s10                 -180 0 0 1 0 0 
  252. X    plane s10             180 0 0 -1 0 0 
  253. X    plane s10             0 144 0 0 -1 0 
  254. X    /*
  255. X     * Floor
  256. X     */
  257. X    plane floor                 0 0 -30 0 0 1 
  258. X        texture marble scale 6 6 6 rotate 1 0 0 90 
  259. X                translate 0 0 -4.376 
  260. X        texture checker blacktile scale 12.3 12.3 12.3 
  261. X    /*
  262. X     * Ceiling
  263. X     */
  264. X    plane s12         0 0 72 0 0 -1 
  265. X
  266. Xeyep 38 100 43 
  267. Xlookp 0 0 0 
  268. END_OF_FILE
  269. if test 3791 -ne `wc -c <'Examples/pool.ray'`; then
  270.     echo shar: \"'Examples/pool.ray'\" unpacked with wrong size!
  271. fi
  272. # end of 'Examples/pool.ray'
  273. fi
  274. if test -f 'etc/nff2shade.awk' -a "${1}" != "-c" ; then 
  275.   echo shar: Will not clobber existing file \"'etc/nff2shade.awk'\"
  276. else
  277. echo shar: Extracting \"'etc/nff2shade.awk'\" \(3477 characters\)
  278. sed "s/^X//" >'etc/nff2shade.awk' <<'END_OF_FILE'
  279. X#
  280. X# This awk script will convert an NFF-format input file (as output by
  281. X# Eric Haines' SPD) to something rayshade can understand.
  282. X# The World object will be enclosed in a single grid of 22*22*22 voxels.
  283. X#
  284. X# Example usage:
  285. X#    mount | awk -f sped2shade.awk | rayshade > mountains.rle
  286. X#
  287. X# For best results, one should modify the output for all but the tetra
  288. X# and mountain databases to provide a tighter bounding box around the
  289. X# object of interest (tree, gears, etc.).  This is done by moving
  290. X# ground polygons and the like outside of the topmost grid object.
  291. X# This will decrease ray-tracing time dramatically.
  292. X#
  293. X# Note that we have to make sure that the viewing paramters are output
  294. X# outside of the object definition block.  We do this by printing
  295. X# the eye position, etc., at the very end of the output.
  296. X#
  297. XBEGIN{
  298. X    init = 0;
  299. X    lights = 0;
  300. X    print "maxdepth 4"
  301. X    print "sample 1 nojitter"
  302. X    print "cutoff 0."
  303. X    print "report verbose"
  304. X}
  305. Xsubstr($1, 1, 1) == "#" { print "/* " $0 " */"; next;}
  306. X$1 == "v" { next;}
  307. X$1 == "from" { eyex = $2; eyey = $3; eyez = $4; next;}
  308. X$1 == "at" { atx = $2; aty = $3; atz = $4; next;}
  309. X$1 == "up" { upx = $2; upy = $3; upz = $4; next;}
  310. X$1 == "angle" { fov = $2; next;}
  311. X$1 == "hither" {next;}
  312. X$1 == "resolution" {screenx = $2; screeny = $3; next;}
  313. X
  314. X$1 == "l" { lightd[lights] = $2 " "$3 " "$4; lights++; next; }
  315. X$1 == "b" {print "background " $2 " "$3 " "$4; next; }
  316. X$1 == "f" {
  317. X    if (init == 0) {
  318. X        print "grid 22 22 22";
  319. X        init = 1;
  320. X    }
  321. X    printf("applysurf ");
  322. X    if (lights != 0)
  323. X        aintens = sqrt(lights) / (4*lights);
  324. X    else
  325. X        aintens = .1;
  326. X    dr = $2*$5;
  327. X    dg = $3*$5;
  328. X    db = $4*$5;
  329. X# this is a good guess....
  330. X    ar = aintens*dr;
  331. X    ag = aintens*dg;
  332. X    ab = aintens*db;
  333. X    if (ar != 0 || ag != 0 || ab != 0)
  334. X        printf("\tambient %f %f %f\n", ar, ag, ab);
  335. X    if (dr != 0 || dg != 0 || db != 0)
  336. X        printf("\tdiffuse %f %f %f\n", dr, dg, db);
  337. X#
  338. X# This gets a little strange.  We're given a color, Ks, and T.
  339. X# We need a specular color, a specular reflectivity (for reflected
  340. X# rays), and a transparency (for transmitted rays).
  341. X# In rayshade, reflected rays have intensity proportional to
  342. X# specular_color*reflectivity, transmitted proportaional to
  343. X# specular_color*transparency, and specular hilights to
  344. X# specular_color.  Also, Ks + T >1 for some SPDs.
  345. X#
  346. X    if ($6) {
  347. X        sr = $2*$6;
  348. X        sg = $3*$6;
  349. X        sb = $4*$6;
  350. X        printf("\tspecular %f %f %f specpow %f\n", sr, sg, sb, $7);
  351. X    }
  352. X    if ($6 < 1. - $8)
  353. X        printf("\treflect 1.0\n");
  354. X    else
  355. X        printf("\treflect %f\n", 1. - $8);
  356. X
  357. X    if ($8 || $9)
  358. X        printf("\ttransp %f index %f\n", $8, $9);
  359. X    next;
  360. X}
  361. X
  362. X$1 == "c" {
  363. X    getline;
  364. X    x1 = $1;
  365. X    y1 = $2;
  366. X    z1 = $3;
  367. X    br = $4;
  368. X    getline;
  369. X    printf("cone %f %f %f %f %f %f %f %f\n", \
  370. X        br, x1, y1, z1, $4, $1, $2, $3);
  371. X    next;
  372. X}
  373. X$1 == "s" {
  374. X    print "sphere "$5 " "$2 " "$3 " "$4;
  375. X    next;
  376. X}
  377. X$1 == "pp" {
  378. X    if ($2 == 3)
  379. X        print "triangle ";
  380. X    else
  381. X        print "poly ";
  382. X    next;
  383. X}
  384. X$1 == "p" {
  385. X#
  386. X# Polygon -- the vertices will print out in the default statement.
  387. X# If there are three vertices, make it a triangle.
  388. X#
  389. X    if ($2 == 3)
  390. X        print "triangle ";
  391. X    else
  392. X        print "poly ";
  393. X    next;
  394. X}
  395. X{
  396. X# Matched nothing (or is a vertex data) -- print it.
  397. X    print;
  398. X    next;
  399. X}
  400. XEND{
  401. X    print "end"
  402. X#
  403. X# Output light definitions.
  404. X#
  405. X    intens = sqrt(lights) / (lights);
  406. X    for (i = 0; i < lights; i++) {
  407. X        print "light " intens " point " lightd[i]
  408. X    }
  409. X    printf("eyep %g %g %g\n", eyex, eyey, eyez);
  410. X    printf("lookp %g %g %g\n", atx, aty, atz);
  411. X    printf("up %g %g %g\n", upx, upy, upz);
  412. X    printf("fov %g\n", fov);
  413. X    printf("screen %d %d\n", screenx, screeny);
  414. X}
  415. END_OF_FILE
  416. if test 3477 -ne `wc -c <'etc/nff2shade.awk'`; then
  417.     echo shar: \"'etc/nff2shade.awk'\" unpacked with wrong size!
  418. fi
  419. # end of 'etc/nff2shade.awk'
  420. fi
  421. if test -f 'libray/libcommon/sampling.c' -a "${1}" != "-c" ; then 
  422.   echo shar: Will not clobber existing file \"'libray/libcommon/sampling.c'\"
  423. else
  424. echo shar: Extracting \"'libray/libcommon/sampling.c'\" \(3298 characters\)
  425. sed "s/^X//" >'libray/libcommon/sampling.c' <<'END_OF_FILE'
  426. X/*
  427. X * sampling.c
  428. X *
  429. X * Copyright (C) 1989, 1991, Craig E. Kolb, Rod G. Bogart
  430. X * All rights reserved.
  431. X *
  432. X * This software may be freely copied, modified, and redistributed
  433. X * provided that this copyright notice is preserved on all copies.
  434. X *
  435. X * You may not distribute this software, in whole or in part, as part of
  436. X * any commercial product without the express consent of the authors.
  437. X *
  438. X * There is no warranty or other guarantee of fitness of this software
  439. X * for any purpose.  It is provided solely "as is".
  440. X *
  441. X * $Id: sampling.c,v 4.0 91/07/17 14:31:55 kolb Exp Locker: kolb $
  442. X *
  443. X * $Log:    sampling.c,v $
  444. X * Revision 4.0  91/07/17  14:31:55  kolb
  445. X * Initial version.
  446. X * 
  447. X */
  448. X#include "common.h"
  449. X#include "sampling.h"
  450. X
  451. XSampleInfo    Sampling;    /* sampling information */
  452. X
  453. X/*
  454. X * Set sampling options.
  455. X */
  456. Xvoid
  457. XSamplingSetOptions(n, gaussian, width)
  458. Xint n, gaussian;
  459. XFloat width;
  460. X{
  461. X    Float norm, u, v;
  462. X    int x, y;
  463. X
  464. X    Sampling.sidesamples = n;
  465. X    Sampling.totsamples = n*n;
  466. X    Sampling.weight = 1. / (Float)Sampling.totsamples;
  467. X    Sampling.spacing = 1. / (Float)Sampling.sidesamples;
  468. X    Sampling.filterwidth = width;
  469. X    Sampling.filterdelta = Sampling.filterwidth * Sampling.spacing;
  470. X    Sampling.gaussian = gaussian;
  471. X
  472. X    Sampling.filter = (Float **)Malloc(Sampling.sidesamples
  473. X        *sizeof(Float *));
  474. X    for (y = 0; y < Sampling.sidesamples; y++) {
  475. X        Sampling.filter[y] = (Float *)Malloc(Sampling.sidesamples *
  476. X            sizeof(Float));
  477. X    }
  478. X    if (Sampling.gaussian) {
  479. X        norm = 0.;
  480. X        u = -0.5*Sampling.filterwidth + 
  481. X             0.5*Sampling.filterwidth*Sampling.spacing;
  482. X        for (x = 0; x < Sampling.sidesamples; x++) {
  483. X            v = -0.5*Sampling.filterwidth +
  484. X                 0.5*Sampling.filterwidth*Sampling.spacing;
  485. X            for (y = 0; y < Sampling.sidesamples; y++) {
  486. X                Sampling.filter[x][y] = exp(-0.5*(u*u+v*v));
  487. X                norm += Sampling.filter[x][y];
  488. X                v += Sampling.spacing *
  489. X                    Sampling.filterwidth;
  490. X            }
  491. X            u += Sampling.spacing * Sampling.filterwidth;
  492. X        }
  493. X        
  494. X        for (x = 0; x < Sampling.sidesamples; x++)
  495. X            for (y = 0; y < Sampling.sidesamples; y++)
  496. X                Sampling.filter[x][y] /= norm;
  497. X    } else {
  498. X        /* Box filter.  Yawn. */
  499. X        for (x = 0; x < Sampling.sidesamples; x++)
  500. X            for (y = 0; y < Sampling.sidesamples; y++)
  501. X                Sampling.filter[x][y] = Sampling.weight;
  502. X    }
  503. X}
  504. X
  505. X/*
  506. X * Set start time and duration of frame.
  507. X */
  508. Xvoid
  509. XSamplingSetTime(starttime, shutter, frame)
  510. XFloat starttime, shutter;
  511. Xint frame;
  512. X{
  513. X    Sampling.starttime = starttime;
  514. X    Sampling.shutter = shutter;
  515. X    Sampling.framenum = frame;
  516. X    TimeSet(Sampling.starttime);
  517. X    FrameSet((Float)frame);
  518. X}
  519. X
  520. X/*
  521. X * Find a point on a unit circle that is separated from other random
  522. X * points by some jitter spacing.
  523. X *
  524. X * It should do the above, but the temporary hack below just finds a
  525. X * jittered point in a unit square.
  526. X */
  527. Xvoid
  528. XUnitCirclePoint(pnt, sample)
  529. XVector *pnt;
  530. X{
  531. X    /*
  532. X     * This picks a random point on a -1 to 1 square.  The jitter stuff
  533. X     * is correct enough to avoid excessive noise.  An extremely blurry
  534. X     * bright highlight will look squarish, not roundish.  Sorry.
  535. X     */
  536. X    Float jit;
  537. X
  538. X    if (sample >= 0) {
  539. X        jit = 2. * Sampling.spacing;
  540. X
  541. X        pnt->x = nrand()*jit - 1.0 +
  542. X            (sample % Sampling.sidesamples) * jit;
  543. X        pnt->y = nrand()*jit - 1.0 +
  544. X            (sample / Sampling.sidesamples) * jit;
  545. X        pnt->z = 0.0;
  546. X    } else {
  547. X        pnt->x = nrand() * 2.0 - 1.0;
  548. X        pnt->y = nrand() * 2.0 - 1.0;
  549. X        pnt->z = 0.0;
  550. X    }
  551. X}
  552. END_OF_FILE
  553. if test 3298 -ne `wc -c <'libray/libcommon/sampling.c'`; then
  554.     echo shar: \"'libray/libcommon/sampling.c'\" unpacked with wrong size!
  555. fi
  556. # end of 'libray/libcommon/sampling.c'
  557. fi
  558. if test -f 'libray/libcommon/vecmath.c' -a "${1}" != "-c" ; then 
  559.   echo shar: Will not clobber existing file \"'libray/libcommon/vecmath.c'\"
  560. else
  561. echo shar: Extracting \"'libray/libcommon/vecmath.c'\" \(3640 characters\)
  562. sed "s/^X//" >'libray/libcommon/vecmath.c' <<'END_OF_FILE'
  563. X/*
  564. X * vecmath.c
  565. X *
  566. X * Copyright (C) 1989, 1991, Craig E. Kolb
  567. X * All rights reserved.
  568. X *
  569. X * This software may be freely copied, modified, and redistributed
  570. X * provided that this copyright notice is preserved on all copies.
  571. X *
  572. X * You may not distribute this software, in whole or in part, as part of
  573. X * any commercial product without the express consent of the authors.
  574. X *
  575. X * There is no warranty or other guarantee of fitness of this software
  576. X * for any purpose.  It is provided solely "as is".
  577. X *
  578. X * $Id: vecmath.c,v 4.0 91/07/17 14:33:02 kolb Exp Locker: kolb $
  579. X *
  580. X * $Log:    vecmath.c,v $
  581. X * Revision 4.0  91/07/17  14:33:02  kolb
  582. X * Initial version.
  583. X * 
  584. X */
  585. X#include "common.h"
  586. X
  587. X/*
  588. X * Normalize a vector, return original length.
  589. X */
  590. XFloat
  591. XVecNormalize(a)
  592. Xregister Vector *a;
  593. X{
  594. X    Float d;
  595. X
  596. X    d = sqrt(a->x*a->x + a->y*a->y + a->z*a->z);
  597. X    if(d == 0.)
  598. X        return 0.;
  599. X    a->x /= d;
  600. X    a->y /= d;
  601. X    a->z /= d;
  602. X#ifdef CRAY
  603. X    /*
  604. X     * The Cray Research Inc. math functional units don't work in the IEEE
  605. X     * standard way, so when we get here, we just might have an x,y or z
  606. X     * that is not in the range  -1.0 <= J <= 1.0 Yes, I know that that
  607. X     * can't happen, but it does. So since we know we just normalized this
  608. X     * vector, we'll just force x,y and z into the range -1.0 to 1.0 O.K?
  609. X     */
  610. X    if (a->x >= 1.0) a->x = 1.0;
  611. X    else if (a->x <= -1.0) a->x = -1.0;
  612. X    if (a->y >= 1.0) a->y = 1.0;
  613. X    else if (a->y <= -1.0) a->y = -1.0;
  614. X    if (a->z >= 1.0) a->z = 1.0;
  615. X    else if (a->z <= -1.0) a->z = -1.0;
  616. X#endif /* CRAY */
  617. X
  618. X    return d;
  619. X}
  620. X
  621. X/*
  622. X * Compute cross-product of a and b, place normalized result in o.  Returns
  623. X * length of result before normalization.
  624. X */
  625. XFloat
  626. XVecNormCross(a, b, r)
  627. XVector *a, *b, *r;
  628. X{
  629. X    VecCross(a, b, r);
  630. X    return VecNormalize(r);
  631. X}
  632. X
  633. X/*
  634. X * Compute cross-product of a and b, place result in o.
  635. X */
  636. Xvoid
  637. XVecCross(a, b, r)
  638. XVector *a, *b, *r;
  639. X{
  640. X    r->x = (a->y * b->z) - (a->z * b->y);
  641. X    r->y = (a->z * b->x) - (a->x * b->z);
  642. X    r->z = (a->x * b->y) - (a->y * b->x);
  643. X}
  644. X
  645. X/*
  646. X * Calculate direction of refracted ray using Heckbert's formula.  Returns TRUE
  647. X * if a total internal reflection occurs.
  648. X */
  649. Xint
  650. XRefract(dir, from_index, to_index, I, N, cos1)
  651. XFloat from_index, to_index, cos1;
  652. XVector *dir, *I, *N;
  653. X{
  654. X    Float kn, cos2, k;
  655. X    Vector nrm;
  656. X
  657. X    if (cos1 < 0.) {
  658. X        /*
  659. X         * Hit the 'backside' of a surface -- flip the normal.
  660. X         */
  661. X        nrm.x = -N->x;
  662. X        nrm.y = -N->y;
  663. X        nrm.z = -N->z;
  664. X        cos1 = -cos1;
  665. X    } else
  666. X        nrm = *N;
  667. X
  668. X    kn = from_index / to_index;
  669. X    cos2 = 1. - kn*kn*(1. - cos1*cos1);
  670. X    if (cos2 < 0.)
  671. X        return TRUE;        /* Total internal reflection. */
  672. X    k = kn * cos1 - sqrt(cos2);
  673. X    VecComb(kn, *I, k, nrm, dir);
  674. X    return FALSE;
  675. X}
  676. X
  677. X/*
  678. X * Given a vector, find two additional vectors such that all three
  679. X * are mutually perpendicular and uaxis X vaxis = vector.  The given
  680. X * vector need not be normalized. uaxis and vaxis are normalized.
  681. X */
  682. Xvoid
  683. XVecCoordSys(vector, uaxis, vaxis)
  684. XVector *vector, *uaxis, *vaxis;
  685. X{
  686. X    uaxis->x = -vector->y;
  687. X    uaxis->y = vector->x;
  688. X    uaxis->z = 0.;
  689. X    if (VecNormalize(uaxis) == 0.) {
  690. X        uaxis->x = vector->z;
  691. X        uaxis->y = 0.;
  692. X        uaxis->z = -vector->x;
  693. X        if (VecNormalize(uaxis) == 0.)
  694. X            RLerror(RL_WARN,
  695. X                "VecCoordSys passed degenerate vector.\n");
  696. X    }
  697. X    (void)VecNormCross(vector, uaxis, vaxis);
  698. X}
  699. X
  700. X/*
  701. X * Modify given normal by "bumping" it.
  702. X */
  703. Xvoid
  704. XMakeBump(norm, dpdu, dpdv, fu, fv)
  705. XVector *norm, *dpdu, *dpdv;    /* normal, surface derivatives */
  706. XFloat fu, fv;            /* bump function partial derivatives in uv */
  707. X{
  708. X    Vector tmp1, tmp2;
  709. X
  710. X    VecCross(norm, dpdv, &tmp1);
  711. X    VecScale(fu, tmp1, &tmp1);
  712. X    VecCross(norm, dpdu, &tmp2);
  713. X    VecScale(fv, tmp2, &tmp2);
  714. X    VecSub(tmp1, tmp2, &tmp1);
  715. X    VecAdd(*norm, tmp1, norm);
  716. X    (void)VecNormalize(norm);
  717. X}
  718. END_OF_FILE
  719. if test 3640 -ne `wc -c <'libray/libcommon/vecmath.c'`; then
  720.     echo shar: \"'libray/libcommon/vecmath.c'\" unpacked with wrong size!
  721. fi
  722. # end of 'libray/libcommon/vecmath.c'
  723. fi
  724. if test -f 'libray/liblight/spot.c' -a "${1}" != "-c" ; then 
  725.   echo shar: Will not clobber existing file \"'libray/liblight/spot.c'\"
  726. else
  727. echo shar: Extracting \"'libray/liblight/spot.c'\" \(3312 characters\)
  728. sed "s/^X//" >'libray/liblight/spot.c' <<'END_OF_FILE'
  729. X/*
  730. X * spot.c
  731. X *
  732. X * Copyright (C) 1989, 1991, Craig E. Kolb
  733. X * All rights reserved.
  734. X *
  735. X * This software may be freely copied, modified, and redistributed
  736. X * provided that this copyright notice is preserved on all copies.
  737. X *
  738. X * You may not distribute this software, in whole or in part, as part of
  739. X * any commercial product without the express consent of the authors.
  740. X *
  741. X * There is no warranty or other guarantee of fitness of this software
  742. X * for any purpose.  It is provided solely "as is".
  743. X *
  744. X * $Id: spot.c,v 4.0 91/07/17 14:35:42 kolb Exp Locker: kolb $
  745. X *
  746. X * $Log:    spot.c,v $
  747. X * Revision 4.0  91/07/17  14:35:42  kolb
  748. X * Initial version.
  749. X * 
  750. X */
  751. X#include "light.h"
  752. X#include "spot.h"
  753. X
  754. Xstatic LightMethods *iSpotMethods = NULL;
  755. X
  756. XSpotlight *
  757. XSpotCreate(from, to, coef, in, out)
  758. XVector *from, *to;
  759. XFloat coef, in, out;
  760. X{
  761. X    Spotlight *spot;
  762. X
  763. X    spot = (Spotlight *)share_malloc(sizeof(Spotlight));
  764. X    spot->pos = *from;
  765. X    VecSub(*to, *from, &spot->dir);
  766. X    if (VecNormalize(&spot->dir) == 0. || in > out) {
  767. X        RLerror(RL_ABORT,"Invalid spotlight specification.\n");
  768. X        return (Spotlight *)NULL;
  769. X    }
  770. X    spot->coef = coef;
  771. X    spot->radius = cos(deg2rad(in));
  772. X    spot->falloff = cos(deg2rad(out));
  773. X
  774. X    return spot;
  775. X}
  776. X
  777. XLightMethods *
  778. XSpotMethods()
  779. X{
  780. X    if (iSpotMethods == (LightMethods *)NULL) {
  781. X        iSpotMethods = LightMethodsCreate();
  782. X        iSpotMethods->intens = SpotIntens;
  783. X        iSpotMethods->dir = SpotDirection;
  784. X    }
  785. X    return iSpotMethods;
  786. X}
  787. X
  788. X/*
  789. X * Calculate intensity ('color') of light reaching 'pos' from light 'lp'.
  790. X * The spotlight is 'dist' units from 'pos' along 'dir'.
  791. X *
  792. X * Returns TRUE if non-zero illumination, FALSE otherwise.
  793. X */
  794. Xint
  795. XSpotIntens(spot, lcolor, cache, ray, dist, noshadow, color)
  796. XSpotlight *spot;
  797. XShadowCache *cache;
  798. XRay *ray;
  799. XColor *lcolor, *color;
  800. Xint noshadow;
  801. XFloat dist;
  802. X{
  803. X    Float atten;
  804. X    extern Float SpotAtten();
  805. X
  806. X    /*
  807. X     * Compute spotlight color
  808. X     */
  809. X    atten = SpotAtten(spot, &ray->dir);
  810. X    /*
  811. X     * If outside of spot, return FALSE.
  812. X     */
  813. X    if (atten == 0.)
  814. X        return FALSE;
  815. X    if (Shadowed(color, lcolor, cache, ray, dist, noshadow))
  816. X        return FALSE;
  817. X    ColorScale(atten, *color, color);
  818. X    return TRUE;
  819. X}
  820. X
  821. X/*
  822. X * Compute intensity of spotlight along 'dir'.
  823. X */
  824. XFloat
  825. XSpotAtten(lp, dir)
  826. XSpotlight *lp;
  827. XVector *dir;
  828. X{
  829. X    Float costheta, atten;
  830. X    extern Float rampup();
  831. X
  832. X    costheta = -dotp(dir, &lp->dir);
  833. X    /*
  834. X     * Behind spotlight.
  835. X     */
  836. X    if (costheta <= 0.)
  837. X        return 0.;
  838. X    /*
  839. X     * Intensity is the product of costheta raised to lp->coef and
  840. X     * a function that smoothly interpolates from 0 at
  841. X     * costheta=lp->falloff to 1 at costheta=lp->radius.
  842. X     */
  843. X    atten = pow(costheta, lp->coef);
  844. X    if (lp->radius > 0.)
  845. X        atten *= rampup(lp->falloff, lp->radius, costheta);
  846. X    return atten;
  847. X}
  848. X
  849. X/*
  850. X * Cubic interpolation between 0 at left and 1 at right, sampled at 'at'
  851. X * It is assumed that right >= left.
  852. X */
  853. XFloat
  854. Xrampup(left, right, at)
  855. XFloat left, right, at;
  856. X{
  857. X    if (at < left)
  858. X        return 0.;
  859. X    else if (at > right)
  860. X        return 1.;
  861. X
  862. X    if (right == left)
  863. X        return 0.;
  864. X
  865. X    at = (at - left) / (right - left);
  866. X    return (3 - 2*at)*at*at;
  867. X}
  868. X
  869. Xvoid
  870. XSpotDirection(lp, pos, dir, dist)
  871. XSpotlight *lp;
  872. XVector *pos, *dir;
  873. XFloat *dist;
  874. X{
  875. X    /*
  876. X     * Calculate dir from position to center of light source.
  877. X     */
  878. X    VecSub(lp->pos, *pos, dir);
  879. X    *dist = VecNormalize(dir);
  880. X}
  881. X
  882. XSpotMethodRegister(meth)
  883. XUserMethodType meth;
  884. X{
  885. X    if (iSpotMethods)
  886. X        iSpotMethods->user = meth;
  887. X}
  888. END_OF_FILE
  889. if test 3312 -ne `wc -c <'libray/liblight/spot.c'`; then
  890.     echo shar: \"'libray/liblight/spot.c'\" unpacked with wrong size!
  891. fi
  892. # end of 'libray/liblight/spot.c'
  893. fi
  894. if test -f 'libray/libobj/box.c' -a "${1}" != "-c" ; then 
  895.   echo shar: Will not clobber existing file \"'libray/libobj/box.c'\"
  896. else
  897. echo shar: Extracting \"'libray/libobj/box.c'\" \(3201 characters\)
  898. sed "s/^X//" >'libray/libobj/box.c' <<'END_OF_FILE'
  899. X/*
  900. X * box.c
  901. X *
  902. X * Copyright (C) 1989, 1991, Craig E. Kolb
  903. X * All rights reserved.
  904. X *
  905. X * This software may be freely copied, modified, and redistributed
  906. X * provided that this copyright notice is preserved on all copies.
  907. X *
  908. X * You may not distribute this software, in whole or in part, as part of
  909. X * any commercial product without the express consent of the authors.
  910. X *
  911. X * There is no warranty or other guarantee of fitness of this software
  912. X * for any purpose.  It is provided solely "as is".
  913. X *
  914. X * $Id: box.c,v 4.0 91/07/17 14:36:32 kolb Exp Locker: kolb $
  915. X *
  916. X * $Log:    box.c,v $
  917. X * Revision 4.0  91/07/17  14:36:32  kolb
  918. X * Initial version.
  919. X * 
  920. X */
  921. X#include "geom.h"
  922. X#include "box.h"
  923. X
  924. Xstatic Methods *iBoxMethods = NULL;
  925. Xstatic char boxName[] = "box";
  926. X
  927. Xunsigned long BoxTests, BoxHits;
  928. X
  929. XBox *
  930. XBoxCreate(v1, v2)
  931. XVector *v1, *v2;
  932. X{
  933. X    Box *box;
  934. X    Vector size;
  935. X
  936. X    VecSub(*v1, *v2, &size);
  937. X
  938. X    if (equal(size.x, 0.) || equal(size.y, 0.) || equal(size.z, 0.)) {
  939. X        RLerror(RL_WARN, "Degenerate box.\n");
  940. X        return (Box *)NULL;
  941. X    }
  942. X
  943. X    box = (Box *)share_malloc(sizeof(Box));
  944. X    box->bounds[LOW][X] = min(v1->x, v2->x);
  945. X    box->bounds[HIGH][X] = max(v1->x, v2->x);
  946. X    box->bounds[LOW][Y] = min(v1->y, v2->y);
  947. X    box->bounds[HIGH][Y] = max(v1->y, v2->y);
  948. X    box->bounds[LOW][Z] = min(v1->z, v2->z);
  949. X    box->bounds[HIGH][Z] = max(v1->z, v2->z);
  950. X    return box;
  951. X}
  952. X
  953. XMethods *
  954. XBoxMethods()
  955. X{
  956. X    if (iBoxMethods == (Methods *)NULL) {
  957. X        iBoxMethods = MethodsCreate();
  958. X        iBoxMethods->create = (GeomCreateFunc *)BoxCreate;
  959. X        iBoxMethods->methods = BoxMethods;
  960. X        iBoxMethods->name = BoxName;
  961. X        iBoxMethods->intersect = BoxIntersect;
  962. X        iBoxMethods->normal = BoxNormal;
  963. X        iBoxMethods->enter = BoxEnter;
  964. X        iBoxMethods->bounds = BoxBounds;
  965. X        iBoxMethods->stats = BoxStats;
  966. X        iBoxMethods->checkbounds = FALSE;
  967. X        iBoxMethods->closed = TRUE;
  968. X    }
  969. X    return iBoxMethods;
  970. X}
  971. X
  972. Xint
  973. XBoxIntersect(box, ray, mindist, maxdist)
  974. XBox *box;
  975. XRay *ray;
  976. XFloat mindist, *maxdist;
  977. X{
  978. X    BoxTests++;
  979. X    if (BoundsIntersect(ray, box->bounds, mindist, maxdist)) {
  980. X        BoxHits++;
  981. X        return TRUE;
  982. X    }
  983. X    return FALSE;
  984. X}
  985. X
  986. Xint
  987. XBoxNormal(box, pos, nrm, gnrm)
  988. XVector *pos, *nrm, *gnrm;    /* point of intersection */
  989. XBox *box;
  990. X{
  991. X    nrm->x = nrm->y = nrm->z = 0.;
  992. X
  993. X    if (equal(pos->x, box->bounds[HIGH][X]))
  994. X        nrm->x = 1.;
  995. X    else if (equal(pos->x, box->bounds[LOW][X]))
  996. X        nrm->x = -1.;
  997. X    else if (equal(pos->y, box->bounds[HIGH][Y]))
  998. X        nrm->y = 1.;
  999. X    else if (equal(pos->y, box->bounds[LOW][Y]))
  1000. X        nrm->y = -1.;
  1001. X    else if (equal(pos->z, box->bounds[HIGH][Z]))
  1002. X        nrm->z = 1.;
  1003. X    else if (equal(pos->z, box->bounds[LOW][Z]))
  1004. X        nrm->z = -1.;
  1005. X    else
  1006. X        RLerror(RL_WARN, "Confusion in nrmbox!\n");
  1007. X    *gnrm = *nrm;
  1008. X    return FALSE;
  1009. X}
  1010. X
  1011. X/*
  1012. X * Determine if ray enters (TRUE) or leaves (FALSE) box at pos
  1013. X */
  1014. Xint
  1015. XBoxEnter(box, ray, mind, hitd)
  1016. XBox *box;
  1017. XRay *ray;
  1018. XFloat mind, hitd;
  1019. X{
  1020. X    Vector pos;
  1021. X
  1022. X    VecAddScaled(ray->pos, mind, ray->dir, &pos);
  1023. X    return OutOfBounds(&pos, box->bounds);
  1024. X}
  1025. X
  1026. Xvoid
  1027. XBoxBounds(box, bounds)
  1028. XBox *box;
  1029. XFloat bounds[2][3];
  1030. X{
  1031. X    BoundsCopy(box->bounds, bounds);
  1032. X}
  1033. X
  1034. Xchar *
  1035. XBoxName()
  1036. X{
  1037. X    return boxName;
  1038. X}
  1039. X
  1040. Xvoid
  1041. XBoxStats(tests, hits)
  1042. Xunsigned long *tests, *hits;
  1043. X{
  1044. X    *tests = BoxTests;
  1045. X    *hits = BoxHits;
  1046. X}
  1047. X
  1048. Xvoid
  1049. XBoxMethodRegister(meth)
  1050. XUserMethodType meth;
  1051. X{
  1052. X    if (iBoxMethods)
  1053. X        iBoxMethods->user = meth;
  1054. X}
  1055. END_OF_FILE
  1056. if test 3201 -ne `wc -c <'libray/libobj/box.c'`; then
  1057.     echo shar: \"'libray/libobj/box.c'\" unpacked with wrong size!
  1058. fi
  1059. # end of 'libray/libobj/box.c'
  1060. fi
  1061. if test -f 'libray/libobj/geom.h' -a "${1}" != "-c" ; then 
  1062.   echo shar: Will not clobber existing file \"'libray/libobj/geom.h'\"
  1063. else
  1064. echo shar: Extracting \"'libray/libobj/geom.h'\" \(3949 characters\)
  1065. sed "s/^X//" >'libray/libobj/geom.h' <<'END_OF_FILE'
  1066. X/*
  1067. X * geom.h
  1068. X *
  1069. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1070. X * All rights reserved.
  1071. X *
  1072. X * This software may be freely copied, modified, and redistributed
  1073. X * provided that this copyright notice is preserved on all copies.
  1074. X *
  1075. X * You may not distribute this software, in whole or in part, as part of
  1076. X * any commercial product without the express consent of the authors.
  1077. X *
  1078. X * There is no warranty or other guarantee of fitness of this software
  1079. X * for any purpose.  It is provided solely "as is".
  1080. X *
  1081. X * $Id: geom.h,v 4.0 91/07/17 14:37:52 kolb Exp Locker: kolb $
  1082. X *
  1083. X * $Log:    geom.h,v $
  1084. X * Revision 4.0  91/07/17  14:37:52  kolb
  1085. X * Initial version.
  1086. X * 
  1087. X */
  1088. X#ifndef OBJECT_H
  1089. X#define OBJECT_H
  1090. X
  1091. X#include "libcommon/common.h"
  1092. X#include "libcommon/transform.h"
  1093. X#include "bounds.h"
  1094. X
  1095. X/*
  1096. X * Constants for enter flag in HitNode.
  1097. X */
  1098. X#define EXITING        1
  1099. X#define ENTERING    2
  1100. X
  1101. X#define MAXMODELDEPTH    128        /* Maximum height of DAG. */
  1102. X
  1103. Xtypedef char * GeomRef;
  1104. Xtypedef GeomRef GeomCreateFunc();
  1105. X
  1106. X/*
  1107. X * If the object has a normal method, it's a primitive
  1108. X * otherwise it's an aggregate (or an instance)
  1109. X */
  1110. X#define IsAggregate(o)        ((o)->methods->normal == NULL)
  1111. X
  1112. X/*
  1113. X * Geom methods.
  1114. X * (p) means applies only to primitive objects
  1115. X * (a) means applies only to aggregate objects
  1116. X */
  1117. Xtypedef struct Methods {
  1118. X    char        *(*name)();        /* Geom name */
  1119. X    GeomRef        (*create)();        /* Create and return ref */
  1120. X    int        (*intersect)(),        /* Ray/obj intersection */
  1121. X            (*normal)(),        /* Geom normal (p) */
  1122. X            (*enter)(),        /* Ray enter or exit? (p) */
  1123. X            (*convert)();        /* Convert from list (a) */
  1124. X    void        (*uv)(),        /* 2D mapping (p) */
  1125. X            (*stats)(),        /* Statistics */
  1126. X            (*bounds)(),        /* Bounding volume */
  1127. X            (*user)();        /* User-defined method */
  1128. X    struct Methods    *(*methods)();        /* object methods func. */
  1129. X    char        checkbounds,        /* check bbox before int.? */
  1130. X            closed;            /* properly closed? */
  1131. X} Methods;
  1132. X
  1133. Xtypedef void (*UserMethodType)();
  1134. X
  1135. X/*
  1136. X * Geom definition
  1137. X */
  1138. Xtypedef struct Geom {
  1139. X    char *name;            /* Geom name, if any. */
  1140. X    GeomRef obj;            /* Pointer to object info. */
  1141. X    Methods *methods;
  1142. X    unsigned long prims;        /* sum of # primitive objects */
  1143. X    Float bounds[2][3];        /* Bounding box */
  1144. X    Float timenow;            /* Geom's idea of what time it is */
  1145. X    short int animtrans;        /* transformation is animated */
  1146. X    short int frame;        /* frame for which obj is inited */
  1147. X    struct Surface *surf;        /* surface, if any */
  1148. X    struct Trans *trans;        /* Transformation information */
  1149. X    struct Trans *transtail;    /* Double linked list end */
  1150. X    struct Texture *texture;    /* Texture mapping info. */
  1151. X#ifdef SHAREDMEM
  1152. X    unsigned long *counter;        /* Geoms are shared, counters aren't */
  1153. X#else
  1154. X    unsigned long counter;        /* "mailbox" for grid intersection */
  1155. X#endif
  1156. X    struct Geom *next;        /* Next object. */
  1157. X} Geom;
  1158. X
  1159. X/*
  1160. X * Linked list of pointers to objects.
  1161. X */
  1162. Xtypedef struct GeomList {
  1163. X    Geom *obj;
  1164. X    struct GeomList *next;
  1165. X} GeomList;
  1166. X
  1167. X/*
  1168. X * Array of hit information.  Stores a path through an object DAG,
  1169. X * as well as the ray in 'model' (object) space and the distance from
  1170. X * the ray origin to the point of intersection.
  1171. X */
  1172. Xtypedef struct HitNode {
  1173. X    Geom *obj;            /* Geom hit */
  1174. X    Ray    ray;            /* Ray */
  1175. X    Float    mindist;        /* Amount of ray to ignore */
  1176. X    Float    dist;            /* Distance from ray origin to hit */
  1177. X    short    enter,            /* Enter (TRUE) or Leave (FALSE) obj */
  1178. X        dotrans;        /* transformations non-identity? */
  1179. X    Trans    trans;            /* parent-->obj and inverse trans */
  1180. X} HitNode;
  1181. X
  1182. X/*
  1183. X * Structure holding a list of HitNodes.  A maximum of MAXMODELDEPTH
  1184. X * nodes can be referenced.
  1185. X */
  1186. Xtypedef struct HitList {
  1187. X    int nodes;
  1188. X    HitNode data[MAXMODELDEPTH];
  1189. X} HitList;
  1190. X
  1191. Xextern char    *GeomName();
  1192. X
  1193. Xextern Geom    *GeomCreate(), *GeomCopy(), *GeomCopyNamed(),
  1194. X        *GeomComputeAggregateBounds();
  1195. X
  1196. X
  1197. Xextern GeomList    *GeomStackPush(), *GeomStackPop();
  1198. X
  1199. Xextern void     PrimUV(), AggregatePrintInfo(),
  1200. X        IntersectStats();
  1201. X
  1202. Xextern int    AggregateConvert(), PrimNormal(),
  1203. X        TraceRay();    /* application-provided */
  1204. X
  1205. Xextern Methods    *MethodsCreate();
  1206. X
  1207. X#endif /* OBJECT_H */
  1208. END_OF_FILE
  1209. if test 3949 -ne `wc -c <'libray/libobj/geom.h'`; then
  1210.     echo shar: \"'libray/libobj/geom.h'\" unpacked with wrong size!
  1211. fi
  1212. # end of 'libray/libobj/geom.h'
  1213. fi
  1214. if test -f 'libray/libobj/intersect.c' -a "${1}" != "-c" ; then 
  1215.   echo shar: Will not clobber existing file \"'libray/libobj/intersect.c'\"
  1216. else
  1217. echo shar: Extracting \"'libray/libobj/intersect.c'\" \(3980 characters\)
  1218. sed "s/^X//" >'libray/libobj/intersect.c' <<'END_OF_FILE'
  1219. X/*
  1220. X * intersect.c
  1221. X *
  1222. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1223. X * All rights reserved.
  1224. X *
  1225. X * This software may be freely copied, modified, and redistributed
  1226. X * provided that this copyright notice is preserved on all copies.
  1227. X *
  1228. X * You may not distribute this software, in whole or in part, as part of
  1229. X * any commercial product without the express consent of the authors.
  1230. X *
  1231. X * There is no warranty or other guarantee of fitness of this software
  1232. X * for any purpose.  It is provided solely "as is".
  1233. X *
  1234. X * $Id: intersect.c,v 4.0 91/07/17 14:38:37 kolb Exp Locker: kolb $
  1235. X *
  1236. X * $Log:    intersect.c,v $
  1237. X * Revision 4.0  91/07/17  14:38:37  kolb
  1238. X * Initial version.
  1239. X * 
  1240. X */
  1241. X#include "geom.h"
  1242. X
  1243. Xstatic void AddToHitList();
  1244. X/*
  1245. X * Number of bounding volume tests.
  1246. X * External modules have read access via IntersectStats().
  1247. X */
  1248. Xstatic unsigned long BVTests;
  1249. X
  1250. X/*
  1251. X * Intersect object & ray.  Return distance from "pos" along "ray" to
  1252. X * intersection point.  Return value <= 0 indicates no intersection.
  1253. X */
  1254. Xint
  1255. Xintersect(obj, ray, hitlist, mindist, maxdist)
  1256. XGeom *obj;                /* Geom to be tested. */
  1257. XRay *ray;                /* Ray origin, direction. */
  1258. XHitList *hitlist;            /* Intersection path */
  1259. XFloat mindist, *maxdist;
  1260. X{
  1261. X    Ray newray;
  1262. X    Vector vtmp;
  1263. X    Trans *curtrans;    
  1264. X    Float distfact, nmindist, nmaxdist;
  1265. X
  1266. X    /*
  1267. X     * Check ray/bounding volume intersection, if required.
  1268. X     */
  1269. X    if (obj->methods->checkbounds) {
  1270. X        VecAddScaled(ray->pos, mindist, ray->dir, &vtmp);
  1271. X        if (OutOfBounds(&vtmp, obj->bounds)) {
  1272. X            nmaxdist = *maxdist;
  1273. X            BVTests++;
  1274. X            if (!BoundsIntersect(ray, obj->bounds, mindist,
  1275. X                            &nmaxdist))
  1276. X                return FALSE;
  1277. X        }
  1278. X    }
  1279. X
  1280. X    newray = *ray;
  1281. X    nmindist = mindist;
  1282. X    nmaxdist = *maxdist;
  1283. X
  1284. X    /*
  1285. X     * Transform the ray if necessary.
  1286. X     */
  1287. X    if (obj->trans != (Trans *)0) {
  1288. X        /*
  1289. X         * If object's idea of the current time is wrong,
  1290. X         * update the transformations.
  1291. X         */
  1292. X        if (obj->animtrans && !equal(obj->timenow, ray->time)) {
  1293. X            TransResolveAssoc(obj->trans);
  1294. X        }
  1295. X                
  1296. X        /*
  1297. X         * Transforming the ray can change the distance between
  1298. X         * the ray origin and the point of intersection.
  1299. X         * We save the amount the ray is "stretched" and later
  1300. X         * divide the computed distance by this amount.
  1301. X         */
  1302. X        distfact = 1.;
  1303. X        for (curtrans = obj->transtail; curtrans; 
  1304. X             curtrans = curtrans->prev)
  1305. X            distfact *= RayTransform(&newray, &curtrans->itrans);
  1306. X        nmindist *= distfact;
  1307. X        nmaxdist *= distfact;
  1308. X    }
  1309. X    /*
  1310. X     * Geom has been updated to current time.
  1311. X     */
  1312. X    obj->timenow = ray->time;
  1313. X
  1314. X    /*
  1315. X     * Call correct intersection routine.
  1316. X     */
  1317. X    if (IsAggregate(obj)) {
  1318. X        /*
  1319. X         * Aggregate
  1320. X         */
  1321. X        if (!(*obj->methods->intersect)
  1322. X             (obj->obj, &newray, hitlist, nmindist, &nmaxdist))
  1323. X        return FALSE;
  1324. X    } else {
  1325. X        /*
  1326. X         * Primitive
  1327. X         */
  1328. X        if (!(*obj->methods->intersect)
  1329. X              (obj->obj, &newray, nmindist, &nmaxdist))
  1330. X            return FALSE;
  1331. X        hitlist->nodes = 0;
  1332. X    }
  1333. X
  1334. X    /*
  1335. X     * Had a hit -- add ray, distance and object to tail of hitlist.
  1336. X     */
  1337. X    AddToHitList(hitlist, &newray, nmindist, nmaxdist, obj);
  1338. X
  1339. X    /*
  1340. X     * Set dist to distance to intersection point from the origin
  1341. X     * of the untransformed ray.
  1342. X     */
  1343. X    if (obj->trans != (Trans *)0)
  1344. X        *maxdist = nmaxdist / distfact;
  1345. X    else
  1346. X        *maxdist = nmaxdist;
  1347. X
  1348. X    return TRUE;
  1349. X}
  1350. X
  1351. Xstatic void
  1352. XAddToHitList(hitlist, ray, mind, dist, obj)
  1353. XHitList *hitlist;
  1354. XRay *ray;
  1355. XFloat mind, dist;
  1356. XGeom *obj;
  1357. X{
  1358. X    HitNode *np;
  1359. X    Trans *list;
  1360. X
  1361. X    np = &hitlist->data[hitlist->nodes++];
  1362. X
  1363. X    np->ray = *ray;
  1364. X    np->obj = obj;
  1365. X    np->mindist = mind;
  1366. X    np->dist = dist;
  1367. X    np->enter = 0;
  1368. X
  1369. X    if (obj->trans) {
  1370. X        /*
  1371. X         * Compute total transformation, forward and inverse,
  1372. X         * for this object, and store in hitlist for use later.
  1373. X         */
  1374. X        TransCopy(obj->trans, &np->trans);
  1375. X        for (list = obj->trans->next; list; list = list->next)
  1376. X            TransCompose(&np->trans, list, &np->trans);
  1377. X        np->dotrans = TRUE;
  1378. X    } else
  1379. X        np->dotrans = FALSE;
  1380. X}
  1381. X
  1382. X/*
  1383. X * Return intersection statistics.
  1384. X * Currently, this is limited to the # of bounding volume test performed.
  1385. X */
  1386. Xvoid
  1387. XIntersectStats(bvtests)
  1388. Xunsigned long *bvtests;
  1389. X{
  1390. X    *bvtests = BVTests;
  1391. X}
  1392. END_OF_FILE
  1393. if test 3980 -ne `wc -c <'libray/libobj/intersect.c'`; then
  1394.     echo shar: \"'libray/libobj/intersect.c'\" unpacked with wrong size!
  1395. fi
  1396. # end of 'libray/libobj/intersect.c'
  1397. fi
  1398. if test -f 'libray/libsurf/surface.c' -a "${1}" != "-c" ; then 
  1399.   echo shar: Will not clobber existing file \"'libray/libsurf/surface.c'\"
  1400. else
  1401. echo shar: Extracting \"'libray/libsurf/surface.c'\" \(3304 characters\)
  1402. sed "s/^X//" >'libray/libsurf/surface.c' <<'END_OF_FILE'
  1403. X/*
  1404. X * surface.c
  1405. X *
  1406. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1407. X * All rights reserved.
  1408. X *
  1409. X * This software may be freely copied, modified, and redistributed
  1410. X * provided that this copyright notice is preserved on all copies.
  1411. X *
  1412. X * You may not distribute this software, in whole or in part, as part of
  1413. X * any commercial product without the express consent of the authors.
  1414. X *
  1415. X * There is no warranty or other guarantee of fitness of this software
  1416. X * for any purpose.  It is provided solely "as is".
  1417. X *
  1418. X * $Id: surface.c,v 4.0 91/07/17 14:40:55 kolb Exp Locker: kolb $
  1419. X *
  1420. X * $Log:    surface.c,v $
  1421. X * Revision 4.0  91/07/17  14:40:55  kolb
  1422. X * Initial version.
  1423. X * 
  1424. X */
  1425. X#include "atmosphere.h"
  1426. X#include "surface.h"
  1427. X
  1428. X#define blend(a, b, p, q)    (a * p + b * q)
  1429. X
  1430. XColor    Black = {0., 0., 0.},
  1431. X    White = {1., 1., 1.};
  1432. X
  1433. X/*
  1434. X * Create and return pointer to surface with given properties.
  1435. X */
  1436. XSurface *
  1437. XSurfaceCreate()
  1438. X{
  1439. X    Surface *stmp;
  1440. X
  1441. X    stmp = (Surface *)Malloc(sizeof(Surface));
  1442. X
  1443. X    stmp->amb = stmp->diff = stmp->spec =
  1444. X        stmp->translu = Black;
  1445. X
  1446. X    stmp->body = White;
  1447. X
  1448. X    stmp->srexp = stmp->stexp = DEFAULT_PHONGPOW;
  1449. X    stmp->statten = 1.;    /* No attenuation by default */
  1450. X
  1451. X    stmp->reflect = stmp->transp = 0.;
  1452. X
  1453. X    stmp->noshadow = FALSE;
  1454. X
  1455. X    stmp->index = DEFAULT_INDEX;
  1456. X
  1457. X    stmp->name = (char *)NULL;
  1458. X    stmp->next = (Surface *)NULL;
  1459. X
  1460. X    return stmp;
  1461. X}
  1462. X
  1463. XSurface *
  1464. XSurfaceCopy(surf)
  1465. XSurface *surf;
  1466. X{
  1467. X    Surface *res;
  1468. X
  1469. X    if (!surf)
  1470. X        return (Surface *)NULL;
  1471. X
  1472. X    res = SurfaceCreate();
  1473. X    *res = *surf;
  1474. X    res->next = (Surface *)NULL;
  1475. X    res->name = (char *)NULL;
  1476. X    return res;
  1477. X}
  1478. X
  1479. X/*
  1480. X * Compute combination of two surfaces. Resulting surface is copied into surf1.
  1481. X */
  1482. Xvoid
  1483. XSurfaceBlend(surf1, surf2, p, q)
  1484. XSurface *surf1, *surf2;
  1485. XFloat p, q;
  1486. X{
  1487. X    /*
  1488. X      * P is weight of surf1.  q is weight of surf2.
  1489. X     * Result is placed in surf1.
  1490. X     */
  1491. X    if (q < EPSILON)
  1492. X        return;    /* keep surf1 as-is */
  1493. X
  1494. X    ColorBlend(&surf1->amb, &surf2->amb, p, q);
  1495. X    ColorBlend(&surf1->diff, &surf2->diff, p, q);
  1496. X    ColorBlend(&surf1->spec, &surf2->spec, p, q);
  1497. X    ColorBlend(&surf1->translu, &surf2->translu, p, q);
  1498. X    ColorBlend(&surf1->body, &surf2->body, p, q);
  1499. X
  1500. X    surf1->srexp = blend(surf1->srexp, surf2->srexp, p, q);
  1501. X    surf1->stexp = blend(surf1->stexp, surf2->stexp, p, q);
  1502. X
  1503. X    surf1->reflect = blend(surf1->reflect, surf2->reflect, p, q);
  1504. X    surf1->transp  = blend(surf1->transp,  surf2->transp,  p, q);
  1505. X    surf1->translucency = blend(surf1->translucency, surf2->translucency,
  1506. X            p, q);
  1507. X    /*
  1508. X     * Questionable...
  1509. X     */
  1510. X    surf1->statten = blend(surf1->statten, surf2->statten, p, q);
  1511. X    surf1->index = blend(surf1->index, surf2->index, p, q);
  1512. X
  1513. X    if (p < EPSILON) {
  1514. X        surf1->noshadow = surf2->noshadow;
  1515. X    } else {
  1516. X        /* else there's a blend of some kind... */
  1517. X        surf1->noshadow = (surf1->noshadow && surf2->noshadow);
  1518. X    }
  1519. X}
  1520. X
  1521. X/*
  1522. X * Blend two colors.  Result is placed in color1.
  1523. X */
  1524. Xvoid
  1525. XColorBlend(color1, color2, p, q)
  1526. XColor *color1, *color2;
  1527. XFloat p, q;
  1528. X{
  1529. X    color1->r = blend(color1->r, color2->r, p, q);
  1530. X    color1->g = blend(color1->g, color2->g, p, q);
  1531. X    color1->b = blend(color1->b, color2->b, p, q);
  1532. X}
  1533. X
  1534. XSurfList *
  1535. XSurfPop(list)
  1536. XSurfList *list;
  1537. X{
  1538. X    SurfList *stmp = list->next;
  1539. X
  1540. X    free((voidstar)list);
  1541. X    return stmp;
  1542. X}
  1543. X
  1544. XSurfList *
  1545. XSurfPush(surf, list)
  1546. XSurface *surf;
  1547. XSurfList *list;
  1548. X{
  1549. X    SurfList *stmp;
  1550. X
  1551. X    stmp = (SurfList *)Malloc(sizeof(SurfList));
  1552. X    stmp->surf = surf;
  1553. X    stmp->next = list;
  1554. X    return stmp;
  1555. X}
  1556. END_OF_FILE
  1557. if test 3304 -ne `wc -c <'libray/libsurf/surface.c'`; then
  1558.     echo shar: \"'libray/libsurf/surface.c'\" unpacked with wrong size!
  1559. fi
  1560. # end of 'libray/libsurf/surface.c'
  1561. fi
  1562. if test -f 'libshade/lightdef.c' -a "${1}" != "-c" ; then 
  1563.   echo shar: Will not clobber existing file \"'libshade/lightdef.c'\"
  1564. else
  1565. echo shar: Extracting \"'libshade/lightdef.c'\" \(3547 characters\)
  1566. sed "s/^X//" >'libshade/lightdef.c' <<'END_OF_FILE'
  1567. X/*
  1568. X * lightdef.c
  1569. X *
  1570. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1571. X * All rights reserved.
  1572. X *
  1573. X * This software may be freely copied, modified, and redistributed
  1574. X * provided that this copyright notice is preserved on all copies.
  1575. X *
  1576. X * You may not distribute this software, in whole or in part, as part of
  1577. X * any commercial product without the express consent of the authors.
  1578. X *
  1579. X * There is no warranty or other guarantee of fitness of this software
  1580. X * for any purpose.  It is provided solely "as is".
  1581. X *
  1582. X * $Id: lightdef.c,v 4.0 91/07/17 14:46:25 kolb Exp Locker: kolb $
  1583. X *
  1584. X * $Log:    lightdef.c,v $
  1585. X * Revision 4.0  91/07/17  14:46:25  kolb
  1586. X * Initial version.
  1587. X * 
  1588. X */
  1589. X#include "rayshade.h"
  1590. X#include "options.h"
  1591. X#include "liblight/light.h"
  1592. X#include "liblight/infinite.h"    /* to create default infinite light */
  1593. X#include "liblight/jittered.h"    /* to create jittered light sources */
  1594. X
  1595. XLight *Lights = NULL;        /* Linked list of defined lights */
  1596. X
  1597. Xvoid
  1598. XLightAddToDefined(light)
  1599. XLight *light;
  1600. X{
  1601. X    if (light) {
  1602. X        light->next = Lights;
  1603. X        Lights = light;
  1604. X    }
  1605. X}
  1606. X
  1607. Xvoid
  1608. XLightSetup()
  1609. X{
  1610. X    long shadowopts;
  1611. X    Light *ltmp;
  1612. X
  1613. X    /*
  1614. X     * Set shadowing options.
  1615. X     */
  1616. X    shadowopts = 0;
  1617. X    if (Options.no_shadows)
  1618. X        shadowopts |= SHADOW_NONE;
  1619. X    if (Options.shadowtransp)
  1620. X        shadowopts |= SHADOW_TRANSP;
  1621. X    if (Options.csg)
  1622. X        shadowopts |= SHADOW_CSG;
  1623. X    if (Options.cache)
  1624. X        shadowopts |= SHADOW_CACHE;
  1625. X    if (Options.shutterspeed > 0.)
  1626. X        shadowopts |= SHADOW_BLUR;
  1627. X    ShadowSetOptions(shadowopts);
  1628. X
  1629. X    /*
  1630. X     * If no light sources were defined, add a default.
  1631. X     */
  1632. X    if (Lights == (Light *)NULL) {
  1633. X        Color ctmp;
  1634. X        Vector vtmp;
  1635. X        vtmp.x = vtmp.z = 1.;
  1636. X        vtmp.y = -1;
  1637. X        ctmp.r = ctmp.g = ctmp.b = 1.;
  1638. X
  1639. X        LightAddToDefined(LightInfiniteCreate(&ctmp, &vtmp));
  1640. X    }
  1641. X    /*
  1642. X     * Now that we've parsed the input file, we know what
  1643. X     * maxlevel is, and we can allocate the correct amount of
  1644. X     * space for each light source's cache.
  1645. X     */
  1646. X    for (ltmp = Lights; ltmp; ltmp = ltmp->next) {
  1647. X        ltmp->cache = (ShadowCache *)Calloc(
  1648. X            (unsigned)Options.maxdepth + 1, sizeof(ShadowCache));
  1649. X    }
  1650. X}
  1651. X
  1652. Xvoid
  1653. XAreaLightCreate(color, corner, u, usamp, v, vsamp, shadow)
  1654. XColor *color;
  1655. XVector *corner, *u, *v;
  1656. Xint usamp, vsamp, shadow;
  1657. X{
  1658. X    Vector vpos, curpos;
  1659. X    int i, j, numlight;
  1660. X    Float ulen, vlen;
  1661. X    Color intens;
  1662. X    Light *ltmp;
  1663. X
  1664. X    if (usamp < 1 || vsamp < 1)
  1665. X        RLerror(RL_ABORT, "Invalid area light specification.\n");
  1666. X
  1667. X    numlight = usamp * vsamp;    /* Total number of jittered sources */
  1668. X
  1669. X    /*
  1670. X     * Sum of all intensities is equal to specified intensity.
  1671. X     */
  1672. X    intens.r = color->r / (Float)numlight;
  1673. X    intens.g = color->g / (Float)numlight;
  1674. X    intens.b = color->b / (Float)numlight;
  1675. X
  1676. X    VecSub(*u, *corner, u);
  1677. X    VecSub(*v, *corner, v);
  1678. X    /*
  1679. X     * Make sure that u and v are not degenerate.
  1680. X     */
  1681. X    ulen = VecNormalize(u);
  1682. X    vlen = VecNormalize(v);
  1683. X    if (ulen < EPSILON || vlen < EPSILON)
  1684. X        RLerror(RL_ABORT, "Degenerate area light source.\n");
  1685. X    /*
  1686. X     * Scale u and v such that they define the area covered by a
  1687. X     * single sample.
  1688. X     */
  1689. X    VecScale(ulen / (Float)usamp, *u, u); 
  1690. X    VecScale(vlen / (Float)vsamp, *v, v);
  1691. X    /*
  1692. X     * For each sample...
  1693. X     */
  1694. X    vpos = *corner;
  1695. X    for (i = 0; i < vsamp; i++) {
  1696. X        curpos = vpos;
  1697. X        for (j = 0; j < usamp; j++) {
  1698. X            /*
  1699. X             * current pos is the "corner" of a new light
  1700. X             * source.  A jittered position based on
  1701. X             * the "corner" and the two edge vectors
  1702. X             * is used as the position for the
  1703. X             * light source in lighting calculations.
  1704. X             */
  1705. X            ltmp = LightJitteredCreate(&intens, &curpos, u, v);
  1706. X            ltmp->shadow = shadow;
  1707. X            LightAddToDefined(ltmp);
  1708. X            VecAdd(curpos, *u, &curpos);
  1709. X        }
  1710. X        VecAdd(vpos, *v, &vpos);
  1711. X    }
  1712. X}
  1713. END_OF_FILE
  1714. if test 3547 -ne `wc -c <'libshade/lightdef.c'`; then
  1715.     echo shar: \"'libshade/lightdef.c'\" unpacked with wrong size!
  1716. fi
  1717. # end of 'libshade/lightdef.c'
  1718. fi
  1719. if test -f 'libshade/options.h' -a "${1}" != "-c" ; then 
  1720.   echo shar: Will not clobber existing file \"'libshade/options.h'\"
  1721. else
  1722. echo shar: Extracting \"'libshade/options.h'\" \(3167 characters\)
  1723. sed "s/^X//" >'libshade/options.h' <<'END_OF_FILE'
  1724. X/*
  1725. X * options.h
  1726. X *
  1727. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1728. X * All rights reserved.
  1729. X *
  1730. X * This software may be freely copied, modified, and redistributed
  1731. X * provided that this copyright notice is preserved on all copies.
  1732. X *
  1733. X * You may not distribute this software, in whole or in part, as part of
  1734. X * any commercial product without the express consent of the authors.
  1735. X *
  1736. X * There is no warranty or other guarantee of fitness of this software
  1737. X * for any purpose.  It is provided solely "as is".
  1738. X *
  1739. X * $Id: options.h,v 4.0 91/07/17 14:46:54 kolb Exp Locker: kolb $
  1740. X *
  1741. X * $Log:    options.h,v $
  1742. X * Revision 4.0  91/07/17  14:46:54  kolb
  1743. X * Initial version.
  1744. X * 
  1745. X */
  1746. X#ifndef OPTIONS_H
  1747. X#define OPTIONS_H
  1748. X
  1749. X/*
  1750. X * Constants for Stereo mode
  1751. X */
  1752. X#define LEFT        1
  1753. X#define RIGHT        2
  1754. X
  1755. X/*
  1756. X * Options
  1757. X */
  1758. Xtypedef struct RSOptions {
  1759. X    int    stereo,            /* Stereo mode? */
  1760. X        verbose,        /* Babbling mode? */
  1761. X        quiet,            /* Don't complain? */
  1762. X        jitter,            /* use jittered sampling? */
  1763. X        samples,        /* Sqrt of # of samples */
  1764. X        maxdepth,        /* Maximum ray tree depth */
  1765. X        report_freq,        /* Frequency, in lines, of report */
  1766. X        no_shadows,        /* Trace shadow rays? */
  1767. X        shadowtransp,        /* ... through transparent objects? */
  1768. X        cache,            /* Cache shadowing info? */
  1769. X        appending,        /* Append to image file? */
  1770. X        resolution_set,        /* resolution set on command line */
  1771. X        contrast_set,        /* contrast overridden ... */
  1772. X        samples_set,        /* samples overridden ... */
  1773. X        cutoff_set,        /* cutoff ... */
  1774. X        maxdepth_set,        /* adaptive depth ... */
  1775. X        window_set,        /* window ... */
  1776. X        freq_set,        /* report frequency ... */
  1777. X        jitter_set,        /* use jittering */
  1778. X        eyesep_set,        /* eye separation ... */
  1779. X        csg,            /* CSG object someplace in world */
  1780. X        flipnorm,        /* flip normals of polygonal objs */
  1781. X        samplemap,        /* output sample map? */
  1782. X        gaussian,        /* Use gaussian pixel filter? */
  1783. X        framenum,        /* current frame number */
  1784. X        startframe,        /* Starting frame number. */
  1785. X        endframe,        /* ending frame number */
  1786. X        totalframes,        /* total # of frames */
  1787. X        totalframes_set;    /* set on command line? */
  1788. X#ifdef URT
  1789. X    int    alpha;            /* Write alpha channel? */
  1790. X    int    exp_output;        /* Write exponential RLE file? */
  1791. X#endif
  1792. X    Float    eyesep,            /* Eye separation (for Stereo mode) */
  1793. X        gamma,            /* Gamma value (0 == no correction) */
  1794. X        xmin, xmax, ymin, ymax, /* Window range */
  1795. X        starttime,        /* Think about it ... */
  1796. X        shutterspeed,        /* time shutter is open */
  1797. X        framestart,        /* start time of the current frame */
  1798. X        framelength,        /* length of the current frame */
  1799. X        filterwidth;        /* Pixel filter width. */
  1800. X    Color    contrast,        /* Max. allowable contrast */
  1801. X        cutoff,            /* Ray tree depth control */
  1802. X        ambient;        /* Ambient light multiplier */
  1803. X    char    *progname,        /* argv[0] */
  1804. X        *statsname,        /* Name of stats file. */
  1805. X        *imgname,        /* Name of output image file */
  1806. X        *inputname,        /* Name of input file, NULL == stdin */
  1807. X        *cppargs;        /* arguments to pass to cpp */
  1808. X#ifdef LINDA
  1809. X    int    workers,        /* # of worker processes */
  1810. X        workernum,        /* worker #, 0 == supervisor */
  1811. X        verbose_worker;        /* Babble while you work? */
  1812. X#endif
  1813. X    FILE    *pictfile;        /* output file pointer */
  1814. X} RSOptions;
  1815. X
  1816. Xextern RSOptions Options;
  1817. Xextern void OptionsList(), OptionsSet();
  1818. X
  1819. X#endif /* OPTIONS_H */
  1820. END_OF_FILE
  1821. if test 3167 -ne `wc -c <'libshade/options.h'`; then
  1822.     echo shar: \"'libshade/options.h'\" unpacked with wrong size!
  1823. fi
  1824. # end of 'libshade/options.h'
  1825. fi
  1826. if test -f 'libshade/symtab.c' -a "${1}" != "-c" ; then 
  1827.   echo shar: Will not clobber existing file \"'libshade/symtab.c'\"
  1828. else
  1829. echo shar: Extracting \"'libshade/symtab.c'\" \(3608 characters\)
  1830. sed "s/^X//" >'libshade/symtab.c' <<'END_OF_FILE'
  1831. X/*
  1832. X * symtab.c
  1833. X *
  1834. X * Copyright (C) 1989, 1991, Craig E. Kolb, Rod G. Bogart
  1835. X * All rights reserved.
  1836. X *
  1837. X * This software may be freely copied, modified, and redistributed
  1838. X * provided that this copyright notice is preserved on all copies.
  1839. X *
  1840. X * You may not distribute this software, in whole or in part, as part of
  1841. X * any commercial product without the express consent of the authors.
  1842. X * 
  1843. X * There is no warranty or other guarantee of fitness of this software
  1844. X * for any purpose.  It is provided solely "as is".
  1845. X *
  1846. X * $Id: symtab.c,v 4.0 91/07/17 14:48:02 kolb Exp Locker: kolb $
  1847. X *
  1848. X * $Log:    symtab.c,v $
  1849. X * Revision 4.0  91/07/17  14:48:02  kolb
  1850. X * Initial version.
  1851. X * 
  1852. X */
  1853. X
  1854. X#include "rayshade.h"
  1855. X#include "symtab.h"
  1856. X#include "builtin.h"
  1857. X
  1858. Xstatic struct SymtabPredefinedEntry SymtabPredefined[] = {
  1859. X    {"pi", 3.141592, NULL, FLOAT_EXPR, FALSE, 0},
  1860. X    {"dtor", 0.017453, NULL, FLOAT_EXPR, FALSE, 0},
  1861. X    {"rtod", 57.29578, NULL, FLOAT_EXPR, FALSE, 0},
  1862. X    {"cos", 0.0, cos, BUILTIN_EXPR, FALSE, 1},
  1863. X    {"sin", 0.0, sin, BUILTIN_EXPR, FALSE, 1},
  1864. X    {"tan", 0.0, tan, BUILTIN_EXPR, FALSE, 1},
  1865. X    {"sqrt", 0.0, sqrt, BUILTIN_EXPR, FALSE, 1},
  1866. X    {"acos", 0.0, acos, BUILTIN_EXPR, FALSE, 1},
  1867. X    {"asin", 0.0, asin, BUILTIN_EXPR, FALSE, 1},
  1868. X    {"atan", 0.0, atan, BUILTIN_EXPR, FALSE, 1},
  1869. X    {"hypot", 0.0, hypot, BUILTIN_EXPR, FALSE, 2},
  1870. X    {"time", 0.0, NULL, FLOAT_EXPR, TRUE, 0},
  1871. X    {"frame", 0.0, NULL, FLOAT_EXPR, TRUE, 0},
  1872. X    {"linear", 0.0, LinearTime, BUILTIN_EXPR, TRUE, 4},
  1873. X    {NULL, 0.0, NULL, 0, 0}
  1874. X};
  1875. X
  1876. XSymtabEntry *Symtab = (SymtabEntry *) NULL;
  1877. X
  1878. Xvoid SymtabAddEntry();
  1879. X
  1880. Xvoid
  1881. XSymtabInit()
  1882. X{
  1883. X    int i;
  1884. X
  1885. X    for(i=0; SymtabPredefined[i].name; i++) {
  1886. X        if (SymtabPredefined[i].type == BUILTIN_EXPR)
  1887. X            SymtabAddEntry(SymtabPredefined[i].name,
  1888. X                       SymtabPredefined[i].type,
  1889. X                       NULL,
  1890. X                       SymtabPredefined[i].fp,
  1891. X                    SymtabPredefined[i].timevary,    
  1892. X                       SymtabPredefined[i].params);
  1893. X        else
  1894. X            SymtabAddEntry(SymtabPredefined[i].name,
  1895. X                       SymtabPredefined[i].type,
  1896. X                       ExprFloatCreate(SymtabPredefined[i].f,
  1897. X                        SymtabPredefined[i].timevary),
  1898. X                       NULL, SymtabPredefined[i].timevary, 0);
  1899. X    }
  1900. X    TimeExpr = ExprFloatSymtabFind("time");
  1901. X    FrameExpr = ExprFloatSymtabFind("frame");
  1902. X}
  1903. X
  1904. Xvoid
  1905. XSymtabAddEntry(name, type, expr, fp, timevary, params)
  1906. Xchar *name;
  1907. XExpr *expr;
  1908. XFloat (*fp)();
  1909. Xint type, timevary, params;
  1910. X{
  1911. X    SymtabEntry *res;
  1912. X
  1913. X    if (SymtabFind(name) != (SymtabEntry *)NULL)
  1914. X        RLerror(RL_ABORT, "Symbol %s redefined.\n", name);
  1915. X
  1916. X    res = (SymtabEntry *) Malloc( sizeof(SymtabEntry));
  1917. X    res->name = strsave(name);
  1918. X    res->type = type;
  1919. X    res->timevary = timevary;
  1920. X    switch (type) {
  1921. X    case FLOAT_EXPR:
  1922. X        res->value.expr = expr;
  1923. X        expr->symtab = TRUE;
  1924. X        break;
  1925. X    case BUILTIN_EXPR:
  1926. X        res->value.fp = fp;
  1927. X        break;
  1928. X    default:
  1929. X        RLerror(RL_WARN,
  1930. X            "Type %d not implemented!!!",type);
  1931. X    }
  1932. X    res->params = params;
  1933. X    res->next = Symtab;
  1934. X    Symtab = res;
  1935. X}
  1936. X
  1937. XSymtabEntry *
  1938. XSymtabFind(name)
  1939. Xchar *name;
  1940. X{
  1941. X    SymtabEntry *res;
  1942. X    for(res=Symtab; res; res=res->next) {
  1943. X        if (!strcmp(res->name,name))
  1944. X            return res;
  1945. X    }
  1946. X    /*error*/
  1947. X    return NULL;
  1948. X}
  1949. X
  1950. XExpr *
  1951. XExprFloatSymtabFind(name)
  1952. Xchar *name;
  1953. X{
  1954. X    SymtabEntry *res;
  1955. X
  1956. X    if ((res = SymtabFind(name)) == NULL) 
  1957. X        RLerror(RL_PANIC,
  1958. X            "Symbol %s not defined!\n", name);
  1959. X    if (res->type != FLOAT_EXPR)
  1960. X        RLerror(RL_PANIC,
  1961. X            "Symbol %s is not a float expression!\n", name);
  1962. X    return res->value.expr;
  1963. X}
  1964. X
  1965. X
  1966. XSymtabEntry *
  1967. XSymtabBuiltinFind(name)
  1968. Xchar *name;
  1969. X{
  1970. X    SymtabEntry *res;
  1971. X
  1972. X    if ((res = SymtabFind(name)) == NULL) 
  1973. X        RLerror(RL_PANIC,
  1974. X            "Symbol %s not defined!\n", name);
  1975. X    if (res->type != BUILTIN_EXPR)
  1976. X        RLerror(RL_PANIC,
  1977. X            "Symbol %s is not a built in function!\n", name);
  1978. X    return res;
  1979. X}
  1980. END_OF_FILE
  1981. if test 3608 -ne `wc -c <'libshade/symtab.c'`; then
  1982.     echo shar: \"'libshade/symtab.c'\" unpacked with wrong size!
  1983. fi
  1984. # end of 'libshade/symtab.c'
  1985. fi
  1986. echo shar: End of archive 7 \(of 19\).
  1987. cp /dev/null ark7isdone
  1988. MISSING=""
  1989. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
  1990.     if test ! -f ark${I}isdone ; then
  1991.     MISSING="${MISSING} ${I}"
  1992.     fi
  1993. done
  1994. if test "${MISSING}" = "" ; then
  1995.     echo You have unpacked all 19 archives.
  1996.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1997. else
  1998.     echo You still need to unpack the following archives:
  1999.     echo "        " ${MISSING}
  2000. fi
  2001. ##  End of shell archive.
  2002. exit 0
  2003.  
  2004. exit 0 # Just in case...
  2005.