mat4 m_projection;
mat4 m_view;
-mat4 m_pv;
mat4 m_mdl;
int main( int argc, char *argv[] )
glm_translate_z( m_view, -10.f );
glm_rotate_x( m_view, 1.0f, m_view );
- glm_mat4_mul( m_projection, m_view, m_pv );
+ glm_mat4_mul( m_projection, m_view, vg_pv );
// Get mouse ray
vec3 ray_origin;
mat4 pv_inverse;
vec4 vp = { 0.f, 0.f, vg_window_x, vg_window_y };
- glm_mat4_inv( m_pv, pv_inverse );
+ glm_mat4_inv( vg_pv, pv_inverse );
glm_unprojecti( (vec3){ vg_mouse_x, vg_window_y-vg_mouse_y, -1.f }, pv_inverse, vp, ray_dir );
glm_unprojecti( (vec3){ vg_mouse_x, vg_window_y-vg_mouse_y, 0.f }, pv_inverse, vp, ray_origin );
glm_vec3_sub( ray_dir, ray_origin, ray_dir );
int tile_y = floorf( tile_pos[2] );
map.selected = map_tile_at( (int [2]){tile_x, tile_y} );
+
+ vg_line2( (vec3){0.f,0.f,0.f}, (vec3){0.f,3.f,0.f}, 0xff0000ff, 0xff00ff00 );
}
GLuint tile_vao;
glClearColor( 0.94f, 0.94f, 0.94f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glBindVertexArray( tile_vao );
+
SHADER_USE( colour_shader );
- glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPv" ), 1, GL_FALSE, (float *)m_pv );
+ glUniformMatrix4fv( SHADER_UNIFORM( colour_shader, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
for( int y = 0; y < map.y; y ++ )
{
void vg_register_exit( void( *funcptr )(void), const char *name );
void vg_exiterr( const char *strErr );
+mat4 vg_pv;
+
#include "vg/vg_platform.h"
#include "vg/vg_io.h"
#include "vg/vg_audio.h"
#include "vg/vg_shader.h"
+#include "vg/vg_lines.h"
#include "steam/steamworks_thin.h"
vg_audio_init();
vg_register_exit( &vg_audio_free, "vg_audio_free" );
+ vg_lines_init();
+ vg_register_exit( &vg_lines_free, "vg_lines_free" );
vg_start();
+ vg_register_exit( &vg_free, "vg_free" );
+
if( vg_shaders_compile() )
{
// Main gameloop
vg_time_delta = vg_min( vg_time - vg_time_last, 0.1f );
vg_update_inputs();
-
vg_update();
+ vg_render();
- // Update mashed projections etc
+ vg_lines_drawall();
- vg_render();
vg_ui();
glfwSwapBuffers( vg_window );
}
}
- vg_free();
vg_exit();
}
--- /dev/null
+// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved
+
+SHADER_DEFINE( vg_line_shader,
+
+ // VERTEX
+ "layout (location=0) in vec3 a_co;"
+ "layout (location=1) in vec4 a_colour;"
+ "uniform mat4 uPv;"
+ ""
+ "out vec4 s_colour;"
+ ""
+ "void main()"
+ "{"
+ " vec4 vert_pos = uPv * vec4( a_co, 1.0 );"
+ " s_colour = a_colour;"
+ " gl_Position = vert_pos;"
+ "}",
+
+ // FRAGMENT
+ "out vec4 FragColor;"
+ ""
+ "in vec4 s_colour;"
+ ""
+ "void main()"
+ "{"
+ " FragColor = s_colour;"
+ "}"
+ ,
+ UNIFORMS({ "uPv" })
+)
+
+struct
+{
+ struct vg_lines_vert
+ {
+ vec3 co;
+ u32 colour;
+ }
+ *buffer;
+
+ GLuint vao, vbo;
+ u32 draw_idx, cap, buffer_size;
+
+}
+vg_lines;
+
+static void vg_lines_init(void)
+{
+ SHADER_INIT( vg_line_shader );
+
+ glGenVertexArrays( 1, &vg_lines.vao );
+ glGenBuffers( 1, &vg_lines.vbo );
+ glBindVertexArray( vg_lines.vao );
+
+ glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo );
+
+ vg_lines.cap = 10000;
+ vg_lines.buffer_size = vg_lines.cap * sizeof( struct vg_lines_vert );
+
+ glBufferData( GL_ARRAY_BUFFER, vg_lines.buffer_size, NULL, GL_DYNAMIC_DRAW );
+ glBindVertexArray( vg_lines.vao );
+
+ glVertexAttribPointer(
+ 0,
+ sizeof( vg_lines.buffer[0].co ) / sizeof(float),
+ GL_FLOAT,
+ GL_FALSE,
+ sizeof( struct vg_lines_vert ),
+ (void *)0
+ );
+ glEnableVertexAttribArray( 0 );
+
+ glVertexAttribPointer(
+ 1,
+ 4,
+ GL_UNSIGNED_BYTE,
+ GL_TRUE,
+ sizeof( struct vg_lines_vert ),
+ (void*)(offsetof( struct vg_lines_vert, colour ))
+ );
+ glEnableVertexAttribArray( 1 );
+ vg_lines.buffer = malloc( vg_lines.buffer_size );
+}
+
+static void vg_lines_free(void)
+{
+ glDeleteVertexArrays( 1, &vg_lines.vao );
+ glDeleteBuffers( 1, &vg_lines.vbo );
+
+ free( vg_lines.buffer );
+}
+
+static void vg_lines_drawall(void)
+{
+ SHADER_USE( vg_line_shader );
+ glUniformMatrix4fv( SHADER_UNIFORM( vg_line_shader, "uPv" ), 1, GL_FALSE, (float *)vg_pv );
+
+ glBindVertexArray( vg_lines.vao );
+ glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo );
+
+ glBufferSubData( GL_ARRAY_BUFFER, 0, vg_lines.draw_idx * sizeof(struct vg_lines_vert), vg_lines.buffer );
+ glEnable( GL_BLEND );
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ glBlendEquation( GL_FUNC_ADD );
+
+ glDrawArrays( GL_LINES, 0, vg_lines.draw_idx );
+
+ glDisable( GL_BLEND );
+ vg_lines.draw_idx = 0;
+}
+
+static void vg_line2( vec3 from, vec3 to, u32 fc, u32 tc )
+{
+ struct vg_lines_vert *v = vg_lines.buffer + vg_lines.draw_idx;
+ glm_vec3_copy( from, v[0].co );
+ glm_vec3_copy( to, v[1].co );
+ v[0].colour = fc;
+ v[1].colour = tc;
+
+ vg_lines.draw_idx += 2;
+}
+
+static void vg_line( vec3 from, vec3 to, u32 colour )
+{
+ vg_line2( from, to, colour, colour );
+}