--- ray/src/common/octree.h 1989/02/02 10:34:18 1.1 +++ ray/src/common/octree.h 2003/03/14 21:27:46 2.7 @@ -1,13 +1,10 @@ -/* Copyright (c) 1986 Regents of the University of California */ - -/* SCCSid "$SunId$ LBL" */ - +/* RCSid $Id: octree.h,v 2.7 2003/03/14 21:27:46 greg Exp $ */ /* * octree.h - header file for routines using octrees. - * - * 7/28/85 */ +#include "copyright.h" + /* * An octree is expressed as an integer which is either * an index to eight other nodes, the empty tree, or an index @@ -20,7 +17,9 @@ * < -1: it is an index to a set of objects */ -typedef int OCTREE; +#ifndef OCTREE +#define OCTREE int +#endif #define EMPTY (-1) @@ -29,17 +28,22 @@ typedef int OCTREE; #define istree(ot) ((ot) > EMPTY) #define oseti(ot) (-(ot)-2) /* object set index */ -#define octbi(ot) ((ot)>>8) /* octree block index */ -#define octti(ot) (((ot)&0377)<<3)/* octree index in block */ +#define OCTBLKSIZ 04000 /* octree block size */ +#define octbi(ot) ((ot)>>11) /* octree block index */ +#define octti(ot) (((ot)&03777)<<3)/* octree index in block */ +#ifndef MAXOBLK +#ifdef BIGMEM +#define MAXOBLK 32767 /* maximum octree block */ +#else #define MAXOBLK 4095 /* maximum octree block */ +#endif +#endif extern OCTREE *octblock[MAXOBLK]; /* octree blocks */ #define octkid(ot,br) (octblock[octbi(ot)][octti(ot)+br]) -extern OCTREE octalloc(), combine(), fullnode(); - /* * The cube structure is used to hold an octree and its cubic * boundaries. @@ -61,9 +65,46 @@ extern CUBE thescene; /* the main scene */ #define IO_FILES 010 /* object file names */ #define IO_BOUNDS 020 /* octree boundary */ #define IO_ALL (~0) /* everything */ + /* octree format identifier */ +#define OCTFMT "Radiance_octree" /* magic number for octree files */ -#define OCTMAGIC (275+sizeof(OBJECT)) +#define MAXOBJSIZ 8 /* maximum sizeof(OBJECT) */ +#define OCTMAGIC ( 4 *MAXOBJSIZ+251) /* increment first value */ /* octree node types */ #define OT_EMPTY 0 #define OT_FULL 1 #define OT_TREE 2 + /* return values for surface functions */ +#define O_MISS 0 /* no intersection */ +#define O_HIT 1 /* intersection */ +#define O_IN 2 /* cube contained entirely */ + +#ifdef NOPROTO + +extern OCTREE octalloc(); +extern void octfree(); +extern void octdone(); +extern OCTREE combine(); +extern void culocate(); +extern void cucopy(); +extern int incube(); +extern int readoct(); +extern void readscene(); +extern void writescene(); + +#else + +extern OCTREE octalloc(void); +extern void octfree(OCTREE ot); +extern void octdone(void); +extern OCTREE combine(OCTREE ot); +extern void culocate(CUBE *cu, FVECT pt); +extern void cucopy(CUBE *cu1, CUBE *cu2); +extern int incube(CUBE *cu, FVECT pt); + +extern int readoct(char *fname, int load, CUBE *scene, char *ofn[]); + +extern void readscene(FILE *fp, int objsiz); +extern void writescene(int firstobj, int nobjs, FILE *fp); + +#endif