760 lines
11 KiB
C++
760 lines
11 KiB
C++
#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
|
|
|