/*
	name:	protos.h

	Global prototypes
	-----------------


    This source-code is part of the RayLab 1.1 package, and it is provided
    for your compiling pleasure.  You may use it, change it, re-compile it
    etc., as long as nobody else but you receive the changes/compilations
    that you have made!

    You may not use any part(s) of this source-code for your own productions
    without the permission from the author of RayLab. Please read the legal
    information found in the users documentation for RayLab for more details.

*/

/* Prototypes for functions defined in raylab.c */
int main(int argc, char *argv[]);
void cleanup(void);
void PrintResults(void);


/* Prototypes for functions defined in getinput.c */
void GetInput(int argc, char *argv[]);


/* Prototypes for functions defined in trace.c */
void ScanWorld(FILE *outputfile);
void ScanOnePoint(COLOR *Color, POINT *CameraLocation, POINT *ScreenLocation, VECTOR *dx, VECTOR *dy, int ColumnFirst, int ColumnLast, int RowFirst, int RowLast, long AARec);
long TraceRay(COLOR *Color, LINE *RayLine, long RecurseLevel);
void QuickScanRay(COLOR *Color, LINE *RayLine);
void SoftShadow(COLOR *ShadowColor,double *dintense,double *pintense,POINT *IPoint,TEXTURE *ITexture,VECTOR *SNormal,VECTOR *RVect,POINT *LPoint,double Radius,short RecLevel,double LJitter);
long TestShadowRay(COLOR *Color, LINE *RayLine);
void ReflectVector(VECTOR *v2, VECTOR *v1, VECTOR *n);
void RefractVector(VECTOR *v2, VECTOR *v1, VECTOR *n, double ior);
double Jitter(void);
double UnitJitter(void);


/* Prototypes for functions defined in preproc.c */
void Preprocess(void);
void OptimizeAllTransforms(void);
void OptimizeObjTransforms(OBJECT *Obj);
void OptimizeTransform(TRANSFORM *Trans);
void AutoBoundObjects(void);
void BoundTriangleList(OBJECT *Obj);
void TransformBounding(OBJECT *Obj, TRANSFORM *Trans);
void RemoveAllUselessTextureTransforms(void);
void RemoveUselessTextureTransforms(OBJECT *Obj);
void ForwdTransformPoint(POINT *Point, TRANSFORM *Trans);


