📄 macros.h
字号:
#define SUB_3V( DST, SRCA, SRCB ) \do { \ (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ (DST)[1] = (SRCA)[1] - (SRCB)[1]; \ (DST)[2] = (SRCA)[2] - (SRCB)[2]; \} while (0)/** Addition */#define ADD_3V( DST, SRCA, SRCB ) \do { \ (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ (DST)[1] = (SRCA)[1] + (SRCB)[1]; \ (DST)[2] = (SRCA)[2] + (SRCB)[2]; \} while (0)/** In-place scalar multiplication */#define SCALE_3V( DST, SRCA, SRCB ) \do { \ (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ (DST)[1] = (SRCA)[1] * (SRCB)[1]; \ (DST)[2] = (SRCA)[2] * (SRCB)[2]; \} while (0)/** In-place element-wise multiplication */#define SELF_SCALE_3V( DST, SRC ) \do { \ (DST)[0] *= (SRC)[0]; \ (DST)[1] *= (SRC)[1]; \ (DST)[2] *= (SRC)[2]; \} while (0)/** In-place addition */#define ACC_3V( DST, SRC ) \do { \ (DST)[0] += (SRC)[0]; \ (DST)[1] += (SRC)[1]; \ (DST)[2] += (SRC)[2]; \} while (0)/** Element-wise multiplication and addition */#define ACC_SCALE_3V( DST, SRCA, SRCB ) \do { \ (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ (DST)[1] += (SRCA)[1] * (SRCB)[1]; \ (DST)[2] += (SRCA)[2] * (SRCB)[2]; \} while (0)/** Scalar multiplication */#define SCALE_SCALAR_3V( DST, S, SRCB ) \do { \ (DST)[0] = S * (SRCB)[0]; \ (DST)[1] = S * (SRCB)[1]; \ (DST)[2] = S * (SRCB)[2]; \} while (0)/** In-place scalar multiplication and addition */#define ACC_SCALE_SCALAR_3V( DST, S, SRCB ) \do { \ (DST)[0] += S * (SRCB)[0]; \ (DST)[1] += S * (SRCB)[1]; \ (DST)[2] += S * (SRCB)[2]; \} while (0)/** In-place scalar multiplication */#define SELF_SCALE_SCALAR_3V( DST, S ) \do { \ (DST)[0] *= S; \ (DST)[1] *= S; \ (DST)[2] *= S; \} while (0)/** In-place scalar addition */#define ACC_SCALAR_3V( DST, S ) \do { \ (DST)[0] += S; \ (DST)[1] += S; \ (DST)[2] += S; \} while (0)/** Assignment */#define ASSIGN_3V( V, V0, V1, V2 ) \do { \ V[0] = V0; \ V[1] = V1; \ V[2] = V2; \} while(0)/*@}*//**********************************************************************//** \name 2-element vector operations*//*@{*//** Zero */#define ZERO_2V( DST ) (DST)[0] = (DST)[1] = 0/** Copy a 2-element vector */#define COPY_2V( DST, SRC ) \do { \ (DST)[0] = (SRC)[0]; \ (DST)[1] = (SRC)[1]; \} while (0)/** Copy a 2-element vector with cast */#define COPY_2V_CAST( DST, SRC, CAST ) \do { \ (DST)[0] = (CAST)(SRC)[0]; \ (DST)[1] = (CAST)(SRC)[1]; \} while (0)/** Copy a 2-element float vector */#define COPY_2FV( DST, SRC ) \do { \ const GLfloat *_tmp = (SRC); \ (DST)[0] = _tmp[0]; \ (DST)[1] = _tmp[1]; \} while (0)/** Subtraction */#define SUB_2V( DST, SRCA, SRCB ) \do { \ (DST)[0] = (SRCA)[0] - (SRCB)[0]; \ (DST)[1] = (SRCA)[1] - (SRCB)[1]; \} while (0)/** Addition */#define ADD_2V( DST, SRCA, SRCB ) \do { \ (DST)[0] = (SRCA)[0] + (SRCB)[0]; \ (DST)[1] = (SRCA)[1] + (SRCB)[1]; \} while (0)/** In-place scalar multiplication */#define SCALE_2V( DST, SRCA, SRCB ) \do { \ (DST)[0] = (SRCA)[0] * (SRCB)[0]; \ (DST)[1] = (SRCA)[1] * (SRCB)[1]; \} while (0)/** In-place addition */#define ACC_2V( DST, SRC ) \do { \ (DST)[0] += (SRC)[0]; \ (DST)[1] += (SRC)[1]; \} while (0)/** Element-wise multiplication and addition */#define ACC_SCALE_2V( DST, SRCA, SRCB ) \do { \ (DST)[0] += (SRCA)[0] * (SRCB)[0]; \ (DST)[1] += (SRCA)[1] * (SRCB)[1]; \} while (0)/** Scalar multiplication */#define SCALE_SCALAR_2V( DST, S, SRCB ) \do { \ (DST)[0] = S * (SRCB)[0]; \ (DST)[1] = S * (SRCB)[1]; \} while (0)/** In-place scalar multiplication and addition */#define ACC_SCALE_SCALAR_2V( DST, S, SRCB ) \do { \ (DST)[0] += S * (SRCB)[0]; \ (DST)[1] += S * (SRCB)[1]; \} while (0)/** In-place scalar multiplication */#define SELF_SCALE_SCALAR_2V( DST, S ) \do { \ (DST)[0] *= S; \ (DST)[1] *= S; \} while (0)/** In-place scalar addition */#define ACC_SCALAR_2V( DST, S ) \do { \ (DST)[0] += S; \ (DST)[1] += S; \} while (0)/** Assign scalers to short vectors */#define ASSIGN_2V( V, V0, V1 ) \do { \ V[0] = V0; \ V[1] = V1; \} while(0)/*@}*//** \name Linear interpolation macros *//*@{*//** * Linear interpolation * * \note \p OUT argument is evaluated twice! * \note Be wary of using *coord++ as an argument to any of these macros! */#define LINTERP(T, OUT, IN) ((OUT) + (T) * ((IN) - (OUT)))/* Can do better with integer math */#define INTERP_UB( t, dstub, outub, inub ) \do { \ GLfloat inf = UBYTE_TO_FLOAT( inub ); \ GLfloat outf = UBYTE_TO_FLOAT( outub ); \ GLfloat dstf = LINTERP( t, outf, inf ); \ UNCLAMPED_FLOAT_TO_UBYTE( dstub, dstf ); \} while (0)#define INTERP_CHAN( t, dstc, outc, inc ) \do { \ GLfloat inf = CHAN_TO_FLOAT( inc ); \ GLfloat outf = CHAN_TO_FLOAT( outc ); \ GLfloat dstf = LINTERP( t, outf, inf ); \ UNCLAMPED_FLOAT_TO_CHAN( dstc, dstf ); \} while (0)#define INTERP_UI( t, dstui, outui, inui ) \ dstui = (GLuint) (GLint) LINTERP( (t), (GLfloat) (outui), (GLfloat) (inui) )#define INTERP_F( t, dstf, outf, inf ) \ dstf = LINTERP( t, outf, inf )#define INTERP_4F( t, dst, out, in ) \do { \ dst[0] = LINTERP( (t), (out)[0], (in)[0] ); \ dst[1] = LINTERP( (t), (out)[1], (in)[1] ); \ dst[2] = LINTERP( (t), (out)[2], (in)[2] ); \ dst[3] = LINTERP( (t), (out)[3], (in)[3] ); \} while (0)#define INTERP_3F( t, dst, out, in ) \do { \ dst[0] = LINTERP( (t), (out)[0], (in)[0] ); \ dst[1] = LINTERP( (t), (out)[1], (in)[1] ); \ dst[2] = LINTERP( (t), (out)[2], (in)[2] ); \} while (0)#define INTERP_4CHAN( t, dst, out, in ) \do { \ INTERP_CHAN( (t), (dst)[0], (out)[0], (in)[0] ); \ INTERP_CHAN( (t), (dst)[1], (out)[1], (in)[1] ); \ INTERP_CHAN( (t), (dst)[2], (out)[2], (in)[2] ); \ INTERP_CHAN( (t), (dst)[3], (out)[3], (in)[3] ); \} while (0)#define INTERP_3CHAN( t, dst, out, in ) \do { \ INTERP_CHAN( (t), (dst)[0], (out)[0], (in)[0] ); \ INTERP_CHAN( (t), (dst)[1], (out)[1], (in)[1] ); \ INTERP_CHAN( (t), (dst)[2], (out)[2], (in)[2] ); \} while (0)#define INTERP_SZ( t, vec, to, out, in, sz ) \do { \ switch (sz) { \ case 4: vec[to][3] = LINTERP( (t), (vec)[out][3], (vec)[in][3] ); \ case 3: vec[to][2] = LINTERP( (t), (vec)[out][2], (vec)[in][2] ); \ case 2: vec[to][1] = LINTERP( (t), (vec)[out][1], (vec)[in][1] ); \ case 1: vec[to][0] = LINTERP( (t), (vec)[out][0], (vec)[in][0] ); \ } \} while(0)/*@}*//** Clamp X to [MIN,MAX] */#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) )/** Assign X to CLAMP(X, MIN, MAX) */#define CLAMP_SELF(x, mn, mx) \ ( (x)<(mn) ? ((x) = (mn)) : ((x)>(mx) ? ((x)=(mx)) : (x)) )/** Minimum of two values: */#define MIN2( A, B ) ( (A)<(B) ? (A) : (B) )/** Maximum of two values: */#define MAX2( A, B ) ( (A)>(B) ? (A) : (B) )/** Dot product of two 2-element vectors */#define DOT2( a, b ) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] )/** Dot product of two 3-element vectors */#define DOT3( a, b ) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2] )/** Dot product of two 4-element vectors */#define DOT4( a, b ) ( (a)[0]*(b)[0] + (a)[1]*(b)[1] + \ (a)[2]*(b)[2] + (a)[3]*(b)[3] )/** Dot product of two 4-element vectors */#define DOT4V(v,a,b,c,d) (v[0]*(a) + v[1]*(b) + v[2]*(c) + v[3]*(d))/** Cross product of two 3-element vectors */#define CROSS3(n, u, v) \do { \ (n)[0] = (u)[1]*(v)[2] - (u)[2]*(v)[1]; \ (n)[1] = (u)[2]*(v)[0] - (u)[0]*(v)[2]; \ (n)[2] = (u)[0]*(v)[1] - (u)[1]*(v)[0]; \} while (0)/* Normalize a 3-element vector to unit length. */#define NORMALIZE_3FV( V ) \do { \ GLfloat len = (GLfloat) LEN_SQUARED_3FV(V); \ if (len) { \ len = INV_SQRTF(len); \ (V)[0] = (GLfloat) ((V)[0] * len); \ (V)[1] = (GLfloat) ((V)[1] * len); \ (V)[2] = (GLfloat) ((V)[2] * len); \ } \} while(0)#define LEN_3FV( V ) (SQRTF((V)[0]*(V)[0]+(V)[1]*(V)[1]+(V)[2]*(V)[2]))#define LEN_2FV( V ) (SQRTF((V)[0]*(V)[0]+(V)[1]*(V)[1]))#define LEN_SQUARED_3FV( V ) ((V)[0]*(V)[0]+(V)[1]*(V)[1]+(V)[2]*(V)[2])#define LEN_SQUARED_2FV( V ) ((V)[0]*(V)[0]+(V)[1]*(V)[1])#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -