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 };
12 void multiply(Transform* transform, Transform by) {
13 GLfloat* a = (GLfloat*) &by;
14 GLfloat* b = (GLfloat*) transform;
16 for (size_t row = 0; row < 4; ++row) {
17 for (size_t col = 0; col < 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];
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 });
34 Vector3D translationOf(Transform transform) {
35 return (Vector3D) { transform.a4, transform.b4, transform.c4 };