#undef TEST_ACTIVE //#define ACTIVE 1 /** * blenlib/BLI_arithb.h mar 2001 Nzc * * $Id$ * * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. The Blender * Foundation also sells licenses for use in proprietary software under * the Blender License. See http://www.blender.org/BL/ for information * about this. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * The Original Code is Copyright (C) 2001-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 ***** * * The old math stuff from Ton. These will slowly phase out in favour * of MTC calls. (or even MoTO :) ) * */ #ifndef BLI_ARITHB_H #define BLI_ARITHB_H #ifdef __cplusplus extern "C" { #endif #define MAT4_UNITY {{ 1.0, 0.0, 0.0, 0.0},\ { 0.0, 1.0, 0.0, 0.0},\ { 0.0, 0.0, 1.0, 0.0},\ { 0.0, 0.0, 0.0, 1.0}} #define MAT3_UNITY {{ 1.0, 0.0, 0.0},\ { 0.0, 1.0, 0.0},\ { 0.0, 0.0, 1.0}} /* 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]); */ void CalcCent3f( float *cent, const float *v1, const float *v2, const float *v3 ); void CalcCent4f( float *cent, const float *v1, const float *v2, const float *v3, const float *v4 ); void Crossf( float *c, const float *a, const float *b ); /** * Euler conversion routines */ void EulToMat3( const float *eul, float mat[][3] ); void EulToMat4( const float* eul, float mat[][4] ); void Mat3ToEul( const float tmat[][3], float *eul ); /** * @section Quaternion arithmetic routines */ void QuatToEul( const float *quat, float *eul ); void QuatOne( float * ); void QuatMul( float *, const float *, const float * ); void NormalQuat( float * ); void VecRotToQuat( const float *vec, float phi, float *quat ); void QuatSub( float *q, const float *q1, float *q2 ); /** * @section matrix multiplication can copying routines */ void Mat3MulFloat( float *m, float f ); void Mat4MulFloat( float *m, float f ); void Mat4MulFloat3( float *m, float f ); void Mat3Transp( float mat[][3] ); void Mat4Transp( float mat[][4] ); int Mat4Invert( float inverse[][4], const float mat[][4] ); void Mat4InvertSimp( float inverse[][4], const float mat[][4] ); void Mat4Inv( float *m1, const float *m2 ); void Mat4InvGG( float out[][4], const float in[][4] ); void Mat3CpyMat4( float m1[][3], const float m2[][4] ); void Mat3Inv( float m1[][3], const float m2[][3] ); void Mat4CpyMat3( float m1[][4], const float m2[][3] ); float Det2x2( float a,float b,float c,float d ); float Det3x3( float a1, float a2, float a3, float b1, float b2, float b3, float c1, float c2, float c3 ); float Det4x4( const float m[][4] ); void Mat4Adj( float out[][4], const float in[][4] ); void Mat3Adj( float m1[][3], const float m[][3] ); void Mat4MulMat4( float m1[][4], const float m2[][4], const float m3[][4] ); void subMat4MulMat4( float *m1, const float *m2, const float *m3 ); #ifndef TEST_ACTIVE void Mat3MulMat3( float m1[][3], const float m3[][3], const float m2[][3] ); #else void Mat3MulMat3( float *m1, const float *m3, const float *m2 ); #endif void Mat4MulMat34( float (*m1)[4], const float (*m3)[3], const float (*m2)[4] ); void Mat4CpyMat4( float m1[][4], const float m2[][4] ); void Mat4SwapMat4( float *m1, float *m2 ); void Mat3CpyMat3( float m1[][3], const float m2[][3] ); void Mat3MulSerie( float answ[][3], const float m1[][3], const float m2[][3], const float m3[][3], const float m4[][3], const float m5[][3], const float m6[][3], const float m7[][3], const float m8[][3] ); void Mat4MulSerie( float answ[][4], const float m1[][4], const float m2[][4], const float m3[][4], const float m4[][4], const float m5[][4], const float m6[][4], const float m7[][4], const float m8[][4] ); void Mat4Clr( float *m ); void Mat3Clr( float *m ); void Mat3One( float m[][3] ); void Mat4MulVec( const float mat[][4], int *vec ); void VecMat4MulVecfl( float *in, const float mat[][4], const float *vec ); void Mat4MulMat43( float (*m1)[4], const float (*m3)[4], const float (*m2)[3] ); void Mat3IsMat3MulMat4( float m1[][3], const float m2[][3], const float m3[][4] ); void Mat4One( float m[][4] ); void Mat4Mul3Vecfl( const float mat[][4], float *vec ); void Mat4MulVec4fl( const float mat[][4], float *vec ); void Mat3MulVec( const float mat[][3], int *vec ); void Mat4MulVecfl( const float mat[][4], float *vec ); void Mat4ToQuat( const float m[][4], float *q ); void VecUpMat3old( const float *vec, float mat[][3], short axis ); int FloatCompare( const float *v1, const float *v2, float limit ); float Normalise( float *n ); float CalcNormFloat( const float *v1, const float *v2, const float *v3, float *n ); float CalcNormFloat4( const float *v1, const float *v2, const float *v3, const float *v4, float *n ); float VecLenf( const float *v1, const float *v2 ); void VecMulf( float *v1, float f ); int VecCompare( const float *v1, const float *v2, float limit ); float Sqrt3f( float f ); double Sqrt3d( double d ); void euler_rot( float *beul, float ang, char axis ); float saacos( float fac ); float sasqrt( float fac ); float Inpf( const float *v1, const float *v2 ); void VecSubf( float *v, const float *v1, const float *v2 ); void VecAddf( float *v, const float *v1, const float *v2 ); void VecUpMat3( float *vec, float mat[][3], short axis ); float DistVL2Dfl( const float *v1, const float *v2, const float *v3 ); float PdistVL2Dfl( const float *v1, const float *v2, const float *v3 ); float AreaF2Dfl( const float *v1, const float *v2, const float *v3 ); float AreaQ3Dfl( const float *v1, const float *v2, const float *v3, const float *v4 ); float AreaT3Dfl( const float *v1, const float *v2, const float *v3 ); float AreaPoly3Dfl( int nr, const float *verts, const float *normal ); void VecRotToMat3( const float *vec, float phi, float mat[][3] ); float * vectoquat( const float *vec, short axis, short upflag ); void i_lookat( float vx, float vy, float vz, float px, float py, float pz, float twist, float mat[][4] ); void i_window( float left, float right, float bottom, float top, float nearClip, float farClip, float mat[][4] ); void hsv_to_rgb( float h, float s, float v, float *r, float *g, float *b ); void rgb_to_hsv( float r, float g, float b, float *lh, float *ls, float *lv ); unsigned int hsv_to_cpack( float h, float s, float v ); unsigned int rgb_to_cpack( float r, float g, float b ); void cpack_to_rgb( unsigned int col, float *r, float *g, float *b ); void EulToQuat( const float *eul, float *quat ); void Mat3MulVecfl( const float mat[][3], float *vec ); void Mat3MulVecd( const float mat[][3], double *vec ); void Mat3TransMulVecfl( const float mat[][3], float *vec ); void VecStar( float mat[][3], const float *vec ); short EenheidsMat( float mat[][3] ); void printmatrix3( const char *str, const float m[][3] ); void QuatToMat3( const float *q, float m[][3] ); void QuatToMat4( const float *q, float m[][4] ); void QuatToSpher( const float *quat, float *sph ); void Mat3ToSpher( const float *mat, float *sph ); void Mat3ToQuat_is_ok( const float wmat[][3], float *q ); void i_ortho( float left, float right, float bottom, float top, float nearClip, float farClip, float matrix[][4] ); void i_polarview( float dist, float azimuth, float incidence, float twist, float Vm[][4] ); void Mat3Ortho( float mat[][3] ); void Mat4Ortho( float mat[][4] ); void VecCopyf( float *v1, const float *v2 ); int VecLen( const int *v1, const int *v2 ); void CalcNormShort( const short *v1, const short *v2, const short *v3, float *n ) /* is ook uitprodukt */; void CalcNormLong( const int* v1, const int*v2, const int*v3, float *n ); void MinMax3( float *min, float *max, const float *vec ); void Mat3ToEuln( const float tmat[][3], float *eul ); void SizeToMat3( const float *size, float mat[][3] ); void printmatrix4( const char *str, const float m[][4] ); /* uit Sig.Proc.85 pag 253 */ void Mat3ToQuat( const float wmat[][3], float *q ); void i_translate( float Tx, float Ty, float Tz, float mat[][4] ); void i_multmatrix( const float icand[][4], float Vm[][4] ); void i_rotate( float angle, char axis, float mat[][4] ); void VecMidf( float *v, const float *v1, const float *v2 ); void Mat3ToSize( const float mat[][3], float *size ); void Mat4ToSize( const float mat[][4], float *size ); void triatoquat( const float *v1, const float *v2, const float *v3, float *quat ); void MinMaxRGB( short c[] ); #ifdef __cplusplus } #endif #endif