/**
 * $Id:$
 * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
 *
 * The contents of this file may be used under the terms of either the GNU
 * General Public License Version 2 or later (the "GPL", see
 * http://www.gnu.org/licenses/gpl.html ), or the Blender License 1.0 or
 * later (the "BL", see http://www.blender.org/BL/ ) which has to be
 * bought from the Blender Foundation to become active, in which case the
 * above mentioned GPL option does not apply.
 *
 * The Original Code is Copyright (C) 2002 by NaN Holding BV.
 * All rights reserved.
 *
 * The Original Code is: all of this file.
 *
 * Contributor(s): none yet.
 *
 * ***** END GPL/BL DUAL LICENSE BLOCK *****
 */

/*

 * arithb_ext.h
 *
 * This c lib needs to be replaced by Geno and Erwin's c++ lib ...
 *
 * Version: $Id: arithb_ext.h,v 1.7 2000/07/20 19:14:57 ton Exp $
 */

#ifndef ARITHB_EXT_H
#define ARITHB_EXT_H "$Id: arithb_ext.h,v 1.7 2000/07/20 19:14:57 ton Exp $"

#ifdef __WIN32
extern void srand48(uint );
extern float drand48(void);
#endif


/* matrix operations */
/* void Mat4MulMat4(float m1[][4], float m2[][4], float m3[][4]); */
/* void Mat3MulVecfl(float mat[][3], float *vec);  */
/* or **mat, but it's the same */
/*void Mat3MulVecd(float mat[][3], double *vec); */

/* void Mat4MulVecfl(float mat[][4], float *vec); */
/* void Mat4MulSerie(float answ[][4], float m1[][4], float m2[][4],  */
/*                   float m3[][4], float m4[][4], float m5[][4],  */
/*                   float m6[][4], float m7[][4], float m8[][4]); */
/* int Mat4Invert(float inverse[][4], float mat[][4]); */

/* m2 to m1 */
/*  void Mat3CpyMat4(float m1p[][3], float m2p[][4]); */
/* void Mat3CpyMat4(float *m1p, float *m2p); */

/* m1 to m2 */
/*  void Mat3CpyMat3(float m1p[][3], float m2p[][3]); */
/* void Mat3CpyMat3(float *m1p, float *m2p); */

/* m2 to m1 */
/* void Mat4CpyMat3(float m1p[][4], float m2p[][3]); */

/* M1 = M3*M2 */
/*  void Mat3MulMat3(float m1[][3], float m2[][3], float m3[][3]); */
/*void Mat3MulMat3(float *m1, float *m3, float *m2); */

/* m1 = m2 * m3, ignore the elements on the 4th row/column of m3 */
/*void Mat3IsMat3MulMat4(float m1[][3], float m2[][3], float m3[][4]); */

/* m1 to m2 */
/*  void Mat4CpyMat4(float m1[][4], float m2[][4]); */
/* void Mat4CpyMat4(float *m1, float *m2); */


/* void Mat4Ortho(float mat[][4]); */
/* void Mat4Mul3Vecfl(float mat[][4], float *vec); */
/* void Mat4MulVec4fl(float mat[][4], float *vec); */
/* void Mat4SwapMat4(float *m1, float *m2); */

/* void Mat3Inv(float m1[][3], float m2[][3]); */
/* void Mat4One(float m[][4]); */
/* void Mat3One(float m[][3]); */


extern void CalcCent3f(float *cent, float *v1, float *v2, float *v3);
extern void CalcCent4f(float *cent, float *v1, float *v2, float *v3, float *v4);
extern void Crossf(float *c, float *a, float *b);


extern void EulToMat3(float *eul, float mat[][3]);
void EulToMat4(float* eul, float mat[][4]);


extern void QuatToEul(float *quat, float *eul);
extern void QuatOne(float *);
extern void QuatMul(float *, float *, float *);
extern void NormalQuat(float *);
extern void VecRotToQuat(float *vec, float phi, float *quat);
extern void QuatSub(float *q, float *q1, float *q2);


/* extern void Mat3Inv(float m1[][3], float m2[][3]); */
/* extern int Mat4Invert(float inverse[][4], float mat[][4]); */
/* extern void Mat3CpyMat4(float *m1, float *m2); */
extern void Mat3ToEul(float tmat[][3], float *eul);
/* extern void Mat3MulMat3(float *m1, float *m3, float *m2); */
/* extern void Mat3MulVecfl(float mat[][3], float *vec); */
/* extern void Mat4MulVecfl(float mat[][4], float *vec); */
extern void Mat3MulFloat(float *m, float f);
extern void Mat4MulFloat(float *m, float f);
extern void Mat4MulFloat3(float *m, float f);
extern int FloatCompare(float *v1, float *v2, float limit);
extern float Normalise(float *n);
extern float CalcNormFloat(float *v1,float *v2,float *v3,float *n);
extern float CalcNormFloat4(float *v1,float *v2,float *v3,float *v4,float *n);
extern float VecLenf(float *v1, float *v2);
extern void VecMulf(float *v1, float f);
extern float Sqrt3f(float f);
extern double Sqrt3d(double d);
extern void euler_rot(float *beul, float ang, char axis);
extern    float safacos(float fac);
extern    float safsqrt(float fac);
extern float Inpf(float *v1, float *v2);
extern void VecSubf(float *v, float *v1, float *v2);
extern void VecAddf(float *v, float *v1, float *v2);
extern void VecUpMat3(float *vec, float mat[][3], short axis);

extern float DistVL2Dfl(float *v1,float *v2,float *v3);
extern float PdistVL2Dfl(float *v1,float *v2,float *v3);
extern float AreaF2Dfl(float *v1, float *v2, float *v3);
extern float AreaQ3Dfl(float *v1, float *v2, float *v3, float *v4);
extern float AreaT3Dfl(float *v1, float *v2, float *v3);
extern float AreaPoly3Dfl(int nr, float *verts, float *normal);
extern void VecRotToMat3(float *vec, float phi, float mat[][3]);
extern float Spec(float inp, int hard);
extern float *vectoquat(float *vec, short axis, short upflag);

extern void i_lookat(float vx, float vy, float vz, float px, float py, float pz, float twist, float mat[][4]);
extern void i_window(float left, float right, float bottom, float top, float near, float far, float mat[][4]);

extern void hsv_to_rgb(float h, float s, float v, float *r, float *g, float *b);
extern void rgb_to_hsv(float r, float g, float b, float *lh, float *ls, float *lv);
extern uint hsv_to_cpack(float h, float s, float v);
extern uint rgb_to_cpack(float r, float g, float b);
extern void cpack_to_rgb(uint col, float *r, float *g, float *b);


#endif /* ARITHB_EXT_H */