diff options
| author | navewindre <boneyaard@gmail.com> | 2025-09-03 20:10:09 +0200 |
|---|---|---|
| committer | navewindre <boneyaard@gmail.com> | 2025-09-03 20:10:09 +0200 |
| commit | f8b92ce3aa08b1445c9f956d8166830946562d12 (patch) | |
| tree | 94e63a5aec9f8f52b577f56799e0c9201fd976a5 /src/util/math.cpp | |
a
Diffstat (limited to 'src/util/math.cpp')
| -rw-r--r-- | src/util/math.cpp | 26 |
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; +} |
