#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; }