Flint Engine
Modular C++20 2D game engine powered by SDL3
Loading...
Searching...
No Matches
build-matrix.h
1// SPDX-License-Identifier: MIT
2// SPDX-FileCopyrightText: 2025-2026 Manuel Osorio
3#pragma once
4#include "flint/math/types.h"
5
6#include <cmath>
7
8namespace Flint {
22 inline void buildModelMatrix(float out[16], const Vec2f &position, const Vec2f &size,
23 float rotation, const Vec2f &origin) {
24 for (int i = 0; i < 16; ++i) {
25 out[i] = (i % 5 == 0) ? 1.0f : 0.0f;
26 }
27
28 float cosA = std::cos(rotation);
29 float sinA = std::sin(rotation);
30
31 float tx = position.x - origin.x;
32 float ty = position.y - origin.y;
33
34 float sx = size.x;
35 float sy = size.y;
36
37 out[0] = cosA * sx;
38 out[1] = sinA * sx;
39 out[4] = -sinA * sy;
40 out[5] = cosA * sy;
41 if (rotation == 0.0f) {
42 out[12] = tx;
43 out[13] = ty;
44 } else {
45 out[12] = position.x + origin.x - (cosA * origin.x - sinA * origin.y);
46 out[13] = position.y + origin.y - (sinA * origin.x + cosA * origin.y);
47 }
48 }
49
60 inline void buildProjectionMatrix(float out[16], const FloatRect &cameraView) {
61 for (int i = 0; i < 16; ++i) {
62 out[i] = (i % 5 == 0) ? 1.0f : 0.0f;
63 }
64 out[0] = 2.0f / cameraView.size.x;
65 out[5] = 2.0f / cameraView.size.y;
66 out[12] = -(2.0f * cameraView.position.x + cameraView.size.x) / cameraView.size.x;
67 out[13] = -(2.0f * cameraView.position.y + cameraView.size.y) / cameraView.size.y;
68 }
69}