blob: 4ab3f2b3833e7254767d366c9c3fec77b030b551 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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;
}
|