150 lines
3.4 KiB
C
150 lines
3.4 KiB
C
/*
|
|
* Copyright (c) 1992,1993-1995 Argonaut Technologies Limited. All rights reserved.
|
|
*
|
|
* $Id: vecifns.h 1.9 1995/03/01 15:26:24 sam Exp $
|
|
* $Locker: $
|
|
*
|
|
* Inline versions of the internal vector operations
|
|
*/
|
|
|
|
#ifndef _VECIFNS_H_
|
|
#define _VECIFNS_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*
|
|
* v1=matrix[row]
|
|
*/
|
|
#define BrVector3CopyMat34Row(v1, matrix, row) do {\
|
|
(v1)->v[0]=(matrix)->m[(row)][0];\
|
|
(v1)->v[1]=(matrix)->m[(row)][1];\
|
|
(v1)->v[2]=(matrix)->m[(row)][2];\
|
|
} while(0)
|
|
|
|
/*
|
|
* v1=matrix[row]
|
|
*/
|
|
#define BrVector3CopyMat34Col(v1, matrix, col) do {\
|
|
(v1)->v[0]=(matrix)->m[0][(col)];\
|
|
(v1)->v[1]=(matrix)->m[1][(col)];\
|
|
(v1)->v[2]=(matrix)->m[2][(col)];\
|
|
} while(0)
|
|
|
|
/*
|
|
* = v1.v2 (v1 is a unit vector (word components))
|
|
*/
|
|
#define BrFVector2Dot(v1, v2) BR_FMAC2((v1)->v[0],(v2)->v[0],(v1)->v[1],(v2)->v[1])
|
|
|
|
/*
|
|
* v1=v2
|
|
*/
|
|
#define BrVector3CopyF(v1, v2) do {\
|
|
(v1)->v[0]=BrFractionToScalar((v2)->v[0]);\
|
|
(v1)->v[1]=BrFractionToScalar((v2)->v[1]);\
|
|
(v1)->v[2]=BrFractionToScalar((v2)->v[2]);\
|
|
} while(0)
|
|
|
|
#define BrVector3ScaleF(v1,v2,s)\
|
|
do {\
|
|
(v1)->v[0]=BR_MUL((v2)->v[0],BrFractionToScalar(s));\
|
|
(v1)->v[1]=BR_MUL((v2)->v[1],BrFractionToScalar(s));\
|
|
(v1)->v[2]=BR_MUL((v2)->v[2],BrFractionToScalar(s));\
|
|
} while(0)\
|
|
|
|
#define BrFVector3Scale(v1,v2,s)\
|
|
do {\
|
|
(v1)->v[0]=BR_MUL(BrFractionToScalar((v2)->v[0]),(s));\
|
|
(v1)->v[1]=BR_MUL(BrFractionToScalar((v2)->v[1]),(s));\
|
|
(v1)->v[2]=BR_MUL(BrFractionToScalar((v2)->v[2]),(s));\
|
|
} while(0)\
|
|
|
|
/*
|
|
* v1=-v2
|
|
*/
|
|
#define BrFVector3Negate(v1, v2) do {\
|
|
(v1)->v[0]=-(v2)->v[0];\
|
|
(v1)->v[1]=-(v2)->v[1];\
|
|
(v1)->v[2]=-(v2)->v[2];\
|
|
} while(0)
|
|
|
|
|
|
|
|
/*
|
|
* = v1.v2 (v1 is a unit vector (word components))
|
|
*/
|
|
#define BrFVector3Dot(v1, v2) BR_FMAC3((v1)->v[0],(v2)->v[0],(v1)->v[1],(v2)->v[1],(v1)->v[2],(v2)->v[2])
|
|
|
|
/*
|
|
* v1 = v2/|v2|
|
|
*/
|
|
#define BrFVector3Normalise(v1,v2) do {\
|
|
br_scalar _scale;\
|
|
_scale=BR_LENGTH3((v2)->v[0],(v2)->v[1],(v2)->v[2]);\
|
|
if(_scale > BR_SCALAR_EPSILON*2) {\
|
|
_scale = BR_DIV(BR_FRACTION(1.0),_scale);\
|
|
(v1)->v[0]=(br_fraction)BR_MUL((v2)->v[0],_scale);\
|
|
(v1)->v[1]=(br_fraction)BR_MUL((v2)->v[1],_scale);\
|
|
(v1)->v[2]=(br_fraction)BR_MUL((v2)->v[2],_scale);\
|
|
} else {\
|
|
(v1)->v[0]=BR_FRACTION(1.0);\
|
|
(v1)->v[1]=BR_FRACTION(0.0);\
|
|
(v1)->v[2]=BR_FRACTION(0.0);\
|
|
}\
|
|
} while(0)
|
|
|
|
/*
|
|
* v1 = v2/|v2|
|
|
*/
|
|
#define BrFVector3NormaliseQuick(v1,v2) do {\
|
|
scalar _scale;\
|
|
_scale=BR_DIV(BR_FRACTION(1.0),BR_LENGTH3((v2)->v[0],(v2)->v[1],(v2)->v[2]));\
|
|
BrVector3Scale(v1,v2,_scale);\
|
|
} while(0)
|
|
|
|
/*
|
|
* v1 = v2/|v2| (low precision)
|
|
*/
|
|
#if BASED_FIXED /* XXX - This should not be here */
|
|
#define BrFVector3NormaliseLP(v1,v2) do {\
|
|
br_scalar _scale;\
|
|
_scale=BR_RLENGTH3((v2)->v[0],(v2)->v[1],(v2)->v[2])>>1;\
|
|
BrVector3Scale(v1,v2,_scale);\
|
|
} while(0)
|
|
#endif
|
|
|
|
#if BASED_FLOAT
|
|
#define BrFVector3NormaliseLP(v1,v2) do {\
|
|
br_scalar _scale;\
|
|
_scale=BR_RLENGTH3((v2)->v[0],(v2)->v[1],(v2)->v[2]);\
|
|
BrVector3ScaleF(v1,v2,_scale);\
|
|
} while(0)
|
|
#endif
|
|
|
|
/*
|
|
* v1=matrix[row]
|
|
*/
|
|
#define BrVector4CopyMat4Row(v1, matrix, row) do {\
|
|
(v1)->v[0]=(matrix)->m[(row)][0];\
|
|
(v1)->v[1]=(matrix)->m[(row)][1];\
|
|
(v1)->v[2]=(matrix)->m[(row)][2];\
|
|
(v1)->v[3]=(matrix)->m[(row)][3];\
|
|
} while(0)
|
|
|
|
/*
|
|
* v1=matrix[column]
|
|
*/
|
|
#define BrVector4CopyMat4Col(v1, matrix, col) do {\
|
|
(v1)->v[0]=(matrix)->m[0][(col)];\
|
|
(v1)->v[1]=(matrix)->m[1][(col)];\
|
|
(v1)->v[2]=(matrix)->m[2][(col)];\
|
|
(v1)->v[3]=(matrix)->m[3][(col)];\
|
|
} while(0)
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
#endif
|
|
|
|
|