summaryrefslogtreecommitdiff
path: root/src/util/math.cpp
diff options
context:
space:
mode:
authornavewindre <boneyaard@gmail.com>2025-09-03 20:10:09 +0200
committernavewindre <boneyaard@gmail.com>2025-09-03 20:10:09 +0200
commitf8b92ce3aa08b1445c9f956d8166830946562d12 (patch)
tree94e63a5aec9f8f52b577f56799e0c9201fd976a5 /src/util/math.cpp
a
Diffstat (limited to 'src/util/math.cpp')
-rw-r--r--src/util/math.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/util/math.cpp b/src/util/math.cpp
new file mode 100644
index 0000000..4ab3f2b
--- /dev/null
+++ b/src/util/math.cpp
@@ -0,0 +1,26 @@
+#include "math.h"
+
+#include "../render/gl_3d.h"
+
+VEC2 m_screen_transform( const VEC3 &world ) {
+ GL_DATA* gl = gl_instance();
+ MAT4* gl_proj_matrix = gl->proj_matrix;
+ VEC2 screen = gl->viewport_start;
+ VEC3 clip;
+
+ clip.x = world.x * gl_proj_matrix->m[0][0] + world.y * gl_proj_matrix->m[1][0] + world.z * gl_proj_matrix->m[2][0] + gl_proj_matrix->m[3][0];
+ clip.y = world.x * gl_proj_matrix->m[0][1] + world.y * gl_proj_matrix->m[1][1] + world.z * gl_proj_matrix->m[2][1] + gl_proj_matrix->m[3][1];
+ clip.z = world.x * gl_proj_matrix->m[0][3] + world.y * gl_proj_matrix->m[1][3] + world.z * gl_proj_matrix->m[2][3] + gl_proj_matrix->m[3][3];
+
+ if( clip.z <= 0.f ) {
+ screen.x = screen.y = SCREEN_INVALID_POS;
+ }
+
+ F32 ndcx = clip.x / clip.z;
+ F32 ndcy = clip.y / clip.z;
+
+ screen.x += ( ndcx * .5f + .5f ) * (F32)gl->viewport_dim.x;
+ screen.y += ( 1.f - ( ndcy * .5f + .5f ) ) * (F32)gl->viewport_dim.y;
+
+ return screen;
+}