/* 
   Header file for a C package for 4x4 matrices and 4x1 vectors
*/

#ifndef GRAPHICSMATH_H

#define GRAPHICSMATH_H	0

/***** global constants *****/
#define ERRTOL		1e-10

/***** floating point matrix and array type definitions *****/

#define MatrixSize 16
typedef double Matrix_t[MatrixSize]; // model both 3x3 and 4x4 as 4x4 matrices

#define VectorSize 4
typedef double Vector_t[VectorSize];  // model 3x1 and 4x1 vectors as 4x1 vectors

// Prototypes

// Vector functions
double VectorLength(Vector_t v);
void VectorInit(Vector_t v);
void VectorNormalize(Vector_t v);
void VectorSetNormalized(double x, double y, double z, Vector_t v);
void VectorCross(Vector_t a, Vector_t b, Vector_t v);
void MakeVector(double x, double y, double z, Vector_t v);
void VectorPrint(Vector_t v, FILE *fp);
void VectorAdd(Vector_t v1, Vector_t v2, Vector_t t);
void VectorSub(Vector_t v1, Vector_t v2, Vector_t t);
void VectorMulScalar(Vector_t v, double d);
void VectorCopy(Vector_t to, Vector_t from);
double VectorDot(Vector_t v1, Vector_t v2);

// Matrix functions
void MatrixPrint(Matrix_t m, FILE *fp);
void MatrixSetValue(double val, Matrix_t m);
void MatrixSetIdentity(Matrix_t m);
double MatrixGet(short r, short c, Matrix_t m);
void MatrixSet(short r, short c, double val, Matrix_t m);
void MatrixTranspose(Matrix_t m);
void MatrixCopy(Matrix_t to, Matrix_t from);
void MatrixMultiply(Matrix_t left, Matrix_t right, Matrix_t result);
void VectorTransform(Matrix_t left, Vector_t right, Vector_t result);
void MatrixScale2D(double sx, double sy, Matrix_t r);
void MatrixRotate2D(double costh, double sinth, Matrix_t r);
void MatrixTranslate2D(double tx, double ty, Matrix_t r);
void MatrixScale3D(double sx, double sy, double sz, Matrix_t r);
void MatrixRotateZ(double costh, double sinth, Matrix_t r);
void MatrixRotateX(double costh, double sinth, Matrix_t r);
void MatrixRotateY(double costh, double sinth, Matrix_t r);
void MatrixRotateXYZ(Vector_t x, Vector_t y, Vector_t z, Matrix_t r);
void MatrixTranslate3D(double tx, double ty, double tz, Matrix_t r);
void MatrixPerspective(double d, Matrix_t r);
void MatrixShearZ(double a, double b, Matrix_t r);

#endif


