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

  1. Newsgroups: comp.sources.misc
  2. From: Rayshade Construction Co. <rayshade@weedeater.math.YALE.EDU>
  3. Subject:  v21i009:  rayshade - A raytracing package for UNIX, Part06/19
  4. Message-ID: <1991Jul20.043456.11477@sparky.IMD.Sterling.COM>
  5. X-Md4-Signature: 9460758b6d1b7446ee76a8e036ff510a
  6. Date: Sat, 20 Jul 1991 04:34:56 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 9
  11. Archive-name: rayshade/part06
  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 6 (of 19)."
  21. # Contents:  Doc/Guide/intro.tex Examples/planet.map
  22. #   libray/liblight/extended.c libray/libobj/hf.h libray/libobj/list.c
  23. #   libray/libobj/plane.c libray/libsurf/fogdeck.c
  24. #   libray/libtext/cloud.c libray/libtext/stripe.c
  25. #   libshade/Makefile.SH libshade/surfdef.c raypaint/Makefile.SH
  26. #   raypaint/glgraphics.c raypaint/main.c rayshade/Makefile.SH
  27. #   rayview/Makefile.SH
  28. # Wrapped by kolb@woody on Wed Jul 17 17:56:45 1991
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. if test -f 'Doc/Guide/intro.tex' -a "${1}" != "-c" ; then 
  31.   echo shar: Will not clobber existing file \"'Doc/Guide/intro.tex'\"
  32. else
  33. echo shar: Extracting \"'Doc/Guide/intro.tex'\" \(2585 characters\)
  34. sed "s/^X//" >'Doc/Guide/intro.tex' <<'END_OF_FILE'
  35. X\chapter{Introduction}
  36. X\pagenumbering{arabic}
  37. X
  38. XThis document describes \rayshade in enough detail to enable
  39. Xthe technical-minded to
  40. Xsit down and render some images.  In its current form,
  41. Xit is truly a draft, and even then
  42. Xmore of a reference manual than a proper user's guide.
  43. X
  44. XThis document does not provide any kind of thorough introduction
  45. Xto the basics of computer graphics or ray tracing.
  46. XThere are many other excellent sources for this kind of information.
  47. XThe technical and coding details of \rayshade and
  48. Xits libraries will be documented elsewhere.
  49. X
  50. X\section{Getting Started}
  51. X
  52. XThe best way to learn how to use \rayshade is to dive right in and
  53. Xstart making pictures.  Study the example
  54. Xinput files that are packaged with {\em rayshade}.  Run them through
  55. Xrayshade to see what the images they produce look like.
  56. XChange the input files; move the camera,
  57. Xchange the field of view, modify surface properties, and see what differences
  58. Xyour changes make, all the while referring to the appropriate portions
  59. Xof this document.  Browse through the individual chapters
  60. Xto see what \rayshade can and cannot do.  The \rayshade quick reference
  61. Xguide may also help you sort out syntactical nasties.
  62. X
  63. XThroughout this text, the {\tt typewriter} type style is used to indicate
  64. Xkeywords and other items that should be passed
  65. Xdirectly {\em rayshade}.  Where appropriate,
  66. Xitems in an {\em italic\/} style indicate
  67. Xplaces where you should provide an appropriate number or string.
  68. X
  69. XVectors, which consist of three numerical values, are indicated by
  70. Xan arrow over a name written in italic type style, e.g., \evec{vector}.
  71. XItems enclosed between {\tt [} and {\tt ]} characters indicate
  72. Xthat specifying those items is optional.
  73. XComplex constructions that are
  74. Xdescribed elsewhere in the text, such as surface or object specification,
  75. Xare denoted by enclosing descriptive text between 
  76. X{\tt $<$} and {\tt $>$} characters.
  77. X
  78. X\section{A Simple Example}
  79. X
  80. XBecause \rayshade provides a default camera description, surface properties,
  81. Xand a default light
  82. Xsource, it is easy to construct short input files that allow you to
  83. Xexperiment with objects, textures, and transformations.
  84. XIf you haven't already run \rayshade on one of the example input files,
  85. Xyou might want to try producing an image using the following input:
  86. X
  87. X\begin{verbatim}
  88. X   sphere 2 0 0 0
  89. X\end{verbatim}
  90. X
  91. XIf you are running \rayshade on a UNIX\footnote{UNIX is a trademark
  92. Xof AT\&T Bell Laboratories}-like machine, the command:
  93. X\begin{verbatim}
  94. X  echo "sphere 2 0 0 0" | rayshade > sphere.rle
  95. X\end{verbatim}
  96. Xshould produce an image of a sphere.
  97. END_OF_FILE
  98. if test 2585 -ne `wc -c <'Doc/Guide/intro.tex'`; then
  99.     echo shar: \"'Doc/Guide/intro.tex'\" unpacked with wrong size!
  100. fi
  101. # end of 'Doc/Guide/intro.tex'
  102. fi
  103. if test -f 'Examples/planet.map' -a "${1}" != "-c" ; then 
  104.   echo shar: Will not clobber existing file \"'Examples/planet.map'\"
  105. else
  106. echo shar: Extracting \"'Examples/planet.map'\" \(2551 characters\)
  107. sed "s/^X//" >'Examples/planet.map' <<'END_OF_FILE'
  108. X40 128 200
  109. X40 128 200
  110. X41 129 201
  111. X42 130 202
  112. X43 131 202
  113. X44 132 203
  114. X45 133 204
  115. X46 134 204
  116. X47 135 205
  117. X48 136 206
  118. X48 136 206
  119. X49 137 207
  120. X50 138 208
  121. X51 139 209
  122. X52 140 209
  123. X53 141 210
  124. X54 142 211
  125. X55 143 211
  126. X56 144 212
  127. X57 145 213
  128. X57 145 213
  129. X58 146 214
  130. X59 147 215
  131. X60 148 216
  132. X61 149 216
  133. X62 150 217
  134. X63 151 218
  135. X64 152 218
  136. X65 153 219
  137. X66 154 220
  138. X66 154 220
  139. X67 155 221
  140. X68 156 222
  141. X69 157 222
  142. X70 158 223
  143. X71 159 224
  144. X72 160 225
  145. X73 161 225
  146. X74 162 226
  147. X75 163 227
  148. X75 163 227
  149. X76 164 228
  150. X77 165 229
  151. X78 166 229
  152. X79 167 230
  153. X80 168 231
  154. X81 169 232
  155. X82 170 232
  156. X83 171 233
  157. X84 172 234
  158. X84 172 234
  159. X85 173 235
  160. X86 174 236
  161. X87 175 236
  162. X88 176 237
  163. X89 177 238
  164. X90 178 238
  165. X91 179 239
  166. X92 180 240
  167. X93 181 241
  168. X93 181 241
  169. X94 182 242
  170. X95 183 243
  171. X96 184 243
  172. X97 185 244
  173. X98 186 245
  174. X99 187 245
  175. X100 188 246
  176. X101 189 247
  177. X102 190 248
  178. X102 190 248
  179. X103 191 249
  180. X104 192 250
  181. X105 193 250
  182. X106 194 251
  183. X107 195 252
  184. X108 196 252
  185. X109 197 253
  186. X110 198 254
  187. X111 199 255
  188. X244 211 1
  189. X240 211 1
  190. X237 211 1
  191. X234 211 1
  192. X231 211 1
  193. X228 211 1
  194. X224 211 1
  195. X221 211 1
  196. X218 211 1
  197. X215 211 1
  198. X212 211 1
  199. X209 211 1
  200. X205 211 1
  201. X202 211 1
  202. X199 211 1
  203. X196 211 1
  204. X193 211 1
  205. X190 211 1
  206. X186 211 1
  207. X183 211 1
  208. X180 211 1
  209. X177 211 1
  210. X174 211 1
  211. X171 211 1
  212. X132 208 1
  213. X129 206 1
  214. X125 204 1
  215. X122 201 1
  216. X119 199 1
  217. X115 197 1
  218. X112 194 1
  219. X108 192 1
  220. X105 190 1
  221. X102 187 1
  222. X98 185 1
  223. X95 183 1
  224. X91 180 1
  225. X88 178 1
  226. X84 176 1
  227. X81 173 1
  228. X78 171 1
  229. X74 169 1
  230. X71 166 1
  231. X67 164 1
  232. X64 162 1
  233. X61 159 1
  234. X57 157 1
  235. X54 155 1
  236. X50 152 1
  237. X47 150 1
  238. X44 148 1
  239. X40 145 1
  240. X37 143 1
  241. X33 141 1
  242. X30 138 1
  243. X27 136 1
  244. X23 134 1
  245. X20 131 1
  246. X16 129 1
  247. X13 127 1
  248. X10 124 1
  249. X6 122 1
  250. X3 120 1
  251. X0 118 1
  252. X3 116 1
  253. X6 115 1
  254. X9 113 1
  255. X12 112 1
  256. X15 110 1
  257. X18 109 1
  258. X21 107 1
  259. X25 106 1
  260. X28 104 1
  261. X31 103 1
  262. X34 101 1
  263. X37 100 1
  264. X40 98 1
  265. X43 97 1
  266. X46 96 1
  267. X50 94 1
  268. X53 93 1
  269. X56 91 1
  270. X59 90 1
  271. X62 88 1
  272. X65 87 1
  273. X68 85 1
  274. X71 84 1
  275. X75 82 1
  276. X78 81 1
  277. X81 79 1
  278. X84 78 1
  279. X87 77 1
  280. X90 75 1
  281. X93 74 1
  282. X96 72 1
  283. X100 71 1
  284. X103 69 1
  285. X106 68 1
  286. X109 66 1
  287. X112 65 1
  288. X115 63 1
  289. X118 62 1
  290. X122 61 1
  291. X121 61 1
  292. X120 61 1
  293. X118 60 1
  294. X117 60 1
  295. X115 59 1
  296. X114 59 1
  297. X113 59 1
  298. X111 58 1
  299. X110 58 1
  300. X109 58 1
  301. X111 59 1
  302. X114 60 1
  303. X116 62 1
  304. X119 63 1
  305. X121 65 1
  306. X124 66 1
  307. X126 68 1
  308. X129 69 1
  309. X131 71 1
  310. X134 72 1
  311. X136 74 1
  312. X139 75 1
  313. X141 77 1
  314. X144 78 1
  315. X147 80 1
  316. X149 81 1
  317. X152 83 1
  318. X154 84 1
  319. X157 86 1
  320. X159 87 1
  321. X162 89 1
  322. X164 90 1
  323. X167 92 1
  324. X169 93 1
  325. X172 95 1
  326. X174 96 1
  327. X177 98 1
  328. X180 99 1
  329. X182 101 1
  330. X185 102 1
  331. X187 104 1
  332. X190 105 1
  333. X192 107 1
  334. X195 108 1
  335. X197 110 1
  336. X200 111 1
  337. X202 113 1
  338. X205 114 1
  339. X207 116 1
  340. X210 117 1
  341. X213 119 2
  342. X210 120 9
  343. X208 122 16
  344. X205 124 23
  345. X203 126 30
  346. X200 128 37
  347. X198 129 44
  348. X195 131 51
  349. X193 133 59
  350. X190 135 66
  351. X188 137 73
  352. X186 138 80
  353. X183 140 87
  354. X181 142 94
  355. X178 144 101
  356. X176 146 109
  357. X173 148 116
  358. X254 255 255
  359. X254 255 254
  360. X254 255 254
  361. X254 255 253
  362. X254 255 253
  363. X254 255 253
  364. END_OF_FILE
  365. if test 2551 -ne `wc -c <'Examples/planet.map'`; then
  366.     echo shar: \"'Examples/planet.map'\" unpacked with wrong size!
  367. fi
  368. # end of 'Examples/planet.map'
  369. fi
  370. if test -f 'libray/liblight/extended.c' -a "${1}" != "-c" ; then 
  371.   echo shar: Will not clobber existing file \"'libray/liblight/extended.c'\"
  372. else
  373. echo shar: Extracting \"'libray/liblight/extended.c'\" \(2819 characters\)
  374. sed "s/^X//" >'libray/liblight/extended.c' <<'END_OF_FILE'
  375. X/*
  376. X * extended.c
  377. X *
  378. X * Copyright (C) 1989, 1991, Craig E. Kolb
  379. X * All rights reserved.
  380. X *
  381. X * This software may be freely copied, modified, and redistributed
  382. X * provided that this copyright notice is preserved on all copies.
  383. X *
  384. X * You may not distribute this software, in whole or in part, as part of
  385. X * any commercial product without the express consent of the authors.
  386. X *
  387. X * There is no warranty or other guarantee of fitness of this software
  388. X * for any purpose.  It is provided solely "as is".
  389. X *
  390. X * $Id: extended.c,v 4.0 91/07/17 14:34:03 kolb Exp Locker: kolb $
  391. X *
  392. X * $Log:    extended.c,v $
  393. X * Revision 4.0  91/07/17  14:34:03  kolb
  394. X * Initial version.
  395. X * 
  396. X */
  397. X#include "light.h"
  398. X#include "libcommon/sampling.h"
  399. X#include "extended.h"
  400. X
  401. Xstatic LightMethods *iExtendedMethods = NULL;
  402. X
  403. XExtended *
  404. XExtendedCreate(r, pos)
  405. XFloat r;
  406. XVector *pos;
  407. X{
  408. X    Extended *e;
  409. X
  410. X    e = (Extended *)share_malloc(sizeof(Extended));
  411. X    e->pos = *pos;
  412. X    e->radius = r;
  413. X    
  414. X    return e;
  415. X}
  416. X
  417. XLightMethods *
  418. XExtendedMethods()
  419. X{
  420. X    if (iExtendedMethods == (LightMethods *)NULL) {
  421. X        iExtendedMethods = LightMethodsCreate();
  422. X        iExtendedMethods->intens = ExtendedIntens;
  423. X        iExtendedMethods->dir = ExtendedDirection;
  424. X    }
  425. X    return iExtendedMethods;
  426. X}
  427. X
  428. X/*
  429. X * Compute intensity ('color') of extended light source 'lp' from 'pos'.
  430. X */
  431. Xstatic int
  432. XExtendedIntens(lp, lcolor, cache, ray, dist, noshadow, color)
  433. XExtended *lp;
  434. XColor *lcolor, *color;
  435. XShadowCache *cache;
  436. XRay *ray;
  437. XFloat dist;
  438. Xint noshadow;
  439. X{
  440. X    int uSample, vSample, islit;
  441. X    Float jit, vbase, ubase, vpos, upos, lightdist;
  442. X    Color newcol;
  443. X    Ray newray;
  444. X    Vector Uaxis, Vaxis, ldir;
  445. X
  446. X    if (noshadow) {
  447. X        *color = *lcolor;
  448. X        return TRUE;
  449. X    }
  450. X
  451. X    newray = *ray;
  452. X    /*
  453. X     * Determinte two orthoganal vectors that lay in the plane
  454. X     * whose normal is defined by the vector from the center
  455. X     * of the light source to the point of intersection and
  456. X     * passes through the center of the light source.
  457. X      */
  458. X    VecSub(lp->pos, ray->pos, &ldir);
  459. X    VecCoordSys(&ldir, &Uaxis, &Vaxis);
  460. X
  461. X    jit = 2. * lp->radius * Sampling.spacing;
  462. X
  463. X    /*
  464. X     * Sample a single point, determined by SampleNumber,
  465. X     * on the extended source.
  466. X     */
  467. X    vpos = -lp->radius + (ray->sample % Sampling.sidesamples)*jit;
  468. X    upos = -lp->radius + (ray->sample / Sampling.sidesamples)*jit;
  469. X    vpos += nrand() * jit;
  470. X    upos += nrand() * jit;
  471. X    VecComb(upos, Uaxis, vpos, Vaxis, &newray.dir);
  472. X    VecAdd(ldir, newray.dir, &newray.dir);
  473. X    lightdist = VecNormalize(&newray.dir);
  474. X
  475. X    return !Shadowed(color, lcolor, cache, &newray,
  476. X        lightdist, noshadow);
  477. X}
  478. X
  479. Xvoid
  480. XExtendedDirection(lp, pos, dir, dist)
  481. XExtended *lp;
  482. XVector *pos, *dir;
  483. XFloat *dist;
  484. X{
  485. X    /*
  486. X     * Calculate dir from position to center of
  487. X     * light source.
  488. X     */
  489. X    VecSub(lp->pos, *pos, dir);
  490. X    *dist = VecNormalize(dir);
  491. X}
  492. X
  493. XExtendedMethodRegister(meth)
  494. XUserMethodType meth;
  495. X{
  496. X    if (iExtendedMethods)
  497. X        iExtendedMethods->user = meth;
  498. X}
  499. END_OF_FILE
  500. if test 2819 -ne `wc -c <'libray/liblight/extended.c'`; then
  501.     echo shar: \"'libray/liblight/extended.c'\" unpacked with wrong size!
  502. fi
  503. # end of 'libray/liblight/extended.c'
  504. fi
  505. if test -f 'libray/libobj/hf.h' -a "${1}" != "-c" ; then 
  506.   echo shar: Will not clobber existing file \"'libray/libobj/hf.h'\"
  507. else
  508. echo shar: Extracting \"'libray/libobj/hf.h'\" \(2626 characters\)
  509. sed "s/^X//" >'libray/libobj/hf.h' <<'END_OF_FILE'
  510. X/*
  511. X * hf.h
  512. X *
  513. X * Copyright (C) 1989, 1991, Craig E. Kolb
  514. X * All rights reserved.
  515. X *
  516. X * This software may be freely copied, modified, and redistributed
  517. X * provided that this copyright notice is preserved on all copies.
  518. X *
  519. X * You may not distribute this software, in whole or in part, as part of
  520. X * any commercial product without the express consent of the authors.
  521. X *
  522. X * There is no warranty or other guarantee of fitness of this software
  523. X * for any purpose.  It is provided solely "as is".
  524. X *
  525. X * $Id: hf.h,v 4.0 91/07/17 14:38:19 kolb Exp Locker: kolb $
  526. X *
  527. X * $Log:    hf.h,v $
  528. X * Revision 4.0  91/07/17  14:38:19  kolb
  529. X * Initial version.
  530. X * 
  531. X */
  532. X#ifndef HF_H
  533. X#define HF_H
  534. X
  535. X#define GeomHfCreate(f) GeomCreate((GeomRef)HfCreate(f), HfMethods())
  536. X
  537. X/*
  538. X * Any height values <= Hf_UNSET is not considered to be part of the
  539. X * height field. Any trianges containing such a vertex will not be
  540. X * rendered.  This allows one to render non-square height fields.
  541. X */
  542. X#define HF_UNSET        (-1000.)
  543. X/*
  544. X * Number of datapoints in a single cell.  If you've got loads of memory,
  545. X * decrease this number.  The 'optimal' number is quite system-dependent,
  546. X * but something around 20 seems to work well. For systems without much
  547. X * memory, this constant should be greater than or equal to the largest
  548. X * height field which will be rendered, thus making the algorithm
  549. X * non-hierarchical.
  550. X */
  551. X#define BESTSIZE        16
  552. X/*
  553. X * Size of triangle cache.
  554. X */
  555. X#define CACHESIZE        6
  556. X/*
  557. X * Used to differentiate between the two triangles used to represent a cell:
  558. X *    a------d
  559. X *      |\     |
  560. X *      | \TRI2|    TRI2 == c-->d-->a-->c
  561. X *      |  \   |
  562. X *      |   \  |
  563. X *    |    \ |
  564. X *      |TRI1 \|    TRI1 == c-->a-->b-->c
  565. X *      b------c
  566. X */
  567. X#define TRI1            1
  568. X#define TRI2            2
  569. X
  570. Xtypedef struct hfTri {
  571. X    Vector v1, v2, v3, norm;
  572. X    Float d;
  573. X    char type;
  574. X    struct hfTri *next, *prev;
  575. X} hfTri;
  576. X
  577. Xtypedef struct {
  578. X    int len;
  579. X    hfTri *head, *tail;
  580. X} TriQueue;
  581. X
  582. Xtypedef struct {
  583. X    float **data;        /* Altitude points */
  584. X    float minz, maxz;
  585. X    int size, *lsize;    /* # of points/side */
  586. X    int BestSize;         /* "best" division size */
  587. X    float iBestSize;    /* inverse of above (for faster computation) */
  588. X    int levels;        /* log base BestSize of size */
  589. X    float ***boundsmax;    /* high data values at various resolutions. */
  590. X    float ***boundsmin;
  591. X    float *spacing;
  592. X    hfTri hittri, **q;    /* hit triangle and triangle cache */
  593. X    int qtail, qsize;    /* end and length of cache */
  594. X    Float boundbox[2][3];    /* bounding box of Hf */
  595. X} Hf;
  596. X
  597. Xextern Hf    *HfCreate();
  598. Xextern int    HfIntersect(), HfEnter(), HfNormal();
  599. Xextern void    HfBounds(), HfUV(), HfStats();
  600. Xextern char    *HfName();
  601. Xextern Methods    *HfMethods();
  602. X
  603. X#endif /* HF_H */
  604. END_OF_FILE
  605. if test 2626 -ne `wc -c <'libray/libobj/hf.h'`; then
  606.     echo shar: \"'libray/libobj/hf.h'\" unpacked with wrong size!
  607. fi
  608. # end of 'libray/libobj/hf.h'
  609. fi
  610. if test -f 'libray/libobj/list.c' -a "${1}" != "-c" ; then 
  611.   echo shar: Will not clobber existing file \"'libray/libobj/list.c'\"
  612. else
  613. echo shar: Extracting \"'libray/libobj/list.c'\" \(3113 characters\)
  614. sed "s/^X//" >'libray/libobj/list.c' <<'END_OF_FILE'
  615. X/*
  616. X * list.c
  617. X *
  618. X * Copyright (C) 1989, 1991, Craig E. Kolb
  619. X * All rights reserved.
  620. X *
  621. X * This software may be freely copied, modified, and redistributed
  622. X * provided that this copyright notice is preserved on all copies.
  623. X *
  624. X * You may not distribute this software, in whole or in part, as part of
  625. X * any commercial product without the express consent of the authors.
  626. X *
  627. X * There is no warranty or other guarantee of fitness of this software
  628. X * for any purpose.  It is provided solely "as is".
  629. X *
  630. X * $Id: list.c,v 4.0 91/07/17 14:38:42 kolb Exp Locker: kolb $
  631. X *
  632. X * $Log:    list.c,v $
  633. X * Revision 4.0  91/07/17  14:38:42  kolb
  634. X * Initial version.
  635. X * 
  636. X */
  637. X#include "geom.h"
  638. X#include "list.h"
  639. X
  640. Xstatic Methods *iListMethods = NULL;
  641. Xstatic char listName[] = "list";
  642. X
  643. XList *
  644. XListCreate()
  645. X{
  646. X    return (List *)share_calloc(1, sizeof(List));
  647. X}
  648. X
  649. Xchar *
  650. XListName()
  651. X{
  652. X    return listName;
  653. X}
  654. X
  655. X/*
  656. X * Take a list whose DATA field points to a linked list of objects and
  657. X * turn it into a List.
  658. X */
  659. Xint
  660. XListConvert(list, objlist)
  661. XList *list;
  662. XGeom *objlist;
  663. X{
  664. X    int num;
  665. X
  666. X    /*
  667. X     * Find the unbounded objects on the list as well as the
  668. X     * bounding box of the list.
  669. X     */
  670. X    list->list = objlist;
  671. X    for (num = 0; objlist; objlist = objlist->next)
  672. X        num += objlist->prims;
  673. X    return num;
  674. X}
  675. X
  676. X/*
  677. X * Intersect ray & list of objects.
  678. X */
  679. Xint
  680. XListIntersect(list, ray, hitlist, mindist, maxdist)
  681. XList *list;
  682. XRay *ray;
  683. XHitList *hitlist;
  684. XFloat mindist, *maxdist;
  685. X{
  686. X    Geom *objlist;
  687. X    Vector vtmp;
  688. X    Float s;
  689. X    int hit;
  690. X
  691. X    hit = FALSE;
  692. X    /*
  693. X     * Intersect with unbounded objects.
  694. X     */
  695. X    for (objlist = list->unbounded; objlist ; objlist = objlist->next) {
  696. X        if (intersect(objlist, ray, hitlist, mindist, maxdist))
  697. X            hit = TRUE;
  698. X    }
  699. X
  700. X    /*
  701. X     * Check for intersection with bounding box.
  702. X     */
  703. X    s = *maxdist;    /* So maxdist won't be reset. */
  704. X    VecAddScaled(ray->pos, mindist, ray->dir, &vtmp);
  705. X    if (OutOfBounds(&vtmp, list->bounds) &&
  706. X        !BoundsIntersect(ray, list->bounds, mindist, &s))
  707. X        /*
  708. X         * Ray never hit list.
  709. X         */
  710. X        return hit;
  711. X    /*
  712. X     * Else the ray enters list-space before it hits an
  713. X     * unbounded object. Intersect with objects on list.
  714. X     */
  715. X    for (objlist = list->list; objlist ; objlist = objlist->next) {
  716. X        if (intersect(objlist, ray, hitlist, mindist, maxdist))
  717. X            hit = TRUE;
  718. X    }
  719. X
  720. X    return hit;
  721. X}
  722. X
  723. XMethods *
  724. XListMethods()
  725. X{
  726. X    if (iListMethods == (Methods *)NULL) {
  727. X        iListMethods = MethodsCreate();
  728. X        iListMethods->methods = ListMethods;
  729. X        iListMethods->create = (GeomCreateFunc *)ListCreate;
  730. X        iListMethods->name = ListName;
  731. X        iListMethods->intersect = ListIntersect;
  732. X        iListMethods->bounds = ListBounds;
  733. X        iListMethods->convert = ListConvert;
  734. X        iListMethods->checkbounds = FALSE;
  735. X        iListMethods->closed = TRUE;
  736. X    }
  737. X    return iListMethods;
  738. X}
  739. X
  740. Xvoid
  741. XListBounds(list, bounds)
  742. XList *list;
  743. XFloat bounds[2][3];
  744. X{
  745. X    Geom *obj, *next;
  746. X
  747. X    BoundsInit(list->bounds);
  748. X    /*
  749. X     * For each object on the list,
  750. X     * compute its bounds...
  751. X     */
  752. X    list->unbounded  = GeomComputeAggregateBounds(&list->list, 
  753. X                list->unbounded, list->bounds);
  754. X    BoundsCopy(list->bounds, bounds);
  755. X}
  756. X
  757. Xvoid
  758. XListMethodRegister(meth)
  759. XUserMethodType meth;
  760. X{
  761. X    if (iListMethods)
  762. X        iListMethods->user = meth;
  763. X}
  764. END_OF_FILE
  765. if test 3113 -ne `wc -c <'libray/libobj/list.c'`; then
  766.     echo shar: \"'libray/libobj/list.c'\" unpacked with wrong size!
  767. fi
  768. # end of 'libray/libobj/list.c'
  769. fi
  770. if test -f 'libray/libobj/plane.c' -a "${1}" != "-c" ; then 
  771.   echo shar: Will not clobber existing file \"'libray/libobj/plane.c'\"
  772. else
  773. echo shar: Extracting \"'libray/libobj/plane.c'\" \(2991 characters\)
  774. sed "s/^X//" >'libray/libobj/plane.c' <<'END_OF_FILE'
  775. X/*
  776. X * plane.c
  777. X *
  778. X * Copyright (C) 1989, 1991, Craig E. Kolb
  779. X * All rights reserved.
  780. X *
  781. X * This software may be freely copied, modified, and redistributed
  782. X * provided that this copyright notice is preserved on all copies.
  783. X *
  784. X * You may not distribute this software, in whole or in part, as part of
  785. X * any commercial product without the express consent of the authors.
  786. X *
  787. X * There is no warranty or other guarantee of fitness of this software
  788. X * for any purpose.  It is provided solely "as is".
  789. X *
  790. X * $Id: plane.c,v 4.0 91/07/17 14:38:51 kolb Exp Locker: kolb $
  791. X *
  792. X * $Log:    plane.c,v $
  793. X * Revision 4.0  91/07/17  14:38:51  kolb
  794. X * Initial version.
  795. X * 
  796. X */
  797. X#include "geom.h"
  798. X#include "plane.h"
  799. X
  800. Xstatic Methods *iPlaneMethods = NULL;
  801. Xstatic char planeName[] = "plane";
  802. X
  803. Xunsigned long PlaneTests, PlaneHits;
  804. X
  805. X/*
  806. X * create plane primitive
  807. X */
  808. XPlane *
  809. XPlaneCreate(pos, norm)
  810. XVector *pos, *norm;
  811. X{
  812. X    Plane *plane;
  813. X    Vector tmpnrm;
  814. X
  815. X    tmpnrm = *norm;
  816. X    if (VecNormalize(&tmpnrm) == 0.) {
  817. X        RLerror(RL_WARN, "Degenerate plane normal.\n");
  818. X        return (Plane *)NULL;
  819. X    }
  820. X    plane = (Plane *)share_malloc(sizeof(Plane));
  821. X    plane->norm = tmpnrm;
  822. X    plane->pos = *pos;
  823. X    plane->d = dotp(&plane->norm, pos);
  824. X
  825. X    return plane;
  826. X}
  827. X
  828. XMethods *
  829. XPlaneMethods()
  830. X{
  831. X    if (iPlaneMethods == (Methods *)NULL) {
  832. X        iPlaneMethods = MethodsCreate();
  833. X        iPlaneMethods->name = PlaneName;
  834. X        iPlaneMethods->create = (GeomCreateFunc *)PlaneCreate;
  835. X        iPlaneMethods->methods = PlaneMethods;
  836. X        iPlaneMethods->intersect = PlaneIntersect;
  837. X        iPlaneMethods->normal = PlaneNormal;
  838. X        iPlaneMethods->uv = PlaneUV;
  839. X        iPlaneMethods->bounds = PlaneBounds;
  840. X        iPlaneMethods->stats = PlaneStats;
  841. X        iPlaneMethods->checkbounds = FALSE;
  842. X        iPlaneMethods->closed = FALSE;
  843. X    }
  844. X    return iPlaneMethods;
  845. X}
  846. X
  847. Xint
  848. XPlaneIntersect(plane, ray, mindist, maxdist)
  849. XPlane *plane;
  850. XRay *ray;
  851. XFloat mindist, *maxdist;
  852. X{
  853. X    Float d;
  854. X
  855. X    PlaneTests++;
  856. X
  857. X    d = dotp(&plane->norm, &ray->dir);
  858. X    if (fabs(d) < EPSILON)
  859. X        return FALSE;
  860. X    d = (plane->d - dotp(&plane->norm, &ray->pos)) / d;
  861. X
  862. X    if (d > mindist && d < *maxdist) {
  863. X        *maxdist = d;
  864. X        PlaneHits++;
  865. X        return TRUE;
  866. X    }
  867. X    return FALSE;
  868. X}
  869. X
  870. X/*ARGSUSED*/
  871. Xint
  872. XPlaneNormal(plane, pos, nrm, gnrm)
  873. XPlane *plane;
  874. XVector *pos, *nrm, *gnrm;
  875. X{
  876. X    *gnrm = *nrm = plane->norm;
  877. X    return FALSE;
  878. X}
  879. X
  880. Xvoid
  881. XPlaneUV(plane, pos, norm, uv, dpdu, dpdv)
  882. XPlane *plane;
  883. XVector *pos, *norm, *dpdu, *dpdv;
  884. XVec2d *uv;
  885. X{
  886. X    Vector vec, du, dv;
  887. X
  888. X    VecCoordSys(norm, &du, &dv);
  889. X    VecSub(*pos, plane->pos, &vec);
  890. X
  891. X    uv->u = dotp(&vec, &du);
  892. X    uv->v = dotp(&vec, &dv);
  893. X
  894. X    if (dpdu)
  895. X        *dpdu = du;
  896. X    if (dpdv)
  897. X        *dpdv = dv;
  898. X}
  899. X    
  900. X/*ARGSUSED*/
  901. Xvoid
  902. XPlaneBounds(plane, bounds)
  903. XPlane *plane;
  904. XFloat bounds[2][3];
  905. X{
  906. X    /*
  907. X     * Planes are unbounded by nature.  minx > maxx signifies
  908. X     * this.
  909. X     */
  910. X    bounds[LOW][X] = 1.0;
  911. X    bounds[HIGH][X] = -1.0;
  912. X}
  913. X
  914. Xchar *
  915. XPlaneName()
  916. X{
  917. X    return planeName;
  918. X}
  919. X
  920. Xvoid
  921. XPlaneStats(tests, hits)
  922. Xunsigned long *tests, *hits;
  923. X{
  924. X    *tests = PlaneTests;
  925. X    *hits = PlaneHits;
  926. X}
  927. X
  928. Xvoid
  929. XPlaneMethodRegister(meth)
  930. XUserMethodType meth;
  931. X{
  932. X    if (iPlaneMethods)
  933. X        iPlaneMethods->user = meth;
  934. X}
  935. END_OF_FILE
  936. if test 2991 -ne `wc -c <'libray/libobj/plane.c'`; then
  937.     echo shar: \"'libray/libobj/plane.c'\" unpacked with wrong size!
  938. fi
  939. # end of 'libray/libobj/plane.c'
  940. fi
  941. if test -f 'libray/libsurf/fogdeck.c' -a "${1}" != "-c" ; then 
  942.   echo shar: Will not clobber existing file \"'libray/libsurf/fogdeck.c'\"
  943. else
  944. echo shar: Extracting \"'libray/libsurf/fogdeck.c'\" \(2785 characters\)
  945. sed "s/^X//" >'libray/libsurf/fogdeck.c' <<'END_OF_FILE'
  946. X/*
  947. X * fogdeck.c
  948. X *
  949. X * Copyright (C) 1989, 1991, Craig E. Kolb
  950. X * All rights reserved.
  951. X *
  952. X * This software may be freely copied, modified, and redistributed
  953. X * provided that this copyright notice is preserved on all copies.
  954. X *
  955. X * You may not distribute this software, in whole or in part, as part of
  956. X * any commercial product without the express consent of the authors.
  957. X *
  958. X * There is no warranty or other guarantee of fitness of this software
  959. X * for any purpose.  It is provided solely "as is".
  960. X *
  961. X * $Id: fogdeck.c,v 4.0 91/07/17 14:40:28 kolb Exp Locker: kolb $
  962. X *
  963. X * $Log:    fogdeck.c,v $
  964. X * Revision 4.0  91/07/17  14:40:28  kolb
  965. X * Initial version.
  966. X * 
  967. X */
  968. X#include "atmosphere.h"
  969. X#include "fogdeck.h"
  970. X
  971. XFogdeck *
  972. XFogdeckCreate(alt, offset, scale, chaoscale, octaves, color, trans)
  973. XFloat alt, offset, chaoscale;
  974. XVector *scale;
  975. Xint octaves;
  976. XColor *color, *trans;
  977. X{
  978. X    Fogdeck *fogdeck;
  979. X    static void ComputeFogdeck();
  980. X
  981. X    fogdeck = (Fogdeck *)Malloc(sizeof(Fogdeck));
  982. X
  983. X    fogdeck->alt = alt;
  984. X    fogdeck->octaves = octaves;
  985. X    fogdeck->scale = *scale;
  986. X    fogdeck->chaoscale = chaoscale;
  987. X    fogdeck->offset = offset;
  988. X
  989. X    if (color == (Color *)NULL)
  990. X        fogdeck->color.r = fogdeck->color.g = fogdeck->color.b = 0.;
  991. X    else
  992. X        fogdeck->color = *color;
  993. X    if (trans == (Color *)NULL)
  994. X        fogdeck->trans.r = fogdeck->trans.g = fogdeck->trans.b =
  995. X            FAR_AWAY;
  996. X    else {
  997. X        fogdeck->trans = *trans;
  998. X    }
  999. X    return fogdeck;
  1000. X}
  1001. X
  1002. X/*
  1003. X * Add fogdeck to the given color.
  1004. X */
  1005. Xvoid
  1006. XFogdeckApply(fogdeck, ray, pos, dist, color)
  1007. XFogdeck *fogdeck;
  1008. XRay *ray;
  1009. XVector *pos;
  1010. XFloat dist;
  1011. XColor *color;
  1012. X{
  1013. X    Float atten, hitdist, density;
  1014. X    Color trans;
  1015. X    Vector endp;
  1016. X    extern Float ExpAtten(), PAChaos();
  1017. X
  1018. X    /*
  1019. X     * Find distance from origin at which ray strikes
  1020. X     * z = fogdeck->alt plane
  1021. X     */
  1022. X    if (abs(ray->dir.z) < EPSILON)
  1023. X        return;
  1024. X    hitdist = (fogdeck->alt - ray->pos.z) / ray->dir.z;
  1025. X    if (hitdist < EPSILON || hitdist > dist)
  1026. X        return;
  1027. X    /*
  1028. X     * Compute ray endpoint
  1029. X     */
  1030. X    VecAddScaled(ray->pos, hitdist, ray->dir, &endp);
  1031. X
  1032. X    /*
  1033. X     * Modify transmissivity based on point of
  1034. X     * intersection.
  1035. X     */
  1036. X    endp.x *= fogdeck->scale.x;
  1037. X    endp.y *= fogdeck->scale.y;
  1038. X    endp.z *= fogdeck->scale.z;
  1039. X
  1040. X    density = fogdeck->offset +
  1041. X            fogdeck->chaoscale * PAChaos(&endp, fogdeck->octaves);
  1042. X    if (density < EPSILON)
  1043. X        density = HUGE;
  1044. X    else
  1045. X        density = 1. / density;
  1046. X
  1047. X    trans = fogdeck->trans;
  1048. X    ColorScale(density, trans, &trans);
  1049. X
  1050. X    dist -= hitdist;
  1051. X    
  1052. X    atten = ExpAtten(dist, trans.r);
  1053. X
  1054. X    if (trans.r == trans.g &&
  1055. X        trans.r == trans.b) {
  1056. X        ColorBlend(color, &fogdeck->color, atten, 1. - atten);
  1057. X        return;
  1058. X    }
  1059. X    color->r = atten*color->r + (1. - atten) * fogdeck->color.r;
  1060. X
  1061. X    atten = ExpAtten(dist, trans.g);
  1062. X    color->g = atten*color->g + (1. - atten) * fogdeck->color.g;
  1063. X    atten = ExpAtten(dist, trans.b);
  1064. X    color->b = atten*color->b + (1. - atten) * fogdeck->color.b;
  1065. X}
  1066. END_OF_FILE
  1067. if test 2785 -ne `wc -c <'libray/libsurf/fogdeck.c'`; then
  1068.     echo shar: \"'libray/libsurf/fogdeck.c'\" unpacked with wrong size!
  1069. fi
  1070. # end of 'libray/libsurf/fogdeck.c'
  1071. fi
  1072. if test -f 'libray/libtext/cloud.c' -a "${1}" != "-c" ; then 
  1073.   echo shar: Will not clobber existing file \"'libray/libtext/cloud.c'\"
  1074. else
  1075. echo shar: Extracting \"'libray/libtext/cloud.c'\" \(2607 characters\)
  1076. sed "s/^X//" >'libray/libtext/cloud.c' <<'END_OF_FILE'
  1077. X/*
  1078. X * cloud.c
  1079. X *
  1080. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1081. X * All rights reserved.
  1082. X *
  1083. X * This software may be freely copied, modified, and redistributed
  1084. X * provided that this copyright notice is preserved on all copies.
  1085. X *
  1086. X * You may not distribute this software, in whole or in part, as part of
  1087. X * any commercial product without the express consent of the authors.
  1088. X *
  1089. X * There is no warranty or other guarantee of fitness of this software
  1090. X * for any purpose.  It is provided solely "as is".
  1091. X *
  1092. X * $Id: cloud.c,v 4.0 91/07/17 14:41:57 kolb Exp Locker: kolb $
  1093. X *
  1094. X * $Log:    cloud.c,v $
  1095. X * Revision 4.0  91/07/17  14:41:57  kolb
  1096. X * Initial version.
  1097. X * 
  1098. X */
  1099. X#include "texture.h"
  1100. X#include "cloud.h"
  1101. X
  1102. X/*
  1103. X * Gardner-style textured ellipsoid.  Designed to be used on unit spheres
  1104. X * centered at the origin.  (Of course, the spheres may be transformed
  1105. X * into ellipsoids, translated, etc.)
  1106. X */
  1107. XCloudText *
  1108. XCloudTextCreate(scale, h, lambda, octaves, cthresh, lthresh, transcale)
  1109. XFloat scale, h, lambda, cthresh, lthresh, transcale;
  1110. Xint octaves;
  1111. X{
  1112. X    CloudText *cloud;
  1113. X    
  1114. X    cloud = (CloudText *)Malloc(sizeof(CloudText));
  1115. X    cloud->beta = 1. + 2 * h;
  1116. X    cloud->omega = pow(lambda, -0.5 * cloud->beta);
  1117. X    cloud->lambda = lambda;
  1118. X    cloud->scale = scale;
  1119. X    cloud->cthresh = cthresh;
  1120. X    cloud->range = lthresh - cthresh;
  1121. X    cloud->transcale = transcale;
  1122. X    cloud->maxval = 1. / (1. - cloud->beta);
  1123. X    cloud->octaves = octaves;
  1124. X    return cloud;
  1125. X}
  1126. X
  1127. Xvoid
  1128. XCloudTextApply(cloud, prim, ray, pos, norm, gnorm, surf)
  1129. XCloudText *cloud;
  1130. XGeom *prim;
  1131. XRay *ray;
  1132. XVector *pos, *norm, *gnorm;
  1133. XSurface *surf;
  1134. X{
  1135. X    Ray pray;
  1136. X    Float alpha, beta, It, dsquared, d, limb;
  1137. X
  1138. X    /*
  1139. X     * Transform ray to prim. space.
  1140. X     */
  1141. X    pray = *ray;
  1142. X    (void)TextRayToPrim(&pray);
  1143. X    dsquared = dotp(&pray.pos, &pray.pos);
  1144. X    if (fabs(dsquared) < 1. + EPSILON) {
  1145. X        surf->transp = 1.;
  1146. X        surf->amb.r = surf->amb.g = surf->amb.b = 0.;
  1147. X        surf->diff.r = surf->diff.g = surf->diff.b = 0.;
  1148. X        return;
  1149. X    }
  1150. X    It = fBm(pos,cloud->omega,cloud->lambda,cloud->octaves);
  1151. X    It = (cloud->maxval + It) * 0.5/cloud->maxval;
  1152. X    if (It < 0.)
  1153. X        It = 0;
  1154. X    else if (It > 1.)
  1155. X        It = 1;
  1156. X    d = sqrt(dsquared);
  1157. X    beta = sqrt(dsquared - 1) / d;
  1158. X    alpha = -dotp(&pray.pos, &pray.dir) / d;
  1159. X    limb = (alpha - beta) / (1 - beta);
  1160. X    /*
  1161. X     * limb is 0 on the limb, 1 at the center, < 1 outside.
  1162. X     */
  1163. X    surf->transp = 1. - (It-cloud->cthresh-cloud->range*(1.-limb))/
  1164. X            cloud->transcale;
  1165. X
  1166. X    if (surf->transp > 1)
  1167. X        surf->transp = 1.;
  1168. X    if (surf->transp < 0)
  1169. X        surf->transp = 0.;
  1170. X
  1171. X    ColorScale((1. - surf->transp) *
  1172. X           (1. - cloud->scale + cloud->scale*It),
  1173. X            surf->diff, &surf->diff);
  1174. X    ColorScale(1. - surf->transp, surf->amb, &surf->amb);
  1175. X}
  1176. END_OF_FILE
  1177. if test 2607 -ne `wc -c <'libray/libtext/cloud.c'`; then
  1178.     echo shar: \"'libray/libtext/cloud.c'\" unpacked with wrong size!
  1179. fi
  1180. # end of 'libray/libtext/cloud.c'
  1181. fi
  1182. if test -f 'libray/libtext/stripe.c' -a "${1}" != "-c" ; then 
  1183.   echo shar: Will not clobber existing file \"'libray/libtext/stripe.c'\"
  1184. else
  1185. echo shar: Extracting \"'libray/libtext/stripe.c'\" \(2911 characters\)
  1186. sed "s/^X//" >'libray/libtext/stripe.c' <<'END_OF_FILE'
  1187. X/*
  1188. X * stripe.c
  1189. X *
  1190. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1191. X * All rights reserved.
  1192. X *
  1193. X * This software may be freely copied, modified, and redistributed
  1194. X * provided that this copyright notice is preserved on all copies.
  1195. X *
  1196. X * You may not distribute this software, in whole or in part, as part of
  1197. X * any commercial product without the express consent of the authors.
  1198. X *
  1199. X * There is no warranty or other guarantee of fitness of this software
  1200. X * for any purpose.  It is provided solely "as is".
  1201. X *
  1202. X * $Id: stripe.c,v 4.0 91/07/17 14:43:52 kolb Exp Locker: kolb $
  1203. X *
  1204. X * $Log:    stripe.c,v $
  1205. X * Revision 4.0  91/07/17  14:43:52  kolb
  1206. X * Initial version.
  1207. X * 
  1208. X */
  1209. X#include "texture.h"
  1210. X#include "stripe.h"
  1211. X
  1212. XStripe *
  1213. XStripeCreate(surf, width, bump, mapping)
  1214. XSurface *surf;
  1215. XFloat width, bump;
  1216. XMapping *mapping;
  1217. X{
  1218. X    Stripe *stripe;
  1219. X
  1220. X    stripe = (Stripe *)Malloc(sizeof(Stripe));
  1221. X    stripe->surf = surf;
  1222. X    stripe->mapping = mapping;
  1223. X    stripe->width = width;
  1224. X    stripe->bump = bump;
  1225. X    return stripe;
  1226. X}
  1227. X
  1228. Xvoid
  1229. XStripeApply(stripe, prim, ray, pos, norm, gnorm, surf)
  1230. XStripe *stripe;
  1231. XGeom *prim;
  1232. XVector *ray, *pos, *norm, *gnorm;
  1233. XSurface *surf;
  1234. X{
  1235. X    Vector dpdu, dpdv;
  1236. X    Float fu, fv, u, v;
  1237. X
  1238. X    TextToUV(stripe->mapping, prim, pos, gnorm, &u, &v, &dpdu, &dpdv);
  1239. X
  1240. X    u -= floor(u);
  1241. X    v -= floor(v);
  1242. X
  1243. X    /*
  1244. X     *    s s          s
  1245. X     *   | | |        | |
  1246. X     * 1 +-+------------+
  1247. X     *   |X|\^^^^^^^^^^/| } s
  1248. X     *   |X|<+--------+>|
  1249. X     *   |X|<|        |>|
  1250. X     *   |X|<|        |>|
  1251. X     *   |X|<|        |>|
  1252. X     * v |X|<|        |>|
  1253. X     *   |X|<|        |>|
  1254. X     *   |X|<|        |>|
  1255. X     *   |X|<+--------+>|
  1256. X     *   |X|/vvvvvvvvvv\| } s
  1257. X     *   |X+------------+
  1258. X     *   |XXXXXXXXXXXXXX| } s
  1259. X     * 0 +--------------+
  1260. X     *   0              1
  1261. X     *        u
  1262. X     *
  1263. X     * where ^ == positive fv, 0 fu, original surf.
  1264. X     *     v == negative fv, 0 fu, original surf.
  1265. X     *     > == positive fu, 0 fv, original surf.
  1266. X     *     < == negative fu, 0 fv, original surf.
  1267. X     *   blank == 0 fu, 0 fv, original surf.
  1268. X     *       X == 0 fu, 0 fv, alternate surf.
  1269. X     * for stripe->bump > 0.  For stripe->bump < 0., change signs.
  1270. X     */
  1271. X     
  1272. X    if (u > 2*stripe->width && v > 2*stripe->width &&
  1273. X        u <= 1. - stripe->width && v <= 1. - stripe->width)
  1274. X        /* flat surface */
  1275. X        return;
  1276. X    else if (u < stripe->width || v < stripe->width) {
  1277. X        /* on the bottom of the bump. */
  1278. X        *surf = *stripe->surf;
  1279. X        return;
  1280. X    }
  1281. X
  1282. X    /*
  1283. X     * Lower u & v edges are the 'flat' part of the bump --
  1284. X     * make our lives simpler below by 'removing' this area
  1285. X     * from u & v.
  1286. X     */
  1287. X    u = (u - stripe->width) / (1. - stripe->width);
  1288. X    v = (v - stripe->width) / (1. - stripe->width);
  1289. X    /*
  1290. X     * Now the hard part -- where's the bump?
  1291. X     */
  1292. X    if (v < u) { 
  1293. X        if (v < 1. - u) {
  1294. X            /* bottom */
  1295. X            fu = 0.;
  1296. X            fv = -stripe->bump;
  1297. X        } else {
  1298. X            /* right */
  1299. X            fu = stripe->bump;
  1300. X            fv = 0.;
  1301. X        }
  1302. X    } else {
  1303. X        if (v < 1. - u) {
  1304. X            /* left */
  1305. X            fu = -stripe->bump;
  1306. X            fv = 0.;
  1307. X        } else {
  1308. X            /* top */
  1309. X            fu = 0.;
  1310. X            fv = stripe->bump;
  1311. X        }
  1312. X    }
  1313. X
  1314. X    MakeBump(norm, &dpdu, &dpdv, fu, fv);
  1315. X}
  1316. END_OF_FILE
  1317. if test 2911 -ne `wc -c <'libray/libtext/stripe.c'`; then
  1318.     echo shar: \"'libray/libtext/stripe.c'\" unpacked with wrong size!
  1319. fi
  1320. # end of 'libray/libtext/stripe.c'
  1321. fi
  1322. if test -f 'libshade/Makefile.SH' -a "${1}" != "-c" ; then 
  1323.   echo shar: Will not clobber existing file \"'libshade/Makefile.SH'\"
  1324. else
  1325. echo shar: Extracting \"'libshade/Makefile.SH'\" \(2825 characters\)
  1326. sed "s/^X//" >'libshade/Makefile.SH' <<'END_OF_FILE'
  1327. Xcase $CONFIG in
  1328. X'')
  1329. X    if test ! -f config.sh; then
  1330. X    ln ../config.sh . || \
  1331. X    ln ../../config.sh . || \
  1332. X    ln ../../../config.sh . || \
  1333. X    (echo "Can't find config.sh."; exit 1)
  1334. X    fi
  1335. X    . config.sh
  1336. X    ;;
  1337. Xesac
  1338. X: This forces SH files to create target in same directory as SH file.
  1339. X: This is so that make depend always knows where to find SH derivatives.
  1340. Xcase "$0" in
  1341. X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
  1342. Xesac
  1343. Xecho "Extracting Makefile (with variable substitutions)"
  1344. X: This section of the file will have variable substitutions done on it.
  1345. X: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
  1346. X: Protect any dollar signs and backticks that you do not want interpreted
  1347. X: by putting a backslash in front.  You may delete these comments.
  1348. X$spitshell >Makefile <<!GROK!THIS!
  1349. X#
  1350. X# Makefile for rayshade.
  1351. X#
  1352. X# Craig Kolb
  1353. X#
  1354. X# \$Id: Makefile.SH,v 4.0 91/07/17 14:44:47 kolb Exp Locker: kolb $
  1355. X#
  1356. X# Bin directory
  1357. X#
  1358. XBINDIR = $bin 
  1359. X#
  1360. X# If you are using LINDA, add -DLINDA
  1361. X# If you are running on a Multimax, add -DMULTIMAX -DSHAREDMEM
  1362. X# Be sure to add any necessary floating point hardware switches.
  1363. X# 
  1364. XOPTIMIZE = $optimize
  1365. XURTINC = $urtinc
  1366. XCCFLAGS = $ccflags $large
  1367. XCC = $cc
  1368. XMKDEP = $mkdep
  1369. XYACC = $yacc
  1370. XRANLIB = $ranlib
  1371. X
  1372. X!GROK!THIS!
  1373. X
  1374. X: In the following dollars and backticks do not need the extra backslash.
  1375. X$spitshell >>Makefile <<'!NO!SUBS!'
  1376. XLIBRAYDIR = ../libray
  1377. XINCLUDE = -I.. -I$(LIBRAYDIR)
  1378. XYFLAGS = -d
  1379. X
  1380. XCFLAGS = $(CCFLAGS) $(URTINC) $(INCLUDE) $(OPTIMIZE)
  1381. XSHELL = /bin/sh
  1382. X
  1383. XLIB = libshade.a
  1384. X
  1385. XSUPPORT_C =    builtin.c symtab.c misc.c lightdef.c objdef.c options.c \
  1386. X        stats.c surfdef.c
  1387. X
  1388. XSUPPORT_H =    ../config.h datatypes.h funcdefs.h \
  1389. X        ../patchlevel.h rayshade.h
  1390. X
  1391. XPARSE_C =    yacc.c lex.c
  1392. X
  1393. XDRIVE_C =    setup.c viewing.c shade.c picture.c
  1394. X
  1395. XDRIVE_H =    y.tab.h defaults.h viewing.h raytrace.h picture.h
  1396. X
  1397. XSUPPORT_O = $(SUPPORT_C:.c=.o)
  1398. X
  1399. XPARSE_O = $(PARSE_C:.c=.o)
  1400. X
  1401. XDRIVE_O = $(DRIVE_C:.c=.o)
  1402. X
  1403. XHFILES = $(DRIVE_H) $(SUPPORT_H)
  1404. X
  1405. XCFILES = $(DRIVE_C) $(PARSE_C) $(SUPPORT_C)
  1406. X
  1407. XSHFILES = Makefile.SH
  1408. X
  1409. XOFILES = $(DRIVE_O) $(PARSE_O) $(SUPPORT_O)
  1410. X
  1411. XDEPENDSRC = $(DRIVE_C) lex.l yacc.y $(SUPPORT_C)
  1412. X
  1413. X$(LIB): $(OFILES)
  1414. X    ar cur $(LIB) $(OFILES)
  1415. X    $(RANLIB) $(LIB)
  1416. X
  1417. X#
  1418. X# Uncomment the following rule if using Linda.
  1419. X#
  1420. X#raytrace.lo: raytrace.cl
  1421. X#    $(LCC) $(CFLAGS) -c raytrace.cl
  1422. X
  1423. X#
  1424. X# End of configuration section
  1425. X#
  1426. Xinstall:    rayshade
  1427. X        mv rayshade $(BINDIR)/rayshade
  1428. X
  1429. Xclean:
  1430. X    rm -f $(OFILES) core libshade.a
  1431. X
  1432. Xrealclean:
  1433. X    rm -f $(OFILES) core libshade.a y.tab.h
  1434. X    rm -f *.orig Makefile
  1435. X
  1436. Xlint:
  1437. X    lint $(CFLAGS) -x $(CFILES) -lm
  1438. X
  1439. Xtags:
  1440. X    ctags -t $(CFILES)
  1441. X
  1442. Xdepend:
  1443. X    (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
  1444. X     $(MKDEP) $(DEPENDSRC) | sed 's/: \.\//: /; /\/usr\/include/d' \
  1445. X    ) >Makefile.new
  1446. X    cp Makefile Makefile.bak
  1447. X    cp Makefile.new Makefile
  1448. X    rm -f Makefile.new
  1449. X
  1450. X
  1451. X# DO NOT DELETE THIS LINE
  1452. X!NO!SUBS!
  1453. Xchmod 755 Makefile
  1454. X$eunicefix Makefile
  1455. END_OF_FILE
  1456. if test 2825 -ne `wc -c <'libshade/Makefile.SH'`; then
  1457.     echo shar: \"'libshade/Makefile.SH'\" unpacked with wrong size!
  1458. fi
  1459. chmod +x 'libshade/Makefile.SH'
  1460. # end of 'libshade/Makefile.SH'
  1461. fi
  1462. if test -f 'libshade/surfdef.c' -a "${1}" != "-c" ; then 
  1463.   echo shar: Will not clobber existing file \"'libshade/surfdef.c'\"
  1464. else
  1465. echo shar: Extracting \"'libshade/surfdef.c'\" \(2988 characters\)
  1466. sed "s/^X//" >'libshade/surfdef.c' <<'END_OF_FILE'
  1467. X/*
  1468. X * surfdef.c
  1469. X *
  1470. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1471. X * All rights reserved.
  1472. X *
  1473. X * This software may be freely copied, modified, and redistributed
  1474. X * provided that this copyright notice is preserved on all copies.
  1475. X *
  1476. X * You may not distribute this software, in whole or in part, as part of
  1477. X * any commercial product without the express consent of the authors.
  1478. X *
  1479. X * There is no warranty or other guarantee of fitness of this software
  1480. X * for any purpose.  It is provided solely "as is".
  1481. X *
  1482. X * $Id: surfdef.c,v 4.0 91/07/17 14:47:53 kolb Exp Locker: kolb $
  1483. X *
  1484. X * $Log:    surfdef.c,v $
  1485. X * Revision 4.0  91/07/17  14:47:53  kolb
  1486. X * Initial version.
  1487. X * 
  1488. X */
  1489. X#include "rayshade.h"
  1490. X#include "libsurf/surface.h"
  1491. X
  1492. Xstatic Surface *Surfaces;    /* Named surfaces */
  1493. X
  1494. XSurface DefaultSurface = {
  1495. X        "DeFault",        /* name */
  1496. X        {0.1, 0.1, 0.1},    /* ambient */
  1497. X        {0.6, 0.6, 0.6},    /* diffuse */
  1498. X        {0.5, 0.5, 0.5},    /* specular */
  1499. X        {0.0, 0.0, 0.0},    /* Diffuse transmission 'curve' */
  1500. X        {1.0, 1.0, 1.0},    /* Specular transmission 'curve' */
  1501. X        12.,            /* reflected Phong coef */
  1502. X        12.,            /* transmitted Phong coef */
  1503. X        1.,            /* spec. transmitted attenuation */
  1504. X        DEFAULT_INDEX,        /* index of refr */
  1505. X        0.,            /* reflectivity */
  1506. X        0.,            /* transparency */
  1507. X        0.,            /* translucency */
  1508. X        FALSE,            /* noshadow */
  1509. X        NULL,            /* next */
  1510. X};
  1511. X
  1512. XSurface *SurfaceGetNamed(), *SurfaceFetchNamed();
  1513. X
  1514. X/*
  1515. X * Add surf to the list of defined surfaces.
  1516. X */
  1517. Xvoid
  1518. XSurfaceAddToDefined(surf)
  1519. XSurface *surf;
  1520. X{
  1521. X    /*
  1522. X     * Make sure index of refraction isn't bogus.
  1523. X     */
  1524. X    if (surf->transp > EPSILON && surf->index <= 0.)
  1525. X        RLerror(RL_PANIC,
  1526. X            "Index of refraction must be positive.\n");
  1527. X
  1528. X    if (surf->name == (char *)NULL || *surf->name == (char)NULL)
  1529. X        RLerror(RL_PANIC, "Surface with NULL name defined.\n");
  1530. X
  1531. X    if (SurfaceFetchNamed(surf->name) != (Surface *)NULL)
  1532. X        RLerror(RL_WARN,
  1533. X            "Redefinition of \"%s\" surface.", surf->name);
  1534. X
  1535. X    surf->next = Surfaces;
  1536. X    Surfaces = surf;
  1537. X}
  1538. X
  1539. X/*
  1540. X * Search for surface with given name.  If not found, complain and exit.
  1541. X */
  1542. XSurface *
  1543. XSurfaceGetNamed(name)
  1544. Xchar *name;
  1545. X{
  1546. X    Surface *stmp;
  1547. X
  1548. X    stmp = SurfaceFetchNamed(name);
  1549. X    if (stmp == (Surface *)NULL)
  1550. X        RLerror(RL_PANIC, "Undefined surface \"%s\".", name);
  1551. X
  1552. X    return stmp;
  1553. X}
  1554. X
  1555. X/*
  1556. X * Return pointer to surface with given name, NULL if no such surface.
  1557. X */
  1558. XSurface *
  1559. XSurfaceFetchNamed(name)
  1560. Xchar *name;
  1561. X{
  1562. X    Surface *stmp;
  1563. X
  1564. X    for (stmp = Surfaces; stmp ; stmp = stmp->next)
  1565. X        if(strcmp(name, stmp->name) == 0)
  1566. X            return stmp;
  1567. X    /*
  1568. X     * No surface named "name".
  1569. X     */
  1570. X    return (Surface *)NULL;
  1571. X}
  1572. X
  1573. X/*
  1574. X * Traverse the given hitlist to find the "bottom-most" surface.
  1575. X * If no surface is found, use the default.
  1576. X */
  1577. XSurface *
  1578. XGetShadingSurf(hitlist)
  1579. XHitList *hitlist;
  1580. X{
  1581. X    int i;
  1582. X
  1583. X    /*
  1584. X     * -1 here because the World always has a NULL surface
  1585. X     * (DefaultSurf is used instead)
  1586. X     */
  1587. X    for (i = 0; i < hitlist->nodes -1; i++) {
  1588. X        if (hitlist->data[i].obj->surf)
  1589. X            return hitlist->data[i].obj->surf;
  1590. X    }
  1591. X    /*
  1592. X     * No suface found -- use the default.
  1593. X     */
  1594. X    return &DefaultSurface;
  1595. X}
  1596. END_OF_FILE
  1597. if test 2988 -ne `wc -c <'libshade/surfdef.c'`; then
  1598.     echo shar: \"'libshade/surfdef.c'\" unpacked with wrong size!
  1599. fi
  1600. # end of 'libshade/surfdef.c'
  1601. fi
  1602. if test -f 'raypaint/Makefile.SH' -a "${1}" != "-c" ; then 
  1603.   echo shar: Will not clobber existing file \"'raypaint/Makefile.SH'\"
  1604. else
  1605. echo shar: Extracting \"'raypaint/Makefile.SH'\" \(2800 characters\)
  1606. sed "s/^X//" >'raypaint/Makefile.SH' <<'END_OF_FILE'
  1607. Xcase $CONFIG in
  1608. X'')
  1609. X    if test ! -f config.sh; then
  1610. X    ln ../config.sh . || \
  1611. X    ln ../../config.sh . || \
  1612. X    ln ../../../config.sh . || \
  1613. X    (echo "Can't find config.sh."; exit 1)
  1614. X    fi
  1615. X    . config.sh
  1616. X    ;;
  1617. Xesac
  1618. X: This forces SH files to create target in same directory as SH file.
  1619. X: This is so that make depend always knows where to find SH derivatives.
  1620. Xcase "$0" in
  1621. X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
  1622. Xesac
  1623. Xecho "Extracting Makefile (with variable substitutions)"
  1624. X: This section of the file will have variable substitutions done on it.
  1625. X: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
  1626. X: Protect any dollar signs and backticks that you do not want interpreted
  1627. X: by putting a backslash in front.  You may delete these comments.
  1628. X$spitshell >Makefile <<!GROK!THIS!
  1629. X#
  1630. X# Makefile for raypaint
  1631. X#
  1632. X# Craig Kolb
  1633. X#
  1634. X# \$Id: Makefile.SH,v 4.0 91/07/17 14:48:38 kolb Exp Locker: kolb $
  1635. X#
  1636. X# Bin directory
  1637. X#
  1638. XBINDIR = $bin 
  1639. X#
  1640. X# If you are using LINDA, add -DLINDA
  1641. X# If you are running on a Multimax, add -DMULTIMAX -DSHAREDMEM
  1642. X# Be sure to add any necessary floating point hardware switches.
  1643. X# 
  1644. XOPTIMIZE = $optimize
  1645. XURTINC = $urtinc
  1646. XCCFLAGS = $ccflags $large
  1647. XURTLIB = $urtlib
  1648. XLDFLAGS = $libs $ldflags
  1649. XCC = $cc
  1650. XMKDEP = $mkdep
  1651. XYACC = $yacc
  1652. X
  1653. X!GROK!THIS!
  1654. X
  1655. X: In the following dollars and backticks do not need the extra backslash.
  1656. X$spitshell >>Makefile <<'!NO!SUBS!'
  1657. XLIBRAYDIR = ../libray
  1658. XLIBSHADEDIR = ../libshade
  1659. XINCLUDE = -I$(LIBRAYDIR) -I$(LIBSHADEDIR) -I..
  1660. XYFLAGS = -d
  1661. X
  1662. X#
  1663. X# If using X11, use:
  1664. X#GRAPHICSLIB = -lX11
  1665. X
  1666. X#
  1667. X# If you are using GL, use:
  1668. XGRAPHICSLIB = -lgl_s
  1669. X
  1670. XLIBRAY = $(LIBRAYDIR)/libray.a
  1671. XLIBSHADE = $(LIBSHADEDIR)/libshade.a
  1672. X
  1673. XCFLAGS = $(CCFLAGS) $(URTINC) $(INCLUDE) $(OPTIMIZE) -DSHARED_EDGES
  1674. XSHELL = /bin/sh
  1675. X
  1676. X#
  1677. X# If you are using a Multimax, add -lpp
  1678. X# If you have a fast malloc library, use it (e.g., -lmalloc on MIPS machines)
  1679. X#
  1680. XLIBS = $(LIBSHADE) $(LIBRAY) $(URTLIB)
  1681. X
  1682. XDRIVE_C =    main.c graphics.c render.c version.c
  1683. X
  1684. XDRIVE_O = $(DRIVE_C:.c=.o)
  1685. X
  1686. XCFILES = $(DRIVE_C)
  1687. X
  1688. XSHFILES = Makefile.SH
  1689. X
  1690. XOBJ = $(DRIVE_O)
  1691. X
  1692. XDEPENDSRC = $(DRIVE_C)
  1693. X
  1694. Xraypaint: $(OBJ) $(LIBS)
  1695. X    $(CC) $(OPTIMIZE) -o raypaint $(OBJ) $(LIBS) $(LDFLAGS) $(GRAPHICSLIB)
  1696. X
  1697. X#
  1698. X# Uncomment the following rule if using Linda.
  1699. X#
  1700. X#raytrace.lo: raytrace.cl
  1701. X#    $(LCC) $(CFLAGS) -c raytrace.cl
  1702. X
  1703. X#
  1704. X# End of configuration section
  1705. X#
  1706. Xinstall:    raypaint
  1707. X        mv raypaint $(BINDIR)/raypaint
  1708. X
  1709. Xclean:
  1710. X    rm -f $(OBJ) core
  1711. X
  1712. Xrealclean:
  1713. X    rm -f $(OBJ) core y.tab.h
  1714. X    rm -f *.orig Makefile
  1715. X
  1716. Xlint:
  1717. X    lint $(CFLAGS) -x $(CFILES) -lm
  1718. X
  1719. Xtags:
  1720. X    ctags -t $(CFILES)
  1721. X
  1722. Xdepend:
  1723. X    (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
  1724. X     $(MKDEP) $(DEPENDSRC) | sed 's/: \.\//: /; /\/usr\/include/d' \
  1725. X    ) >Makefile.new
  1726. X    cp Makefile Makefile.bak
  1727. X    cp Makefile.new Makefile
  1728. X    rm -f Makefile.new
  1729. X
  1730. X
  1731. X# DO NOT DELETE THIS LINE
  1732. X!NO!SUBS!
  1733. Xchmod 755 Makefile
  1734. X$eunicefix Makefile
  1735. END_OF_FILE
  1736. if test 2800 -ne `wc -c <'raypaint/Makefile.SH'`; then
  1737.     echo shar: \"'raypaint/Makefile.SH'\" unpacked with wrong size!
  1738. fi
  1739. chmod +x 'raypaint/Makefile.SH'
  1740. # end of 'raypaint/Makefile.SH'
  1741. fi
  1742. if test -f 'raypaint/glgraphics.c' -a "${1}" != "-c" ; then 
  1743.   echo shar: Will not clobber existing file \"'raypaint/glgraphics.c'\"
  1744. else
  1745. echo shar: Extracting \"'raypaint/glgraphics.c'\" \(2838 characters\)
  1746. sed "s/^X//" >'raypaint/glgraphics.c' <<'END_OF_FILE'
  1747. X/*
  1748. X * glgraphics.c
  1749. X *
  1750. X * Copyright (C) 1989, 1991 Craig E. Kolb
  1751. X * All rights reserved.
  1752. X *
  1753. X * This software may be freely copied, modified, and redistributed
  1754. X * provided that this copyright notice is preserved on all copies.
  1755. X *
  1756. X * You may not distribute this software, in whole or in part, as part of
  1757. X * any commercial product without the express consent of the authors.
  1758. X * 
  1759. X * There is no warranty or other guarantee of fitness of this software
  1760. X * for any purpose.  It is provided solely "as is".
  1761. X *
  1762. X * $Id: glgraphics.c,v 4.0 91/07/17 17:36:39 kolb Exp Locker: kolb $
  1763. X *
  1764. X * $Log:    glgraphics.c,v $
  1765. X * Revision 4.0  91/07/17  17:36:39  kolb
  1766. X * Initial version.
  1767. X * 
  1768. X * 
  1769. X */
  1770. X
  1771. X#include <gl.h>
  1772. X#include <device.h>
  1773. X
  1774. X#define CPACK(x)    cpack(((((x)[2] << 8) | (x)[1]) << 8) | x[0])
  1775. X
  1776. XGraphicsInit(xsize, ysize, name)
  1777. Xint xsize, ysize;
  1778. Xchar *name;
  1779. X{
  1780. X#ifndef _IBMR2
  1781. X    foreground();
  1782. X#endif
  1783. X    prefsize(xsize, ysize);
  1784. X    winopen(name);
  1785. X    ortho2(-0.5, (float)xsize -0.5, -0.5, (float)ysize - 0.5);
  1786. X    viewport(0, xsize -1, 0, ysize -1);
  1787. X    color(BLACK);
  1788. X    clear();
  1789. X    RGBmode();
  1790. X    gconfig();
  1791. X    unqdevice(INPUTCHANGE);
  1792. X    qdevice(LEFTMOUSE);  /* Pop a square on request */
  1793. X    qdevice(MIDDLEMOUSE);
  1794. X    qdevice(RIGHTMOUSE);
  1795. X    qdevice(REDRAW);
  1796. X}
  1797. X
  1798. X/*
  1799. X * Draw the pixel at (xp, yp) in the color given by the rgb-triple,
  1800. X * 0 indicating 0 intensity, 255 max intensity.
  1801. X */
  1802. XGraphicsDrawPixel(xp, yp, color)
  1803. Xint xp, yp;
  1804. Xunsigned char color[3];
  1805. X{
  1806. X    unsigned long int pix;
  1807. X
  1808. X    pix = (((color[2] << 8) | color[1]) << 8) | color[0];
  1809. X    lrectwrite(xp, yp, xp, yp, &pix);
  1810. X}
  1811. X
  1812. X/*
  1813. X * Draw the rectangle with lower left corner (xp, yp) and upper right
  1814. X * corner (xp+ys, yp+ys).  The colors of the l-l, l-r, u-r, and u-l
  1815. X * corners are given as arrays of unsigned chars as above.
  1816. X */
  1817. XGraphicsDrawRectangle(xp, yp, xs, ys, ll, lr, ur, ul)
  1818. Xint xp, yp, xs, ys;
  1819. Xunsigned char ll[3], lr[3], ur[3], ul[3];
  1820. X{
  1821. X    int   p[2];
  1822. X
  1823. X#if defined(_IBMR2) && !defined(SHARED_EDGES)
  1824. X    /*
  1825. X     * RS6000 doesn't seem to draw lower and left edges
  1826. X     * of rectangles correctly.
  1827. X     */
  1828. X    xp--; yp--;
  1829. X    xs++; ys++;
  1830. X#endif
  1831. X    bgnpolygon();
  1832. X
  1833. X    p[0] = xp; p[1] = yp;
  1834. X    CPACK(ll);
  1835. X    v2i(p);
  1836. X
  1837. X    p[0] += xs;
  1838. X    CPACK(lr);
  1839. X    v2i(p);
  1840. X
  1841. X    p[1] += ys;
  1842. X    CPACK(ur);
  1843. X    v2i(p);
  1844. X    
  1845. X    p[0] = xp;
  1846. X    CPACK(ul);
  1847. X    v2i(p);
  1848. X
  1849. X    endpolygon();
  1850. X}
  1851. X
  1852. XGraphicsLeftMouseEvent()
  1853. X{
  1854. X    /*
  1855. X     * Return TRUE if left mouse button is down.
  1856. X     */
  1857. X    return getbutton(LEFTMOUSE);
  1858. X}
  1859. X
  1860. XGraphicsMiddleMouseEvent()
  1861. X{
  1862. X    return getbutton(MIDDLEMOUSE);
  1863. X}
  1864. X
  1865. XGraphicsRightMouseEvent()
  1866. X{
  1867. X    return getbutton(RIGHTMOUSE);
  1868. X}
  1869. X
  1870. X/*
  1871. X * Return position of mouse in unnormalized screen coordinates.
  1872. X */
  1873. XGraphicsGetMousePos(x, y)
  1874. Xint *x, *y;
  1875. X{
  1876. X    int xo, yo;
  1877. X
  1878. X    getorigin(&xo, &yo);
  1879. X    *x = getvaluator( MOUSEX ) - xo;
  1880. X    *y = getvaluator( MOUSEY ) - yo;
  1881. X}
  1882. X
  1883. XGraphicsRedraw()
  1884. X{
  1885. X    Device dev;
  1886. X    short val;
  1887. X
  1888. X    while (qtest()) {
  1889. X        dev = qread(&val);
  1890. X        if (dev == REDRAW) {
  1891. X            reshapeviewport();
  1892. X            return TRUE;
  1893. X        }
  1894. X    }
  1895. X    return FALSE;
  1896. X}
  1897. END_OF_FILE
  1898. if test 2838 -ne `wc -c <'raypaint/glgraphics.c'`; then
  1899.     echo shar: \"'raypaint/glgraphics.c'\" unpacked with wrong size!
  1900. fi
  1901. # end of 'raypaint/glgraphics.c'
  1902. fi
  1903. if test -f 'raypaint/main.c' -a "${1}" != "-c" ; then 
  1904.   echo shar: Will not clobber existing file \"'raypaint/main.c'\"
  1905. else
  1906. echo shar: Extracting \"'raypaint/main.c'\" \(2648 characters\)
  1907. sed "s/^X//" >'raypaint/main.c' <<'END_OF_FILE'
  1908. X/*
  1909. X * main.c
  1910. X *
  1911. X * Copyright (C) 1989, 1991, Craig E. Kolb
  1912. X * All rights reserved.
  1913. X *
  1914. X * This software may be freely copied, modified, and redistributed
  1915. X * provided that this copyright notice is preserved on all copies.
  1916. X *
  1917. X * You may not distribute this software, in whole or in part, as part of
  1918. X * any commercial product without the express consent of the authors.
  1919. X *
  1920. X * There is no warranty or other guarantee of fitness of this software
  1921. X * for any purpose.  It is provided solely "as is".
  1922. X *
  1923. X * $Id: main.c,v 4.0 91/07/17 17:36:46 kolb Exp Locker: kolb $
  1924. X *
  1925. X * $Log:    main.c,v $
  1926. X * Revision 4.0  91/07/17  17:36:46  kolb
  1927. X * Initial version.
  1928. X * 
  1929. X * 
  1930. X */
  1931. X
  1932. Xchar rcsid[] = "$Id: main.c,v 4.0 91/07/17 17:36:46 kolb Exp Locker: kolb $";
  1933. X
  1934. X#include "rayshade.h"
  1935. X#include "options.h"
  1936. X#include "stats.h"
  1937. X#include "viewing.h"
  1938. X#include "picture.h"
  1939. X
  1940. Xvoid RSInitialize(), RSStartFrame();
  1941. X
  1942. Xint
  1943. Xmain(argc, argv)
  1944. Xint argc;
  1945. Xchar **argv;
  1946. X{
  1947. X    Float utime, stime;
  1948. X
  1949. X    /*
  1950. X      * Initialize variables, etc.
  1951. X     */
  1952. X    RSInitialize(argc, argv);
  1953. X    RSStartFrame(Options.startframe);
  1954. X    /*
  1955. X      * Print more information than we'll ever need to know...
  1956. X     */
  1957. X    if (Options.verbose) {
  1958. X        extern Geom *World;
  1959. X        /* World object info. */
  1960. X        AggregatePrintInfo(World, Stats.fstats);
  1961. X        /* Print info about rendering options and the like. */
  1962. X        RSOptionsList();
  1963. X    }
  1964. X    /*
  1965. X     * Print preprocessing time.
  1966. X     */
  1967. X    RSGetCpuTime(&utime, &stime);
  1968. X    fprintf(Stats.fstats,"Preprocessing time:\t");
  1969. X    fprintf(Stats.fstats,"%2.2fu  %2.2fs\n", utime, stime);
  1970. X    fprintf(Stats.fstats,"Starting trace.\n");
  1971. X    (void)fflush(Stats.fstats);
  1972. X    /*
  1973. X     * Render the image.
  1974. X     */
  1975. X    Render(argc, argv);
  1976. X    StatsPrint();
  1977. X    return 0;
  1978. X}
  1979. X
  1980. Xstatic void
  1981. XRSStartFrame(frame)
  1982. Xint frame;
  1983. X{
  1984. X    /*
  1985. X     * Set the frame start time
  1986. X     */
  1987. X    Options.framenum = frame;
  1988. X    Options.framestart = Options.starttime +
  1989. X            Options.framenum*Options.framelength;
  1990. X    SamplingSetTime(Options.framestart, Options.shutterspeed,
  1991. X            Options.framenum);
  1992. X    /*
  1993. X     * Set up viewing parameters.
  1994. X     */
  1995. X    RSViewing();
  1996. X    /*
  1997. X     * Initialize world
  1998. X     */
  1999. X    WorldSetup();
  2000. X}
  2001. X
  2002. X/*
  2003. X * Initialize non-time-varying goodies.
  2004. X */
  2005. Xstatic void
  2006. XRSInitialize(argc, argv)
  2007. Xint argc;
  2008. Xchar **argv;
  2009. X{
  2010. X    /*
  2011. X      * Initialize variables, etc.
  2012. X     */
  2013. X    RSSetup();
  2014. X    /*
  2015. X     * Parse options from command line.
  2016. X     */
  2017. X    RSOptionsSet(argc, argv);
  2018. X    /*
  2019. X     * Process input file.
  2020. X     */
  2021. X    if (Options.verbose) {
  2022. X        VersionPrint();
  2023. X        fprintf(Stats.fstats,"Reading input file...\n");
  2024. X        (void)fflush(Stats.fstats);
  2025. X    }
  2026. X    RSReadInputFile();
  2027. X    /*
  2028. X     * Set variables that weren't set on command line
  2029. X     * or in input file.
  2030. X     */
  2031. X    RSCleanup();
  2032. X    /*
  2033. X     * Set sampling options.
  2034. X     */
  2035. X    SamplingSetOptions(Options.samples, Options.gaussian,
  2036. X               Options.filterwidth);
  2037. X}
  2038. END_OF_FILE
  2039. if test 2648 -ne `wc -c <'raypaint/main.c'`; then
  2040.     echo shar: \"'raypaint/main.c'\" unpacked with wrong size!
  2041. fi
  2042. # end of 'raypaint/main.c'
  2043. fi
  2044. if test -f 'rayshade/Makefile.SH' -a "${1}" != "-c" ; then 
  2045.   echo shar: Will not clobber existing file \"'rayshade/Makefile.SH'\"
  2046. else
  2047. echo shar: Extracting \"'rayshade/Makefile.SH'\" \(2719 characters\)
  2048. sed "s/^X//" >'rayshade/Makefile.SH' <<'END_OF_FILE'
  2049. Xcase $CONFIG in
  2050. X'')
  2051. X    if test ! -f config.sh; then
  2052. X    ln ../config.sh . || \
  2053. X    ln ../../config.sh . || \
  2054. X    ln ../../../config.sh . || \
  2055. X    (echo "Can't find config.sh."; exit 1)
  2056. X    fi
  2057. X    . config.sh
  2058. X    ;;
  2059. Xesac
  2060. X: This forces SH files to create target in same directory as SH file.
  2061. X: This is so that make depend always knows where to find SH derivatives.
  2062. Xcase "$0" in
  2063. X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
  2064. Xesac
  2065. Xecho "Extracting Makefile (with variable substitutions)"
  2066. X: This section of the file will have variable substitutions done on it.
  2067. X: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
  2068. X: Protect any dollar signs and backticks that you do not want interpreted
  2069. X: by putting a backslash in front.  You may delete these comments.
  2070. X$spitshell >Makefile <<!GROK!THIS!
  2071. X#
  2072. X# Makefile for rayshade.
  2073. X#
  2074. X# Craig Kolb
  2075. X#
  2076. X# \$Id: Makefile.SH,v 4.0 91/07/17 14:50:30 kolb Exp Locker: kolb $
  2077. X#
  2078. X# Bin directory
  2079. X#
  2080. XBINDIR = $bin 
  2081. XOPTIMIZE = $optimize
  2082. XURTINC = $urtinc
  2083. XCCFLAGS = $ccflags $large
  2084. XURTLIB = $urtlib
  2085. XLDFLAGS = $libs $ldflags
  2086. XCC = $cc
  2087. XMKDEP = $mkdep
  2088. XYACC = $yacc
  2089. XCLC = $lindacc
  2090. X
  2091. X!GROK!THIS!
  2092. X
  2093. X: In the following dollars and backticks do not need the extra backslash.
  2094. X$spitshell >>Makefile <<'!NO!SUBS!'
  2095. XLIBRAYDIR = ../libray
  2096. XLIBSHADEDIR = ../libshade
  2097. XINCLUDE = -I$(LIBRAYDIR) -I$(LIBSHADEDIR) -I.. $(URTINC)
  2098. XYFLAGS = -d
  2099. X
  2100. XLIBRAY = $(LIBRAYDIR)/libray.a
  2101. XLIBSHADE = $(LIBSHADEDIR)/libshade.a
  2102. X
  2103. X#
  2104. X# If you are using LINDA, add -DLINDA
  2105. X# If you are running 'tsnet'-style LINDA, add -DTSNET
  2106. X# If you are running on a Multimax, add -DMULTIMAX -DSHAREDMEM
  2107. X# 
  2108. X
  2109. XCFLAGS = $(CCFLAGS) $(INCLUDE) $(OPTIMIZE)
  2110. X
  2111. X#
  2112. X# C-Linda flags, if appropriate
  2113. X#CLFLAGS = -linda ts 20000
  2114. X#
  2115. X
  2116. XSHELL = /bin/sh
  2117. X
  2118. XLIBS = $(LIBSHADE) $(LIBRAY) $(URTLIB)
  2119. X
  2120. XDRIVE_C =    main.c raytrace.c version.c
  2121. X
  2122. XDRIVE_H =    raytrace.h
  2123. X
  2124. XDRIVE_O = $(DRIVE_C:.c=.o)
  2125. X
  2126. XHFILES = $(DRIVE_H)
  2127. X
  2128. XCFILES = $(DRIVE_C)
  2129. X
  2130. XSHFILES = Makefile.SH
  2131. X
  2132. XOBJ = $(DRIVE_O)
  2133. X
  2134. XDEPENDSRC = $(DRIVE_C)
  2135. X
  2136. X#
  2137. X# Change $(CC) below to $(CLC) if using Linda.
  2138. X#
  2139. Xrayshade: $(OBJ) $(LIBS)
  2140. X    $(CC) $(OPTIMIZE) -o rayshade $(OBJ) $(LIBS) $(LDFLAGS)
  2141. X
  2142. X#
  2143. X# Uncomment the following rule if using Linda.
  2144. X#
  2145. X#raytrace.lo: raytrace.cl
  2146. X#    $(CLC) $(INCLUDE) $(LCFLAGS) -c raytrace.cl
  2147. X
  2148. X#
  2149. X# End of configuration section
  2150. X#
  2151. Xinstall:    rayshade
  2152. X        mv rayshade $(BINDIR)/rayshade
  2153. X
  2154. Xclean:
  2155. X    rm -f $(OBJ) core
  2156. X
  2157. Xrealclean:
  2158. X    rm -f $(OBJ) core y.tab.h
  2159. X    rm -f *.orig Makefile
  2160. X
  2161. Xlint:
  2162. X    lint $(CFLAGS) -x $(CFILES) -lm
  2163. X
  2164. Xtags:
  2165. X    ctags -t $(CFILES)
  2166. X
  2167. Xdepend:
  2168. X    (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
  2169. X     $(MKDEP) $(DEPENDSRC) | sed 's/: \.\//: /; /\/usr\/include/d' \
  2170. X    ) >Makefile.new
  2171. X    cp Makefile Makefile.bak
  2172. X    cp Makefile.new Makefile
  2173. X    rm -f Makefile.new
  2174. X
  2175. X
  2176. X# DO NOT DELETE THIS LINE
  2177. X!NO!SUBS!
  2178. Xchmod 755 Makefile
  2179. X$eunicefix Makefile
  2180. END_OF_FILE
  2181. if test 2719 -ne `wc -c <'rayshade/Makefile.SH'`; then
  2182.     echo shar: \"'rayshade/Makefile.SH'\" unpacked with wrong size!
  2183. fi
  2184. chmod +x 'rayshade/Makefile.SH'
  2185. # end of 'rayshade/Makefile.SH'
  2186. fi
  2187. if test -f 'rayview/Makefile.SH' -a "${1}" != "-c" ; then 
  2188.   echo shar: Will not clobber existing file \"'rayview/Makefile.SH'\"
  2189. else
  2190. echo shar: Extracting \"'rayview/Makefile.SH'\" \(2878 characters\)
  2191. sed "s/^X//" >'rayview/Makefile.SH' <<'END_OF_FILE'
  2192. Xcase $CONFIG in
  2193. X'')
  2194. X    if test ! -f config.sh; then
  2195. X    ln ../config.sh . || \
  2196. X    ln ../../config.sh . || \
  2197. X    ln ../../../config.sh . || \
  2198. X    (echo "Can't find config.sh."; exit 1)
  2199. X    fi
  2200. X    . config.sh
  2201. X    ;;
  2202. Xesac
  2203. X: This forces SH files to create target in same directory as SH file.
  2204. X: This is so that make depend always knows where to find SH derivatives.
  2205. Xcase "$0" in
  2206. X*/*) cd `expr X$0 : 'X\(.*\)/'` ;;
  2207. Xesac
  2208. Xecho "Extracting Makefile (with variable substitutions)"
  2209. X: This section of the file will have variable substitutions done on it.
  2210. X: Move anything that needs config subs from !NO!SUBS! section to !GROK!THIS!.
  2211. X: Protect any dollar signs and backticks that you do not want interpreted
  2212. X: by putting a backslash in front.  You may delete these comments.
  2213. X$spitshell >Makefile <<!GROK!THIS!
  2214. X#
  2215. X# Makefile for rayview 
  2216. X#
  2217. X# Craig Kolb
  2218. X#
  2219. X# \$Id: Makefile.SH,v 4.0 91/07/17 14:55:03 kolb Exp Locker: kolb $
  2220. X#
  2221. X# Bin directory
  2222. X#
  2223. XBINDIR = $bin 
  2224. X#
  2225. X# If you are using LINDA, add -DLINDA
  2226. X# If you are running on a Multimax, add -DMULTIMAX -DSHAREDMEM
  2227. X# Be sure to add any necessary floating point hardware switches.
  2228. X# 
  2229. XOPTIMIZE = $optimize
  2230. XURTINC = $urtinc
  2231. XCCFLAGS = $ccflags $large
  2232. XURTLIB = $urtlib
  2233. XLDFLAGS = $libs $ldflags
  2234. XCC = $cc
  2235. XMKDEP = $mkdep
  2236. XYACC = $yacc
  2237. X
  2238. X!GROK!THIS!
  2239. X
  2240. X: In the following dollars and backticks do not need the extra backslash.
  2241. X$spitshell >>Makefile <<'!NO!SUBS!'
  2242. XLIBRAYDIR = ../libray
  2243. XLIBSHADEDIR = ../libshade
  2244. XINCLUDE = -I$(LIBRAYDIR) -I$(LIBSHADEDIR) -I..
  2245. XYFLAGS = -d
  2246. X
  2247. X#
  2248. X# If using GL on an SGI machine, use:
  2249. XGRAPHICSLIBS = -lsphere -lgl_s
  2250. XSPHERELIB = -DSPHERELIB
  2251. X
  2252. X#
  2253. X# If using GL on an RS6000, use:
  2254. X#GRAPHICSLIBS = -lgl
  2255. X#SPHERELIB=
  2256. X
  2257. XLIBRAY = $(LIBRAYDIR)/libray.a
  2258. XLIBSHADE = $(LIBSHADEDIR)/libshade.a
  2259. X
  2260. XCFLAGS = $(CCFLAGS) $(SPHERELIB) $(URTINC) $(INCLUDE) $(OPTIMIZE)
  2261. XSHELL = /bin/sh
  2262. X
  2263. X#
  2264. X# If you have a fast malloc library, use it (e.g., -lmalloc on MIPS machines)
  2265. X#
  2266. XLIBS = $(LIBSHADE) $(LIBRAY) $(URTLIB)
  2267. X
  2268. XDRIVE_C =    main.c glmethods.c spheregen.c version.c
  2269. X
  2270. XDRIVE_O = $(DRIVE_C:.c=.o)
  2271. X
  2272. XCFILES = $(DRIVE_C)
  2273. X
  2274. XSHFILES = Makefile.SH
  2275. X
  2276. XOBJ = $(DRIVE_O)
  2277. X
  2278. XDEPENDSRC = $(DRIVE_C)
  2279. X
  2280. X#
  2281. X# Change $(CC) below to $(LCC) if using Linda.
  2282. X#
  2283. Xrayview: $(OBJ) $(LIBS)
  2284. X    $(CC) $(OPTIMIZE) -o rayview $(OBJ) $(GRAPHICSLIBS) $(LIBS) $(LDFLAGS)
  2285. X
  2286. X#
  2287. X# Uncomment the following rule if using Linda.
  2288. X#
  2289. X#raytrace.lo: raytrace.cl
  2290. X#    $(LCC) $(CFLAGS) -c raytrace.cl
  2291. X
  2292. X#
  2293. X# End of configuration section
  2294. X#
  2295. Xinstall:    rayview    
  2296. X        mv rayview $(BINDIR)/rayview
  2297. X
  2298. Xclean:
  2299. X    rm -f $(OBJ) core
  2300. X
  2301. Xrealclean:
  2302. X    rm -f $(OBJ) core y.tab.h
  2303. X    rm -f *.orig Makefile
  2304. X
  2305. Xlint:
  2306. X    lint $(CFLAGS) -x $(CFILES) -lm
  2307. X
  2308. Xtags:
  2309. X    ctags -t $(CFILES)
  2310. X
  2311. Xdepend:
  2312. X    (sed '/^# DO NOT DELETE THIS LINE/q' Makefile && \
  2313. X     $(MKDEP) $(DEPENDSRC) | sed 's/: \.\//: /; /\/usr\/include/d' \
  2314. X    ) >Makefile.new
  2315. X    cp Makefile Makefile.bak
  2316. X    cp Makefile.new Makefile
  2317. X    rm -f Makefile.new
  2318. X
  2319. X
  2320. X# DO NOT DELETE THIS LINE
  2321. X!NO!SUBS!
  2322. Xchmod 755 Makefile
  2323. X$eunicefix Makefile
  2324. END_OF_FILE
  2325. if test 2878 -ne `wc -c <'rayview/Makefile.SH'`; then
  2326.     echo shar: \"'rayview/Makefile.SH'\" unpacked with wrong size!
  2327. fi
  2328. chmod +x 'rayview/Makefile.SH'
  2329. # end of 'rayview/Makefile.SH'
  2330. fi
  2331. echo shar: End of archive 6 \(of 19\).
  2332. cp /dev/null ark6isdone
  2333. MISSING=""
  2334. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do
  2335.     if test ! -f ark${I}isdone ; then
  2336.     MISSING="${MISSING} ${I}"
  2337.     fi
  2338. done
  2339. if test "${MISSING}" = "" ; then
  2340.     echo You have unpacked all 19 archives.
  2341.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2342. else
  2343.     echo You still need to unpack the following archives:
  2344.     echo "        " ${MISSING}
  2345. fi
  2346. ##  End of shell archive.
  2347. exit 0
  2348.  
  2349. exit 0 # Just in case...
  2350.