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 );
+
+ if( !mdl_arrcount( &font->mdl.textures ) )
+ vg_fatal_exit_loop( "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 );
vg_acquire_thread_sync();
{
/* 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,
+ vg_tex2d_qoi( data, tex0->file.pack_size,
mdl_pstr( &font->mdl, tex0->file.pstr_path ));
vg_tex2d_nearest();
vg_tex2d_repeat();
}
vg_release_thread_sync();
+
+ mdl_close( &font->mdl );
}
VG_STATIC void font3d_init(void)
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 )
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 );
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];
}