/* Prototypes for functions defined in intersct.c */
long Intersect_All_Objects(INTERSECTION *Intersct, LINE *RayLine);
double Intersect_Object(INTERSECTION *Intrsct, LINE *Line, OBJECT *Object);
double Intersect_Plane(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Sphere(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Ellipsoid(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Triangle(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_TriangleList(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Box(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Disc(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_DiscShape(INTERSECTION *Intrsct, LINE *Line, DISC *Disc);
double Intersect_Cylinder(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Cone(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_CSG(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Torus(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Peak(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
double Intersect_Deoflaska(INTERSECTION *Intrsct, LINE *Line, OBJECT *Obj);
int CheckForBounding(LINE *Line, OBJECT *Obj);
int CheckForBoundingBox(LINE *Line, BOX *Box);
int CheckForBoundingSphere(LINE *Line, SPHERE *Sphere);
void CopyIntersection(INTERSECTION *i1, INTERSECTION *i2);


/* Prototypes for functions defined in objects.c */
int InsideObject(OBJECT *Obj, POINT *IPoint);
void FreeAllObjectMemory(void);
void FreeObjectMemory(OBJECT *Obj);
void FreeTriangleList(TRIANGLELIST *TriLst);
void ClearTransform(TRANSFORM *t);
void CopyTransform(TRANSFORM *t2, TRANSFORM *t1);
void AddTransform(TRANSFORM *t2, TRANSFORM *t1);


/* Prototypes for functions defined in camera.c */
void CreateCamera(CAMERA *Camera, POINT *Loc, POINT *VP, VECTOR *Asp);


/* Prototypes for functions defined in texture.c */
void CreateDefTexture(TEXTURE *t);
void CopyTexture(TEXTURE *t2, TEXTURE *t1);
void CopyColor(COLOR *c2, COLOR *c1);
void GetSurfaceColor(COLOR *Color, TEXTURE *t, POINT *ip);
double PatternChecker(POINT *ip);
double PatternCircles(POINT *ip);
double PatternRings(POINT *ip);
double PatternSpots(POINT *ip);
double PatternGradient(POINT *ip);
double PatternMarble(POINT *ip);
double PatternSoftmarble(POINT *ip);
double PatternSquares(POINT *ip);
double PatternMandel(POINT *ip);
double PatternWood(POINT *ip);
double PatternAngular(POINT *ip);
void GetImg24Color(COLOR *Col,IMAGE24 *Image,POINT *ip);
void GetImg8Color(COLOR *Col,IMAGE8 *Image,POINT *ip);
void MapSpherical(double x, double y, double z, double *u, double *v);
double MapCylindrical(double x, double y);
void InterpolateLinear(COLOR *Col, COLOR *a, COLOR *b, COLOR *c, COLOR *d, double du, double dv);
void InitNoiseTable(void);
double DNoise(POINT *p);
void VNoise(VECTOR *v, POINT *p1);
void PTurbulence(POINT *p2, POINT *p1, double Factor);
void RevTransformPoint(POINT *ReTransformedPoint, TRANSFORM *Transform, POINT *Point);


/* Prototypes for functions defined in algebra.c */
void CreateVector(VECTOR *v, double vx, double vy, double vz);
void CopyVector(VECTOR *v2, VECTOR *v1);
void AddVector(VECTOR *v3, VECTOR *v1, VECTOR *v2);
void SubVector(VECTOR *v3, VECTOR *v1, VECTOR *v2);
void NegVector(VECTOR *v2, VECTOR *v1);
void CrossProduct(VECTOR *v3, VECTOR *v1, VECTOR *v2);
double DotProduct(VECTOR *v1, VECTOR *v2);
void ScaleVector(VECTOR *v2, double t, VECTOR *v1);
void NormalizeVector(VECTOR *v2, VECTOR *v1);
double VectorLength(VECTOR *v);
double VectorsAngle(VECTOR *v1, VECTOR *v2);
void CreatePoint(POINT *p, double px, double py, double pz);
void CopyPoint(POINT *p2, POINT *p1);
void MakeLine(LINE *l, POINT *p1, POINT *p2);
void Rotate2D(double *x, double *y, double ar);
void RotatePoint(POINT *p, VECTOR *RotV);
void RotateVector(VECTOR *v, VECTOR *RotV);
void RevRotatePoint(POINT *p, VECTOR *RotV);
void RevRotateVector(VECTOR *v, VECTOR *RotV);


/* Prototypes for functions defined in pic.c */
void WritePicHeader(FILE *f,long width, long height);
void WritePicLine(FILE *f, long width);
void CleanupPic(FILE *f);
void ReadPicHeader(char *Name, int Format, FILE **f, long *width, long *height);
short ReadImage(int *ImageNum, int Format, FILE *f, long width, long height);


/* Prototypes for functions defined in iff.c */
void WriteIffHeader(FILE *f, long width, long height);
void WriteIffLine(FILE *f, long width);
void CleanupIff(FILE *f);
void ReadIffHeader(FILE *f, long *width, long *height);
short ReadIffImage(int *ImageNum, FILE *f, long width, long height);
void IffChunkyToPlanar(long width);
long IffCompressPlanar(long width);
long IffDeCompressPlanar(unsigned char *Data, long width, int planes);
void IffPlanarToChunky(unsigned char *Chunky, long width, int planes);
long FindChunk(FILE *f,char *cname);
void WriteMotLongWord(FILE *f, long lw);
void WriteMotShortWord(FILE *f, long lw);
long ReadMotLongWord(FILE *f);
long ReadMotShortWord(FILE *f);


/* Prototypes for functions defined in tga.c */
void WriteTgaHeader(FILE *f, long width, long height);
void CleanupTga(FILE *f);
void WriteTgaLine(FILE *f, long width);
void ReadTgaHeader(FILE *f, long *width, long *height);
short ReadTgaImage(int *ImageNum, FILE *f, long width, long height);


/* Prototypes for functions defined in ppm.c */
void WritePpmHeader(FILE *f, long width, long height);
void CleanupPpm(FILE *f);
void WritePpmLine(FILE *f, long width);
void ReadPpmHeader(FILE *f, long *width, long *height);
short ReadPpmImage(int *ImageNum, FILE *f, long width, long height);


/* Prototypes for functions defined in getworld.c */
void SetupDefaults(void);
int CreateWorld(char *filename);
int CreateNewListObject(FILE *parfile, short ShapeType);
OBJECT *CreateNewObject(FILE *parfile, short ShapeType);
int SetupMagic(void);
/*------------------------------------------------------------*/
PLANE *InitNewPlane(FILE *parfile, char *strtmp);
SPHERE *InitNewSphere(FILE *parfile, char *strtmp);
ELLIPSOID *InitNewEllipsoid(FILE *parfile, char *strtmp);
TRIANGLE *InitNewTriangle(FILE *parfile, char *strtmp);
TRIANGLELIST *InitNewTriangleList(FILE *parfile, char *strtmp);
BOX *InitNewBox(FILE *parfile, char *strtmp);
DISC *InitNewDisc(FILE *parfile, char *strtmp);
CYLINDER *InitNewCylinder(FILE *parfile, char *strtmp, TRANSFORM *ObjTrans);
CONE *InitNewCone(FILE *parfile, char *strtmp, TRANSFORM *ObjTrans);
CSG *InitNewCsg(FILE *parfile, char *strtmp);
TORUS *InitNewTorus(FILE *parfile, char *strtmp);
PEAK *InitNewPeak(FILE *parfile, char *strtmp);
DEOFLASKA *InitNewDeoflaska(FILE *parfile, char *strtmp);
int InitNewLight(FILE *parfile);
int InitCamera(FILE *parfile);
int InitTexture(TEXTURE *TmpTexture, FILE *parfile);
short InitImage(int *ImageNum, FILE *parfile);
int InitTransform(TRANSFORM *TmpTransform, FILE *parfile);
int InitGlobals(FILE *parfile);
/*------------------------------------------------------------*/
void ParseError(void);
void ParseWarning(void);
void ChangeAllCSGTextureTransforms(OBJECT *Obj1, OBJECT *Obj2, TRANSFORM *Trans);
void ChangeAllCSGNoshadow(OBJECT *Obj1, OBJECT *Obj2);
void ChangeAllCSGShadow(OBJECT *Obj1, OBJECT *Obj2);
int GetKeywordTableIndex(char *keyword);
int IsRayLabKW(char *keyword);
int IsTopLevelKW(char *keyword);
int IsObjectKW(char *keyword);
int IsCsgOperator(char *keyword);
int getnextstring(FILE *f, char *string);
int getnextkeyword(FILE *f, char *keyword);
int getnextdvalue(double *dvalue, FILE *f, double min, double max, char *string);
int getnextlvalue(long *ivalue, FILE *f, long min, long max, char *string);
int getnextsvalue(short *ivalue, FILE *f, short min, short max, char *string);
int getnextvector(VECTOR *v, FILE *f, double min, double max, char *string);
int getnextnumber(FILE *f, double *number);
double extractnumber(char *string, int *counter);
int evaulateexpression(double *ans, char *expression);
void set_lvalue(long *variable, long value, long min, long max, char *string);
void set_svalue(short *variable, short value, short min, short max, char *string);
void set_dvalue(double *variable, double value, double min, double max, char *string);
int uppercase(int a);
int ischar(int a);
int isletter(int *a);
int isnumber(int a);
int iscomment(int a);
int isnewline(int a);


/* Prototypes for functions defined in display.c */
void AvailableDisplayModes(void);
long OpenDisplay(long DisplayType);
void CloseDisplay(void);
void DisplayPlot(int x, int y, COLOR24 *RGBColor);


/* Prototypes for functions defined in platform.c */
void InitPlatform(void);
void CloseDownPlatform(void);
