]> git.lizzy.rs Git - shadowclad.git/blob - src/engine/geometry.c
Move camera to world space position of player
[shadowclad.git] / src / engine / geometry.c
1 #include "geometry.h"
2
3 #include <stddef.h>
4
5 Transform identity() {
6         return (Transform) { .a1 = 1.0f, .a2 = 0.0f, .a3 = 0.0f, .a4 = 0.0f,
7                              .b1 = 0.0f, .b2 = 1.0f, .b3 = 0.0f, .b4 = 0.0f,
8                              .c1 = 0.0f, .c2 = 0.0f, .c3 = 1.0f, .c4 = 0.0f,
9                              .d1 = 0.0f, .d2 = 0.0f, .d3 = 0.0f, .d4 = 1.0f };
10 }
11
12 Transform multiply(Transform t1, Transform t2) {
13         GLfloat* a = (GLfloat*) &t1;
14         GLfloat* b = (GLfloat*) &t2;
15
16         for (size_t row = 0; row < 4; ++row) {
17                 for (size_t col = 0; col < 4; ++col) {
18                         b[(row * 4) + col] =
19                                 a[(row * 4) + 0] * b[(0 * 4) + col]
20                                 + a[(row * 4) + 1] * b[(1 * 4) + col]
21                                 + a[(row * 4) + 2] * b[(2 * 4) + col]
22                                 + a[(row * 4) + 3] * b[(3 * 4) + col];
23                 }
24         }
25         return t2;
26 }
27
28 void translate(Transform* transform, Vector3D vec) {
29         *transform = multiply(
30                 (Transform) { .a1 = 1.0f, .a2 = 0.0f, .a3 = 0.0f, .a4 = vec.x,
31                               .b1 = 0.0f, .b2 = 1.0f, .b3 = 0.0f, .b4 = vec.y,
32                               .c1 = 0.0f, .c2 = 0.0f, .c3 = 1.0f, .c4 = vec.z,
33                               .d1 = 0.0f, .d2 = 0.0f, .d3 = 0.0f, .d4 = 1.0f },
34                 *transform);
35 }
36
37 Vector3D translationOf(Transform transform) {
38         return (Vector3D) { transform.a4, transform.b4, transform.c4 };
39 }