/
vTech
/
FcApps
Обзор
Документация
Войти
/
vTech
/
FcApps
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
FcLibs/FcMath/src/FcMath.h
834 строки
80 KB
vTech
alpha_00
03 дек 2025, 17:45
03 дек 2025, 17:45
ab8382d
Код
Авторство
О чём код?
#ifndef __FCMATH_H__ #define __FCMATH_H__ #ifdef __cplusplus #include <cstdlib> #else #include <stdlib.h> #endif #ifdef __cplusplus extern "C" { #endif #define _USE_MATH_DEFINES #include <math.h> #include <stdint.h> #include <stdio.h> #define SWAP_READ_32BIT(p) \ (((p)[0] << 24) | ((p)[1] << 16) | ((p)[2] << 8) | ((p)[3] << 0)) #define SWAP_READ_16BIT(p) (((p)[0] << 8) | ((p)[1] << 0)) #define SWAP_BYTE_16BIT(v) ((((v) >> 8) & 0xff) | (((v) & 0xff) << 8)) #define SWAP_BYTE_32BIT(v) \ (((((v) & 0xff000000) >> 24) | (((v) & 0x00ff0000) >> 8) | \ ((v) & 0x0000ff00) << 8) | \ (((v) & 0x000000ff) << 24)) #define FCMATHSTATIC #ifdef FCMATHSTATIC #define FCDEF static inline #else #define FCDEF extern inline #endif #ifndef ALIGNED #ifdef __GNUC__ #define ALIGNED(value, str, x) str x __attribute__((aligned(value))) #else #define ALIGNED(value, str, x) str __declspec(align(value)) x #endif #endif FCDEF uint16_t FcSwapbyte16(uint16_t a) { return ((uint16_t)((uint16_t)((a >> 8u) & 0xffu) | (((uint16_t)(a & 0xffu) << 8u)))); } FCDEF uint32_t FcSwapbyte32(uint32_t a) { return ((((a & 0xff000000u) >> (uint32_t)24) | ((a & 0x00ff0000u) >> (uint32_t)8) | ((a & 0x0000ff00u) << (uint32_t)8)) | ((a & 0x000000ffu) << (uint32_t)24)); } FCDEF uint64_t FcSwapbyte64(uint64_t a) { return (((a & 0x00000000000000ffull) << (uint64_t)56) | ((a & 0x000000000000ff00ull) << (uint64_t)40) | ((a & 0x0000000000ff0000ull) << (uint64_t)24) | ((a & 0x00000000ff000000ull) << (uint64_t)8) | ((a & 0x000000ff00000000ull) >> (uint64_t)8) | ((a & 0x0000ff0000000000ull) >> (uint64_t)24) | ((a & 0x00ff000000000000ull) >> (uint64_t)40) | ((a & 0xff00000000000000ull) >> (uint64_t)56)); } #define FCMATH(FCTYPE, type) \ \ typedef ALIGNED( \ 8, union, FcVec2##type##_t { \ FCTYPE m[2]; \ int m_i[2]; \ } FcVec2##type##_t); \ \ typedef union FcVec3##type##_t { \ FCTYPE m[3]; \ int m_i[3]; \ } FcVec3##type##_t; \ \ typedef ALIGNED( \ 16, union, FcVec4##type##_t { \ FcVec2##type##_t v[2]; \ FCTYPE m[4]; \ int m_i[4]; \ } FcVec4##type##_t); \ typedef ALIGNED( \ 32, union, FcVec8##type##_t { \ FcVec4##type##_t v[2]; \ FCTYPE m[8]; \ } FcVec8##type##_t); \ \ typedef ALIGNED( \ 16, union, FcMatrix2x2##type##_t { \ FcVec2##type##_t v[2]; \ FCTYPE m[2][2]; \ } FcMatrix2x2##type##_t); \ \ typedef union FcMatrix3x3##type##_t { \ FcVec3##type##_t v[3]; \ FCTYPE m[3][3]; \ FCTYPE ml[9]; \ } FcMatrix3x3##type##_t; \ \ typedef ALIGNED( \ 64, union, FcMatrix4x4##type##_t { \ FcVec4##type##_t v[4]; \ FCTYPE m[4][4]; \ FCTYPE ml[16]; \ } FcMatrix4x4##type##_t); \ \ FCDEF uint16_t FcSwapbyte16(uint16_t a); \ FCDEF uint32_t FcSwapbyte32(uint32_t a); \ FCDEF uint64_t FcSwapbyte64(uint64_t a); \ \ FCDEF FcVec2##type##_t FcVec2##type(FCTYPE s0, FCTYPE s1); \ FCDEF FcVec2##type##_t FcVec2##type##_add(FcVec2##type##_t a, FcVec2##type##_t b); \ FCDEF FcVec2##type##_t FcVec2##type##_sub(FcVec2##type##_t a, FcVec2##type##_t b); \ FCDEF FcVec2##type##_t FcVec2##type##_mul(FcVec2##type##_t a, FcVec2##type##_t b); \ FCDEF FcVec2##type##_t FcVec2##type##_muls(FcVec2##type##_t a, FCTYPE s); \ FCDEF FcVec2##type##_t FcVec2##type##_norm(FcVec2##type##_t a); \ FCDEF FCTYPE FcVec2##type##_det(FcVec2##type##_t a, FcVec2##type##_t b); \ FCDEF FCTYPE FcVec2##type##_length(FcVec2##type##_t a); \ FCDEF FCTYPE FcVec2##type##_dot(FcVec2##type##_t a, FcVec2##type##_t b); \ FCDEF FCTYPE FcVec2##type##_cross(FcVec2##type##_t a, FcVec2##type##_t b); \ \ FCDEF FcVec3##type##_t FcVec3##type(FCTYPE s0, FCTYPE s1, FCTYPE s2); \ FCDEF FCTYPE FcVec3##type##_length(FcVec3##type##_t a); \ FCDEF FCTYPE FcVec3##type##_dot(FcVec3##type##_t a, FcVec3##type##_t b); \ FCDEF FcVec3##type##_t FcVec3##type##_add(FcVec3##type##_t a, FcVec3##type##_t b); \ FCDEF FcVec3##type##_t FcVec3##type##_sub(FcVec3##type##_t a, FcVec3##type##_t b); \ FCDEF FcVec3##type##_t FcVec3##type##_mul(FcVec3##type##_t a, FcVec3##type##_t b); \ FCDEF FcVec3##type##_t FcVec3##type##_muls(FcVec3##type##_t a, FCTYPE s); \ FCDEF FcVec3##type##_t FcVec3##type##_norm(FcVec3##type##_t a); \ FCDEF FcVec3##type##_t FcVec3##type##_proj(FcVec3##type##_t a, FcVec3##type##_t onto); \ FCDEF FcVec3##type##_t FcVec3##type##_cross(FcVec3##type##_t a, FcVec3##type##_t b); \ FCDEF FcVec3##type##_t FcVec3##type##_ProjectionAonB(FcVec3##type##_t a, FcVec3##type##_t b); \ \ FCDEF FcVec4##type##_t FcVec4##type(FCTYPE s0, FCTYPE s1, FCTYPE s2, FCTYPE s3); \ FCDEF FcVec4##type##_t FcVec4##type##_p0000_init(FCTYPE value); \ FCDEF FCTYPE FcVec4##type##_length(FcVec4##type##_t a); \ FCDEF FCTYPE FcVec4##type##_sum(FcVec4##type##_t a); \ FCDEF FcVec4##type##_t FcVec4##type##_div(FcVec4##type##_t nominator, FcVec4##type##_t denominator); \ FCDEF FcVec4##type##_t FcVec4##type##_mul(FcVec4##type##_t nominator, FcVec4##type##_t denominator); \ FCDEF FcVec4##type##_t FcVec4##type##_add(FcVec4##type##_t nominator, FcVec4##type##_t denominator); \ FCDEF FcVec4##type##_t FcVec4##type##_sub(FcVec4##type##_t nominator, FcVec4##type##_t denominator); \ FCDEF FcVec4##type##_t FcVec4##type##_normalize(FcVec4##type##_t a); \ FCDEF FcVec4##type##_t FcVec4##type##_cross3(FcVec4##type##_t a, FcVec4##type##_t b); \ \ FCDEF FcVec8##type##_t FcVec8##type(FCTYPE, FCTYPE, FCTYPE, FCTYPE, FCTYPE, FCTYPE, FCTYPE, \ FCTYPE); \ FCDEF FcVec8##type##_t FcVec8##type##_p00000000_init(FCTYPE value); \ FCDEF FcVec8##type##_t FcVec8##type##_div(FcVec8##type##_t nominator, FcVec8##type##_t denominator); \ FCDEF FcVec8##type##_t FcVec8##type##_mul(FcVec8##type##_t nominator, FcVec8##type##_t denominator); \ FCDEF FcVec8##type##_t FcVec8##type##_mulc(FcVec8##type##_t nominator, FCTYPE denominator); \ FCDEF FcVec8##type##_t FcVec8##type##_addc(FcVec8##type##_t nominator, FCTYPE denominator); \ FCDEF FcVec8##type##_t FcVec8##type##f_add(FcVec8##type##_t nominator, FcVec8##type##_t denominator); \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type(FCTYPE, FCTYPE, FCTYPE, FCTYPE, FCTYPE, FCTYPE, \ FCTYPE, FCTYPE, FCTYPE, FCTYPE, FCTYPE, FCTYPE, \ FCTYPE, FCTYPE, FCTYPE, FCTYPE); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_identity(); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_transpose(FcMatrix4x4##type##_t *pMatrix); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_multiply_mm(FcMatrix4x4##type##_t *pMatrix0, \ FcMatrix4x4##type##_t *pMatrix1); \ FCDEF FcVec4##type##_t FcMatrix4x4##type##_multiply_mv(FcMatrix4x4##type##_t *pMatrix, \ FcVec4##type##_t *pVector); \ FCDEF FcVec3##type##_t FcMatrix4x4##type##_multiply_position(FcMatrix4x4##type##_t matrix, \ FcVec3##type##_t position); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_ortho(FCTYPE left, FCTYPE right, FCTYPE bottom, \ FCTYPE top, FCTYPE zNear, FCTYPE zFar); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_rotation(FCTYPE angle_in_rad, FcVec3##type##_t axis); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_translate(FcMatrix4x4##type##_t *pMatrix, \ FcVec4##type##_t offset); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_perspective( \ FCTYPE vertical_field_of_view_in_deg, FCTYPE aspect_ratio, \ FCTYPE near_view_distance, FCTYPE far_view_distance); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_gl_look_at(FcVec3##type##_t eay, FcVec3##type##_t center, \ FcVec3##type##_t up); \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_gl_look_at_view_matrix(FcVec3##type##_t eay, \ FcVec3##type##_t center, \ FcVec3##type##_t up); \ FCDEF void FcMatrix4x4##type##_fprintp(FcMatrix4x4##type##_t matrix, int width, int precision); \ \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type(FCTYPE m00, FCTYPE m01, FCTYPE m10, FCTYPE m11); \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_sub(FcMatrix2x2##type##_t m0, FcMatrix2x2##type##_t m1); \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_add(FcMatrix2x2##type##_t m0, FcMatrix2x2##type##_t m1); \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_transpose(FcMatrix2x2##type##_t m); \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_inv(FcMatrix2x2##type##_t m); \ FCDEF FcVec2##type##_t FcMatrix2x2##type##_mul_mv(FcMatrix2x2##type##_t m0, FcVec2##type##_t v0); \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_mul_mm(FcMatrix2x2##type##_t m0, FcMatrix2x2##type##_t m1); \ FCDEF FCTYPE FcMatrix2x2##type##_det(FcMatrix2x2##type##_t m); \ \ FCDEF void FcMatrix2x2##type##f_fprintp(FcMatrix2x2##type##_t matrix, int width, int precision); \ \ \ FCDEF FcVec2##type##_t FcVec2##type(FCTYPE s0, FCTYPE s1) { \ FcVec2##type##_t mV; \ mV.m[0] = s0; \ mV.m[1] = s1; \ return mV; \ } \ FCDEF FCTYPE FcVec2##type##_sum(FcVec2##type##_t a) { return a.m[0] + a.m[1]; } \ FCDEF FcVec2##type##_t FcVec2##type##_div(FcVec2##type##_t a, FcVec2##type##_t b) { \ return FcVec2##type(a.m[0] / b.m[0], a.m[1] / b.m[1]); \ } \ FCDEF FcVec2##type##_t FcVec2##type##_add(FcVec2##type##_t a, FcVec2##type##_t b) { \ return FcVec2##type(a.m[0] + b.m[0], a.m[1] + b.m[1]); \ } \ FCDEF FcVec2##type##_t FcVec2##type##_sub(FcVec2##type##_t a, FcVec2##type##_t b) { \ return FcVec2##type(a.m[0] - b.m[0], a.m[1] - b.m[1]); \ } \ FCDEF FCTYPE FcVec2##type##_max(FcVec2##type##_t a) { \ return a.m[0] < a.m[1] ? a.m[1] : a.m[0]; \ } \ FCDEF FcVec2##type##_t FcVec2##type##_mul(FcVec2##type##_t a, FcVec2##type##_t b) { \ return FcVec2##type(a.m[0] * b.m[0], a.m[1] * b.m[1]); \ } \ FCDEF FcVec2##type##_t FcVec2##type##_muls(FcVec2##type##_t a, FCTYPE s) { \ return FcVec2##type(a.m[0] * s, a.m[1] * s); \ } \ \ FCDEF bool FcVec2##type##_equal(FcVec2##type##_t v0, FcVec2##type##_t v1) { \ int i; \ bool notequal = false; \ for (i = 0; i < 2; i++) \ notequal |= v0.m[i] != v1.m[i]; \ return !notequal; \ } \ FCDEF FcVec2##type##_t FcVec2##type##_norm(FcVec2##type##_t a) { \ FCTYPE length = FcVec2##type##_length(a); \ if (length > 0) \ return FcVec2##type(a.m[0] / length, a.m[1] / length); \ else \ return FcVec2##type(0, 0); \ } \ FCDEF FCTYPE FcVec2##type##_det(FcVec2##type##_t a, FcVec2##type##_t b) { \ return a.m[0] * b.m[1] - a.m[1] * b.m[0]; \ } \ FCDEF FCTYPE FcVec2##type##_length(FcVec2##type##_t a) { \ return sqrt(a.m[0] * a.m[0] + a.m[1] * a.m[1]); \ } \ FCDEF FCTYPE FcVec2##type##_dot(FcVec2##type##_t a, FcVec2##type##_t b) { \ return a.m[0] * b.m[0] + a.m[1] * b.m[1]; \ } \ FCDEF FCTYPE FcVec2##type##_cross(FcVec2##type##_t a, FcVec2##type##_t b) { \ return a.m[0] * b.m[1] - a.m[1] * b.m[0]; \ } \ \ FCDEF FcVec3##type##_t FcVec3##type(FCTYPE s0, FCTYPE s1, FCTYPE s2) { \ FcVec3##type##_t mV = {{s0, s1, s2}}; \ return mV; \ } \ FCDEF FCTYPE FcVec3##type##_length(FcVec3##type##_t a) { \ return sqrt(a.m[0] * a.m[0] + a.m[1] * a.m[1] + a.m[2] * a.m[2]); \ } \ FCDEF FCTYPE FcVec3##type##_sum(FcVec3##type##_t a) { return a.m[0] + a.m[1] + a.m[2]; } \ FCDEF FCTYPE FcVec3##type##_dot(FcVec3##type##_t a, FcVec3##type##_t b) { \ return a.m[0] * b.m[0] + a.m[1] * b.m[1] + a.m[2] * b.m[2]; \ } \ FCDEF FcVec3##type##_t FcVec3##type##_add(FcVec3##type##_t a, FcVec3##type##_t b) { \ return FcVec3##type(a.m[0] + b.m[0], a.m[1] + b.m[1], a.m[2] + b.m[2]); \ } \ FCDEF FcVec3##type##_t FcVec3##type##_sub(FcVec3##type##_t a, FcVec3##type##_t b) { \ return FcVec3##type(a.m[0] - b.m[0], a.m[1] - b.m[1], a.m[2] - b.m[2]); \ } \ FCDEF FcVec3##type##_t FcVec3##type##_mul(FcVec3##type##_t a, FcVec3##type##_t b) { \ return FcVec3##type(a.m[0] * b.m[0], a.m[1] * b.m[1], a.m[2] * b.m[2]); \ } \ FCDEF FcVec3##type##_t FcVec3##type##_muls(FcVec3##type##_t a, FCTYPE s) { \ return FcVec3##type(a.m[0] * s, a.m[1] * s, a.m[2] * s); \ } \ FCDEF FcVec3##type##_t FcVec3##type##_norm(FcVec3##type##_t a) { \ FCTYPE length = FcVec3##type##_length(a); \ if (length > 0) \ return FcVec3##type(a.m[0] / length, a.m[1] / length, a.m[2] / length); \ else \ return FcVec3##type(0, 0, 0); \ } \ FCDEF FcVec3##type##_t FcVec3##type##_proj(FcVec3##type##_t a, FcVec3##type##_t onto) { \ return FcVec3##type##_muls(onto, FcVec3##type##_dot(a, onto) / FcVec3##type##_dot(onto, onto)); \ } \ FCDEF FcVec3##type##_t FcVec3##type##_cross(FcVec3##type##_t a, FcVec3##type##_t b) { \ return FcVec3##type(a.m[1] * b.m[2] - a.m[2] * b.m[1], \ a.m[2] * b.m[0] - a.m[0] * b.m[2], \ a.m[0] * b.m[1] - a.m[1] * b.m[0]); \ } \ \ FCDEF FcVec3##type##_t FcVec3##type##_ProjectionAonB(FcVec3##type##_t a, FcVec3##type##_t b) { \ return FcVec3##type##_muls(a, FcVec3##type##_dot(a, b) / FcVec3##type##_dot(b, b)); \ } \ \ FCDEF FcVec4##type##_t FcVec4##type(FCTYPE s0, FCTYPE s1, FCTYPE s2, FCTYPE s3) { \ FcVec4##type##_t mV = {{{{s0, s1}}, {{s2, s3}}}}; \ return mV; \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_p0001_init(FcVec3##type##_t s0, FCTYPE s1) { \ FcVec4##type##_t mV = {{{s0.m[0], s0.m[1]}, {s0.m[2], s1}}}; \ return mV; \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_p0000_init(FCTYPE value) { \ FcVec4##type##_t result; \ int i; \ for (i = 0; i < 4; i++) \ result.m[i] = value; \ return result; \ } \ \ FCDEF FCTYPE FcVec4##type##_length(FcVec4##type##_t a) { \ return sqrt(a.m[0] * a.m[0] + a.m[1] * a.m[1] + a.m[2] * a.m[2] + \ a.m[3] * a.m[3]); \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_abs(FcVec4##type##_t a) { \ return FcVec4##type(abs(a.m[0]), abs(a.m[1]), abs(a.m[2]), abs(a.m[3])); \ } \ \ FCDEF FCTYPE FcVec4##type##_sum(FcVec4##type##_t a) { \ return a.m[0] + a.m[1] + a.m[2] + a.m[3]; \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_max(FcVec4##type##_t v0, FcVec4##type##_t v1) { \ FcVec4##type##_t mMax; \ int i; \ for (i = 0; i < 4; i++) \ mMax.m[i] = v0.m[i] > v1.m[i] ? v0.m[i] : v1.m[i]; \ return mMax; \ } \ \ FCDEF bool FcVec4##type##_equal(FcVec4##type##_t v0, FcVec4##type##_t v1) { \ int i; \ bool notequal = false; \ for (i = 0; i < 4; i++) \ notequal |= v0.m[i] != v1.m[i]; \ return !notequal; \ } \ FCDEF FcVec4##type##_t FcVec4##type##_div(FcVec4##type##_t nominator, FcVec4##type##_t denominator) { \ FcVec4##type##_t result; \ int i; \ for (i = 0; i < 4; i++) \ result.m[i] = nominator.m[i] / denominator.m[i]; \ return result; \ } \ \ FCDEF FCTYPE FcVec4##type##_dot(FcVec4##type##_t nominator, FcVec4##type##_t denominator) { \ FcVec4##type##_t result; \ FCTYPE mSum; \ int i; \ for (i = 0; i < 4; i++) \ result.m[i] = nominator.m[i] * denominator.m[i]; \ for (mSum = i = 0; i < 4; i++) \ mSum += result.m[i]; \ return mSum; \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_mul(FcVec4##type##_t nominator, FcVec4##type##_t denominator) { \ FcVec4##type##_t result; \ int i; \ for (i = 0; i < 4; i++) \ result.m[i] = nominator.m[i] * denominator.m[i]; \ return result; \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_add(FcVec4##type##_t nominator, FcVec4##type##_t denominator) { \ FcVec4##type##_t result; \ int i; \ for (i = 0; i < 4; i++) \ result.m[i] = nominator.m[i] + denominator.m[i]; \ return result; \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_sub(FcVec4##type##_t nominator, FcVec4##type##_t denominator) { \ FcVec4##type##_t result; \ int i; \ for (i = 0; i < 4; i++) \ result.m[i] = nominator.m[i] - denominator.m[i]; \ return result; \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_normalize(FcVec4##type##_t a) { \ return FcVec4##type##_div(a, FcVec4##type##_p0000_init(FcVec4##type##_length(a))); \ } \ \ FCDEF FcVec4##type##_t FcVec4##type##_cross3(FcVec4##type##_t a, FcVec4##type##_t b) { \ FcVec4##type##_t result = FcVec4##type(a.m[1] * b.m[2] - b.m[1] * a.m[2], \ a.m[2] * b.m[0] - a.m[0] * b.m[2], \ a.m[0] * b.m[1] - a.m[1] * b.m[0], 0); \ return result; \ } \ \ FCDEF FcVec8##type##_t FcVec8##type(FCTYPE s0, FCTYPE s1, FCTYPE s2, FCTYPE s3, FCTYPE s4, \ FCTYPE s5, FCTYPE s6, FCTYPE s7) { \ FcVec8##type##_t mVec; \ mVec.v[0] = FcVec4##type(s0, s1, s2, s3); \ mVec.v[1] = FcVec4##type(s4, s5, s6, s7); \ return mVec; \ } \ \ FCDEF FcVec8##type##_t FcVec8##type##_p00000000_init(FCTYPE value) { \ FcVec8##type##_t result; \ int i; \ for (i = 0; i < 8; i++) \ result.m[i] = value; \ return result; \ } \ \ FCDEF FcVec8##type##_t FcVec8##type##_div(FcVec8##type##_t nominator, FcVec8##type##_t denominator) { \ FcVec8##type##_t result; \ int i; \ for (i = 0; i < 8; i++) \ result.m[i] = nominator.m[i] / denominator.m[i]; \ return result; \ } \ \ FCDEF FcVec8##type##_t FcVec8##type##_mul(FcVec8##type##_t nominator, FcVec8##type##_t denominator) { \ FcVec8##type##_t result; \ int i; \ for (i = 0; i < 8; i++) \ result.m[i] = nominator.m[i] * denominator.m[i]; \ return result; \ } \ FCDEF FcVec8##type##_t FcVec8##type##_mulc(FcVec8##type##_t nominator, FCTYPE denominator) { \ FcVec8##type##_t result; \ int i; \ for (i = 0; i < 8; i++) \ result.m[i] = nominator.m[i] * denominator; \ return result; \ } \ \ FCDEF FcVec8##type##_t FcVec8##type##_addc(FcVec8##type##_t nominator, FCTYPE denominator) { \ FcVec8##type##_t result; \ int i; \ for (i = 0; i < 8; i++) \ result.m[i] = nominator.m[i] + denominator; \ return result; \ } \ FCDEF FcVec8##type##_t FcVec8##type##f_add(FcVec8##type##_t nominator, FcVec8##type##_t denominator) { \ FcVec8##type##_t result; \ int i; \ for (i = 0; i < 8; i++) \ result.m[i] = nominator.m[i] + denominator.m[i]; \ return result; \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type(FCTYPE m00, FCTYPE m10, FCTYPE m20, FCTYPE m30, \ FCTYPE m01, FCTYPE m11, FCTYPE m21, FCTYPE m31, \ FCTYPE m02, FCTYPE m12, FCTYPE m22, FCTYPE m32, \ FCTYPE m03, FCTYPE m13, FCTYPE m23, \ FCTYPE m33) { \ FcMatrix4x4##type##_t mMatrix = { \ {FcVec4##type(m00, m10, m20, m30), FcVec4##type(m01, m11, m21, m31), \ FcVec4##type(m02, m12, m22, m32), FcVec4##type(m03, m13, m23, m33)}}; \ return mMatrix; \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_spherical(FCTYPE r, FCTYPE polar, \ FCTYPE azimuth) { \ FCTYPE mSinPolar = sin(polar); \ FCTYPE mCosPolar = cos(polar); \ FCTYPE mSinAzimuth = sin(azimuth); \ FCTYPE mCosAzimuth = cos(azimuth); \ return FcMatrix4x4##type(mSinPolar * mCosAzimuth, r * mCosPolar * mCosAzimuth, \ -r * mSinAzimuth, 0, mSinPolar * mSinAzimuth, \ r * mCosPolar * mSinAzimuth, r * mCosAzimuth, 0, mCosPolar, \ -r * mSinPolar, 0, 0, 0, 0, 0, 1); \ } \ \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_identity() { \ return FcMatrix4x4##type(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); \ } \ \ FCDEF FCTYPE FcMatrix4x4##type##_determinant(FcMatrix4x4##type##_t mMatrix) { \ FCTYPE c, r = 1; \ for (int i = 0; i < 4; i++) { \ for (int k = i + 1; k < 4; k++) { \ c = mMatrix.m[k][i] / mMatrix.m[i][i]; \ for (int j = i; j < 4; j++) \ mMatrix.m[k][j] -= c * mMatrix.m[i][j]; \ } \ } \ for (int i = 0; i < 4; i++) \ r *= mMatrix.m[i][i]; \ return r; \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_transpose(FcMatrix4x4##type##_t *pMatrix) { \ int i, j; \ FcMatrix4x4##type##_t mMatrix; \ for (i = 0; i < 4; i++) { \ for (j = 0; j < 4; j++) { \ mMatrix.m[i][j] = pMatrix->m[j][i]; \ } \ } \ return mMatrix; \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_multiply_mm(FcMatrix4x4##type##_t *pMatrix0, \ FcMatrix4x4##type##_t *pMatrix1) { \ FcMatrix4x4##type##_t matrix_transpose = FcMatrix4x4##type##_transpose(pMatrix1); \ FcMatrix4x4##type##_t result; \ int i, j; \ for (i = 0; i < 4; i++) \ for (j = 0; j < 4; j++) \ result.v[i].m[j] = \ FcVec4##type##_sum(FcVec4##type##_mul(pMatrix0->v[i], matrix_transpose.v[j])); \ return result; \ } \ \ FCDEF FcVec4##type##_t FcMatrix4x4##type##_multiply_mv(FcMatrix4x4##type##_t *pMatrix, \ FcVec4##type##_t *pVector) { \ int i; \ FcMatrix4x4##type##_t mSum; \ FcVec4##type##_t result = FcVec4##type(0, 0, 0, 0); \ for (i = 0; i < 4; i++) \ mSum.v[i] = FcVec4##type##_mul(pMatrix->v[i], *pVector); \ mSum = FcMatrix4x4##type##_transpose(&mSum); \ for (i = 0; i < 4; i++) \ result = FcVec4##type##_add(mSum.v[i], result); \ return result; \ } \ \ FCDEF FcVec3##type##_t FcMatrix4x4##type##_multiply_position(FcMatrix4x4##type##_t matrix, \ FcVec3##type##_t position) { \ FcVec3##type##_t result = \ FcVec3##type(matrix.m[0][0] * position.m[0] + matrix.m[0][1] * position.m[1] + \ matrix.m[0][2] * position.m[2] + matrix.m[0][3], \ matrix.m[1][0] * position.m[0] + matrix.m[1][1] * position.m[1] + \ matrix.m[1][2] * position.m[2] + matrix.m[1][3], \ matrix.m[2][0] * position.m[0] + matrix.m[2][1] * position.m[1] + \ matrix.m[2][2] * position.m[2] + matrix.m[2][3]); \ \ FCTYPE w = matrix.m[3][0] * position.m[0] + matrix.m[3][1] * position.m[1] + \ matrix.m[3][2] * position.m[2] + matrix.m[3][3]; \ if (w != 0 && w != 1) \ return FcVec3##type(result.m[0] / w, result.m[1] / w, result.m[2] / w); \ \ return result; \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_ortho(FCTYPE left, FCTYPE right, FCTYPE bottom, \ FCTYPE top, FCTYPE zNear, FCTYPE zFar) { \ FCTYPE l = left, r = right, b = bottom, t = top, n = zNear, f = zFar; \ FCTYPE tx = -(r + l) / (r - l); \ FCTYPE ty = -(t + b) / (t - b); \ FCTYPE tz = -(f + n) / (f - n); \ return FcMatrix4x4##type(2 / (r - l), 0, 0, tx, 0, 2 / (t - b), 0, ty, 0, 0, \ -2 / (f - n), tz, 0, 0, 0, 1); \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_glOrtho(FCTYPE left, FCTYPE right, \ FCTYPE bottom, FCTYPE top, \ FCTYPE zNear, FCTYPE zFar) { \ FCTYPE l = left, r = right, b = bottom, t = top, n = zNear, f = zFar; \ FCTYPE tx = -(r + l) / (r - l); \ FCTYPE ty = -(t + b) / (t - b); \ FCTYPE tz = -(f + n) / (f - n); \ return FcMatrix4x4##type(2 / (r - l), 0, 0, 0, 0, 2 / (t - b), 0, 0, 0, 0, \ -2 / (f - n), 0, tx, ty, tz, 1); \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_rotation(FCTYPE angle_in_rad, FcVec3##type##_t axis) { \ FcVec3##type##_t normalized_axis = FcVec3##type##_norm(axis); \ FCTYPE s0 = normalized_axis.m[0], s1 = normalized_axis.m[1], \ s2 = normalized_axis.m[2], c = cos(angle_in_rad), \ s = sin(angle_in_rad); \ \ return FcMatrix4x4##type(c + s0 * s0 * (1 - c), s0 * s1 * (1 - c) - s2 * s, \ s0 * s2 * (1 - c) + s1 * s, 0, s1 * s0 * (1 - c) + s2 * s, \ c + s1 * s1 * (1 - c), s1 * s2 * (1 - c) - s0 * s, 0, \ s2 * s0 * (1 - c) - s1 * s, s2 * s1 * (1 - c) + s0 * s, \ c + s2 * s2 * (1 - c), 0, 0, 0, 0, 1); \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_scale(FcMatrix4x4##type##_t *pMatrix, FcVec4##type##_t scale) {\ \ return FcMatrix4x4##type( \ pMatrix->m[0][0] + scale.m[0], pMatrix->m[0][1], pMatrix->m[0][2], pMatrix->m[0][3], \ pMatrix->m[1][0], pMatrix->m[1][1] + scale.m[1], pMatrix->m[1][2], pMatrix->m[1][3], \ pMatrix->m[2][0], pMatrix->m[2][1], pMatrix->m[2][2] + scale.m[2], pMatrix->m[2][3], \ pMatrix->m[3][0], pMatrix->m[3][1], pMatrix->m[3][2], pMatrix->m[3][3] + scale.m[3]); \ \ } \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_translate(FcMatrix4x4##type##_t *pMatrix, \ FcVec4##type##_t offset) { \ return FcMatrix4x4##type( \ pMatrix->m[0][0], pMatrix->m[0][1], pMatrix->m[0][2], \ pMatrix->m[0][3] + offset.m[0], pMatrix->m[1][0], pMatrix->m[1][1], \ pMatrix->m[1][2], pMatrix->m[1][3] + offset.m[1], pMatrix->m[2][0], \ pMatrix->m[2][1], pMatrix->m[2][2], pMatrix->m[2][3] + offset.m[2], \ pMatrix->m[3][0], pMatrix->m[3][1], pMatrix->m[3][2], pMatrix->m[3][3]); \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_gl_translate(FcMatrix4x4##type##_t *pMatrix, \ FcVec4##type##_t offset) { \ return FcMatrix4x4##type( \ pMatrix->m[0][0], pMatrix->m[0][1], pMatrix->m[0][2], pMatrix->m[0][3], \ pMatrix->m[1][0], pMatrix->m[1][1], pMatrix->m[1][2], pMatrix->m[1][3], \ pMatrix->m[2][0], pMatrix->m[2][1], pMatrix->m[2][2], pMatrix->m[2][3], \ pMatrix->m[3][0] + offset.m[0], pMatrix->m[3][1] + offset.m[1], \ pMatrix->m[3][2] + offset.m[2], pMatrix->m[3][3] + offset.m[3]); \ } \ \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_perspective(FCTYPE fovy, FCTYPE aspect, FCTYPE zNear, FCTYPE zFar) {\ FcMatrix4x4##type##_t mResult;\ FCTYPE tanfovy = tan(fovy / (FCTYPE) 2.0);\ mResult.v[0] = FcVec4##type((FCTYPE) 1.0 / (aspect * tanfovy), 0, 0, 0);\ mResult.v[1] = FcVec4##type(0, (FCTYPE) 1.0 / (tanfovy), 0, 0);\ mResult.v[2] = FcVec4##type(0, 0, -(zFar + zNear) / (zFar - zNear), (FCTYPE) -1);\ mResult.v[3] = FcVec4##type(0, 0, -((FCTYPE) 2.0 * zFar * zNear) / (zFar - zNear), (FCTYPE) 1);\ return mResult;\ }\ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_gl_look_at(FcVec3##type##_t eay, FcVec3##type##_t center, \ FcVec3##type##_t up) { \ FcVec3##type##_t s2 = FcVec3##type##_muls(FcVec3##type##_norm(FcVec3##type##_sub(center, eay)), -1); \ FcVec3##type##_t s0 = FcVec3##type##_norm(FcVec3##type##_cross(up, s2)); \ FcVec3##type##_t s1 = FcVec3##type##_cross(s2, s0); \ \ return FcMatrix4x4##type(s0.m[0], s1.m[0], s2.m[0], -FcVec3##type##_dot(eay, s0), s0.m[1], \ s1.m[1], s2.m[1], -FcVec3##type##_dot(eay, s1), s0.m[2], s1.m[2], \ s2.m[2], -FcVec3##type##_dot(eay, s2), 0, 0, 0, 1); \ } \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_lookAt(FcVec3##type##_t eye, FcVec3##type##_t center, FcVec3##type##_t up) {\ FcMatrix4x4##type##_t mResult;\ FcVec4##type##_t m0, m1, m2, m3;\ m0 = FcVec4##type(center.m[0], center.m[1], center.m[2], 0);\ m1 = FcVec4##type(eye.m[0], eye.m[1], eye.m[2], 0);\ m2 = FcVec4##type(up.m[0], up.m[1], up.m[2], 0);\ m0 = FcVec4##type##_normalize(FcVec4##type##_sub(m0, m1));\ m1 = FcVec4##type##_normalize(FcVec4##type##_cross3(m0, m2));\ m3 = FcVec4##type##_cross3(m1, m0);\ m2 = FcVec4##type(-m0.m[0], -m0.m[1], -m0.m[2], FcVec4##type##_dot(m0, FcVec4##type(eye.m[0], eye.m[1], eye.m[2], 0)));\ m0 = FcVec4##type(m1.m[0], m1.m[1], m1.m[2], -FcVec4##type##_dot(m1, FcVec4##type(eye.m[0], eye.m[1], eye.m[2], 0)));\ m1 = FcVec4##type(m3.m[0], m3.m[1], m3.m[2], -FcVec4##type##_dot(m3, FcVec4##type(eye.m[0], eye.m[1], eye.m[2], 0)));\ mResult.v[0] = FcVec4##type(m0.m[0], m1.m[0], m2.m[0], 0);\ mResult.v[1] = FcVec4##type(m0.m[1], m1.m[1], m2.m[1], 0);\ mResult.v[2] = FcVec4##type(m0.m[2], m1.m[2], m2.m[2], 0);\ mResult.v[3] = FcVec4##type(m0.m[3], m1.m[3], m2.m[3], 1);\ return mResult;\ }\ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_gl_look_at_view_matrix(FcVec3##type##_t eay, \ FcVec3##type##_t center, \ FcVec3##type##_t up) { \ FcVec3##type##_t s2 = FcVec3##type##_muls(FcVec3##type##_norm(FcVec3##type##_sub(center, eay)), -1); \ FcVec3##type##_t s0 = FcVec3##type##_norm(FcVec3##type##_cross(up, s2)); \ FcVec3##type##_t s1 = FcVec3##type##_cross(s2, s0); \ \ return FcMatrix4x4##type(s0.m[0], s1.m[0], s2.m[0], 0, s0.m[1], s1.m[1], s2.m[1], 0, \ s0.m[2], s1.m[2], s2.m[2], 0, 0, 0, 0, 1); \ } \ \ FCDEF FcMatrix3x3##type##_t FcMatrix3x3##type(FCTYPE m00, FCTYPE m10, FCTYPE m20, FCTYPE m01, \ FCTYPE m11, FCTYPE m21, FCTYPE m02, FCTYPE m12, \ FCTYPE m22) { \ FcMatrix3x3##type##_t mMtx = { \ {FcVec3##type(m00, m10, m20), FcVec3##type(m01, m11, m21), FcVec3##type(m02, m12, m22)}}; \ return mMtx; \ } \ \ FCDEF FcMatrix3x3##type##_t FcMatrix3x3##type##_identity() { \ FcMatrix3x3##type##_t mMtx = {{FcVec3##type(1, 0, 0), FcVec3##type(0, 1, 0), FcVec3##type(0, 0, 1)}}; \ return mMtx; \ } \ \ FCDEF FcVec3##type##_t FcMatrix3x3##type##_multiply_mv(FcMatrix3x3##type##_t matrix, FcVec3##type##_t vec) { \ FcVec3##type##_t result; \ int i; \ for (i = 0; i < 3; i++) \ result.m[i] = FcVec3##type##_sum(FcVec3##type##_mul(matrix.v[i], vec)); \ return result; \ } \ \ FCDEF FcMatrix3x3##type##_t FcMatrix3x3##type##_translate(FcMatrix3x3##type##_t *p, FcVec3##type##_t offset) { \ return FcMatrix3x3##type(p->m[0][0], p->m[1][0], p->m[2][0] + offset.m[0], \ p->m[0][1], p->m[1][1], p->m[2][1] + offset.m[1], \ p->m[0][2], p->m[1][2], p->m[2][2] + offset.m[2]); \ } \ \ FCDEF FcMatrix3x3##type##_t FcMatrix3x3##type##_transpose(FcMatrix3x3##type##_t *p) { \ return FcMatrix3x3##type(p->m[0][0], p->m[1][0], p->m[2][0], p->m[0][1], p->m[1][1], \ p->m[2][1], p->m[0][2], p->m[1][2], p->m[2][2]); \ } \ \ FCDEF FcMatrix3x3##type##_t FcMatrix3x3##type##_multiply_mm(FcMatrix3x3##type##_t *pMatrix0, \ FcMatrix3x3##type##_t *pMatrix1) { \ FcMatrix3x3##type##_t matrix_transpose = FcMatrix3x3##type##_transpose(pMatrix1); \ FcMatrix3x3##type##_t result; \ int i, j; \ for (i = 0; i < 3; i++) \ for (j = 0; j < 3; j++) \ result.v[i].m[j] = \ FcVec3##type##_sum(FcVec3##type##_mul(pMatrix0->v[i], matrix_transpose.v[j])); \ return result; \ } \ \ FCDEF FcMatrix3x3##type##_t FcMatrix3x3##type##_rotation(FCTYPE angle_in_rad) { \ FCTYPE c = cos(angle_in_rad), s = sin(angle_in_rad); \ \ return FcMatrix3x3##type(c, -s, 0, s, c, 0, 0, 0, 1); \ } \ \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type(FCTYPE m00, FCTYPE m01, FCTYPE m10, \ FCTYPE m11) { \ FcMatrix2x2##type##_t mMatrix = {{FcVec2##type(m00, m01), FcVec2##type(m10, m11)}}; \ return mMatrix; \ } \ \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_sub(FcMatrix2x2##type##_t m0, FcMatrix2x2##type##_t m1) { \ return FcMatrix2x2##type(m0.m[0][0] - m1.m[0][0], m0.m[0][1] - m1.m[0][1], \ m0.m[1][0] - m1.m[1][0], m0.m[1][1] - m1.m[1][1]); \ } \ \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_add(FcMatrix2x2##type##_t m0, FcMatrix2x2##type##_t m1) { \ return FcMatrix2x2##type(m0.m[0][0] + m1.m[0][0], m0.m[0][1] + m1.m[0][1], \ m0.m[1][0] + m1.m[1][0], m0.m[1][1] + m1.m[1][1]); \ } \ \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_transpose(FcMatrix2x2##type##_t m) { \ return FcMatrix2x2##type(m.m[0][0], m.m[1][0], m.m[0][1], m.m[1][1]); \ } \ \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_mul_mm(FcMatrix2x2##type##_t m0, FcMatrix2x2##type##_t m1) { \ FcMatrix2x2##type##_t m1_t = FcMatrix2x2##type##_transpose(m1); \ FcMatrix2x2##type##_t result; \ int i, j; \ for (i = 0; i < 2; i++) { \ for (j = 0; j < 2; j++) \ result.v[i].m[j] = FcVec2##type##_sum(FcVec2##type##_mul(m0.v[i], m1_t.v[j])); \ } \ return result; \ } \ \ FCDEF FcVec2##type##_t FcMatrix2x2##type##_mul_mv(FcMatrix2x2##type##_t m0, FcVec2##type##_t v0) { \ int i; \ \ FcMatrix2x2##type##_t mSum; \ FcVec2##type##_t mResult = FcVec2##type(0, 0); \ for (i = 0; i < 2; i++) \ mSum.v[i] = FcVec2##type##_mul(m0.v[i], v0); \ mSum = FcMatrix2x2##type##_transpose(mSum); \ for (i = 0; i < 2; i++) \ mResult = FcVec2##type##_add(mSum.v[i], mResult); \ \ return mResult; \ } \ \ FCDEF FCTYPE FcMatrix2x2##type##_det(FcMatrix2x2##type##_t m) { \ return m.m[0][0] * m.m[1][1] - m.m[1][0] * m.m[0][1]; \ } \ \ FCDEF FcMatrix2x2##type##_t FcMatrix2x2##type##_inv(FcMatrix2x2##type##_t m) { \ FCTYPE divDet = (FCTYPE)1 / FcMatrix2x2##type##_det(m); \ return FcMatrix2x2##type##_mul_mm( \ FcMatrix2x2##type(m.m[1][1], -m.m[0][1], -m.m[1][0], m.m[0][0]), \ FcMatrix2x2##type(divDet, divDet, divDet, divDet)); \ } \ \ FCDEF void FcMatrix4x4##type##_fprintp(FcMatrix4x4##type##_t matrix, int width, \ int precision) { \ FcMatrix4x4##type##_t m = matrix; \ int w = width, p = precision, i; \ for (i = 0; i < 4; i++) { \ fprintf(stderr, "| %*.*f %*.*f %*.*f %*.*f |\n", w, p, m.m[i][0], w, p, \ m.m[i][1], w, p, m.m[i][2], w, p, m.m[i][3]); \ } \ } \ \ FCDEF void FcMatrix2x2##type##_fprintp(FcMatrix2x2##type##_t matrix, int width, \ int precision) { \ FcMatrix2x2##type##_t m = matrix; \ int w = width, p = precision, i; \ for (i = 0; i < 2; i++) { \ fprintf(stdout, "| %*.*f %*.*f |\n", w, p, m.m[i][0], w, p, m.m[i][1]); \ } \ } \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_spherical_offset(FCTYPE r, FCTYPE offsetX, \ FCTYPE polar, FCTYPE azimuth) { \ FCTYPE mSinPolar = sin(polar); \ FCTYPE mCosPolar = cos(polar); \ FCTYPE mSinAzimuth = sin(azimuth); \ FCTYPE mCosAzimuth = cos(azimuth); \ return FcMatrix4x4##type(mSinPolar * mCosAzimuth, r * mCosPolar * mCosAzimuth, \ -r * mSinAzimuth, 0, mSinPolar * mSinAzimuth, \ r * mCosPolar * mSinAzimuth, r * mCosAzimuth, 0, mCosPolar, \ -r * mSinPolar, 0, 0, 0, 0, 0, 1); \ } \ FCDEF FcMatrix4x4##type##_t FcMatrix4x4##type##_translateScale(FcMatrix4x4##type##_t* pMatrix, FcVec3##type##_t mScale, FcVec3##type##_t offset) { \ return FcMatrix4x4##type( \ pMatrix->m[0][0] + mScale.m[0], pMatrix->m[0][1], pMatrix->m[0][2], pMatrix->m[0][3], \ pMatrix->m[1][0], pMatrix->m[1][1] + mScale.m[1], pMatrix->m[1][2], pMatrix->m[1][3], \ pMatrix->m[2][0], pMatrix->m[2][1], pMatrix->m[2][2] + mScale.m[2], pMatrix->m[2][3], \ pMatrix->m[3][0] + offset.m[0], pMatrix->m[3][1] + offset.m[1], pMatrix->m[3][2] + offset.m[2], pMatrix->m[3][3]); \ } \ FCMATH(float, f) FCMATH(double, d) FCMATH(ptrdiff_t, i64) FCMATH(int32_t, i32) #include "FcMath_Collision.h" #include "FcMath_Quaternion.h" #undef FCDEF #undef ALIGNED //// Leibniz ////@todo //FCDEF FCTYPE FcMatrix4x4##type##_determinant_fast(FcMatrix4x4##type##_t mMatrix) { // FcMatrix2x2##type##_t A = FcMatrix2x2##type(mMatrix.m[0][0], mMatrix.m[0][1], // mMatrix.m[1][0], mMatrix.m[1][1]); // FcMatrix2x2##type##_t B = FcMatrix2x2##type(mMatrix.m[0][2], mMatrix.m[0][3], // mMatrix.m[1][2], mMatrix.m[1][3]); // FcMatrix2x2##type##_t C = FcMatrix2x2##type(mMatrix.m[2][0], mMatrix.m[2][1], // mMatrix.m[3][0], mMatrix.m[3][1]); // FcMatrix2x2##type##_t D = FcMatrix2x2##type(mMatrix.m[2][2], mMatrix.m[2][3], // mMatrix.m[3][2], mMatrix.m[3][3]); // FcMatrix2x2##type##_t mTemp = FcMatrix2x2##type##_inv(A); // mTemp = FcMatrix2x2##type##_mul_mm(C, mTemp); // mTemp = FcMatrix2x2##type##_mul_mm(mTemp, B); // mTemp = FcMatrix2x2##type##_sub(D, mTemp); // return FcMatrix2x2##type##_det(mTemp) * FcMatrix2x2##type##_det(A); //} #ifdef __cplusplus } #endif #endif //__FCMATH_H__