#! /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 <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 5 (of 19)."
# Contents:  Doc/Globals Doc/Guide/height.tex Examples/csg.ray
#   Examples/mtv.ray etc/malloc.sgi libray/libcommon/common.h
#   libray/libcommon/transform.h libray/libcommon/vector.h
#   libray/libcommon/xform.c libray/libcommon/xform.h
#   libray/liblight/jittered.c libray/liblight/light.c
#   libray/liblight/light.h libray/libsurf/atmosphere.c
#   libray/libsurf/surface.h libray/libtext/fbm.c
#   libray/libtext/texture.h libray/libtext/wood.c libshade/objdef.c
#   rayshade/main.c
# Wrapped by cek@oyoy on Mon Oct 28 20:03:31 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Doc/Globals' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Doc/Globals'\"
else
echo shar: Extracting \"'Doc/Globals'\" \(1927 characters\)
sed "s/^X//" >'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 'etc/malloc.sgi' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'etc/malloc.sgi'\"
else
echo shar: Extracting \"'etc/malloc.sgi'\" \(1812 characters\)
sed "s/^X//" >'etc/malloc.sgi' <<'END_OF_FILE'
X[ Mike Gigante notes that when rendering exteremely large datasets
X  (consisting primarily of triangles in his case), one may use the
X  'mallopt()' routine on certain machines to improve performance
X  significantly (to say the least). -- CEK ]
X  
X
XFrom mg@godzilla.cgl.rmit.OZ.AU  Tue Aug 21 14:35:08 1990
XReceived: from godzilla.cgl.rmit.oz.au by weedeater.math.yale.edu via SMTP; Tue, 21 Aug 90 14:35:08 -0400
XReceived: by godzilla 
XDate: Wed, 22 Aug 90 05:16:40 EST
XFrom: mg@godzilla.cgl.rmit.OZ.AU (Mike Gigante)
XMessage-Id: <9008211916.4715@godzilla>
XTo: craig@weedeater.math.yale.edu
XSubject: malloc stuff
XStatus: RO
X
XCraig,
Xwe spoke after the ray tracing sig about malloc stuff. Here is that
Xstuff I promised to send you. 
X
X1) include <malloc.h> in your main program
X2) make the following code the *first* executable statements
X
X#ifdef sgi
X  /*
X   * try to tune the malloc stuff. First thing to note is that most
X   * allocated blocks (at least for triangles) are less than 200 bytes...
X   */
X  mallopt(M_MXFAST, 200);
X  /*
X   * allocate a big chunk at a time - esp since we are going to use LOTS
X   * of memory!
X   */
X  mallopt(M_BLKSZ, 65536);
X  /*
X   * don't try too hard when looking for free'd memory to re-use. This
X   * avoids the heavy paging penalty we have seen... In fact don't look
X   * at all!
X   */
X  mallopt(M_MXCHK, 0);
X#endif
X
Xand wow! *HUGE* improvments for large models. Just to remind you, it was
Xa difference of 88 min CPU time over 10 hour period (just to read a model)
Xvs about 2 minutes cpu/elapsed. Because of the M_MXCHK call, the working
Xset was larger but it didn't make much difference..
X
XBTW, you should check the 200 bytes in the M_MXFAST call. Make it larger
Xthan the common malloc sizes (say for mallocing triangle/poly structs).
X
XHope this is useful.
X
XMike Gigante, RMIT
END_OF_FILE
if test 1812 -ne `wc -c <'etc/malloc.sgi'`; then
    echo shar: \"'etc/malloc.sgi'\" unpacked with wrong size!
fi
# end of 'etc/malloc.sgi'
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'\" \(2279 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 91/07/17 14:30:18 kolb Exp Locker: kolb $
X *
X * $Log:	common.h,v $
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 <stdio.h>
X#include <math.h>
X#ifdef I_STDLIB
X#include <stdlib.h>
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 2279 -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'\" \(2237 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 91/07/17 14:33:11 kolb Exp Locker: kolb $
X *
X * $Log:	vector.h,v $
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 2237 -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'\" \(1895 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 1991/10/04 15:51:53 cek Exp cek $
X *
X * $Log: xform.c,v $
X * Revision 4.0.1.1  1991/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 1895 -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'\" \(1873 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 1991/10/04 15:51:33 cek Exp cek $
X *
X * $Log: xform.h,v $
X * Revision 4.0.1.1  1991/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 1873 -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 '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
