diff options
author | chai <chaifix@163.com> | 2020-07-12 13:31:28 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-07-12 13:31:28 +0800 |
commit | a0439c8d387579a1727ad00c2e105e7602aedbb6 (patch) | |
tree | 8ea09b13e179a7d8cd9ac6518410cd10035f48f4 /src/shaders/common/mathlib.c | |
parent | ec7aa42781a9108901fbde7210d8285bbbeaf5fc (diff) |
+mathlib
Diffstat (limited to 'src/shaders/common/mathlib.c')
-rw-r--r-- | src/shaders/common/mathlib.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/shaders/common/mathlib.c b/src/shaders/common/mathlib.c new file mode 100644 index 0000000..356357c --- /dev/null +++ b/src/shaders/common/mathlib.c @@ -0,0 +1,138 @@ +#include "mathlib.h" +#include "../../math/math.h" + +#define INTERNAL_FUNCTION(T, NAME)\ +T NAME(T v1, T v2) {\ + T out; \ + internal_##NAME(&v1, &v2, &out);\ + return out;\ +} + +/************************************************************************/ +/* Vec2 */ +/************************************************************************/ +Vec2 vec2(float x, float y) { + Vec2 v = {x, y}; + return v; +} + +INTERNAL_FUNCTION(Vec2, vec2_minus); +INTERNAL_FUNCTION(Vec2, vec2_plus); + +float vec2_dot(Vec2 v1, Vec2 v2) { + return internal_vec2_dot(&v1, &v2); +} + +/************************************************************************/ +/* Vec3 */ +/************************************************************************/ +Vec3 vec3(float x, float y, float z) { + Vec3 v = {x, y, z}; + return v; +} + +INTERNAL_FUNCTION(Vec3, vec3_minus); +INTERNAL_FUNCTION(Vec3, vec3_plus); +INTERNAL_FUNCTION(Vec3, vec3_cross); + +float vec3_dot(Vec3 v1, Vec3 v2) { + return internal_vec3_dot(&v1, &v2); +} + +Vec3 vec3_lerp(Vec3 v1, Vec3 v2, float t) { + Vec3 out; + internal_vec3_lerp(&v1, &v2, t, &out); + return out; +} + +Vec3 vec3_slerp(Vec3 v1, Vec3 v2, float t) { + Vec3 out; + internal_vec3_slerp(&v1, &v2, t, &out); + return out; +} + +Vec3 vec3_scale(Vec3 v, float scale) { + Vec3 out; + internal_vec3_scale(&v, scale, &out); + return out; +} + +Vec3 vec3_normalize(Vec3 v) { + Vec3 out; + internal_vec3_normalize(&v, &out); + return out; +} + +/************************************************************************/ +/* Vec4 */ +/************************************************************************/ + +Vec4 vec4(float x, float y, float z, float w) { + Vec4 v = {x, y, z, w}; + return v; +} + +INTERNAL_FUNCTION(Vec4, vec4_minus); +INTERNAL_FUNCTION(Vec4, vec4_plus); + +Vec4 vec4_scale(Vec4 v, float scale) { + Vec4 out; + internal_vec4_scale(&v, scale, &out); + return out; +} + +Vec4 vec4_saturate(Vec4 v) { + Vec4 out; + out.x = clamp(v.x, 0, 1); + out.y = clamp(v.y, 0, 1); + out.z = clamp(v.z, 0, 1); + out.w = clamp(v.w, 0, 1); + return out; +} + +/************************************************************************/ +/* Matrix */ +/************************************************************************/ + +Mat3 mat3(Vec3 c1, Vec3 c2, Vec3 c3) { + Mat3 m = {c1, c2, c3}; + return m; +} + +Vec3 mat3_mulvec3(Mat3 m, Vec3 v) { + Vec3 out; + internal_mat3_multvec3(&m, &v, &out); + return out; +} + +Mat3 mat3_mulmat3(Mat3 m, Mat3 m2) { + Mat3 out; + internal_mat3_multmat3(&m, &m2, &out); + return out; +} + +Mat4 mat4(Vec4 c1, Vec4 c2, Vec4 c3, Vec4 c4) { + Mat4 m ; + m.axisx = c1; + m.axisy = c2; + m.axisz = c3; + m.pos = c4; + return m; +} + +Vec3 mat4_mulvec3(Mat4 m, Vec3 v) { + Vec4 v2 = {v.x, v.y, v.z, 0}; + return mat4_mulvec4(m, v2).xyz; +} + +Vec4 mat4_mulvec4(Mat4 m, Vec4 v) { + Vec4 out; + internal_mat4_mulvec4(&m, &v, &out); + return out; +} + +Mat4 mat4_mulmat4(Mat4 m1, Mat4 m2) { + Mat4 out; + internal_mat4_multiply(&m1, &m2, &out); + return out; +} |