]> git.lizzy.rs Git - shadowclad.git/blob - src/engine/geometry.c
Housekeeping
[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 void multiply(Transform* transform, Transform by) {
13         GLfloat* a = (GLfloat*) &by;
14         GLfloat* b = (GLfloat*) transform;
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 }
26
27 void translate(Transform* transform, Vector3D vec) {
28         multiply(transform, (Transform) { .a1 = 1.0f, .a2 = 0.0f, .a3 = 0.0f, .a4 = vec.x,
29                                       .b1 = 0.0f, .b2 = 1.0f, .b3 = 0.0f, .b4 = vec.y,
30                                       .c1 = 0.0f, .c2 = 0.0f, .c3 = 1.0f, .c4 = vec.z,
31                                       .d1 = 0.0f, .d2 = 0.0f, .d3 = 0.0f, .d4 = 1.0f });
32 }
33
34 Vector3D translationOf(Transform transform) {
35         return (Vector3D) { transform.a4, transform.b4, transform.c4 };
36 }