chaos caused by async
[carveJwlIkooP6JGAAIwe30JlM.git] / world_sfd.h
1 /*
2 * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved
3 */
4
5 #ifndef SFD_H
6 #define SFD_H
7
8 #include "world.h"
9 #include "shaders/scene_scoretext.h"
10 #include "shaders/scene_vertex_blend.h"
11
12 GLuint tex_scoretex;
13 float sfd_encode_glyph( char c )
14 {
15 int value = 0;
16 if( c >= 'a' && c <= 'z' )
17 value = c-'a'+11;
18 else if( c >= '0' && c <= '9' )
19 value = c-'0'+1;
20 else if( c >= 'A' && c <= 'Z' )
21 value = c-'A'+11;
22 else if( c >= '\x01' && c <= '\x01'+10 )
23 value = 63-c;
24 else{
25 int base = 11+26;
26
27 switch( c ){
28 case '!': value=base+0; break;
29 case '?': value=base+1; break;
30 case ',': value=base+2; break;
31 case '.': value=base+3; break;
32 case '#': value=base+4; break;
33 case '$': value=base+5; break;
34 case '%': value=base+6; break;
35 case '*': value=base+7; break;
36 case '+': value=base+8; break;
37 case '-': value=base+9; break;
38 case '/': value=base+10; break;
39 case ':': value=base+11; break;
40 default: value=0; break;
41 }
42 }
43
44 return (float)value;
45 }
46
47 VG_STATIC void sfd_encode( u32 row, const char *str )
48 {
49 int end=0;
50 u32 row_h = world_global.sfd.h -1 -row;
51
52 for( int i=0; i<world_global.sfd.w; i++ ){
53 u32 idx = (world_global.sfd.w*row_h + i) * 2;
54
55 if( end ){
56 world_global.sfd.buffer[idx] = 0.0f;
57 }
58 else{
59 if( !str[i] )
60 end = 1;
61
62 world_global.sfd.buffer[idx] = sfd_encode_glyph( str[i] );
63 }
64 }
65 }
66
67 VG_STATIC void sfd_update(void)
68 {
69 for( int i=0; i<world_global.sfd.w*world_global.sfd.h; i++ ){
70 float *target = &world_global.sfd.buffer[i*2+0],
71 *cur = &world_global.sfd.buffer[i*2+1];
72
73 float const rate = vg.time_delta * 15.2313131414f;
74 float d1 = *target-*cur;
75
76 if( fabsf(d1) > rate ){
77 *cur += rate;
78 if( *cur > 60.0f )
79 *cur -= 60.0f;
80 }
81 else
82 *cur = *target;
83 }
84 }
85
86 VG_STATIC void bind_terrain_noise(void);
87 VG_STATIC void sfd_render( world_instance *world, camera *cam, m4x3f transform )
88 {
89 mesh_bind( &world_global.sfd.mesh_display );
90 shader_scene_scoretext_use();
91 shader_scene_scoretext_uTexMain(1);
92
93 world_link_lighting_ub( world, _shader_scene_scoretext.id );
94 world_bind_position_texture( world, _shader_scene_scoretext.id,
95 _uniform_scene_scoretext_g_world_depth, 2 );
96 world_bind_light_array( world, _shader_scene_scoretext.id,
97 _uniform_scene_scoretext_uLightsArray, 3 );
98 world_bind_light_index( world, _shader_scene_scoretext.id,
99 _uniform_scene_scoretext_uLightsIndex, 4 );
100
101 bind_terrain_noise();
102
103 glActiveTexture( GL_TEXTURE1 );
104 glBindTexture( GL_TEXTURE_2D, tex_scoretex );
105
106 m4x4f pvm_prev;
107 m4x3_expand( transform, pvm_prev );
108 m4x4_mul( cam->mtx_prev.pv, pvm_prev, pvm_prev );
109
110 shader_scene_scoretext_uPv( cam->mtx.pv );
111 shader_scene_scoretext_uPvmPrev( pvm_prev );
112 shader_scene_scoretext_uMdl( transform );
113 shader_scene_scoretext_uCamera( cam->transform[3] );
114
115 for( int y=0;y<world_global.sfd.h; y++ ){
116 for( int x=0; x<world_global.sfd.w; x++ ){
117 float value = world_global.sfd.buffer[(y*world_global.sfd.w+x)*2+1];
118 shader_scene_scoretext_uInfo( (v3f){ x,y, value } );
119 mesh_draw( &world_global.sfd.mesh_display );
120 }
121 }
122
123 shader_scene_vertex_blend_use();
124 shader_scene_vertex_blend_uTexGarbage(0);
125 shader_scene_vertex_blend_uTexGradients(1);
126 world_link_lighting_ub( world, _shader_scene_vertex_blend.id );
127 world_bind_position_texture( world, _shader_scene_vertex_blend.id,
128 _uniform_scene_vertex_blend_g_world_depth, 2 );
129 world_bind_light_array( world, _shader_scene_vertex_blend.id,
130 _uniform_scene_vertex_blend_uLightsArray, 3 );
131 world_bind_light_index( world, _shader_scene_vertex_blend.id,
132 _uniform_scene_vertex_blend_uLightsIndex, 4 );
133 bind_terrain_noise();
134 glActiveTexture( GL_TEXTURE1 );
135 glBindTexture( GL_TEXTURE_2D, tex_scoretex );
136
137 shader_scene_vertex_blend_uPv( cam->mtx.pv );
138 shader_scene_vertex_blend_uPvmPrev( pvm_prev );
139 shader_scene_vertex_blend_uMdl( transform );
140 shader_scene_vertex_blend_uCamera( cam->transform[3] );
141
142 mesh_bind( &world_global.sfd.mesh_base );
143 mdl_draw_submesh( &world_global.sfd.sm_base );
144 }
145
146 VG_STATIC int world_sfd_test( int argc, const char *argv[] )
147 {
148 if( argc == 2 ){
149 int row = vg_min( vg_max(atoi(argv[0]),0), world_global.sfd.h);
150 sfd_encode( row, argv[1] );
151 }
152
153 return 0;
154 }
155
156 VG_STATIC void world_sfd_init(void)
157 {
158 vg_info( "world_sfd_init\n" );
159 shader_scene_scoretext_register();
160 vg_console_reg_cmd( "sfd", world_sfd_test, NULL );
161
162 vg_linear_clear( vg_mem.scratch );
163
164 mdl_context mscoreboard;
165 mdl_open( &mscoreboard, "models/rs_scoretext.mdl", vg_mem.scratch );
166 mdl_load_metadata_block( &mscoreboard, vg_mem.scratch );
167 mdl_async_load_glmesh( &mscoreboard, &world_global.sfd.mesh_base );
168
169 mdl_load_mesh_block( &mscoreboard, vg_mem.scratch );
170
171 scene_context *scene = &world_global.sfd.scene;
172 vg_async_item *call = scene_alloc_async( scene,
173 &world_global.sfd.mesh_display,
174 3000, 8000 );
175
176
177 mdl_mesh *m_backer = mdl_find_mesh( &mscoreboard, "backer" ),
178 *m_card = mdl_find_mesh( &mscoreboard, "score_card" );
179
180 mdl_submesh
181 *sm_backer = mdl_arritm( &mscoreboard.submeshs, m_backer->submesh_start ),
182 *sm_card = mdl_arritm( &mscoreboard.submeshs, m_card->submesh_start );
183 world_global.sfd.sm_base = *sm_backer;
184
185 m4x3f identity;
186 m4x3_identity( identity );
187
188 for( int i=0;i<4;i++ ){
189 u32 vert_start = scene->vertex_count;
190 scene_add_mdl_submesh( scene, &mscoreboard, sm_card, identity );
191
192 for( int j=0; j<sm_card->vertex_count; j++ ){
193 scene_vert *vert = &scene->arrvertices[ vert_start+j ];
194
195 float const k_glyph_uvw = 1.0f/64.0f;
196 vert->uv[0] -= k_glyph_uvw * (float)(i-1);
197 vert->norm[3] = i*42;
198 }
199 }
200
201 vg_async_dispatch( call, async_scene_upload );
202 vg_tex2d_load_qoi_async_file( "textures/scoretext.qoi",
203 VG_TEX2D_CLAMP|VG_TEX2D_NEAREST,
204 &tex_scoretex );
205
206 mdl_close( &mscoreboard );
207
208 int w = 27,
209 h = 13;
210
211 world_global.sfd.w = w;
212 world_global.sfd.h = h;
213 world_global.sfd.buffer =
214 vg_linear_alloc( vg_mem.rtmemory, 2*w*h*sizeof(float) );
215
216 for( int i=0; i<w*h*2; i++ )
217 world_global.sfd.buffer[i] = 0.0f;
218 }
219
220 #endif /* SFD_H */