X-Git-Url: https://harrygodden.com/git/?p=vg.git;a=blobdiff_plain;f=vg_lines.h;h=02d7a07d9c465f0bdb59946af9f7acc115d7afe4;hp=58818f25510f683103c0296f112cf0bfff4ef648;hb=HEAD;hpb=e6f73232f1b16af430e850646215d2c9e07dde2e diff --git a/vg_lines.h b/vg_lines.h index 58818f2..3730b6b 100644 --- a/vg_lines.h +++ b/vg_lines.h @@ -1,10 +1,8 @@ -/* Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved */ +/* Copyright (C) 2021-2024 Harry Godden (hgn) - All Rights Reserved */ -#ifndef VG_LINES_H -#define VG_LINES_H - -#define VG_GAME -#include "vg/vg.h" +#pragma once +#include "vg_platform.h" +#include "vg_engine.h" typedef v3f line_co; @@ -19,44 +17,10 @@ typedef v3f line_co; #define VG__CYAN 0xffffff00 #define VG__NONE 0x00000000 -static struct vg_shader _shader_lines = { - .name = "[vg] lines", - .link = NULL, - .vs = { - .orig_file = NULL, - .static_src = - - "uniform mat4 uPv;" - "layout (location=0) in vec3 a_co;" - "layout (location=1) in vec4 a_colour;" - "" - "out vec4 s_colour;" - "" - "void main()" - "{" - " vec4 vert_pos = uPv * vec4( a_co, 1.0 );" - " s_colour = a_colour;" - " gl_Position = vert_pos;" - "}" - }, - .fs = { - .orig_file = NULL, - .static_src = - - "out vec4 FragColor;" - "" - "in vec4 s_colour;" - "" - "void main()" - "{" - " FragColor = s_colour;" - "}" - } -}; - -struct{ - u32 draw, - allow_input; +struct vg_lines +{ + u32 enabled, + render; struct vg_lines_vert{ v3f co; @@ -66,234 +30,18 @@ struct{ GLuint vao, vbo; } -static vg_lines; - -VG_STATIC void async_vg_lines_init( void *payload, u32 payload_size ) -{ - glGenVertexArrays( 1, &vg_lines.vao ); - glGenBuffers( 1, &vg_lines.vbo ); - glBindVertexArray( vg_lines.vao ); - glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo ); - - u32 size = 50000 * sizeof( struct vg_lines_vert ); - - vg_lines.vertex_buffer = - vg_create_linear_allocator(vg_mem.rtmemory, size, VG_MEMORY_REALTIME); - - glBufferData( GL_ARRAY_BUFFER, size, NULL, GL_DYNAMIC_DRAW ); - glBindVertexArray( vg_lines.vao ); - VG_CHECK_GL_ERR(); - - /* Pointers */ - glVertexAttribPointer( - 0, - 3, - 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_CHECK_GL_ERR(); - vg_success( "done\n" ); - - vg_lines.allow_input = 1; -} - -VG_STATIC void vg_lines_init(void) -{ - vg_async_call( async_vg_lines_init, NULL, 0 ); - - vg_console_reg_var( "vg_lines", &vg_lines.draw, k_var_dtype_i32, - VG_VAR_CHEAT ); - vg_shader_register( &_shader_lines ); - -} - -VG_STATIC void vg_lines_drawall( void ) -{ - glUseProgram( _shader_lines.id ); - - glUniformMatrix4fv( glGetUniformLocation( _shader_lines.id, "uPv" ), - 1, GL_FALSE, (float *)vg.pv ); - - glBindVertexArray( vg_lines.vao ); - glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo ); - - u32 bufusage = vg_linear_get_cur(vg_lines.vertex_buffer); - - glBufferSubData( GL_ARRAY_BUFFER, 0, bufusage, vg_lines.vertex_buffer ); - - glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - glBlendEquation( GL_FUNC_ADD ); - - if( vg_lines.draw ) - glDrawArrays( GL_LINES, 0, bufusage / sizeof(struct vg_lines_vert) ); - - glDisable( GL_BLEND ); - vg_linear_clear( vg_lines.vertex_buffer ); -} - -VG_STATIC void vg_line2( line_co from, line_co to, u32 fc, u32 tc ) -{ - if( !vg_lines.allow_input ) - return; - - u32 size = 2 * sizeof(struct vg_lines_vert); - struct vg_lines_vert *v = vg_linear_alloc( vg_lines.vertex_buffer, size ); - - v3_copy( from, v[0].co ); - v3_copy( to, v[1].co ); - - v[0].colour = fc; - v[1].colour = tc; -} - -VG_STATIC void vg_line( line_co from, line_co to, u32 colour ) -{ - vg_line2( from, to, colour, colour ); -} - -VG_STATIC void line_tangent_basis( v3f n, v3f tx, v3f ty ) -{ - /* Compute tangent basis (box2d) */ - if( fabsf( n[0] ) >= 0.57735027f ){ - tx[0] = n[1]; - tx[1] = -n[0]; - tx[2] = 0.0f; - } - else{ - tx[0] = 0.0f; - tx[1] = n[2]; - tx[2] = -n[1]; - } - - v3_normalize( tx ); - v3_cross( n, tx, ty ); -} - -VG_STATIC void vg_line_arrow( line_co co, line_co dir, float size, u32 colour ) -{ - v3f p1, tx, ty, p2, p3; - v3_muladds( co, dir, size, p1 ); - line_tangent_basis( dir, tx, ty ); - - v3_muladds( p1, dir, -size * 0.125f, p2 ); - v3_muladds( p2, ty, size * 0.125f, p3 ); - v3_muladds( p2, ty, -size * 0.125f, p2 ); - - vg_line( co, p1, colour ); - vg_line( p1, p2, colour ); - vg_line( p1, p3, colour ); -} - -VG_STATIC void vg_line_boxf( boxf box, u32 colour ) -{ - v3f p000, p001, p010, p011, p100, p101, p110, p111; - - p000[0]=box[0][0];p000[1]=box[0][1];p000[2]=box[0][2]; - p001[0]=box[0][0];p001[1]=box[0][1];p001[2]=box[1][2]; - p010[0]=box[0][0];p010[1]=box[1][1];p010[2]=box[0][2]; - p011[0]=box[0][0];p011[1]=box[1][1];p011[2]=box[1][2]; - - p100[0]=box[1][0];p100[1]=box[0][1];p100[2]=box[0][2]; - p101[0]=box[1][0];p101[1]=box[0][1];p101[2]=box[1][2]; - p110[0]=box[1][0];p110[1]=box[1][1];p110[2]=box[0][2]; - p111[0]=box[1][0];p111[1]=box[1][1];p111[2]=box[1][2]; - - vg_line( p000, p001, colour ); - vg_line( p001, p011, colour ); - vg_line( p011, p010, colour ); - vg_line( p010, p000, colour ); - - vg_line( p100, p101, colour ); - vg_line( p101, p111, colour ); - vg_line( p111, p110, colour ); - vg_line( p110, p100, colour ); - - vg_line( p100, p000, colour ); - vg_line( p101, p001, colour ); - vg_line( p110, p010, colour ); - vg_line( p111, p011, colour ); -} - -VG_STATIC void vg_line_boxf_transformed( m4x3f m, boxf box, u32 colour ) -{ - v3f p000, p001, p010, p011, p100, p101, p110, p111; - - p000[0]=box[0][0];p000[1]=box[0][1];p000[2]=box[0][2]; - p001[0]=box[0][0];p001[1]=box[0][1];p001[2]=box[1][2]; - p010[0]=box[0][0];p010[1]=box[1][1];p010[2]=box[0][2]; - p011[0]=box[0][0];p011[1]=box[1][1];p011[2]=box[1][2]; - - p100[0]=box[1][0];p100[1]=box[0][1];p100[2]=box[0][2]; - p101[0]=box[1][0];p101[1]=box[0][1];p101[2]=box[1][2]; - p110[0]=box[1][0];p110[1]=box[1][1];p110[2]=box[0][2]; - p111[0]=box[1][0];p111[1]=box[1][1];p111[2]=box[1][2]; - - m4x3_mulv( m, p000, p000 ); - m4x3_mulv( m, p001, p001 ); - m4x3_mulv( m, p010, p010 ); - m4x3_mulv( m, p011, p011 ); - m4x3_mulv( m, p100, p100 ); - m4x3_mulv( m, p101, p101 ); - m4x3_mulv( m, p110, p110 ); - m4x3_mulv( m, p111, p111 ); - - vg_line( p000, p001, colour ); - vg_line( p001, p011, colour ); - vg_line( p011, p010, colour ); - vg_line( p010, p000, colour ); - - vg_line( p100, p101, colour ); - vg_line( p101, p111, colour ); - vg_line( p111, p110, colour ); - vg_line( p110, p100, colour ); - - vg_line( p100, p000, colour ); - vg_line( p101, p001, colour ); - vg_line( p110, p010, colour ); - vg_line( p111, p011, colour ); - - vg_line( p000, p110, colour ); - vg_line( p100, p010, colour ); -} - -VG_STATIC void vg_line_cross(v3f pos,u32 colour, float scale) -{ - v3f p0, p1; - v3_add( (v3f){ scale,0.0f,0.0f}, pos, p0 ); - v3_add( (v3f){-scale,0.0f,0.0f}, pos, p1 ); - vg_line( p0, p1, colour ); - v3_add( (v3f){0.0f, scale,0.0f}, pos, p0 ); - v3_add( (v3f){0.0f,-scale,0.0f}, pos, p1 ); - vg_line( p0, p1, colour ); - v3_add( (v3f){0.0f,0.0f, scale}, pos, p0 ); - v3_add( (v3f){0.0f,0.0f,-scale}, pos, p1 ); - vg_line( p0, p1, colour ); -} - -VG_STATIC void vg_line_pt3( v3f pt, float size, u32 colour ) -{ - boxf box = - { - { pt[0]-size, pt[1]-size, pt[2]-size }, - { pt[0]+size, pt[1]+size, pt[2]+size } - }; - - vg_line_boxf( box, colour ); -} - -#endif /* VG_LINES_H */ +extern vg_lines; + +void vg_line_capsule( m4x3f m, float radius, float h, u32 colour ); +void vg_line_sphere( m4x3f m, float radius, u32 colour ); +void vg_line_point( v3f pt, float size, u32 colour ); +void vg_line_boxf_transformed( m4x3f m, boxf box, u32 colour ); +void vg_line_boxf( boxf box, u32 colour ); +void vg_line_mesh( v3f verts[], u32 indices[][2], u32 indice_count,u32 colour ); +void vg_line_box_verts( boxf box, v3f verts[8] ); +void vg_line_cross(v3f pos,u32 colour, float scale); +void vg_line_arrow( line_co co, line_co dir, float size, u32 colour ); +void vg_line( line_co from, line_co to, u32 colour ); +void vg_line2( line_co from, line_co to, u32 fc, u32 tc ); +void vg_lines_drawall( void ); +void vg_lines_init(void);