chaos caused by async
[carveJwlIkooP6JGAAIwe30JlM.git] / world_sfd.h
index 3f94c4ed86fae271a5948d20c521179ccf395c65..18789c7e841320a235726cfecad66ae2deaa71d2 100644 (file)
@@ -1,22 +1,15 @@
 /*
- * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
+ * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved
  */
 
 #ifndef SFD_H
 #define SFD_H
 
 #include "world.h"
+#include "shaders/scene_scoretext.h"
+#include "shaders/scene_vertex_blend.h"
 
-#include "shaders/scoretext.h"
-#include "shaders/vblend.h"
-
-vg_tex2d tex_scoretext = { .path = "textures/scoretext.qoi",
-                           .flags = VG_TEXTURE_CLAMP|VG_TEXTURE_NEAREST };
-
-/* 
- * TODO: utf-8 -> ascii
- */
-
+GLuint tex_scoretex;
 float sfd_encode_glyph( char c )
 {
    int value = 0;
@@ -28,12 +21,10 @@ float sfd_encode_glyph( char c )
       value = c-'A'+11;
    else if( c >= '\x01' && c <= '\x01'+10 )
       value = 63-c;
-   else
-   {
+   else{
       int base = 11+26;
 
-      switch( c )
-      {
+      switch( c ){
          case '!': value=base+0; break;
          case '?': value=base+1; break;
          case ',': value=base+2; break;
@@ -56,42 +47,33 @@ float sfd_encode_glyph( char c )
 VG_STATIC void sfd_encode( u32 row, const char *str )
 {
    int end=0;
-   u32 row_h = world.sfd.h -1 -row;
+   u32 row_h = world_global.sfd.h -1 -row;
 
-   for( int i=0; i<world.sfd.w; i++ )
-   {
-      u32 idx = (world.sfd.w*row_h + i) * 2;
+   for( int i=0; i<world_global.sfd.w; i++ ){
+      u32 idx = (world_global.sfd.w*row_h + i) * 2;
 
-      if( end )
-      {
-         world.sfd.buffer[idx] = 0.0f;
+      if( end ){
+         world_global.sfd.buffer[idx] = 0.0f;
       }
-      else
-      {
+      else{
          if( !str[i] )
             end = 1;
 
-         world.sfd.buffer[idx] = sfd_encode_glyph( str[i] );
+         world_global.sfd.buffer[idx] = sfd_encode_glyph( str[i] );
       }
    }
 }
 
-VG_STATIC void sfd_init( u32 w, u32 h )
-{
-}
-
 VG_STATIC void sfd_update(void)
 {
-   for( int i=0; i<world.sfd.w*world.sfd.h; i++ )
-   {
-      float *target = &world.sfd.buffer[i*2+0],
-            *cur =    &world.sfd.buffer[i*2+1];
+   for( int i=0; i<world_global.sfd.w*world_global.sfd.h; i++ ){
+      float *target = &world_global.sfd.buffer[i*2+0],
+            *cur =    &world_global.sfd.buffer[i*2+1];
       
       float const rate = vg.time_delta * 15.2313131414f;
       float d1 = *target-*cur;
       
-      if( fabsf(d1) > rate )
-      {
+      if( fabsf(d1) > rate ){
          *cur += rate;
          if( *cur > 60.0f )
             *cur -= 60.0f;
@@ -102,51 +84,69 @@ VG_STATIC void sfd_update(void)
 }
 
 VG_STATIC void bind_terrain_noise(void);
-VG_STATIC void sfd_render( m4x4f projection, v3f camera, m4x3f transform )
+VG_STATIC void sfd_render( world_instance *world, camera *cam, m4x3f transform )
 {
-   mesh_bind( &world.sfd.mesh_display );
+   mesh_bind( &world_global.sfd.mesh_display );
+   shader_scene_scoretext_use();
+   shader_scene_scoretext_uTexMain(1);
+
+   world_link_lighting_ub( world, _shader_scene_scoretext.id );
+   world_bind_position_texture( world, _shader_scene_scoretext.id, 
+                        _uniform_scene_scoretext_g_world_depth, 2 );
+   world_bind_light_array( world, _shader_scene_scoretext.id,
+                        _uniform_scene_scoretext_uLightsArray, 3 );
+   world_bind_light_index( world, _shader_scene_scoretext.id,
+                           _uniform_scene_scoretext_uLightsIndex, 4 );
 
-   shader_scoretext_use();
-   shader_scoretext_uTexGarbage(0);
-   shader_scoretext_uTexGradients(1);
-   shader_link_standard_ub( _shader_scoretext.id, 2 );
    bind_terrain_noise();
-   vg_tex2d_bind( &tex_scoretext, 1 );
-
-   shader_scoretext_uPv( projection );
-   shader_scoretext_uMdl( transform );
-   shader_scoretext_uCamera( camera );
-
-   for( int y=0;y<world.sfd.h; y++ )
-   {
-      for( int x=0; x<world.sfd.w; x++ )
-      {
-         float value = world.sfd.buffer[(y*world.sfd.w+x)*2+1];
-         shader_scoretext_uInfo( (v3f){ x,y, value } );
-         mesh_draw( &world.sfd.mesh_display );
+
+   glActiveTexture( GL_TEXTURE1 );
+   glBindTexture( GL_TEXTURE_2D, tex_scoretex );
+
+   m4x4f pvm_prev;
+   m4x3_expand( transform, pvm_prev );
+   m4x4_mul( cam->mtx_prev.pv, pvm_prev, pvm_prev );
+
+   shader_scene_scoretext_uPv( cam->mtx.pv );
+   shader_scene_scoretext_uPvmPrev( pvm_prev );
+   shader_scene_scoretext_uMdl( transform );
+   shader_scene_scoretext_uCamera( cam->transform[3] );
+
+   for( int y=0;y<world_global.sfd.h; y++ ){
+      for( int x=0; x<world_global.sfd.w; x++ ){
+         float value = world_global.sfd.buffer[(y*world_global.sfd.w+x)*2+1];
+         shader_scene_scoretext_uInfo( (v3f){ x,y, value } );
+         mesh_draw( &world_global.sfd.mesh_display );
       }
    }
 
-   shader_vblend_use();
-   shader_vblend_uTexGarbage(0);
-   shader_vblend_uTexGradients(1);
-   shader_link_standard_ub( _shader_vblend.id, 2 );
+   shader_scene_vertex_blend_use();
+   shader_scene_vertex_blend_uTexGarbage(0);
+   shader_scene_vertex_blend_uTexGradients(1);
+   world_link_lighting_ub( world, _shader_scene_vertex_blend.id );
+   world_bind_position_texture( world, _shader_scene_vertex_blend.id, 
+                                _uniform_scene_vertex_blend_g_world_depth, 2 );
+   world_bind_light_array( world, _shader_scene_vertex_blend.id,
+                                _uniform_scene_vertex_blend_uLightsArray, 3 );
+   world_bind_light_index( world, _shader_scene_vertex_blend.id,
+                                _uniform_scene_vertex_blend_uLightsIndex, 4 );
    bind_terrain_noise();
-   vg_tex2d_bind( &tex_scoretext, 1 );
+   glActiveTexture( GL_TEXTURE1 );
+   glBindTexture( GL_TEXTURE_2D, tex_scoretex );
 
-   shader_vblend_uPv( projection );
-   shader_vblend_uMdl( transform );
-   shader_vblend_uCamera( camera );
+   shader_scene_vertex_blend_uPv( cam->mtx.pv );
+   shader_scene_vertex_blend_uPvmPrev( pvm_prev );
+   shader_scene_vertex_blend_uMdl( transform );
+   shader_scene_vertex_blend_uCamera( cam->transform[3] );
    
-   mesh_bind( &world.sfd.mesh_base );
-   mesh_draw( &world.sfd.mesh_base );
+   mesh_bind( &world_global.sfd.mesh_base );
+   mdl_draw_submesh( &world_global.sfd.sm_base );
 }
 
 VG_STATIC int world_sfd_test( int argc, const char *argv[] )
 {
-   if( argc == 2 )
-   {
-      int row = vg_min( vg_max(atoi(argv[0]),0), world.sfd.h);
+   if( argc == 2 ){
+      int row = vg_min( vg_max(atoi(argv[0]),0), world_global.sfd.h);
       sfd_encode( row, argv[1] );
    }
 
@@ -156,61 +156,65 @@ VG_STATIC int world_sfd_test( int argc, const char *argv[] )
 VG_STATIC void world_sfd_init(void)
 {
    vg_info( "world_sfd_init\n" );
-   shader_scoretext_register();
-
-       vg_function_push( (struct vg_cmd){
-               .name = "sfd",
-               .function = world_sfd_test
-       });
+   shader_scene_scoretext_register();
+   vg_console_reg_cmd( "sfd", world_sfd_test, NULL );
 
    vg_linear_clear( vg_mem.scratch );
-   mdl_context *mboard = 
-      mdl_load_full( vg_mem.scratch, "models/rs_scoretext.mdl" );
 
-   scene *sc = scene_init( vg_mem.scratch, 3000, 8000 );
+   mdl_context mscoreboard;
+   mdl_open( &mscoreboard, "models/rs_scoretext.mdl", vg_mem.scratch );
+   mdl_load_metadata_block( &mscoreboard, vg_mem.scratch );
+   mdl_async_load_glmesh( &mscoreboard, &world_global.sfd.mesh_base );
+
+   mdl_load_mesh_block( &mscoreboard, vg_mem.scratch );
 
-   mdl_node *pn_backer = mdl_node_from_name( mboard, "backer" );
-   mdl_submesh *backer = &mboard->submesh_buffer[ pn_backer->submesh_start ];
-   mdl_node *pn_card = mdl_node_from_name( mboard, "score_card" );
-   mdl_submesh *card = &mboard->submesh_buffer[ pn_card->submesh_start ];
+   scene_context *scene = &world_global.sfd.scene;
+   vg_async_item *call = scene_alloc_async( scene,
+                                            &world_global.sfd.mesh_display,
+                                            3000, 8000 );
+
+
+   mdl_mesh *m_backer = mdl_find_mesh( &mscoreboard, "backer" ),
+            *m_card   = mdl_find_mesh( &mscoreboard, "score_card" );
+
+   mdl_submesh 
+      *sm_backer = mdl_arritm( &mscoreboard.submeshs, m_backer->submesh_start ),
+      *sm_card   = mdl_arritm( &mscoreboard.submeshs, m_card->submesh_start );
+   world_global.sfd.sm_base = *sm_backer;
 
    m4x3f identity;
    m4x3_identity( identity );
 
-   for( int i=4;i<6;i++ )
-   {
-      u32 vert_start = sc->vertex_count;
-      scene_add_submesh( sc, mboard, card, identity );
+   for( int i=0;i<4;i++ ){
+      u32 vert_start = scene->vertex_count;
+      scene_add_mdl_submesh( scene, &mscoreboard, sm_card, identity );
 
-      for( int j=0; j<card->vertex_count; j++ )
-      {
-         mdl_vert *vert = &sc->arrvertices[ vert_start+j ];
+      for( int j=0; j<sm_card->vertex_count; j++ ){
+         scene_vert *vert = &scene->arrvertices[ vert_start+j ];
 
          float const k_glyph_uvw = 1.0f/64.0f;
-         vert->uv[0] -= k_glyph_uvw * (float)(i-4);
-         vert->colour[0] = 0.0f;
-         vert->colour[1] = i*36;
+         vert->uv[0] -= k_glyph_uvw * (float)(i-1);
+         vert->norm[3] = i*42;
       }
    }
 
-   vg_acquire_thread_sync();
-   {
-      scene_upload( sc, &world.sfd.mesh_display );
-      mdl_unpack_submesh( mboard, &world.sfd.mesh_base, backer );
+   vg_async_dispatch( call, async_scene_upload );
+   vg_tex2d_load_qoi_async_file( "textures/scoretext.qoi", 
+                                 VG_TEX2D_CLAMP|VG_TEX2D_NEAREST,
+                                 &tex_scoretex );
 
-      vg_tex2d_init( (vg_tex2d *[]){ &tex_scoretext }, 1 );
-   }
-   vg_release_thread_sync();
+   mdl_close( &mscoreboard );
 
    int w = 27,
        h = 13;
 
-   world.sfd.w = w;
-   world.sfd.h = h;
-   world.sfd.buffer = vg_linear_alloc( vg_mem.rtmemory, 2*w*h*sizeof(float) );
+   world_global.sfd.w = w;
+   world_global.sfd.h = h;
+   world_global.sfd.buffer = 
+         vg_linear_alloc( vg_mem.rtmemory, 2*w*h*sizeof(float) );
 
    for( int i=0; i<w*h*2; i++ )
-      world.sfd.buffer[i] = 0.0f;
+      world_global.sfd.buffer[i] = 0.0f;
 }
 
 #endif /* SFD_H */