7 #include "shaders/model_font.h"
9 typedef struct font3d font3d
;
16 mdl_array_ptr font_variants
,
20 VG_STATIC
void font3d_load( font3d
*font
, const char *mdl_path
, void *alloc
)
22 mdl_open( &font
->mdl
, mdl_path
, alloc
);
23 mdl_load_metadata_block( &font
->mdl
, alloc
);
25 vg_linear_clear( vg_mem
.scratch
);
27 mdl_load_array( &font
->mdl
, &fonts
, "ent_font", vg_mem
.scratch
);
28 font
->info
= *((ent_font
*)mdl_arritm(&fonts
,0));
30 mdl_load_array( &font
->mdl
, &font
->font_variants
, "ent_font_variant", alloc
);
31 mdl_load_array( &font
->mdl
, &font
->glyphs
, "ent_glyph", alloc
);
33 vg_linear_clear( vg_mem
.scratch
);
35 if( !mdl_arrcount( &font
->mdl
.textures
) )
36 vg_fatal_error( "No texture in font file" );
38 mdl_texture
*tex0
= mdl_arritm( &font
->mdl
.textures
, 0 );
39 void *data
= vg_linear_alloc( vg_mem
.scratch
, tex0
->file
.pack_size
);
40 mdl_fread_pack_file( &font
->mdl
, &tex0
->file
, data
);
42 mdl_async_load_glmesh( &font
->mdl
, &font
->mesh
);
43 vg_tex2d_load_qoi_async( data
, tex0
->file
.pack_size
,
44 VG_TEX2D_NEAREST
|VG_TEX2D_REPEAT
|VG_TEX2D_NOMIP
,
47 mdl_close( &font
->mdl
);
50 VG_STATIC
void font3d_init(void)
52 shader_model_font_register();
55 VG_STATIC u32
font3d_find_variant( font3d
*font
, const char *name
)
57 for( u32 i
=0; i
<mdl_arrcount( &font
->font_variants
); i
++ ){
58 ent_font_variant
*variant
= mdl_arritm( &font
->font_variants
, i
);
60 if( !strcmp( mdl_pstr( &font
->mdl
, variant
->name
), name
) ){
68 VG_STATIC
void font3d_bind( font3d
*font
, camera
*cam
)
70 shader_model_font_use();
71 shader_model_font_uColour( (v4f
){1.0f
,1.0f
,1.0f
,1.0f
} );
72 shader_model_font_uTexMain( 1 );
73 glActiveTexture( GL_TEXTURE1
);
74 glBindTexture( GL_TEXTURE_2D
, font
->texture
);
76 shader_model_font_uPv( cam
->mtx
.pv
);
77 mesh_bind( &font
->mesh
);
80 VG_STATIC ent_glyph
*font3d_glyph( font3d
*font
, u32 variant_id
, u32 utf32
)
82 if( utf32
< font
->info
.glyph_utf32_base
) return NULL
;
83 if( utf32
>= font
->info
.glyph_utf32_base
+font
->info
.glyph_count
) return NULL
;
85 u32 index
= utf32
- font
->info
.glyph_utf32_base
;
86 index
+= font
->info
.glyph_start
;
87 index
+= font
->info
.glyph_count
* variant_id
;
88 return mdl_arritm( &font
->glyphs
, index
);
92 void font3d_simple_draw( font3d
*font
, u32 variant_id
, const char *text
,
93 camera
*cam
, m4x3f transform
)
100 m4x3_expand( transform
, prev_mtx
);
101 m4x4_mul( cam
->mtx_prev
.pv
, prev_mtx
, prev_mtx
);
103 shader_model_font_uPvmPrev( prev_mtx
);
104 shader_model_font_uMdl( transform
);
106 for( int i
=0;; i
++ ){
110 ent_glyph
*glyph
= font3d_glyph( font
, variant_id
, c
);
111 if( !glyph
) continue;
113 if( glyph
->indice_count
){
114 shader_model_font_uOffset( offset
);
115 mesh_drawn( glyph
->indice_start
, glyph
->indice_count
);
117 offset
[0] += glyph
->size
[0];
122 float font3d_string_width( font3d
*font
, u32 variant_id
, const char *text
)
125 for( int i
=0;; i
++ ){
129 ent_glyph
*glyph
= font3d_glyph( font
, variant_id
, c
);
130 if( !glyph
) continue;
132 width
+= glyph
->size
[0];