kits@6
|
Part01,
Part02,
Part03,
Part04,
Part05,
Part06,
Part07,
Part08,
Part09,
Part10,
Part11,
Part12,
Part13,
Part14,
Part15,
Part16,
Part17,
Part18,
Part19,
|
|
|
#! /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
|