#! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh 'Doc/Globals' <<'END_OF_FILE' X/* X * Variables shared by the various libraries: X */ X XFloat XRSAbstmp X X Temporary variable used by the fabs() macro to keep X expressions from being evaluated twice (e.g., X fabs(cos(x)) is expanded to ((x=cos(x) < 0 ? -x : x) X rather than ((x=cos(x) < 0 ? -cos(x) : cos(x)) ). X Could be removed by making fabs a function or not minding X if expressions are evaluated twice. X XSampleInfo XSampling X X Variables used to control sampling. X Used in conjunction with a ray's sample number X (ray->sample) to determine how to sample, for example, X extended light sources. X X/* X * Variables shared by modules in the rayshade application: X */ XRSCamera XCamera X Camera definition. Used in viewing, setup, and parsing. X XRSScreen XScreen X Screen information. Used in viewing, setup, and parsing. X XRSOptions XOptions X X Options of all sorts. X XRSStats XStats X X Statistical information. X XMedium XTopMedium X X "Air" description (index of refraction and atmospheric effects). X Used in viewing, parsing, and ShadeRay. X XLight * XLights X X Array of defined lights. Used in parsing and in shade(). X X/* X * Application-provided functions: X */ XSurface * XGetShadingSurf(hitlist) XHitList *hitlist X X Given a hitlist, return the surface to be used in shading. X Xint XTraceRay(ray, hitlist, mindist, maxdist) XRay *ray; XHitList *hitlist; XFloat mindist, *maxdist; X X Intersect the top-level object with the given ray. X Probably as simple as: X return intersect(World, ray, hitlist, mindist, maxdist) X Xvoid XRLerror(level, pattern, arg1, arg2, arg3) Xint level; Xchar *pattern, *arg1, *arg2, *arg3; X X Error-reporting function. 'level' indicates the severity of X the error (see libcommon/error.h). 'pattern' and the X args are suitable for printing via: X fprintf(stderr, patter, arg1, arg2, arg3); X Note that as the args are cast to char *'s, printing, for X example, several doubles, will not work. (Being more X rigorous about it would require varargs or something similar.) END_OF_FILE if test 1927 -ne `wc -c <'Doc/Globals'`; then echo shar: \"'Doc/Globals'\" unpacked with wrong size! fi # end of 'Doc/Globals' fi if test -f 'Doc/Guide/height.tex' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Doc/Guide/height.tex'\" else echo shar: Extracting \"'Doc/Guide/height.tex'\" \(1846 characters\) sed "s/^X//" >'Doc/Guide/height.tex' <<'END_OF_FILE' X\chapter{Height Field Files} X XThis appendix describes the format of the files that store data Xfor the height field primitive. XThe format is an historical relic; a better format is needed. X XHeight field data is stored in binary form. XThe first record in the file is a X32-bit integer giving the square root of number of data Xpoints in the file. XWe'll call this number Xthe size of the height field. X XThe size is Xfollowed by altitude ($z$) values stored as 32-bit Xfloating point values. The 0th value in the file specifies the $z$ Xcoordinate Xof the lower-left corner of the height field (0, 0). XThe next Xspecifies the Z coordinate for $(1/(size-1), 0)$. The last specifies the Xcoordinate for $(1., 1.)$. In other words, the $i^{th}$ value Xin the heightfield file specifies the $z$ coordinate for the point Xwhose $x$ coordinate is X$(i \% size) / (size -1)$, and whose X$y$ coordinate is $(i / size) / (size -1)$. XNon-square height fields may be rendered by specifying altitude values Xless than or equal to the magic value X$-1000$. Triangles that have any vertex less than Xor equal in altitude to this value are not rendered. X XWhile this file format is compact, it sacrifices portability for Xease of use. While creating and handling height field files is Xsimple, transporting a height field from one machine to another Xis problematical due to the fact that differences in byte order Xand floating-point format between machines is not taken into Xaccount. X XThese problems could be circumvented by writing the height field file Xin a fixed-point format, taking care to write the bytes that Xencode a given value in a consistent way from machine to machine. XAn even better idea would be to write a set of tools for Xmanipulating arbitrary 2D arrays of floating-point values in a compact, Xportable way, allowing for comments and the like in the file\ldots END_OF_FILE if test 1846 -ne `wc -c <'Doc/Guide/height.tex'`; then echo shar: \"'Doc/Guide/height.tex'\" unpacked with wrong size! fi # end of 'Doc/Guide/height.tex' fi if test -f 'Examples/csg.ray' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Examples/csg.ray'\" else echo shar: Extracting \"'Examples/csg.ray'\" \(2330 characters\) sed "s/^X//" >'Examples/csg.ray' <<'END_OF_FILE' X/* X * csg wood block (apologies to Hofstadter) X * X * Eric Haines X * X */ Xname letter_c Xdifference X list X cylinder 1 0 0 -1.0 0 0 1.0 X disc 1 0 0 -1.0 0 0 -1 X disc 1 0 0 1.0 0 0 1 X end X union X list X cylinder 0.55 0 0 -1.2 0 0 1.2 X disc 0.55 0 0 -1.2 0 0 -1 X disc 0.55 0 0 1.2 0 0 1 X end X box 0. -.3 -1.2 1.2 0.3 1.2 X end Xend X X Xname s1 /* outer top part of s */ Xlist X cylinder 0.6125 -0.3875 0.3875 -1.0 -0.3875 0.3875 1.0 X disc 0.6125 -0.3875 0.3875 -1.0 0 0 -1 X disc 0.6125 -0.3875 0.3875 1.0 0 0 1 X cylinder 0.6125 0.3875 -0.3875 -1.0 0.3875 -0.3875 1.0 X disc 0.6125 0.3875 -0.3875 -1.0 0 0 -1 X disc 0.6125 0.3875 -0.3875 1.0 0 0 1 Xend X Xname s3 /* all inner part of s */ Xunion X list X cylinder 0.1625 -0.3875 0.3875 -1.2 -0.3875 0.3875 1.2 X disc 0.1625 -0.3875 0.3875 -1.2 0 0 -1 X disc 0.1625 -0.3875 0.3875 1.2 0 0 1 X cylinder 0.1625 0.3875 -0.3875 -1.2 0.3875 -0.3875 1.2 X disc 0.1625 0.3875 -0.3875 -1.2 0 0 -1 X disc 0.1625 0.3875 -0.3875 1.2 0 0 1 X end X box -.3875 -1.2 -1.2 .3875 1.2 1.2 Xend X Xname letter_s Xunion X union X union X difference X object s1 X object s3 X end X X box -0.3875 0.55 -1 1 1 1 X end X box -0.3875 -0.225 -1 0.3875 0.225 1 X end X box -1 -1 -1 0.3875 -0.55 1 Xend X X Xname g3 /*all inner of g */ Xunion X list X cylinder 0.55 0 0 -1.2 0 0 1.2 X disc 0.55 0 0 -1.2 0 0 -1 X disc 0.55 0 0 1.2 0 0 1 X end X box 0. 0. -1.2 1.2 0.425 1.2 Xend X Xname letter_g Xunion X difference X list /* outer part of g */ X cylinder 1.0 0 0 -1.0 0 0 1.0 X disc 1 0 0 -1.0 0 0 -1 X disc 1 0 0 1.0 0 0 1 X end X object g3 X end X box 0.25 -0.3375 -1.2 1.05 0.1125 1.2 Xend X Xname csg Xdifference X difference X object letter_s rotate 1 0 0 90 X object letter_c rotate 1 0 0 90 rotate 0 0 1 90 X scale 1.2 0.8 0.8 X end X object letter_g scale 0.8 0.8 1.2 X /* scaling here is to avoid coincident surfaces */ Xend X Xsurface white ambient .1 .1 .1 diffuse .5 .5 .5 X Xsurface s1 ambient .5 .4 .3 diffuse .25 .2 .15 Xsurface lgreen ambient .07 .1 .07 X diffuse .42 .6 .42 X specular .28 .4 .28 specpow 10 X Xplane white 0 0 -3 0 0 1 Xplane white 0 3 0 0 -1 0 Xplane white -3 0 0 1 0 0 X Xobject s1 csg /* texture wood scale 3 3 3*/ X Xlight 0.8 directional 0 0 1 Xlight 0.7 directional 0 -1 0 Xlight 0.6 directional 1 0 0 X Xbackground .1 .3 .8 Xeyep 10. -13 8. Xlookp 0 0 -0.3 Xup 0 0 1 Xfov 20. END_OF_FILE if test 2330 -ne `wc -c <'Examples/csg.ray'`; then echo shar: \"'Examples/csg.ray'\" unpacked with wrong size! fi chmod +x 'Examples/csg.ray' # end of 'Examples/csg.ray' fi if test -f 'Examples/mtv.ray' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Examples/mtv.ray'\" else echo shar: Extracting \"'Examples/mtv.ray'\" \(1943 characters\) sed "s/^X//" >'Examples/mtv.ray' <<'END_OF_FILE' X/* X * Logo for a certain drek-filled cable channel. X * Rod Bogart, 10/90 X */ Xeyep 0 20 8 Xlookp 0 0 3.5 Xfov 30 Xbackground .1 .3 .8 Xlight 1 1 1 directional 0.5 1.5 2 Xscreen 100 100 Xmaxdepth 10 Xsurface red X ambient .2 .05 .05 X diffuse .8 .1 .05 X specular .05 .05 .05 specpow 20 Xsurface green X ambient .05 .2 .05 X diffuse .1 .8 .05 X specular .05 .05 .05 specpow 20 Xsurface blue X ambient .05 .05 .2 X diffuse .1 .1 .8 X specular .05 .05 .05 specpow 20 Xsurface white X ambient .2 .2 .2 X diffuse 1. 1. 1. X specular 0.2 0.2 0.2 specpow 18 Xsurface glass X ambient .02 .02 .02 X diffuse 0.1 0.1 0.1 X specular 0.8 0.8 0.8 specpow 200 X transp 1. index 1.5 Xsurface redglass X ambient .52 .02 .02 X transp 1. index 1.0 Xsurface greenglass X ambient .02 .52 .02 X transp 1 index 1.0 Xsurface m_surf specpow 20 specular 1. 1. 1. transp .8 reflect .1 index 1.4 Xsurface tv_surf X ambient .2 .05 .05 X diffuse .8 .1 .05 X specular .05 .05 .05 specpow 20 Xplane white 0 0 -0.05 0 0 1 texture checker diffuse .8 .1 .05 scale 2 2 2 X Xname general_cyl Xlist X cylinder tv_surf 0.25 0 0 0 0 0 1 X disc tv_surf 0.25 0 0 1 0 0 1 X disc tv_surf 0.25 0 0 0 0 0 -1 Xend X Xname thingy Xgrid 6 6 6 X union /* M */ X list /* m legs */ X box m_surf 1.0 -1 0 4.2 1 7.0 X box m_surf -4.2 -1 0 -1 1 7.0 X /*box m_surf 2.6 0 3.5 1.6 1 3.5 X box m_surf -2.6 0 3.5 1.6 1 3.5 */ X end X difference X box m_surf (-4.5^0.5) -1 (-4.5^0.5) X (4.5^0.5) 1 (4.5^0.5) X translate (4.5^0.5) 0 (4.5^0.5) X rotate 0 1 0 -45 translate 0 0 2 X box m_surf -1 -1 -1 1 1 1 X translate 1 0 1 X rotate 0 1 0 -45 translate 0 0 6 X end X end /* M */ X /* TV */ X object general_cyl scale 1 1 3.6 rotate 0 1 0 -64 translate 0.2 0 3.4 X object general_cyl scale 1 1 4.0 rotate 0 1 0 3 translate -1.8 0 0.9 X object general_cyl scale 1 1 2.7 rotate 0 1 0 15 translate -3.2 0 1.5 X object general_cyl scale 1 1 5.0 rotate 0 1 0 -25 translate -3.2 0 1.5 Xend X Xobject thingy rotate 0 0 1 -40 END_OF_FILE if test 1943 -ne `wc -c <'Examples/mtv.ray'`; then echo shar: \"'Examples/mtv.ray'\" unpacked with wrong size! fi # end of 'Examples/mtv.ray' fi if test -f 'libray/libcommon/common.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libcommon/common.h'\" else echo shar: Extracting \"'libray/libcommon/common.h'\" \(2391 characters\) sed "s/^X//" >'libray/libcommon/common.h' <<'END_OF_FILE' X/* X * common.h X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: common.h,v 4.0.1.1 91/11/26 21:34:27 cek Exp Locker: cek $ X * X * $Log: common.h,v $ X * Revision 4.0.1.1 91/11/26 21:34:27 cek X * patch3: Added EPSILON definition, redefine equal() macro. X * X * Revision 4.0 91/07/17 14:30:18 kolb X * Initial version. X * X */ X#ifndef COMMON_H X#define COMMON_H X X#include X#include X#ifdef I_STDLIB X#include X#endif X#include "config.h" X Xtypedef double Float; X X#if (VOIDFLAGS & 8) == 8 Xtypedef void * voidstar; X#else Xtypedef char * voidstar; X#endif X X#include "expr.h" X#include "vector.h" X#include "ray.h" X#include "color.h" X#include "transform.h" X#include "error.h" X X#ifndef TRUE X#define TRUE 1 X#endif X X#ifndef FALSE X#define FALSE 0 X#endif X X/* X * Various useful constants and macros. X */ X X/* X * Minimum vector length & fp value. X * Modify depending upon Float typedef. X */ X#define EPSILON (Float)0.00001 X X#ifndef PI X#define PI 3.14159265358979323846 X#endif X#define TWOPI (2. * PI) X#define INV_TWOPI (1. / TWOPI) X#define deg2rad(x) (Float)(x * PI/180.) X#define LNHALF (-.69314718) X X#ifndef NULL X# define NULL 0 X#endif X X#define UNSET -1 X X/* X * Some systems, such as the RS6000, have fast fabs already defined. X */ X#ifndef fabs Xextern Float RSabstmp; X#define fabs(x) ((RSabstmp=x) < 0 ? -RSabstmp : RSabstmp) X#endif X X#ifdef MULTIMAX X/* X * On the multimax, allocate large pieces of memory as shared memory. X */ Xextern char *share_malloc(), *share_calloc(); X#else X/* X * Otherwise, malloc is malloc, etc. X */ X#define share_malloc(x) Malloc(x) X#define share_calloc(x,y) Calloc(x,y) X#endif X X/* X * Close enough for us. X */ X#define equal(a, b) (fabs((a) - (b)) < EPSILON) X/* X * Maximum/Minimum functions X */ X#define max(a, b) ((a) > (b) ? (a) : (b)) X#define min(a, b) ((a) < (b) ? (a) : (b)) X Xextern voidstar Malloc(), Calloc(); Xextern char *strsave(); Xextern double drand48(); /* just in case */ X X#endif /* COMMON_H */ END_OF_FILE if test 2391 -ne `wc -c <'libray/libcommon/common.h'`; then echo shar: \"'libray/libcommon/common.h'\" unpacked with wrong size! fi # end of 'libray/libcommon/common.h' fi if test -f 'libray/libcommon/transform.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libcommon/transform.h'\" else echo shar: Extracting \"'libray/libcommon/transform.h'\" \(1857 characters\) sed "s/^X//" >'libray/libcommon/transform.h' <<'END_OF_FILE' X/* X * transform.h X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: transform.h,v 4.0 91/07/17 14:32:33 kolb Exp Locker: kolb $ X * X * $Log: transform.h,v $ X * Revision 4.0 91/07/17 14:32:33 kolb X * Initial version. X * X */ X#ifndef TRANSFORM_H X#define TRANSFORM_H X Xtypedef voidstar TransRef; Xtypedef TransRef TransCreateFunc(); X X/* X * Transformation 'matrix'. X */ Xtypedef struct RSMatrix { X Float matrix[3][3]; /* Rotation matrix */ X Vector translate; /* Translation */ X} RSMatrix; X Xtypedef struct { X TransRef (*create)(); /* Create it... */ X void (*propagate)(); /* Propagate changes to parameters */ X} TransMethods; X X/* X * Transformation structure X */ Xtypedef struct Trans { X TransRef tr; /* transform data */ X TransMethods *methods; /* transform methods */ X ExprAssoc *assoc; /* animated parameters */ X short animated; /* is the transformation animated? */ X RSMatrix trans, /* object space --> world space */ X itrans; /* worldspace --> object space */ X struct Trans *next, *prev; X} Trans; X Xextern void MatrixMult(), MatrixCopy(), MatrixInit(), MatrixInvert(), X TransCopy(), TransInit(), TransInvert(), X TransCompose(), X VecTransform(), PointTransform(), NormalTransform(); X Xextern Trans *TransCreate(); X Xextern RSMatrix *MatrixCreate(); X Xvoid RotationMatrix(), TranslationMatrix(), X ScaleMatrix(), ArbitraryMatrix(), CoordSysTransform(); Xextern Float RayTransform(); X X#endif /* TRANSFORM_H */ END_OF_FILE if test 1857 -ne `wc -c <'libray/libcommon/transform.h'`; then echo shar: \"'libray/libcommon/transform.h'\" unpacked with wrong size! fi # end of 'libray/libcommon/transform.h' fi if test -f 'libray/libcommon/vector.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libcommon/vector.h'\" else echo shar: Extracting \"'libray/libcommon/vector.h'\" \(2325 characters\) sed "s/^X//" >'libray/libcommon/vector.h' <<'END_OF_FILE' X/* X * vector.h X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: vector.h,v 4.0.1.1 91/11/26 21:34:41 cek Exp Locker: cek $ X * X * $Log: vector.h,v $ X * Revision 4.0.1.1 91/11/26 21:34:41 cek X * patch3: Moved EPSILON definition. X * X * Revision 4.0 91/07/17 14:33:11 kolb X * Initial version. X * X */ X#ifndef VECTOR_H X#define VECTOR_H X/* X * Constants used in projecting onto planes X */ X#define XNORMAL (char)0 X#define YNORMAL (char)1 X#define ZNORMAL (char)2 X X/* X * Maximum length X */ X#define FAR_AWAY 1.0E+14 X Xtypedef struct { X Float u, v; /* 2D point */ X} Vec2d; X Xtypedef struct Vector { X Float x, y, z; /* 3D point */ X} Vector; X X/* X * Linked list of points X */ Xtypedef struct PointList { X Vector vec; /* Vector data */ X struct PointList *next; /* Next in list */ X} PointList; X X/* X * Project a point in 3-space to the plane whose normal is indicated by "i." X */ X#define VecProject(r, p, i) {switch(i) { \ X case XNORMAL: \ X r.u = (p).y; \ X r.v = (p).z; \ X break; \ X case YNORMAL: \ X r.u = (p).x; \ X r.v = (p).z; \ X break; \ X case ZNORMAL: \ X r.u = (p).x; \ X r.v = (p).y; \ X break; \ X } } X X#define dotp(a, b) (((a)->x*(b)->x)+((a)->y*(b)->y)+((a)->z*(b)->z)) X#define VecSub(a,b,r) (r)->x=(a).x-(b).x,(r)->y=(a).y-(b).y,(r)->z=(a).z-(b).z X#define VecAdd(a,b,r) (r)->x=(a).x+(b).x,(r)->y=(a).y+(b).y,(r)->z=(a).z+(b).z X#define VecScale(s,a,r) (r)->x=(s)*(a).x,(r)->y=(s)*(a).y,(r)->z=(s)*(a).z X#define VecComb(s1,v1,s2,v2,r) (r)->x = (s1)*(v1).x + (s2)*(v2).x, \ X (r)->y = (s1)*(v1).y + (s2)*(v2).y, \ X (r)->z = (s1)*(v1).z + (s2)*(v2).z X#define VecAddScaled(v1,s,v2,r) (r)->x = (v1).x + (s)*(v2).x, \ X (r)->y = (v1).y + (s)*(v2).y, \ X (r)->z = (v1).z + (s)*(v2).z X Xextern void VecCross(), VecCoordSys(), MakeBump(); Xextern Float VecNormCross(), VecNormalize(); Xextern int Refract(); X X#endif /* VECTOR_H */ END_OF_FILE if test 2325 -ne `wc -c <'libray/libcommon/vector.h'`; then echo shar: \"'libray/libcommon/vector.h'\" unpacked with wrong size! fi # end of 'libray/libcommon/vector.h' fi if test -f 'libray/libcommon/xform.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libcommon/xform.c'\" else echo shar: Extracting \"'libray/libcommon/xform.c'\" \(1900 characters\) sed "s/^X//" >'libray/libcommon/xform.c' <<'END_OF_FILE' X/* X * xform.c X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: xform.c,v 4.0.1.1 91/10/04 15:51:53 cek Exp Locker: cek $ X * X * $Log: xform.c,v $ X * Revision 4.0.1.1 91/10/04 15:51:53 cek X * patch1: Initial revision. X * X * Revision 4.0 1991/09/29 15:34:31 cek X * Initial version. X * X */ X#include "common.h" X#include "xform.h" X XTransMethods *iXformMethods; X X/* X * Create and return reference to an Xform structure. X * In this case, we return a NULL pointer, as the Xform X * structure does not hold any data. X */ XXform * XXformCreate() X{ X return (Xform *)NULL; X} X X/* X * Return a pointer to collection of methods for the X * Xform transformation. X */ XTransMethods * XXformMethods() X{ X if (iXformMethods == (TransMethods *)NULL) { X iXformMethods = (TransMethods *)Malloc(sizeof(TransMethods)); X iXformMethods->create = (TransCreateFunc *)XformCreate; X iXformMethods->propagate = XformPropagate; X } X return iXformMethods; X} X X/* X * Given an Xform structure and forward and inverse transformations, X * propagate the information in the Xform structure to the X * transformations. X * In this case, the information "in" the Xform structure is X * actually stored in the forward transformation; the Xform X * points to NULL. X */ Xvoid XXformPropagate(xform, trans, itrans) XXform *xform; XRSMatrix *trans, *itrans; X{ X /* X * The Xform methods change the forward trans X * directly, so it's already all set. X * Build the inverse... X */ X MatrixInvert(trans, itrans); X} END_OF_FILE if test 1900 -ne `wc -c <'libray/libcommon/xform.c'`; then echo shar: \"'libray/libcommon/xform.c'\" unpacked with wrong size! fi # end of 'libray/libcommon/xform.c' fi if test -f 'libray/libcommon/xform.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libcommon/xform.h'\" else echo shar: Extracting \"'libray/libcommon/xform.h'\" \(1878 characters\) sed "s/^X//" >'libray/libcommon/xform.h' <<'END_OF_FILE' X/* X * xform.h X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: xform.h,v 4.0.1.1 91/10/04 15:51:33 cek Exp Locker: cek $ X * X * $Log: xform.h,v $ X * Revision 4.0.1.1 91/10/04 15:51:33 cek X * patch1: Initial revision. X * X * Revision 4.0 1991/09/29 15:33:56 cek X * Initial version. X * X */ X#ifndef XFORM_H X#define XFORM_H X X#define TransXformCreate() TransCreate((TransRef)XformCreate(), XformMethods()) X X#define TransXformSetX0(t, v) TransAssoc(t, &t->trans.matrix[0][0], v) X#define TransXformSetY0(t, v) TransAssoc(t, &t->trans.matrix[0][1], v) X#define TransXformSetZ0(t, v) TransAssoc(t, &t->trans.matrix[0][2], v) X#define TransXformSetX1(t, v) TransAssoc(t, &t->trans.matrix[1][0], v) X#define TransXformSetY1(t, v) TransAssoc(t, &t->trans.matrix[1][1], v) X#define TransXformSetZ1(t, v) TransAssoc(t, &t->trans.matrix[1][2], v) X#define TransXformSetX2(t, v) TransAssoc(t, &t->trans.matrix[2][0], v) X#define TransXformSetY2(t, v) TransAssoc(t, &t->trans.matrix[2][1], v) X#define TransXformSetZ2(t, v) TransAssoc(t, &t->trans.matrix[2][2], v) X#define TransXformSetXt(t, v) TransAssoc(t, &t->trans.translate.x, v) X#define TransXformSetYt(t, v) TransAssoc(t, &t->trans.translate.y, v) X#define TransXformSetZt(t, v) TransAssoc(t, &t->trans.translate.z, v) X Xtypedef char Xform; /* Dummy; Xform has no private data. */ X Xextern Xform *XformCreate(); Xextern TransMethods *XformMethods(); Xextern void XformPropagate(); X X#endif /* XFORM_H */ END_OF_FILE if test 1878 -ne `wc -c <'libray/libcommon/xform.h'`; then echo shar: \"'libray/libcommon/xform.h'\" unpacked with wrong size! fi # end of 'libray/libcommon/xform.h' fi if test -f 'libray/liblight/jittered.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/liblight/jittered.c'\" else echo shar: Extracting \"'libray/liblight/jittered.c'\" \(1905 characters\) sed "s/^X//" >'libray/liblight/jittered.c' <<'END_OF_FILE' X/* X * jittered.c X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: jittered.c,v 4.0 91/07/17 14:34:43 kolb Exp Locker: kolb $ X * X * $Log: jittered.c,v $ X * Revision 4.0 91/07/17 14:34:43 kolb X * Initial version. X * X */ X#include "light.h" X#include "jittered.h" X Xstatic LightMethods *iJitteredMethods = NULL; X XJittered * XJitteredCreate(pos, e1, e2) XVector *pos, *e1, *e2; X{ X Jittered *j; X X j = (Jittered *)share_malloc(sizeof(Jittered)); X X j->pos = *pos; X j->e1 = *e1; X j->e2 = *e2; X X return j; X} X XLightMethods * XJitteredMethods() X{ X if (iJitteredMethods == (LightMethods *)NULL) { X iJitteredMethods = LightMethodsCreate(); X iJitteredMethods->intens = JitteredIntens; X iJitteredMethods->dir = JitteredDirection; X } X return iJitteredMethods; X} X Xint XJitteredIntens(jit, lcolor, cache, ray, dist, noshadow, color) XJittered *jit; XColor *lcolor, *color; XShadowCache *cache; XRay *ray; XFloat dist; Xint noshadow; X{ X return !Shadowed(color, lcolor, cache, ray, dist, noshadow); X} X Xvoid XJitteredDirection(lp, pos, dir, dist) XJittered *lp; XVector *pos, *dir; XFloat *dist; X{ X /* X * Choose a location with the area define by corner, e1 X * and e2 at which this sample will be taken. X */ X VecAddScaled(lp->pos, nrand(), lp->e1, &lp->curpos); X VecAddScaled(lp->curpos, nrand(), lp->e2, &lp->curpos); X VecSub(lp->curpos, *pos, dir); X *dist = VecNormalize(dir); X} X XJitteredMethodRegister(meth) XUserMethodType meth; X{ X if (iJitteredMethods) X iJitteredMethods->user = meth; X} END_OF_FILE if test 1905 -ne `wc -c <'libray/liblight/jittered.c'`; then echo shar: \"'libray/liblight/jittered.c'\" unpacked with wrong size! fi # end of 'libray/liblight/jittered.c' fi if test -f 'libray/liblight/light.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/liblight/light.c'\" else echo shar: Extracting \"'libray/liblight/light.c'\" \(1978 characters\) sed "s/^X//" >'libray/liblight/light.c' <<'END_OF_FILE' X/* X * light.c X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: light.c,v 4.0 91/07/17 14:35:01 kolb Exp Locker: kolb $ X * X * $Log: light.c,v $ X * Revision 4.0 91/07/17 14:35:01 kolb X * Initial version. X * X */ X#include "light.h" X XLight * XLightCreate(light, meth, color) XLightRef light; XLightMethods *meth; XColor *color; X{ X Light *ltmp; X X if (light == (LightRef)NULL || meth == (LightMethods *)NULL) X return (Light *)NULL; X X ltmp = (Light *)share_malloc(sizeof(Light)); X ltmp->light = light; X ltmp->methods = meth; X ltmp->color = *color; X ltmp->next = (Light *)NULL; X ltmp->cache = (ShadowCache *)NULL; X ltmp->shadow = TRUE; X return ltmp; X} X XLightMethods * XLightMethodsCreate() X{ X return (LightMethods *)share_calloc(1, sizeof(LightMethods)); X} X X/* X * Compute light color. Returns FALSE if in full shadow, TRUE otherwise. X * Computed light color is stored in 'color'. X */ Xint XLightIntens(lp, ray, dist, noshadow, color) XLight *lp; XRay *ray; XFloat dist; Xint noshadow; XColor *color; X{ X if (lp->methods->intens) X return (*lp->methods->intens)(lp->light, &lp->color, X lp->cache, ray, dist, noshadow || !lp->shadow, color); X RLerror(RL_ABORT, "Cannot compute light intensity!\n"); X return FALSE; X} X X/* X * Calculate ray and distance from position to light. X */ Xint XLightDirection(lp, objpos, lray, dist) XLight *lp; XVector *objpos, *lray; XFloat *dist; X{ X if (lp->methods->dir) { X (*lp->methods->dir)(lp->light, objpos, lray, dist); X return TRUE; X } else { X RLerror(RL_ABORT, "Cannot compute light direction!\n"); X return FALSE; X } X} END_OF_FILE if test 1978 -ne `wc -c <'libray/liblight/light.c'`; then echo shar: \"'libray/liblight/light.c'\" unpacked with wrong size! fi # end of 'libray/liblight/light.c' fi if test -f 'libray/liblight/light.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/liblight/light.h'\" else echo shar: Extracting \"'libray/liblight/light.h'\" \(2038 characters\) sed "s/^X//" >'libray/liblight/light.h' <<'END_OF_FILE' X/* X * light.h X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: light.h,v 4.0 91/07/17 14:35:10 kolb Exp Locker: kolb $ X * X * $Log: light.h,v $ X * Revision 4.0 91/07/17 14:35:10 kolb X * Initial version. X * X */ X#ifndef LIGHT_H X#define LIGHT_H X X#include "libobj/geom.h" X X#define SHADOW_NONE 001 X#define SHADOW_TRANSP 002 X#define SHADOW_CSG 004 X#define SHADOW_CACHE 010 X#define SHADOW_BLUR 020 X X#define NOSHADOWS(f) ((f) & SHADOW_NONE) X#define SHADOWTRANSP(f) ((f) & SHADOW_TRANSP) X#define SHADOWCSG(f) ((f) & SHADOW_CSG) X#define SHADOWCACHE(f) ((f) & SHADOW_CACHE) X#define SHADOWBLUR(f) ((f) & SHADOW_BLUR) X X#define SHADOW_EPSILON (4. * EPSILON) X Xtypedef char * LightRef; X Xtypedef struct { X struct Geom *obj; /* Pointer to cached object */ X RSMatrix trans; /* World-to-object transformation */ X char dotrans; /* TRUE if above trans is non-identity */ X} ShadowCache; X Xtypedef struct { X int (*intens)(); /* intensity method */ X void (*dir)(), /* direction method */ X (*user)(); /* user-defined method */ X} LightMethods; X Xtypedef struct Light { X Color color; /* Light source color & intensity */ X int shadow; /* Does light source cast shadows? */ X LightRef light; /* Pointer to light information */ X LightMethods *methods; /* Light source methods */ X ShadowCache *cache; /* Shadow cache, if any */ X struct Light *next; /* Next light in list */ X} Light; X Xextern LightMethods *LightMethodsCreate(); Xextern Light *LightCreate(); Xextern void LightAllocateCache(), LightAddToDefined(); Xextern int LightIntens(), LightDirection(); Xextern void ShadowSetOptions(), ShadowStats(); X X#endif /* LIGHT_H */ END_OF_FILE if test 2038 -ne `wc -c <'libray/liblight/light.h'`; then echo shar: \"'libray/liblight/light.h'\" unpacked with wrong size! fi # end of 'libray/liblight/light.h' fi if test -f 'libray/libsurf/atmosphere.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libsurf/atmosphere.c'\" else echo shar: Extracting \"'libray/libsurf/atmosphere.c'\" \(1801 characters\) sed "s/^X//" >'libray/libsurf/atmosphere.c' <<'END_OF_FILE' X/* X * atmosphere.c X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: atmosphere.c,v 4.0 91/07/17 14:40:02 kolb Exp Locker: kolb $ X * X * $Log: atmosphere.c,v $ X * Revision 4.0 91/07/17 14:40:02 kolb X * Initial version. X * X */ X#include "atmosphere.h" X XAtmosphere * XAtmosCreate(data, method) Xchar *data; Xvoid (*method)(); X{ X Atmosphere *ef; X X ef = (Atmosphere *)Malloc(sizeof(Atmosphere)); X ef->data = data; X ef->method = method; X ef->next = (Atmosphere *)0; X return ef; X} X XAtmosphere * XAtmosphereCopy(atmos) XAtmosphere *atmos; X{ X Atmosphere *res; X X if (atmos == (Atmosphere *)NULL) X return (Atmosphere *)NULL; X res = AtmosCreate(atmos->data, atmos->method); X res->next = AtmosphereCopy(atmos->next); X return res; X} X XMedium * XMediumPush(index, statten, media) XFloat index, statten; XMedium *media; X{ X Medium *new; X X new = (Medium *)Malloc(sizeof(Medium)); X new->index = index; X new->statten = statten; X new->next = media; X X return new; X} X Xvoid XAtmospherics(effects, ray, dist, pos, color) XAtmosphere *effects; XRay *ray; XFloat dist; XVector *pos; XColor *color; X{ X Atmosphere *etmp; X X for (etmp = effects; etmp; etmp = etmp->next) X (*etmp->method)(etmp->data, ray, pos, dist, color); X} X XFloat XExpAtten(dist, trans) XFloat dist, trans; X{ X Float atten; X X if (trans < EPSILON) X return 0.; X atten = LNHALF * dist / trans; X return (atten < -10. ? 0. : exp(atten)); X} END_OF_FILE if test 1801 -ne `wc -c <'libray/libsurf/atmosphere.c'`; then echo shar: \"'libray/libsurf/atmosphere.c'\" unpacked with wrong size! fi # end of 'libray/libsurf/atmosphere.c' fi if test -f 'libray/libsurf/surface.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libsurf/surface.h'\" else echo shar: Extracting \"'libray/libsurf/surface.h'\" \(1924 characters\) sed "s/^X//" >'libray/libsurf/surface.h' <<'END_OF_FILE' X/* X * surface.h X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: surface.h,v 4.0 91/07/17 14:41:02 kolb Exp Locker: kolb $ X * X * $Log: surface.h,v $ X * Revision 4.0 91/07/17 14:41:02 kolb X * Initial version. X * X */ X#ifndef SURFACE_H X#define SURFACE_H X X#define DEFAULT_INDEX 1.0 /* Default index of refraction */ X#define DEFAULT_PHONGPOW 15.0 /* Default specular highlight exp */ X X/* X * Surface definition. X */ Xtypedef struct Surface { X char *name; /* Name */ X struct Color amb, /* Ambient 'curve' */ X diff, /* Diffuse reflection 'curve' */ X spec, /* Specular reflection 'curve' */ X translu, /* Diffuse transmission 'curve' */ X body; /* Specular transmission 'curve' */ X Float srexp, /* Specular reflection exponent */ X stexp, /* Specular transmission exponent */ X statten, /* Specular transmission attenuation */ X index, /* Index of refraction */ X reflect, /* Specular reflectivity */ X transp, /* Specular transmittance */ X translucency; /* Diffuse transmittance */ X char noshadow; /* No shadowing? */ X struct Surface *next; /* Next surface in list (if any) */ X} Surface; X X/* X * Linked list of (linked list of) surfaces. X */ Xtypedef struct SurfList { X Surface *surf; X struct SurfList *next; X} SurfList; X Xextern Surface *SurfaceCreate(), X *GetShadingSurf(), /* application-provided */ X *SurfaceCopy(); X Xextern SurfList *SurfPop(), *SurfPush(); X Xextern void SurfaceBlend(), ColorBlend(); X Xextern int ComputeSurfProps(); X X#endif /* SURFACE_H */ END_OF_FILE if test 1924 -ne `wc -c <'libray/libsurf/surface.h'`; then echo shar: \"'libray/libsurf/surface.h'\" unpacked with wrong size! fi # end of 'libray/libsurf/surface.h' fi if test -f 'libray/libtext/fbm.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libtext/fbm.c'\" else echo shar: Extracting \"'libray/libtext/fbm.c'\" \(1951 characters\) sed "s/^X//" >'libray/libtext/fbm.c' <<'END_OF_FILE' X/* X * fbm.c X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: fbm.c,v 4.0 91/07/17 14:42:06 kolb Exp Locker: kolb $ X * X * $Log: fbm.c,v $ X * Revision 4.0 91/07/17 14:42:06 kolb X * Initial version. X * X */ X#include "texture.h" X#include "fbm.h" X XFBm * XFBmCreate(offset, scale, h, lambda, octaves, thresh, mapname) XFloat h, lambda, scale, offset, thresh; Xint octaves; Xchar *mapname; X{ X FBm *fbm; X X fbm = (FBm *)Malloc(sizeof(FBm)); X X fbm->beta = 1. + 2*h; X fbm->omega = pow(lambda, -0.5*fbm->beta); X fbm->lambda = lambda; X fbm->scale = scale; X fbm->offset = offset; X fbm->thresh = thresh; X fbm->octaves = octaves; X if (mapname != (char *)NULL) X fbm->colormap = ColormapRead(mapname); X else X fbm->colormap = (Color *)NULL; X return fbm; X} X Xvoid XFBmApply(fbm, prim, ray, pos, norm, gnorm, surf) XFBm *fbm; XGeom *prim; XRay *ray; XVector *pos, *norm, *gnorm; XSurface *surf; X{ X Float val; X int index; X X val = fBm(pos, fbm->omega, fbm->lambda, fbm->octaves); X if (val < fbm->thresh) X val = fbm->offset; X else X val = fbm->offset + fbm->scale*(val - fbm->thresh); X if (fbm->colormap) { X index = 255. * val; X if (index > 255) index = 255; X if (index < 0) index = 0; X surf->diff.r *= fbm->colormap[index].r; X surf->diff.g *= fbm->colormap[index].g; X surf->diff.b *= fbm->colormap[index].b; X surf->amb.r *= fbm->colormap[index].r; X surf->amb.g *= fbm->colormap[index].g; X surf->amb.b *= fbm->colormap[index].b; X } else { X ColorScale(val, surf->diff, &surf->diff); X ColorScale(val, surf->amb, &surf->amb); X } X} END_OF_FILE if test 1951 -ne `wc -c <'libray/libtext/fbm.c'`; then echo shar: \"'libray/libtext/fbm.c'\" unpacked with wrong size! fi # end of 'libray/libtext/fbm.c' fi if test -f 'libray/libtext/texture.h' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libtext/texture.h'\" else echo shar: Extracting \"'libray/libtext/texture.h'\" \(2381 characters\) sed "s/^X//" >'libray/libtext/texture.h' <<'END_OF_FILE' X/* X * texture.h X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: texture.h,v 4.0 91/07/17 14:44:19 kolb Exp Locker: kolb $ X * X * $Log: texture.h,v $ X * Revision 4.0 91/07/17 14:44:19 kolb X * Initial version. X * X */ X#ifndef TEXTURE_H X#define TEXTURE_H X X#include "libobj/geom.h" X#include "libsurf/surface.h" X#include "mapping.h" X X/* X * Surface properties X */ X#define COLOR 0 /* AMBIENT, DIFFUSE, SPECULAR and BODY */ X#define AMBIENT 1 X#define DIFFUSE 2 X#define SPECULAR 3 X#define BODY 4 X#define REFLECT 5 X#define TRANSP 6 X#define SPECPOW 7 X#define BUMP 8 X#define INDEX 9 X X#define TextPointToModel(p) PointTransform(p, &model2text.itrans) X#define TextPointToPrim(p) PointTransform(p, &prim2text.itrans) X#define TextPointToWorld(p) PointTransform(p, &world2text.itrans) X#define TextRayToModel(p) RayTransform(r, &model2text.itrans) X#define TextRayToPrim(r) RayTransform(r, &prim2text.itrans) X#define TextRayToWorld(r) RayTransform(r, &world2text.itrans) X#define TextNormToModel(n) NormalTransform(n, &model2text.trans) X#define TextNormToPrim(n) NormalTransform(n, &prim2text.trans) X#define TextNormToWorld(n) NormalTransform(n, &world2text.trans) X X#define ModelPointToText(p) PointTransform(p, &model2text.trans) X#define ModelNormToText(n) NormalTransform(n, &model2text.itrans) X#define ModelRayToText(r) RayTransform(r, &model2text.trans) X Xtypedef char *TextRef; X X/* X * Texture structure X */ Xtypedef struct Texture { X TextRef data; /* Texturing info */ X void (*method)(); /* method */ X Trans *trans; /* transformation info */ X short animtrans; /* is the transformation animated? */ X struct Texture *next; /* next in list */ X} Texture; X Xextern Texture *TextCreate(), *TextAppend(); Xextern void DNoise3(), VfBm(), TextApply(), MakeBump(), Wrinkled(); Xextern Float Noise3(), Noise2(), Chaos(), Marble(), fBm(); Xextern int TileValue(); XColor *ColormapRead(); X Xextern Trans model2text, prim2text, world2text; X X#endif TEXTURE_H END_OF_FILE if test 2381 -ne `wc -c <'libray/libtext/texture.h'`; then echo shar: \"'libray/libtext/texture.h'\" unpacked with wrong size! fi # end of 'libray/libtext/texture.h' fi if test -f 'libray/libtext/wood.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libray/libtext/wood.c'\" else echo shar: Extracting \"'libray/libtext/wood.c'\" \(1805 characters\) sed "s/^X//" >'libray/libtext/wood.c' <<'END_OF_FILE' X/* X * wood.c X * X * Copyright (C) 1989, 1991, Craig E. Kolb, Robert F. Skinner X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: wood.c,v 4.0 91/07/17 14:44:35 kolb Exp Locker: kolb $ X * X * $Log: wood.c,v $ X * Revision 4.0 91/07/17 14:44:35 kolb X * Initial version. X * X */ X#include "texture.h" X#include "wood.h" X XWood * XWoodCreate() X{ X return (Wood *)NULL; /* No data associated with wood texture */ X} X X/*ARGSUSED*/ Xvoid XWoodApply(wood, prim, ray, pos, norm, gnorm, surf) XWood *wood; XGeom *prim; XRay *ray; XVector *pos, *norm, *gnorm; XSurface *surf; X{ X Float red, grn, blu; X Float chaos, brownLayer, greenLayer; X Float perturb, brownPerturb, greenPerturb, grnPerturb; X Float t; X X chaos = Chaos(pos, 7); X t = sin(sin(8.*chaos + 7*pos->x +3.*pos->y)); X X greenLayer = brownLayer = fabs(t); X X perturb = sin(40.*chaos + 50.*pos->z); X perturb = fabs(perturb); X X brownPerturb = .6*perturb + 0.3; X greenPerturb = .2*perturb + 0.8; X grnPerturb = .15*perturb + 0.85; X grn = 0.5 * pow(fabs(brownLayer), 0.3); X brownLayer = pow(0.5 * (brownLayer+1.0), 0.6) * brownPerturb; X greenLayer = pow(0.5 * (greenLayer+1.0), 0.6) * greenPerturb; X X red = (0.5*brownLayer + 0.35*greenLayer)*2.*grn; X blu = (0.25*brownLayer + 0.35*greenLayer)*2.0*grn; X grn *= max(brownLayer, greenLayer) * grnPerturb; X X surf->diff.r *= red; X surf->diff.g *= grn; X surf->diff.b *= blu; X surf->amb.r *= red; X surf->amb.g *= grn; X surf->amb.b *= blu; X} END_OF_FILE if test 1805 -ne `wc -c <'libray/libtext/wood.c'`; then echo shar: \"'libray/libtext/wood.c'\" unpacked with wrong size! fi # end of 'libray/libtext/wood.c' fi if test -f 'libshade/objdef.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'libshade/objdef.c'\" else echo shar: Extracting \"'libshade/objdef.c'\" \(2418 characters\) sed "s/^X//" >'libshade/objdef.c' <<'END_OF_FILE' X/* X * objdef.c X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: objdef.c,v 4.0 91/07/17 14:46:38 kolb Exp Locker: kolb $ X * X * $Log: objdef.c,v $ X * Revision 4.0 91/07/17 14:46:38 kolb X * Initial version. X * X */ X X#include "rayshade.h" X#include "options.h" X#include "stats.h" X Xstatic Geom *Objects = NULL; /* named objects */ XGeom *World; /* top-level object */ X X X/* X * Return pointer to named object, NULL if no such object has been defined. X */ XGeom * XGeomGetNamed(name) Xchar *name; X{ X Geom *otmp; X for (otmp = Objects; otmp; otmp = otmp->next) X if (strcmp(name, otmp->name) == 0) X return otmp; X return (Geom *)NULL; X} X X/* X * Add object to list of defined objects. At this point, the object has X * been converted to the correct type, and obj->next is either NULL or X * garbage. X */ Xvoid XGeomAddToDefined(obj) XGeom *obj; X{ X obj->next = Objects; X Objects = obj; X if (Options.verbose) X AggregatePrintInfo(obj, Stats.fstats); X else X AggregatePrintInfo(obj, (FILE *)NULL); X} X X/* X * Return a copy of the named object. X */ XGeom * XGeomCopyNamed(name) Xchar *name; X{ X Geom *child; X X child = GeomGetNamed(name); X if (child == (Geom *)NULL) X RLerror(RL_PANIC, "There is no object named \"%s\".", name); X child = GeomCopy(child); X return child; X} X Xvoid XWorldSetup() X{ X extern GeomList *Defstack; X X /* X * Define World object, if not done previously. X */ X if (World == (Geom *)NULL) { X World = Defstack->obj; /* World is topmost object on stack */ X if (Defstack->next) X RLerror(RL_ABORT, "Geom def stack is screwey.\n"); X World->prims = AggregateConvert(World, World->next); X } X X GeomComputeBounds(World); X X /* X * Complain if there are no primitives to be rendered. X */ X if (World->prims == 0) { X RLerror(RL_PANIC, "Nothing to be rendered.\n"); X } X} X X/* X * Main ray-spwaning routine required by libray X */ Xint XTraceRay(ray, hitlist, mindist, maxdist) XRay *ray; XHitList *hitlist; XFloat mindist, *maxdist; X{ X return intersect(World, ray, hitlist, mindist, maxdist); X} END_OF_FILE if test 2418 -ne `wc -c <'libshade/objdef.c'`; then echo shar: \"'libshade/objdef.c'\" unpacked with wrong size! fi # end of 'libshade/objdef.c' fi if test -f 'raypaint/README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'raypaint/README'\" else echo shar: Extracting \"'raypaint/README'\" \(1820 characters\) sed "s/^X//" >'raypaint/README' <<'END_OF_FILE' XRaypaint reads a rayshade input file and opens a graphics window into Xwhich the image is progressively rendered. Graphics support routines Xare provided for X11 and GL (SGI / RS6000). Note that raypaint displays Xa greyscale image when running under X. X XCommand-line arguments to raypaint are identical to rayshade arguments. X XBy default, raypaint refines areas of the image that it considers X"interesting" (largish and contrasty). The mouse may be used to direct Xraypaint to concentrate on particular regions. Holding down the Xleft mouse button causes the indicated region to be single-sampled down Xto the pixel level. The right button causes the region to be supersampled. XWhen either button is released, raypaint continues to refine by Xeither single-sampling (if the left button was pressed) or supersampling X(if the right button was pressed). If either button is pressed while the Xcursor is pointing at a region that has already been resolved to the Xpixel-level, raypaint will instead choose its own region to refine. X XThe middle mouse button may be used to sweep out a rectangular region to Xwhich raypaint should restrict its refinement: Press and hold the middle Xmouse button while pointing at one corner of the region of interest, Xdrag the cursor to the opposite corner and release the mouse button. XNote that no rectangle will be drawn. Refinement will continue inside Xof the indicated region. X XWhen every pixel has been sampled, an image file is written. X XNote that raypaint is intended to be an example application, not a Xpolished tool. You are encouraged to tear apart raypaint to improve Xit or build your own application. X XTo compile, move either xgraphics.c (X11) or glgraphics.c (SGI) to Xgraphics.c, edit the Makefile and change GRAPHICSLIB to reflect your Xchoice of graphics support, and run make. END_OF_FILE if test 1820 -ne `wc -c <'raypaint/README'`; then echo shar: \"'raypaint/README'\" unpacked with wrong size! fi # end of 'raypaint/README' fi if test -f 'rayshade/main.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'rayshade/main.c'\" else echo shar: Extracting \"'rayshade/main.c'\" \(2468 characters\) sed "s/^X//" >'rayshade/main.c' <<'END_OF_FILE' X/* X * main.c X * X * Copyright (C) 1989, 1991, Craig E. Kolb X * All rights reserved. X * X * This software may be freely copied, modified, and redistributed X * provided that this copyright notice is preserved on all copies. X * X * You may not distribute this software, in whole or in part, as part of X * any commercial product without the express consent of the authors. X * X * There is no warranty or other guarantee of fitness of this software X * for any purpose. It is provided solely "as is". X * X * $Id: main.c,v 4.0 91/07/17 14:50:39 kolb Exp Locker: kolb $ X * X * $Log: main.c,v $ X * Revision 4.0 91/07/17 14:50:39 kolb X * Initial version. X * X */ X Xchar rcsid[] = "$Id: main.c,v 4.0 91/07/17 14:50:39 kolb Exp Locker: kolb $"; X X#include "rayshade.h" X#include "options.h" X#include "stats.h" X#include "viewing.h" X#include "picture.h" X Xint X#ifdef LINDA Xrayshade_main(argc, argv) X#else Xmain(argc, argv) X#endif Xint argc; Xchar **argv; X{ X Float utime, stime, lasttime; X int i; X extern Geom *World; X X#ifdef LINDA X Options.workernum = 0; /* we're the supervisor */ X#endif X X RSInitialize(argc, argv); X X X /* X * Start the first frame. X */ X RSStartFrame(Options.startframe); X /* X * Print more information than we'll ever need to know... X */ X if (Options.verbose) { X /* World object info. */ X AggregatePrintInfo(World, Stats.fstats); X /* Print info about rendering options and the like. */ X RSOptionsList(); X } X /* X * Start new picture. X */ X PictureStart(argv); X /* X * Print preprocessing time. X */ X RSGetCpuTime(&utime, &stime); X fprintf(Stats.fstats,"Preprocessing time:\t"); X fprintf(Stats.fstats,"%2.2fu %2.2fs\n", utime, stime); X fprintf(Stats.fstats,"Starting trace.\n"); X (void)fflush(Stats.fstats); X lasttime = utime+stime; X /* X * Render the first frame X */ X raytrace(argc, argv); X /* X * Render the remaining frames. X */ X for (i = Options.startframe +1; i <= Options.endframe ; i++) { X PictureFrameEnd(); /* End the previous frame */ X RSGetCpuTime(&utime, &stime); X fprintf(Stats.fstats, "Total CPU time for frame %d: %2.2f \n", X i - 1, utime+stime - lasttime); X PrintMemoryStats(Stats.fstats); X (void)fflush(Stats.fstats); X lasttime = utime+stime; X RSStartFrame(i); X if (Options.verbose) { X AggregatePrintInfo(World, Stats.fstats); X (void)fflush(Stats.fstats); X } X PictureStart(argv); X raytrace(argc, argv); X } X /* X * Close the image file. X */ X PictureFrameEnd(); /* End the last frame */ X PictureEnd(); X StatsPrint(); X return 0; X} END_OF_FILE if test 2468 -ne `wc -c <'rayshade/main.c'`; then echo shar: \"'rayshade/main.c'\" unpacked with wrong size! fi # end of 'rayshade/main.c' fi echo shar: End of archive 5 \(of 19\). cp /dev/null ark5isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 19 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0