summaryrefslogtreecommitdiff
path: root/src/shaders/common/mathlib.c
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2020-07-12 13:31:28 +0800
committerchai <chaifix@163.com>2020-07-12 13:31:28 +0800
commita0439c8d387579a1727ad00c2e105e7602aedbb6 (patch)
tree8ea09b13e179a7d8cd9ac6518410cd10035f48f4 /src/shaders/common/mathlib.c
parentec7aa42781a9108901fbde7210d8285bbbeaf5fc (diff)
+mathlib
Diffstat (limited to 'src/shaders/common/mathlib.c')
-rw-r--r--src/shaders/common/mathlib.c138
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;
+}