diff --git a/README.md b/README.md index 063a7b1..9835588 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Library | Lastest Version | Category | Lines of Code | Description **[pl_ds.h](pl_ds.h)** | 1.0 | utility | 691 | typesafe dynamic array and hash tables for C **[pl_json.h](pl_json.h)** | 1.0 | parsing | 2067 | json reading & writing for C **[pl_log.h](pl_log.h)** | 1.0 | utility | 1295 | small logging library for C -**[pl_math.h](pl_math.h)** | 1.0 | math | 800 | small math library for C (vectors, matrices, quaternions, etc.) +**[pl_math.h](pl_math.h)** | 1.1 | math | 801 | small math library for C (vectors, matrices, quaternions, etc.) **[pl_memory.h](pl_memory.h)** | 1.0 | utility | 699 | various memory allocators for C **[pl_profile.h](pl_profile.h)** | 1.0 | utility | 551 | small profiling library for C **[pl_stl.h](pl_stl.h)** | 1.0 | parsing | 340 | small STL file parser diff --git a/pl_math.h b/pl_math.h index 8f40bec..39a97a4 100644 --- a/pl_math.h +++ b/pl_math.h @@ -14,8 +14,8 @@ */ // library version (format XYYZZ) -#define PL_MATH_VERSION "1.0.0" -#define PL_MATH_VERSION_NUM 10000 +#define PL_MATH_VERSION "1.1.0" +#define PL_MATH_VERSION_NUM 10100 /* Index of this file: @@ -347,12 +347,14 @@ static inline plMat4 pl_mul_mat4t (const plMat4* ptLeft, const plMat4* ptRight // [SECTION] quaternion ops //----------------------------------------------------------------------------- -static inline plVec4 pl_mul_quat (plVec4 tQ1, plVec4 tQ2) { return pl_create_vec4(tQ1.w * tQ2.x + tQ1.x * tQ2.w + tQ1.y * tQ2.z - tQ1.z * tQ2.y, tQ1.w * tQ2.y - tQ1.x * tQ2.z + tQ1.y * tQ2.w + tQ1.z * tQ2.x, tQ1.w * tQ2.z + tQ1.x * tQ2.y - tQ1.y * tQ2.x + tQ1.z * tQ2.w, tQ1.w * tQ2.w - tQ1.x * tQ2.x - tQ1.y * tQ2.y - tQ1.z * tQ2.z);} -static inline plVec4 pl_quat_rotation_normal (float fAngle, float fX, float fY, float fZ) { const float fSin2 = sinf(0.5f * fAngle); return pl_create_vec4(fSin2 * fX, fSin2 * fY, fSin2 * fZ, cosf(0.5f * fAngle));} -static inline plVec4 pl_quat_rotation_normal_vec3(float fAngle, plVec3 tNormalAxis) { return pl_quat_rotation_normal(fAngle, tNormalAxis.x, tNormalAxis.y, tNormalAxis.z);} -static inline plVec4 pl_norm_quat (plVec4 tQ) { const plVec3 tNorm = pl_norm_vec3(tQ.xyz); return pl_create_vec4(tNorm.x, tNorm.y, tNorm.z, tQ.w);} -static inline plVec4 pl_quat_slerp (plVec4 tQ1, plVec4 tQ2, float fT); -static inline void pl_decompose_matrix (const plMat4* ptM, plVec3* ptS, plVec4* ptQ, plVec3* ptT); +static inline plVec3 pl_mul_quat_vec3 (plVec3 tV, plVec4 tQ) { return pl_add_vec3(pl_add_vec3(pl_mul_vec3_scalarf(tV, tQ.w * tQ.w - (tQ.x * tQ.x + tQ.y * tQ.y + tQ.z * tQ.z)), pl_mul_vec3_scalarf(tQ.xyz, pl_dot_vec3(tV, tQ.xyz) * 2.0f)), pl_mul_vec3_scalarf(pl_cross_vec3(tQ.xyz, tV), tQ.w * 2.0f));} +static inline plVec4 pl_mul_quat (plVec4 tQ1, plVec4 tQ2) { return pl_create_vec4(tQ1.w * tQ2.x + tQ1.x * tQ2.w + tQ1.y * tQ2.z - tQ1.z * tQ2.y, tQ1.w * tQ2.y - tQ1.x * tQ2.z + tQ1.y * tQ2.w + tQ1.z * tQ2.x, tQ1.w * tQ2.z + tQ1.x * tQ2.y - tQ1.y * tQ2.x + tQ1.z * tQ2.w, tQ1.w * tQ2.w - tQ1.x * tQ2.x - tQ1.y * tQ2.y - tQ1.z * tQ2.z);} +static inline plVec4 pl_quat_rotation (float fAngle, float fX, float fY, float fZ) { const float fSin2 = sinf(0.5f * fAngle); return pl_create_vec4(fSin2 * fX, fSin2 * fY, fSin2 * fZ, cosf(0.5f * fAngle));} +static inline plVec4 pl_quat_rotation_vec3(float fAngle, plVec3 tAxis) { return pl_quat_rotation(fAngle, tAxis.x, tAxis.y, tAxis.z);} +static inline plVec4 pl_norm_quat (plVec4 tQ) { return pl_norm_vec4(tQ);} +static inline plVec4 pl_quat_slerp (plVec4 tQ1, plVec4 tQ2, float fT); +static inline float pl_quat_decompose (plVec4 tQ, plVec3* ptAxisOut) { const float fAngle = 2.0f * acosf(tQ.w); if(fAngle != 0.0f) { const float fSin = sinf(0.5f * fAngle); ptAxisOut->x = tQ.x / fSin; ptAxisOut->y = tQ.y / fSin; ptAxisOut->z = tQ.z / fSin; } return fAngle; } +static inline void pl_decompose_matrix (const plMat4* ptM, plVec3* ptS, plVec4* ptQ, plVec3* ptT); //----------------------------------------------------------------------------- // [SECTION] rect ops