tile selection
[fishladder.git] / fishladder.c
1 // Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
2
3 //#define VG_STEAM
4 #include "vg/vg.h"
5
6 SHADER_DEFINE( colour_shader,
7
8 // VERTEX
9 "layout (location=0) in vec3 a_co;"
10 "uniform mat4 uPv;"
11 "uniform mat4 uMdl;"
12 ""
13 "void main()"
14 "{"
15 " vec4 vert_pos = uPv * uMdl * vec4( a_co, 1.0 );"
16 " gl_Position = vert_pos;"
17 "}",
18
19 // FRAGMENT
20 "out vec4 FragColor;"
21 "uniform vec4 uColour;"
22 ""
23 "void main()"
24 "{"
25 " FragColor = uColour;"
26 "}"
27 ,
28 UNIFORMS({ "uPv", "uMdl", "uColour" })
29 )
30
31 mat4 m_projection;
32 mat4 m_view;
33 mat4 m_pv;
34 mat4 m_mdl;
35
36 int main( int argc, char *argv[] )
37 {
38 vg_init( argc, argv, "FishLadder" );
39 }
40
41 void vg_update(void)
42 {
43 // Update camera
44 float ratio = (float)vg_window_y / (float)vg_window_x;
45 float const size = 7.5f;
46 glm_ortho( -size, size, -size*ratio, size*ratio, 0.1f, 100.f, m_projection );
47
48 glm_mat4_identity( m_view );
49 glm_translate_z( m_view, -10.f );
50 glm_rotate_x( m_view, -1.0f, m_view );
51
52 glm_mat4_mul( m_projection, m_view, m_pv );
53
54 // Get mouse ray
55 vec3 ray_origin;
56 vec3 ray_dir;
57
58 mat4 pv_inverse;
59 vec4 vp = { 0.f, 0.f, vg_window_x, vg_window_y };
60 glm_mat4_inv( m_pv, pv_inverse );
61 glm_unprojecti( (vec3){ vg_mouse_x, vg_window_y-vg_mouse_y, -1.f }, pv_inverse, vp, ray_dir );
62 glm_unprojecti( (vec3){ vg_mouse_x, vg_window_y-vg_mouse_y, 0.f }, pv_inverse, vp, ray_origin );
63 glm_vec3_sub( ray_dir, ray_origin, ray_dir );
64
65 // Get floor tile intersection
66 float ray_t = -ray_origin[1] / ray_dir[1];
67
68 vec3 tile_pos;
69 glm_vec3_copy( ray_origin, tile_pos );
70 glm_vec3_muladds( ray_dir, ray_t, tile_pos );
71
72 tile_pos[0] = floorf( tile_pos[0] + 0.5f );
73 tile_pos[2] = floorf( tile_pos[2] + 0.5f );
74
75 glm_mat4_identity( m_mdl );
76 glm_translate( m_mdl, tile_pos );
77 }
78
79 GLuint tile_vao;
80 GLuint tile_vbo;
81
82 void vg_render(void)
83 {
84 glViewport( 0,0, vg_window_x, vg_window_y );
85
86 glEnable( GL_DEPTH_TEST );
87 glClearColor( 0.94f, 0.94f, 0.94f, 1.0f );
88 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
89
90 SHADER_USE( colour_shader );
91 glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPv" ), 1, GL_FALSE, (float *)m_pv );
92 glUniform4f( SHADER_UNIFORM( colour_shader, "uColour" ), 0.5f, 0.5f, 0.5f, 1.0f );
93
94 glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uMdl" ), 1, GL_FALSE, (float *)m_mdl );
95
96 glBindVertexArray( tile_vao );
97 glDrawArrays( GL_TRIANGLES, 0, 6 );
98 }
99
100 void vg_start(void)
101 {
102 SHADER_INIT( colour_shader );
103
104 glGenVertexArrays( 1, &tile_vao );
105 glGenBuffers( 1, &tile_vbo );
106
107 float quad_mesh[] =
108 {
109 -0.5f, 0.f, -0.5f,
110 -0.5f, 0.f, 0.5f,
111 0.5f, 0.f, 0.5f,
112 -0.5f, 0.f, -0.5f,
113 0.5f, 0.f, 0.5f,
114 0.5f, 0.f, -0.5f
115 };
116
117 glBindVertexArray( tile_vao );
118 glBindBuffer( GL_ARRAY_BUFFER, tile_vbo );
119 glBufferData
120 (
121 GL_ARRAY_BUFFER,
122 sizeof( quad_mesh ),
123 quad_mesh,
124 GL_STATIC_DRAW
125 );
126
127 glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0 );
128 glEnableVertexAttribArray( 0 );
129
130 VG_CHECK_GL();
131 }
132
133 void vg_free(void)
134 {
135
136 }
137
138 void vg_ui(void)
139 {
140
141 }