36#define inline __inline
42#define CAT2_(a, b) a##b
43#define CAT2(a, b) CAT2_(a, b)
57#define CCV_EPSILON ((ccvType)0.0001)
61#define CCV_VEC_TYPENAME(dim) vec##dim
62#define CCV_QUAT_TYPENAME quat
63#define CCV_MAT_TYPENAME(dim) mat##dim##x##dim
67#define CCV_FUNC_VEC_ZERO(dim) CAT2(CCV_VEC_TYPENAME(dim), Zero)
68#define CCV_FUNC_VEC_NEGATE(dim) CAT2(CCV_VEC_TYPENAME(dim), Negate)
69#define CCV_FUNC_VEC_ISZERO(dim) CAT2(CCV_VEC_TYPENAME(dim), IsZero)
70#define CCV_FUNC_VEC_ADD(dim) CAT2(CCV_VEC_TYPENAME(dim), Add)
71#define CCV_FUNC_VEC_SUBTRACT(dim) CAT2(CCV_VEC_TYPENAME(dim), Subtract)
72#define CCV_FUNC_VEC_MULTIPLY(dim) CAT2(CCV_VEC_TYPENAME(dim), Multiply)
73#define CCV_FUNC_VEC_DOTPRODUCT(dim) CAT2(CCV_VEC_TYPENAME(dim), DotProduct)
74#define CCV_FUNC_VEC_LENGTH(dim) CAT2(CCV_VEC_TYPENAME(dim), Length)
75#define CCV_FUNC_VEC_NORMALIZE(dim) CAT2(CCV_VEC_TYPENAME(dim), Normalize)
76#define CCV_FUNC_VEC_REFLECT(dim) CAT2(CCV_VEC_TYPENAME(dim), Reflect)
77#define CCV_FUNC_VEC_ORTHOGONAL(dim) CAT2(CCV_VEC_TYPENAME(dim), Orthogonal)
78#define CCV_FUNC_VEC_CROSS_PRODUCT(dim) CAT2(CCV_VEC_TYPENAME(dim), CrossProduct)
79#define CCV_FUNC_VEC_MIX(dim) CAT2(CCV_VEC_TYPENAME(dim), Mix)
80#define CCV_FUNC_VEC_NEW(dim) CAT2(CCV_VEC_TYPENAME(dim), New)
81#define CCV_FUNC_VEC_EQUAL(dim) CAT2(CCV_VEC_TYPENAME(dim), Equal)
83#define CCV_FUNC_QUAT_IDENTITY CAT2(CCV_QUAT_TYPENAME, Identity)
84#define CCV_FUNC_QUAT_ROTATE CAT2(CCV_QUAT_TYPENAME, Rotate)
85#define CCV_FUNC_QUAT_MULTIPLY CAT2(CCV_QUAT_TYPENAME, Multiply)
86#define CCV_FUNC_QUAT_ADD_ROTATION CAT2(CCV_QUAT_TYPENAME, AddRotation)
87#define CCV_FUNC_QUAT_MULTIPLY_VECTOR CAT2(CCV_QUAT_TYPENAME, MultiplyVector)
88#define CCV_FUNC_QUAT_ADD CAT2(CCV_QUAT_TYPENAME, Add)
89#define CCV_FUNC_QUAT_SUBTRACT CAT2(CCV_QUAT_TYPENAME, Subtract)
90#define CCV_FUNC_QUAT_SCALE CAT2(CCV_QUAT_TYPENAME, Scale)
91#define CCV_FUNC_QUAT_MIX CAT2(CCV_QUAT_TYPENAME, Mix)
93#define CCV_FUNC_MAT_ZERO(dim) CAT2(CCV_MAT_TYPENAME(dim), Zero)
94#define CCV_FUNC_MAT_ISZERO(dim) CAT2(CCV_MAT_TYPENAME(dim), IsZero)
95#define CCV_FUNC_MAT_ADD(dim) CAT2(CCV_MAT_TYPENAME(dim), Add)
96#define CCV_FUNC_MAT_SUBTRACT(dim) CAT2(CCV_MAT_TYPENAME(dim), Subtract)
97#define CCV_FUNC_MAT_COPY(dim) CAT2(CCV_MAT_TYPENAME(dim), Copy)
98#define CCV_FUNC_MAT_IDENTITY(dim) CAT2(CCV_MAT_TYPENAME(dim), Identity)
99#define CCV_FUNC_MAT_MULTIPLY_SCALAR(dim) CAT2(CCV_MAT_TYPENAME(dim), MultiplyScalar)
100#define CCV_FUNC_MAT_MULTIPLY_VECTOR(dim) CAT2(CCV_MAT_TYPENAME(dim), MultiplyVector)
101#define CCV_FUNC_MAT_MULTIPLY_MATRIX(dim) CAT2(CCV_MAT_TYPENAME(dim), MultiplyMatrix)
102#define CCV_FUNC_MAT_GET_ROW(dim) CAT2(CCV_MAT_TYPENAME(dim), GetRow)
103#define CCV_FUNC_MAT_GET_COL(dim) CAT2(CCV_MAT_TYPENAME(dim), GetCol)
104#define CCV_FUNC_MAT_DEMOTE(dim) CAT2(CCV_MAT_TYPENAME(dim), Demote)
105#define CCV_FUNC_MAT_TRANSPOSE(dim) CAT2(CCV_MAT_TYPENAME(dim), Transpose)
106#define CCV_FUNC_MAT_SET_ROTATION(dim) CAT2(CCV_MAT_TYPENAME(dim), SetRotation)
107#define CCV_FUNC_MAT_ROTATE(dim) CAT2(CCV_MAT_TYPENAME(dim), Rotate)
108#define CCV_FUNC_MAT_SET_ROTATION_2D(dim) CAT2(CCV_MAT_TYPENAME(dim), SetRotation2D)
109#define CCV_FUNC_MAT_ROTATE_2D(dim) CAT2(CCV_MAT_TYPENAME(dim), Rotate2D)
110#define CCV_FUNC_MAT_SET_ROTATION_X(dim) CAT2(CCV_MAT_TYPENAME(dim), SetRotationX)
111#define CCV_FUNC_MAT_SET_ROTATION_Y(dim) CAT2(CCV_MAT_TYPENAME(dim), SetRotationY)
112#define CCV_FUNC_MAT_SET_ROTATION_Z(dim) CAT2(CCV_MAT_TYPENAME(dim), SetRotationZ)
113#define CCV_FUNC_MAT_ROTATE_X(dim) CAT2(CCV_MAT_TYPENAME(dim), RotateX)
114#define CCV_FUNC_MAT_ROTATE_Y(dim) CAT2(CCV_MAT_TYPENAME(dim), RotateY)
115#define CCV_FUNC_MAT_ROTATE_Z(dim) CAT2(CCV_MAT_TYPENAME(dim), RotateZ)
116#define CCV_FUNC_MAT_SET_TRANSLATION(dim) CAT2(CCV_MAT_TYPENAME(dim), SetTranslation)
117#define CCV_FUNC_MAT_TRANSLATE(dim) CAT2(CCV_MAT_TYPENAME(dim), Translate)
118#define CCV_FUNC_MAT_SET_SCALE(dim) CAT2(CCV_MAT_TYPENAME(dim), SetScale)
119#define CCV_FUNC_MAT_SCALE(dim) CAT2(CCV_MAT_TYPENAME(dim), Scale)
120#define CCV_FUNC_MAT_SET_SCALE_2D(dim) CAT2(CCV_MAT_TYPENAME(dim), SetScale2D)
121#define CCV_FUNC_MAT_SCALE_2D(dim) CAT2(CCV_MAT_TYPENAME(dim), Scale2D)
122#define CCV_FUNC_MAT_INVERSE(dim) CAT2(CCV_MAT_TYPENAME(dim), Inverse)
123#define CCV_FUNC_MAT_PERSPECTIVE(dim) CAT2(CCV_MAT_TYPENAME(dim), Perspective)
124#define CCV_FUNC_MAT_LOOK_AT(dim) CAT2(CCV_MAT_TYPENAME(dim), LookAt)
125#define CCV_FUNC_MAT_EQUAL(dim) CAT2(CCV_MAT_TYPENAME(dim), Equal)
129#define CCV_DEFINE_VEC_TYPE(dim)
131#define CCV_DEFINE_MAT_TYPE(dim) \
132 typedef ccvType CCV_MAT_TYPENAME(dim)[dim][dim];
136#define CCV_DEFINE_VEC_ZERO(dim) \
137 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_VEC_ZERO(dim)(void) { \
138 CCV_VEC_TYPENAME(dim) v; \
139 memset(&v, 0, sizeof(CCV_VEC_TYPENAME(dim))); \
143#define CCV_DEFINE_VEC_NEGATE(dim) \
144 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_VEC_NEGATE(dim)(const CCV_VEC_TYPENAME(dim) v) { \
145 CCV_VEC_TYPENAME(dim) r; \
147 for(i = 0; i < dim; ++i) \
152#define CCV_DEFINE_VEC_ISZERO(dim) \
153 static inline int CCV_FUNC_VEC_ISZERO(dim)(const CCV_VEC_TYPENAME(dim) v) { \
155 for(i = 0; i < dim; ++i) \
156 if(v.v[i] != 0) return 0; \
160#define CCV_DEFINE_VEC_ADD(dim) \
161 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_VEC_ADD(dim)(const CCV_VEC_TYPENAME(dim) a, const CCV_VEC_TYPENAME(dim) b) { \
162 CCV_VEC_TYPENAME(dim) v; \
164 for(i = 0; i < dim; ++i) \
165 v.v[i] = a.v[i] + b.v[i]; \
169#define CCV_DEFINE_VEC_SUBTRACT(dim) \
170 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_VEC_SUBTRACT(dim)(const CCV_VEC_TYPENAME(dim) a, const CCV_VEC_TYPENAME(dim) b) { \
171 CCV_VEC_TYPENAME(dim) v; \
173 for(i = 0; i < dim; ++i) \
174 v.v[i] = a.v[i] - b.v[i]; \
178#define CCV_DEFINE_VEC_MULTIPLY(dim) \
179 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_VEC_MULTIPLY(dim)(CCV_VEC_TYPENAME(dim) v, const ccvType n) { \
181 for(i = 0; i < dim; ++i) \
186#define CCV_DEFINE_VEC_DOTPRODUCT(dim) \
187 static inline ccvType CCV_FUNC_VEC_DOTPRODUCT(dim)(const CCV_VEC_TYPENAME(dim) a, const CCV_VEC_TYPENAME(dim) b) { \
189 ccvType result = 0; \
190 for(i = 0; i < dim; ++i) \
191 result += a.v[i] * b.v[i]; \
195#define CCV_DEFINE_VEC_LENGTH(dim) \
196 static inline ccvType CCV_FUNC_VEC_LENGTH(dim)(const CCV_VEC_TYPENAME(dim) v) { \
198 ccvType squaredResult = 0; \
199 for(i = 0; i < dim; ++i) \
200 squaredResult += v.v[i] * v.v[i]; \
201 return (ccvType)CCV_SQRT(squaredResult); \
204#define CCV_DEFINE_VEC_NORMALIZE(dim) \
205 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_VEC_NORMALIZE(dim)(CCV_VEC_TYPENAME(dim) v) { \
206 return CCV_FUNC_VEC_MULTIPLY(dim)(v, 1 / CCV_FUNC_VEC_LENGTH(dim)(v)); \
209#define CCV_DEFINE_VEC_REFLECT(dim) \
210 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_VEC_REFLECT(dim)(const CCV_VEC_TYPENAME(dim) n, const CCV_VEC_TYPENAME(dim) r) { \
211 return CCV_FUNC_VEC_SUBTRACT(dim)(r, CCV_FUNC_VEC_MULTIPLY(dim)(n, 2 * CCV_FUNC_VEC_DOTPRODUCT(dim)(n, r))); \
214#define CCV_DEFINE_VEC_MIX(dim) \
215 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_VEC_MIX(dim)(const CCV_VEC_TYPENAME(dim) a, const CCV_VEC_TYPENAME(dim) b, const ccvType f) { \
216 return CCV_FUNC_VEC_ADD(dim)(a, CCV_FUNC_VEC_MULTIPLY(dim)(CCV_FUNC_VEC_SUBTRACT(dim)(b, a), f)); \
219#define CCV_DEFINE_VEC_EQUAL(dim) \
220 static inline int CCV_FUNC_VEC_EQUAL(dim)(const CCV_VEC_TYPENAME(dim) a, const CCV_VEC_TYPENAME(dim) b) { \
222 for(i = 0; i < dim; ++i) \
223 if(a.v[i] != b.v[i]) \
230#define CCV_DEFINE_MAT_ZERO(dim) \
231 static inline void CCV_FUNC_MAT_ZERO(dim)(CCV_MAT_TYPENAME(dim) m) { \
232 memset(m, 0, sizeof(ccvType)* dim * dim); \
235#define CCV_DEFINE_MAT_ISZERO(dim) \
236 static inline int CCV_FUNC_MAT_ISZERO(dim)(CCV_MAT_TYPENAME(dim) m) { \
237 unsigned int row = 0; \
238 unsigned int col = 0; \
239 for(col = 0; col < dim; ++col) \
240 for(row = 0; row < dim; ++row) \
241 if(m[row][col] != 0) return 0; \
245#define CCV_DEFINE_MAT_ADD(dim) \
246 static inline void CCV_FUNC_MAT_ADD(dim)(CCV_MAT_TYPENAME(dim) m, const CCV_MAT_TYPENAME(dim) a, const CCV_MAT_TYPENAME(dim) b) { \
247 unsigned int row = 0; \
248 unsigned int col = 0; \
249 for(col = 0; col < dim; ++col) \
250 for(row = 0; row < dim; ++row) \
251 m[row][col] = a[row][col] + b[row][col]; \
254#define CCV_DEFINE_MAT_SUBTRACT(dim) \
255 static inline void CCV_FUNC_MAT_SUBTRACT(dim)(CCV_MAT_TYPENAME(dim) m, const CCV_MAT_TYPENAME(dim) a, const CCV_MAT_TYPENAME(dim) b) { \
256 unsigned int row = 0; \
257 unsigned int col = 0; \
258 for(col = 0; col < dim; ++col) \
259 for(row = 0; row < dim; ++row) \
260 m[row][col] = a[row][col] - b[row][col]; \
263#define CCV_DEFINE_MAT_COPY(dim) \
264 static inline void CCV_FUNC_MAT_COPY(dim)(CCV_MAT_TYPENAME(dim) dest, const CCV_MAT_TYPENAME(dim) source) { \
265 memcpy(dest, source, sizeof(ccvType) * dim * dim); \
268#define CCV_DEFINE_MAT_IDENTITY(dim) \
269 static inline void CCV_FUNC_MAT_IDENTITY(dim)(CCV_MAT_TYPENAME(dim) m) { \
271 CCV_FUNC_MAT_ZERO(dim)(m); \
272 for(i = 0; i < dim; ++i) \
276#define CCV_DEFINE_MAT_MULTIPLY_SCALAR(dim) \
277 static inline void CCV_FUNC_MAT_MULTIPLY_SCALAR(dim)(CCV_MAT_TYPENAME(dim) m, const ccvType n) { \
278 unsigned int row = 0; \
279 unsigned int col = 0; \
280 for(col = 0; col < dim; ++col) \
281 for(row = 0; row < dim; ++row) m[row][col] *= n; \
284#define CCV_DEFINE_MAT_MULTIPLY_VECTOR(dim) \
285 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_MAT_MULTIPLY_VECTOR(dim)(const CCV_MAT_TYPENAME(dim) a, const CCV_VEC_TYPENAME(dim) b) { \
286 CCV_VEC_TYPENAME(dim) v; \
288 for(i = 0; i < dim; ++i) { \
289 v.v[i] = a[0][i] * b.v[0]; \
290 for(j = 1; j < dim; ++j) \
291 v.v[i] += a[j][i] * b.v[j]; \
296#define CCV_DEFINE_MAT_MULTIPLY_MATRIX(dim) \
297 static inline void CCV_FUNC_MAT_MULTIPLY_MATRIX(dim)(CCV_MAT_TYPENAME(dim) m, const CCV_MAT_TYPENAME(dim) a, const CCV_MAT_TYPENAME(dim) b) { \
298 unsigned int i, j, k; \
299 for(j = 0; j < dim; ++j) \
300 for(i = 0; i < dim; ++i) { \
301 m[i][j] = a[i][0] * b[0][j]; \
302 for(k = 1; k < dim; ++k) \
303 m[i][j] += a[i][k] * b[k][j]; \
307#define CCV_DEFINE_MAT_GET_ROW(dim) \
308 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_MAT_GET_ROW(dim)(CCV_MAT_TYPENAME(dim) m, const unsigned int n) { \
309 CCV_VEC_TYPENAME(dim) v; \
311 for(i = 0; i < dim; ++i) \
316#define CCV_DEFINE_MAT_GET_COL(dim) \
317 static inline CCV_VEC_TYPENAME(dim) CCV_FUNC_MAT_GET_COL(dim)(CCV_MAT_TYPENAME(dim) m, const unsigned int n) { \
318 CCV_VEC_TYPENAME(dim) v; \
319 memcpy(v.v, m[n], sizeof(ccvType)* dim); \
323#define CCV_DEFINE_MAT_TRANSPOSE(dim) \
324 static inline void CCV_FUNC_MAT_TRANSPOSE(dim)(CCV_MAT_TYPENAME(dim) m, CCV_MAT_TYPENAME(dim) n) { \
326 for(j = 0; j < dim; ++j) \
327 for(i = 0; i < dim; ++i) \
331#define CCV_DEFINE_MAT_EQUAL(dim) \
332 static inline int CCV_FUNC_MAT_EQUAL(dim)(CCV_MAT_TYPENAME(dim) a, CCV_MAT_TYPENAME(dim) b) { \
334 for(j = 0; j < dim; ++j) \
335 for(i = 0; i < dim; ++i) \
336 if(a[i][j] != b[i][j]) \
341#define CCV_DEFINE_MAT_DEMOTE(dimTarget, dimSource) \
342 static inline void CCV_FUNC_MAT_DEMOTE(dimSource)(CCV_MAT_TYPENAME(dimTarget) m, CCV_MAT_TYPENAME(dimSource) n) { \
344 for(j = 0; j < dimTarget; ++j) \
345 for(i = 0; i < dimTarget; ++i) \
351#define CCV_DEFINE_VEC(dim) \
352 CCV_DEFINE_VEC_TYPE(dim) \
353 CCV_DEFINE_VEC_ZERO(dim) \
354 CCV_DEFINE_VEC_NEGATE(dim) \
355 CCV_DEFINE_VEC_ISZERO(dim) \
356 CCV_DEFINE_VEC_ADD(dim) \
357 CCV_DEFINE_VEC_SUBTRACT(dim) \
358 CCV_DEFINE_VEC_MULTIPLY(dim) \
359 CCV_DEFINE_VEC_DOTPRODUCT(dim) \
360 CCV_DEFINE_VEC_LENGTH(dim) \
361 CCV_DEFINE_VEC_NORMALIZE(dim) \
362 CCV_DEFINE_VEC_REFLECT(dim) \
363 CCV_DEFINE_VEC_MIX(dim) \
364 CCV_DEFINE_VEC_EQUAL(dim)
366#define CCV_DEFINE_MAT(dim) \
367 CCV_DEFINE_VEC_TYPE(dim) \
368 CCV_DEFINE_MAT_TYPE(dim) \
369 CCV_DEFINE_MAT_ZERO(dim) \
370 CCV_DEFINE_MAT_ISZERO(dim) \
371 CCV_DEFINE_MAT_ADD(dim) \
372 CCV_DEFINE_MAT_SUBTRACT(dim) \
373 CCV_DEFINE_MAT_COPY(dim) \
374 CCV_DEFINE_MAT_IDENTITY(dim) \
375 CCV_DEFINE_MAT_MULTIPLY_SCALAR(dim) \
376 CCV_DEFINE_MAT_MULTIPLY_VECTOR(dim) \
377 CCV_DEFINE_MAT_MULTIPLY_MATRIX(dim) \
378 CCV_DEFINE_MAT_GET_ROW(dim) \
379 CCV_DEFINE_MAT_GET_COL(dim) \
380 CCV_DEFINE_MAT_TRANSPOSE(dim) \
381 CCV_DEFINE_MAT_EQUAL(dim)
387 struct { ccvType x, y; };
395 struct { ccvType x, y; };
416 struct { ccvType x, y; };
420 struct { ccvType z, w; };
460CCV_DEFINE_MAT_DEMOTE(2, 3)
461CCV_DEFINE_MAT_DEMOTE(3, 4)
465#undef CCV_DEFINE_VEC_TYPE
466#define CCV_DEFINE_VEC_TYPE(dim) \
469 } CCV_VEC_TYPENAME(dim);
473#define CCV_APPLY_MATRIX(dim, operation) { \
474 CCV_MAT_TYPENAME(dim) buffer, multiply; \
476 CCV_FUNC_MAT_COPY(dim)(buffer, m); \
477 CCV_FUNC_MAT_MULTIPLY_MATRIX(dim)(m, buffer, multiply); \
492static inline
CCV_VEC_TYPENAME(2) CCV_FUNC_VEC_NEW(2)(const ccvType x, const ccvType y)
506 v.x = a.y * b.z - a.z * b.y;
507 v.y = a.z * b.x - a.x * b.z;
508 v.z = a.x * b.y - a.y * b.x;
513static inline
CCV_VEC_TYPENAME(3) CCV_FUNC_VEC_NEW(3)(const ccvType x, const ccvType y, const ccvType z)
524static inline
CCV_VEC_TYPENAME(4) CCV_FUNC_VEC_NEW(4)(const ccvType x, const ccvType y, const ccvType z, const ccvType w)
538static inline CCV_QUAT_TYPENAME CCV_FUNC_QUAT_IDENTITY()
548static inline CCV_QUAT_TYPENAME CCV_FUNC_QUAT_ROTATE(
CCV_VEC_TYPENAME(3) axis, ccvType radians)
551 ccvType s = CCV_SIN(radians * (ccvType)0.5);
553 q.xyz = CCV_FUNC_VEC_MULTIPLY(3)(axis, s);
554 q.w = CCV_COS(radians * (ccvType)0.5);
559static inline CCV_QUAT_TYPENAME CCV_FUNC_QUAT_MULTIPLY(
const CCV_QUAT_TYPENAME a,
const CCV_QUAT_TYPENAME b)
564 r.xyz = CCV_FUNC_VEC_CROSS_PRODUCT(3)(a.xyz, b.xyz);
565 w = CCV_FUNC_VEC_MULTIPLY(3)(a.xyz, b.w);
566 r.xyz = CCV_FUNC_VEC_ADD(3)(r.xyz, w);
567 w = CCV_FUNC_VEC_MULTIPLY(3)(b.xyz, a.w);
568 r.xyz = CCV_FUNC_VEC_ADD(3)(r.xyz, w);
570 r.w = a.w * b.w - CCV_FUNC_VEC_DOTPRODUCT(3)(a.xyz, b.xyz);
575static inline CCV_QUAT_TYPENAME CCV_FUNC_QUAT_ADD_ROTATION(CCV_QUAT_TYPENAME q,
CCV_VEC_TYPENAME(3) axis, ccvType radians)
577 return CCV_FUNC_QUAT_MULTIPLY(q, CCV_FUNC_QUAT_ROTATE(axis, radians));
582 CCV_VEC_TYPENAME(3) t = CCV_FUNC_VEC_MULTIPLY(3)(CCV_FUNC_VEC_CROSS_PRODUCT(3)(q.xyz, p), 2);
584 return CCV_FUNC_VEC_ADD(3)(CCV_FUNC_VEC_ADD(3)(p, CCV_FUNC_VEC_MULTIPLY(3)(t, q.w)), CCV_FUNC_VEC_CROSS_PRODUCT(3)(q.xyz, t));
587static inline CCV_QUAT_TYPENAME CCV_FUNC_QUAT_ADD(const CCV_QUAT_TYPENAME a, const CCV_QUAT_TYPENAME b)
589 return CCV_FUNC_VEC_ADD(4)(a, b);
592static inline CCV_QUAT_TYPENAME CCV_FUNC_QUAT_SUBTRACT(
const CCV_QUAT_TYPENAME a,
const CCV_QUAT_TYPENAME b)
594 return CCV_FUNC_VEC_SUBTRACT(4)(a, b);
597static inline CCV_QUAT_TYPENAME CCV_FUNC_QUAT_SCALE(
const CCV_QUAT_TYPENAME q,
const ccvType n)
599 return CCV_FUNC_VEC_MULTIPLY(4)(q, n);
602static inline CCV_QUAT_TYPENAME CCV_FUNC_QUAT_MIX(
const CCV_QUAT_TYPENAME a,
const CCV_QUAT_TYPENAME b,
const ccvType f)
604 ccvType cosHalfTheta = CCV_FUNC_VEC_DOTPRODUCT(4)(a, b);
606 if(CCV_ABS(cosHalfTheta) >= 1)
609 ccvType sinHalfTheta = CCV_SQRT(1 - cosHalfTheta * cosHalfTheta);
611 if(CCV_ABS(sinHalfTheta) < CCV_EPSILON)
612 return CCV_FUNC_VEC_NORMALIZE(4)(CCV_FUNC_VEC_MIX(4)(a, b, (ccvType)0.5));
614 return CCV_FUNC_VEC_NORMALIZE(4)(CCV_FUNC_VEC_MIX(4)(a, b, CCV_SIN(f * CCV_ACOS(cosHalfTheta)) / sinHalfTheta));
620#define CCV_SET_ROTATION_2D() \
621 m[0][0] = (ccvType)CCV_COS(r); \
622 m[0][1] = (ccvType)CCV_SIN(r); \
623 m[1][0] = -m[0][1]; \
626static inline void CCV_FUNC_MAT_SET_ROTATION(2)(CCV_MAT_TYPENAME(2) m, const ccvType r)
628 CCV_SET_ROTATION_2D();
631static inline void CCV_FUNC_MAT_ROTATE(2)(CCV_MAT_TYPENAME(2) m, const ccvType r) CCV_APPLY_MATRIX(2, CCV_FUNC_MAT_SET_ROTATION(2)(multiply, r));
633static inline
void CCV_FUNC_MAT_SET_ROTATION_2D(2)(CCV_MAT_TYPENAME(3) m, const ccvType r)
635 CCV_FUNC_MAT_ZERO(3)(m);
637 CCV_SET_ROTATION_2D();
641static inline void CCV_FUNC_MAT_ROTATE_2D(3)(CCV_MAT_TYPENAME(3) m, const ccvType r) CCV_APPLY_MATRIX(3, CCV_FUNC_MAT_SET_ROTATION_2D(2)(multiply, r));
643#define CCV_SET_ROTATION_3D_X() \
648 m[1][1] = (ccvType)CCV_COS(r); \
649 m[1][2] = (ccvType)CCV_SIN(r); \
651 m[2][1] = -m[1][2]; \
654#define CCV_SET_ROTATION_3D_Y() \
655 m[0][0] = (ccvType)CCV_COS(r); \
660 m[2][0] = (ccvType)CCV_SIN(r); \
661 m[0][2] = -m[2][0]; \
665#define CCV_SET_ROTATION_3D_Z() \
666 m[0][0] = (ccvType)CCV_COS(r); \
667 m[0][1] = (ccvType)CCV_SIN(r); \
669 m[1][0] = -m[0][1]; \
676static inline void CCV_FUNC_MAT_SET_ROTATION_X(3)(CCV_MAT_TYPENAME(3) m, const ccvType r)
678 CCV_SET_ROTATION_3D_X();
681static inline void CCV_FUNC_MAT_SET_ROTATION_Y(3)(CCV_MAT_TYPENAME(3) m, const ccvType r)
683 CCV_SET_ROTATION_3D_Y();
686static inline void CCV_FUNC_MAT_SET_ROTATION_Z(3)(CCV_MAT_TYPENAME(3) m, const ccvType r)
688 CCV_SET_ROTATION_3D_Z();
691static inline void CCV_FUNC_MAT_ROTATE_X(3)(CCV_MAT_TYPENAME(3) m, const ccvType r) CCV_APPLY_MATRIX(3, CCV_FUNC_MAT_SET_ROTATION_X(3)(multiply, r))
693static inline
void CCV_FUNC_MAT_ROTATE_Y(3)(CCV_MAT_TYPENAME(3) m, const ccvType r) CCV_APPLY_MATRIX(3, CCV_FUNC_MAT_SET_ROTATION_Y(3)(multiply, r))
695static inline
void CCV_FUNC_MAT_ROTATE_Z(3)(CCV_MAT_TYPENAME(3) m, const ccvType r) CCV_APPLY_MATRIX(3, CCV_FUNC_MAT_SET_ROTATION_Z(3)(multiply, r))
697static inline
void CCV_FUNC_MAT_SET_ROTATION_X(4)(CCV_MAT_TYPENAME(4) m, const ccvType r)
699 CCV_FUNC_MAT_ZERO(4)(m);
701 CCV_SET_ROTATION_3D_X();
705static inline void CCV_FUNC_MAT_SET_ROTATION_Y(4)(CCV_MAT_TYPENAME(4) m, const ccvType r)
707 CCV_FUNC_MAT_ZERO(4)(m);
709 CCV_SET_ROTATION_3D_Y();
713static inline void CCV_FUNC_MAT_SET_ROTATION_Z(4)(CCV_MAT_TYPENAME(4) m, const ccvType r)
715 CCV_FUNC_MAT_ZERO(4)(m);
717 CCV_SET_ROTATION_3D_Z();
721static inline void CCV_FUNC_MAT_ROTATE_X(4)(CCV_MAT_TYPENAME(4) m, const ccvType r) CCV_APPLY_MATRIX(4, CCV_FUNC_MAT_SET_ROTATION_X(4)(multiply, r))
723static inline
void CCV_FUNC_MAT_ROTATE_Y(4)(CCV_MAT_TYPENAME(4) m, const ccvType r) CCV_APPLY_MATRIX(4, CCV_FUNC_MAT_SET_ROTATION_Y(4)(multiply, r))
725static inline
void CCV_FUNC_MAT_ROTATE_Z(4)(CCV_MAT_TYPENAME(4) m, const ccvType r) CCV_APPLY_MATRIX(4, CCV_FUNC_MAT_SET_ROTATION_Z(4)(multiply, r))
729static inline
void CCV_FUNC_MAT_SET_TRANSLATION(3)(CCV_MAT_TYPENAME(3) m, const
CCV_VEC_TYPENAME(2) v)
731 CCV_FUNC_MAT_IDENTITY(3)(m);
737static inline void CCV_FUNC_MAT_TRANSLATE(3)(CCV_MAT_TYPENAME(3) m, const
CCV_VEC_TYPENAME(2) v) CCV_APPLY_MATRIX(3, CCV_FUNC_MAT_SET_TRANSLATION(3)(multiply, v))
739static inline
void CCV_FUNC_MAT_SET_TRANSLATION(4)(CCV_MAT_TYPENAME(4) m, const
CCV_VEC_TYPENAME(3) v)
741 CCV_FUNC_MAT_IDENTITY(4)(m);
748static inline void CCV_FUNC_MAT_TRANSLATE(4)(CCV_MAT_TYPENAME(4) m, const
CCV_VEC_TYPENAME(3) v) CCV_APPLY_MATRIX(4, CCV_FUNC_MAT_SET_TRANSLATION(4)(multiply, v))
752static inline
void CCV_FUNC_MAT_SET_SCALE(2)(CCV_MAT_TYPENAME(2) m, const ccvType scale)
754 m[0][0] = m[1][1] = scale;
755 m[1][0] = m[0][1] = 0;
758static inline void CCV_FUNC_MAT_SCALE(2)(CCV_MAT_TYPENAME(2) m, const ccvType scale) CCV_APPLY_MATRIX(2, CCV_FUNC_MAT_SET_SCALE(2)(multiply, scale))
760static inline
void CCV_FUNC_MAT_SET_SCALE_2D(3)(CCV_MAT_TYPENAME(3) m, const ccvType scale)
762 CCV_FUNC_MAT_ZERO(3)(m);
765 m[0][0] = m[1][1] = scale;
768static inline void CCV_FUNC_MAT_SCALE_2D(3)(CCV_MAT_TYPENAME(3) m, const ccvType scale) CCV_APPLY_MATRIX(3, CCV_FUNC_MAT_SET_SCALE_2D(3)(multiply, scale))
770static inline
void CCV_FUNC_MAT_SET_SCALE(3)(CCV_MAT_TYPENAME(3) m, const ccvType scale)
772 CCV_FUNC_MAT_ZERO(3)(m);
774 m[0][0] = m[1][1] = m[2][2] = scale;
777static inline void CCV_FUNC_MAT_SCALE(3)(CCV_MAT_TYPENAME(3) m, const ccvType scale) CCV_APPLY_MATRIX(3, CCV_FUNC_MAT_SET_SCALE(3)(multiply, scale))
779static inline
void CCV_FUNC_MAT_SET_SCALE(4)(CCV_MAT_TYPENAME(4) m, const ccvType scale)
781 CCV_FUNC_MAT_ZERO(4)(m);
784 m[0][0] = m[1][1] = m[2][2] = scale;
787static inline void CCV_FUNC_MAT_SCALE(4)(CCV_MAT_TYPENAME(4) m, const ccvType scale) CCV_APPLY_MATRIX(4, CCV_FUNC_MAT_SET_SCALE(4)(multiply, scale))
791static inline
void CCV_FUNC_MAT_INVERSE(3)(CCV_MAT_TYPENAME(3) t, CCV_MAT_TYPENAME(3) m)
796 s[0][0] = m[1][1] * m[2][2] - m[2][1] * m[1][2];
797 s[1][0] = - m[0][1] * m[2][2] + m[2][1] * m[0][2];
798 s[2][0] = m[0][1] * m[1][2] - m[1][1] * m[0][2];
799 s[0][1] = - m[1][0] * m[2][2] + m[1][2] * m[2][0];
800 s[1][1] = m[0][0] * m[2][2] - m[0][2] * m[2][0];
801 s[2][1] = - m[0][0] * m[1][2] + m[0][2] * m[1][0];
802 s[0][2] = m[1][0] * m[2][1] - m[1][1] * m[2][0];
803 s[1][2] = - m[0][0] * m[2][1] + m[0][1] * m[2][0];
804 s[2][2] = m[0][0] * m[1][1] - m[0][1] * m[1][0];
806 idet = m[0][0] * s[0][0] + m[1][0] * s[1][0] + m[2][0] * s[2][0];
812 t[0][0] = s[0][0] * idet;
813 t[1][0] = s[0][1] * idet;
814 t[2][0] = s[0][2] * idet;
815 t[0][1] = s[1][0] * idet;
816 t[1][1] = s[1][1] * idet;
817 t[2][1] = s[1][2] * idet;
818 t[0][2] = s[2][0] * idet;
819 t[1][2] = s[2][1] * idet;
820 t[2][2] = s[2][2] * idet;
823static inline void CCV_FUNC_MAT_INVERSE(4)(CCV_MAT_TYPENAME(4) t, CCV_MAT_TYPENAME(4) m)
829 s[0] = m[0][0] * m[1][1] - m[1][0] * m[0][1];
830 s[1] = m[0][0] * m[1][2] - m[1][0] * m[0][2];
831 s[2] = m[0][0] * m[1][3] - m[1][0] * m[0][3];
832 s[3] = m[0][1] * m[1][2] - m[1][1] * m[0][2];
833 s[4] = m[0][1] * m[1][3] - m[1][1] * m[0][3];
834 s[5] = m[0][2] * m[1][3] - m[1][2] * m[0][3];
836 c[0] = m[2][0] * m[3][1] - m[3][0] * m[2][1];
837 c[1] = m[2][0] * m[3][2] - m[3][0] * m[2][2];
838 c[2] = m[2][0] * m[3][3] - m[3][0] * m[2][3];
839 c[3] = m[2][1] * m[3][2] - m[3][1] * m[2][2];
840 c[4] = m[2][1] * m[3][3] - m[3][1] * m[2][3];
841 c[5] = m[2][2] * m[3][3] - m[3][2] * m[2][3];
843 idet = s[0] * c[5] - s[1] * c[4] + s[2] * c[3] + s[3] * c[2] - s[4] * c[1] + s[5] * c[0];
849 t[0][0] = (m[1][1] * c[5] - m[1][2] * c[4] + m[1][3] * c[3]) * idet;
850 t[0][1] = (-m[0][1] * c[5] + m[0][2] * c[4] - m[0][3] * c[3]) * idet;
851 t[0][2] = (m[3][1] * s[5] - m[3][2] * s[4] + m[3][3] * s[3]) * idet;
852 t[0][3] = (-m[2][1] * s[5] + m[2][2] * s[4] - m[2][3] * s[3]) * idet;
854 t[1][0] = (-m[1][0] * c[5] + m[1][2] * c[2] - m[1][3] * c[1]) * idet;
855 t[1][1] = (m[0][0] * c[5] - m[0][2] * c[2] + m[0][3] * c[1]) * idet;
856 t[1][2] = (-m[3][0] * s[5] + m[3][2] * s[2] - m[3][3] * s[1]) * idet;
857 t[1][3] = (m[2][0] * s[5] - m[2][2] * s[2] + m[2][3] * s[1]) * idet;
859 t[2][0] = (m[1][0] * c[4] - m[1][1] * c[2] + m[1][3] * c[0]) * idet;
860 t[2][1] = (-m[0][0] * c[4] + m[0][1] * c[2] - m[0][3] * c[0]) * idet;
861 t[2][2] = (m[3][0] * s[4] - m[3][1] * s[2] + m[3][3] * s[0]) * idet;
862 t[2][3] = (-m[2][0] * s[4] + m[2][1] * s[2] - m[2][3] * s[0]) * idet;
864 t[3][0] = (-m[1][0] * c[3] + m[1][1] * c[1] - m[1][2] * c[0]) * idet;
865 t[3][1] = (m[0][0] * c[3] - m[0][1] * c[1] + m[0][2] * c[0]) * idet;
866 t[3][2] = (-m[3][0] * s[3] + m[3][1] * s[1] - m[3][2] * s[0]) * idet;
867 t[3][3] = (m[2][0] * s[3] - m[2][1] * s[1] + m[2][2] * s[0]) * idet;
872static inline void CCV_FUNC_MAT_PERSPECTIVE(4)(CCV_MAT_TYPENAME(4) m, ccvType angle, ccvType aspect, ccvType zNear, ccvType zFar)
874 ccvType a = CCV_TAN(angle * (ccvType)0.5);
883 m[0][0] = a / aspect;
895 m[2][2] = -((zFar + zNear) / (zFar - zNear));
900 m[3][2] = -((2 * zFar * zNear) / (zFar - zNear));
909 CCV_VEC_TYPENAME(3) f = CCV_FUNC_VEC_NORMALIZE(3)(CCV_FUNC_VEC_SUBTRACT(3)(to, from));
910 CCV_VEC_TYPENAME(3) s = CCV_FUNC_VEC_NORMALIZE(3)(CCV_FUNC_VEC_CROSS_PRODUCT(3)(f, up));
928 for(i = 0; i < 3; ++i) {
930 m[3][i] = -CCV_FUNC_VEC_DOTPRODUCT(3)(r, from);
Definition ccVector.h:385