review: vg_lines.h, vg_m.h
authorhgn <hgodden00@gmail.com>
Sun, 2 Jul 2023 21:12:26 +0000 (22:12 +0100)
committerhgn <hgodden00@gmail.com>
Sun, 2 Jul 2023 21:12:26 +0000 (22:12 +0100)
vg_lines.h
vg_m.h

index 7077e737b6719960ccc3a151cffbca990fae0c55..c44f0713cd9eab045fd92736b5bf96b742f693eb 100644 (file)
@@ -68,8 +68,7 @@ struct{
 }
 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 );
@@ -109,8 +108,7 @@ VG_STATIC void async_vg_lines_init( void *payload, u32 payload_size )
    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, 
@@ -119,8 +117,7 @@ VG_STATIC void vg_lines_init(void)
 
 }
 
-VG_STATIC void vg_lines_drawall( void )
-{
+VG_STATIC void vg_lines_drawall( void ){
        glUseProgram( _shader_lines.id );
 
    glUniformMatrix4fv( glGetUniformLocation( _shader_lines.id, "uPv" ), 
@@ -144,8 +141,7 @@ VG_STATIC void vg_lines_drawall( void )
    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;
 
@@ -159,34 +155,14 @@ VG_STATIC void vg_line2( line_co from, line_co to, u32 fc, u32 tc )
        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 );
@@ -197,80 +173,47 @@ VG_STATIC void vg_line_arrow( line_co co, line_co dir, float size, u32 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;
+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 );
@@ -283,8 +226,7 @@ VG_STATIC void vg_line_cross(v3f pos,u32 colour, float scale)
    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 },
@@ -294,4 +236,115 @@ VG_STATIC void vg_line_pt3( v3f pt, float size, u32 colour )
    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 */
diff --git a/vg_m.h b/vg_m.h
index 833f1f01598a628a4c09df3c873c1a7cef7a3644..950ebd792574240c5b3aa289b39fc695d5120056 100644 (file)
--- a/vg_m.h
+++ b/vg_m.h
@@ -18,6 +18,7 @@
  *    5.c Closest points
  *    5.d Raycast & Spherecasts
  *    5.e Curves
+ *    5.f Volumes
  *  6. Statistics
  *    6.a Random numbers
  **/
@@ -62,6 +63,12 @@ static int vg_validf( f32 a )
    return ((vg_ftu32(a)) & 0x7F800000U) != 0x7F800000U;
 }
 
+static int v3_valid( v3f a ){
+   for( u32 i=0; i<3; i++ )
+      if( !vg_validf(a[i]) ) return 0;
+   return 1;
+}
+
 /*
  * -----------------------------------------------------------------------------
  * Section 1.                   Scalar Operations
@@ -480,6 +487,24 @@ static inline void v3_rotate( v3f v, f32 angle, v3f axis, v3f d )
   v3_add( v1, v2, d );
 }
 
+static void v3_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 );
+}
+
+
 /*
  * -----------------------------------------------------------------------------
  * Section 2.c                   4D Vectors
@@ -2124,6 +2149,17 @@ static void eval_bezier3( v3f p0, v3f p1, v3f p2, f32 t, v3f p )
    v3_muladds( p, p2, t*t, p );
 }
 
+/*
+ * -----------------------------------------------------------------------------
+ * Section 5.f                      Volumes
+ * -----------------------------------------------------------------------------
+ */
+
+static float vg_sphere_volume( float radius ){
+   float r3 = radius*radius*radius;
+   return (4.0f/3.0f) * VG_PIf * r3;
+}
+
 /*
  * -----------------------------------------------------------------------------
  * Section 6.a            PSRNG and some distributions