chaos caused by async
[carveJwlIkooP6JGAAIwe30JlM.git] / font.h
diff --git a/font.h b/font.h
index 4c7d8f46f1e09ad0a970bf13d34af0b8b22c6b20..9b5a13b8b354aa18f8a4972f86749e86784a9192 100644 (file)
--- a/font.h
+++ b/font.h
@@ -31,29 +31,20 @@ VG_STATIC void font3d_load( font3d *font, const char *mdl_path, void *alloc )
    mdl_load_array( &font->mdl, &font->glyphs, "ent_glyph", alloc );
 
    vg_linear_clear( vg_mem.scratch );
-   mdl_load_mesh_block( &font->mdl, vg_mem.scratch );
-   mdl_load_pack_block( &font->mdl, vg_mem.scratch );
-   mdl_close( &font->mdl );
 
-   vg_acquire_thread_sync();
-   {
-      /* upload mesh */
-      mesh_upload( &font->mesh, 
-                     font->mdl.verts.data, font->mdl.verts.count,
-                     font->mdl.indices.data, font->mdl.indices.count );
-
-      /* upload first texture */
-      font->texture = vg_tex2d_new();
-      mdl_texture *tex0 = mdl_arritm( &font->mdl.textures, 0 );
-
-      vg_tex2d_set_error();
-      vg_tex2d_qoi( mdl_arritm( &font->mdl.pack, tex0->file.pack_offset ),
-                    tex0->file.pack_size,
-                    mdl_pstr( &font->mdl, tex0->file.pstr_path ));
-      vg_tex2d_nearest();
-      vg_tex2d_repeat();
-   }
-   vg_release_thread_sync();
+   if( !mdl_arrcount( &font->mdl.textures ) )
+      vg_fatal_error( "No texture in font file" );
+
+   mdl_texture *tex0 = mdl_arritm( &font->mdl.textures, 0 );
+   void *data = vg_linear_alloc( vg_mem.scratch, tex0->file.pack_size );
+   mdl_fread_pack_file( &font->mdl, &tex0->file, data );
+
+   mdl_async_load_glmesh( &font->mdl, &font->mesh );
+   vg_tex2d_load_qoi_async( data, tex0->file.pack_size, 
+                            VG_TEX2D_NEAREST|VG_TEX2D_REPEAT|VG_TEX2D_NOMIP,
+                            &font->texture );
+
+   mdl_close( &font->mdl );
 }
 
 VG_STATIC void font3d_init(void)
@@ -86,6 +77,17 @@ VG_STATIC void font3d_bind( font3d *font, camera *cam )
    mesh_bind( &font->mesh );
 }
 
+VG_STATIC ent_glyph *font3d_glyph( font3d *font, u32 variant_id, u32 utf32 )
+{
+   if( utf32 < font->info.glyph_utf32_base ) return NULL;
+   if( utf32 >= font->info.glyph_utf32_base+font->info.glyph_count) return NULL;
+
+   u32 index = utf32 - font->info.glyph_utf32_base;
+       index += font->info.glyph_start;
+       index += font->info.glyph_count * variant_id;
+   return mdl_arritm( &font->glyphs, index );
+}
+
 VG_STATIC 
 void font3d_simple_draw( font3d *font, u32 variant_id, const char *text, 
                          camera *cam, m4x3f transform )
@@ -105,13 +107,8 @@ void font3d_simple_draw( font3d *font, u32 variant_id, const char *text,
       u32 c = text[i];
       if(!c) break;
 
-      if( c < font->info.glyph_utf32_base ) continue;
-      if( c >= font->info.glyph_utf32_base+font->info.glyph_count) continue;
-
-      u32 index = c - font->info.glyph_utf32_base;
-          index += font->info.glyph_start;
-          index += font->info.glyph_count * variant_id;
-      ent_glyph *glyph = mdl_arritm( &font->glyphs, index );
+      ent_glyph *glyph = font3d_glyph( font, variant_id, c );
+      if( !glyph ) continue;
 
       if( glyph->indice_count ){
          shader_model_font_uOffset( offset );
@@ -129,13 +126,8 @@ float font3d_string_width( font3d *font, u32 variant_id, const char *text )
       u32 c = text[i];
       if(!c) break;
 
-      if( c < font->info.glyph_utf32_base ) continue;
-      if( c >= font->info.glyph_utf32_base+font->info.glyph_count) continue;
-
-      u32 index = c - font->info.glyph_utf32_base;
-          index += font->info.glyph_start;
-          index += font->info.glyph_count * variant_id;
-      ent_glyph *glyph = mdl_arritm( &font->glyphs, index );
+      ent_glyph *glyph = font3d_glyph( font, variant_id, c );
+      if( !glyph ) continue;
 
       width += glyph->size[0];
    }