/*Scian.h Standard header for scian. Eric Pepke February 9, 1990 */ #include "machine.h" /*If it's computation only, no interaction or graphics.*/ #ifdef COMPONLY #undef GRAPHICS #undef INTERACTIVE #endif #define GODLIKE #ifdef RELEASE #undef SOCKETS #undef GODLIKE #endif #ifdef GODLIKE #define PARANOID #endif #ifndef GRAPHICS /*No graphics features at all*/ #undef WINDOWS4D #undef MENUS4D #undef FONTS4D #undef CURSORS4D #undef IRISNTSC #undef GL4D #undef INTERWINDRAG #undef NOHIDEFRAME #undef GRAPHOBJ #endif /*Yes, signals*/ #if 0 #define SIGNALS #endif #ifdef STDLIB #include #endif #include #include #ifdef INTERACTIVE #include #include #endif #ifdef GRAPHICS #ifdef FONTS4D #include #endif #include #if MACHINE == IRIS4D #include #include #include #endif #else typedef float Matrix[4][4]; #endif #ifdef MALLOCH #include #else extern void *malloc(); #endif #include #ifdef SOCKETS #include #include #endif #include #include #include #include #include #include #if MACHINE == RS6000 #include #endif #include #ifdef SOCKETS #include #endif #include #include #include #if MACHINE == RS6000 #include #endif #ifdef TERMIO #include #endif #ifndef INTERACTIVE #undef DIALBOX #endif #ifndef DIAL0 #undef DIALBOX #endif #ifndef STDLIB double strtod(); #endif typedef int Bool; /*Our boolean stuff*/ #define true 1 #define false 0 /*C Variable types*/ typedef float real; typedef real Quaternion[4]; /*Bits for flags*/ #define PLAINOBJECT 0 /*Plain object*/ #define REALARRAY 1 /*Array of real values*/ #define STRING 2 /*Single string value*/ #define INTEGER 3 /*Single integer value*/ #define REAL 4 /*Single real value*/ #define LIST 5 /*List of things*/ #define PALETTE 6 /*Palette of colors*/ #define OT_SHORTARRAY 7 /*Short array*/ #define WINDOW 8 /*Window*/ #define PICTURE 9 /*Picture of graphical objects*/ #define OBJECTARRAY 10 /*Array of objects*/ #define CONNECTION 11 /*Socket connection*/ #define SYMBOL 12 /*Symbol*/ #define OT_GEOMETRY 13 /*Geometry*/ #define OT_BYTEARRAY 14 /*Byte array*/ #define OT_POINTERARRAY 15 /*Pointer array*/ #define OT_POINTER 16 /*Pointer*/ #define HIGHESTFLAG 17 /*Highest flag*/ #define ISOBJECT PLAINOBJECT /*Kludge for backward compat.*/ #define OBJTYPEFLAGS 0xFF /*Object type flags*/ #define OBJTYPE(flags) ((flags) & 0xFF) #define SETOBJTYPE(flags, type) (flags) = ((flags) & ~OBJTYPEFLAGS) | type /*Object predicate, returns true iff theObj is an object*/ #define IsObject(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == PLAINOBJECT)) #define IsArray(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == REALARRAY)) #define IsByteArray(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == OT_BYTEARRAY)) #define IsRealArray(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == REALARRAY)) #define IsObjArray(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == OBJECTARRAY)) #define IsShortArray(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == OT_SHORTARRAY)) #define IsList(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == LIST)) #define IsReal(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == REAL)) #define IsString(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == STRING)) #define IsInt(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == INTEGER)) #define IsSymbol(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == SYMBOL)) #define IsPointer(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == OT_POINTER)) #define IsPalette(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == PALETTE)) #define IsMatrix(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == MATRIX)) #define IsWindow(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == WINDOW)) #define IsPicture(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == PICTURE)) #define IsGeometry(theObj) ((theObj) && (OBJTYPE(((ThingPtr)(theObj)) -> flags) == OT_GEOMETRY)) /*NIL pointer, define so that it can cast to any pointer*/ #define NIL ((void *) 0) #define CopyVar(d, s, v) SetVar(d, v, GetVar(s, v)) /*newp operator*/ #define newp(t) ((t *) Alloc(sizeof(t))) /*running variable, true iff running*/ extern int running; /*running remote(ly) variable, true if running remotely*/ extern Bool runningRemote; /*Demo mode, make text bigger and fatter*/ extern Bool demoP; /*Use selects in scripts*/ extern Bool scriptSelectP; /*Abort on script error*/ extern Bool abortScriptP; /*Temporary string*/ #define TEMPSTRSIZE 4000 extern char tempStr[TEMPSTRSIZE + 1]; /*Fonts*/ #define TITLEFONT 1 /*Font for big titles*/ #define SUBTITLEFONT 2 /*Subtitle font*/ #define ICONBEGFONTS 3 /*Beginning of icon fonts*/ #if 0 #define ICONFOREFONT 3 /*Font for icon foreground*/ #define ICONBACKFONT 4 /*Font for icon background*/ #define ICONSHADOWFONT 5 /*Font for icon shadow*/ #endif /*Cursors*/ #define ARROWCURSOR 0 /*Arrow cursor*/ #define WATCHCURSOR 1 /*Watch cursor*/ #define IBEAMCURSOR 2 /*I-beam cursor*/ #define QUESTIONCURSOR 3 /*Question mark cursor*/ #define ICONCURSOR 4 /*Icon cursor*/ /*Class IDs*/ #define CLASS_ICON 0 /*Icon class*/ #define CLASS_CORRAL 1 /*Corral class*/ #define CLASS_VISWINDOW 2 /*Vis window class*/ #define CLASS_LIGHT 3 /*Class of a light*/ #define CLASS_CLOCK 4 /*Class of a clock*/ #define CLASS_OBSERVER 5 /*Class of an observer*/ #define CLASS_RENDERER 6 /*Class of a renderer*/ #define CLASS_TIMEDOBJ 7 /*Timed object class*/ #define CLASS_VISOBJ 8 /*Vis object class*/ #define CLASS_PANEL 9 /*Panel class*/ #define CLASS_DATASET 10 /*Dataset class*/ #define CLASS_FILE 11 /*File class*/ #define CLASS_TEXTBOX 12 /*Text box class*/ #define CLASS_SPACE 13 /*Space class*/ #define CLASS_DIALOG 14 /*Dialog class*/ #define CLASS_FILEREADER 15 /*File reader class*/ #define CLASS_RECORDER 16 /*Recorder*/ #define CLASS_SNAPSHOT 17 /*Snapshot*/ #define CLASS_SEQUENCE 18 /*Sequence class*/ #define CLASS_MENU 19 /*Class of menus*/ #define CLASS_ACTION 20 /*Class of menu actions*/ #define N_CLASS_IDS 21 /*Total # of class id's*/ /*Is icon predicate*/ #define IsIcon(icon) IntVarEql(icon, CLASSID, CLASS_ICON) extern real missingData; /*Missing data*/ extern real plusInf, minusInf; /*Plus and minus infinity*/ #define PLUSINF (plusInf) /*Plus infinity*/ #define MINUSINF (minusInf) /*Minus infinity*/ #define SCIANDATE "November 6, 1993" #define SCIANVERSION "Version 0.851" #define AUTOLOG /*Automatically log for error tracking*/ /*Screen sizes*/ #ifdef XMAXSCREEN #define CSCRWIDTH XMAXSCREEN #define CSCRHEIGHT YMAXSCREEN #define VSCRWIDTH XMAX170 #define VSCRHEIGHT YMAX170 #else #define CSCRWIDTH 1280 #define CSCRHEIGHT 1024 #define VSCRWIDTH 649 #define VSCRHEIGHT 484 #endif #define SCRWIDTH scrWidth #define SCRHEIGHT scrHeight extern int scrWidth, scrHeight; #define WINBL 8 #define WINBR 8 #define WINBB 8 #define WINBT 32 #ifdef PARANOID #ifdef PROTO void *Realloc(void *p, long s); void *Alloc(long s); void Free(void *p); void PrintMemStats(); #else void *Realloc(); void *Alloc(); void Free(); #endif #else #define Realloc(p, s) realloc((p), (s)) #define Alloc(s) malloc(s) #define Free(p) free(p) #endif #define SAFEFREE(p) if ((p)) {Free((p)); (p) = 0;} /*Handy macros*/ #ifndef MIN #define MIN(x, y) ((x) < (y) ? (x) : (y)) #endif #ifndef MAX #define MAX(x, y) ((x) > (y) ? (x) : (y)) #endif #ifndef ABS #define ABS(x) ((x) < 0 ? (-(x)) : (x)) #endif #define MAG3(m) (sqrt((m)[0] * (m)[0] + (m)[1] * (m)[1] + (m)[2] * (m)[2])); #define NORM3(m) {float z7; z7 = 1.0 / MAG3(m); m[0] *= z7; m[1] *= z7; m[2] *= z7;} #define MATCOPY(d, s) {int i, j; for (i = 0; i < 4; ++i) for (j = 0; j < 4; ++j) d[i][j] = s[i][j];} #define CROSS(A, B, C) (C)[0]=(A)[1]*(B)[2]-(A)[2]*(B)[1]; (C)[1]=(A)[2]*(B)[0]-(A)[0]*(B)[2]; (C)[2]=(A)[0]*(B)[1]-(A)[1]*(B)[0]; #define DOT(A, B) ((A)[0] * (B)[0] + (A)[1] * (B)[1] + (A)[2] * (B)[2]) #define NORMALIZE(A) {register double f; f = 1.0 / sqrt((A)[0]*(A)[0] + (A)[1]*(A)[1] +(A)[2]*(A)[2]); (A)[0] *= f;(A)[1]*=f; (A)[2]*=f;} #define REVERSE(A) (A)[0] = -(A)[0]; (A)[1] = -(A)[1]; (A)[2] = -(A)[2]; #define VECCOPY(d, s) d[0] = s[0], d[1] = s[1], d[2] = s[2] #define BETWEENP(m, a, b) (((m) >= (a) && (m) <= (b)) || ((m) >= (b) && (m) <= (a))) #define MULTMATRIX(a, b, r) \ (r)[0][0] = (a)[0][0]*(b)[0][0] + (a)[0][1]*(b)[1][0] + (a)[0][2]*(b)[2][0] + (a)[0][3]*(b)[3][0];\ (r)[1][0] = (a)[1][0]*(b)[0][0] + (a)[1][1]*(b)[1][0] + (a)[1][2]*(b)[2][0] + (a)[1][3]*(b)[3][0];\ (r)[2][0] = (a)[2][0]*(b)[0][0] + (a)[2][1]*(b)[1][0] + (a)[2][2]*(b)[2][0] + (a)[2][3]*(b)[3][0];\ (r)[3][0] = (a)[3][0]*(b)[0][0] + (a)[3][1]*(b)[1][0] + (a)[3][2]*(b)[2][0] + (a)[3][3]*(b)[3][0];\ (r)[0][1] = (a)[0][0]*(b)[0][1] + (a)[0][1]*(b)[1][1] + (a)[0][2]*(b)[2][1] + (a)[0][3]*(b)[3][1];\ (r)[1][1] = (a)[1][0]*(b)[0][1] + (a)[1][1]*(b)[1][1] + (a)[1][2]*(b)[2][1] + (a)[1][3]*(b)[3][1];\ (r)[2][1] = (a)[2][0]*(b)[0][1] + (a)[2][1]*(b)[1][1] + (a)[2][2]*(b)[2][1] + (a)[2][3]*(b)[3][1];\ (r)[3][1] = (a)[3][0]*(b)[0][1] + (a)[3][1]*(b)[1][1] + (a)[3][2]*(b)[2][1] + (a)[3][3]*(b)[3][1];\ (r)[0][2] = (a)[0][0]*(b)[0][2] + (a)[0][1]*(b)[1][2] + (a)[0][2]*(b)[2][2] + (a)[0][3]*(b)[3][2];\ (r)[1][2] = (a)[1][0]*(b)[0][2] + (a)[1][1]*(b)[1][2] + (a)[1][2]*(b)[2][2] + (a)[1][3]*(b)[3][2];\ (r)[2][2] = (a)[2][0]*(b)[0][2] + (a)[2][1]*(b)[1][2] + (a)[2][2]*(b)[2][2] + (a)[2][3]*(b)[3][2];\ (r)[3][2] = (a)[3][0]*(b)[0][2] + (a)[3][1]*(b)[1][2] + (a)[3][2]*(b)[2][2] + (a)[3][3]*(b)[3][2];\ (r)[0][3] = (a)[0][0]*(b)[0][3] + (a)[0][1]*(b)[1][3] + (a)[0][2]*(b)[2][3] + (a)[0][3]*(b)[3][3];\ (r)[1][3] = (a)[1][0]*(b)[0][3] + (a)[1][1]*(b)[1][3] + (a)[1][2]*(b)[2][3] + (a)[1][3]*(b)[3][3];\ (r)[2][3] = (a)[2][0]*(b)[0][3] + (a)[2][1]*(b)[1][3] + (a)[2][2]*(b)[2][3] + (a)[2][3]*(b)[3][3];\ (r)[3][3] = (a)[3][0]*(b)[0][3] + (a)[3][1]*(b)[1][3] + (a)[3][2]*(b)[2][3] + (a)[3][3]*(b)[3][3]; #define MATBYVECTOR(a, b, r) \ (r)[0] = (a)[0][0]*(b)[0] + (a)[0][1]*(b)[1] + (a)[0][2]*(b)[2] + (a)[0][3];\ (r)[1] = (a)[1][0]*(b)[0] + (a)[1][1]*(b)[1] + (a)[1][2]*(b)[2] + (a)[1][3];\ (r)[2] = (a)[2][0]*(b)[0] + (a)[2][1]*(b)[1] + (a)[2][2]*(b)[2] + (a)[2][3]; #define SQUARE(x) ((x) * (x)) #define SKIPBLANKS(s) while (*(s) && isspace(*(s))) ++(s) #define ZERO3(d) {(d)[0] = 0.0; (d)[1] = 0.0; (d)[2] = 0.0;} #define COPY3(d, s) {(d)[0] = (s)[0]; (d)[1] = (s)[1]; (d)[2] = (s)[2];} #define ADD3(d, s) {(d)[0] += (s)[0]; (d)[1] += (s)[1]; (d)[2] += (s)[2];} #define DIV3SC(d, s) {(d)[0] /= (s); (d)[1] /= (s); (d)[2] /= (s);} #define CONTROL(c) ((c) & 0x1F) #define INT3(s1, s2, q, d) {(d)[0] = (s1)[0] + (q) * ((s2)[0] - (s1)[0]);\ (d)[1] = (s1)[1] + (q) * ((s2)[1] - (s1)[1]);\ (d)[2] = (s1)[2] + (q) * ((s2)[2] - (s1)[2]);} #define LOGE10 2.30259 #ifdef FMATH #define rsin(x) fsin(x) #define rcos(x) fcos(x) #define rtan(x) ftan(x) #define rasin(x) fasin(x) #define racos(x) facos(x) #define ratan(x, y) fatan(x, y) #define ratan2(x, y) fatan2(x, y) #define rsqrt(x) fsqrt(x) #define rlog10(x) (flog(x) / LOGE10) #define rpow(x, y) fpow(x, y) #define rfloor(x) floor((double) x) #define rceil(x) ceil((double) x) #else #ifdef MATHF #define rsin(x) sinf(x) #define rcos(x) cosf(x) #define rtan(x) tanf(x) #define rasin(x) asinf(x) #define racos(x) acosf(x) #define ratan(x, y) atanf(x, y) #define ratan2(x, y) atan2f(x, y) #define rsqrt(x) sqrtf(x) #define rlog10(x) (logf(x) / LOGE10) #define rpow(x, y) powf(x, y) #define rfloor(x) floorf(x) #define rceil(x) ceilf(x) #else #define rsin(x) sin(x) #define rcos(x) cos(x) #define rtan(x) tan(x) #define rasin(x) asin(x) #define racos(x) acos(x) #define ratan(x, y) atan(x, y) #define ratan2(x, y) atan2(x, y) #define rsqrt(x) sqrt(x) #define rlog10(x) (log(x) / LOGE10) #define rpow(x, y) pow(x, y) #define rfloor(x) floor(x) #define rceil(x) ceil(x) #endif #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #define M_PI_2 1.57079632679489661923 #define M_PI_4 0.78539816339744830962 #endif #define ISVOWEL(c) ((c) == 'a' || (c) == 'A' || (c) == 'e' || (c) == 'E' \ || (c) == 'i' || (c) == 'I' || (c) == 'o' || (c) == 'O' \ || (c) == 'u' || (c) == 'U') #define SQ2 (1.414213562) #define SQ22 (.707106) #define SQ33 (.577735) /*Have to define h_errno just in case*/ extern int h_errno; #ifdef PROTO int strcmp2(char *, char *); int strcmp3(char *, char *); #else int strcmp2(); int strcmp3(); #endif /*Define heartbeat*/ #ifdef CLK_TCK #define HEARTBEAT CLK_TCK #else #ifdef HZ #define HEARTBEAT HZ #else #define HEARTBEAT 60 #endif #endif