}
static vg_lines;
-VG_STATIC void async_vg_lines_init( void *payload, u32 payload_size )
-{
+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 );
vg_lines.allow_input = 1;
}
-VG_STATIC void vg_lines_init(void)
-{
+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_STATIC void vg_lines_drawall( void )
-{
+VG_STATIC void vg_lines_drawall( void ){
glUseProgram( _shader_lines.id );
glUniformMatrix4fv( glGetUniformLocation( _shader_lines.id, "uPv" ),
vg_linear_clear( vg_lines.vertex_buffer );
}
-VG_STATIC void vg_line2( line_co from, line_co to, u32 fc, u32 tc )
-{
+VG_STATIC void vg_line2( line_co from, line_co to, u32 fc, u32 tc ){
if( !vg_lines.allow_input ) return;
if( !vg_lines.draw ) return;
v[1].colour = tc;
}
-VG_STATIC void vg_line( line_co from, line_co to, u32 colour )
-{
+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 )
-{
+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_tangent_basis( dir, tx, ty );
v3_muladds( p1, dir, -size * 0.125f, p2 );
v3_muladds( p2, ty, size * 0.125f, p3 );
vg_line( p1, p3, colour );
}
-VG_STATIC void vg_line_boxf( boxf box, u32 colour )
-{
- v3f p000, p001, p010, p011, p100, p101, p110, p111;
+VG_STATIC void vg_line_box_verts( boxf box, v3f verts[8] ){
+ for( u32 i=0; i<8; i++ ){
+ for( u32 j=0; j<3; j++ ){
+ verts[i][j] = i&(0x1<<j)? box[1][j]: box[0][j];
+ }
+ }
+}
- 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];
+VG_STATIC void vg_line_mesh( v3f verts[], u32 indices[][2], u32 indice_count,
+ u32 colour ){
+ for( u32 i=0; i<indice_count; i++ ){
+ vg_line( verts[indices[i][0]], verts[indices[i][1]], colour );
+ }
+}
- 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( boxf box, u32 colour ){
+ v3f verts[8];
+ vg_line_box_verts( box, verts );
+ u32 indices[][2] = {{0,1},{1,3},{3,2},{2,0},
+ {4,5},{5,7},{7,6},{6,4},
+ {4,0},{5,1},{6,2},{7,3}};
+
+ vg_line_mesh( verts, indices, vg_list_size(indices), 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_boxf_transformed( m4x3f m, boxf box, u32 colour ){
+ v3f verts[8];
+ vg_line_box_verts( box, verts );
+
+ for( u32 i=0; i<8; i++ ){
+ m4x3_mulv( m, verts[i], verts[i] );
+ }
+
+ u32 indices[][2] = {{0,1},{1,3},{3,2},{2,0},
+ {4,5},{5,7},{7,6},{6,4},
+ {4,0},{5,1},{6,2},{7,3}};
+
+ vg_line_mesh( verts, indices, vg_list_size(indices), colour );
}
-VG_STATIC void vg_line_cross(v3f pos,u32 colour, float scale)
-{
+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 );
}
-VG_STATIC void vg_line_pt3( v3f pt, float size, u32 colour )
-{
+VG_STATIC void vg_line_point( v3f pt, float size, u32 colour ){
boxf box =
{
{ pt[0]-size, pt[1]-size, pt[2]-size },
vg_line_boxf( box, colour );
}
+
+VG_STATIC void vg_line_sphere( m4x3f m, float radius, u32 colour ){
+ v3f ly = { 0.0f, 0.0f, radius },
+ lx = { 0.0f, radius, 0.0f },
+ lz = { 0.0f, 0.0f, radius };
+
+ for( int i=0; i<16; i++ ){
+ float t = ((float)(i+1) * (1.0f/16.0f)) * VG_PIf * 2.0f,
+ s = sinf(t),
+ c = cosf(t);
+
+ v3f py = { s*radius, 0.0f, c*radius },
+ px = { s*radius, c*radius, 0.0f },
+ pz = { 0.0f, s*radius, c*radius };
+
+ v3f p0, p1, p2, p3, p4, p5;
+ m4x3_mulv( m, py, p0 );
+ m4x3_mulv( m, ly, p1 );
+ m4x3_mulv( m, px, p2 );
+ m4x3_mulv( m, lx, p3 );
+ m4x3_mulv( m, pz, p4 );
+ m4x3_mulv( m, lz, p5 );
+
+ vg_line( p0, p1, colour == 0x00? 0xff00ff00: colour );
+ vg_line( p2, p3, colour == 0x00? 0xff0000ff: colour );
+ vg_line( p4, p5, colour == 0x00? 0xffff0000: colour );
+
+ v3_copy( py, ly );
+ v3_copy( px, lx );
+ v3_copy( pz, lz );
+ }
+}
+
+VG_STATIC void vg_line_capsule( m4x3f m, float radius, float h, u32 colour ){
+ v3f ly = { 0.0f, 0.0f, radius },
+ lx = { 0.0f, radius, 0.0f },
+ lz = { 0.0f, 0.0f, radius };
+
+ float s0 = sinf(0.0f)*radius,
+ c0 = cosf(0.0f)*radius;
+
+ v3f p0, p1, up, right, forward;
+ m3x3_mulv( m, (v3f){0.0f,1.0f,0.0f}, up );
+ m3x3_mulv( m, (v3f){1.0f,0.0f,0.0f}, right );
+ m3x3_mulv( m, (v3f){0.0f,0.0f,-1.0f}, forward );
+ v3_muladds( m[3], up, -h*0.5f+radius, p0 );
+ v3_muladds( m[3], up, h*0.5f-radius, p1 );
+
+ v3f a0, a1, b0, b1;
+ v3_muladds( p0, right, radius, a0 );
+ v3_muladds( p1, right, radius, a1 );
+ v3_muladds( p0, forward, radius, b0 );
+ v3_muladds( p1, forward, radius, b1 );
+ vg_line( a0, a1, colour );
+ vg_line( b0, b1, colour );
+
+ v3_muladds( p0, right, -radius, a0 );
+ v3_muladds( p1, right, -radius, a1 );
+ v3_muladds( p0, forward, -radius, b0 );
+ v3_muladds( p1, forward, -radius, b1 );
+ vg_line( a0, a1, colour );
+ vg_line( b0, b1, colour );
+
+ for( int i=0; i<16; i++ ){
+ float t = ((float)(i+1) * (1.0f/16.0f)) * VG_PIf * 2.0f,
+ s1 = sinf(t)*radius,
+ c1 = cosf(t)*radius;
+
+ v3f e0 = { s0, 0.0f, c0 },
+ e1 = { s1, 0.0f, c1 },
+ e2 = { s0, c0, 0.0f },
+ e3 = { s1, c1, 0.0f },
+ e4 = { 0.0f, c0, s0 },
+ e5 = { 0.0f, c1, s1 };
+
+ m3x3_mulv( m, e0, e0 );
+ m3x3_mulv( m, e1, e1 );
+ m3x3_mulv( m, e2, e2 );
+ m3x3_mulv( m, e3, e3 );
+ m3x3_mulv( m, e4, e4 );
+ m3x3_mulv( m, e5, e5 );
+
+ v3_add( p0, e0, a0 );
+ v3_add( p0, e1, a1 );
+ v3_add( p1, e0, b0 );
+ v3_add( p1, e1, b1 );
+
+ vg_line( a0, a1, colour );
+ vg_line( b0, b1, colour );
+
+ if( c0 < 0.0f ){
+ v3_add( p0, e2, a0 );
+ v3_add( p0, e3, a1 );
+ v3_add( p0, e4, b0 );
+ v3_add( p0, e5, b1 );
+ }
+ else{
+ v3_add( p1, e2, a0 );
+ v3_add( p1, e3, a1 );
+ v3_add( p1, e4, b0 );
+ v3_add( p1, e5, b1 );
+ }
+
+ vg_line( a0, a1, colour );
+ vg_line( b0, b1, colour );
+
+ s0 = s1;
+ c0 = c1;
+ }
+}
+
#endif /* VG_LINES_H */