home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume21 / rayshade / part05 < prev    next >
Text File  |  1991-07-21  |  54KB  |  1,973 lines

  1. Newsgroups: comp.sources.misc
  2. From: Rayshade Construction Co. <rayshade@weedeater.math.YALE.EDU>
  3. Subject:  v21i008:  rayshade - A raytracing package for UNIX, Part05/19
  4. Message-ID: <1991Jul20.043430.11415@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: f8e80c4adced6288998ca8b3585df340
  6. Date: Sat, 20 Jul 1991 04:34:30 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 8
  11. Archive-name: rayshade/part05
  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 5 (of 19)."
  21. # Contents:  Doc/Globals Doc/Guide/height.tex Examples/csg.ray
  22. #   Examples/mtv.ray etc/malloc.sgi libray/libcommon/common.h
  23. #   libray/libcommon/rotate.c libray/libcommon/transform.h
  24. #   libray/libcommon/vector.h libray/liblight/jittered.c
  25. #   libray/liblight/light.c libray/liblight/light.h
  26. #   libray/libobj/instance.c libray/libsurf/atmosphere.c
  27. #   libray/libsurf/surface.h libray/libtext/fbm.c
  28. #   libray/libtext/texture.h libray/libtext/wood.c libshade/objdef.c
  29. #   rayshade/main.c
  30. # Wrapped by kolb@woody on Wed Jul 17 17:56:44 1991
  31. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  32. if test -f 'Doc/Globals' -a "${1}" != "-c" ; then 
  33.   echo shar: Will not clobber existing file \"'Doc/Globals'\"
  34. else
  35. echo shar: Extracting \"'Doc/Globals'\" \(1927 characters\)
  36. sed "s/^X//" >'Doc/Globals' <<'END_OF_FILE'
  37. X/*
  38. X * Variables shared by the various libraries:
  39. X */
  40. X
  41. XFloat
  42. XRSAbstmp
  43. X
  44. X    Temporary variable used by the fabs() macro to keep
  45. X    expressions from being evaluated twice (e.g.,
  46. X    fabs(cos(x)) is expanded to ((x=cos(x) < 0 ? -x : x)
  47. X    rather than ((x=cos(x) < 0 ? -cos(x) : cos(x))    ).
  48. X    Could be removed by making fabs a function or not minding
  49. X    if expressions are evaluated twice.
  50. X
  51. XSampleInfo
  52. XSampling
  53. X
  54. X    Variables used to control sampling.
  55. X    Used in conjunction with a ray's sample number
  56. X    (ray->sample) to determine how to sample, for example,
  57. X    extended light sources.
  58. X
  59. X/*
  60. X * Variables shared by modules in the rayshade application:
  61. X */
  62. XRSCamera
  63. XCamera
  64. X    Camera definition.  Used in viewing, setup, and parsing.
  65. X
  66. XRSScreen
  67. XScreen
  68. X    Screen information.  Used in viewing, setup, and parsing.
  69. X
  70. XRSOptions
  71. XOptions
  72. X    
  73. X    Options of all sorts.
  74. X
  75. XRSStats
  76. XStats
  77. X
  78. X    Statistical information.
  79. X
  80. XMedium
  81. XTopMedium
  82. X
  83. X    "Air" description (index of refraction and atmospheric effects).
  84. X    Used in viewing, parsing, and ShadeRay.
  85. X
  86. XLight *
  87. XLights
  88. X
  89. X    Array of defined lights.  Used in parsing and in shade().
  90. X
  91. X/*
  92. X * Application-provided functions:
  93. X */
  94. XSurface *
  95. XGetShadingSurf(hitlist)
  96. XHitList *hitlist
  97. X
  98. X    Given a hitlist, return the surface to be used in shading.
  99. X
  100. Xint
  101. XTraceRay(ray, hitlist, mindist, maxdist)
  102. XRay *ray;
  103. XHitList *hitlist;
  104. XFloat mindist, *maxdist;
  105. X
  106. X    Intersect the top-level object with the given ray.
  107. X    Probably as simple as:
  108. X        return intersect(World, ray, hitlist, mindist, maxdist)
  109. X
  110. Xvoid
  111. XRLerror(level, pattern, arg1, arg2, arg3)
  112. Xint level;
  113. Xchar *pattern, *arg1, *arg2, *arg3;
  114. X
  115. X    Error-reporting function.  'level' indicates the severity of
  116. X    the error (see libcommon/error.h).  'pattern' and the
  117. X    args are suitable for printing via:
  118. X        fprintf(stderr, patter, arg1, arg2, arg3);
  119. X    Note that as the args are cast to char *'s, printing, for
  120. X    example, several doubles, will not work.  (Being more
  121. X    rigorous about it would require varargs or something similar.)
  122. END_OF_FILE
  123. if test 1927 -ne `wc -c <'Doc/Globals'`; then
  124.     echo shar: \"'Doc/Globals'\" unpacked with wrong size!
  125. fi
  126. # end of 'Doc/Globals'
  127. fi
  128. if test -f 'Doc/Guide/height.tex' -a "${1}" != "-c" ; then 
  129.   echo shar: Will not clobber existing file \"'Doc/Guide/height.tex'\"
  130. else
  131. echo shar: Extracting \"'Doc/Guide/height.tex'\" \(1846 characters\)
  132. sed "s/^X//" >'Doc/Guide/height.tex' <<'END_OF_FILE'
  133. X\chapter{Height Field Files}
  134. X
  135. XThis appendix describes the format of the files that store data
  136. Xfor the height field primitive.
  137. XThe format is an historical relic; a better format is needed.
  138. X
  139. XHeight field data is stored in binary form.
  140. XThe first record in the file is a
  141. X32-bit integer giving the square root of number of data
  142. Xpoints in the file.
  143. XWe'll call this number
  144. Xthe size of the height field.
  145. X
  146. XThe size is
  147. Xfollowed by altitude ($z$) values stored as 32-bit
  148. Xfloating point values.  The 0th value in the file specifies the $z$
  149. Xcoordinate
  150. Xof the lower-left corner of the height field (0, 0).
  151. XThe next
  152. Xspecifies the Z coordinate for $(1/(size-1), 0)$.  The last specifies the
  153. Xcoordinate for $(1., 1.)$.  In other words, the $i^{th}$ value 
  154. Xin the heightfield file specifies the $z$ coordinate for the point
  155. Xwhose $x$ coordinate is
  156. X$(i \% size) / (size -1)$, and whose
  157. X$y$ coordinate is $(i / size) / (size -1)$.
  158. XNon-square height fields may be rendered by specifying altitude values
  159. Xless than or equal to the magic value
  160. X$-1000$.  Triangles that have any vertex less than
  161. Xor equal in altitude to this value are not rendered.
  162. X
  163. XWhile this file format is compact, it sacrifices portability for
  164. Xease of use.  While creating and handling height field files is
  165. Xsimple, transporting a height field from one machine to another
  166. Xis problematical due to the fact that differences in byte order
  167. Xand floating-point format between machines is not taken into
  168. Xaccount.
  169. X
  170. XThese problems could be circumvented by writing the height field file
  171. Xin a fixed-point format, taking care to write the bytes that
  172. Xencode a given value in a consistent way from machine to machine.
  173. XAn even better idea would be to write a set of tools for
  174. Xmanipulating arbitrary 2D arrays of floating-point values in a compact,
  175. Xportable way, allowing for comments and the like in the file\ldots
  176. END_OF_FILE
  177. if test 1846 -ne `wc -c <'Doc/Guide/height.tex'`; then
  178.     echo shar: \"'Doc/Guide/height.tex'\" unpacked with wrong size!
  179. fi
  180. # end of 'Doc/Guide/height.tex'
  181. fi
  182. if test -f 'Examples/csg.ray' -a "${1}" != "-c" ; then 
  183.   echo shar: Will not clobber existing file \"'Examples/csg.ray'\"
  184. else
  185. echo shar: Extracting \"'Examples/csg.ray'\" \(2330 characters\)
  186. sed "s/^X//" >'Examples/csg.ray' <<'END_OF_FILE'
  187. X/*
  188. X * csg wood block (apologies to Hofstadter)
  189. X *
  190. X * Eric Haines
  191. X *
  192. X */
  193. Xname letter_c
  194. Xdifference
  195. X    list
  196. X        cylinder  1 0 0 -1.0 0 0 1.0
  197. X        disc 1 0 0 -1.0 0 0 -1
  198. X        disc 1 0 0  1.0 0 0  1
  199. X    end
  200. X    union
  201. X        list
  202. X            cylinder  0.55 0 0 -1.2 0  0 1.2
  203. X            disc 0.55 0 0 -1.2 0 0 -1
  204. X            disc 0.55 0 0  1.2 0 0  1
  205. X        end
  206. X        box 0. -.3 -1.2  1.2 0.3 1.2 
  207. X    end
  208. Xend
  209. X
  210. X
  211. Xname s1 /* outer top part of s */
  212. Xlist
  213. X        cylinder 0.6125  -0.3875 0.3875 -1.0 -0.3875 0.3875 1.0
  214. X        disc 0.6125 -0.3875 0.3875 -1.0 0 0 -1
  215. X        disc 0.6125 -0.3875 0.3875  1.0 0 0  1
  216. X        cylinder  0.6125 0.3875 -0.3875 -1.0 0.3875 -0.3875 1.0
  217. X        disc 0.6125 0.3875 -0.3875 -1.0 0 0 -1
  218. X        disc 0.6125 0.3875 -0.3875  1.0 0 0  1
  219. Xend
  220. X
  221. Xname s3 /* all inner part of s */
  222. Xunion
  223. X    list
  224. X        cylinder  0.1625 -0.3875 0.3875 -1.2 -0.3875 0.3875 1.2
  225. X        disc 0.1625 -0.3875 0.3875 -1.2 0 0 -1
  226. X        disc 0.1625 -0.3875 0.3875  1.2 0 0  1
  227. X        cylinder  0.1625 0.3875 -0.3875 -1.2 0.3875 -0.3875 1.2
  228. X        disc 0.1625 0.3875 -0.3875 -1.2 0 0 -1
  229. X        disc 0.1625 0.3875 -0.3875  1.2 0 0  1
  230. X    end
  231. X    box -.3875 -1.2 -1.2 .3875 1.2 1.2 
  232. Xend
  233. X
  234. Xname letter_s
  235. Xunion
  236. X    union
  237. X        union
  238. X            difference
  239. X                object s1
  240. X                object s3
  241. X            end
  242. X
  243. X            box -0.3875 0.55 -1 1 1 1 
  244. X        end
  245. X        box -0.3875 -0.225 -1 0.3875 0.225 1 
  246. X    end
  247. X    box -1 -1 -1 0.3875 -0.55 1 
  248. Xend
  249. X
  250. X
  251. Xname g3 /*all inner of g */
  252. Xunion
  253. X    list
  254. X        cylinder  0.55 0 0 -1.2 0  0 1.2
  255. X        disc 0.55 0 0 -1.2 0 0 -1
  256. X        disc 0.55 0 0  1.2 0 0  1
  257. X    end
  258. X    box 0. 0. -1.2  1.2 0.425 1.2 
  259. Xend
  260. X
  261. Xname letter_g
  262. Xunion
  263. X    difference
  264. X        list    /* outer part of g */
  265. X            cylinder  1.0 0 0 -1.0 0 0 1.0
  266. X            disc 1 0 0 -1.0 0 0 -1
  267. X            disc 1 0 0  1.0 0 0  1
  268. X        end
  269. X        object g3
  270. X    end
  271. X    box 0.25 -0.3375 -1.2 1.05 0.1125 1.2 
  272. Xend
  273. X
  274. Xname csg
  275. Xdifference
  276. X    difference
  277. X        object letter_s rotate 1 0 0 90
  278. X        object letter_c rotate 1 0 0 90 rotate 0 0 1 90
  279. X                scale 1.2 0.8 0.8
  280. X    end
  281. X    object letter_g scale 0.8 0.8 1.2
  282. X    /* scaling here is to avoid coincident surfaces */
  283. Xend
  284. X
  285. Xsurface white ambient .1 .1 .1 diffuse .5 .5 .5
  286. X
  287. Xsurface s1 ambient .5 .4 .3 diffuse .25 .2 .15
  288. Xsurface lgreen ambient .07 .1 .07
  289. X    diffuse .42 .6 .42
  290. X    specular .28 .4 .28 specpow 10
  291. X
  292. Xplane white 0 0 -3  0 0 1
  293. Xplane white 0 3 0   0 -1 0
  294. Xplane white -3 0 0  1 0 0
  295. X
  296. Xobject s1 csg /* texture wood scale 3 3 3*/
  297. X
  298. Xlight 0.8 directional 0 0 1
  299. Xlight 0.7 directional 0 -1 0
  300. Xlight 0.6 directional 1 0 0
  301. X
  302. Xbackground .1 .3 .8
  303. Xeyep 10. -13 8.
  304. Xlookp 0 0 -0.3
  305. Xup 0 0 1
  306. Xfov 20.
  307. END_OF_FILE
  308. if test 2330 -ne `wc -c <'Examples/csg.ray'`; then
  309.     echo shar: \"'Examples/csg.ray'\" unpacked with wrong size!
  310. fi
  311. chmod +x 'Examples/csg.ray'
  312. # end of 'Examples/csg.ray'
  313. fi
  314. if test -f 'Examples/mtv.ray' -a "${1}" != "-c" ; then 
  315.   echo shar: Will not clobber existing file \"'Examples/mtv.ray'\"
  316. else
  317. echo shar: Extracting \"'Examples/mtv.ray'\" \(1943 characters\)
  318. sed "s/^X//" >'Examples/mtv.ray' <<'END_OF_FILE'
  319. X/*
  320. X * Logo for a certain drek-filled cable channel.
  321. X * Rod Bogart, 10/90
  322. X */
  323. Xeyep  0 20 8
  324. Xlookp 0 0 3.5
  325. Xfov 30
  326. Xbackground .1 .3 .8
  327. Xlight 1 1 1 directional 0.5 1.5 2
  328. Xscreen 100 100
  329. Xmaxdepth 10
  330. Xsurface red
  331. X    ambient .2 .05 .05
  332. X    diffuse .8 .1 .05
  333. X    specular .05 .05 .05 specpow 20
  334. Xsurface green
  335. X    ambient .05 .2 .05
  336. X    diffuse .1 .8 .05
  337. X    specular .05 .05 .05 specpow 20
  338. Xsurface blue
  339. X    ambient .05 .05 .2
  340. X    diffuse .1 .1 .8
  341. X    specular .05 .05 .05 specpow 20
  342. Xsurface white
  343. X    ambient .2 .2 .2
  344. X    diffuse 1. 1. 1.
  345. X    specular 0.2 0.2 0.2 specpow 18
  346. Xsurface glass
  347. X    ambient .02 .02 .02
  348. X    diffuse 0.1 0.1 0.1
  349. X    specular 0.8 0.8 0.8 specpow 200 
  350. X    transp 1. index 1.5
  351. Xsurface redglass
  352. X    ambient .52 .02 .02 
  353. X    transp 1. index 1.0
  354. Xsurface greenglass
  355. X    ambient .02 .52 .02
  356. X    transp 1 index 1.0
  357. Xsurface m_surf specpow 20 specular 1. 1. 1. transp .8 reflect .1 index 1.4
  358. Xsurface tv_surf
  359. X    ambient .2 .05 .05
  360. X    diffuse .8 .1 .05
  361. X    specular .05 .05 .05 specpow 20
  362. Xplane white 0 0 -0.05  0 0 1 texture checker diffuse .8 .1 .05 scale 2 2 2
  363. X
  364. Xname general_cyl
  365. Xlist
  366. X    cylinder tv_surf 0.25  0 0 0  0 0 1 
  367. X    disc tv_surf 0.25  0 0 1  0 0 1
  368. X    disc tv_surf 0.25  0 0 0  0 0 -1
  369. Xend
  370. X
  371. Xname thingy
  372. Xgrid 6 6 6
  373. X    union    /* M */
  374. X        list    /* m legs */
  375. X            box m_surf   1.0 -1 0  4.2 1 7.0
  376. X            box m_surf   -4.2 -1 0  -1 1 7.0
  377. X               /*box m_surf   2.6 0 3.5 1.6 1 3.5 
  378. X               box m_surf  -2.6 0 3.5 1.6 1 3.5 */
  379. X        end
  380. X        difference
  381. X            box m_surf (-4.5^0.5) -1 (-4.5^0.5) 
  382. X                    (4.5^0.5) 1 (4.5^0.5)
  383. X                translate (4.5^0.5) 0 (4.5^0.5)
  384. X                rotate 0 1 0 -45 translate 0 0 2
  385. X            box m_surf -1 -1 -1  1 1 1
  386. X                  translate 1 0 1
  387. X                rotate 0 1 0 -45 translate 0 0 6
  388. X        end
  389. X    end /* M */
  390. X    /* TV */
  391. X    object general_cyl scale 1 1 3.6 rotate 0 1 0 -64 translate 0.2 0 3.4
  392. X    object general_cyl scale 1 1 4.0 rotate 0 1 0 3 translate -1.8 0 0.9
  393. X    object general_cyl scale 1 1 2.7 rotate 0 1 0 15 translate -3.2 0 1.5
  394. X    object general_cyl scale 1 1 5.0 rotate 0 1 0 -25 translate -3.2 0 1.5
  395. Xend
  396. X
  397. Xobject thingy rotate 0 0 1 -40
  398. END_OF_FILE
  399. if test 1943 -ne `wc -c <'Examples/mtv.ray'`; then
  400.     echo shar: \"'Examples/mtv.ray'\" unpacked with wrong size!
  401. fi
  402. # end of 'Examples/mtv.ray'
  403. fi
  404. if test -f 'etc/malloc.sgi' -a "${1}" != "-c" ; then 
  405.   echo shar: Will not clobber existing file \"'etc/malloc.sgi'\"
  406. else
  407. echo shar: Extracting \"'etc/malloc.sgi'\" \(1812 characters\)
  408. sed "s/^X//" >'etc/malloc.sgi' <<'END_OF_FILE'
  409. X[ Mike Gigante notes that when rendering exteremely large datasets
  410. X  (consisting primarily of triangles in his case), one may use the
  411. X  'mallopt()' routine on certain machines to improve performance
  412. X  significantly (to say the least). -- CEK ]
  413. X  
  414. X
  415. XFrom mg@godzilla.cgl.rmit.OZ.AU  Tue Aug 21 14:35:08 1990
  416. XReceived: from godzilla.cgl.rmit.oz.au by weedeater.math.yale.edu via SMTP; Tue, 21 Aug 90 14:35:08 -0400
  417. XReceived: by godzilla 
  418. XDate: Wed, 22 Aug 90 05:16:40 EST
  419. XFrom: mg@godzilla.cgl.rmit.OZ.AU (Mike Gigante)
  420. XMessage-Id: <9008211916.4715@godzilla>
  421. XTo: craig@weedeater.math.yale.edu
  422. XSubject: malloc stuff
  423. XStatus: RO
  424. X
  425. XCraig,
  426. Xwe spoke after the ray tracing sig about malloc stuff. Here is that
  427. Xstuff I promised to send you. 
  428. X
  429. X1) include <malloc.h> in your main program
  430. X2) make the following code the *first* executable statements
  431. X
  432. X#ifdef sgi
  433. X  /*
  434. X   * try to tune the malloc stuff. First thing to note is that most
  435. X   * allocated blocks (at least for triangles) are less than 200 bytes...
  436. X   */
  437. X  mallopt(M_MXFAST, 200);
  438. X  /*
  439. X   * allocate a big chunk at a time - esp since we are going to use LOTS
  440. X   * of memory!
  441. X   */
  442. X  mallopt(M_BLKSZ, 65536);
  443. X  /*
  444. X   * don't try too hard when looking for free'd memory to re-use. This
  445. X   * avoids the heavy paging penalty we have seen... In fact don't look
  446. X   * at all!
  447. X   */
  448. X  mallopt(M_MXCHK, 0);
  449. X#endif
  450. X
  451. Xand wow! *HUGE* improvments for large models. Just to remind you, it was
  452. Xa difference of 88 min CPU time over 10 hour period (just to read a model)
  453. Xvs about 2 minutes cpu/elapsed. Because of the M_MXCHK call, the working
  454. Xset was larger but it didn't make much difference..
  455. X
  456. XBTW, you should check the 200 bytes in the M_MXFAST call. Make it larger
  457. Xthan the common malloc sizes (say for mallocing triangle/poly structs).
  458. X
  459. XHope this is useful.
  460. X
  461. XMike Gigante, RMIT
  462. END_OF_FILE
  463. if test 1812 -ne `wc -c <'etc/malloc.sgi'`; then
  464.     echo shar: \"'etc/malloc.sgi'\" unpacked with wrong size!
  465. fi
  466. # end of 'etc/malloc.sgi'
  467. fi
  468. if test -f 'libray/libcommon/common.h' -a "${1}" != "-c" ; then 
  469.   echo shar: Will not clobber existing file \"'libray/libcommon/common.h'\"
  470. else
  471. echo shar: Extracting \"'libray/libcommon/common.h'\" \(2162 characters\)
  472. sed "s/^X//" >'libray/libcommon/common.h' <<'END_OF_FILE'
  473. X/*
  474. X * common.h
  475. X *
  476. X * Copyright (C) 1989, 1991, Craig E. Kolb
  477. X * All rights reserved.
  478. X *
  479. X * This software may be freely copied, modified, and redistributed
  480. X * provided that this copyright notice is preserved on all copies.
  481. X *
  482. X * You may not distribute this software, in whole or in part, as part of
  483. X * any commercial product without the express consent of the authors.
  484. X *
  485. X * There is no warranty or other guarantee of fitness of this software
  486. X * for any purpose.  It is provided solely "as is".
  487. X *
  488. X * $Id: common.h,v 4.0 91/07/17 14:30:18 kolb Exp Locker: kolb $
  489. X *
  490. X * $Log:    common.h,v $
  491. X * Revision 4.0  91/07/17  14:30:18  kolb
  492. X * Initial version.
  493. X * 
  494. X */
  495. X#ifndef COMMON_H 
  496. X#define COMMON_H
  497. X
  498. X#include <stdio.h>
  499. X#include <math.h>
  500. X#ifdef I_STDLIB
  501. X#include <stdlib.h>
  502. X#endif
  503. X#include "config.h"
  504. X
  505. Xtypedef double Float;
  506. X
  507. X#if (VOIDFLAGS & 8) == 8
  508. Xtypedef void * voidstar;
  509. X#else
  510. Xtypedef char * voidstar;
  511. X#endif
  512. X
  513. X#include "expr.h"
  514. X#include "vector.h"
  515. X#include "ray.h"
  516. X#include "color.h"
  517. X#include "transform.h"
  518. X#include "error.h"
  519. X
  520. X#ifndef TRUE
  521. X#define TRUE        1
  522. X#endif
  523. X
  524. X#ifndef FALSE
  525. X#define FALSE        0
  526. X#endif
  527. X
  528. X/*
  529. X * Various useful constants and macros.
  530. X */
  531. X#ifndef PI
  532. X#define    PI        3.14159265358979323846
  533. X#endif
  534. X#define TWOPI        (2. * PI)
  535. X#define INV_TWOPI    (1. / TWOPI)
  536. X#define deg2rad(x)    (Float)(x * PI/180.)
  537. X#define LNHALF        (-.69314718)
  538. X
  539. X#ifndef NULL
  540. X#    define NULL 0
  541. X#endif
  542. X
  543. X#define UNSET        -1
  544. X
  545. X/*
  546. X * Some systems, such as the RS6000, have fast fabs already defined.
  547. X */
  548. X#ifndef fabs
  549. Xextern Float RSabstmp;
  550. X#define fabs(x)         ((RSabstmp=x) < 0 ? -RSabstmp : RSabstmp)
  551. X#endif
  552. X
  553. X#ifdef MULTIMAX
  554. X/*
  555. X * On the multimax, allocate large pieces of memory as shared memory.
  556. X */
  557. Xextern char *share_malloc(), *share_calloc();
  558. X#else
  559. X/*
  560. X * Otherwise, malloc is malloc, etc.
  561. X */
  562. X#define share_malloc(x)        Malloc(x)
  563. X#define share_calloc(x,y)    Calloc(x,y)
  564. X#endif
  565. X
  566. X/*
  567. X * Close enough for us.
  568. X */
  569. X#define equal(a, b)        (fabs((a) - (b)) < 0.000001)
  570. X/*
  571. X * Maximum/Minimum functions
  572. X */
  573. X#define max(a, b)        ((a) > (b) ? (a) : (b))
  574. X#define min(a, b)        ((a) < (b) ? (a) : (b))
  575. X
  576. Xextern voidstar Malloc(), Calloc();
  577. Xextern char    *strsave();
  578. Xextern double    drand48();    /* just in case */
  579. X
  580. X#endif /* COMMON_H */
  581. END_OF_FILE
  582. if test 2162 -ne `wc -c <'libray/libcommon/common.h'`; then
  583.     echo shar: \"'libray/libcommon/common.h'\" unpacked with wrong size!
  584. fi
  585. # end of 'libray/libcommon/common.h'
  586. fi
  587. if test -f 'libray/libcommon/rotate.c' -a "${1}" != "-c" ; then 
  588.   echo shar: Will not clobber existing file \"'libray/libcommon/rotate.c'\"
  589. else
  590. echo shar: Extracting \"'libray/libcommon/rotate.c'\" \(2419 characters\)
  591. sed "s/^X//" >'libray/libcommon/rotate.c' <<'END_OF_FILE'
  592. X/*
  593. X * rotate.c
  594. X *
  595. X * Copyright (C) 1989, 1991, Craig E. Kolb
  596. X * All rights reserved.
  597. X *
  598. X * This software may be freely copied, modified, and redistributed
  599. X * provided that this copyright notice is preserved on all copies.
  600. X *
  601. X * You may not distribute this software, in whole or in part, as part of
  602. X * any commercial product without the express consent of the authors.
  603. X * 
  604. X * There is no warranty or other guarantee of fitness of this software
  605. X * for any purpose.  It is provided solely "as is".
  606. X *
  607. X * $Id: rotate.c,v 4.0 91/07/17 14:31:18 kolb Exp Locker: kolb $
  608. X *
  609. X * $Log:    rotate.c,v $
  610. X * Revision 4.0  91/07/17  14:31:18  kolb
  611. X * Initial version.
  612. X * 
  613. X */
  614. X#include "common.h"
  615. X#include "rotate.h"
  616. X
  617. XTransMethods *iRotateMethods;
  618. Xvoid RotationMatrix();
  619. X
  620. XRotate *
  621. XRotateCreate()
  622. X{
  623. X    Rotate *res;
  624. X
  625. X    res = (Rotate *)Malloc(sizeof(Rotate));
  626. X    res->x = res->y = res->theta = 0.;
  627. X    res->z = 1.;
  628. X    return res;
  629. X}
  630. X
  631. XTransMethods *
  632. XRotateMethods()
  633. X{
  634. X    if (iRotateMethods == (TransMethods *)NULL) {
  635. X        iRotateMethods = (TransMethods *)Malloc(sizeof(TransMethods));
  636. X        iRotateMethods->create = (TransCreateFunc *)RotateCreate;
  637. X        iRotateMethods->propagate = RotatePropagate;
  638. X    }
  639. X    return iRotateMethods;    
  640. X}
  641. X
  642. Xvoid
  643. XRotatePropagate(rotate, trans, itrans)
  644. XRotate *rotate;
  645. XRSMatrix *trans, *itrans;
  646. X{
  647. X    Vector axis;
  648. X
  649. X    RotationMatrix(rotate->x, rotate->y, rotate->z, deg2rad(rotate->theta), trans);
  650. X    /*
  651. X     * Build the inverse...
  652. X     */
  653. X    MatrixInvert(trans, itrans);
  654. X}
  655. X
  656. Xvoid
  657. XRotationMatrix(x, y, z, theta, trans)
  658. XFloat x, y, z, theta;
  659. XRSMatrix *trans;
  660. X{
  661. X    Float n1, n2, n3, sintheta, costheta;
  662. X    Vector vector;
  663. X
  664. X    MatrixInit(trans);
  665. X    vector.x = x;
  666. X    vector.y = y;
  667. X    vector.z = z;
  668. X
  669. X    if (VecNormalize(&vector) == 0.)
  670. X        RLerror(RL_WARN, "Degenerate rotation axis.\n");
  671. X
  672. X    sintheta = sin(theta);
  673. X    costheta = cos(theta);
  674. X
  675. X    n1 = vector.x; n2 = vector.y; n3 = vector.z;
  676. X    trans->matrix[0][0] = (Float)(n1*n1 + (1. - n1*n1)*costheta);
  677. X    trans->matrix[0][1] = (Float)(n1*n2*(1 - costheta) + n3*sintheta);
  678. X    trans->matrix[0][2] = (Float)(n1*n3*(1 - costheta) - n2*sintheta);
  679. X    trans->matrix[1][0] = (Float)(n1*n2*(1 - costheta) - n3*sintheta);
  680. X    trans->matrix[1][1] = (Float)(n2*n2 + (1 - n2*n2)*costheta);
  681. X    trans->matrix[1][2] = (Float)(n2*n3*(1 - costheta) + n1*sintheta);
  682. X    trans->matrix[2][0] = (Float)(n1*n3*(1 - costheta) + n2*sintheta);
  683. X    trans->matrix[2][1] = (Float)(n2*n3*(1 - costheta) - n1*sintheta);
  684. X    trans->matrix[2][2] = (Float)(n3*n3 + (1 - n3*n3)*costheta);
  685. X}
  686. END_OF_FILE
  687. if test 2419 -ne `wc -c <'libray/libcommon/rotate.c'`; then
  688.     echo shar: \"'libray/libcommon/rotate.c'\" unpacked with wrong size!
  689. fi
  690. # end of 'libray/libcommon/rotate.c'
  691. fi
  692. if test -f 'libray/libcommon/transform.h' -a "${1}" != "-c" ; then 
  693.   echo shar: Will not clobber existing file \"'libray/libcommon/transform.h'\"
  694. else
  695. echo shar: Extracting \"'libray/libcommon/transform.h'\" \(1857 characters\)
  696. sed "s/^X//" >'libray/libcommon/transform.h' <<'END_OF_FILE'
  697. X/*
  698. X * transform.h
  699. X *
  700. X * Copyright (C) 1989, 1991, Craig E. Kolb
  701. X * All rights reserved.
  702. X *
  703. X * This software may be freely copied, modified, and redistributed
  704. X * provided that this copyright notice is preserved on all copies.
  705. X *
  706. X * You may not distribute this software, in whole or in part, as part of
  707. X * any commercial product without the express consent of the authors.
  708. X *
  709. X * There is no warranty or other guarantee of fitness of this software
  710. X * for any purpose.  It is provided solely "as is".
  711. X *
  712. X * $Id: transform.h,v 4.0 91/07/17 14:32:33 kolb Exp Locker: kolb $
  713. X *
  714. X * $Log:    transform.h,v $
  715. X * Revision 4.0  91/07/17  14:32:33  kolb
  716. X * Initial version.
  717. X * 
  718. X */
  719. X#ifndef TRANSFORM_H
  720. X#define TRANSFORM_H
  721. X
  722. Xtypedef voidstar TransRef;
  723. Xtypedef TransRef TransCreateFunc();
  724. X
  725. X/*
  726. X * Transformation 'matrix'.
  727. X */
  728. Xtypedef struct RSMatrix {
  729. X    Float matrix[3][3];        /* Rotation matrix */
  730. X    Vector translate;        /* Translation */
  731. X} RSMatrix;
  732. X
  733. Xtypedef struct {
  734. X    TransRef    (*create)();        /* Create it... */
  735. X    void        (*propagate)();        /* Propagate changes to parameters */
  736. X} TransMethods;
  737. X
  738. X/* 
  739. X * Transformation structure
  740. X */
  741. Xtypedef struct Trans {
  742. X    TransRef tr;            /* transform data */
  743. X    TransMethods *methods;        /* transform methods */
  744. X    ExprAssoc *assoc;        /* animated parameters */
  745. X    short    animated;        /* is the transformation animated? */
  746. X    RSMatrix trans,        /* object space --> world space */
  747. X         itrans;    /* worldspace --> object space */
  748. X    struct Trans *next, *prev;
  749. X} Trans;
  750. X
  751. Xextern void    MatrixMult(), MatrixCopy(), MatrixInit(), MatrixInvert(),
  752. X        TransCopy(), TransInit(), TransInvert(),
  753. X        TransCompose(),
  754. X        VecTransform(), PointTransform(), NormalTransform();
  755. X
  756. Xextern Trans    *TransCreate();
  757. X
  758. Xextern RSMatrix    *MatrixCreate();
  759. X
  760. Xvoid        RotationMatrix(), TranslationMatrix(),
  761. X        ScaleMatrix(), ArbitraryMatrix(), CoordSysTransform();
  762. Xextern Float    RayTransform();
  763. X
  764. X#endif /* TRANSFORM_H */
  765. END_OF_FILE
  766. if test 1857 -ne `wc -c <'libray/libcommon/transform.h'`; then
  767.     echo shar: \"'libray/libcommon/transform.h'\" unpacked with wrong size!
  768. fi
  769. # end of 'libray/libcommon/transform.h'
  770. fi
  771. if test -f 'libray/libcommon/vector.h' -a "${1}" != "-c" ; then 
  772.   echo shar: Will not clobber existing file \"'libray/libcommon/vector.h'\"
  773. else
  774. echo shar: Extracting \"'libray/libcommon/vector.h'\" \(2301 characters\)
  775. sed "s/^X//" >'libray/libcommon/vector.h' <<'END_OF_FILE'
  776. X/*
  777. X * vector.h
  778. X *
  779. X * Copyright (C) 1989, 1991, Craig E. Kolb
  780. X * All rights reserved.
  781. X *
  782. X * This software may be freely copied, modified, and redistributed
  783. X * provided that this copyright notice is preserved on all copies.
  784. X *
  785. X * You may not distribute this software, in whole or in part, as part of
  786. X * any commercial product without the express consent of the authors.
  787. X *
  788. X * There is no warranty or other guarantee of fitness of this software
  789. X * for any purpose.  It is provided solely "as is".
  790. X *
  791. X * $Id: vector.h,v 4.0 91/07/17 14:33:11 kolb Exp Locker: kolb $
  792. X *
  793. X * $Log:    vector.h,v $
  794. X * Revision 4.0  91/07/17  14:33:11  kolb
  795. X * Initial version.
  796. X * 
  797. X */
  798. X#ifndef VECTOR_H
  799. X#define VECTOR_H
  800. X/*
  801. X * Constants used in projecting onto planes
  802. X */
  803. X#define XNORMAL        (char)0
  804. X#define YNORMAL        (char)1
  805. X#define ZNORMAL        (char)2
  806. X
  807. X/*
  808. X * Minimum vector length
  809. X */
  810. X#define EPSILON        (Float)0.00001
  811. X/*
  812. X * Maximum length
  813. X */
  814. X#define FAR_AWAY        1.0E+14
  815. X
  816. Xtypedef struct {
  817. X    Float u, v;            /* 2D point */
  818. X} Vec2d;
  819. X
  820. Xtypedef struct Vector {
  821. X    Float x, y, z;            /* 3D point */
  822. X} Vector;
  823. X
  824. X/*
  825. X * Linked list of points
  826. X */
  827. Xtypedef struct PointList {
  828. X    Vector    vec;            /* Vector data */
  829. X    struct    PointList *next;    /* Next in list */
  830. X} PointList;
  831. X
  832. X/*
  833. X * Project a point in 3-space to the plane whose normal is indicated by "i."
  834. X */
  835. X#define VecProject(r, p, i)    {switch(i) { \
  836. X                case XNORMAL: \
  837. X                    r.u = (p).y; \
  838. X                    r.v = (p).z; \
  839. X                    break; \
  840. X                case YNORMAL: \
  841. X                    r.u = (p).x; \
  842. X                    r.v = (p).z; \
  843. X                    break; \
  844. X                case ZNORMAL: \
  845. X                    r.u = (p).x; \
  846. X                    r.v = (p).y; \
  847. X                    break; \
  848. X                  } }
  849. X
  850. X#define dotp(a, b)    (((a)->x*(b)->x)+((a)->y*(b)->y)+((a)->z*(b)->z))
  851. X#define VecSub(a,b,r) (r)->x=(a).x-(b).x,(r)->y=(a).y-(b).y,(r)->z=(a).z-(b).z
  852. X#define VecAdd(a,b,r) (r)->x=(a).x+(b).x,(r)->y=(a).y+(b).y,(r)->z=(a).z+(b).z
  853. X#define VecScale(s,a,r)  (r)->x=(s)*(a).x,(r)->y=(s)*(a).y,(r)->z=(s)*(a).z
  854. X#define VecComb(s1,v1,s2,v2,r)    (r)->x = (s1)*(v1).x + (s2)*(v2).x, \
  855. X                 (r)->y = (s1)*(v1).y + (s2)*(v2).y, \
  856. X                 (r)->z = (s1)*(v1).z + (s2)*(v2).z
  857. X#define VecAddScaled(v1,s,v2,r)    (r)->x = (v1).x + (s)*(v2).x, \
  858. X                 (r)->y = (v1).y + (s)*(v2).y, \
  859. X                 (r)->z = (v1).z + (s)*(v2).z
  860. X
  861. Xextern void    VecCross(), VecCoordSys(), MakeBump();
  862. Xextern Float    VecNormCross(), VecNormalize();
  863. Xextern int    Refract();
  864. X
  865. X#endif /* VECTOR_H */
  866. END_OF_FILE
  867. if test 2301 -ne `wc -c <'libray/libcommon/vector.h'`; then
  868.     echo shar: \"'libray/libcommon/vector.h'\" unpacked with wrong size!
  869. fi
  870. # end of 'libray/libcommon/vector.h'
  871. fi
  872. if test -f 'libray/liblight/jittered.c' -a "${1}" != "-c" ; then 
  873.   echo shar: Will not clobber existing file \"'libray/liblight/jittered.c'\"
  874. else
  875. echo shar: Extracting \"'libray/liblight/jittered.c'\" \(1905 characters\)
  876. sed "s/^X//" >'libray/liblight/jittered.c' <<'END_OF_FILE'
  877. X/*
  878. X * jittered.c
  879. X *
  880. X * Copyright (C) 1989, 1991, Craig E. Kolb
  881. X * All rights reserved.
  882. X *
  883. X * This software may be freely copied, modified, and redistributed
  884. X * provided that this copyright notice is preserved on all copies.
  885. X *
  886. X * You may not distribute this software, in whole or in part, as part of
  887. X * any commercial product without the express consent of the authors.
  888. X *
  889. X * There is no warranty or other guarantee of fitness of this software
  890. X * for any purpose.  It is provided solely "as is".
  891. X *
  892. X * $Id: jittered.c,v 4.0 91/07/17 14:34:43 kolb Exp Locker: kolb $
  893. X *
  894. X * $Log:    jittered.c,v $
  895. X * Revision 4.0  91/07/17  14:34:43  kolb
  896. X * Initial version.
  897. X * 
  898. X */
  899. X#include "light.h"
  900. X#include "jittered.h"
  901. X
  902. Xstatic LightMethods *iJitteredMethods = NULL;
  903. X
  904. XJittered *
  905. XJitteredCreate(pos, e1, e2)
  906. XVector *pos, *e1, *e2;
  907. X{
  908. X    Jittered *j;
  909. X
  910. X    j = (Jittered *)share_malloc(sizeof(Jittered));
  911. X
  912. X    j->pos = *pos;
  913. X    j->e1 = *e1;
  914. X    j->e2 = *e2;
  915. X
  916. X    return j;
  917. X}
  918. X
  919. XLightMethods *
  920. XJitteredMethods()
  921. X{
  922. X    if (iJitteredMethods == (LightMethods *)NULL) {
  923. X        iJitteredMethods = LightMethodsCreate();
  924. X        iJitteredMethods->intens = JitteredIntens;
  925. X        iJitteredMethods->dir = JitteredDirection;
  926. X    }
  927. X    return iJitteredMethods;
  928. X}
  929. X
  930. Xint
  931. XJitteredIntens(jit, lcolor, cache, ray, dist, noshadow, color)
  932. XJittered *jit;
  933. XColor *lcolor, *color;
  934. XShadowCache *cache;
  935. XRay *ray;
  936. XFloat dist;
  937. Xint noshadow;
  938. X{
  939. X    return !Shadowed(color, lcolor, cache, ray, dist, noshadow);
  940. X}
  941. X
  942. Xvoid
  943. XJitteredDirection(lp, pos, dir, dist)
  944. XJittered *lp;
  945. XVector *pos, *dir;
  946. XFloat *dist;
  947. X{
  948. X    /*
  949. X     * Choose a location with the area define by corner, e1
  950. X     * and e2 at which this sample will be taken.
  951. X     */
  952. X    VecAddScaled(lp->pos, nrand(), lp->e1, &lp->curpos);
  953. X    VecAddScaled(lp->curpos, nrand(), lp->e2, &lp->curpos);
  954. X    VecSub(lp->curpos, *pos, dir);
  955. X    *dist = VecNormalize(dir);
  956. X}
  957. X
  958. XJitteredMethodRegister(meth)
  959. XUserMethodType meth;
  960. X{
  961. X    if (iJitteredMethods)
  962. X        iJitteredMethods->user = meth;
  963. X}
  964. END_OF_FILE
  965. if test 1905 -ne `wc -c <'libray/liblight/jittered.c'`; then
  966.     echo shar: \"'libray/liblight/jittered.c'\" unpacked with wrong size!
  967. fi
  968. # end of 'libray/liblight/jittered.c'
  969. fi
  970. if test -f 'libray/liblight/light.c' -a "${1}" != "-c" ; then 
  971.   echo shar: Will not clobber existing file \"'libray/liblight/light.c'\"
  972. else
  973. echo shar: Extracting \"'libray/liblight/light.c'\" \(1978 characters\)
  974. sed "s/^X//" >'libray/liblight/light.c' <<'END_OF_FILE'
  975. X/*
  976. X * light.c
  977. X *
  978. X * Copyright (C) 1989, 1991, Craig E. Kolb
  979. X * All rights reserved.
  980. X *
  981. X * This software may be freely copied, modified, and redistributed
  982. X * provided that this copyright notice is preserved on all copies.
  983. X *
  984. X * You may not distribute this software, in whole or in part, as part of
  985. X * any commercial product without the express consent of the authors.
  986. X *
  987. X * There is no warranty or other guarantee of fitness of this software
  988. X * for any purpose.  It is provided solely "as is".
  989. X *
  990. X * $Id: light.c,v 4.0 91/07/17 14:35:01 kolb Exp Locker: kolb $
  991. X *
  992. X * $Log:    light.c,v $
  993. X * Revision 4.0  91/07/17  14:35:01  kolb
  994. X * Initial version.
  995. X * 
  996. X */
  997. X#include "light.h"
  998. X
  999. XLight *
  1000. XLightCreate(light, meth, color)
  1001. XLightRef light;
  1002. XLightMethods *meth;
  1003. XColor *color;
  1004. X{
  1005. X    Light *ltmp;
  1006. X
  1007. X    if (light == (LightRef)NULL || meth == (LightMethods *)NULL)
  1008. X        return (Light *)NULL;
  1009. X
  1010. X    ltmp = (Light *)share_malloc(sizeof(Light));
  1011. X    ltmp->light = light;
  1012. X    ltmp->methods = meth;
  1013. X    ltmp->color = *color;
  1014. X    ltmp->next = (Light *)NULL;
  1015. X    ltmp->cache = (ShadowCache *)NULL;
  1016. X    ltmp->shadow = TRUE;
  1017. X    return ltmp;
  1018. X}
  1019. X
  1020. XLightMethods *
  1021. XLightMethodsCreate()
  1022. X{
  1023. X    return (LightMethods *)share_calloc(1, sizeof(LightMethods));
  1024. X}
  1025. X
  1026. X/*
  1027. X * Compute light color.  Returns FALSE if in full shadow, TRUE otherwise.
  1028. X * Computed light color is stored in 'color'.
  1029. X */
  1030. Xint
  1031. XLightIntens(lp, ray, dist, noshadow, color)
  1032. XLight *lp;
  1033. XRay *ray;
  1034. XFloat dist;
  1035. Xint noshadow;
  1036. XColor *color;
  1037. X{
  1038. X    if (lp->methods->intens)
  1039. X        return (*lp->methods->intens)(lp->light, &lp->color,
  1040. X            lp->cache, ray, dist, noshadow || !lp->shadow, color);
  1041. X    RLerror(RL_ABORT, "Cannot compute light intensity!\n");
  1042. X    return FALSE;
  1043. X}
  1044. X
  1045. X/*
  1046. X * Calculate ray and distance from position to light.
  1047. X */
  1048. Xint
  1049. XLightDirection(lp, objpos, lray, dist)
  1050. XLight *lp;
  1051. XVector *objpos, *lray;
  1052. XFloat *dist;
  1053. X{
  1054. X    if (lp->methods->dir) {
  1055. X        (*lp->methods->dir)(lp->light, objpos, lray, dist);
  1056. X        return TRUE;
  1057. X    } else {
  1058. X        RLerror(RL_ABORT, "Cannot compute light direction!\n");
  1059. X        return FALSE;
  1060. X    }
  1061. X}
  1062. END_OF_FILE
  1063. if test 1978 -ne `wc -c <'libray/liblight/light.c'`; then
  1064.     echo shar: \"'libray/liblight/light.c'\" unpacked with wrong size!
  1065. fi
  1066. # end of 'libray/liblight/light.c'
  1067. fi
  1068. if test -f 'libray/liblight/light.h' -a "${1}" != "-c" ; then 
  1069.   echo shar: Will not clobber existing file \"'libray/liblight/light.h'\"
  1070. else
  1071. echo shar: Extracting \"'libray/liblight/light.h'\" \(2038 characters\)
  1072. sed "s/^X//" >'libray/liblight/light.h' <<'END_OF_FILE'
  1073. X/*
  1074. X * light.h
  1075. X *
  1076. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1077. X * All rights reserved.
  1078. X *
  1079. X * This software may be freely copied, modified, and redistributed
  1080. X * provided that this copyright notice is preserved on all copies.
  1081. X *
  1082. X * You may not distribute this software, in whole or in part, as part of
  1083. X * any commercial product without the express consent of the authors.
  1084. X *
  1085. X * There is no warranty or other guarantee of fitness of this software
  1086. X * for any purpose.  It is provided solely "as is".
  1087. X *
  1088. X * $Id: light.h,v 4.0 91/07/17 14:35:10 kolb Exp Locker: kolb $
  1089. X *
  1090. X * $Log:    light.h,v $
  1091. X * Revision 4.0  91/07/17  14:35:10  kolb
  1092. X * Initial version.
  1093. X * 
  1094. X */
  1095. X#ifndef LIGHT_H
  1096. X#define LIGHT_H
  1097. X
  1098. X#include "libobj/geom.h"
  1099. X
  1100. X#define SHADOW_NONE    001
  1101. X#define SHADOW_TRANSP    002
  1102. X#define SHADOW_CSG    004
  1103. X#define SHADOW_CACHE    010
  1104. X#define SHADOW_BLUR    020
  1105. X
  1106. X#define NOSHADOWS(f)    ((f) & SHADOW_NONE)
  1107. X#define SHADOWTRANSP(f)    ((f) & SHADOW_TRANSP)
  1108. X#define SHADOWCSG(f)    ((f) & SHADOW_CSG)
  1109. X#define SHADOWCACHE(f)    ((f) & SHADOW_CACHE)
  1110. X#define SHADOWBLUR(f)    ((f) & SHADOW_BLUR)
  1111. X
  1112. X#define SHADOW_EPSILON    (4. * EPSILON)
  1113. X
  1114. Xtypedef char * LightRef;
  1115. X
  1116. Xtypedef struct {
  1117. X    struct Geom *obj;    /* Pointer to cached object */
  1118. X    RSMatrix trans;    /* World-to-object transformation */
  1119. X    char dotrans;        /* TRUE if above trans is non-identity */
  1120. X} ShadowCache;
  1121. X
  1122. Xtypedef struct {
  1123. X    int    (*intens)();    /* intensity method */
  1124. X    void    (*dir)(),    /* direction method */
  1125. X        (*user)();    /* user-defined method */
  1126. X} LightMethods;
  1127. X
  1128. Xtypedef struct Light {
  1129. X    Color color;        /* Light source color & intensity */
  1130. X    int shadow;        /* Does light source cast shadows? */
  1131. X    LightRef light;        /* Pointer to light information */
  1132. X    LightMethods *methods;    /* Light source methods */
  1133. X    ShadowCache *cache;    /* Shadow cache, if any */
  1134. X    struct Light *next;    /* Next light in list */
  1135. X} Light;
  1136. X
  1137. Xextern LightMethods    *LightMethodsCreate();
  1138. Xextern Light    *LightCreate();
  1139. Xextern void    LightAllocateCache(), LightAddToDefined();
  1140. Xextern int    LightIntens(), LightDirection();
  1141. Xextern void    ShadowSetOptions(), ShadowStats();
  1142. X
  1143. X#endif /* LIGHT_H */
  1144. END_OF_FILE
  1145. if test 2038 -ne `wc -c <'libray/liblight/light.h'`; then
  1146.     echo shar: \"'libray/liblight/light.h'\" unpacked with wrong size!
  1147. fi
  1148. # end of 'libray/liblight/light.h'
  1149. fi
  1150. if test -f 'libray/libobj/instance.c' -a "${1}" != "-c" ; then 
  1151.   echo shar: Will not clobber existing file \"'libray/libobj/instance.c'\"
  1152. else
  1153. echo shar: Extracting \"'libray/libobj/instance.c'\" \(2473 characters\)
  1154. sed "s/^X//" >'libray/libobj/instance.c' <<'END_OF_FILE'
  1155. X/*
  1156. X * instance.c
  1157. X *
  1158. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1159. X * All rights reserved.
  1160. X *
  1161. X * This software may be freely copied, modified, and redistributed
  1162. X * provided that this copyright notice is preserved on all copies.
  1163. X *
  1164. X * You may not distribute this software, in whole or in part, as part of
  1165. X * any commercial product without the express consent of the authors.
  1166. X *
  1167. X * There is no warranty or other guarantee of fitness of this software
  1168. X * for any purpose.  It is provided solely "as is".
  1169. X *
  1170. X * $Id: instance.c,v 4.0 91/07/17 14:38:26 kolb Exp Locker: kolb $
  1171. X *
  1172. X * $Log:    instance.c,v $
  1173. X * Revision 4.0  91/07/17  14:38:26  kolb
  1174. X * Initial version.
  1175. X * 
  1176. X */
  1177. X#include "geom.h"
  1178. X#include "instance.h"
  1179. X
  1180. Xstatic Methods *iInstanceMethods = NULL;
  1181. Xstatic char instanceName[] = "instance";
  1182. X
  1183. XInstance *
  1184. XInstanceCreate(obj)
  1185. XGeom *obj;
  1186. X{
  1187. X    Instance *inst;
  1188. X
  1189. X    if (obj == (Geom *)NULL) {
  1190. X        RLerror(RL_WARN, "Instance of NULL?\n");
  1191. X        return (Instance *)NULL;
  1192. X    }
  1193. X    inst = (Instance *)share_malloc(sizeof(Instance));
  1194. X    inst->obj = obj;
  1195. X    BoundsCopy(obj->bounds, inst->bounds);
  1196. X    return inst;
  1197. X}
  1198. X
  1199. Xchar *
  1200. XInstanceName()
  1201. X{
  1202. X    return instanceName;
  1203. X}
  1204. X
  1205. X
  1206. X/*
  1207. X * Intersect ray & an instance by calling intersect.
  1208. X */
  1209. Xint
  1210. XInstanceIntersect(inst, ray, hitlist, mindist, maxdist)
  1211. XInstance *inst;
  1212. XRay *ray;
  1213. XHitList *hitlist;
  1214. XFloat mindist, *maxdist;
  1215. X{
  1216. X    return intersect(inst->obj, ray, hitlist, mindist, maxdist);
  1217. X}
  1218. X
  1219. XMethods *
  1220. XInstanceMethods()
  1221. X{
  1222. X    /*
  1223. X     * Instances are special in that there is no
  1224. X     * "convert" method -- when created, they are passed
  1225. X     * a pointer to the object being instantiated.
  1226. X     * This means that you will need to set an instance's
  1227. X     * 'prims' field by hand (e.g., inst->prims = object->prims).
  1228. X     */
  1229. X    if (iInstanceMethods == (Methods *)NULL) {
  1230. X        iInstanceMethods = MethodsCreate();
  1231. X        iInstanceMethods->methods = InstanceMethods;
  1232. X        iInstanceMethods->create = (GeomCreateFunc *)InstanceCreate;
  1233. X        iInstanceMethods->name = InstanceName;
  1234. X        iInstanceMethods->intersect = InstanceIntersect;
  1235. X        iInstanceMethods->bounds = InstanceBounds;
  1236. X        iInstanceMethods->convert = (voidstar)NULL;
  1237. X        iInstanceMethods->checkbounds = FALSE;
  1238. X        iInstanceMethods->closed = TRUE;
  1239. X    }
  1240. X    return iInstanceMethods;
  1241. X}
  1242. X
  1243. Xvoid
  1244. XInstanceBounds(inst, bounds)
  1245. XInstance *inst;
  1246. XFloat bounds[2][3];
  1247. X{
  1248. X    GeomComputeBounds(inst->obj);
  1249. X    BoundsCopy(inst->obj->bounds, inst->bounds);
  1250. X    BoundsCopy(inst->bounds, bounds);
  1251. X}
  1252. X
  1253. Xvoid
  1254. XInstanceMethodRegister(meth)
  1255. XUserMethodType meth;
  1256. X{
  1257. X    if (iInstanceMethods)
  1258. X        iInstanceMethods->user = meth;
  1259. X}
  1260. END_OF_FILE
  1261. if test 2473 -ne `wc -c <'libray/libobj/instance.c'`; then
  1262.     echo shar: \"'libray/libobj/instance.c'\" unpacked with wrong size!
  1263. fi
  1264. # end of 'libray/libobj/instance.c'
  1265. fi
  1266. if test -f 'libray/libsurf/atmosphere.c' -a "${1}" != "-c" ; then 
  1267.   echo shar: Will not clobber existing file \"'libray/libsurf/atmosphere.c'\"
  1268. else
  1269. echo shar: Extracting \"'libray/libsurf/atmosphere.c'\" \(1801 characters\)
  1270. sed "s/^X//" >'libray/libsurf/atmosphere.c' <<'END_OF_FILE'
  1271. X/*
  1272. X * atmosphere.c
  1273. X *
  1274. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1275. X * All rights reserved.
  1276. X *
  1277. X * This software may be freely copied, modified, and redistributed
  1278. X * provided that this copyright notice is preserved on all copies.
  1279. X *
  1280. X * You may not distribute this software, in whole or in part, as part of
  1281. X * any commercial product without the express consent of the authors.
  1282. X *
  1283. X * There is no warranty or other guarantee of fitness of this software
  1284. X * for any purpose.  It is provided solely "as is".
  1285. X *
  1286. X * $Id: atmosphere.c,v 4.0 91/07/17 14:40:02 kolb Exp Locker: kolb $
  1287. X *
  1288. X * $Log:    atmosphere.c,v $
  1289. X * Revision 4.0  91/07/17  14:40:02  kolb
  1290. X * Initial version.
  1291. X * 
  1292. X */
  1293. X#include "atmosphere.h"
  1294. X
  1295. XAtmosphere *
  1296. XAtmosCreate(data, method)
  1297. Xchar *data;
  1298. Xvoid (*method)();
  1299. X{
  1300. X    Atmosphere *ef;
  1301. X
  1302. X    ef = (Atmosphere *)Malloc(sizeof(Atmosphere));
  1303. X    ef->data = data;
  1304. X    ef->method = method;
  1305. X    ef->next = (Atmosphere *)0;
  1306. X    return ef;
  1307. X}
  1308. X
  1309. XAtmosphere *
  1310. XAtmosphereCopy(atmos)
  1311. XAtmosphere *atmos;
  1312. X{
  1313. X    Atmosphere *res;
  1314. X
  1315. X    if (atmos == (Atmosphere *)NULL)
  1316. X        return (Atmosphere *)NULL;
  1317. X    res = AtmosCreate(atmos->data, atmos->method);
  1318. X    res->next = AtmosphereCopy(atmos->next);
  1319. X    return res;
  1320. X}
  1321. X
  1322. XMedium *
  1323. XMediumPush(index, statten, media)
  1324. XFloat index, statten;
  1325. XMedium *media;
  1326. X{
  1327. X    Medium *new;
  1328. X
  1329. X    new = (Medium *)Malloc(sizeof(Medium));
  1330. X    new->index = index;
  1331. X    new->statten = statten;
  1332. X    new->next = media;
  1333. X
  1334. X    return new;
  1335. X}
  1336. X
  1337. Xvoid
  1338. XAtmospherics(effects, ray, dist, pos, color)
  1339. XAtmosphere *effects;
  1340. XRay *ray;
  1341. XFloat dist;
  1342. XVector *pos;
  1343. XColor *color;
  1344. X{
  1345. X    Atmosphere *etmp;
  1346. X
  1347. X    for (etmp = effects; etmp; etmp = etmp->next)
  1348. X        (*etmp->method)(etmp->data, ray, pos, dist, color);
  1349. X}
  1350. X
  1351. XFloat
  1352. XExpAtten(dist, trans)
  1353. XFloat dist, trans;
  1354. X{
  1355. X    Float atten;
  1356. X
  1357. X    if (trans < EPSILON)
  1358. X        return 0.;
  1359. X    atten = LNHALF * dist / trans;
  1360. X    return (atten < -10. ? 0. : exp(atten));
  1361. X}
  1362. END_OF_FILE
  1363. if test 1801 -ne `wc -c <'libray/libsurf/atmosphere.c'`; then
  1364.     echo shar: \"'libray/libsurf/atmosphere.c'\" unpacked with wrong size!
  1365. fi
  1366. # end of 'libray/libsurf/atmosphere.c'
  1367. fi
  1368. if test -f 'libray/libsurf/surface.h' -a "${1}" != "-c" ; then 
  1369.   echo shar: Will not clobber existing file \"'libray/libsurf/surface.h'\"
  1370. else
  1371. echo shar: Extracting \"'libray/libsurf/surface.h'\" \(1924 characters\)
  1372. sed "s/^X//" >'libray/libsurf/surface.h' <<'END_OF_FILE'
  1373. X/*
  1374. X * surface.h
  1375. X *
  1376. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1377. X * All rights reserved.
  1378. X *
  1379. X * This software may be freely copied, modified, and redistributed
  1380. X * provided that this copyright notice is preserved on all copies.
  1381. X *
  1382. X * You may not distribute this software, in whole or in part, as part of
  1383. X * any commercial product without the express consent of the authors.
  1384. X *
  1385. X * There is no warranty or other guarantee of fitness of this software
  1386. X * for any purpose.  It is provided solely "as is".
  1387. X *
  1388. X * $Id: surface.h,v 4.0 91/07/17 14:41:02 kolb Exp Locker: kolb $
  1389. X *
  1390. X * $Log:    surface.h,v $
  1391. X * Revision 4.0  91/07/17  14:41:02  kolb
  1392. X * Initial version.
  1393. X * 
  1394. X */
  1395. X#ifndef SURFACE_H
  1396. X#define SURFACE_H
  1397. X
  1398. X#define DEFAULT_INDEX        1.0    /* Default index of refraction */
  1399. X#define DEFAULT_PHONGPOW    15.0    /* Default specular highlight exp */
  1400. X
  1401. X/*
  1402. X * Surface definition.
  1403. X */
  1404. Xtypedef struct Surface {
  1405. X    char    *name;            /* Name */
  1406. X    struct Color    amb,        /* Ambient 'curve' */
  1407. X            diff,        /* Diffuse reflection 'curve' */
  1408. X            spec,        /* Specular reflection 'curve' */
  1409. X            translu,    /* Diffuse transmission 'curve' */
  1410. X            body;        /* Specular transmission 'curve' */
  1411. X    Float    srexp,            /* Specular reflection exponent */
  1412. X        stexp,            /* Specular transmission exponent */
  1413. X        statten,        /* Specular transmission attenuation */
  1414. X        index,            /* Index of refraction */
  1415. X        reflect,        /* Specular reflectivity */
  1416. X        transp,            /* Specular transmittance */
  1417. X        translucency;        /* Diffuse transmittance */ 
  1418. X    char    noshadow;        /* No shadowing? */
  1419. X    struct Surface *next;        /* Next surface in list (if any) */
  1420. X} Surface;
  1421. X
  1422. X/*
  1423. X * Linked list of (linked list of) surfaces.
  1424. X */
  1425. Xtypedef struct SurfList {
  1426. X    Surface *surf;
  1427. X    struct SurfList *next;
  1428. X} SurfList;
  1429. X
  1430. Xextern Surface    *SurfaceCreate(),
  1431. X        *GetShadingSurf(),    /* application-provided */
  1432. X        *SurfaceCopy();
  1433. X
  1434. Xextern SurfList    *SurfPop(), *SurfPush();
  1435. X
  1436. Xextern void    SurfaceBlend(), ColorBlend();
  1437. X
  1438. Xextern int    ComputeSurfProps();
  1439. X
  1440. X#endif /* SURFACE_H */
  1441. END_OF_FILE
  1442. if test 1924 -ne `wc -c <'libray/libsurf/surface.h'`; then
  1443.     echo shar: \"'libray/libsurf/surface.h'\" unpacked with wrong size!
  1444. fi
  1445. # end of 'libray/libsurf/surface.h'
  1446. fi
  1447. if test -f 'libray/libtext/fbm.c' -a "${1}" != "-c" ; then 
  1448.   echo shar: Will not clobber existing file \"'libray/libtext/fbm.c'\"
  1449. else
  1450. echo shar: Extracting \"'libray/libtext/fbm.c'\" \(1951 characters\)
  1451. sed "s/^X//" >'libray/libtext/fbm.c' <<'END_OF_FILE'
  1452. X/*
  1453. X * fbm.c
  1454. X *
  1455. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1456. X * All rights reserved.
  1457. X *
  1458. X * This software may be freely copied, modified, and redistributed
  1459. X * provided that this copyright notice is preserved on all copies.
  1460. X *
  1461. X * You may not distribute this software, in whole or in part, as part of
  1462. X * any commercial product without the express consent of the authors.
  1463. X *
  1464. X * There is no warranty or other guarantee of fitness of this software
  1465. X * for any purpose.  It is provided solely "as is".
  1466. X *
  1467. X * $Id: fbm.c,v 4.0 91/07/17 14:42:06 kolb Exp Locker: kolb $
  1468. X *
  1469. X * $Log:    fbm.c,v $
  1470. X * Revision 4.0  91/07/17  14:42:06  kolb
  1471. X * Initial version.
  1472. X * 
  1473. X */
  1474. X#include "texture.h"
  1475. X#include "fbm.h"
  1476. X
  1477. XFBm *
  1478. XFBmCreate(offset, scale, h, lambda, octaves, thresh, mapname)
  1479. XFloat h, lambda, scale, offset, thresh;
  1480. Xint octaves;
  1481. Xchar *mapname;
  1482. X{
  1483. X    FBm *fbm;
  1484. X
  1485. X    fbm = (FBm *)Malloc(sizeof(FBm));
  1486. X
  1487. X    fbm->beta = 1. + 2*h;
  1488. X    fbm->omega = pow(lambda, -0.5*fbm->beta);
  1489. X    fbm->lambda = lambda;
  1490. X    fbm->scale = scale;
  1491. X    fbm->offset = offset;
  1492. X    fbm->thresh = thresh;
  1493. X    fbm->octaves = octaves;
  1494. X    if (mapname != (char *)NULL)
  1495. X        fbm->colormap = ColormapRead(mapname);
  1496. X    else
  1497. X        fbm->colormap = (Color *)NULL;
  1498. X    return fbm;
  1499. X}
  1500. X
  1501. Xvoid
  1502. XFBmApply(fbm, prim, ray, pos, norm, gnorm, surf)
  1503. XFBm *fbm;
  1504. XGeom *prim;
  1505. XRay *ray;
  1506. XVector *pos, *norm, *gnorm;
  1507. XSurface *surf;
  1508. X{
  1509. X    Float val;
  1510. X    int index;
  1511. X
  1512. X    val = fBm(pos, fbm->omega, fbm->lambda, fbm->octaves);
  1513. X    if (val < fbm->thresh)
  1514. X        val = fbm->offset;
  1515. X    else
  1516. X        val = fbm->offset + fbm->scale*(val - fbm->thresh);
  1517. X    if (fbm->colormap) {
  1518. X        index = 255. * val;
  1519. X        if (index > 255) index = 255;
  1520. X        if (index < 0) index = 0;
  1521. X        surf->diff.r *= fbm->colormap[index].r;
  1522. X        surf->diff.g *= fbm->colormap[index].g;
  1523. X        surf->diff.b *= fbm->colormap[index].b;
  1524. X        surf->amb.r *= fbm->colormap[index].r;
  1525. X        surf->amb.g *= fbm->colormap[index].g;
  1526. X        surf->amb.b *= fbm->colormap[index].b;
  1527. X    } else {
  1528. X        ColorScale(val, surf->diff, &surf->diff);
  1529. X        ColorScale(val, surf->amb, &surf->amb);
  1530. X    }
  1531. X}
  1532. END_OF_FILE
  1533. if test 1951 -ne `wc -c <'libray/libtext/fbm.c'`; then
  1534.     echo shar: \"'libray/libtext/fbm.c'\" unpacked with wrong size!
  1535. fi
  1536. # end of 'libray/libtext/fbm.c'
  1537. fi
  1538. if test -f 'libray/libtext/texture.h' -a "${1}" != "-c" ; then 
  1539.   echo shar: Will not clobber existing file \"'libray/libtext/texture.h'\"
  1540. else
  1541. echo shar: Extracting \"'libray/libtext/texture.h'\" \(2381 characters\)
  1542. sed "s/^X//" >'libray/libtext/texture.h' <<'END_OF_FILE'
  1543. X/*
  1544. X * texture.h
  1545. X *
  1546. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1547. X * All rights reserved.
  1548. X *
  1549. X * This software may be freely copied, modified, and redistributed
  1550. X * provided that this copyright notice is preserved on all copies.
  1551. X *
  1552. X * You may not distribute this software, in whole or in part, as part of
  1553. X * any commercial product without the express consent of the authors.
  1554. X *
  1555. X * There is no warranty or other guarantee of fitness of this software
  1556. X * for any purpose.  It is provided solely "as is".
  1557. X *
  1558. X * $Id: texture.h,v 4.0 91/07/17 14:44:19 kolb Exp Locker: kolb $
  1559. X *
  1560. X * $Log:    texture.h,v $
  1561. X * Revision 4.0  91/07/17  14:44:19  kolb
  1562. X * Initial version.
  1563. X * 
  1564. X */
  1565. X#ifndef TEXTURE_H
  1566. X#define TEXTURE_H
  1567. X
  1568. X#include "libobj/geom.h"
  1569. X#include "libsurf/surface.h"
  1570. X#include "mapping.h"
  1571. X
  1572. X/*
  1573. X * Surface properties
  1574. X */
  1575. X#define COLOR        0    /* AMBIENT, DIFFUSE, SPECULAR and BODY */
  1576. X#define AMBIENT        1
  1577. X#define DIFFUSE        2
  1578. X#define SPECULAR    3
  1579. X#define BODY        4
  1580. X#define REFLECT        5
  1581. X#define TRANSP        6
  1582. X#define SPECPOW        7
  1583. X#define BUMP        8
  1584. X#define INDEX        9
  1585. X
  1586. X#define TextPointToModel(p)    PointTransform(p, &model2text.itrans)
  1587. X#define TextPointToPrim(p)    PointTransform(p, &prim2text.itrans)
  1588. X#define TextPointToWorld(p)    PointTransform(p, &world2text.itrans)
  1589. X#define TextRayToModel(p)    RayTransform(r, &model2text.itrans)
  1590. X#define TextRayToPrim(r)    RayTransform(r, &prim2text.itrans)
  1591. X#define TextRayToWorld(r)    RayTransform(r, &world2text.itrans)
  1592. X#define TextNormToModel(n)    NormalTransform(n, &model2text.trans)
  1593. X#define TextNormToPrim(n)    NormalTransform(n, &prim2text.trans)
  1594. X#define TextNormToWorld(n)    NormalTransform(n, &world2text.trans)
  1595. X
  1596. X#define ModelPointToText(p)    PointTransform(p, &model2text.trans)
  1597. X#define ModelNormToText(n)    NormalTransform(n, &model2text.itrans)
  1598. X#define ModelRayToText(r)    RayTransform(r, &model2text.trans)
  1599. X
  1600. Xtypedef char *TextRef;
  1601. X
  1602. X/*
  1603. X * Texture structure
  1604. X */
  1605. Xtypedef struct Texture {
  1606. X    TextRef data;            /* Texturing info */
  1607. X    void    (*method)();        /* method */
  1608. X    Trans    *trans;            /* transformation info */
  1609. X    short    animtrans;        /* is the transformation animated? */
  1610. X    struct Texture *next;        /* next in list */
  1611. X} Texture;
  1612. X
  1613. Xextern Texture    *TextCreate(), *TextAppend();
  1614. Xextern void    DNoise3(), VfBm(), TextApply(), MakeBump(), Wrinkled();
  1615. Xextern Float    Noise3(), Noise2(), Chaos(), Marble(), fBm();
  1616. Xextern int    TileValue();
  1617. XColor        *ColormapRead();
  1618. X
  1619. Xextern Trans    model2text, prim2text, world2text;
  1620. X
  1621. X#endif TEXTURE_H
  1622. END_OF_FILE
  1623. if test 2381 -ne `wc -c <'libray/libtext/texture.h'`; then
  1624.     echo shar: \"'libray/libtext/texture.h'\" unpacked with wrong size!
  1625. fi
  1626. # end of 'libray/libtext/texture.h'
  1627. fi
  1628. if test -f 'libray/libtext/wood.c' -a "${1}" != "-c" ; then 
  1629.   echo shar: Will not clobber existing file \"'libray/libtext/wood.c'\"
  1630. else
  1631. echo shar: Extracting \"'libray/libtext/wood.c'\" \(1805 characters\)
  1632. sed "s/^X//" >'libray/libtext/wood.c' <<'END_OF_FILE'
  1633. X/*
  1634. X * wood.c
  1635. X *
  1636. X * Copyright (C) 1989, 1991, Craig E. Kolb, Robert F. Skinner
  1637. X * All rights reserved.
  1638. X *
  1639. X * This software may be freely copied, modified, and redistributed
  1640. X * provided that this copyright notice is preserved on all copies.
  1641. X *
  1642. X * You may not distribute this software, in whole or in part, as part of
  1643. X * any commercial product without the express consent of the authors.
  1644. X *
  1645. X * There is no warranty or other guarantee of fitness of this software
  1646. X * for any purpose.  It is provided solely "as is".
  1647. X *
  1648. X * $Id: wood.c,v 4.0 91/07/17 14:44:35 kolb Exp Locker: kolb $
  1649. X *
  1650. X * $Log:    wood.c,v $
  1651. X * Revision 4.0  91/07/17  14:44:35  kolb
  1652. X * Initial version.
  1653. X * 
  1654. X */
  1655. X#include "texture.h"
  1656. X#include "wood.h"
  1657. X
  1658. XWood *
  1659. XWoodCreate()
  1660. X{
  1661. X    return (Wood *)NULL;    /* No data associated with wood texture */
  1662. X}
  1663. X
  1664. X/*ARGSUSED*/
  1665. Xvoid
  1666. XWoodApply(wood, prim, ray, pos, norm, gnorm, surf)
  1667. XWood *wood;
  1668. XGeom *prim;
  1669. XRay *ray;
  1670. XVector *pos, *norm, *gnorm;
  1671. XSurface *surf;
  1672. X{
  1673. X    Float red, grn, blu;
  1674. X    Float chaos, brownLayer, greenLayer;
  1675. X    Float perturb, brownPerturb, greenPerturb, grnPerturb;
  1676. X    Float t;
  1677. X
  1678. X    chaos = Chaos(pos, 7);
  1679. X    t = sin(sin(8.*chaos + 7*pos->x +3.*pos->y));
  1680. X
  1681. X    greenLayer = brownLayer = fabs(t);
  1682. X
  1683. X    perturb = sin(40.*chaos + 50.*pos->z);
  1684. X    perturb = fabs(perturb);
  1685. X
  1686. X    brownPerturb = .6*perturb + 0.3;
  1687. X    greenPerturb = .2*perturb + 0.8;
  1688. X    grnPerturb = .15*perturb + 0.85;
  1689. X    grn = 0.5 * pow(fabs(brownLayer), 0.3);
  1690. X    brownLayer = pow(0.5 * (brownLayer+1.0), 0.6) * brownPerturb;
  1691. X    greenLayer = pow(0.5 * (greenLayer+1.0), 0.6) * greenPerturb;
  1692. X
  1693. X    red = (0.5*brownLayer + 0.35*greenLayer)*2.*grn;
  1694. X    blu = (0.25*brownLayer + 0.35*greenLayer)*2.0*grn;
  1695. X    grn *= max(brownLayer, greenLayer) * grnPerturb;
  1696. X
  1697. X    surf->diff.r *= red;
  1698. X    surf->diff.g *= grn;
  1699. X    surf->diff.b *= blu;
  1700. X    surf->amb.r *= red;
  1701. X    surf->amb.g *= grn;
  1702. X    surf->amb.b *= blu;
  1703. X}
  1704. END_OF_FILE
  1705. if test 1805 -ne `wc -c <'libray/libtext/wood.c'`; then
  1706.     echo shar: \"'libray/libtext/wood.c'\" unpacked with wrong size!
  1707. fi
  1708. # end of 'libray/libtext/wood.c'
  1709. fi
  1710. if test -f 'libshade/objdef.c' -a "${1}" != "-c" ; then 
  1711.   echo shar: Will not clobber existing file \"'libshade/objdef.c'\"
  1712. else
  1713. echo shar: Extracting \"'libshade/objdef.c'\" \(2418 characters\)
  1714. sed "s/^X//" >'libshade/objdef.c' <<'END_OF_FILE'
  1715. X/*
  1716. X * objdef.c
  1717. X *
  1718. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1719. X * All rights reserved.
  1720. X *
  1721. X * This software may be freely copied, modified, and redistributed
  1722. X * provided that this copyright notice is preserved on all copies.
  1723. X *
  1724. X * You may not distribute this software, in whole or in part, as part of
  1725. X * any commercial product without the express consent of the authors.
  1726. X *
  1727. X * There is no warranty or other guarantee of fitness of this software
  1728. X * for any purpose.  It is provided solely "as is".
  1729. X *
  1730. X * $Id: objdef.c,v 4.0 91/07/17 14:46:38 kolb Exp Locker: kolb $
  1731. X *
  1732. X * $Log:    objdef.c,v $
  1733. X * Revision 4.0  91/07/17  14:46:38  kolb
  1734. X * Initial version.
  1735. X * 
  1736. X */
  1737. X
  1738. X#include "rayshade.h"
  1739. X#include "options.h"
  1740. X#include "stats.h"
  1741. X
  1742. Xstatic Geom *Objects = NULL;        /* named objects */
  1743. XGeom *World;                /* top-level object */
  1744. X
  1745. X
  1746. X/*
  1747. X * Return pointer to named object, NULL if no such object has been defined.
  1748. X */
  1749. XGeom *
  1750. XGeomGetNamed(name)
  1751. Xchar *name;
  1752. X{
  1753. X    Geom *otmp;
  1754. X    for (otmp = Objects; otmp; otmp = otmp->next)
  1755. X        if (strcmp(name, otmp->name) == 0)
  1756. X            return otmp;
  1757. X    return (Geom *)NULL;
  1758. X}
  1759. X
  1760. X/*
  1761. X * Add object to list of defined objects.  At this point, the object has
  1762. X * been converted to the correct type, and obj->next is either NULL or
  1763. X * garbage.
  1764. X */
  1765. Xvoid
  1766. XGeomAddToDefined(obj)
  1767. XGeom *obj;
  1768. X{
  1769. X    obj->next = Objects;
  1770. X    Objects = obj;
  1771. X    if (Options.verbose)
  1772. X        AggregatePrintInfo(obj, Stats.fstats);
  1773. X    else
  1774. X        AggregatePrintInfo(obj, (FILE *)NULL);
  1775. X}
  1776. X
  1777. X/*
  1778. X * Return a copy of the named object.
  1779. X */
  1780. XGeom *
  1781. XGeomCopyNamed(name)
  1782. Xchar *name;
  1783. X{
  1784. X    Geom *child;
  1785. X
  1786. X    child = GeomGetNamed(name);
  1787. X    if (child == (Geom *)NULL)
  1788. X        RLerror(RL_PANIC, "There is no object named \"%s\".", name);
  1789. X    child = GeomCopy(child);
  1790. X    return child;
  1791. X}
  1792. X
  1793. Xvoid
  1794. XWorldSetup()
  1795. X{
  1796. X    extern GeomList *Defstack;
  1797. X
  1798. X    /*
  1799. X     * Define World object, if not done previously.
  1800. X     */
  1801. X    if (World == (Geom *)NULL) {
  1802. X        World = Defstack->obj;    /* World is topmost object on stack */
  1803. X        if (Defstack->next)
  1804. X            RLerror(RL_ABORT, "Geom def stack is screwey.\n");
  1805. X        World->prims = AggregateConvert(World, World->next);
  1806. X    }
  1807. X
  1808. X    GeomComputeBounds(World);
  1809. X
  1810. X    /*
  1811. X     * Complain if there are no primitives to be rendered.
  1812. X     */
  1813. X    if (World->prims == 0) {
  1814. X        RLerror(RL_PANIC, "Nothing to be rendered.\n");
  1815. X    }
  1816. X}
  1817. X
  1818. X/*
  1819. X * Main ray-spwaning routine required by libray
  1820. X */
  1821. Xint
  1822. XTraceRay(ray, hitlist, mindist, maxdist)
  1823. XRay *ray;
  1824. XHitList *hitlist;
  1825. XFloat mindist, *maxdist;
  1826. X{
  1827. X    return intersect(World, ray, hitlist, mindist, maxdist);
  1828. X}
  1829. END_OF_FILE
  1830. if test 2418 -ne `wc -c <'libshade/objdef.c'`; then
  1831.     echo shar: \"'libshade/objdef.c'\" unpacked with wrong size!
  1832. fi
  1833. # end of 'libshade/objdef.c'
  1834. fi
  1835. if test -f 'rayshade/main.c' -a "${1}" != "-c" ; then 
  1836.   echo shar: Will not clobber existing file \"'rayshade/main.c'\"
  1837. else
  1838. echo shar: Extracting \"'rayshade/main.c'\" \(2468 characters\)
  1839. sed "s/^X//" >'rayshade/main.c' <<'END_OF_FILE'
  1840. X/*
  1841. X * main.c
  1842. X *
  1843. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1844. X * All rights reserved.
  1845. X *
  1846. X * This software may be freely copied, modified, and redistributed
  1847. X * provided that this copyright notice is preserved on all copies.
  1848. X *
  1849. X * You may not distribute this software, in whole or in part, as part of
  1850. X * any commercial product without the express consent of the authors.
  1851. X *
  1852. X * There is no warranty or other guarantee of fitness of this software
  1853. X * for any purpose.  It is provided solely "as is".
  1854. X *
  1855. X * $Id: main.c,v 4.0 91/07/17 14:50:39 kolb Exp Locker: kolb $
  1856. X *
  1857. X * $Log:    main.c,v $
  1858. X * Revision 4.0  91/07/17  14:50:39  kolb
  1859. X * Initial version.
  1860. X * 
  1861. X */
  1862. X
  1863. Xchar rcsid[] = "$Id: main.c,v 4.0 91/07/17 14:50:39 kolb Exp Locker: kolb $";
  1864. X
  1865. X#include "rayshade.h"
  1866. X#include "options.h"
  1867. X#include "stats.h"
  1868. X#include "viewing.h"
  1869. X#include "picture.h"
  1870. X
  1871. Xint
  1872. X#ifdef LINDA
  1873. Xrayshade_main(argc, argv)
  1874. X#else
  1875. Xmain(argc, argv)
  1876. X#endif
  1877. Xint argc;
  1878. Xchar **argv;
  1879. X{
  1880. X    Float utime, stime, lasttime;
  1881. X    int i;
  1882. X    extern Geom *World;
  1883. X
  1884. X#ifdef LINDA
  1885. X    Options.workernum = 0;    /* we're the supervisor */
  1886. X#endif
  1887. X
  1888. X    RSInitialize(argc, argv);
  1889. X
  1890. X
  1891. X    /*
  1892. X     * Start the first frame.
  1893. X     */
  1894. X    RSStartFrame(Options.startframe);
  1895. X    /*
  1896. X      * Print more information than we'll ever need to know...
  1897. X     */
  1898. X    if (Options.verbose) {
  1899. X        /* World object info. */
  1900. X        AggregatePrintInfo(World, Stats.fstats);
  1901. X        /* Print info about rendering options and the like. */
  1902. X        RSOptionsList();
  1903. X    }
  1904. X    /*
  1905. X     * Start new picture.
  1906. X     */
  1907. X    PictureStart(argv);
  1908. X    /*
  1909. X     * Print preprocessing time.
  1910. X     */
  1911. X    RSGetCpuTime(&utime, &stime);
  1912. X    fprintf(Stats.fstats,"Preprocessing time:\t");
  1913. X    fprintf(Stats.fstats,"%2.2fu  %2.2fs\n", utime, stime);
  1914. X    fprintf(Stats.fstats,"Starting trace.\n");
  1915. X    (void)fflush(Stats.fstats);
  1916. X    lasttime = utime+stime;
  1917. X    /*
  1918. X     * Render the first frame
  1919. X     */
  1920. X    raytrace(argc, argv);
  1921. X    /*
  1922. X     * Render the remaining frames.
  1923. X     */
  1924. X    for (i = Options.startframe +1; i <= Options.endframe ; i++) {
  1925. X        PictureFrameEnd();    /* End the previous frame */
  1926. X        RSGetCpuTime(&utime, &stime);
  1927. X        fprintf(Stats.fstats, "Total CPU time for frame %d: %2.2f \n", 
  1928. X            i - 1, utime+stime - lasttime);
  1929. X        PrintMemoryStats(Stats.fstats);
  1930. X        (void)fflush(Stats.fstats);
  1931. X        lasttime = utime+stime;
  1932. X        RSStartFrame(i);
  1933. X        if (Options.verbose) {
  1934. X            AggregatePrintInfo(World, Stats.fstats);
  1935. X            (void)fflush(Stats.fstats);
  1936. X        }
  1937. X        PictureStart(argv);
  1938. X        raytrace(argc, argv);
  1939. X    }
  1940. X    /*
  1941. X     * Close the image file.
  1942. X     */
  1943. X    PictureFrameEnd();    /* End the last frame */
  1944. X    PictureEnd();
  1945. X    StatsPrint();
  1946. X    return 0;
  1947. X}
  1948. END_OF_FILE
  1949. if test 2468 -ne `wc -c <'rayshade/main.c'`; then
  1950.     echo shar: \"'rayshade/main.c'\" unpacked with wrong size!
  1951. fi
  1952. # end of 'rayshade/main.c'
  1953. fi
  1954. echo shar: End of archive 5 \(of 19\).
  1955. cp /dev/null ark5isdone
  1956. MISSING=""
  1957. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
  1958.     if test ! -f ark${I}isdone ; then
  1959.     MISSING="${MISSING} ${I}"
  1960.     fi
  1961. done
  1962. if test "${MISSING}" = "" ; then
  1963.     echo You have unpacked all 19 archives.
  1964.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1965. else
  1966.     echo You still need to unpack the following archives:
  1967.     echo "        " ${MISSING}
  1968. fi
  1969. ##  End of shell archive.
  1970. exit 0
  1971.  
  1972. exit 0 # Just in case...
  1973.