sfd
[carveJwlIkooP6JGAAIwe30JlM.git] / world_sfd.h
index 88a86396e5fd700fdaef3fc0108dcf3301c94cb3..69501e288723cfd81a5aa5996b1788f838ce8e23 100644 (file)
@@ -1,25 +1,17 @@
 /*
- * 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"
-
-#if 0
-#if 0
-#include "shaders/scoretext.h"
-#include "shaders/vblend.h"
-#endif
+#include "shaders/scene_scoretext.h"
+#include "shaders/scene_vertex_blend.h"
 
 vg_tex2d tex_scoretext = { .path = "textures/scoretext.qoi",
                            .flags = VG_TEXTURE_CLAMP|VG_TEXTURE_NEAREST };
 
-/* 
- * TODO: utf-8 -> ascii
- */
-
 float sfd_encode_glyph( char c )
 {
    int value = 0;
@@ -31,12 +23,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;
@@ -61,16 +51,13 @@ VG_STATIC void sfd_encode( u32 row, const char *str )
    int end=0;
    u32 row_h = world_global.sfd.h -1 -row;
 
-   for( int i=0; i<world_global.sfd.w; i++ )
-   {
+   for( int i=0; i<world_global.sfd.w; i++ ){
       u32 idx = (world_global.sfd.w*row_h + i) * 2;
 
-      if( end )
-      {
+      if( end ){
          world_global.sfd.buffer[idx] = 0.0f;
       }
-      else
-      {
+      else{
          if( !str[i] )
             end = 1;
 
@@ -79,22 +66,16 @@ VG_STATIC void sfd_encode( u32 row, const char *str )
    }
 }
 
-VG_STATIC void sfd_init( u32 w, u32 h )
-{
-}
-
 VG_STATIC void sfd_update(void)
 {
-   for( int i=0; i<world_global.sfd.w*world_global.sfd.h; i++ )
-   {
+   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;
@@ -105,14 +86,20 @@ VG_STATIC void sfd_update(void)
 }
 
 VG_STATIC void bind_terrain_noise(void);
-VG_STATIC void sfd_render( camera *cam, m4x3f transform )
+VG_STATIC void sfd_render( world_instance *world, camera *cam, m4x3f transform )
 {
-#if 0
-   mesh_bind( &world.sfd.mesh_display );
-   shader_scoretext_use();
-   shader_scoretext_uTexGarbage(0);
-   shader_scoretext_uTexGradients(1);
-   shader_link_standard_ub( _shader_scoretext.id, 2 );
+   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 );
+
    bind_terrain_noise();
    vg_tex2d_bind( &tex_scoretext, 1 );
 
@@ -120,43 +107,44 @@ VG_STATIC void sfd_render( camera *cam, m4x3f transform )
    m4x3_expand( transform, pvm_prev );
    m4x4_mul( cam->mtx_prev.pv, pvm_prev, pvm_prev );
 
-   shader_scoretext_uPv( cam->mtx.pv );
-   shader_scoretext_uPvmPrev( pvm_prev );
-   shader_scoretext_uMdl( transform );
-   shader_scoretext_uCamera( cam->transform[3] );
+   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.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 );
+   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 );
 
-   shader_vblend_uPv( cam->mtx.pv );
-   shader_vblend_uPvmPrev( pvm_prev );
-
-   shader_vblend_uMdl( transform );
-   shader_vblend_uCamera( cam->transform[3] );
+   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 );
-#endif
+   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 )
-   {
+   if( argc == 2 ){
       int row = vg_min( vg_max(atoi(argv[0]),0), world_global.sfd.h);
       sfd_encode( row, argv[1] );
    }
@@ -167,10 +155,7 @@ VG_STATIC int world_sfd_test( int argc, const char *argv[] )
 VG_STATIC void world_sfd_init(void)
 {
    vg_info( "world_sfd_init\n" );
-
-#if 0
-   shader_scoretext_register();
-#endif
+   shader_scene_scoretext_register();
 
        vg_function_push( (struct vg_cmd){
                .name = "sfd",
@@ -178,43 +163,44 @@ VG_STATIC void world_sfd_init(void)
        });
 
    vg_linear_clear( vg_mem.scratch );
-   mdl_context *mboard = 
-      mdl_load_full( vg_mem.scratch, "models/rs_scoretext.mdl" );
+
+   mdl_context mscoreboard;
+   mdl_open( &mscoreboard, "models/rs_scoretext.mdl", vg_mem.scratch );
+   mdl_load_metadata_block( &mscoreboard, vg_mem.scratch );
+   mdl_load_mesh_block( &mscoreboard, vg_mem.scratch );
 
    scene *sc = scene_init( vg_mem.scratch, 3000, 8000 );
 
-   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 ];
+   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;
+
+   mdl_close( &mscoreboard );
 
    m4x3f identity;
    m4x3_identity( identity );
 
-   /* FIXME: dont use scene header for this you fucking idiots */
-   for( int i=4;i<6;i++ )
-   {
+   for( int i=0;i<4;i++ ){
       u32 vert_start = sc->vertex_count;
-      scene_add_mdl_submesh( sc, mboard, card, identity );
+      scene_add_mdl_submesh( sc, &mscoreboard, sm_card, identity );
 
-#if 0
-      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 = &sc->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;
       }
-#endif
    }
 
    vg_acquire_thread_sync();
    {
       scene_upload( sc, &world_global.sfd.mesh_display );
-      mdl_unpack_submesh( mboard, &world_global.sfd.mesh_base, backer );
-
+      mdl_unpack_glmesh( &mscoreboard, &world_global.sfd.mesh_base );
       vg_tex2d_init( (vg_tex2d *[]){ &tex_scoretext }, 1 );
    }
    vg_release_thread_sync();
@@ -225,11 +211,10 @@ VG_STATIC void world_sfd_init(void)
    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) );
+         vg_linear_alloc( vg_mem.rtmemory, 2*w*h*sizeof(float) );
 
    for( int i=0; i<w*h*2; i++ )
       world_global.sfd.buffer[i] = 0.0f;
 }
-#endif
 
 #endif /* SFD_H */