2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
12 #include "shaders/scoretext.h"
13 #include "shaders/vblend.h"
16 vg_tex2d tex_scoretext
= { .path
= "textures/scoretext.qoi",
17 .flags
= VG_TEXTURE_CLAMP
|VG_TEXTURE_NEAREST
};
20 * TODO: utf-8 -> ascii
23 float sfd_encode_glyph( char c
)
26 if( c
>= 'a' && c
<= 'z' )
28 else if( c
>= '0' && c
<= '9' )
30 else if( c
>= 'A' && c
<= 'Z' )
32 else if( c
>= '\x01' && c
<= '\x01'+10 )
40 case '!': value
=base
+0; break;
41 case '?': value
=base
+1; break;
42 case ',': value
=base
+2; break;
43 case '.': value
=base
+3; break;
44 case '#': value
=base
+4; break;
45 case '$': value
=base
+5; break;
46 case '%': value
=base
+6; break;
47 case '*': value
=base
+7; break;
48 case '+': value
=base
+8; break;
49 case '-': value
=base
+9; break;
50 case '/': value
=base
+10; break;
51 case ':': value
=base
+11; break;
52 default: value
=0; break;
59 VG_STATIC
void sfd_encode( u32 row
, const char *str
)
62 u32 row_h
= world_global
.sfd
.h
-1 -row
;
64 for( int i
=0; i
<world_global
.sfd
.w
; i
++ )
66 u32 idx
= (world_global
.sfd
.w
*row_h
+ i
) * 2;
70 world_global
.sfd
.buffer
[idx
] = 0.0f
;
77 world_global
.sfd
.buffer
[idx
] = sfd_encode_glyph( str
[i
] );
82 VG_STATIC
void sfd_init( u32 w
, u32 h
)
86 VG_STATIC
void sfd_update(void)
88 for( int i
=0; i
<world_global
.sfd
.w
*world_global
.sfd
.h
; i
++ )
90 float *target
= &world_global
.sfd
.buffer
[i
*2+0],
91 *cur
= &world_global
.sfd
.buffer
[i
*2+1];
93 float const rate
= vg
.time_delta
* 15.2313131414f
;
94 float d1
= *target
-*cur
;
96 if( fabsf(d1
) > rate
)
107 VG_STATIC
void bind_terrain_noise(void);
108 VG_STATIC
void sfd_render( camera
*cam
, m4x3f transform
)
111 mesh_bind( &world
.sfd
.mesh_display
);
112 shader_scoretext_use();
113 shader_scoretext_uTexGarbage(0);
114 shader_scoretext_uTexGradients(1);
115 shader_link_standard_ub( _shader_scoretext
.id
, 2 );
116 bind_terrain_noise();
117 vg_tex2d_bind( &tex_scoretext
, 1 );
120 m4x3_expand( transform
, pvm_prev
);
121 m4x4_mul( cam
->mtx_prev
.pv
, pvm_prev
, pvm_prev
);
123 shader_scoretext_uPv( cam
->mtx
.pv
);
124 shader_scoretext_uPvmPrev( pvm_prev
);
125 shader_scoretext_uMdl( transform
);
126 shader_scoretext_uCamera( cam
->transform
[3] );
128 for( int y
=0;y
<world
.sfd
.h
; y
++ )
130 for( int x
=0; x
<world
.sfd
.w
; x
++ )
132 float value
= world
.sfd
.buffer
[(y
*world
.sfd
.w
+x
)*2+1];
133 shader_scoretext_uInfo( (v3f
){ x
,y
, value
} );
134 mesh_draw( &world
.sfd
.mesh_display
);
139 shader_vblend_uTexGarbage(0);
140 shader_vblend_uTexGradients(1);
141 shader_link_standard_ub( _shader_vblend
.id
, 2 );
142 bind_terrain_noise();
143 vg_tex2d_bind( &tex_scoretext
, 1 );
145 shader_vblend_uPv( cam
->mtx
.pv
);
146 shader_vblend_uPvmPrev( pvm_prev
);
148 shader_vblend_uMdl( transform
);
149 shader_vblend_uCamera( cam
->transform
[3] );
151 mesh_bind( &world
.sfd
.mesh_base
);
152 mesh_draw( &world
.sfd
.mesh_base
);
156 VG_STATIC
int world_sfd_test( int argc
, const char *argv
[] )
160 int row
= vg_min( vg_max(atoi(argv
[0]),0), world_global
.sfd
.h
);
161 sfd_encode( row
, argv
[1] );
167 VG_STATIC
void world_sfd_init(void)
169 vg_info( "world_sfd_init\n" );
172 shader_scoretext_register();
175 vg_function_push( (struct vg_cmd
){
177 .function
= world_sfd_test
180 vg_linear_clear( vg_mem
.scratch
);
181 mdl_context
*mboard
=
182 mdl_load_full( vg_mem
.scratch
, "models/rs_scoretext.mdl" );
184 scene
*sc
= scene_init( vg_mem
.scratch
, 3000, 8000 );
186 mdl_node
*pn_backer
= mdl_node_from_name( mboard
, "backer" );
187 mdl_submesh
*backer
= &mboard
->submesh_buffer
[ pn_backer
->submesh_start
];
188 mdl_node
*pn_card
= mdl_node_from_name( mboard
, "score_card" );
189 mdl_submesh
*card
= &mboard
->submesh_buffer
[ pn_card
->submesh_start
];
192 m4x3_identity( identity
);
194 /* FIXME: dont use scene header for this you fucking idiots */
195 for( int i
=4;i
<6;i
++ )
197 u32 vert_start
= sc
->vertex_count
;
198 scene_add_mdl_submesh( sc
, mboard
, card
, identity
);
201 for( int j
=0; j
<card
->vertex_count
; j
++ )
203 mdl_vert
*vert
= &sc
->arrvertices
[ vert_start
+j
];
205 float const k_glyph_uvw
= 1.0f
/64.0f
;
206 vert
->uv
[0] -= k_glyph_uvw
* (float)(i
-4);
207 vert
->colour
[0] = 0.0f
;
208 vert
->colour
[1] = i
*36;
213 vg_acquire_thread_sync();
215 scene_upload( sc
, &world_global
.sfd
.mesh_display
);
216 mdl_unpack_submesh( mboard
, &world_global
.sfd
.mesh_base
, backer
);
218 vg_tex2d_init( (vg_tex2d
*[]){ &tex_scoretext
}, 1 );
220 vg_release_thread_sync();
225 world_global
.sfd
.w
= w
;
226 world_global
.sfd
.h
= h
;
227 world_global
.sfd
.buffer
=
228 vg_linear_alloc( vg_mem
.rtmemory
, 2*w
*h
*sizeof(float) );
230 for( int i
=0; i
<w
*h
*2; i
++ )
231 world_global
.sfd
.buffer
[i
] = 0.0f
;