From 3d9fac265811d7ed6e5399de90ad8f0e196fa163 Mon Sep 17 00:00:00 2001 From: hgn Date: Mon, 6 Oct 2025 12:33:29 +0000 Subject: [PATCH] graveyard --- .gitignore | 1 + build_texsheet.sh | 1 - compile_font.sh | 1 - labs/build.c | 29 - labs/build.sh | 1 - labs/physics.c | 579 --------- labs/vg | 1 - laptop_gpu.c | 9 - metacompiler.kv | 3 - projects/bird_profiles.txt | 21 - projects/birds | Bin 1734560 -> 0 bytes projects/birds.c | 283 ----- src/fontcomp.c | 67 -- src/fonts/vg_font.png | Bin 4974 -> 0 bytes src/fonts/vg_font_thin.png | Bin 11087 -> 0 bytes src/fonts/vg_font_thin.xcf | Bin 165876 -> 0 bytes src/fonts/vg_font_thin_3.png | Bin 22853 -> 0 bytes src/fonts/vg_font_thin_3.xcf | Bin 638713 -> 0 bytes src/fonts/vg_font_thin_old.png | Bin 8807 -> 0 bytes src/fonts/vg_font_thin_v0.png | Bin 9520 -> 0 bytes src/fonts/vg_font_thin_v1.png | Bin 12989 -> 0 bytes src/metacompiler.c | 4 - src/msgdump.c | 59 - src/qoiconv.c | 98 -- src/shader.c | 242 ---- src/template/main.c | 37 - src/template/vg.conf | 2 - src/template/vg_config.h | 18 - src/texsheet.c | 271 ----- src/tools.sh | 37 - src/vg/vg_store.h | 680 ----------- src/vgcrashreport.c | 281 ----- test.kv | 3 - unit_engine.c | 5 - unit_thirdparty.c | 2 - vg.h | 86 -- vg.hconf | 194 --- vg_array_file.c | 0 vg_async2.c | 225 ---- vg_async2.h | 99 -- vg_audio.h | 262 ----- vg_audio_dsp.c | 272 ----- vg_audio_dsp.h | 61 - vg_audio_synth_bird.c | 414 ------- vg_audio_synth_bird.h | 63 - vg_binstr.c | 21 - vg_binstr.h | 11 - vg_build.h | 533 --------- vg_build_font.h | 156 --- vg_build_utils_shader.h | 359 ------ vg_bvh.h | 119 -- vg_camera.c | 76 -- vg_camera.h | 53 - vg_console.c | 318 ----- vg_console.h | 85 -- vg_db.c | 898 -------------- vg_db.h | 159 --- vg_depencies.c | 83 -- vg_engine.c | 559 --------- vg_engine.h | 187 --- vg_font.h | 23 - vg_framebuffer.c | 541 --------- vg_framebuffer.h | 96 -- vg_image.h | 6 - vg_input.c | 609 ---------- vg_input.h | 93 -- vg_io.c | 385 ------ vg_io.h | 81 -- vg_kv.c | 543 --------- vg_kv.h | 126 -- vg_lines.c | 311 ----- vg_lines.h | 52 - vg_loader.c | 82 -- vg_loader.h | 37 - vg_log.c | 260 ---- vg_log.h | 65 - vg_magi.c | 325 ----- vg_magi.h | 58 - vg_mem.c | 190 --- vg_mem.h | 58 - vg_mem_pool.c | 94 -- vg_mem_pool.h | 39 - vg_mem_view.c | 527 --------- vg_mem_view.h | 6 - vg_msg.c | 599 ---------- vg_msg.h | 128 -- vg_mutex.h | 45 - vg_opengl.c | 38 - vg_opengl.h | 3 - vg_opt.c | 260 ---- vg_opt.h | 23 - vg_perlin.h | 10 - vg_platform.h | 106 -- vg_profiler.h | 14 - vg_pxfont.h | 257 ---- vg_pxfont_thin.h | 1025 ---------------- vg_render.c | 175 --- vg_render.h | 35 - vg_rigidbody_view.c | 204 ---- vg_rigidbody_view.h | 12 - vg_settings.c | 457 ------- vg_settings.h | 9 - vg_shader.h | 27 - vg_steam2.h | 1209 ------------------- vg_string.c | 571 --------- vg_string.h | 110 -- vg_tex.h | 66 -- vg_thirdparty.c | 2 - vg_tool.c | 10 - vg_tool.h | 2 - vg_tower.c | 72 -- vg_tower.h | 33 - vg_ui/console.c | 408 ------- vg_ui/console.h | 10 - vg_ui/filebrowser.c | 476 -------- vg_ui/filebrowser.h | 57 - vg_ui/imgui.c | 2029 -------------------------------- vg_ui/imgui.h | 381 ------ vg_ui/imgui_impl_opengl.c | 313 ----- vg_ui/imgui_impl_opengl.h | 28 - vg_vorbis.c | 69 -- vg_vorbis.h | 4 - vg_window.c | 255 ---- vg_window.h | 42 - 124 files changed, 1 insertion(+), 22208 deletions(-) delete mode 100755 build_texsheet.sh delete mode 100755 compile_font.sh delete mode 100644 labs/build.c delete mode 100755 labs/build.sh delete mode 100644 labs/physics.c delete mode 120000 labs/vg delete mode 100644 laptop_gpu.c delete mode 100644 metacompiler.kv delete mode 100644 projects/bird_profiles.txt delete mode 100755 projects/birds delete mode 100644 projects/birds.c delete mode 100644 src/fontcomp.c delete mode 100644 src/fonts/vg_font.png delete mode 100644 src/fonts/vg_font_thin.png delete mode 100644 src/fonts/vg_font_thin.xcf delete mode 100644 src/fonts/vg_font_thin_3.png delete mode 100644 src/fonts/vg_font_thin_3.xcf delete mode 100644 src/fonts/vg_font_thin_old.png delete mode 100644 src/fonts/vg_font_thin_v0.png delete mode 100644 src/fonts/vg_font_thin_v1.png delete mode 100644 src/metacompiler.c delete mode 100644 src/msgdump.c delete mode 100644 src/qoiconv.c delete mode 100644 src/shader.c delete mode 100644 src/template/main.c delete mode 100644 src/template/vg.conf delete mode 100644 src/template/vg_config.h delete mode 100644 src/texsheet.c delete mode 100644 src/tools.sh delete mode 100644 src/vg/vg_store.h delete mode 100644 src/vgcrashreport.c delete mode 100644 test.kv delete mode 100644 unit_engine.c delete mode 100644 unit_thirdparty.c delete mode 100644 vg.h delete mode 100644 vg.hconf delete mode 100644 vg_array_file.c delete mode 100644 vg_async2.c delete mode 100644 vg_async2.h delete mode 100644 vg_audio.h delete mode 100644 vg_audio_dsp.c delete mode 100644 vg_audio_dsp.h delete mode 100644 vg_audio_synth_bird.c delete mode 100644 vg_audio_synth_bird.h delete mode 100644 vg_binstr.c delete mode 100644 vg_binstr.h delete mode 100644 vg_build.h delete mode 100644 vg_build_font.h delete mode 100644 vg_build_utils_shader.h delete mode 100644 vg_bvh.h delete mode 100644 vg_camera.c delete mode 100644 vg_camera.h delete mode 100644 vg_console.c delete mode 100644 vg_console.h delete mode 100644 vg_db.c delete mode 100644 vg_db.h delete mode 100644 vg_depencies.c delete mode 100644 vg_engine.c delete mode 100644 vg_engine.h delete mode 100644 vg_font.h delete mode 100644 vg_framebuffer.c delete mode 100644 vg_framebuffer.h delete mode 100644 vg_image.h delete mode 100644 vg_input.c delete mode 100644 vg_input.h delete mode 100644 vg_io.c delete mode 100644 vg_io.h delete mode 100644 vg_kv.c delete mode 100644 vg_kv.h delete mode 100644 vg_lines.c delete mode 100644 vg_lines.h delete mode 100644 vg_loader.c delete mode 100644 vg_loader.h delete mode 100644 vg_log.c delete mode 100644 vg_log.h delete mode 100644 vg_magi.c delete mode 100644 vg_magi.h delete mode 100644 vg_mem.c delete mode 100644 vg_mem.h delete mode 100644 vg_mem_pool.c delete mode 100644 vg_mem_pool.h delete mode 100644 vg_mem_view.c delete mode 100644 vg_mem_view.h delete mode 100644 vg_msg.c delete mode 100644 vg_msg.h delete mode 100644 vg_mutex.h delete mode 100644 vg_opengl.c delete mode 100644 vg_opengl.h delete mode 100644 vg_opt.c delete mode 100644 vg_opt.h delete mode 100644 vg_perlin.h delete mode 100644 vg_platform.h delete mode 100644 vg_profiler.h delete mode 100644 vg_pxfont.h delete mode 100644 vg_pxfont_thin.h delete mode 100644 vg_render.c delete mode 100644 vg_render.h delete mode 100644 vg_rigidbody_view.c delete mode 100644 vg_rigidbody_view.h delete mode 100644 vg_settings.c delete mode 100644 vg_settings.h delete mode 100644 vg_shader.h delete mode 100644 vg_steam2.h delete mode 100644 vg_string.c delete mode 100644 vg_string.h delete mode 100644 vg_tex.h delete mode 100644 vg_thirdparty.c delete mode 100644 vg_tool.c delete mode 100644 vg_tool.h delete mode 100644 vg_tower.c delete mode 100644 vg_tower.h delete mode 100644 vg_ui/console.c delete mode 100644 vg_ui/console.h delete mode 100644 vg_ui/filebrowser.c delete mode 100644 vg_ui/filebrowser.h delete mode 100644 vg_ui/imgui.c delete mode 100644 vg_ui/imgui.h delete mode 100644 vg_ui/imgui_impl_opengl.c delete mode 100644 vg_ui/imgui_impl_opengl.h delete mode 100644 vg_vorbis.c delete mode 100644 vg_vorbis.h delete mode 100644 vg_window.c delete mode 100644 vg_window.h diff --git a/.gitignore b/.gitignore index 9b172f3..7b0600c 100755 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ *.gh bin/ +graveyard/ diff --git a/build_texsheet.sh b/build_texsheet.sh deleted file mode 100755 index abc0195..0000000 --- a/build_texsheet.sh +++ /dev/null @@ -1 +0,0 @@ -clang -fsanitize=address -O0 -I. -DVG_BUILD src/texsheet.c -o /tmp/tmpsr && /tmp/tmpsr $@ diff --git a/compile_font.sh b/compile_font.sh deleted file mode 100755 index 929b865..0000000 --- a/compile_font.sh +++ /dev/null @@ -1 +0,0 @@ -./vg/bin/fontcomp vg/src/fonts/vg_font_thin.png vg/vg_pxfont_thin.h diff --git a/labs/build.c b/labs/build.c deleted file mode 100644 index 973f420..0000000 --- a/labs/build.c +++ /dev/null @@ -1,29 +0,0 @@ -#include "vg/vg_build.h" -#include "vg/vg_build_utils_shader.h" - -void s_lab_physics(void){ - vg_info( "running script: s_lab_physics(void)\n" ); - - struct vg_project project; - struct vg_env env = vg_test_env; - - vg_project_init( &project, &vg_test_env, "labs" ); - vg_project_new_target( &project, "physics", k_obj_type_exe ); - vg_add_engine( &project, NULL ); - vg_add_source( &project, "physics.c" ); - vg_compile_project( &project ); - vg_success( "Completed 1/1\n" ); -} - -int main( int argc, char *argv[] ){ - char *arg; - while( vg_argp( argc, argv ) ){ - if( vg_long_opt( "physics" ) ) - s_lab_physics(); - - if( vg_opt('r') ) - vg_test_env.optimization = 3; - } - - vg_success( "All scripts ran successfully\n" ); -} diff --git a/labs/build.sh b/labs/build.sh deleted file mode 100755 index f5175ea..0000000 --- a/labs/build.sh +++ /dev/null @@ -1 +0,0 @@ -clang -fsanitize=address -O0 -I./vg build.c vg/vg_tool.c -o /tmp/tmpsr && /tmp/tmpsr $@ diff --git a/labs/physics.c b/labs/physics.c deleted file mode 100644 index c570a31..0000000 --- a/labs/physics.c +++ /dev/null @@ -1,579 +0,0 @@ -#include "vg/vg_engine.h" -#include "vg/vg_opt.h" -#include "vg/vg_audio.h" -#include "vg/vg_camera.h" -#include "vg/vg_rigidbody.h" -#include "vg/vg_rigidbody_collision.h" -#include "vg/vg_rigidbody_view.h" -#include "vg/vg_profiler.h" -#include "vg/vg_bvh.h" -#include "vg/vg_input.h" - -#define SHAPE_MAX 256 -static rigidbody shapes[SHAPE_MAX]; -static rb_capsule shapes_inf[SHAPE_MAX]; -static v4f shapes_colour[SHAPE_MAX]; -static boxf shapes_bbx[SHAPE_MAX]; - -static boxf floor_box = {{-6.999,-2.001,-6.999},{6.999,-0.999,6.999}}; - -static rigidbody racket; - -static f32 k_iterations = 8.0f, - k_view_x = 0.0f, - k_view_y = 0.2f, - k_view_z = 10.0f, - k_shapes = 32.0f, - k_racket_d = 8.0f; - -static rb_capsule racket_ca = { .h = 4.3f, .r = 0.6f }, - racket_cb = { .h = 5.5f, .r = 0.9f }; -static m4x3f racket_a_mdl, racket_b_mdl; -static m3x3f racket_I; - -static v3f k_racket_init_w; -static i32 k_demo = 0; -static i32 k_gyro = 0; -static i32 k_prof_normalize = 0; -static i32 k_bbx = 1; -static i32 k_spacial = 0; - -static struct vg_profile prof_refit = { .name = "Refit" }, - prof_broad = { .name = "Broad phase", - .mode = k_profile_mode_accum }, - prof_narrow = { .name = "Narrow phase", - .mode = k_profile_mode_accum }, - prof_solve = { .name = "Solver" }; - -static void shape_bvh_expand_bound( void *user, boxf bound, u32 item_index ){ - box_concat( bound, shapes_bbx[item_index] ); -} - -static f32 shape_bvh_centroid( void *user, u32 item_index, int axis ){ - f32 x = shapes_bbx[item_index][0][axis] + shapes_bbx[item_index][1][axis]; - return x*0.5f; -} - -static void shape_bvh_closest( void *user, u32 item_index, - v3f point, v3f closest ){ - closest_point_aabb( point, shapes_bbx[item_index], closest ); -} - -static void shape_bvh_swap( void *user, u32 ia, u32 ib ){ - rigidbody temp = shapes[ib]; - shapes[ib] = shapes[ia]; - shapes[ia] = temp; - - rb_capsule cb = shapes_inf[ib]; - shapes_inf[ib] = shapes_inf[ia]; - shapes_inf[ia] = cb; - - v4f colourb; - v4_copy( shapes_colour[ib], colourb ); - v4_copy( shapes_colour[ia], shapes_colour[ib] ); - v4_copy( colourb, shapes_colour[ia] ); - - boxf boxb; - box_copy( shapes_bbx[ib], boxb ); - box_copy( shapes_bbx[ia], shapes_bbx[ib] ); - box_copy( boxb, shapes_bbx[ia] ); -} - -static bh_system shape_bvh = { - .expand_bound = shape_bvh_expand_bound, - .item_centroid = shape_bvh_centroid, - .item_closest = shape_bvh_closest, - .item_swap = shape_bvh_swap -}; - -static bh_tree *shape_bvh_tree = NULL; - -int main( int argc, char *argv[] ){ - vg_mem.use_libc_malloc = 0; - vg_set_mem_quota( 80*1024*1024 ); - vg_enter( argc, argv, "Voyager Game Engine" ); - return 0; -} - -void vg_launch_opt(void){ - const char *arg; -} - -void vg_preload(void) -{ - vg_audio.dsp_enabled = 0; -} - -static void init_random(void) -{ - for( u32 i=0; i<(u32)k_shapes; i ++ ){ - f32 h = vg_randf64( &vg.rand ) * 2.0f + 1.3f, - r = vg_randf64( &vg.rand ) * 0.5f + 0.125f, - pv = vg_capsule_volume( r, h ), - k_density = 8.0f, - pm = pv * k_density; - - shapes_inf[i].r = r; - shapes_inf[i].h = h; - - m3x3f pI; - vg_capsule_inertia( r, h, pm, pI ); - m3x3_inv( pI, shapes[i].iI ); - shapes[i].inv_mass = 1.0f / pm; - - v3f dir; - vg_rand_dir( &vg.rand, dir ); - q_axis_angle( shapes[i].q, dir, vg_randf64(&vg.rand)*VG_TAUf ); - vg_rand_sphere( &vg.rand, shapes[i].co ); - v3_muladds( (v3f){0,4,0}, shapes[i].co, 4.0f, shapes[i].co ); - v3_zero( shapes[i].v ); - v3_zero( shapes[i].w ); - shapes_colour[i][0] = vg_randf64(&vg.rand); - shapes_colour[i][1] = vg_randf64(&vg.rand); - shapes_colour[i][2] = vg_randf64(&vg.rand); - shapes_colour[i][3] = 1.0f; - rb_update_matrices( &shapes[i] ); - } -} - -static void init_racket(void){ - f32 ma = vg_capsule_volume( racket_ca.r, racket_ca.h ) * k_racket_d, - mb = vg_capsule_volume( racket_cb.r, racket_cb.h ) * k_racket_d, - mt = ma+mb; - m3x3f aI, bI; - - /* tensor for A */ - vg_capsule_inertia( racket_ca.r, racket_ca.h, ma, aI ); - m4x3_identity( racket_a_mdl ); - racket_a_mdl[3][1] = -racket_ca.h*0.5f*(mb/mt); - vg_translate_inertia( aI, ma, racket_a_mdl[3] ); - - /* tensor for B */ - vg_capsule_inertia( racket_cb.r, racket_cb.h, mb, bI ); - - v4f q; - q_axis_angle( q, (v4f){1,0,0}, VG_TAUf*0.25f ); - - m4x3_identity( racket_b_mdl ); - q_m3x3( q, racket_b_mdl ); - vg_rotate_inertia( bI, racket_b_mdl ); - racket_b_mdl[3][1] = racket_ca.h*0.5f*(ma/mt); - vg_translate_inertia( bI, mb, racket_b_mdl[3] ); - - m3x3_add( aI, bI, racket_I ); - m3x3_inv( racket_I, racket.iI ); - racket.inv_mass = 1.0f/(mb+ma); -} - -static void reset_racket(void){ - q_identity( racket.q ); - v3_zero( racket.co ); - v3_copy( k_racket_init_w, racket.w ); - v3_zero( racket.v ); - rb_update_matrices( &racket ); -} - -void vg_load(void) -{ - vg_bake_shaders(); - init_random(); - shape_bvh_tree = bh_create( NULL, &shape_bvh, NULL, SHAPE_MAX, 1 ); - init_racket(); - reset_racket(); -} - -void vg_pre_update(void) -{ - vg_console.cheats = 1; - vg_lines.render = 1; -} - -static void demo0_refit(void){ - if( k_spacial == 0 ) return; - - for( u32 i=0; i<(u32)k_shapes; i ++ ){ - f32 h = shapes_inf[i].h, - r = shapes_inf[i].r; - - rigidbody *rb = &shapes[i]; - - v3f p0, p1; - v3_muladds( rb->to_world[3], rb->to_world[1], -h*0.5f+r, p0 ); - v3_muladds( rb->to_world[3], rb->to_world[1], h*0.5f-r, p1 ); - - v3f *bbx = shapes_bbx[i]; - v3_minv( p0, p1, bbx[0] ); - v3_maxv( p0, p1, bbx[1] ); - v3_muladds( bbx[0], (v3f){-1,-1,-1}, r, bbx[0] ); - v3_muladds( bbx[1], (v3f){ 1, 1, 1}, r, bbx[1] ); - } - - if( k_spacial == 1 ) return; - - if( k_spacial == 2 ) - bh_rebuild( shape_bvh_tree, (u32)k_shapes ); -} - -static void demo0(void){ - vg_profile_begin( &prof_refit ); - demo0_refit(); - vg_profile_end( &prof_refit ); - - static rigidbody _null, - _mover; - rb_solver_reset(); - - f32 t = vg.time * 0.1f * VG_TAUf; - v3f sphere_pos = { sinf(t)*2.0f, -1, cosf(t)*2.0f }; - _mover.v[0] = (sinf(t+vg.time_fixed_delta)-sinf(t))*2.0f; - _mover.v[2] = (cosf(t+vg.time_fixed_delta)-cosf(t))*2.0f; - - for( u32 i=0; i<(u32)k_shapes; i ++ ){ - rigidbody *rbi = &shapes[i]; - rb_capsule *infi = &shapes_inf[i]; - v3f *bbxi = shapes_bbx[i]; - - if( rb_global_has_space() ){ - rb_ct *buf = rb_global_buffer(); - m4x3f mtx; - m4x3_identity( mtx ); - u32 l = rb_capsule__box( rbi->to_world, infi, - mtx, mtx, floor_box, buf ); - - for( u32 k=0; kto_world, infi, sphere_pos, 1, buf ); - - for( u32 k=0; kto_world, infi, - rbj->to_world, infj, buf ); - - for( u32 k=0; kto_world, infi, - rbj->to_world, infj, buf ); - - for( u32 k=0; kiI, I ); - rb_solve_gyroscopic( rbi, I, vg.time_fixed_delta ); - } - rb_iter( rbi ); - rb_update_matrices( rbi ); - } - vg_profile_end( &prof_solve ); -} - -static void demo1(void){ - vg_profile_begin( &prof_refit ); - vg_profile_end( &prof_refit ); - - vg_profile_increment( &prof_broad ); - vg_profile_increment( &prof_narrow ); - - vg_profile_begin( &prof_solve ); - - v3_muladds( racket.v, (v3f){0,9.8f,0}, vg.time_fixed_delta, racket.v ); - if( k_gyro ) rb_solve_gyroscopic( &racket, racket_I, vg.time_fixed_delta ); - rb_iter( &racket ); - rb_update_matrices( &racket ); - - vg_profile_end( &prof_solve ); -} - -void vg_fixed_update(void) -{ - if( k_demo == 0 ) demo0(); - else if( k_demo == 1 ) demo1(); -} - -void vg_post_update(void) -{ - if( vg_getkey( SDLK_8 ) ) - init_random(); -} - -void vg_framebuffer_resize( int w, int h ) -{ -} - -static void draw_origin_axis(void){ - vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 1.0f, 0.0f, 0.0f }, 0xffff0000 ); - vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 1.0f, 0.0f }, 0xff00ff00 ); - vg_line( (v3f){ 0.0f, 0.0f, 0.0f }, (v3f){ 0.0f, 0.0f, 1.0f }, 0xff0000ff ); -} - -static void render0(void){ - f32 t = vg.time * 0.1f * VG_TAUf; - m4x3f mdl; - m4x3_identity( mdl ); - vg_rb_view_box( mdl, floor_box, (v4f){0.8f,0.8f,0.8f,1} ); - - mdl[3][0] = sinf(t)*2.0f; - mdl[3][1] = -1; - mdl[3][2] = cosf(t)*2.0f; - vg_rb_view_sphere( mdl, 1, (v4f){0,1,0,1} ); - - for( u32 i=0; i<(u32)k_shapes; i ++ ){ - rigidbody *rbi = &shapes[i]; - rb_capsule *infi = &shapes_inf[i]; - f32 *coli = shapes_colour[i]; - - v4f q; - v3f co; - rb_extrapolate( rbi, co, q ); - q_m3x3( q, mdl ); - v3_copy( co, mdl[3] ); - vg_rb_view_capsule( mdl, infi->r, infi->h, coli ); - } - - if( k_spacial && k_bbx ){ - for( u32 i=0; i<(u32)k_shapes; i ++ ){ - vg_line_boxf( shapes_bbx[i], VG__RED ); - } - - if( k_spacial == 2 ){ - bh_debug_trace( shape_bvh_tree, 0, (v3f){0,0,0}, VG__GREEN ); - } - } -} - -static void render1(void){ - m4x3f mdl, mmdl; - v4f q; - rb_extrapolate( &racket, mdl[3], q ); - q_m3x3( q, mdl ); - - m4x3_mul( mdl, racket_a_mdl, mmdl ); - vg_rb_view_capsule( mmdl, racket_ca.r, racket_ca.h, (v4f){1,0,0,1} ); - - m4x3_mul( mdl, racket_b_mdl, mmdl ); - vg_rb_view_capsule( mmdl, racket_cb.r, racket_cb.h, (v4f){0,1,0,1} ); -} - -void vg_render(void) -{ - glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - glViewport( 0,0, vg.window_x, vg.window_y ); - glEnable( GL_DEPTH_TEST ); - glDisable( GL_BLEND ); - - glClearColor( 0.05f, 0.05f, 0.05f, 1.0f ); - glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); - - vg_camera cam = { - .angles = { -k_view_x, k_view_y, 0 }, - .nearz = 0.01f, - .farz = 500.0f, - .fov = 90.0f, - .pos = { sinf(k_view_x)*k_view_z*cosf(k_view_y), - sinf(k_view_y)*k_view_z, - cosf(k_view_x)*k_view_z*cosf(k_view_y) }, - }; - - vg_camera_update_transform( &cam ); - vg_camera_update_view( &cam ); - vg_camera_update_projection( &cam ); - vg_camera_finalize( &cam ); - m4x4_copy( cam.mtx.pv, vg.pv ); - - vg_rb_view_bind(); - if( k_demo == 0 ) render0(); - else if( k_demo == 1 ) render1(); - - draw_origin_axis(); - vg_lines_drawall(); - - glDisable(GL_DEPTH_TEST); -} - -struct ui_enum_opt spacial_mode_ui_enum[] = { - { 0, "None" }, - { 1, "BBX" }, - { 2, "BVH - Full rebuild" }, - { 3, "BVH - Temporal fitting" } -}; - -static void gui0( ui_rect panel ){ - ui_slider( panel, "Shapes", 2, vg_list_size(shapes), &k_shapes, "%.0f" ); - - if( ui_button( panel, "randomize" ) == k_ui_button_click ){ - init_random(); - } -} - -static void gui1( ui_rect panel ){ - ui_rect l, r; - ui_standard_widget( panel, l, 1 ); - ui_split_ratio( l, k_ui_axis_v, 0.5f, 4, l, r ); - ui_slider( l, "aH", 1.0f, 10.0f, &racket_ca.h, "%.1f" ); - ui_slider( r, "aR", 0.1f, 10.0f, &racket_ca.r, "%.1f" ); - - ui_standard_widget( panel, l, 1 ); - ui_split_ratio( l, k_ui_axis_v, 0.5f, 4, l, r ); - ui_slider( l, "bH", 1.0f, 10.0f, &racket_cb.h, "%.1f" ); - ui_slider( r, "bR", 0.1f, 10.0f, &racket_cb.r, "%.1f" ); - - for( u32 i=0; i<3; i ++ ){ - ui_rect v0,v1,v2; - ui_standard_widget( panel, v0, 1 ); - ui_split_ratio( v0, k_ui_axis_v, 2.0f/3.0f, 4, v0, v2 ); - ui_split_ratio( v0, k_ui_axis_v, 1.0f/2.0f, 4, v0, v1 ); - - char buf[16]; - snprintf( buf, sizeof(buf), "%.3f", racket_I[i][0] ); - ui_text( v0, buf, 1, k_ui_align_middle_center, 0 ); - snprintf( buf, sizeof(buf), "%.3f", racket_I[i][1] ); - ui_text( v1, buf, 1, k_ui_align_middle_center, 0 ); - snprintf( buf, sizeof(buf), "%.3f", racket_I[i][2] ); - ui_text( v2, buf, 1, k_ui_align_middle_center, 0 ); - } - - init_racket(); - - ui_info( panel, "init conditions" ); - ui_rect v0,v1,v2; - ui_standard_widget( panel, v0, 1 ); - ui_split_ratio( v0, k_ui_axis_v, 2.0f/3.0f, 4, v0, v2 ); - ui_split_ratio( v0, k_ui_axis_v, 1.0f/2.0f, 4, v0, v1 ); - ui_slider( v0, "X", 0.01f, 30.0f, k_racket_init_w+0, "%.1f" ); - ui_slider( v1, "Y", 0.01f, 30.0f, k_racket_init_w+1, "%.1f" ); - ui_slider( v2, "Z", 0.01f, 30.0f, k_racket_init_w+2, "%.1f" ); - - if( ui_button( panel, "init" ) == k_ui_button_click ){ - reset_racket(); - } -} - -void vg_gui(void) -{ - vg_ui.wants_mouse = 1; - ui_rect panel = { vg.window_x-300, 0, 300, vg.window_y }; - ui_rect_pad( panel, (ui_px[2]){ 8, 8 } ); - - ui_rect box; - ui_split( panel, k_ui_axis_h, VG_PROFILE_SAMPLE_COUNT*2 +4, 8, box, panel ); - vg_profile_drawn( (struct vg_profile *[]){ &prof_refit, - &prof_broad, - &prof_narrow, - &prof_solve }, 4, - vg.time_fixed_delta*1000.0, box, 0, k_prof_normalize ); - - ui_split( panel, k_ui_axis_h, 14*2+8, 4, box, panel ); - ui_checkbox( panel, "Normalize", &k_prof_normalize ); - - ui_slider( panel, "Iterations", 1.0f, 20.0f, &k_iterations, "%.0f" ); - ui_enum( panel, "Spacial Type", spacial_mode_ui_enum, - vg_list_size(spacial_mode_ui_enum), &k_spacial ); - - static f32 rate = 60.0f; - ui_slider( panel, "Fixed timestep", 10, 200, &rate, "%.1f" ); - vg.time_fixed_delta = 1.0f/rate; - - ui_checkbox( panel, "Show BBX", &k_bbx ); - ui_checkbox( panel, "Gyroscopic Term", &k_gyro ); - - ui_tabs( panel, panel, - (const char *[]){ "collision", "racket" }, 2, &k_demo ); - - if( k_demo == 0 ) gui0( panel ); - else if( k_demo == 1 ) gui1( panel ); - - ui_rect viewport = { 0,0, vg.window_x-300, vg.window_y }; - - if( ui_inside_rect( viewport, vg_ui.mouse ) && ui_clicking(UI_MOUSE_LEFT) ){ - k_view_x += -((f32)vg.mouse_delta[0] / (f32)vg.window_x) * VG_TAUf, - k_view_y += ((f32)vg.mouse_delta[1] / (f32)vg.window_y) * VG_PIf; - } -} diff --git a/labs/vg b/labs/vg deleted file mode 120000 index a96aa0e..0000000 --- a/labs/vg +++ /dev/null @@ -1 +0,0 @@ -.. \ No newline at end of file diff --git a/laptop_gpu.c b/laptop_gpu.c deleted file mode 100644 index 9aeea68..0000000 --- a/laptop_gpu.c +++ /dev/null @@ -1,9 +0,0 @@ - -#ifdef _WIN32 - -__declspec( dllexport ) DWORD NvOptimusEnablement = 0x00000001; -__declspec( dllexport ) int AmdPowerXpressRequestHighPerformance = 1; -#else -__attribute__((used)) unsigned int NvOptimusEnablement = 0x00000001; -__attribute__((used)) int AmdPowerXpressRequestHighPerformance = 1; -#endif diff --git a/metacompiler.kv b/metacompiler.kv deleted file mode 100644 index af43f0b..0000000 --- a/metacompiler.kv +++ /dev/null @@ -1,3 +0,0 @@ -name program -append foundation.kv -add source/tools/metacompiler.c diff --git a/projects/bird_profiles.txt b/projects/bird_profiles.txt deleted file mode 100644 index 321724f..0000000 --- a/projects/bird_profiles.txt +++ /dev/null @@ -1,21 +0,0 @@ -synth_bird__warbling_vireo: -BAAAAAAABAAAAAAAGAAAAAAAFAAAAAAAIAAAAAAAHAAAAAAANAAAAAAAMAAAAAAAILFMNGKDDJLJEBLDAAAAAAAAMAAAAAAAILOBFAODNMMMMMNDAAAAKHFEAAAAIMCEAAAAIMCEAAAAAAAAAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAIEDENMMMMMNDNMMMMENDAAAEDIFEAAAAKPDMAAAIENEEAAAAAAAAAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAAMCENMMMMMNDAAAAAAAAAAAAGBFEAAAAGJEMAAAAKHEEAAAIENEEAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAAMCEPICMFHNDKAHNDCNDAAAMBEFEAAAAIEDEAAAAACBMAAAIJIEMAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAELCEILOBFAODJCMFPINDAAAMPIFEAAAAKPEMAAAAAAAAAAAICKEEAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAACBENMMMMENDAAAAAAAAAAAMICFEAAAAGJDMAAAAPCEEAAAAIEEEAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAACBEMOBFILNDJCMFPINDAAAABGFEAAAAGJDMAAAAAAAAAAAAAAAAAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAAKBENMMMMENDJCMFPINDAAAAGJFEAAAALJEEAAAAGJDEAAAAAAAAAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAAKBEKAHNDKNDKAHNDKMDAAAMICFEAAAAIEEMAAAAGBDEAAAAKHEEAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAACDEPICMFPNDKAHNDKNDAAAMICFEAAAAIEEMAAAAGBDEAAAAKHEEAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAACDENMMMMMNDKAHNDCNDAAAOEMFEAAAAIMCMAAAAIEFMAAAAKHEEAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAIMCEKAHNDCODNMMMMMNDAAACFIFEAAAAIEDMAAAAGJDEAAAIJIEEAAAAAIPDAAAAAAPDNMMMMEODAAAAAAODMDAAAAAAAAAAAKBE - -synth_bird__pied_monarch: -BAAAAAAABAAAAAAAGAAAAAAAFAAAAAAAIAAAAAAAHAAAAAAANAAAAAAAMAAAAAAAILFMNGKDDJLJEBLDAAAAAAAAMAAAAAAAMOBFIDODILOBFAODAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAKJJJJBPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAALHEBOCODPICMFPNDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAANMMMMEPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAKAHNDCODOKHEBONDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAGGGGGGPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAJCMFPAODMOBFILNDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAPICMFPNDJCMFPINDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAAOKHEBONDPICMFHNDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAANMMMMMNDNMMMMENDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAANMMMMMNDNMMMMENDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAANMMMMMNDNMMMMENDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAANMMMMMNDNMMMMENDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAANMMMMMNDNMMMMENDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAANMMMMMNDNMMMMMNDAAAIJAFEAAAAPCEEAAAAGJDMAAAAAAAAAAAAAIPDNMMMMENDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAAAA - -synth_bird__bridled_honeyeater: -BAAAAAAABAAAAAAAGAAAAAAAFAAAAAAAIAAAAAAAHAAAAAAANAAAAAAAMAAAAAAAILFMNGKDDJLJEBLDAAAAAAAAKAAAAAAANMMMMMNDNMMMMMNDAAAAKPEEAAAAKHEMAAAAGBEEAAAAAAAAAAAAAIPDAAAAAAAAAAAAAAAAAAAAAAAAOBAAAAAAAAAAAHCENMMMMMNDNMMMMMNDAAAAKHFEAAAAAAAAAAAAIEDMAAAAIEDMNMMMMEPDAAAAAIODAAAAAIODAAAAAIODOBAAAAAAAAAAAHCEPICMFHNDKAHNDCMDAAAAKHFEAAAAAAAAAAAAPCEMAAAAIEEMGGGGGGPDNMMMMMNDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAKBEJCMFPINDKAHNDCMDAAAOGHFEAAAAAAAAAAAAPCEMAAAAIEEMGGGGGGPDNMMMMMNDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAKBEKAHNDKNDKAHNDCMDAAAMDHFEAAAAAAAAAAAAPCEMAAAAIEEMGGGGGGPDNMMMMMNDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAKBEMOBFILNDKAHNDCMDAAAKAHFEAAAAAAAAAAAAPCEMAAAAIEEMGGGGGGPDNMMMMMNDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAKBENMMMMMNDKAHNDKMDAAAINGFEAAAAAAAAAAAAPCEMAAAAIEEMGGGGGGPDNMMMMEODNMMMMMNDAAAAAAAAMDAAAAAAAAAAAKBEOKHEBONDNMMMMENDAAAGKGFEAAAAAAAAAAAAPCEMAAAAIEEMGGGGGGPDNMMMMMODNMMMMEODAAAAAAAAMDAAAAAAAAAAAKBEPICMFPNDNMMMMEODAAAEHGFEAAAAAAAAAAAAPCEMAAAAIEEMKJJJJJODNMMMMMNDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAKBENMMMMMNDNMMMMMNDAAAICCFEAAAICKEEAAAAGBEEAAAAAAAAMOBFIHPDPICMFPMDAAAAAAAAAAAAAAAAMDAAAAAAAAAAAKBE - -synth_bird__cricket: -BAAAAAAABAAAAAAAGAAAAAAAFAAAAAAAIAAAAAAAHAAAAAAANAAAAAAAMAAAAAAAILFMNGKDDJLJEBLDAAAAAAAAKAAAAAAANMMMMMNDKJJJJBODAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDEOKHEBONDJCMFPAODAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDEILOBFAODKJJJJBODAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDEMOBFILNDKAHNDCODAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDENMMMMMNDPICMFPNDAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDENMMMMMNDKJJJJBODAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDEOKHEBONDJCMFPAODAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDEILOBFAODKJJJJBODAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDEMOBFILNDKAHNDCODAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDENMMMMMNDPICMFPNDAAAEMJFEAAAAAAAAAAAAAAAAAAAAIMCEAAAAAIODAAAAAIODAAAAAIODAAAAAIODICAAAAAAAAAAIEDE - -synth_bird__gray_shrikethrush: -BAAAAAAABAAAAAAAGAAAAAAAFAAAAAAAIAAAAAAAHAAAAAAANAAAAAAAMAAAAAAAILFMNGKDDJLJEBLDAAAAAAAABAAAAAAAILOBFAODNMMMMMNDAAAICCFEAAAAIEDMAAAAIMCMAAAAIEDEGGGGGGPDNMMMMMNDNMMMMENDPGCBDIKDMDAAAAAAAAAAACBE - -synth_bird__boobook: -BAAAAAAABAAAAAAAGAAAAAAAFAAAAAAAIAAAAAAAHAAAAAAANAAAAAAAMAAAAAAAILFMNGKDDJLJEBLDAAAAAAAACAAAAAAAKJJJJJODJCMFPAODAAAAPCEEAAAAAAAAAAAAIMCMAAAAIMCEGGGGGGPDJCMFPAODAAAAAAAANMMMMEODOBAAAAAAAAAAAJBEKJJJJJODKJJJJJPDAAAINBEEAAAAAAAAAAAAIMCMAAAAIMCEGGGGGGPDAAAAAAAAKJJJJJODAAAAAAAAOBAAAAAAAAAAAJBE - -synth_bird__shrike_tit: -BAAAAAAABAAAAAAAGAAAAAAAFAAAAAAAIAAAAAAAHAAAAAAANAAAAAAAMAAAAAAAILFMNGKDDJLJEBLDAAAAAAAABAAAAAAAKJJJJBPDDDDDDLPDAAAMPAFEAAAAGJDMAAAAIMCMAAAAIMCEAAAAAIPDJCMFPAODAAAAAAAANMMMMMNDMDAAAAAAAAAAAKAE - diff --git a/projects/birds b/projects/birds deleted file mode 100755 index 80cf40c919aabac86222a72c4b8ab328288614db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1734560 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%0D(61yH&V51h&d}IwPAo?C~cI@y3zS@Hm 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 z⪙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�AwB2UG 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�^ek~bE8NT)Ypin@ zTinO=k1d}Wrq^2@dsyHsmN`F$|3tfCiR)Npl}+woX0P>^c{W*K>Mhzor!xIh>k+do zGS4+Ea0AOflMYsxeyeilY-aw`a+&|Ra*p9_u*G4ff1%#rX1<)pG8eGI0oGVzo$FZm zFY6Cm+{N5}?I-^JrFOT0zY;I{Ytu3P8`}qF4%oi@qx=tRKdc{A-)wLvbBCm#wZqEo z?c$G^j)h~&huP!G;T?WYYK8SIax+V;G5w%c*u%`^R_LwBFXyny0?Q9=g;mjXE7V!z zUS=NN3L`9V@;iky!|WqkVHQh|Y)GID7N)eqPS&`OnLicpUGnp1re}>+ zmLJ;+Q~pVOW|_@MAJczsJ}mV}2Q$-!Z#13@Smrv`xrvP@wnF-!&G)QUn9uxE%%62O z*yJ!<%)Z-vXSTv18(hQ8*{!gV1=d*S?l_+N*<_35rz(f{7|%YY`&wZx^IXU>i!uBh z`Ha80o|W@jVKn}JS}V-kWO?UXE_1V6VHfM1@?P_~P(88rbopcY67g8QtQ8i&PkQDl zS2nL~g{kkC-}$XjV(#iz*v>L{vw3YR^lY}A7x*1r>h}kf-$2WI+otC<=2oitgyfuhgiMCbj-d?`adk4uaI6=xSB0)X8o1&$?9t9`-t(cYK7UXz1s9_ zzDB;7d#&~u$8+*WP0tML>|=v-+2TSLUnd>$H`lZBdgaXWTFcp@T>rKe^2~BEOMll2 zTjKA(*IroQw2%3{PQIAqAoEu=KTnR&DLF`Vm}UvGIV za0g3lu)>iT{ubr?3Cm%Y`L{|h>nz3ax5*Ei+|AYo^{~}^-mZMvOSE9&oamd9SEcS;wFEV9lrvtQLNS>mo3&LQzLU$Y*v#HR54*UjhOESEX9xQe-N zYR~aE_p|&h>D+F)oXyfM^JAH7S@@3Wqu-UU&l}I_tZ+7)>}O`T`LoPTaXh!h@b9UI z_?wfzAiY0TpUnTv^enN=3OBM5!@tO%%O8usRNlgicgv68h1AKA-JyKWI2i_5dcet0 zXXb$?L+VTNH|b=U&H`t%#UW-Md@^ihk@fidAt%Eyn_T>5$4re~8|S@>hi zi{t<7WGH-9Iv#y8Y-as2Cqt9f$I9o|glA5MjV$$8?$?Ds{$yCi>=Vo<{$_*C>BiT^ zpCLWWoOLp6U_N^?>|>FsZ>Vo(*y21EXUab-+`uNcv;0)~VU<(9DV$jr`%Z?1EV0Ns z*D!yc{ID?VWSI0V<2j8LE?|`dtg*y8vutnB^0D?qohE zAK&(yvzdQ}>Dc6Ursv4tcg*Kf%VUFUSeYw*Y_aFN>f>3`&)T!qFU!xdd}i~OzuWw- zG@j+>oeXQ4p0EB{d%p7c9)gc#vwPHEzxl9!qkR5Qy19_~fs>)kI(Nk1%heN`x0wFl#k=)nNdLfc z*uw&IEOQ|}4ntqy62art-1XPoaU>r?bD^}rk(EOYXIi2pM6 z$T};`y;6Cx#Qkisry>68lVKJMoX5%=)aQ>(|F^*SARPXDp;d6Rl& z@y*IN{$8*An0cG@$MAntem^n)cUn(aWSLFYnR%CbV4fq29{Z6h1=QSUgmzO9Div#&Si-U zS!R({u4aQ3W}BAB^lz+}%pb74Ur8qiSsFHfR@q?spmJm3kb3yF_`!6{aSbc1vgsRZ zqb&F)+tjA=;B4j}bZ;oJ$aO4nQw)EwZ?ZA-kb6TjhBN&e^J5R|lkW`$HaN)ULwyr~ z*@ye~+ueMm@3%$&$hY5E{?mKC2WfiWaH}xyTWY&l^X;`s!{+E z@+`B+I@dCNrTND3+`$U>vB}gC^Lw8BvdkPCEHHbO{ISRlta2-x+#Scy_f5Gto>Pt* z&n%nFGy8ns&0~>k;&^V1}7*_mI~@4`l5S7nS~cCN2agWK3Kica#^ zhfIk~H_S5Zd8YnqnR>*OD;_cJIgfnU9g|n5E_uw;pM2i*$H(9}aUpuy-Qmm_;9m?I zG^8hltr0ePLf8gjlO}{!g{3BhZ5Py%#_`M8Eo^i`m{+?~BNM{B_L&-<5H>~Ln-jvO z3;UU{C!0S0i}{!>EG}bwSYFs8q;F<2ReQR{!p@oyHY9A$gs`>3UN9l7B5Z}Q$Bdib z7GbLpO1~go;o3HtFZHhjnBtUVfhJR4Pi@#jnBuh zu$N5;oAf~as!s@;ChWr#!m`4?ENpx}<_N1#2wNcRJHp22V?fvsCxn%R?G-jYAM1o2 zoe;K3So-qQ^RZ3Xj0s_NVHZyb+bis^Cxnd%8x%G^ACo7gQnybC%Lpq88=sFpVXv7G zHdojigpJR~LSY*xgcXH-QrP(VSS{>Z6T;RD+dm;}v#>L+I6ZDn*kgo^&&MudJrlzA z345Zj@%b1PHgiH)`a!mB!p7&LN7!>Fgv}DRSlIY{%oBF!gs_6JH%$l|6!xJBVQYl# z5H>y^8-#srLReMUE@9*Iv0c~?CWP%4_G4k=^RZvp$b_(#urr@^dOoH+IF)+Bgs|zt zaudR43%hngSYFsI!p7%gv9O^DVMD_15;i^`YlZ!Ptep*9WLJ6c*_qi5$&krJNhB3@ zRH~>{$CO%3QD=8&VHRe0Nfr|lNkZZzVuBGB4KbLY;1+c@!2}f}Dp6j=6crUMZBa47 zh)NtOw>y z$0+PG8k>TR!JOqW4|_yoE3n^bEbpwmJVRrJu%ehd9i_16YpfDh0&}LL4)zL-C14lB zoatzX#Wa?LT?2EbV-R+$#>Qa18k>fFNn;DJ2Vu_gSc6S#%$Lu53}DW56v2L>u`<{K z%$be|?6k(}VflyM>1c+%P-7jiOElICJFc-ISPRUVj&ayKH8ullhdI-+2)k2b>#!3r zXFBrF=GhDyD~5d?<}8me?8h35!j?4F0Q;lHT3{E}xYN-IE7n*a>_sqVI)-5{)7S(o z40EPq7FMOPC0HZOnT{0f-5M)6hxaRJECl!!nFlTwhU=M4o5jF#JrlS@1bB%Sw z{uTCe$NZ%qwx+QW*uGkKIwoN+(AXTTLSxIYOEtC$y9wq@N6^pMsId~*dtlCVRKVV+ zvAF2+{)!h_=_um=CRh@79&@j}Xdvi`pA*QB`PKZogRoBCTcPa60-?(S`FWz#2ajQU zzt}kx2zGgHC&Zk4j}q2F*cDdT2~RXo)a5-E2z3OC_6LIdk(BxAJaS{mT_SRgfuOJz z*dpv=Vf7~CK`lIk^OW&QVSGfc5LODSR>WkbumtQm4ps?k)mR;@Lt_b84~+lRN8)Jb zM>ouwr%6~Z>_Ug!AZ!5kVh0<8jl;x_eB}RW*cj|(ikNHxHVZq?!Pa0iF#b~?(e<5+ zKJ3pe7UTaS*b?k+<_URKf#BVq1A(HuyaxiIlfDCi(&XO#f$)iau|P%FS=E7vH|jYj zPyyN>C`AO(1A*XyKz@~9Y$dQ&dg&?S)e`Bpw)UI0T0P5IO&#{Dx-p8a;;XIlk4xR~ z)JWx!cxDJ|BJ4cIxxBiJ&xhPTTk%9Z|4Ka3EiPC4Relx)sBdpRWn7CX`9%3EgSEn1 znLp-T83-ml`vXNMyw!nFm#-!;8T5W@&pCk*jCx4oYyFkAy&%_Ap@}2O?{62(g z8+Q6{JY{^2-+9MW8fIt}hx`p@+h_v!OZ;y=WxPe&jh$z4NlRSvzgF`9pyXMU{Ldri zEcw6Re>_kT+mc31R`Rz=9O0X&(^edJNg1D%GEVv^$P-e=UHd$z&Iy$6cN8i)WUg&1 zsaV0APZ@`E^3n6yHZDf9xhVb(NX2bAWt_FMfB&A%KdILX=+B}reTsbK|25bGEFksz zvOv)5Bj@sK{1R4x(roJ~<2zEmgn8yvkg5-*gtfJuGA!2#He3fw!k(q1 zOt}QCANB$VYljWNoNYY`8-=CYrqt;{*a+-LQdjJHpxU9T2dW*`Ndq)?ToJ>tNxl>B2~X9z`wpG-CVgFdyg0EP9h&hWeWYG_mk&Rri>RSJO|I+cl0jrNndhr*FNvD zJz}BO@10R!qW%`dQs|UCaLQn-%IYiPS^77tujur7eii8P)dhNehXehzjX_^5Fif6| z@;A=!N!mX`-^$ho8Hi%gH*U#xt^r9Ix1FKbJq2c<9OZykHhA3SAzN%~1T>bpI)lJ;w) zZ@EnDQP?N;sX7%6^zQNg)SK1bA;0%|+jaY@tu;QI`uveo#`}qeu|MLug4%Y(uY71H ztYnOLWibcIJ1RaL+Aja2fmZKtvb#{__ttq-AN$CoKZyleyUseXFS+-m?=J7%)Hlhy zMdC?*hjCHrhH5`5t*ZT~yi;kV3+g)SXrObCw>EnNIwW});V;a_V9SH2jAK?go@Dqb zN_wMGjz?)D{pJW@4uAXoxAGGK^JgtaO0m&~jZ*UEdtxJ9Uu&hl)~E_gXHJDZ=$E=Z zh-~~J-buDie4il#YOWap^Qtm*=FsU+^1dt9x2FAL=kBY!+k2PqtB%h9W?q`e(nKGf+x+D+YZMH`ymIsMg`s8wC$9b>V zJ2L6B=SHzidsOj8>68Cl;>|WUlKR<+trgxqc9*+tYk6haqJDNrL)bcNQEglL_*v`~ z_ntD2@I8;-rG+LJ_1CNUb2(^@@HpY$mT*<~swJJ$yMhvn{n#m^OWFgi*Fx~_dE_R0j{E|2#iT10sNLkK_2Bz1=F=@H8HQCWOQJIN9-Nc1Uu>AR0L zkCYF-SmTe@?hcu2k|yO)mh6sZd}8!za*jUUD^0MEjF4=JF?GttS0k$aAIH3n&M#43yp!2ovT0 zKqMB3QL|WK(Wr~etpt{2Qs=}xe`R#Att-6uGBe(&HeDnBtF~}h{8xSTk-(_e^P#N$ zepIcA+p#sYYR@B_ZB+FS)LqLK4Z`!|tnJEbqf^)#UVHksf}}C{Jk}eJoig}OeWXt< z;m0`aE+MLZ9Fe@F+^){#RLoz+cQU#rkbjf{sz9_6z2NCn#wpR$#thFJ&x9#(O(&?nA1^rVbt(JSU%n!k0Ik(%#m{cd$& zaZh{JBC_@xil5Iu-;=x-RBU;gSP(V^^7${s&kDi{c~_^LVdc>Vt&NBS53zpfqOTNR z8j)%JBku>z^qtw}xT?NT#tbf526h?Oq`eJetK2wce3|)<8*6`uL;b0JdCaf(+eU*WPUq_P6IkWmbQJfwCx(H z8=lWdOk{DF_k_pun7J1yX<0%(4SEYeDZi0^h;e|jos3Q+tIIo$*PgC@+IjZKTk;f zT|Un*%r2g>LDg%KA4b0KrMbz=*fWp(T&yN$pM7-v zrM%bKx1-M=*5a*F@kY?yME7|+>fWpA9`Q?=cA&fX%GJ!8%UV;Kb>KajIv`U5)$flW z-}$OlR+ zwjKI?Y0uNxE4*aYxN*C*s`fmqr&aC!%2<*AQs&E*^ud`iK+RRu+}vI>s=3Nh_EMTL zlyyDSh^=~T6&+kPUMvN%ZQ87PPv`lb(}AAzs{_5~ALsx5fzI>2-_M@dDE8_xIfnh^ zBaG*K&#RR_wMNb@7zkYF7RMA%bx z7g@8irc(RE9q>^&(^M->5@PPN_7gTn*qg1gaJF^Hrhj0*%S6gNX^Z;VLI*HWWCM#~ zBj%4_X8{|F^{dA59BsVFW#f=vd=I^x{_S$B%slIXAj@sZ*9v$^!>VyYY};#QaqWNU ziOhX8wx`7}Yvy-AnuF-Jq1%4ds&U5|bj2S_SG7~|XB6Fu##Q5WQinX78GokXOINQN zU)W+(op4zWv1R`P+o(7s{`g)&eQmPl7Ou2tx-YkN#i1f}Bj`?CziM16{&)-aD2Mne zb{h%HORO3XZ}mwgggg4wk8aO*UVL+> zRr)l`C)O=5wbPo;r!oeuy0`9&FF;ZLp__lr$FLH;7J8CZcL=32ELHVr$%*{iIh@Ae#(dDP{yPkJn~ z&wEt%dEXUS%=bPV%sQD==aV5!42iuF@?YX$WcAdN>ix3$XP#lUgQt;+ewjUtGtZ}^ z%%|(K#>gH<+!Gkya~Y@T9PINqxu-_WzG?AUrn@!fd294y>f1L~jUSwcBm1rE53Y2a zw;nh)`tA>gRGhOE}tg;dSGL)Mj2bSoinSsmYngk30lEiLz{at4|?$){Jspo zqk(DuX7?OJ8j}hBR)}Nt`>V#w_NL>o&%*6JJ$3FcbNtJ^Srg41qCIFK#)Jeyh&ALspIQ}HE$CZr15kR_9oF&KE9J` zc352>R7Tijmary7V}$u;R*iqjrTpqH&6=}xow4lus7KW`D8`RCT&6~86#!myTKteW>ksr)g|mL)7sSm!oj z&4l%331izLubZ%8!d}C7b53UMn})8>>{E-}2y&BWkP|=Vkef&DMV7rTkLjb>SR-tO zFq(oE*EN~A#6}U$`2IP&jdH?@2;0eqPgfZjb@ftM8?#AV$Jxm$Sd1c zos86(!W&QGq-B#RyY%=i5&KT_yL(R+oITRQLD zW$t-gvX8lK5hA5H75(Izxwnmcm*;q;s2H~pBs=9qp&Ip(`SWUK8?bA#n>-+T9G%dm_v+xwWEej7;($8k$ zrSPRJJOVHN%$iYS`QB)ywE5WbSd&N#gAvs>-V!s8m3 zcDW4ihO4<(B2dQ>n7Z&cM40b&%wGrBjGM&Q>!e<@fNo|wc2M1_q0Tl-k*P;UoyXJ9 zSp7Ul&u^h5%w5A;Klfl*8;IqYYD8xgoo=yfmmkKvd^e%RFvR4o)_-~Cdt6=f*eCwn zpL<*tn4d-`fzI2laVRPGg;>|udRENJ!V;&>&)UJ+*GoO~y`K8_xizC#{B-v9Vb8Tl zrw>il8AKS_O=L%8o|m5M$I^3sMoI<~dQCN+Nk89&e8(5oGH2^$ur`SgmaB~+b=?Nj)8KIv>PxW!?ewLUTQ)qs2o0J+Ghma|HXpQ$9^HFOVn$QhQ2Oi>bY8sOV zEdB9Jg!v_Mdf&1HAI`!z;fwGXx-u?FzbkeM_Y>dLRy$?zx-2{j?}6)f8sU?0HMX_{ z!p)ZbHhBK`x7ts_BXHR>!=K=_$jkR3csu+Dck@HdG3|3a&LO(wx-sv>joK`e#qf9` z%z1r4m6|uMV=qk_w-A}xartAJ_A7Oz9M%uZMZXEz z;s#q^wSQOz>)IIs{dyF;#@Nv6)$SkJYh}rZ+XmB$E42ZM`^!VcnChBaY=gxd>wv?hac%W znA8__mS%h>}-(Ueb>Gk#BqVW5y`o&HX!7=V|zv>yaZZ z)b1L`R(G}BZs6Mdj`DHfzO~Kxq-G7yOZbef4l8**g)T^Z*Rt|escKtgg{c@p*^lMRMOYd>V-vEok zUX)$`Bcd;zgXni78|!oH_rnsfa1Q!Y$Tol6tv?UzhUKE~JIwgqZ|h6FD}oKdZga+O z-IK?z2i`|josA&3d7oRi9#-_JGwXIB*ZOIx?$udhTOVQ*gWh^KDQtj`l8$CPFN-EL)p^n$me0?hQ8#E zcLFvEJCp7ba-}0~-4rYe%j)yJcKL>CDUYu_X0UClK4JbXhmFIkojzBY^QR~mNZu#v zF~3JO5=JyBn`U(8Mjtcobn2w*lNxjmsruB5T-i4sGp`9juav(bSOx52r|#kOnu}S+ z{Sx5;r9X>o{F`=KMSls_4BMtHd|0&8eOWNh)bsD%`X#U)*ejj!+kKf!zYf{tKe+W1 zuwmFXeL=6pFB_`T7xW@K@=tF4A=or*oA~b*{d8Y6i|ov|-TF(gW!N_9cj*U@u;1`q zw|)sMe=@iD>yRyY(5;_DM7!u;kWHz)E4c#NUf-+3(!?L$DYu7yVgeh&@^-EwqFxOho z?*Co=cO9|=E4F?aeR={m4*R5Y{p8$R@_Z^i1gJ5f5BbtH+lK6K4#T3b_xSjcUPG{k zJLEW|^URndnfHiVOUjU@>@A_&vu@ifho@jeuqCHY?mdW~nB$5!kY33K(F-4EUpM8p z6@|6K)IIiT-?V+iUzjQMzFHYOrpD?H^jbGzp1HW3VAMtzc5mQxa&wLu4 zq4RgAvx&~)vrikXyNDnJmG^VcWOADXUhQ?WK?n%hDIyHl+QP!lJNC^7)Z2S9cxvwyChTg)fcc&+LSb7EfSFbs3ywusQT=jZG;*o7_)wUW${u0|~ zvC#qx!E&`RAo8zw+Zcsa!rtj@U+HqFQct(2SH-}lqqL<(dqJ`PI zG53kMgx@?=Z#2Ig^h+KUHqbw!bJJc^M?H_m>}wCFFNjc0kjsQWsUoXZXXn!7T$t1bRAcE-*mq~n7s-#3D`~&zbe_wP zbltc5qa$XP`y>*s4D0jC7y4(Zg zF=S)c;?Egm#rH*I2ax@FmUePjUD~2bvc}ILq3Jp6Tl9*qqP-_h8~?EjJt>bm^fsGM z8y`NKA6i~nm(u(~RTwx8I zqf_KNZ5vV-`e6OA1J1NK$BPF{H^hfYWGA}Z`g5>(*hSmvt7MpGdGe6%nGxeB_HcyDVWQDtG$?Qa!eACIV0{yzUZWFL-L>>Ru0R>hbd%Bdu@I3VICHR zy}_9Wsy?L4@^j*Yy4p|jG5>1(zSnJ|7}g5Q)kYlo&X2ooG{FX7UFQ%62v&6eY2z|yTAcZ*HkuBb`#;FWhirYxizQeytk9|N8oN}}$c)#8 z*U;a6@w9n8BKk4@N@3kFdCq5EjdhK0x_z0Q;FqmY-`lWx0!HQw;<9i<0q=erU$QRq~@NW3N?Z=6qs`_ND zb%v2o%-Z!@@^%8&3A(E7%FXqL#Jh&h$j?t3f1gQH z?A(3F(tD{~ui<$}Ql!o;i;)jqM?e2B)*OYq2DxsBPJ?*@hlOG@V(-`6+glWSgsW%grTd?B8CnCf*#()`s06R4ek|MhENLu(75#VaHtLaY zK5g5O`9w3U8#cR-AL(|$oU&HV%FRJRolijCN_!eWx9J?)o|MHXtV5X0&C~X*vB0`s=nAox-Va|C z`SaX1)?xjyS9%>bT;su)#e`e}qWmaHApb14jSAQp>^`RrbB$0flO?(MVMMGj!b)12 zkuSN>wjp`j0gJ%GP8-g$Js<|macvmc=tZ`^)Ts$r6YMKKex&n4-xFF88}tTM^1oTm z>*&ot&$cDLO041kGg;=Gv{eXeyGH4 zBMF;?x#m2Xa*@92$Kr$(t;*908Mw&wg0ps~OrCDFQQXXUdC+Ym3@eB}ZuEL6q_hpIp0l1jiX)#9M`XiA#?L0?TdE#6-pY3# z{2bz%HZDkGvCYpIf1QL+5MJe+S2}(24qKg~CxzKFT4b ze*d_X;1M+@hHhg1dbM2##7;SE7`7Wb&FIWs=eE-UTZ8S!&L}#?H@fXi!75<8v6Dh4 zag*Cl!Ohf1*lz4Z&>6YKZKobK4cm>K9(2~<>9#Wf3%+Z2c4pD3ywz=I3DyAHjXy;# z^f$M=?Uca=VROzt$W?#TQ92J@x9d+6I`KQ*cG_Ugu-*7Gj80#d+s*`R6t){XYv?Te zt=o?8ZHzy#-fh$MZb?wBGhG$v)PKZnCk|_c?IwRZ(J8*$ZKn@b0o#q8X>^wEaobsd z<=wlx{0ZK|eD@P>J0-9fY&ZGSfX>i;ZaXcoN!V`6YY?54&$#W3!SX-5yZl*3XY6xs zJDads*lzp@znvw<7u4!yN zu62lO{Qj*u&LJD*uec5Q1>1(?VHnm3JGh+>zq8Ar5!udP+xp@|D{KIks}F-B|DU!E z@nH-$4m;}f!C8*Kw|!VdcHy_SzWA^XOTjMK$B%Tob*(v`tJWOpv!arBa~|@)ZW|Ra z-%9Q_nvq|B%(f9G>JC`&^y5b8th67z_aoDPu$vR(#`9Lyaj3od2x6n?Y^EN6TK5*L zW20f?abpmB=3d;H?oV)E(;q>t;yskZ)371s(1DHMA09XU&vW^aE(gaR5<4E==c)tM zn7VIi1o_?z*0(v!mb=(x7u!6;o=4Vq;ktQtliqJs`<`+0EYG@z#Jj1ATJ6h7x`MaT z4_>tXC*SWN>8i&@4>nFa*T~NL_@J_7GNFDx}T|Y=0VQORF?4Uee)h3)t{H6 zTgKsZ=q2k${9JzQl&4=*bylTM+G_&6ioaYp_Bj1^wpVp=l-Y0hB3t|#+h@@qg2iBe zaOS5|-?5i8EBdds^(EhyL?8C?06!e{tXlS-W66C|&z_@B@DKY-5GlNk{-t`|_&VQt zu6i98N3h#pA86ni_g8YX5U8VXC8!d)y4cQgD*ebUBlqg<((mZ6dXe3%UC-0kWXCi zw$TFXgym{u0Qu1yY#UM+Mqx9s=R4ElYzvOMw1Dhnvs-@+wg7YO{X6xau*c5g4(8i8 zyY<7cP1v^jj`$mq&3n6BzZF&t%SC?x+0Z-P`lGN)ST6bt$VT4n)?b4)!d|~!{yEdn zp=E2kTR#j-!b-N&ccvfN-rL>!t*{YTF8&W7J9>w$FLikoHUo2AU$R3zTon2D+cu;Q zt;3dKx%d#egZ9*I>x&QNu>23M8+T;pEsp2qnCHUgJIAcEp9Jy^NwV`R=>jHYQ+$FjrZ+=Ckg0y@LGcJ+=+Wi@ZC@AK20D%F|IF%8*_An5{2) z5rGwaeBHgLzJm{~$X9;SZKE630J~-zAG~|jfSft^8AHBjz-?n1HUxXzStg9@_Pxm7 z`_nTW$Z9}#V$%}$c>MQIu+xX%6qun=DAUpI$dz_W|K^!&<8`;(ej~c0Y%-r*> zDTXTBZuDYbwSAF%?S~~`_d9)Y=Bt;-d#cr*SwE(cU;4UjBaDp&Sl&0ReBEKb;`tA; zRIRRk48EW7^IPl2&m`Wo4*96gsm)22nmO_er|*iEoO6i3G4$sCVcqzK(_d$O_Ih0Y zwj-bTw(YOjNWwZ{x!RaOKKMPijagV3>_Mmh@$~f#obkwmT^)YseSrEu#oWqyCXn%4 zW=7{Kd6^(fy$K^f@I!Z;QP?=_9OpjB4mR45?|;;`A$6w*HU_)KX~SKAO-EupE(QPP z8dC9R61|0=+qNVh=U^$=!Snf%p6@xvIPa2LRAjEX@^vxZ|JH4z2v!cOar)y*(?M5x z#*nZ7AGeK0SS#$R9Bm|#A6&I3oq}+}S^A*TVdb zN=UUj`zrn*=Vj-*ZG>SRuuh-D4_AIZXeNYU@uLa(ne*K?+F;8t?_P%ucYg9#RYUjd9o#ELR)L$WJ}jZDSL*2s^gd;RkI_t&7aQP9A`rDVMSn$i2{QBLXXi z{hQN9CO@SAFfS34#wKZLMSkWbZX4aOWte(bT)MqxY)GFKR$ipnwPVOnm$_|B!EN*ySRL=~IqS%fv<{@}1Rg8+EV&*w3B$ zk&+nY|LbEZ0eCQ^(jYU``%r!^c!A9^yl*ij_ z8^iDdDDdMNSkd>@}>`$+;OsG0Ki+snZ+r|>C9~Rl(#ue$tB55f+NqhU2+eRsD3fAtlp{2#V z@yeXTG$3F2ZQF*ll@?eS)+haRdTn9VDYf(JnUFl?w2(&^tJ0wkAv%O!|MzyMSBBmK zdU+2&VSLNkr>A{3w|d{HB4Tnc@f6&}`tOk^jGLuDNc%@#bC0e2zOT67d$r22TD4}1 zqBs4s-RX&c9q8rFKVckq_CIO=tTE>uDjxG1&=KUr|Mo=YepRtC39E#;u7`EjQ}2b! zf=mphY}Z8oKkaf68@{_4uY@`M*uh4*$p4pZL-H;LYlGcLJnp)F%zEiG?`fq>xjXWW zD$i*-(oc1wH*)$3*EMVMibwr=e32bNb`4p!vsL+Y@!s-m_mhPQo<}zN_!CCbW6G*` z!drFCdEbHO6K0iD<=@Nv=Lu^}QRSaGk8+nkw_csHDyYO2MX&u2PZ<4YitCf2WUjN@ z(OKGj!ZzyLb9h|fBKPO<~<0yKYo+o#$w~Sul*-sjk=V2t>7dg&O zz5lJM36CJ>H7I6uc@acIA7#8MdeS@#P|p`u@8Ptcf2E$_`EK(bMfK*LH)p=fSQo-Z z0vr9<_)os`zNWQ3o&io24$G6W)c!#P+=EQwq9=`i6q%gjv7R5M9{+B}GlPvqZ2XVd zQ1N_%7^+k}au^cH0!QOzfN6%#1Q}3G#qFda@KNs8fq^}Ia ziebNZj)Shg^23%jv%hUZexbr`qYajVZ9liT)a)pTPy84{zO>S9V;mNRZGSDZ_3(4c z#xnA4Z*be#g!RIn$T2NtA7edV<+c%lb-;49(TaThh}%XttQq#2Y~!>w4w^T`n9qnB zL%zMDe~93ZPdXQVCOk) zIOomQ{-g9qVxtrJiMP0I^ugv~cWgIz^|Tn42#0H-(z{3@*=(FEb3?7`(d|@GFSwbtBpqFL%nVrt*}bi zLs{m)R#i9ef?~Xv{$>#Qg}x_^v(Dv5dfc|^lOI0xdfYsxz-S_ zKI^^ds-SEXevEB_bJAISgwAQ zBj5i^w~ZKV43?`O?Z_|v+HE5V%UgWXxNJ*WGF`>3>53|KYy$c4@7y+KVR2Z}X+x_Y zZI1lN8(==T;mr~oqJ=4+}BH#BR~Cq+gGs>gDt_%bFN|C^W#G* zz0B)X`6EBo^OWn%AqiW99nR5@3FL$Ky8W1imBHTUTq~vLgKFLPK1sN`o?iUU`#-e9 z{-=zWc=_(i<4iZ}Q4hGJgOolcEb^av%6O{`Lg~CpkAv2H^GcP_{r;;YCKhFq-e&a1 zzF_+*tOK_A`;_q`zRM@UUoUI|xuepKc-P0>9$wMDe<15C z7USY}9e*j}85()Yde+wXN0!LcxFhneKeB{^P-n&?=!~Lsv8B`HA=@~Dyp(WB?+oFygzuGb zK9XmPuo>9kS^P-XN!lxCTIqusbNj{GKL~z_`Olo~tJp1pHNc#9D`54oWBFU`(s7uF zYh`MEW3I!Sk#AeD`#Z7Q0ULxl?e@Y3U?;ct_s(>0EH);Q-~5f+-#J*(lH2YwtPs|C z_V)g+Du2yqoD@C4`tA2_yJfH@SlZt@OhsUguy69+QLiaSsn=o8mClM>B@a%r>v_!m zQ!ejO<=BVKX-7N}_%Lh=Hp=(R`H1zNN8;hc%(lyWDJ7mv`$=EFu!4>7DcgV5{{N18 z0{d_2Zyoi+c@5Nuto~f`JB<9wx;tN@u>2?7b{k+mSexW`mT^U{yi@N9V6t3{NDuP$ z|L-Z|M!x60F%aSui9Y9Q^_&a|A0~WgoA5%yrwLyt{8gf#2n1`aHn9jVFrLc1XH(L! z4$Ft7%TZYV2>!yP+Q~;)F)UAGVb~_|IOU?S6zm*P-8q z1^*@)1I#_`9^||8QW>A5uN{DO!v4zRu;Ca_xINC(XpXVwd8E~b=g{l%*tR05FN=Lx zTx{{4OXqp0Ic$4AAfxqm4;YdBDEl(wv(L6GECNevtRB{*v1VAe#yVh~8ta91Xlw}9 zuCZ}go5p5ftr}Z|wPSQyr*u_&xTV-2u+jkUn)G}Z}=Ypf3z z)7UU9s<8=JL}RnCN{ubSDm0dYm20fvtF&*8gTe2p!`d>Y$?v#z)rLhXwy2j$LHH|gFRy5WI zTh>?)Y)NASutklH!WJ|(1)JB{JZw&5E3jFO<$aC$fyN49(;6#by>EcKcp6h<+#fBYW-o7J>D_hGE(IYPE#(Br#gOU01Efu6b;Xon_lC!|n=f z6n3A?pVMQK!&mPM)j%)H8FT#m2JN@Nwjut8VZ|DY!iqH304vm33oNLyPFR7)`e6AQ z8;1EbHUZ1i*eq<*@Ai2KmeN=Xwyv>)G1{-jLa-H$mBW@b7K1HmtP!^8U=iGHg)P9I zPT7u0{O7vUI4$vOY(e68Fo}On;)gw*_{*8>E}!R)KL%UUSR-svW38|SjdjE3HP#QC z)7S`X*1;q_ldu`s(@Br-Tf~39J3U3PIgORUW;GUp&1kG1Htk^IXESUH_H_Ilk@%nO z_H$C=*VvrIud!u`Ut^oFNe2@@gMUx|4a??duJgotY)oI^_Olr_rLhj!q{ezBevJ*m z#x*t$8`IbfY*b^5un~=|!-h4MKhF4}v0~Vu#=@`xjYVPo8f$>{X{-g-tFca4Qe%Cv z9*qsdx-~Wd>(tmRtV3fN)}pa;ShL1ru!P1MVNDuqg*9rd z8`hw)eptQ6MqqUsn}o$RHV2DoY#A2S*d{FEU^1Qu|B?AK%pT7Vpl#oIVc2h8%Jd_XKPZ_NT_ZiT>mZ-EjxMi(QSC zz{WLJ0UOg;95$-4CfEqfnU*%#uqM|78`9VSY*1sPumR296s%v9n}_vjax1W2O)hVe z^3zx$tVd&|ux^c2!a6lp2kU@2)0=>`YjW+dHjO1=tr{DIwP^OnV9gFW>A$C83D`rj zkDFfGslCF?dFz){4{n`5rjYlQy34-cd+5TPzK39&FSX?)u5wrk*6v(Ks<^Coi+GFE zQK|NoKt5LHw$ToY!an7+;TUJVZ*`A1!^n??Z5z^VCt#y6r@ynX5r>?#lO@V&wQiq6uu7QIr*c?@Lr(G|1}lfz`LVk^?m@r)Z`^SY!0I$M3X5xO3KrAY zJS?iQ6<9=Lc~hiMV}-B^jg`X6HC71=Ypf1drm+O9RAcS15{)HcA&m{fiZwO{E7I6B ztWaYMu%O1)U9rm#4uxt4Sgw>37z(LD-h`!zBGqxoMa){Zc0vV3K~jPVTOa7C%h+zRsPtFsuyb zj5`V|)#MsrC7N6dETqYG!iqJyK3I_^Hw-J(P!epvf)4@-?{>%%`z}ACPGp z3&A!k-FZ+BOKB_yTh~}4Y)xaWuoaDU!3+IHl?vRY*J%QunCQ|!NxV#0~^!W0BqF3q)v~*MqsUb_>n%xOP?#M zS3XwxJ(H|aWp`M;eQGanpYombA}(Xh8u|-b8T)=nerc=-Hs@dwbjx6~uxxunx$aB1 zVq@VAc72Lrw_DR@xr@$$tIaT9Uq5Y_%M+?F(Ci zHES#dOK7a%N9$`h zN;J6vSV&`|uwso(!HP6C4=aQ@^LZtUy}TLIo>Q(6CjL3|v=pZMR|(VotF!DmbrUe% zzjm1TmzIlAZb?`WmaTo|y7xLO@mJe+RsEOvHI|b2HCFHl@oOvuD{wIJvmBNWdpdr$ zW25k}+s~xLudzXiUt?nuzs9CvK8-EF@-(&v+l;yEh3`?*p0oWG!E}3NFtO*9i@?NQ zx*R3H>tQL4HN)05)&X0CIqmhrRy4UG*s{jPVN0-dy_K}^{1 zoMjiB-RfTnO#E}oRlwFY7Kg2AtO>TFu{PMU#(H2&8XJHuYHSp?ps^{~yvF8Xa~fNL z&1x*~r_>vb6~d-9RtlTaSS4&yV|B0zjU`~?8f%A*X)FmF)z~0xL}O#HVU110hBUSS z8`RhuY(QhapHbg5Rs`$QSQ)HWV-Z+VWA(5ejWxr%HP!*^)L1X9Lt{g*c8!h0+B7x; zYt`5ytVLt%ux5?r|D5@d#)@H08Vkc3H5P?6I9P=C+W@PFJ)JRPK;nFqY^)C zKqj>5eJ0N^9=}o~Ty-s@tzo0#9ECid-SUGH5 zV=>s6gGI>aM%XAUTOG)Cy)Y>8U+VUAOybwrw8XEm1&Lo{Yp@ZG`Tm*yL}Nv;A&r&6 z24T+eIszNe(tmHtV3h#uy&2*{|o(z zgGu=n!&+far~I0*(Q({eer>RJjrB=cXB``Y^*H3D9~_5u!*V^ZT}FQW zN;|FyHa1~vu%}bLkzZoxO>VpOuoUd+*zL!L?;5w=5m+AV>DXPvMnRKpSMuEVugn)U zRs{2DtPGZ?u?TGQTDQG=SW08fuyu`fz}8^SvhIbgXmUfaWle4zw&akD;@S*s5%#E$ zAL)G*=b4K6Xs0TFLuLpowd$~ne`Bc6@`@7N3A8C&<*cdF=vzB(`OKx`CNWwy}FNwqHxs7!X zp&Bo}AI}_$N#0B#KiF#95H<@N(AW~JUt=j)pT-LQjs8btAy`sl<**)&#bDhUYlL+= zSSkLs!a881lK<&6+WG%O$!NLPOwuxdY~H)<^r`tDZ1bHd;~P@P)B3Kn$3oZH<0A6O zTWuR+cOBNFvHX9>e~lHxIyDxCb!aRKYu8uVm>yYfFUa?-Xb`CSLwOuF+s0ZYNs{jkWj z!`3yqBy7zgCq53sR$zaskBjIR-0hBg9hMJs)`|T8WW3kpieY)0To|@_m)l+xmV!C$ zHNe(2xfa-(Cf5mDfjP&#zAW~Jv)G%k>^bvw*0SehOR#0lmlSMCV+FsVK4>fiThLfJ zY+hqA*qp{1VY3=*h0SQJ8#b-6e%O@8MqrZ~n}khhYz{WAv1Qnp#x`N28VfGbUudiZ zHmtD<*pSBJutAu!9yGxQG`Tidzs7oCeHt5p^=fPsmekl3tVd(>ux^d5z&bUS_gngV zjTOS$HC761bFc_aqY~B%%Qhd+^}M1};_r30r#^{aW5W`^gGu}o5~p{N%?ia!mvCaKeo)pt&7Nb zguynGay3Vs#Ky|U?DCWIxX5l zce&R4c5Dm{*mh-Jkc17w9uU9Nb6e;7O}js90{PJWwhb9qXJN&#bNDVFVN0+gjiq3P zuykKlj$FZiBM*DMKo!4wCI30B$6y>WpMQbb0vPh;pce?@LsC zJbXf>ANk>NcRr5f z&B8ih=`_R%TY|O20(|eFZtB-zNyIKQLp@{AYtEQ~A6{)0+X<-a5I zz1lBx{BHCrewi{#qb(3&*P~1u;Hf~Kk4nkN zW8+l4>qEY1CS^1^)AfM>cjDHl3M?9=TDwl zM_*$bc&0IMFpB|oueQ{&X?&^wP0Co1wtt26Egl{u#KT2yGwVq1bmK83vR zw<+WK&bdbV*&*kN>znt#coLTN z+^8!5LB2=RLswoH@ilZio=h3v=DXPzYtG$gT|fD5voH13o2{{)HmP(7Lowjw3sU>`$`G z-fFpZrKxkdxTX5&HT2>eyVDC2N9p6tBhXW07r&+bRKnI^QSsr1K=6%L`>BVQ{=q$0 zX@-@x-A)T#*7CtKUDu0LpO?U`yZ`6>C3HW>uAr!d)RswRy!rJ-GU>8 ztzK-c?Ab8qKUW5Vo||dExcuEfJ~IY0-^Y+?@NO6~=b+yT$}B?ia|Yf74+!TYY!TK7 zlfGI$h5W5s`p*}DzLZ-DUkjcv^;?Cjamu8fQ0d^Ch@ZeHs@esV*nQ1yJ6fca^&lEfqZhr zv@uRtg0LeJ#;1wD8Q36fOv;}Q=%fe#oqbewV0547>*k=J>7x$wLQOTV$Pm(Uy@?K{ zJ2KVJ#xWaylKyDlhIxKO-*b|8&=5zh^n+392aod5FGDlPb;}XGd!yz_-RZ<$Utb#4)cS!`>o_9@R9JejR+oAuBc$uyKvG!=_*%(dQ#_N!Tnb zJ*SrXF(~$88^+h^zs-3N<-TPeWXUuyqxfX$zGb_duDuF!&c=hHjI~L@@$7THh7`Ds61PysX8qA7WpH4AAhl7JZ6mr zJM`Vvfwc>G+j4euVk?QQ*;hU@>72(_UwFg#WG0=At9Qw`deXP0FX?@*w{?efN|~1a zKkCQD8^)_M_EcYzy)Dr8*?`QJ&`e*~j=j0^4dZaeo+^jz{!tFR0XUnzOxv0kd#~9r zKIFEi{M(Y=&gXdV%x+Kh?NSy+26M&NZW#aJF4t`Kssl~3KF!j!NNpLm64)BQWW%^r zd`s^an)i35Zx}zU_G_*8F!mw8TuIp>?wE%%kH5;Cd}p3aEQ>q!L&Y^iTon+Zxz4nXDnwggS9{N*6omI<(P=)ky()q<5s@s z9Z#S?`^~@4{TGH75TWV$a{@ilBqRWH+r#M>J<~k1bTIcH;h+Gd@5gA%U*BV zEd?zQ-bDCS63%#^^js?YaqM(-`EE@wk_nQzNB*8Yd40&9C$fA({1wA`VRs5h?_1SK zetKFY7FjbykXb<{y=GQg!K^i z>P$Sx&fV8&rbE&>MEEe_VQ2W8?C>eV$9K?QB7A;_aGz%n_jhb>zl8Ao+U@;|5?;DP zc!Ka4;oJG&O?bl&`a^`b?+`vkc>fOemk1x;LEq=ylQ+FXcnRUlJJ^pBp4ve_L3mMo z!;m&&)}zZ@<=aho1>t|`40n|85aA6w=uZ*ezC-vD;r%<<_xY$lJLs1XKEFeFl!d{B0NU;#TomTy6i6z-n@;z^nJd4 z^go2ZPW1T*D}s$_tPHjYyF^KuauHa;u?-{QVD+#HjWxp(FlQVcuwG5B7dD}>A=t8} zI}R(X+c0E&m5=y50}E?x5f+ENOi7t?>#$~+YLAv~{#o?@8Y_lP!c@Lna$(pCEaI>i zg%w@uW(}|?%$eR6SS#$HL$?z)qOm^MvSx1>R(P3PcLG+Yu~}FW=Jam~HV#wukGLhT zQm{FV73A;9TZ1|CGz2R+zG3{e!{>5Xg~npA1T3AWGB!5CdSORJH$8rG9(aYhIeUYQ zU@}g3BR7uRl}@<>YTlq;p%L>ptHDlejv~8q2Ad)`k6d9rb1tV%J8orA;?6sp`hi@d zQ_dCl&6&8%knKE!O&PE2ksC*DQ1<(|uA|H2JKkFs^UWgI66`UV8}bSBR|cDH+%P_6%@>{LT=?ici$vNd zS>|)yo6xDecEh+#jI;%Ul0R**9@ve-*nj1%ZtS0O48}oCA*he=dBW5CKq4md)e(sw z{%pyk!&%Oo%)P=}*k-E=gg8Sr4`Gh@nUM)$H`F8)gqr_iZ?K8^uauM8$K&13&izvC zc~-SeyK2Ap-OPjKAU3mM%C4{EW86=F@n(CkSy&Tn!om7sZLo1zxunD1hqBjF_IYJA zQ0IAjpn)aE)q#fnfjUY(%Q_?KuU9h10}TfPb@8k+2mIB6hT1^WWu~2MW~4m?3-)mT z!iI5$_?B+7N6a&rV{F9!NZKx|E=gM@vb{H0dw~3o@mB|1fqmb{4|`3KJ#7(=Ewegn zz87WyTdg;__sK_LBMv4$Pr;U9AuB(Vo|??LyXVP3QFS1ASmxoC$gUx~aPx-IX4T;> z=XlkDS)cb@y@b`eRniBGb_NDYAch-E+8v<(w43zp&`D`!`B@) zm*oiIfXbJ~^Y-Kg2kd@K@}Lz~ps{XPzQ+1tK8=mQ@-#LH>uB3B#I}57 z?3;tN!}beMZP+@;3f+=E#xnaq!oR`eSjokt%TY8 z9;)8cb6Y2n)Z8lnyJ-Oj)7u`Z&zVAR9zBkBo&Bk{kD>OZdDRk^3}w5{gB`sH>cR7w zKecZd_lhl*cghEHfMi(l*7>i`w8AR?{>*pDhYHl{v9XMe4~h+yuk3B<PAy_l)4PuXv$c@ALU{@=`{v7|$z!qU6RFiaD4G~Z9pgN!Yf!StbevwTf zo49?$cwF>VyFSKX$HfxTJsk3T-l4uQha=Q7=5|9zb2X8KPpzvMivUsI*~T-T6n-i2^+4tx1`ZWz)xn|%r= zob(Bll)8yc$|!|QIWi+MPN{Nce^mO|u$LEMr<(~EHppwv*jpl3)Lx_LmNNkv?%FWs z_%8Wj&4Z|?>C6d8I(kq%@DQv4QEg(Od+%RquKl#YqY7JI!a>KlK zlRoouTA%c#`Gw4v;olWORUbTDvW6%8l=@Oi_!!{~8CHH-?IP^?6rP&wMfNRLJ-*ws?Vh;w6Q9o7!)i;o*EZs6`mYRKJOGCX>BZs9+b#)Eu3a_L`mB9xEe%Jl^L%#RUBjTP<)r>a&@KDehVeK5pS|~ikE*)% zzR#R9XEGrn28a+e!l7}8g+mGA%F%&42m^sM66(=M2i;fND#3`iAog}HB{Qt z-c+e#MT)(-N^MkZqf$%n#XeZEr7g87(iW1m^L*Djd;VnR#7p1z^St--zAwXPv-kO} zwb$Nf|5I_Ra}o80s0AX0T4Me8Kn$Un|&FutAD=*aooe8GIdJ+cNle zfbGoS>jK*WHY816kORZJGvXG5?MsU*{d+W6^alsxt7KwIxfz>L?TplZu$~{ds2~<} zKJuU3=r~e_h{ecj`Qd>$YRQZv%vqPoS(>KcREE^Ym`VjB&GdIj?UU&{$lUW@bRb$QDVnc8pXvBDjT#h$UEU}Yd;YGrIZ)-j#fo9JU(Py98S5;i ztg}Qos9MZH)xz;Vmp?Qq2d2xj4}_plTRC3Jg_B&$$g$O&Wg+jg`4zTRN3!)tVlR;2 z22)P{dfXYzK;B1@dkOY|IOWrr!8K9$?>k6i19OA#in8&m3p9y2JHpuJtR}5;pp1&G zRC}zbg!RmC9f)7upDbOUFlAQbtmsb`IZ>OZ9(m!{jc!wYgKjf_`&1O%Ws;TXC0ew% zXt<`Je0)Kf)O9OyR}*)p2+N2|NhDR3=)A4)cET(1JR9a3)x8lOcSG9+?IEG*nw%JC zG?NBu4oJq!{G-?}+>*XeG2PR_kt-6-N_Fd4_!hzUb&=)SN=qdnNw)^t9%v^EP4i0+ zHs1iuPGlESC2ldiUGS>yqILE;_DJ-reofDt{~)LMC#msp1$JR#uYa7~|$8dYYGqcFFHgQ)9+hlHCTj3Ty#kuMTv4(|zAG`+R&J z&5!|D$2YM9@<-Bsi1&cR(=}M?-|QFLEGwACR+%R&v6XKSla*LltHcp^R7c7V%34pT zO6z~oJA8Ye82Tb>C9*n@#S(>oU+yDI{#LM0S4LNg{k9WX^N;zHx3-(1n`8{KBGBJ7 zwol4_#(vW`u2yB5_Gc-i?#B{mBXQEl&?>Mk8Q2`K&NNK=Xam>|Fx^k!n}H^K_UlrJ zBDWcu^_JNq=Q)aN1!8a|`0|ftJ#1^rrkA!90hcct)`yNc}8>7ousqxY;fz|@;Fro32_EZMe45oX4*nmy;RjAP^c{00`G-{x? zL7yn~#ZTncgYACjK>RrwgLO?<^;5gMG5FLOS5zn$=|e(ykh5n=OwwrKQ_)~ykj4OMkjU1khar|jFvxgev`2Lr2bmLR)ZZQfR42@rTWya*bHqww2!16 zr21y+n;e$B1NH$gMY@`23RmULfqg%5>;FW4ed6jlcA2Z+loiz&UrAwHHvXrA@`(k} zi3L>?3uOx5(i0C@zvD+eveMQeGW0RwJXm z>p=WlCXeZLo;qJ_#?l67h_s*VL+g|CnECmPrInh7bv*iYFX!f@Z}Q!gNh8%p)7w>p zQ|8|cs@05A19(zFL%IPh?@>=0<$py#Ng8VB@S^^Gij6Klqws0CQ@w3BAIc=H&koYq z_4m{{OrL$7GW)iS`kauLiD1hAEvr7o1}Z&){n-QNygGXCGFo9dcoe)Dywue515(fF zYrR^2KmaO5tyXSKdEie>6+`GV_VX6swLmTj6bow^tI%=x3?#NX$6f z9F|?!uL4^Ore_a$mN8}y zSSQ$j5SIL;j|uv1kLo~O5v6mW6WFMwE-%jelGhfJ>X1>U0ugP!Y~Gi6Nvb0Yq!W)gfovu2S3Hs<9_t>8DCqLG`UFB2F(Tqd_xpCyQ$) zNo^t8(So!eo_*tau z=_4l966PmuqaJ!K^fMIkuti`?!A?%Yn!#E#_*%iXg6Vr0c^kmOM|Q_=m3K2(2UufC zcf7@eG~FFwU0{<8Cc3B#Z1hpx@s~}xq@Q7t@xgRHPI<^TVCIPiB=0f$6zq)=-Jbo< zvtUuM9bmftYp|JM;gP2A7;GNcD6m;P%TMAi25SI2UJ(y#0c!?3+F+ss*MhABTPowH z{cp*|;jej{MX$fX>3vc1%WP*@K$;(HB7X<*tYf?54TR+cAc}n2b|VupMCcNqIWw1quqiH5ZXP2U^XE-O0Ua!5YA( zfhFEgu%%%0z>Xs*ix{2C7=5DlANgyGmUh6aWgz!qr2lr!Xm#qTqjsBScB0K zD@381Z?bePBsF*DgTj73iNUJd?%UzK{mQYYQopBm$G0W#8_+b=c2+$*H96OxBH!jO zBjY~3SHGW?abhX*R-M(I{6-Z>&s(hqZvp?O01OJtL|-*IlJBiv+e9l@u@xrGl%SMl zCvoPS-JLvdRR*>TY#rF6A_qO(EOY2(GNv^JCv#;0AAGBA;*C3%dUm0>jQxo6?mp}D zqrqyxMv5GMqEn+_bHGj%KxH!!8=ZPlqW?gWyv>KV4&Hp>OpJv|+|7ydZ zn12ek-tebmTfl0On~rSZ8?}Rp7yM z`sS?-%mNeBOny?g?O^#};|0*P*gjdH-9hud6M6;oMBAu>Z68=USfS`F+HCroj=9Sr zs^<+Rq?zojywkVY<4+p#YU4%EK;Iy1x};xU5Mg;z@mlb)=XQJF!eE0(ZZPLxz*mDu zgkSS}xz?MMX*0A|ADYy`I%sR5rPt|Zu=N>OC)j4N^g7)IwlNJ88T-LDfJq;gd{BRS zUz4O&G?wuITKb+_DcCl!MA?gs3b37EM;RGStmIRzTJE*bc0o&&yU3ky_|x+i1KR;# zVl8nVd@I3rgVmb)$+BIh$lQ5KL4)kaWSS|JdG*-_&E&kxvy2=spVpbAU(vT*i@y%cO8SbCXMfLZ5Zn?O(OVb*|Eq+xZC>cJL)MQt8vZ!1Lqrq6$|#gg~aaBIs> z-{GQKzSH*^Mym3ni0vSanHO}&Cz~{yWle0Eqi0fNL5NdRauCN;@tp7B7945G36-z& zhy1h92jjZqmzy;l|Mdp5Ue(~Nl=TL`B_=7aT4Xg&G~)u#TK`}zVCiil2G*Q`tpr;R zHh_5YlQy~zY$@0Z0d$g-BWWSLyKhXHncNP(UAMw?e zs%0;o4#@J0meWdT^Q!vx;dNm3U~46R{Hk!9!K^9W@u10re|?$xUZ-up=v!aj8P0Gy z^M7O=tHwEn^Nfu)Z(^T7(M`|`!W@-wiN zVBrjG9as=d$7#w-%5XDS1WejTrViTpi?Pw_~C0ho)=bsx`fLo(3M7+8sYd;_#Dlr~|72OSdl?!D_)0 z?OXVkgUtk!^;G#u8(R%l1GY*4c4Ew#5Z1Y`mKOgyTARNa&Ow<(=Br`DPT#`&z4(&<0 zJBVABkwzETXt2b1D}2EU>>;r9_E-!y7Hqks%TLOBG}wBuCj?O2h2e#|7i*3+MHX%) z@pM z%$i2j{yHW=#*#YgiIRR7GMX>$j&~aw>FdO1-Cv{kS+3=?zq!8@7e}T zT}15%G8zGKtB5;~xT9v$xB9aIQtRxpuf#z}pP`j^h$3qPvUXqE?R}$>Du;|SK$X}> z-=G}GS^CxjJ3u01KQe-sb;qZfcQIw@Bje%hvP6con~L+%=d~$)A>(KbSU#A3%a!W8 z=q#CQmffCqqDjj%27d+ow2{vh@icQkitYSUWM(hGs*SK15v!3`cok!ZbWF{ot}{@U=KhgXn_(JnJG%n~>zJgh zXINXu(biVm|Cj+?^;H-yg7Fgk@e*~aLx@Xnm_@F`6lt}keoLZ^2lM*ss4}q4V2LrJ z7`{rdjbLiaOfA?Mu$SmOU>dYKXrphS&&WECmWl5Dr1qC+6v=Z*>{}l0UnZhTbxd22 zygfIXbt&H3nd8l?I>3YTyW>y6$9$MPJfwM${Oy9a99nCVwo+-*4yo#@)K+^Sfs(Mn;NVIY#NyM zA26ANtOZ*Ib`4>RxunD$i`xv|1zs)fAAP(`&NIt7xF}<-v1c&#Qx7bjN!)$J3*XWm zA4ph!f`!LZeqg%aWUvyjvNXOD@G`K`V0tG4YiXCVCO1KDH05lmlywdCX6Tm@_QnWQ z88(Wvh567rq1E*_zevr4q$#HN586v|d0Y3eMW=2?-p<>Yr}@-fMjw`QPiuU88{@l- zZQ%*bhZl9nV}!l3)H4M#T}a;jCZsytSa`#?cgKG&Z91iYX*1>wCjGK0#IaqmfRfqf ze13%8(>}_0irmoHhf5lgl;bMWXk2V;ARTKLX`7Y0+5l}8v@a62SOl)e>j2vYwoR~0 z`|7jQxlZ#9Ow|6GZ&`>b>9d18&O6$u<5*cG>qB>T$FDQ*{yB4w%7QxQ7yjL4oSs=+ zjI3C!JN}r+$~e=Isz1~BVgdU@-%NYonRXy+TT^%Pd$V#x?f~lqyIjgd&m^bpNOMw@ z?Iyn9(Ope~@}jUx85eVaWgl^)gstnnG9C>US;~A%+8gKO)89QqSBO2%!F9e-B<&OD{tC_1juPqMxptjsefc1tu3f2yGo+2K$6KoHdzLVkG2Uh%m*#|XPxC(m+>{b)E4!;Df3oJLO zU-f)y>b|^`zLp*QpZKhY`6zykK+NkL$6upRm> zq9(DklggCpWrwB@G)eE;?L=P1L&g?CH~aRTD?BxvoG@Ws$as=J1^bP-M-; zWA4mirC?cTs@QKA^1lDY`(_`vp?y^#s}@=HkEHUEK3Aa+C)S59&Ugv^&RE9$Rm9&w z{5uF+wztS2dVW24$;$5dcawQc?Qf;_`1Q=a)X6XVsT1c)f5j}Hwdh@%#TXU!k5czZ z{o$9+WGM^Mal-!MP#~xHQzRjIpBU-nKi(aGCTSB~lH9LTol5;L3r&=C6o?6y8fQXd6oH4XVwqZHP}ioa;pz-H0XuOR{-S%#*TNjjYaZcgNpM*0st~+c{O&(@h=N zpZFFHcdyEQ1wJE@)^(J0f=mL-zl%*LeXu57pW54!dUL#|(9QbN)k)mw(<)>%ey=+| z5fSo}vX}$59_)+#wIMC@yWkO`|PWIt}N3|q6}Ne%I=)wwOsch zYx}>m_m*sP%p0@jX=d&hbw)`YP16O1^g7~FalYU8Dc7WZI%hiPZPzom2vZo^=KSjK zLa+WBoV)$spOrJBuS3?pjm)D$30bLrqWjvZ_ACA5W0B=IwRE2HZ@=0Y5G~_K(S?jh zuXTI(56CmF6l~_}-SG{CE#{7eH+lQbQSe^ye8Kt2cs3JkKbYF5Ixj)f%C~G0Pktlx z@-3-2qA!<&jRn*7S}iL&L)LwTYQJL3-&RnIbvZ+?vhdREApV1&?TJfQu`%mro{g|*f_sEc|a}Sn~*t00(z*_p! z&lLI717)-pK(wEC9F_@(%+10zX0FuWxFRlF|4mkVav!q7?{X$h-kaYjT=-(ndw^Xffc9B))}(B4 z^2}!`q%!!X!6);iG(Hv^S^X}?7^gB=rqnt09C*9n{gvTul6~+RR*5TR&4BN-y@0M| zEQfdPd)R?VxkhJ{@fmtCYaYn0mOtiT!VEjwU)zZ{=l#_Ay7cp*GEJ&W-|Hii^znVf zsoKW6n(3Q;4M@x}a`fIaq=yf4oY80hJBVJQlFu7?Fye}rayb-QH6}6U8(YrGMfWd2$pC1$OE!I zoo-XeP8SNgZb3$pi)y)~^ilQ5eeJJZpj{*G1tW;${5A<4CYw! z8lH`P{YiIRY;CX1Qfr0s1%x*kROQttg0M+Dh!St~Z~N}2&IBt@!=$d~fmMR7BrNCk zX!81vy2w}xtpl3075NFa3Tzu#;;f}$ZD2dW68c^8-43<~Y#-sY{vg&`YB6kT-tFEi z(6-SDVo&TR-iF_$#xsBYm6#99pRn>VC+KI=Co3;!zhk#)kBPp-{TtG!`IA6i0LxIy zp#k1rcy)h+zD?O`zn6D!h8F#O>I?*smc?4|a`1$mE@iP1Y%Ew*m{^~cd~5})16v?i zN;hD1ph2Vt$&U;;GPm9j?^<}@lsTZj9s3$M+EKlcze_m^2^cREZs3?0t`e?veUgMZ7J@i^uf`eUKU}e(kE~tD zTJ@Li_$!hJ{X1RSZy5X1|GwNLI^*)J?cyr)F@u!v=sEP~z3iEa9Q2M^_ho%7d9N5J zP`vqAExeWR?i60F3r?TO9I(#YD_sOV_*r-Sh2;3@XV02BIA^G@^EYU9t}VKz19^@6 zSVK*&yQsbGw^w>mL8tAEa(pXP_g)tvulP#J|3G*AhkfOx>;<*oHGg`>`=kJWf2~T6 zxlSZ7PX74Xqoj~M1s|X1eABHP&2 z#A^xkc;B|rhtl;sb3FN*Xwf+ZRW}yYe6gU4i!nrt$ovuM*f;FAO!wxVOOZ3r?ukEX z-pyytHfqa8S^7+qt~U*c&YhfmiZT}+vrXQ|>G9UQ^&9gm^c(XUXkE~DK>LZpuKiWb6+2B=6RhdfW(Bl-rZEKLpzfRtR=6VYzEn zu$^FYz|!Xv`@m{5uy7sgI~iCBSWO021~x4Ns|2gcz-qxNGqCw!(F`mGR*`|N1S`+L z)`5-9z&3-GWni6PqcgBwV5J$@ey~v)SpL=QKV@JMu#yaHELd>{Rs|;YkzUSoz@$FX zu?DdG3~VV_I0IV+7R7YcvpKreKQ@K_10gFNWCpmOMv<{l#sBUr*S4<31+ z&*N!^N7{#u-ztYS2y;)2$PwFjJv`0uh|c$Pm9A3=S<~r+zBxM`eJ3{aRmMJe_9u8$ z-}RMIbS>>~K>vA_e3Zk}2#;Srq`YdOuZ2F5uvcFEVKj+{YlOBuuP6St&~#46yxY7d z9~6p~MGdgPG%@+0wz~A^^~5cq9ujRzS0&w_NlSW4hVX);$JYS0?VVkgmJVV6pNc-!YBcMI<`18VY*6zZ1#M3hyFs z!3T!k+(h!)08jp5J@I=9dwE6wrhmiftrOhPcbUMm1KWsOM_gV1Bf7|Im;8fmHu4^j z@4eE$zh=+QUZHPJAye3ttguR1_7c}BOpS#iukbqh6Y^ezB>8(l&IqT=t41C-Qpq@m z73B%UYN&#J8gW|&^?2Xk>e!w4A`pvxMl{G^FRnXTS-xKea`9vz;DSHu1 z(42E)(ck%v*cI7(O4IWC`IEi6PA28Eo^&cs?uqXjlt_nG=)ZSWi8bo18IWvc@mI;5ZhNyigG^NYpJ+Xb)y#6K zk6gaOEwWkUx)Tn`D?jO@8<1UE(c^s!L7pGv&?7n|rSEhdz`i3>-_;Sfi@2+aOII-S zzKnTCYThTCGptto*zla;`IUZnow03;$THl_8(5z?uP6R6VQDL=^C@hgm}%bBygL&? z?HkL9Q*=J#xa3RQSG6io=|0k!rCqkcQ+Pp-x4y))>OZg&uxEId`s+vcFHDpLqE!P{ zz}`#T7;z7mG&QcTF8(pv4tdyL|F&zGc<%U3Ln*v9s^r zST82tZsIK^J-v5I%a?CH7@eeV2XCalphXFL`DF!)j85l$B+XIKtNz6_BgC6SycXoX zOW2dk>MUn^u=^|93t>#=6q3m4*NY7F-a$ZLb(NJiCI@yI++VxWS=S}YEv%a$mtUe8sv8D~I4(w*a zVyiUE-6qCv;*_bWd+%)Fc6c|yd#Y*Mrd%`hv6gE!<=W<3u4r9p=c5+To~wGidwuPd zdj3}0O$B(_lpb$yMax^;`6NzJhL=L013d=)`Q(`3SI(LT{d=^nvW74bT{kVUgz%Pc zwz!r0>P*hR_;Pw>v5S1Hn~vW2-1;{8sI&j-TisMxly@q-3480Jp7_e7&cHs(vfo5? za_UQ(O!@{iG8Q4D5gFTSdg31vPHXdib%R|`U-VJI+QZ8)$!e7s>W%!_%Pz98BYnAx zv@2%x#BVccr>|KgzyG+j?^1)*W$BmEAHj$5eX0G-4qE`xxM|KwxZr9Iw#Lm6jgQ|Ek*jk!M1-``->^+_2&tOn-Gm;GzyA<;(R zDu~-a+?4Id9x$U7gC_cBHrmtEarN+Zz<1W?_C>SSTqApgKJRbZ-+E+iuI-8cr({BP zi|POdOZh8@1;s3_)B7&UV_Tuv8w)1tt}%6128wW3Pp_3fgJ#rMx36Msk6C^JyIgr6Y@2*32MHA zw_xuQ=VTM7$@cD(k~)q+>xDKwDNol1v9-M0hY+WBNELje>U!c2nKJeH+v9SxzM3J) z1v_M_{wMD8t9z2)$4Pmt0$T|tc8WKa-K_0N#(@pcHbT>Or)?lLe?~K!diP}Sgg5`1 z)Yu~Wd>>dCOy^AWp)Vp?`c^(0OHuH`i&Fq&$L+taqegKw2*);4P2zO{Wa38SH3b;wR};f~^Caqlkyqg6#uK?2k%cnh$1? z&SQObC~YbId#1$S>2UNsVD=rbRe91THX>{04Lxzxx!Unr=MA`nr77ebh3(Skl(5(x z(uVdEf9aQcy!}<}C$u3wqlR5*I)|($3-72~8L!~2A)MC#7}=VFcjz2hugui(r3T(! zco!L7GrqvPEXZi+{cZTm`>tEdxU`&jl{fzD@!E;k{4d6nw!WWu+lcpw$)_nlRwDY` zBhIJteMaz!qTKr+=(bv9RNY4ZpP#ZZ9^{N*!YPwGNeNkfl!--zm2&(_!e{}uWl zw3m$z%W6~J+7xruJ|$2k7c=zvh=($fe9u8%`^`P^D@_^u*cxS|-e>z;KEdhp;k1-3 zZXL3=A?pjtGSIW6dKN!54wnS#*e*5BRRO=9RpgZ8HX>`^S9;<<>RVU329P>m=se(!ILW!Ij(7WryXf{F@2n}) z5!pzR2}u;Wg}3uQ(7q~iISXyZ0Ops;{u{Nsy%vxh$M~B_wca;9Dq|)x%D>tZ|DMRu zGJ#Wdi{3t+ILx+?^6~b3r{p!tpQb3Atqn`dY85ipE@nN+r>t~dn7U(%T{fqavdT7k zNnYCZE@ai-)f4}5QtvVjWvv;Ra&NI6*YUN$bPY=CaqJzmpCvu<_mb_0`CYm^T|-Is z$Jze#$4P2m#gH}Uo}T#nzIn@N*Sb!0VL^j)oMbJ#EmrBbA6t>teqU*0#+rR#>%bNYz_(21UA=vuWHE7uF;QZ$iLB9!SzjQYo}=Yi z#^ESfFW8NQWo&#vzTeR^KKi{k2WM0Jvy=0#OMCL{)fn+dKi=bgho!b$wJ8@C*-eE_ zWG-QXIv?LaoOP6?e*46JD_@#vJKqZ43EtMRyVeX7fl#$HJ#TB&Wm5xES_k+zSbyT~7L zw0*#mTEF~~S0^;S@p;#%rB6jRnfSd>8nx$A|Rd-Do7@EGqc`*2Z+Z<}jk*`hotDs_9 zs~(&Q|Ga0-c?H^Blg;I4(B%CZpfy9&?+p92M^0UvSJG_BIw9{WMxf}Pb;R37ykUgp zC)j4NonX2rgErg%)(Mus7CT8M9+X46jiKYF>Hw`%&h6OtRRycKQMc8efzPQO+ZiEB z0gX=wPv0<^o@XzFh1EHG7XEl)J;Nb1+eB96NLKKY;#kwO?Qa82h2>Hc$zDL@nBjwftul}!8KMG$Pe0A_mltRmRUsfEy;*B-lst?D5zMlRp#*65JE@aH#(Bs`z zL3PT-G-6MNo9I8_Y>Ak0EUW)SNuW>Pke86SmBcOnA^QiCFZ77tx`8vD66zCsg5FgY zBW}q?)_r{6DSB7tJ5-Ux2I7=&>WP0Mb)$NVyk^;7I?h#NGhHfmlReB;>$f1*Quc3O zm--55&;OyDd?Dsxvner;a#(mN=>p zbS+rzSTwkNt|kMSrx4JBQP{eOQ}T9C{D(eq#B`DcWEP4q%$wv5M}#NK1reA*m&za} z?RV_GtiK`S{iFcTV$8(k@z%)wZK2E;g#KZcnuf{vLS1>6Mqto)EJF z<=NIdk+L95qW4?@1=Wh+<&ET6Fa1ltK#0+zlnv=6Kp>?mR4(%E9X@Pn-1gX!5oH1(BQ z0-nu03R*cdy<6BBZOZ`&dFKjn)R}j_1v^VmKd=@m`)MVlnxbNe=Y zvLf}d9~n!LkvIpC_5Bm=-kjItev`U_+UkNj{!V3fmXIaoSG9ukCdfOQu-AqzNw%SS zXdTe>9;(F!g`;6v1XdL4_5QAfwinq(p+GFY5$^R4buwa;0OMchEKQ^Z~{-#v! z=l82>S=%~C4j5+VR_Ex_F7``)hx8`*=frN#Z()1~yOgkJgXuRrVmEt>o!DS9-i?KC zH++-+`*BykZMT>EW@VD@$Hb7er>NIkKh$p-Sr!k^$cvE9YG~2Jdz1G_=-)fX94wT4 zpo60Dw8OI)p5~-p$Br`RQFPx)ZEddOa=swSH{ANBT`8Jf%nUdf(bJJjxE##5{})-b&J5 z34I>)#Q9Uv)9b(*!N!;}PoIRm+Mez1BlTjcRB$u+)q z+kV>{&UN+0TLUHtoBZbC#y*TbDCv!#A!Sa#&idPCTIO`ZpnTn#J>bnNXmR;l_0Vt6 zCTpW_aqTU6)*QsQl2-o6UeCtUv@+^f$6QH^1%vFQ7D!T2O)873@~ua(w<5jqy;2VU zcjV8{mM>*hhx}>B^u{liIg+0aRC~_c1JM<PCf5@-NJ zwCLNdq!m5BH$MGy^{q*3XHY(v_E8a&nPs)Q&S`;yod_;N?x>a2cWH0@dMP7JM00O; zbwO)z7EI1D0Ya%ik*jfPiPL!E!N-yOHxp<5Nxkt8lKJoVULMkR?FR~Wx=tmDyD~%Y zc@>m|w4q&+|5JM70V6lvmQ)>K+E9CcZ7Am2UoL15I{AUDN|wG<`3>~pnBMsFrVW`h zsX8CzBFo@4Qf*_YwjdTxYDTJc79;MQvflU~lJDH_JP>;+C?8+@yy(QdTcx2>5uMbT zl;w8h?mN9VzS~DGYb$1t*Q^nB24%g#Z?sUc6Fspix9m~u#WQ>3|MZco>kzt!Yvj_N zQ2;)Ir{vv4+m$vZjaTx!9Jyo58B?S&`}LEQT=s5U`FPexZWX7h+f}#3FnC1nPUMcR z=#Aeb29V12JHMrUVwyB04l4V~y_U9S-v|d{L~i+G%-_fL#=q5Hezjkl^%(jZpYr(1 zT_lO#q+Lzrwjg))#NK#QGQX+zkX3J}NsI9|f(yxMk4i^b>a)v>3Dr$nnP1=>tOzsdVQ75aI}JX4k?&lS+RJ}2%R z=!KX2$6W+%EVTa8T?Kt+KXEreTl6_`w?SX!6IbfK3)<#>X!%dFpX5W6`YDALyrTd7 zRzV*H-LIVLp;diO+@;Xx^%J)hTJz_`ZHM00Puv~QIzK0FFZ8Z{;uf!_z0K+WeaoSb zh3@yhGojUfPTWT5i~5P%0&O+4bCT_?s!!it4}CNA@#%EJQb${%bwNvf{Y_D@57!P_lMZ>F`lk@%KL7EXZh8=@oyL&ri{$5*h+&% z==-3Duj%#fOhE?54@q*if%O_G*P>^z=b(S!#nh@W?X)V7nHoj;A@-T8y}vut&!mr1*G%5q*D1QY{g!> ztJnL6D8Xl6t?5aA%AhZXUQIZeo;@*1uYukMooRWB?%bbzp9bh9vEKM^q*4>|oey(F zfXHuwzUSWF_{bsY^dp8O=<9|4M6dTZKoaroza`V}gueC3-uNGho|JF@R_Rg>UC>vr z?v0-%i6!Doc^y>(PpTY>*RVdau{ZvUK5{yf>6Alne5E&jNgw)!NqVishkk^f z$@u$4KJ=s0=|*Qnz>2@g`~kY2w@AppSffh}?VlC!bipH4b?A4f1P+zJp%OS$0*6ZA zPzfA-2^5x#;f7r@da(KpgT!FqoMfTrM^5qZh{2VZ_Ftsaa$@8b1=PQk$pfC8)qc<4*PU9!!^yjbNE}IIh+Zn&` zSKf2f_%Y*W#*f|Zm1B$XYcBSlTg`Kwd0uax+l`+oC$ia#S7!VM)bM4>@67RTUMn+xCVgkvqu2FAugUf3tqFRezx9<_9_{~W;+gmEG|&HC zdBldvOpNw9$n&ki#?Q!j*>^lV;n$hx2IEJKpApS!eb0+mv&Hytczz;Y`!Brb%y{cR z@bJhk&#yDj4GH`={_&!}^YHZ_nRprb>@U6ck3Iex<0sy)%sj8}C%u}ld*xoZ#MGp#8g zZ^LJJcw(KR^;j?GvaTb)2EByBvJ&5+mg~Vk%VPUje~I+HTpJM2(>lzXS9p|!c9nGy z`4xGdl~|idoJ(glUnvPZ`UfvRiE^kjFP>}SC(`E>+m{Wbtp7C6b*94N<~fnCF7v$o zSDyR>=J{_%$p4gAb9=I-{7+@UH{H%f|JU+WSZiAP|5NXkNYD2zvcdiLXSQ6Ar$78G z(|;!!e^#P{XNWFs@s}Ij>W%9W<6Fk>dfUSj?R@2X-t%{iKjjzR^ZYhf3g32^=bcLnUyi1P+zJp%OS$0*6ZAPzf9=fkP#5s00p` zz@ZX2R04-e;7|!1DuF{KaHs?hmB67AI8*}vFD`-nn!?yX+&DgtJQX()cMk4!Tp8{R zTqW*Y+-bP8aA)J9xRHF2dj;-t+z8x9T!{EFZYSkorxQZy8$;BSBGoB*|&wG_S|qZa9cPQm>Z4-CzeKY zCtBjiKI1+9irb6Zhm-gI3od6C@o+BA!Ub?42~Q8U+c*d3;^MeGTo5-9Hxid){6hT0 za0R#!E*F=N6P_?GfE$2AW(=7zWX5`M$c-U4_75DgW5|vnJ4U=1veid+4B0Vc$B-RE zb`04{`zJo~W4$=ih>=DtFq8b^9O~P~g$Rdd2BSH+AkPIec&{1F?E_~7qhVZN2K9n( z;fL@C;SZh>jt-bXo^U~&i*tx)E#SRoG`8o=D2*N_achWMLs~c+Hvs42Zd|igS6gLw$8+Qq=1a~BEIBphh08ZXZ-b3Ck2N%YL zaL3_taRHo*%fsc6ZU{%-VuWLaW8^OuoKO^Xap4JTe;%4p)NV~c9)9kGwJRL_z=ZWb z&%wWj_ECn5;BLkZ!i~ZmkGm8X!d;C!5m$&CiEF@}fIAL16IX}J$6bQU!(G%EiC)|o zjLyK##zk?L;c6Nqv0075*yXr!xLTaEARIe}gKfv*j>a8}J03R*XX6Iog19hlATAG= ziwodJ;)dC!u~{4_nvEN8N21g0qG&bY7CRQ5iC>EwV%Nmv-q1<7pdE=7*hR6!iFcS? z7#j?2kR6Lv+4<2a(B+<^skjNq8izj!T`&YU0GEf$!G&={aW-x+&c%grMYw$2K-}TD z0$dR1-~zZp++ny}oamTa28Uxe4-Q8g@aJ(v>U!K<+;zBm+*PL@ooI2@J9$oCl<#< z2Z}B%n#nui3USBc3UCqJAlyLQF}Pyf;kco=VYnfNXxM{dT9BNm6 z30L9P;p%YmEZ+c@;p8q5Ijbh;N~LY_sB(lRc(d_KjW2j3ZY{@ni}2UuOFH7@WFgg| zf7?ppij#AllAZ__y2y#(=HVp1JlEi2IFT*+kUR*lge9)X5LuE&r3qKyOI%@a$HR+r za5gT0+;j-DE|IZw;80D_m}aS~T#B;rbb zt8f;y2D~V45v~&_FC7kT-7 z&*XEm!GCR@uQSh|uJic*Zv5Sb{ukrtne+~r=Mm<4jPcJfe%F;=x>`6s|DFFOk3Pxx z7a70a__rH>x$#$L`0LE`3&wxT_`f#3RF^pE6LRKT>RQfPC))SMpDZ}%ktd7vN^szR z`L}U|d;U9HxAM9D9TT}#b-d?9OiZo~xZs_w)6T~~U-}`vV1n?1oo7Xx;O~CjifyY@ zk}rSzcu%%)42A#EEu>TF#qpEhK7Pe(x1KlPm&cxGwU2|pY630!Kdjh&#Pj3dFkbS1 z;+z%muaNw}$1nCx^5n-K8K-#{p7v77&+Ay<@K*K9zh}nA^Hjcdwc(e@^7E75s`5Sl zN8x`GxsUP={qqm_<+Hr+vlU)`s#Id$&X+RG~FWO!* z^4}l7?4YieKJU^p1Bj+Ry5~M9CY$>5c`6TNrb_}zKZ&FuYeeIdC=mKOV)J&4!6z~5rPx6DVJKu_~ zHu;yNWE@Ym1qq9tNWD*x@(~?%u>7K1{}uVBeh*r{0US|9SeVWt{NiF0f)p z89kWdm)JrVKfy2I&-;lTaK;%gUSPE!#`}qF;K`#;q@}<0Jk!6UpC`+Y*1pO6ZcOG{ z@~hMT`Hr%|n-@fkZ{Vbtn72lL;|wn-CB7@V{T-Em+B7r+u0*oNKSK9GP?k z#gZ6oxlSk$3Wjs+iwrf8qS}^youC)kYwQ$yq-B3q(5St}Nuk3n`yoNc*=vF+bfjf} zN6_*18aIU&S@x@fPO#U6Qs@Z7TWPP!u|E|0M0-s*MIUC_p9y-py(Tw>=2@|nw9Pu~dpx_F_$CU+6 z$~{v4)J0&lm0O~@7!%1oN&}~k${kTDq_awMkJX%(kIo$>`%-}~lv$1-T24Xz-)098 z(lNonY5X08yrTn_J2EGzdB`6pWu9}qmhn`3&7hnUZim&HZ?75bNKylp!J_%+l!{o3 z_a2gS;?u&^X|E{?k1n)s%{@t2t*=@SHL43gvx!%~0n< zLYlF#6)r2ZzMLCU$v0cMr+R^)k#kGf$~jGT=B#b@nqiIzGx2gxj|lt=drh%3novUA znZ?#ubI*_jtUImTv6`*B3N81nVEC}%a<67!*4b9Iq*CZCY!6(K3~vm~v8sQV%chjG zaDCuPtLD#ixWPwMA$w40;krQR*vJ>H%i4v(dyHOX%}#r)tFx}%nxZz;TlMnDCe)Fw znrykXgP8j*1YKwC+UcdVIxyGzon+FG>gHR26Vl+4Edn|VR|T%OelOV_e3aaP39>RU z&-$ZAaTc}&Zm|Aj!p(s%S)ZEl^1zMOUI`O##LN6oyroDwpv7wq87a4e24;Q1`obXl zp+yU#wvtRXTNB=HebYK|E;yy!X+2?`Ebl{jtM#lkMtF+th2?8&VHj?G z%R04zfOW)ibG3k{1bS2o<@-dSMfs_pS6cdLR50yckSYPKnd1<#~%J|f`d!t zPcZ<@yxu-i*eH?{xfhSs7x0J)<_c|pNlsH)<~P-RTi}dp4IL^jOPPuO|apmz_(0r{tpA+ zmY_9cj9lItm~~0uds3S@8v@^xqzHHBJQMhyG)TH-#@AFvql6lNg z=2+l|-m^92)L&>mXIkHuvV7V4_9l@}#%{E{EF4jGiE>oUgll6m*zk%Md)>B@$KjI8A5dyO=vwkTY z#9RDgGPvlfWU%phFK7)JyF??@S{o&iA6XmuBPyEjkhRf>Xc%j~qNRAmnP)2VZ0l|* zF_B(p-EAtPVYAhwBg2rh?p3bKtu-R@Wou2UD6|r-f_-#?@TA3o!*kEIDeFL~b>y_b zu-ppi$bsQj?s+0Ja71D5`BD{uBa3n`kPHNl8kHMW(uh)TKnaW(ojXpEk!88#y};Pq z2^xr$n-Tt)irh+#erz&kJ1u=owRB+A5hrMse49*6bHgRi z;ZF@7Q6eL4wR2Lzk9aN+ODx50TP52-uMG_^*@1tJbAo%dYp3XpntuT=IlzC9<>rJR z-OlKDljJ4m3@i7`A~ENzaBhPJ&MwToSp((8xwmNG3z6J~8aSskw^0MV-J@*@8UFKY~#VW{!bktW1q-08p3E%Ck za$|1TZOXCTdqQbOZNMrx6Z(kdIVUUQ*PX`;CQ0Px0{N4HM?E;QL^Sau;W6&RIpG4S z-U2Zz3vL9BXno0lM~~yb*IfQ9SPJ2og0J&`$;15jeK%C{1b$nvxa6Do|K=R;elHv- z_&354;VO{aN94Z(F<1)37%31N1#>cR+;Kx(=eS#j6%IS{xIsq_4lNwk9AIi|kF}-@ zIVbPjJexBH{8_&#DB0lAU}q!H9c4Mkou4P=6_Q|H-uVP`#u7|L3J(bgMPzUoXke07 z&f|a}0#nqyQm7>y;-53;+E?&e(K4ht^~IqSdH=;nl+Us`SMz)&^8@H}_aH2g-lDD=yav-WG@YG;Sl zNMJ91HGVDr5_eEbf3yx_HievLzZTx)d`Qe^iTNQhpC#sp#LQ`N2Q3kDwGTO5LE6jR zA)#vLDdG4S0Z$>|V+1^ffR7Py)FyXGwR_l-{y5MVITeVQ8gf=kCUzlXH8OS~V>L2% z@v=!7a8!dlZ8(I}<0uZDA99}fnmsDu{MMpmo_32vpM;#p75SY-u|4euL*d!ZO?zF- zxi|2El zey#ZKN!9Kdo7{n$+>+2z_l!`u+C5^Ed-z^=V6}UAsL4Gpw8R~_gnTS@M+xyH3UiY? zCiHN~c~E8UMdpLZ+>6Wyk%{k~UF{Yj6ZWBqI9}rAhz#epTJpb(oYjV$zXg_%=SJE9 zxi(q8mn@GCIX!_Ew=5KHbnek4dPw3PlIS6cdq{$3_dG;yLgX7N@ZP&>-9X6sM_^OP zX}T-?0ih)X>`4Ja)dJNL2rr@3n(k^0Ip@^6hYe^VdFm|^n&t+d3xAUO=jMlhi`Z&J z&JG5M^NT=-d%=M4sqT593YV8TBXpj7nio8t;D}JIJ51he8WMSDO0L??54F03c{;M% z9aZg~Qtbw7DZ$xr&2Jd1mci5w(=wRw-N9qrvpd{qKP>KV{dzZV9xVozLQ#x6XkBA#EEkEowaVEAZ}TU zdsd@cRt+Stk;ybhnNS`hL(USB@=v5JLCQaovV??rcJo4SB@?T5Vk#)+bP(F>#GFQa zNev{G8cg(*Or|l)L~0{GH?_CZQj0H^Y~M|4@x^=bdC$d?8b~TNm`E*?X^b+F+EJgI z+Satx{;8=gA+>*!+7eRxr=|vyN)0Ab%VZiO2vrj<={Gf0WKrl$+RFz{&tmD9q|-w> z_mED{;#z!dQ$?X4(c2r{liQqb&CfFUy5U;}UpIWqviJ@t-@Wi1fbU-T4#0PB7T-p3FetP+a{jWIfnWu( z|ALeiPBnh5_$evW*-( z-b7#*+DO&#H=GX`b{2;RJA?>Gqx%MN|G4-AeAU8#T-+E$r=3*m9x=ckSA=F%9ZBYf zg)VcCo9-S45JpR*UWcG*gJT$t?0G{}DGm&6MtxPgrPc0eB?V}ANSkh77zi>9^ak48 z(+2#=JsX~=YX41W|3*~*UNaojx~ECVJ+;EU2+b_|_3!SW0iTh2wP@!;-s*5hzOp6m z5zu$(NMJJ(Jbc$Cw@5~U0vL|NN=UPfQjhQfVP7OKNh?EhH&NZ8y5!KE$wfyg% zR?)ARYY@|iyAkDlGUe97OI)eL*=qsDjsc%AaA42e1^>qs&Qlc5$BdOvF~H&z;d&T0 zIje31Rpx3{SxDTNs{z0bd!!0z7<) z^SJQ*4xY#1`5iou!-EgcJhc*sEx~Gl=lAeD2G8%|!Hf_eo?DfNdW7v!VfzDYkHYo` z*dB!qzYkj*_77}-3_NWNA~B4_AZpBDTX`3{WKW>OS&6hgNL>jVK5VyXqQl#06!3fs z&%^M13eUsv;3q{L*5*7UJb#AgA$a}_&qMIwGtys==~e9>SM8RyIW5B01zQVjU9h!a z*_-`y)P$_%Dr-No zmLqFFvX-kXLVaW{7g-r>@=SL*l^%a)c&=MYXBk5dv1_AC+$q)0yLY0NpU2R67enHC z?6!B&e5HhzxJQeLK1~al>B7&&!21D=KZo%LF#a6N1m6wQW(P6j_?bw00fwK!@B$1! zg8|zN9QO)$W{@u0U=uvvH>Am$xfbxMB^Vd*F8pgc7Z%?c!alB z;)oh5t#I=y#2PL_*)q1YId6$Y^+PPGw~+WlB)%Z101Q-S5^bOe%3zac2ANac0as{xbfKRJ+mDd;6QunJX+I%7eDv#WqLiK2 zHN98icpZ*c;dmVmd^fVhJswTo4~u&gOdW2)7;5BtI$O0{(&oG-sr?vPuOaKl$a)P~ z_|(We9RecN?ul*g>D5lVCfg2cJFM-nw)2{U2z}rdJWY{JOO)7;MdoWT{usvBVEi#M z@lA=fIj;)C>oB|u!|O1-s%?f)p91q^lV}v!X^cx)(rwNr5%mV5HX-T_L~SB1d|K5F z+NxgGY`+P|%W%92$IB!ZmQV$grg>V0FDcX8FuerR+c3R^7<`$m6{42g07xjCLk#Pw z+VVE2jIGGnfQ+rk*g!(VCFJHY(V@&ui+WK+y#wQmFunuhizJ4xDx&xb&C&BJ?Om9j zhv{9Io`(rPm80iHOg4w)=z7i3b1LIKWITtA_mJ_N=7^Bj$dftxzKD7s#_z-UK8)Wd zG0&e%Nje`esgf@GJ(c(YjNgOt0~o)jg-Iw?nCp~jJ51|f+78n?m(tZ2+W}&9Ms^*rdpKN@aYEjHi(CF*2S)2EH3)QA1@sB{H%(yn#eytX3Jj zkg*yWyO6OO8TjteSQH&b%xV#n&6LW@lPcyD#5{?ZPZ0AYV(?R9#CmB1Mp8CkO41W5 z>9cGOrGlrO4_P-F;5-}H#e`wDdoJ^x z347gfweEoMCPfPAKLcboF`FK(L0MRl4t7MXdw7R?6ny#E7cvo8B#UZqu*#Bej~Wtk z-oMK}KHz*GGva;Bi0@-YypP?2@8*pmc|4)ab#uXFqVv9(6WQ#$SP)`y@V&e2lLF3j zNP7=y&mrwSq~WJYdk<+rFr>M;Z7?7(JBAVXt_pk}f$t*lc?7Rd;@2bG(69V5A zf!Q&Pz)lso9)X<*T#vv`1mdR&>{Nm469PL$V0MgM6!5f=^D`~L7ZCU}1ipa4pJ9jP z6Z*hCcauATxIYsC85}$_{~K5B=Gw;(?vF!~pj6+{Jika1?~ufcB=L?W@nR|oSgavNwusl>2}-Sjbs+bm%Jnrz-vx#QzlW zuOR-Xh=0Ws?@L7dD=G0m74g~86XM@c@tY9;2I4m%{td)$^2GZR5x*%V{tXeI9bLs! z>|2Dq8R`F64J9>6(mu2+^?$$5`*r&IynnaHe;z*O-simU>%7nVte^Awe9r77 z^-ZL{lho-wtLDZMKch*+CWQSz{?s|X!#cj1q<4_?W|H1P(woU~k}mN>(%$?($9J%2 z|M$mE^aP{8o`K z@k5f|`ak(?EdPK1oa8HWZQsftZzJ`sq`r;Rx03ocQa@wke}C4v>@h#-H`YXREUsm;4zy!GC#LBw|?=kFX4# zkXh-|Wlr#kL%A}WIFX(7=_YbuCnd6p9N1ZEH9PR1pOFJ4eMS!KEWrUX?OQ?;75KEC zJa~0_>6WF+>?*a7f1;~IyU3YW`6|&axk~ivbh|$JG|eb#R;s|uj{CAI(z@WRG6$y9 zy5>sq`2hL6lCEKur6tOWG*jF^y~3|n`bh%6H@@H*o5VOjB!5WW{#uudV z2x)vlgI6skw1`W;&@{1JnMX?v=9SYjhdE}ClF?yGh~9a1y6zFibOt~ghe_k~kDHY% zq73m$<_#3HE*1P)m3c9?I)$tzrD9K#Bt|(D&N`JU49RLBQT9}Nm6r=)Zusf?a*NU?!{B@}Y zP+An2LoB+SL=TbI%PCWbNOZY~(%wy_N|kv3_OSfI5k+l=o3?r5#^$!o%PB0J(ze&Q z;SnNGr7H)+`&u?n2GJo#P()l2Qy~mxa_>CX5`q@ z1&Z=V73368D9k+_W)CaOA2Ei6^TrkAPRY$F&MowOJiIV}_~_hX4;xjOGbOtyuP~oJ z$Sa&sl;`<$*tl`@Z?uPradvUOS7=1;$eamdinEJyi;MFMMirT2a-zuOj3_G1F3hL= z*`G${j2UB!r$lnigaXb(?g)Q=L9rPvVd1P6Jp|5J>O zAsbK1nV3uAE2f+lWRJ-$7*)*Cw7;J2^S?fwUIdeJ3Wtp$PqQcH7v_#LBZ?x~!zPRz zNipLe$VKbtIQ~VW5uH3d4=P0N3b8`CJY;sYbK7$ zW}aU_5$CiEi`lzuiqOdXF%;s{GBv!AOWlks8lF9t_4o&hlbJYf3{_Gyazep~9ImW6 zV<YO8 zb7AKcjvCJYO*BPR>!{)kqkNKg?K)95Ion01Fn8n_>IJxTC*~C9=M)UjHTkF0;(Q7? zeMD`9i-Ky^c=KhJ4PUHk5tEfNUz#5!n$6(!amt7L54cFT--EZShA^AnI55 zck-e8L#pT5{~Gcy?gLwP|NA6o_~;4LDqIToQ)@alr*Jeq+G5j{pUGpYj0NN1d3%#R zZp?`6aU(}^X=d{e6rOBq64}GKE*AW+{TJm?jW*d6i*u;5|N9q~l4~ZL+Tm!M5dXj; zY}2VD|3tYSK5j(r@QL#Cr2G-N*;G(Dn@{8y*_nXzrj^vEE;D5=F8CNjM zmKzIF?V?~#D4_m$1Z9ErdtcG-GS{U@t+r(*KS~X7-G=LjhL4*-okIaPs_g8EV{)>o z(G~_w@notWg~O@y;&x6=!gYYu15n}Gw$hoLn9!Nr8D)x#i@DjF;`XMvqZvzoG&X0l zq0YfGcYjNHzwSJF54Do_7~cJ@<@Ye&|NpaxHf>DX2}Ol%^9zQLnJ^-^ z?XY~BQv4s%md8=>G5N#V+9^w0dDP7PsU0eL%0k^;&V&*9G`{{j3u%*wE|_{?`q`?{ zdr|QS>dwyRuDd`?g#7O#d_sRVVR*4^A@Uhb0qBQDbT1)SPrj{^ZZI@uKfU1nPGyQ( zlq>sTr;qIq=6AY}*4}DKAM-P%4d@t6cdd4(_knc0NPoMBZnGUjKNr%$H(5@mgP&%b zPRC3-Zl{B9K);)gTgd)?dS67xDmwVK$WQ1vNk=vMtT`P$=;%YoHFON6BZrOxI_{w3 z5jviwVDWidaXS8@qYC+YHXW_Wzh?YS$HjE?q~mfruBPKAI>ym4o{ouh+)l?f zI_{xkF&)p+F_tpCnciQc<83-Vq~ih7{G8s8((x@F$LZKhX`ZC_EXqIcc-WSXUUc-P zV*nik=@?E&0Ua~wh|%#d9naFSk&f5tc#n?H>G+0@Q*>0KayW~QhIAYz{igJO9vz=i zI=7Htt?B1BbQF+3o#?$Q9U(fdp<@^wBk34J$9Ot!qhkggbLdz|2R{<^JRO_qc#DpY z=r~Hp2|Bot>0V>gfR1zM$fNYy(R&vDe3(J+chPYl9hcFu zl#ZwASV6~&bR_85LdPCDKB6N{#}9P;LdTzU@b0R-3u{$6>e0d5(>15}v*`V5`gJ}X zjmf`N6k{xRb)4d-e=Nr2OXOz z-4>*I7yUesjym-7ee}MN4&E_xF};6CHvj#if}sX;{2y&W_mNX$YGCq8`Rzv>Sbk;G z!8}~bPd~}yqx?RL4$D91rbsV5@cbP8X!&t3-%q?W?FJb3k(>15eg5o=9Af(;X|ZSj z_|*yAKtCkdTur( zIJa=NAEG$7c; zO=^4NQ_c1U)lFl?xu@j#4^X@-cz?wQg5Rb%_w1~5tKzgSW%*NzF9uI4{v7y0#dm=J zs`$s?wd#2Dn*pz>czNm>+0Sl@Hw5phcqi~tiuVH_srYd4MT&Dz&gm{xd;$12#aDtS z72gW}gW~(ZzgPSR@VeY_o%Sk2PieA0?G--@{3^xUg6ApT8~hH%hl1a(coFy-#qS1x zUhyZuKT>=H_yNV=0WWu^H@`>0vlRauyo2JkZHG+pQM?s+Sn(d<*^1u)ez)S|z*i`K z2l!USmw|t*_*(Ga6yFX0tKy%5H?HfA&#&Nq#jDu?sJgjQ@n+zC6~7pKvf|f(Pg49A z@Fx|Ig0E0~G5C9m^JA1;pWjvdHSoU_KL~!tS>8DCgOse(PVw?~qEg-TQ@kN~zTzFh z^Ax`le4*mQz!xY!6@0VeG4M@_KMnqk;#v)}pR4#y;L8;+0^g!IKRL<%98^3G{;}dOgJ|{swrR`ri0_1|CrS zSMaM8ugn`EQyls!-WYt6;unHXRJ=d<85k{}4Q=__yHQ6)(*X&{7=6Dt;#T7{$*AU#fUd@P`z?0eq+81>m15J{$ZG z#g~BBZsd)_^Wg0i-w7U2{2=&^ik|?#LGeoVe7d^1LvcU&?TTLrzE<)6;4dgX68tm8 zZv+2S@rB@3{N6Y`172D2?ckjh-wz&A{Cn`xikGp=rPa+G#p{7DS3CgzgyNTj?^XO} z@I8u81piI(dEmb)z8t(+V{d#mf;UxMmZ7Vgs}(;6`;g-QfKONa47==G-Aq%w4fsmM zofse+K*l#gpJ272gj&Oz|JU za}+PfOa4?J<|%$Q_*06v1K+0j<=~$velzis*8Pfz^E#fnOX5%+3xD?#=k>twUMpx~ zpGlCG!#*-n>{r?Ic3O=;Lv;LOh0jDxkAWv15T3I0by}^bT|r9nX9{sn*E~mmNH4bz zxeVM7-U9l`|Ij&L?dux%h5g^CE1@voc)Qe7Jn8Z-K&V(b=v18K6V(Q&u#%v zBR)=l33S3Qiq7kH{5Ixg*k_deN8m>3p8`Lo?EUph_P;Z6_TRT((p`*#90{H{Ap9KU zYbJ4yk1JQ_|NXE}EBj}i{zqP&*T93|ouL0YcvSH}!IR)kVBhs@@yCzfoj)PsoUaV* z+vD>GU{A$tU(S9N>;oT*pHBY=*t_y`_GM|SF4hmj-sxXOoa5u{-1~6Y$6@dEZUav! z{s4FqoZPUl)!=Dx`qjR6ft!Qkzsuhz;C^sB-1A>h(`EmI;Le{W;34o?D@4Bwajwt3 zHcNfB%fj^00Prw)5SM4d(23tGmVVT$D0u8q;pk?}LhulH2T9hf1dqnWzA^YV@ZfX8 z$3Z_soc$~Xe}GLB+PK)}ca7MixfG&h{O5d>5*Q36?igF_*2O581Oh> zdZw4-cY{X@y*kf;hl_=GM0vdho|@$48Svmt;TOrUXIeHE|D&^oqdJ-#@Yub=)6jni z+_y;hbm*)DPd@17?}0}i5`GKpe{?zz3oj2|xrz7_dep0P4mdp(W%%XN?E#)xE_^C< zZUzrOCEQ&Go9^sa3U|}ZhroT$3J*YM19(I(tQg1lgQwPr{S??A2am4x@+wVHZ`TRW zh5fnUsh7R>mw`t¨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

0!t$pq6w_Ki z@V>M&E->V7Dwl-NE&wwIt93yfc5^KDu>t&+V;3qPXNsPgu>vx)!_Fm#qYs2Ezn;vO z_oEw^=PL+vDO;=V4~Pn19VRebZzB3RqDIcMEok2@3_1ef()C17dP53DT48|PPMI~c zYL9eH>82}pElr+o<)Yv4{5ykFhA8~a&s~id;c(Uq%YIn#o zebv6OXl#sTgugND@@?MO8gpy*d56>>uP5X86{lzqzz4CJfGgKMBY9buB)-M^#c~88 z(Fm=G=~xtWjfF@BtecOF&jKk9a5+5>oJ7^@&}NpYxs*~&Gex9P1;L>5_}d@FhTR^6 zIwoH|jsZrnG2p7{ZOQm&2EZ;ot8_qJzRPzZWV7MnYwm%C_jM5j=M>D-s0kzNb^LbP^1SzYP_6x_n6wbP;}QnQAu#>*MkzPxeUMe*F@}kD{rVs3= zpGCsvcNEsFAB7m#P?9-+XmiP-mvio0h+RxBKnba6L)OO>EQ5q#akqamLrL8%`% zK|G0Vn6C90FH0lRla;L(R|xvZI(OGtsW?A?*`FvyQRHeb0SzDCI&Apxp$a^;bm+C< zUMEOn60v5TX#3isv6vubCCZA?uH4A+<}xyCoX29swc4ojz4R1N&6X{{YSVcF@6IkJ zqw~2V2}~u~6@1s_@I%K}o;e~F!fh=%nU;%qrA;0bz^-W#us~g{e!L7 zsy56fVA0UUu6BUbbP6^~bQI@;k8XE|s+fD!=Z)r9HZjp^Dd>S(Ko-(1x+o$pd7&kT zI;81r>nI4mw0wY5=G8vU+#W!Suh;)lH5w835YMU6+l;hBo+&9YkaKZ{}& z&|s}P^Sk7*3Iu^DG5$Je0eR*Ohk`Q7LfNYnK#RD1Qp2=ph z=;a6?Tj$PNw-rilKBs~4lra^DwixWM4+oZ9Z!4~9s*`@JxJZ?|JgKp$O}q|Hlme=$7p3a-l$_EM%* zJLKrpIaAh6b5{b)ts-wv5)P|%a*C$Q$Ct=vlUUU=EtqPE+oTZ8s(HR)=K~XQvWIqE zEXbMQzZ3qSw4gL?;-I5J)+-*Dkc+pfAc?!<%hCPKGEer{@Q_m_89As`R`=(xRO@j@ zjo?aw7y?h2obIc5@qLR{p&?L;nnzfnt!a?$G7ZW%+HD(2*-XO4Ub>(+yC#KK3kf2g zF5XRM!}r(d`~vchbE_jtp3fEG8~)WPZ6BkkXVfKefsRum@~jW-V{gR$tbqtX?OMl4 zUU;p%?iYMT+!0DHoS~W-A~@VGscUd$c2<=h_~aTuFhri5QKb>dNXP?vXKb2CP$`{K zyxv`u|0Im^Ct~OOk|EABn|*}4^&x6VlN=rfpPnn3CuTsGm7ATlO^G!3A7e6(f=c1L zVV51vi1Q_ql?;=EslyJE=ZCfWEqa4&DwNL}Egf=8Yq^J_66Z(@&_!yw*xl%EDh(FO zhxxUrEZjIK+!LX}6mP`PQoh`C;dy?1r?Zccwa$3DC|nXtLTv?ktTeo`2Q(YD3dwl% z3UP7z?-P_u5vE+ZYy?w;-7{<^x}Oxr#J_A~YhCnBpA7rm{nx{-ot*-)u+N1{+q04q zsZl$0_1S`W(T-H;Y92Z{m}9{|0`Fh+Aiya@MOOjQsVaUq66zex-I z324ESCnbpE64K_WtO1d)P$mpzmxv0;Ho*9qoAuB8#80CleZ2k#S>(d*<#Cw;nDBMS zJ1@45j=E})w9TcjI!Kqf(;Vn#&_@MEzgJ*c^eCa*CAgTpWtqyXCI@WbMQY91T2%$& z>@Bn#foV~qR`SlQuGsWhgPtj1x^L{6;!+v|0cqu{$ESeRVR@L|oFf%)uVw0FeRndt zDzZD6qsWp9c3mWt#Bto&wiO_CJe@>wp|821(NcQ`MwD(0vEk{>u_S7&{w-4>aC!nR`G4ydd5Zsh`-Y$=_slj>^oM;Yny1UiRgIi zlRY9qb4 z)KoC>YAA@jL`9d0egRV++KJV(S2Jc#k|BzeAu-Vp2xw*ka_CKN-xDsZI`*^`HK>ws?vClfgdHt51*1@v6DT99ao3S3zQ1-?(TDG_n|Vv zAzj_wC7OhxDRD}HWRN4GK?qD^1g!<}IGq*uR2TflM_)@0OE2hUASx-vv!*tYdMEI| z!0T|oU>Me9DX;=dO8NFZ33Sa51%P34HwIs2j zwa>wY`mzzrg25u$?Er2f+!Zm z!)ujb^b+sr-4w@C%TS~AdttO3HJXDO%V>G1aWXrq!Ds-cLy3`qbYvc*S9WMUU_~wh zuWEVT2;8X8n>@yvx-5^B^5?H=R6dLsBfR^{^^;7l?$Qd3dfvhn&o5)i?f{&9(mma= zUbx}pU|8w`$x@+Gos9wq0Zf3n5->{)t6uvAB;*Zu#U^5XTjw{6@mR~;nug$3D8AFl z_K8LVxrMLHu#}q1tpbmcaU~oUy6UhX!MLbU^6OGVn+KzBf0V7SVFRz%kibN7;Xvt6 z7?%tmuWY_F!svmzACSvCx`t1CKeDKmDbZ3PvAv_4+Q|t5M?3qd7m!M#I6$y5xOxfu zvpe~imaa{v#fu`gxjbDg4kovdBrsZx*_{Pk>8VPI3M$T$a*A-UIF~4Lbu3S2T|Mig zdoZ@fVPtFU>xH{HYO1RvGdkVY80mNO1K-A6Qo&U9ch<*7O+c)wi#d+-~47U6EP@MpA( zCy~xwq}RdNm#dyl_VJ=ABY$!eg8fc`eOs9I$#REqdSBcV#|Y0aCrD_bSP>D=OfEJ~ z0M}h!a+?!ye`eW*#t0w_kBvGK4O;3@o*mOd0;F&(2{r?-4#U_ z%ut7*LuTF6_@!D-w~+wQsso-LroI;<4%npm&Nq{@b4TlWJDS{i_o+<9>a2dWOVF!F zLR57>5G%Uu14YSkCk9kwE74)OcZ8(jcxkDv+mB~b?3}K1!>V*|F5e7KJXk1Nf&wKe zPf)E`je0v1nG`|9vY676Le}_IEgb-TUHF)!10)m^H9C5F#(ve29XGgDcqjghb&~8zuF#(CsExXzjw1tiYL=b-9$c5J;4UH~% zcXZhoNS!ZHzk+yAhUFqPg5z-xcTpb@jU+X*?NA7D4_4QVlE5G62PW8%1!1-7!nNA; z;uKjwutvj4i(jCzpJHJ+)Q89T8gkeNBf(X_I0gW0GQAN(O*7aSreX9mSd0F_P18Gw zQxgA=kwDezJ}O+W{E#PWkXqC1Bb28$#TWco;hx0ji&$$E#HFU6w?8YBR3a&nK&@Lh zwL=(YlX5e)6I3)wix6;2VN~*q#NhMp5jrSyg@htwev|o3LISctN-V!xomM_R=^lOE z^#PBkKHon!j_-)hDjIHmrkL1w6aawB$p^PD<#%@PA?v(uN0e+rrgeo-8wK<1nqE$Q ztG1MOv`CQC9&VGR1%y+Z(bP7bl=Ve#4x(2tO%mEgdYslV=A{sbxBB1*M0Gu4EPWrB z^LEbP;P7+^V=X6Frjx8#%d$D4^qaYKSTBgcxjaJU({7KjytVplRHnvcMf z`WD4cQ0PJel}cJt%$EFFV+(Ef#XO)7jZo8gC9x)9?cM2kaWq|0L%>I%!!S9=p8Adz ze+|BzX$o9)ECl_zZc3?zeM}r?yhUbQ$G+#d%n5p0Edgilg^m02prz`6)*+w~o6t@9 zm+81fuEYq@WRMUlU;)8x3((?YEycA{;%ubta8rxgy^C1DH4}*nMT6L=i7tyVJ;I_Q zzG);SM#N!s3AD}dLhD(eXo|_Kz*;#T48F)kGst%-{eagDkI08&r4z}*-1xqr>7OKF zpDUaV$dK#3ssK~cgdzZmzK>G-4_|dLx_nf)u*+LiIKM{;d4&9H?nQ&bM0r&-BSuAV z*d3f6A00nlRSy5PwHy56{b<&h6)Vx`D5b{nt5V&ufnbrlVXwxhnk(9L)R2YyQJPM_ zp#r`UP)erS(JD&r??59pyBIIvDT#Y7atL>gWNvji8+J&Pem~@jyYkQ?FybLk6+e@u zFzGT(7@ruUkPT@mrf|b;6lX2xVs(^W$&`(n2(sR3PF1UPo;5MhQA8!b7+)aN3q87U z6nCZa@Bozi91M61fm(8vP<%2kBMQSX-vD+Fwt`e-G%y}xC9vixaU zl7bn%aP!B4u)i|jB z*|{1D$k58dC6|}OF+ejgnN)R!8bx+3WWe){BQF6|*pBWT>5C~84p$4)1AMFSW(YO8 z`l{@9F-Y~W2Zk+ekF#|!@N8wxk~x?q&Gc0ISfT&H-=o5geBMZ~mf0B>qj zz6!5PUfkPZ$@i?n$%n#-hG=UM7(N_*=sf)dkd}1`&8{duXw<+Uawr;# zqT%Z8D>rYljdGj?h3cR_Z3BoskS~s2QORIwT=N{=inA9?GgwS=zUJ-QI~+QneHb%zEAfWtA0Ik~!@-Y@tQV!q>f zW2uFOzvP`8GSo;!F6a-9m9P@tXgMmSk&auWU@*fvyyZ1L9KJX5@JH+n4B_MG31^z8 z<`nj5ZNZoelrz^fpVj|-i)>Zaht@XHHOViy*p7JPN}-w97j=F7)foF@K?`~0n5&#D z2%cMGm;`{v5$BadOsqRH&--IcM+YcYa~2Lk864eRpSVhg$lDpxWs!pv;nK;EFglyCCuk#00y~ky zCqwqB$Po|{*;E@=pJLz)s)h1ex4r28meg?hc&s`X4j)^+lh1pDy&Z|<6l6}9BBO$6 zX_pFu-#T4kTXrWy9ta})^l%TfgcR&Bwzzo=v&6Ii^p+Yc|J<{p;Gh-)W`9sGPubL0F5!bqN6XlmlDXv1NhG+Z|m&(L~49kMdLY6Ig;tM_l=Tv z?DSk6ARS8hl9coxSLfASq@#s?P7V$%b7{<5nsP6c0F4zq9pWfpFJ6z|lj~pEiqNt` zGy2XUW`P_Z!}d&4Lwp@n8R z43eb6B|^iC>)}FpiO^%_Y%IQmw?`f&K;xauLtt9ylEn0Rv?y~QXCs7llbM2BI=y2J zH?5INh`|s_Dm@4)MzONlK!**4Jb!!jTx40JX>Px;#ACG8x&nwj*b0t}ydWTcqAxuJ zJW<$5$RAJ3jRUGXQAZX4MK6*UXhxEZ#HaDg38X#Fw9vT5@UZDYa>I^kNsRk^sJy?_ zsvcpL9>0Ey>!8(C*osEHHQjD=M}5;VJ#7@;);Wr#1af{uY5n=(y+Hu)em1-~$L9nR zkUKq_G*>j9I!EUI<{r`1?45x?0m5i}0s9I)eAX~5R47G9prhn!Wf9aXCo^4XPKg*v zn2e2tivFFPn@6LdsC@i^+BW2ogP7zoCX3?bY(a|M5|ZFY)?Je2AQAELtHJT!_Ez3R z4zlc9zvGSF;!MP*T8|0ix+^PB02Bi;0X|WFB%jyzlW4lx$`h#X@sq2&`zHuxBDA~w z7<_ehKe@U1Du_+=sIBeZR{Dq@L>G>Q_1fe_&q%TJMMh@{MqFA-dq~Ej_|M|HdED6Ycr!KKA*G`1Ah_&j03r)AQ}~`+B-OH=om<-+jIEcklzp(ysTl z|E}lT=Qk;!_-FUG^X>irA^yhmw|Nl$efKBzO7{6ezn1fPsr3ARitl*G-|voF`LcTw z_vvnLf0cXrU+}{}!GGcTpSknw^K0S3`1#B3cl-S3_&q%To9=x3{OzByBlX1ix0RKD znVdiP>K~H>?ej}|n*V>3Tl?Z);RoK|#(!m1&$rLNzsGAfvef|LF{^8*KUv~HZWp{s*Qye1y>^%GY9em3rX7~S9cmA)s z^V9jZ^X!v@&k?fozvs^Xo;!at8Su|=Z20d>IGM6<=l|~C)^YpYzoMUCbAn;_vrl`j zKbhQr^Y7|;o4=@^-{r#v|LlDG{ORQUAN)N%?+1TPKUafu`J07`+x1>^%Ewx8eMs`*nT(UrSC%eqA|jIRC%?hMxcDKeIdOXL|l$ zcIT(>|E2$-=l^4`SmX2UI+KR`|H}W=^S@^Yy2nU>_>-|6cXFcQ3;@fXw xEt}k%UipLg-egx!bpQAL|M;imr(gO<@zvA&|Ivo?@8A6yIsaFZ6Ovz7{vWMFLR|m= diff --git a/projects/birds.c b/projects/birds.c deleted file mode 100644 index a07d818..0000000 --- a/projects/birds.c +++ /dev/null @@ -1,283 +0,0 @@ -#include "stdint.h" -#include "stdio.h" -#include "stdlib.h" -#include "math.h" - -#define SYNTH_BIRD_STDLIB -#include "vg_audio_synth_bird.h" -#include "vg_m.h" - -#define WRAP1S( X ) (X)%44100 - -/* - * clang birds.c -lm -o birds && ./birds | aplay -f cd /dev/stdin - * - * Performance measurements: (generate 30seconds audio) - * - * DSP SINE_ACCURATE -O3 x Realtime - * - * on yes 0.182s 164x - * on no 0.134s 223x - * off yes 0.113s 265x - * off no 0.074s 405x - * - */ - -static void vg_dsp_init( void ); -static void vg_dsp_process( float *stereo_in, float *stereo_out ); - -static void write_profile( FILE *fp, struct synth_bird_settings *settings, - struct synth_bird_signature *pattern, - u32 pattern_count, const char *name ) -{ - struct synth_bird *bird = - synth_bird_create( settings, pattern, pattern_count ); - - u32 size = synth_bird_save_size( bird ); - char save[ size*2 ]; - synth_bird_save( bird, save ); - - fprintf( fp, "%s:\n%.*s\n\n", name, size*2, save ); -} - -#define _PROFILE( FP, SETTINGS, ARRAY ) \ - write_profile( FP, SETTINGS, ARRAY, sizeof(ARRAY)/sizeof(ARRAY[0]), \ - #ARRAY ) - -static void export_all_profiles(void) -{ - FILE *fp = fopen( "bird_profiles.txt", "w" ); - - struct synth_bird_settings *settings = &synth_bird__default_settings; - - _PROFILE( fp, settings, synth_bird__warbling_vireo ); - _PROFILE( fp, settings, synth_bird__pied_monarch ); - _PROFILE( fp, settings, synth_bird__bridled_honeyeater ); - _PROFILE( fp, settings, synth_bird__cricket ); - _PROFILE( fp, settings, synth_bird__gray_shrikethrush ); - _PROFILE( fp, settings, synth_bird__boobook ); - _PROFILE( fp, settings, synth_bird__shrike_tit ); - - fclose( fp ); -} - -int main( int argc, char *argv[] ) -{ - vg_dsp_init(); - - export_all_profiles(); - - struct synth_bird *warbling_vireo = - synth_bird_create( &synth_bird__default_settings, - synth_bird__warbling_vireo, - sizeof(synth_bird__warbling_vireo)/ - sizeof(struct synth_bird_signature) ); - - for(;;){ - float stereo[2] = { 0.0f, 0.0f }; - - float b[2]; - - synth_bird_generate_samples( warbling_vireo, b, 1 ); - stereo[0] += b[0]; - stereo[1] += b[1]; - -#if 0 - vg_dsp_process( stereo, stereo ); -#endif - - int16_t l = stereo[0] * 14000.0f, - r = stereo[1] * 14000.0f; - - fwrite( &l, 2,1, stdout ); - fwrite( &r, 2,1, stdout ); - } -} - - -static float dsp_buffer[(1024*1024)/4]; -static int dsp_allocations = 0; - -struct dsp_delay -{ - int length, cur; - float *buffer; -}; - -struct dsp_lpf -{ - float exponent; - float *buffer; -}; - -struct dsp_schroeder -{ - struct dsp_delay M; - float gain; -}; - -static float *dsp_allocate( int l ) -{ - float *buf = &dsp_buffer[ dsp_allocations ]; - dsp_allocations += l; - return buf; -} - -static inline void dsp_read_delay( struct dsp_delay *delay, float *s ) -{ - int index = delay->cur+1; - if( index >= delay->length ) index = 0; - *s = delay->buffer[ index ]; -} - -static inline void dsp_write_delay( struct dsp_delay *delay, float *s ) -{ - int index = delay->cur; - delay->buffer[ index ] = *s; - delay->cur ++; - if( delay->cur >= delay->length ) delay->cur = 0; -} - -static void dsp_init_delay( struct dsp_delay *delay, float length ) -{ - delay->length = 44100.0f * length; - delay->cur = 0; - delay->buffer = dsp_allocate( delay->length ); - - for( int i=0; ilength; i++ ) - delay->buffer[i] = 0.0f; -} - -static void dsp_update_lpf( struct dsp_lpf *lpf, float freq ) -{ - lpf->exponent = 1.0f-expf( -(1.0f/44100.0f) *2.0f*3.1415926535897f*freq ); -} - -static void dsp_init_lpf( struct dsp_lpf *lpf, float freq ) -{ - lpf->buffer = dsp_allocate( 4 ); - lpf->buffer[0] = 0.0f; - dsp_update_lpf( lpf, freq ); -} - -static inline void dsp_write_lpf( struct dsp_lpf *lpf, float *s ) -{ - float diff = *s - lpf->buffer[0]; - lpf->buffer[0] += diff * lpf->exponent; -} - -static inline void dsp_read_lpf( struct dsp_lpf *lpf, float *s ) -{ - *s = lpf->buffer[0]; -} - -static void dsp_init_schroeder( struct dsp_schroeder *sch, float length, - float gain ) -{ - dsp_init_delay( &sch->M, length ); - sch->gain = gain; -} - -static inline void dsp_process_schroeder( struct dsp_schroeder *sch, - float *input, float *output ) -{ - float dry = *input; - - float delay_output; - dsp_read_delay( &sch->M, &delay_output ); - - float feedback_attenuated = delay_output * sch->gain, - input_feedback_sum = dry + feedback_attenuated; - - dsp_write_delay( &sch->M, &input_feedback_sum ); - - *output = delay_output - input_feedback_sum*sch->gain; -} - -/* temporary global design */ -static struct dsp_lpf __lpf_mud_free, - __hpf_mud_free; - -static struct dsp_delay __echos[8]; -static struct dsp_lpf __echos_lpf[8]; -static struct dsp_schroeder __diffusion_chain[8]; - -static void vg_dsp_init( void ) -{ - /* temporary global design */ - - dsp_init_lpf( &__lpf_mud_free, 125.0f ); - dsp_init_lpf( &__hpf_mud_free, 500.0f ); - - float sizes[] = - { 2.0f, 4.0f, 8.0f, 16.0f, 32.0f, 64.0f, 128.0f, 256.0f }; - - float reflection_variance = 0.04f; - - for( int i=0; i<8; i++ ) - { - float reflection_time = ((sizes[i])/343.0f) * 1000.0f; - - float var = 1.0f + vg_randf64_range(-1.0,1.0) * reflection_variance, - total = reflection_time * var; - - dsp_init_delay( &__echos[i], total / 1000.0f ); - - float freq = vg_lerpf( 800.0f, 350.0f, sizes[i] / 256.0f ); - dsp_init_lpf( &__echos_lpf[i], freq ); - } - - float diffusions[] = { 187.0f, 159.0f, 143.0f, 121.0f, - 79.0f, 57.0f, 27.0f, 11.0f }; - - for( int i=0; i<8; i++ ) - { - dsp_init_schroeder( __diffusion_chain+i, diffusions[i]/1000.0f, 0.7f ); - } -} - -static void vg_dsp_process( float *stereo_in, float *stereo_out ) -{ - float in_total = (stereo_in[0]+stereo_in[1])*0.5f; - float recieved = 0.0f; - - float echo_tunings[] = { 0.05f, 0.05f, 0.1f, 0.1f, - 0.1f, 0.1f, 0.2f, 0.3f }; - - for( int i=0; i<8; i++ ) - { - float echo; - dsp_read_delay( __echos+i, &echo ); - dsp_write_lpf( __echos_lpf+i, &echo ); - dsp_read_lpf( __echos_lpf+i, &echo ); - - recieved += echo * echo_tunings[i]*0.9; - } - - float diffused = recieved; - - for( int i=0; i<8; i++ ) - { - dsp_process_schroeder( __diffusion_chain+i, &diffused, &diffused ); - } - - float total = in_total + (diffused*0.5f + recieved*0.5f); - - dsp_write_lpf( &__hpf_mud_free, &total ); - dsp_read_lpf( &__hpf_mud_free, &total ); - - float low_mud; - dsp_write_lpf( &__lpf_mud_free, &total ); - dsp_read_lpf( &__lpf_mud_free, &low_mud ); - - total -= low_mud; - - for( int i=0; i<8; i++ ) - dsp_write_delay( __echos+i, &total ); - - stereo_out[0] = stereo_in[0]*0.5f; - stereo_out[1] = stereo_in[1]*0.5f; - stereo_out[0] += diffused*0.8f+recieved*0.9f; - stereo_out[1] += diffused*0.8f+recieved*0.9f; -} - diff --git a/src/fontcomp.c b/src/fontcomp.c deleted file mode 100644 index c2d26ac..0000000 --- a/src/fontcomp.c +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved - -#define VG_TOOLS -#include "vg/vg.h" - -#define STB_IMAGE_IMPLEMENTATION -#include "stb/stb_image.h" - -// Super basic model compiler -int main( int argc, char *argv[] ) -{ - if( argc < 3 ) - { - vg_error( "Need input/output files\n" ); - return 0; - } - - FILE *output; - - int x,y,n; - unsigned char *data = stbi_load( argv[1], &x, &y, &n, 4 ); - - if( data ) - { - output = fopen( argv[2], "w" ); - if( !output ) - { - vg_error( "couldn't open output for writing\n" ); - free(data); - return 0; - } - - fprintf( output, "/* Font buffer generated from source file: '%s' */\n", argv[1] ); - - u32 pixel_max = x*y; - u32 pixel = 0, chars = 0; - while(pixel_max) - { - u32 buff = 0; - for( int b = 31; b >= 0; b-- ) - { - buff |= data[pixel*4]>128?0x1<= pixel_max ) - { - pixel_max = 0; - break; - } - } - - fprintf( output, "%#x,", buff ); - if( (++chars) % 8 == 0 ) - fprintf( output, "\n" ); - } - - free(data); - fclose(output); - - vg_success( "Font compiled successfully\n" ); - } - else - { - vg_error( "Couldn't open source file\n" ); - return 0; - } -} diff --git a/src/fonts/vg_font.png b/src/fonts/vg_font.png deleted file mode 100644 index 937ce3350ae016a909d9add976c277635164c5d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4974 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 Wusqt;BF2w5V0*^FvclZs-hTo0(Y#pz diff --git a/src/fonts/vg_font_thin.png b/src/fonts/vg_font_thin.png deleted file mode 100644 index 82d031aab39660f6c01895f4f758fb31051c9c79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11087 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 WCd^0R%lHesC|YOq)bdrVuKWjD6&=3- diff --git a/src/fonts/vg_font_thin.xcf b/src/fonts/vg_font_thin.xcf deleted file mode 100644 index 9c1915e50964246f6f7d4f16752cf8020aaf5372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165876 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 Tb7kFjI2``44=#t_>~r`JUMsx} diff --git a/src/fonts/vg_font_thin_3.png b/src/fonts/vg_font_thin_3.png deleted file mode 100644 index 31e28d96c14f35d903b9c02d08b235fbfabe26ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22853 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 diff --git a/src/fonts/vg_font_thin_3.xcf b/src/fonts/vg_font_thin_3.xcf deleted file mode 100644 index a62e594fca34530d24c42b8721bc2346e4e0c8e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 638713 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 diff --git a/src/fonts/vg_font_thin_old.png b/src/fonts/vg_font_thin_old.png deleted file mode 100644 index d13c675387bbac1aa6023cd06b57ddc99e933d9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8807 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 diff --git a/src/fonts/vg_font_thin_v0.png b/src/fonts/vg_font_thin_v0.png deleted file mode 100644 index 9684f3ade1756473d8bb1033c54e1de2bd387d1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9520 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 X+HJkdxiP^Y3}9|*Wm0nd(v|-MQ`t)1 diff --git a/src/metacompiler.c b/src/metacompiler.c deleted file mode 100644 index 494534d..0000000 --- a/src/metacompiler.c +++ /dev/null @@ -1,4 +0,0 @@ -i32 main( i32 argc, const c8 *argv[] ) -{ - return 0; -} diff --git a/src/msgdump.c b/src/msgdump.c deleted file mode 100644 index 65cdd5a..0000000 --- a/src/msgdump.c +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (C) 2021-2023 Harry Godden (hgn) - All Rights Reserved - -#define VG_TOOLS -#include "vg/vg.h" -#include "vg/vg_msg.h" - -#define CHUNK_SIZE 4096 - -int main( int argc, char *argv[] ){ - assert(argc); - - if( argc < 2 ){ - vg_error( "Usage: %s \n", argv[0] ); - return 0; - } - - for( int i=0; i qoi format - -Requires "stb_image.h" and "stb_image_write.h" -Compile with: - gcc qoiconv.c -std=c99 -O3 -o qoiconv - -Dominic Szablewski - https://phoboslab.org - - --- LICENSE: The MIT License(MIT) - -Copyright(c) 2021 Dominic Szablewski - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files(the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions : -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - - -#define STB_IMAGE_IMPLEMENTATION -#define STBI_ONLY_PNG -#define STBI_NO_LINEAR -#include "stb/stb_image.h" - -//#define STB_IMAGE_WRITE_IMPLEMENTATION -//#include "stb_image_write.h" - -#define QOI_IMPLEMENTATION -#include "phoboslab/qoi.h" - - -#define STR_ENDS_WITH(S, E) (strcmp(S + strlen(S) - (sizeof(E)-1), E) == 0) - -int main(int argc, char **argv) { - if (argc < 3) { - printf("Usage: qoiconv \n"); - printf("Examples:\n"); - printf(" qoiconv input.png output.qoi\n"); - printf(" qoiconv input.qoi output.png\n"); - exit(1); - } - - stbi_set_flip_vertically_on_load(1); - - void *pixels = NULL; - int w, h, channels; - if (STR_ENDS_WITH(argv[1], ".png")) { - pixels = (void *)stbi_load(argv[1], &w, &h, &channels, 4); - } - else if (STR_ENDS_WITH(argv[1], ".qoi")) { - qoi_desc desc; - pixels = qoi_read(argv[1], &desc, 0); - channels = desc.channels; - w = desc.width; - h = desc.height; - } - - if (pixels == NULL) { - printf("Couldn't load/decode %s\n", argv[1]); - exit(1); - } - - int encoded = 0; - if (STR_ENDS_WITH(argv[2], ".png")) { - //encoded = stbi_write_png(argv[2], w, h, channels, pixels, 0); - } - else if (STR_ENDS_WITH(argv[2], ".qoi")) { - encoded = qoi_write(argv[2], pixels, &(qoi_desc){ - .width = w, - .height = h, - .channels = 4, - .colorspace = QOI_SRGB - }); - } - - if (!encoded) { - printf("Couldn't write/encode %s\n", argv[2]); - exit(1); - } - - free(pixels); - return 0; -} diff --git a/src/shader.c b/src/shader.c deleted file mode 100644 index 934d30d..0000000 --- a/src/shader.c +++ /dev/null @@ -1,242 +0,0 @@ -#define STB_INCLUDE_IMPLEMENTATION -#define STB_INCLUDE_LINE_GLSL -#include "../dep/stb/stb_include.h" -#define VG_TOOLS -#include "vg/vg.h" - -struct uniform -{ - char name[30]; - char type[20]; - - int array; -} -uniform_buffer[100]; -static int uniform_count; - -static int compile_subshader( FILE *header, char *name ) -{ - char error[256]; - char *full = stb_include_file( name, "", ".", error ); - - if( !full ) - { - fprintf( stderr, "stb_include_file error:\n%s\n", error ); - return 0; - } - else - { - /* VG */ - - fprintf( header, "{\n" - ".orig_file = \"../../shaders/%s\",\n" - ".static_src = \n", name ); - - char *cur = full, *start = full; - while( 1 ) - { - char c = *cur; - if( c == '\n' || c == '\0' ) - { - *cur = '\0'; - fputs( "\"", header ); - fputs( start, header ); - - if( !strncmp(start,"uniform",7) ) - { - start += 8; - struct uniform *uf = &uniform_buffer[ uniform_count ++ ]; - uf->array = 0; - for( int i=0;; i++ ) - { - if( start[i] == '\0' ) - break; - - if( start[i] == ';' ) - { - start[i] = '\0'; - strncpy( uf->name, start, sizeof(uf->name) ); - } - - if( start[i] == '[' ) - { - start[i] = '\0'; - strncpy( uf->name, start, sizeof(uf->name) ); - uf->array = 1; - } - - if( start[i] == ' ' ) - { - start[i] = '\0'; - strncpy( uf->type, start, sizeof(uf->type) ); - start = start+i+1; - i=0; - } - } - } - - if( c == '\0' ) - { - fputs( "\"", header ); - break; - } - - fputs( "\\n\"\n", header ); - start = cur+1; - } - cur ++; - } - - fputs( "},", header ); - } - - free( full ); - return 1; -} - -int main( int argc, char *argv[] ) -{ - if( argc < 2 || (argc-1)%3 != 0 ) - { - fprintf( stderr, "invalid\n" ); - return 0; - } - - char path[260]; - int shader_count = (argc-1)/3; - for( int i=0; iname); - } - - for( int i=0; iarray ) continue; - - if( !strcmp(uf->type,"vec2") ) - { - fprintf( header, "static void shader_%s_%s(v2f v){\n" - " glUniform2fv( _uniform_%s_%s, 1, v );\n" - "}\n", args[0], uf->name, args[0], uf->name ); - } - if( !strcmp(uf->type,"vec3") ) - { - fprintf( header, "static void shader_%s_%s(v3f v){\n" - " glUniform3fv( _uniform_%s_%s, 1, v );\n" - "}\n", args[0], uf->name, args[0], uf->name ); - } - if( !strcmp(uf->type,"vec4") ) - { - fprintf( header, "static void shader_%s_%s(v4f v){\n" - " glUniform4fv( _uniform_%s_%s, 1, v );\n" - "}\n", args[0], uf->name, args[0], uf->name ); - } - if( !strcmp(uf->type,"sampler2D") ) - { - fprintf( header, "static void shader_%s_%s(int i){\n" - " glUniform1i( _uniform_%s_%s, i );\n" - "}\n", args[0], uf->name, args[0], uf->name ); - } - if( !strcmp(uf->type,"float") ) - { - fprintf( header, "static void shader_%s_%s(float f){\n" - " glUniform1f( _uniform_%s_%s, f );\n" - "}\n", args[0], uf->name, args[0], uf->name ); - } - if( !strcmp(uf->type,"mat4x3") ) - { - fprintf( header, - "static void shader_%s_%s(m4x3f m){\n" - " glUniformMatrix4x3fv" - "( _uniform_%s_%s, 1, GL_FALSE, (float *)m );\n" - "}\n", args[0], uf->name, args[0], uf->name ); - } - if( !strcmp(uf->type,"mat3") ) - { - fprintf( header, - "static void shader_%s_%s(m3x3f m){\n" - " glUniformMatrix3fv" - "( _uniform_%s_%s, 1, GL_FALSE, (float *)m );\n" - "}\n", args[0], uf->name, args[0], uf->name ); - } - if( !strcmp(uf->type,"mat4") ) - { - fprintf( header, - "static void shader_%s_%s(m4x4f m){\n" - " glUniformMatrix4fv" - "( _uniform_%s_%s, 1, GL_FALSE, (float *)m );\n" - "}\n", args[0], uf->name, args[0], uf->name ); - } - } - - fprintf( header, - "static void shader_%s_register(void){\n" - " vg_shader_register( &_shader_%s );\n" - "}\n", - args[0],args[0] ); - - fprintf( header, - "static void shader_%s_use(void){ glUseProgram(_shader_%s.id); }\n", - args[0], args[0] ); - - fprintf( header, - "static void shader_%s_link(void){\n", - args[0] ); - - for( int i=0; iname, - args[0], uf->name ); - } - - fprintf( header, "}\n" ); - fprintf( header, "#endif /* SHADER_%s_H */\n", args[0] ); - fclose( header ); - } -} diff --git a/src/template/main.c b/src/template/main.c deleted file mode 100644 index 644c759..0000000 --- a/src/template/main.c +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved - -#include "vg/vg.h" - -int main( int argc, char *argv[] ) -{ - vg_init( argc, argv, "Voyager Game Engine" ); -} - -void vg_register(void){} -void vg_start(void){} -void vg_update(void){} - -void vg_render(void) -{ - glViewport( 0,0, vg_window_x, vg_window_y ); - - glDisable( GL_DEPTH_TEST ); - glClearColor( 0.1f, 0.1f, 0.2f, 1.0f ); - glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - - // Rest of drawing code... -} - -void vg_ui(void) -{ - gui_text( - (ui_px [2]){ vg_window_x / 2, vg_window_y / 2 }, - "Voyager Game Engine", 2, k_text_align_center - ); - - gui_text( - (ui_px [2]){ vg_window_x / 2, vg_window_y / 2 + 30 }, - "Template project file", 1, k_text_align_center - ); -} -void vg_free(void){} diff --git a/src/template/vg.conf b/src/template/vg.conf deleted file mode 100644 index 896d68a..0000000 --- a/src/template/vg.conf +++ /dev/null @@ -1,2 +0,0 @@ -vg_src="main.c" -vg_target="game" diff --git a/src/template/vg_config.h b/src/template/vg_config.h deleted file mode 100644 index e1e5ab5..0000000 --- a/src/template/vg_config.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved -#define VG_CONFIG - -static struct button_binding vg_button_binds[] = -{ - { .name = "primary", .bind = GLFW_MOUSE_BUTTON_LEFT }, - { .name = "secondary", .bind = GLFW_MOUSE_BUTTON_RIGHT } -}; - -static struct axis_binding vg_axis_binds[] = -{ - { .name = "horizontal", .axis = GLFW_GAMEPAD_AXIS_LEFT_X }, - { .name = "vertical", .axis = GLFW_GAMEPAD_AXIS_LEFT_Y } -}; - -static struct vg_achievement vg_achievements[] = -{ -}; diff --git a/src/texsheet.c b/src/texsheet.c deleted file mode 100644 index 4042964..0000000 --- a/src/texsheet.c +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright (C) 2021 Harry Godden (hgn) - All Rights Reserved - -#ifdef VG_BUILD - -#include "vg.h" -#include "vg_platform.h" -#include "vg_log.h" -#include "vg_opt.h" -#include "vg_build.h" - -u32 optimize_test_compile = 0; - -/* - * Scripts - * -------------------------------------------------------------------------- */ - -void s_build(void){ - vg_info( "running script: s_build(void)\n" ); - - vg_build.optimization = optimize_test_compile; - vg_build.fresh = 0; - vg_build.platform = k_platform_linux; - vg_build.arch = k_architecture_x86_64; - vg_build.compiler = k_compiler_clang; - vg_build.libc = k_libc_version_native; - - vg_build_new( "texsheet" ); - vg_add_source( "src/texsheet.c" ); - vg_compile( "texsheet" ); - - vg_success( "Completed 1/1\n" ); -} - -int main( int argc, char *argv[] ){ - char *arg; - while( vg_argp( argc, argv ) ){ - if( vg_long_opt( "native" ) ) - s_build(); - - if( vg_opt('r') ) - optimize_test_compile = 3; - } - - if( vg_build.warnings ) - vg_warn( "Finished with %u warnings\n", vg_build.warnings ); - else - vg_success( "All scripts ran successfully\n" ); -} - -#else - -#define VG_TOOLS -#include "vg.h" - -#define STB_IMAGE_IMPLEMENTATION -#include "submodules/stb/stb_image.h" - -#define QOI_IMPLEMENTATION -#include "submodules/qoi/qoi.h" - -struct image_src -{ - int x,y,ch; - - u8 *data; -}; - -int image_sort( const void* a, const void* b) -{ - struct image_src *p_a = (struct image_src *)a; - struct image_src *p_b = (struct image_src *)b; - - if( p_a->x == p_b->x ) - return 0; - else if ( p_a->x < p_b->x ) - return 1; - else - return -1; -} - -int main( int argc, const char *argv[] ) -{ - struct image_src *source_images = malloc( sizeof( struct image_src ) * argc ); - - u32 num_images = 0; - - if( argc < 4 ) - { - vg_info( "Usage: %s \\\n[output_image output_header name images...]\n", - argv[0] ); - return 0; - } - - // Open header handle - // ------------------ - FILE *fp = fopen( argv[2], "w" ); - if( !fp ) - { - vg_error( "Could not open file for writing\n" ); - return 0; - } - - fprintf( fp, "enum %s_index\n{\n", argv[3] ); - - // Load images - // ----------- - stbi_set_flip_vertically_on_load(1); - - for( int i = 4; i < argc; i ++ ) - { - struct image_src *src = &source_images[ num_images ]; - src->data = (u8 *)stbi_load( argv[i], &src->x, &src->y, &src->ch, 4 ); - - char name[ 256 ]; - int j = 0; int ext = 0; - for( ; j < vg_list_size( name )-1; j ++ ) - { - if( argv[i][j] ) - { - name[j] = argv[i][j]; - - if( name[j] == '.' ) - ext = j; - - if( name[j] == '.' || name[j] == '-' ) - name[j] = '_'; - } - else - break; - } - - if( ext ) - name[ext] = 0x00; - else - name[j] = 0x00; - - fprintf( fp, "\tk_sprite_%s,\n", name ); - - if( src->data ) - { - if( src->x != src->y ) - { - vg_error( "Non-square images are currently not supported ('%s')\n", argv[i] ); - free( src->data ); - } - else - num_images ++; - } - else - vg_error( "Could not decode '%s'\n", argv[i] ); - } - - fprintf( fp, "};\n\n" ); - - // Sort by size - // ------------ - qsort( source_images, num_images, sizeof(struct image_src), image_sort ); - - // Process images - // -------------- - fprintf( fp, "static struct vg_sprite %s[] = \n{\n", argv[3] ); - - u8 *dest = (u8 *)malloc( 1024*1024*4 ); - - for( int i = 0; i < 1024*1024; i ++ ) - { - dest[ i*4 + 0 ] = 0; - dest[ i*4 + 1 ] = 0; - dest[ i*4 + 2 ] = 0; - dest[ i*4 + 3 ] = 0; - } - - struct region - { - v2i p0; - v2i p1; - } - region_stack[ 32 ] = - { - { - .p0 = { 0, 0 }, - .p1 = { 1024, 1024 } - } - }; - int stack_h = 0; - - for( int i = 0; i < num_images; i ++ ) - { - struct image_src *psrc = &source_images[ i ]; - - // Region checks - while( 1 ) - { - struct region *pregion = ®ion_stack[ stack_h ]; - - if( (pregion->p0[ 0 ] + psrc->x <= pregion->p1[0]) && (pregion->p0[ 1 ] + psrc->y <= pregion->p1[1]) ) - { - // Passed, add image and create subdivisions - fprintf( fp, "\t{{ %f, %f, %f, %f }}", - (float)pregion->p0[0] / 1024.0f, - (float)pregion->p0[1] / 1024.0f, - (float)psrc->x / 1024.0f, - (float)psrc->y / 1024.0f - ); - - if( i != num_images-1 ) - fputs( ",\n", fp ); - else - fputc( '\n', fp ); - - // Write image - for( int y = 0; y < psrc->y; y ++ ) - { - int px = pregion->p0[0]; - int py = pregion->p0[1] + y; - - memcpy( &dest[ (py*1024+px) * 4 ], &psrc->data[ y*psrc->x*4 ], psrc->x*4 ); - } - - // Subdivisions - stack_h ++; - struct region *new_region = ®ion_stack[ stack_h ]; - - new_region->p0[0] = pregion->p0[0] + psrc->x; - new_region->p0[1] = pregion->p0[1]; - new_region->p1[0] = pregion->p1[0]; - new_region->p1[1] = pregion->p0[1] + psrc->y; - - pregion->p0[ 1 ] += psrc->y; - break; - } - else - { - // Failed, loop up to next region if can - if( stack_h == 0 ) - { - vg_error( "Could not fit image %d. Pack failed\n", i ); - - goto IL_END_ERR; - } - else - stack_h --; - } - } - } - -IL_END_ERR: - fprintf( fp, "};" ); - fclose( fp ); - - // Write output - // ------------ - qoi_write( argv[1], dest, &(qoi_desc){ - .width = 1024, - .height = 1024, - .channels = 4, - .colorspace = QOI_SRGB - }); - - // Free - // ---- - for( int i = 0; i < num_images; i ++ ) - free( source_images[ i ].data ); - free( dest ); - free( source_images ); - - vg_success( "Processed %u images\n", num_images ); - -} - -#endif diff --git a/src/tools.sh b/src/tools.sh deleted file mode 100644 index c59bd37..0000000 --- a/src/tools.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash -# Copyright (C) 2021-2022 Harry Godden (hgn) - All Rights Reserved -# -# Standard tool scripts -# -mkdir $_folder/tools -p - -_link="-lm" - -tool_shader(){ - _src="vg/src/shader.c" - _dst="tools/shader" - compile_x -} - -tool_fontcomp(){ - _src="vg/src/fontcomp.c" - _dst="tools/fontcomp" - compile_x -} - -tool_qoiconv(){ - _src="vg/src/qoiconv.c" - _dst="tools/qoiconv" - compile_x -} - -#tool_texsheet(){ -# _src="vg/src/texsheet.c" -# _dst="tools/texsheet" -# compile_x -#} - -tool_shader -tool_fontcomp -tool_qoiconv -#tool_texsheet diff --git a/src/vg/vg_store.h b/src/vg/vg_store.h deleted file mode 100644 index 1baf20f..0000000 --- a/src/vg/vg_store.h +++ /dev/null @@ -1,680 +0,0 @@ -#ifndef VG_STORE_H -#define VG_STORE_H - -#include "vg_stdint.h" -#include "vg_io.h" - -/* - * Anderson tree implementation with extensions: - * parents are kept track of - * duplicates are allowed - * data is never allocated or destroyed here - * - * TODO: seperate offset,stride,base into 'generic array', seperate pool - */ - -typedef struct aatree aatree; -typedef struct aatree_node aatree_node; -typedef struct aatree_pool_node aatree_pool_node; - -typedef u32 aatree_ptr; -#define AATREE_PTR_NIL 0xffffffff - -struct aatree -{ - u32 offset, stride; /* distance between elements */ - void *base; - - int (*p_cmp)( void *a, void *b ); -}; - -#pragma pack(push,1) -struct aatree_node -{ - aatree_ptr left, right, parent; - u32 level, count; -}; - -struct aatree_pool_node -{ - aatree_ptr next_free; -}; -#pragma pack(pop) - -/* api - * ===========================================================================*/ - -/* return a pointer to the start of the data referenced by t */ -static void *aatree_get_data( aatree *tree, aatree_ptr t ); - -/* link node x into the tree with root t */ -static aatree_ptr aatree_insert( aatree *tree, aatree_ptr t, aatree_ptr x ); - -/* delete node x from tree, does not free memory */ -static aatree_ptr aatree_del( aatree *tree, aatree_ptr x ); - -/* get pointer to element in tree with index k */ -static aatree_ptr aatree_kth( aatree *tree, aatree_ptr t, u32 k ); - -/* get pointer to the element above x */ -static aatree_ptr aatree_next( aatree *tree, aatree_ptr x ); - -/* get pointer by value, returns NIL if not found. - * - * if duplicates values are present then the result is undefined, but it will be - * AN node with that value, just maybe not the first lexicographically - */ -static aatree_ptr aatree_find( aatree *tree, aatree_ptr t, void *value ); - -/* implementation - * ===========================================================================*/ - -static void *aatree_get_data( aatree *tree, aatree_ptr t ) -{ - return (u8 *)tree->base + tree->stride*t; -} - -static u8 *aatree_node_base( aatree *tree, aatree_ptr t ) -{ - return (u8 *)tree->base + tree->stride*t + tree->offset; -} - -static aatree_pool_node *aatree_get_pool_node( aatree *tree, aatree_ptr t ) -{ - return (aatree_pool_node *)aatree_node_base( tree, t ); -} - -static aatree_node *aatree_get_node( aatree *tree, aatree_ptr t ) -{ - return (aatree_node *)aatree_node_base( tree, t ); -} - -static void aatree_recount( aatree *tree, aatree_ptr n ) -{ - aatree_node *pnode = aatree_get_node( tree, n ); - pnode->count = 1; - - if( pnode->left != AATREE_PTR_NIL ) - pnode->count += aatree_get_node( tree, pnode->left )->count; - - if( pnode->right != AATREE_PTR_NIL ) - pnode->count += aatree_get_node( tree, pnode->right )->count; -} - -/* . . - * | | - * L <- T L -> T - * / \ \ -> / / \ - * A B R A B R - */ -static aatree_ptr aatree_skew( aatree *tree, u32 t ) -{ - if( t == AATREE_PTR_NIL ) return t; - - aatree_node *ptnode = aatree_get_node( tree, t ); - if( ptnode->left == AATREE_PTR_NIL ) return t; - - aatree_node *plnode = aatree_get_node( tree, ptnode->left ); - if( plnode->level == ptnode->level ) - { - aatree_ptr l = ptnode->left; - ptnode->left = plnode->right; - plnode->right = t; - - aatree_recount( tree, t ); - aatree_recount( tree, l ); - - plnode->parent = ptnode->parent; - ptnode->parent = l; - if( ptnode->left != AATREE_PTR_NIL ) - aatree_get_node( tree, ptnode->left )->parent = t; - - return l; - } - - return t; -} - -/* . . - * | | - * T -> R -> X -> R - * / / / \ - * A B T X - * / \ - * A B - */ -static aatree_ptr aatree_split( aatree *tree, aatree_ptr t ) -{ - if( t == AATREE_PTR_NIL ) return t; - - aatree_node *ptnode = aatree_get_node( tree, t ); - if( ptnode->right == AATREE_PTR_NIL ) return t; - - aatree_node *prnode = aatree_get_node( tree, ptnode->right ); - if( prnode->right == AATREE_PTR_NIL ) return t; - - aatree_node *prrnode = aatree_get_node( tree, prnode->right ); - if( ptnode->level == prrnode->level ) - { - aatree_ptr r = ptnode->right; - ptnode->right = prnode->left; - prnode->left = t; - prnode->level ++; - - aatree_recount( tree, t ); - aatree_recount( tree, r ); - - prnode->parent = ptnode->parent; - ptnode->parent = r; - if( ptnode->right != AATREE_PTR_NIL ) - aatree_get_node( tree, ptnode->right )->parent = t; - - return r; - } - - return t; -} - -static aatree_ptr aatree_insert( aatree *tree, aatree_ptr t, aatree_ptr x ) -{ - aatree_node *pxnode = aatree_get_node( tree, x ); - - if( t == AATREE_PTR_NIL ) - { - pxnode->left = AATREE_PTR_NIL; - pxnode->right = AATREE_PTR_NIL; - pxnode->parent = AATREE_PTR_NIL; - pxnode->level = 0; - pxnode->count = 1; - return x; - } - - aatree_node *ptnode = aatree_get_node( tree, t ); - int cmp_result = tree->p_cmp( aatree_get_data( tree, t ), - aatree_get_data( tree, x ) ); - - ptnode->count ++; - - if( cmp_result <= 0 ) - { - ptnode->left = aatree_insert( tree, ptnode->left, x ); - //aatree_node *plnode = aatree_get_node( tree, ptnode->left ); - //plnode->parent = t; - } - else - { - ptnode->right = aatree_insert( tree, ptnode->right, x ); - //aatree_node *prnode = aatree_get_node( tree, ptnode->right ); - //prnode->parent = t; - } - - t = aatree_skew( tree, t ); - t = aatree_split( tree, t ); - return t; -} - -static void aatree_link_down( aatree *tree, aatree_ptr p, aatree_ptr *pl, - aatree_ptr l ) -{ - *pl = l; - - if( *pl != AATREE_PTR_NIL ) - aatree_get_node( tree, *pl )->parent = p; -} - -static aatree_ptr aatree_copy_links( aatree *tree, aatree_ptr root, - aatree_ptr src, aatree_ptr dst ) -{ - aatree_node *pdst = aatree_get_node( tree, dst ), - *psrc = aatree_get_node( tree, src ); - - pdst->count = psrc->count; - pdst->level = psrc->level; - pdst->parent = psrc->parent; - - aatree_link_down( tree, dst, &pdst->left, psrc->left ); - aatree_link_down( tree, dst, &pdst->right, psrc->right ); - - if( pdst->parent != AATREE_PTR_NIL ) - { - aatree_node *parent = aatree_get_node( tree, pdst->parent ); - - if( parent->left == src ) - parent->left = dst; - else if( parent->right == src ) - parent->right = dst; - } - else - return dst; - - return root; -} - -static aatree_ptr aatree_del( aatree *tree, aatree_ptr x ) -{ - aatree_ptr it = x, - up[32]; - - int count = 1, dir = 0; - - /* TODO: maybe be a better way to do this, without counting back up */ - for( aatree_node *s = aatree_get_node( tree, x ); - s->parent != AATREE_PTR_NIL; - count ++ ) - s = aatree_get_node( tree, s->parent ); - - int top=0; - while(1) - { - int index = count - (++top); - - up[ index ] = it; - aatree_node *itnode = aatree_get_node( tree, it ); - if( itnode->parent == AATREE_PTR_NIL ) - break; - else - it = itnode->parent; - } - - aatree_ptr _ptrswap_src = AATREE_PTR_NIL, - _ptrswap_dst = AATREE_PTR_NIL; - - aatree_node *pxnode = aatree_get_node( tree, x ); - aatree_ptr root = up[ count-1 ]; - if( pxnode->left == AATREE_PTR_NIL || pxnode->right == AATREE_PTR_NIL ) - { - if( --top != 0 ) - { - aatree_node *pnode = aatree_get_node( tree, up[top-1] ), - *parent = aatree_get_node( tree, pxnode->parent ); - - aatree_ptr next = pxnode->left == AATREE_PTR_NIL? - pxnode->right: - pxnode->left; - - if( parent->left == x ) pnode->left = next; - else pnode->right = next; - - if( next != AATREE_PTR_NIL ) - { - aatree_node *pnext = aatree_get_node( tree, next ); - pnext->parent = up[top-1]; - } - } - else - { - if( pxnode->right != AATREE_PTR_NIL ) root = pxnode->right; - else if( pxnode->left != AATREE_PTR_NIL ) root = pxnode->left; - else return AATREE_PTR_NIL; - - aatree_node *newroot = aatree_get_node( tree, root ); - newroot->parent = AATREE_PTR_NIL; - } - } - else - { - aatree_ptr heir = pxnode->right, - prev = x; - - aatree_node *pheir = aatree_get_node( tree, heir ); - - while( pheir->left != AATREE_PTR_NIL ) - { - up[top++] = prev = heir; - heir = pheir->left; - pheir = aatree_get_node( tree, heir ); - } - - _ptrswap_dst = heir; - _ptrswap_src = x; - - aatree_node *pprev = aatree_get_node( tree, prev ); - - if( prev == x ) - aatree_link_down( tree, prev, &pprev->right, pheir->right ); - else - aatree_link_down( tree, prev, &pprev->left, pheir->right ); - } - - /* Tail */ - while( --top >= 0 ) - { - if( top != 0 ) - { - aatree_node *above = aatree_get_node( tree, up[top-1] ); - dir = above->right == up[top]; - } - - aatree_recount( tree, up[top] ); - aatree_node *pntop = aatree_get_node( tree, up[top] ); - - if( !(pntop->left == AATREE_PTR_NIL || pntop->right == AATREE_PTR_NIL) ) - { - aatree_node *pnl = aatree_get_node( tree, pntop->left ), - *pnr = aatree_get_node( tree, pntop->right ); - - if( pnl->level < pntop->level-1 || pnr->level < pntop->level-1 ) - { - if( pnr->level > --pntop->level ) - pnr->level = pntop->level; - - up[top] = aatree_skew( tree, up[top] ); - - aatree_node *ut = aatree_get_node( tree, up[top] ); - ut->right = aatree_skew( tree, ut->right ); - - aatree_node *utr = aatree_get_node( tree, ut->right ); - utr->right = aatree_skew( tree, utr->right ); - - up[top] = aatree_split( tree, up[top] ); - ut = aatree_get_node( tree, up[top] ); - - ut->right = aatree_split( tree, ut->right ); - } - } - - if( top != 0 ) - { - aatree_node *ut1 = aatree_get_node( tree, up[top-1] ); - - if( dir == 1 ) - aatree_link_down( tree, up[top-1], &ut1->right, up[top] ); - else - aatree_link_down( tree, up[top-1], &ut1->left, up[top] ); - } - else - { - root = up[top]; - aatree_get_node( tree, root )->parent = AATREE_PTR_NIL; - } - } - - /* This is our extension to the original non-recursive delete, so no data - * has to be moved */ - if( _ptrswap_dst != AATREE_PTR_NIL ) - root = aatree_copy_links( tree, root, _ptrswap_src, _ptrswap_dst ); - - return root; -} - -static aatree_ptr aatree_kth( aatree *tree, aatree_ptr t, u32 k ) -{ - u32 i = 0; - - while( t != AATREE_PTR_NIL ) - { - aatree_node *ptnode = aatree_get_node( tree, t ); - - u32 j = i; - if( ptnode->left != AATREE_PTR_NIL ) - j += aatree_get_node( tree, ptnode->left )->count; - - if( j < k ) - { - i = j+1; - t = ptnode->right; - } - else - { - if( j > k ) - { - t = ptnode->left; - } - else - { - return t; - } - } - } - - return AATREE_PTR_NIL; -} - -static aatree_ptr aatree_next( aatree *tree, aatree_ptr x ) -{ - /* if can go left, go left then all the way right, - * else go up, if it was right link accept - */ - - aatree_node *pnode = aatree_get_node( tree, x ); - if( pnode->right != AATREE_PTR_NIL ) - { - aatree_ptr next = pnode->right; - - while(1) - { - aatree_node *pnext = aatree_get_node( tree, next ); - - if( pnext->left != AATREE_PTR_NIL ) - next = pnext->left; - else - return next; - } - } - else - { - aatree_ptr next = x; - - while(1) - { - aatree_node *pnode = aatree_get_node( tree, next ); - - if( pnode->parent == AATREE_PTR_NIL ) - return AATREE_PTR_NIL; - - aatree_node *pabove = aatree_get_node( tree, pnode->parent ); - if( pabove->left == next ) - return pnode->parent; - else - next = pnode->parent; - } - } -} - -static aatree_ptr aatree_find( aatree *tree, aatree_ptr t, void *value ) -{ - while( t != AATREE_PTR_NIL ) - { - int cmp_result = tree->p_cmp( aatree_get_data( tree, t ), value ); - - if( cmp_result == 0 ) - return t; - else - { - aatree_node *ptnode = aatree_get_node( tree, t ); - - if( cmp_result < 0 ) - t = ptnode->left; - else - t = ptnode->right; - } - } - return t; -} - -/* - * Debugging stuff, everything below is scaffholding and will be removed - * ============================================================================= - */ - -static int aatree_verify_split( aatree *tree, aatree_ptr t ) -{ - if( t == AATREE_PTR_NIL ) return 1; - - aatree_node *ptnode = aatree_get_node( tree, t ); - if( ptnode->right == AATREE_PTR_NIL ) return 1; - - aatree_node *prnode = aatree_get_node( tree, ptnode->right ); - if( prnode->right == AATREE_PTR_NIL ) return 1; - - aatree_node *prrnode = aatree_get_node( tree, prnode->right ); - if( ptnode->level == prrnode->level ) - return 0; - - return 1; -} - -static int aatree_verify_skew( aatree *tree, aatree_ptr t ) -{ - if( t == AATREE_PTR_NIL ) return 1; - - aatree_node *ptnode = aatree_get_node( tree, t ); - if( ptnode->left == AATREE_PTR_NIL ) return 1; - - aatree_node *plnode = aatree_get_node( tree, ptnode->left ); - if( plnode->level == ptnode->level ) - return 0; - - return 1; -} - -static int aatree_verify( aatree *tree, aatree_ptr t ) -{ - aatree_node *ptnode = aatree_get_node( tree, t ); - if( ptnode->parent != AATREE_PTR_NIL ) - { - aatree_node *parent = aatree_get_node( tree, ptnode->parent ); - if( !(parent->left == t || parent->right == t) ) - return 0; - } - - if( ptnode->left != AATREE_PTR_NIL ) - if( aatree_get_node( tree, ptnode->left )->parent != t ) - return 0; - if( ptnode->right != AATREE_PTR_NIL ) - if( aatree_get_node( tree, ptnode->right )->parent != t ) - return 0; - - return aatree_verify_skew( tree, t ) && - aatree_verify_split( tree, t ); -} - - -static void aatree_show_r( aatree *tree, aatree_ptr t, int lvl, - void(*p_show)(void *data) ) -{ - if( t != AATREE_PTR_NIL ) - { - aatree_node *ptnode = aatree_get_node( tree, t ); - aatree_show_r( tree, ptnode->left, lvl+1, p_show ); - - void *data = aatree_get_data( tree, t ); - - for( int i=0; iright, lvl+1, p_show ); - } -} - -static void aatree_show( aatree *tree, aatree_ptr t, void(*p_show)(void *data)) -{ - if( t != AATREE_PTR_NIL ) - { - aatree_node *ptnode = aatree_get_node( tree, t ); - aatree_show( tree, ptnode->left, p_show ); - void *data = aatree_get_data( tree, t ); - - for( int i=0; ilevel; i++ ) - { - vg_log( " " ); - } - p_show( data ); - vg_log( " (%d) \n", t ); - - aatree_show( tree, ptnode->right, p_show ); - } -} - -static void aatree_show_counts( aatree *tree, aatree_ptr t, int lvl, int *ln, - int *err, - void(*p_show)(void *data), int show ) -{ - if( lvl > 20 ) - return; - if( t == AATREE_PTR_NIL ) return; - - aatree_node *ptnode = aatree_get_node( tree, t ); - void *data = aatree_get_data( tree, t ); - - aatree_show_counts( tree, ptnode->left, lvl+1, ln, err, p_show, show ); - - if( show ) vg_log( "%03d| ", *ln ); - *ln = *ln +1; - - if( show ) - for( int i=0; ileft != AATREE_PTR_NIL && ptnode->right != AATREE_PTR_NIL ) - printf( "|" ); - if( ptnode->left != AATREE_PTR_NIL && ptnode->right == AATREE_PTR_NIL ) - printf( "/" ); - if( ptnode->left == AATREE_PTR_NIL && ptnode->right != AATREE_PTR_NIL ) - printf( "\\" ); - - printf( " (%d, %d, parent: %d. V: %d, level: %d) \n", t, - ptnode->count, ptnode->parent, - aatree_verify( tree, t ), ptnode->level); - } - - if( !aatree_verify( tree, t ) ) - { - if( show ) - vg_log( "error\n" ); - *err = 1; - } - - aatree_show_counts( tree, ptnode->right, lvl+1, ln, err, p_show, show ); -} - -/* - * Pool allocator utility which can be placed in a union with regular aa nodes. - */ - -static aatree_ptr aatree_init_pool( aatree *info, u32 item_count ) -{ - for( aatree_ptr i=0; inext_free = AATREE_PTR_NIL; - else - pn->next_free = i+1; - } - - return 0; -} - -static aatree_ptr aatree_pool_alloc( aatree *info, aatree_ptr *head ) -{ - if( *head == AATREE_PTR_NIL ) - { - vg_error( "No nodes free in pool allocator!\n" ); - return AATREE_PTR_NIL; - } - else - { - aatree_ptr gap = *head; - *head = aatree_get_pool_node( info, *head )->next_free; - return gap; - } -} - -static void aatree_pool_free( aatree *info, aatree_ptr node, aatree_ptr *head ) -{ - aatree_pool_node *pn = aatree_get_pool_node( info, node ); - pn->next_free = *head; - *head = node; -} - -#endif /* VG_STORE_H */ diff --git a/src/vgcrashreport.c b/src/vgcrashreport.c deleted file mode 100644 index 9fbd507..0000000 --- a/src/vgcrashreport.c +++ /dev/null @@ -1,281 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "vg_opt.h" -#include "vg_platform.h" -#include "vg_string.h" -#include "vg_io.h" - -#include "vg_tool.c" - -char *report_text = NULL; -u32 report_length = 0; - -HWND window = NULL, - send_button = NULL, - select_button = NULL, - close_button = NULL, - textbox = NULL; - -int sent_report = 0; - -WNDPROC defWndProc = NULL; - -LRESULT OnWindowClose( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - PostQuitMessage(0); - return CallWindowProc(defWndProc, hwnd, message, wParam, lParam); -} - -#define HTTPBOUND "99667vg.mtzero.boundary88337" - -void send_report(void) -{ - HINTERNET hSession = InternetOpen( - "Mozilla/5.0", // User-Agent - INTERNET_OPEN_TYPE_PRECONFIG, - NULL, - NULL, - 0); - - if( hSession == NULL ) - { - MessageBox( window, "Call failed.", - "InternetOpen (wininet)", MB_OK|MB_ICONERROR); - goto e4; - } - - HINTERNET hConnect = InternetConnect( - hSession, - "skaterift.com", // HOST - INTERNET_DEFAULT_HTTPS_PORT, - "", - "", - INTERNET_SERVICE_HTTP, - 0, - 0); - - if( hConnect == NULL ) - { - MessageBox( window, "Call failed.", - "InternetConnect (wininet)", MB_OK|MB_ICONERROR); - goto e3; - } - - HINTERNET hHttpFile = HttpOpenRequest( - hConnect, - "POST", // METHOD - "/vgreport/index.php", // URI - NULL, - NULL, - NULL, - INTERNET_FLAG_SECURE|INTERNET_FLAG_RELOAD, - 0); - if( hHttpFile == NULL ) - { - MessageBox( window, "Call failed.", - "HttpOpenRequest (wininet)", MB_OK|MB_ICONERROR); - goto e2; - } - - HttpAddRequestHeaders( hHttpFile, "Content-Type: multipart/form-data; boundary=" HTTPBOUND "\r\nConnection: close\r\n", - -1, HTTP_ADDREQ_FLAG_ADD ); - vg_str content; - vg_strnull( &content, NULL, 0 ); - vg_strcat( &content, "--" HTTPBOUND "\r\nContent-Disposition: form-data; name=\"uploaded_file\"\r\n" ); - vg_strcat( &content, "Content-Type: text/plain\r\n\r\n" ); - vg_strcat( &content, report_text ); - vg_strcat( &content, "\r\n\r\n--" HTTPBOUND "--\r\n" ); - - while( !HttpSendRequest(hHttpFile, NULL, 0, content.buffer, content.i) ) - { - DWORD option = InternetErrorDlg( - window, - hHttpFile, - ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED, - FLAGS_ERROR_UI_FILTER_FOR_ERRORS | - FLAGS_ERROR_UI_FLAGS_GENERATE_DATA | - FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS, - NULL); - - if( option == ERROR_CANCELLED ) - goto e1; - } - - { - DWORD dwFileSize = 4096; - char* buffer[dwFileSize + 1]; - - while(1) - { - DWORD dwBytesRead; - BOOL bRead; - - bRead = InternetReadFile( - hHttpFile, - buffer, - dwFileSize + 1, - &dwBytesRead); - - if( dwBytesRead == 0 ) - break; - - if( !bRead ) - { - MessageBox( window, "Report may or may not have been sent", - "Error reading response", MB_OK|MB_ICONERROR); - goto e1; - } - else - buffer[dwBytesRead] = 0; - } - - sent_report = 1; - MessageBox( window, "Thank you, a developer will take a look and try to fix this bug.", "Report Sent!", MB_OK ); - } - -e1:InternetCloseHandle(hHttpFile); -e2:InternetCloseHandle(hConnect); -e3:InternetCloseHandle(hSession); -e4:return; -} - -LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) -{ - if (message == WM_CLOSE && hwnd == window) return OnWindowClose(hwnd, message, wParam, lParam); - if( message == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && (HWND)lParam == close_button ) - { - exit(0); - } - if( message == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && (HWND)lParam == send_button ) - { - if( sent_report ) - { - if( MessageBox( window, - "The more times you send it the faster the bug gets fixed!", - "Mail this report?", MB_YESNO|MB_APPLMODAL ) == IDYES ) - { - MessageBox( window, "Thank you, a developer will take a look and try to fix this bug.", "Report Sent!", MB_OK ); - } - } - else - { - if( MessageBox( window, - "Clicking yes confirms sending this error log straight to the developers (which we would much appreciate)", - "Mail this report?", MB_YESNO|MB_APPLMODAL ) == IDYES ) - { - send_report(); - } - } - } - if( message == WM_COMMAND && HIWORD(wParam) == BN_CLICKED && (HWND)lParam == select_button ) - { - SetFocus( textbox ); - Edit_SetSel( textbox, 0, 100000 ); - } - return CallWindowProc(defWndProc, hwnd, message, wParam, lParam); -} - - -int main( int argc, const char *argv[] ) -{ - if( argc < 3 ) - { - MessageBox( NULL, "Required parameters: PID and Crash path.", - "Usage error", MB_OK|MB_ICONERROR ); - return -1; - - } - vg_log_init(); - - DWORD pid = (DWORD)strtoul( argv[1], NULL, 16 ); - HANDLE hGameProcess = OpenProcess( PROCESS_QUERY_INFORMATION, 0, pid ); - if( hGameProcess == NULL ) - goto we_crashed; - - while(1) - { - sleep(2); - DWORD exit_code; - if( GetExitCodeProcess( hGameProcess, &exit_code ) ) - { - if( exit_code == STATUS_PENDING ) - continue; - else if( exit_code == 0 ) - return 0; - else - goto we_crashed; - } - } - -we_crashed: - report_text = vg_file_read( NULL, argv[2], &report_length, 1 ); - if( !report_text ) - { - MessageBox( NULL, "Can't even open the crash text file. Something has gone seriously wrong! Contact a developer.", - "Total epic failure!", MB_OK|MB_ICONERROR ); - return -1; - } - - int x = 10; - int y = 10; - int w = 800; - int h = 600; - int sh = 32; - int p = 8; - - RECT rect; - rect.left = x; - rect.top = y; - rect.right = x + w; - rect.bottom = y + h; - - UINT style = WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX; - AdjustWindowRectEx( &rect, style, 0, 0 ); - - window = CreateWindowEx( 0, WC_DIALOG, "VG Error report", style, - rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, - NULL, NULL, NULL, NULL ); - - CreateWindowEx( 0, WC_STATIC, "Very sorry, VG Game engine has crashed. This is probably the fault of a developer!\n" - "\n" - "Here is some information about the crash. Optionally you can submit " - "this log anonymously, straight to Mt.Zero Software." - " This will help get the bug fixed for future players!", - WS_CHILD | WS_VISIBLE, p, p, w-p*2, 80, window, NULL, NULL, NULL ); - - textbox = CreateWindowEx( WS_EX_CLIENTEDGE, WC_EDIT, "textBox", - WS_CHILD | WS_VSCROLL | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | ES_READONLY, - p, p+80+p, 800-p*2, 600-(p*2+sh+80+p), window, NULL, NULL, NULL ); - - send_button = CreateWindowEx( 0, WC_BUTTON, "Send to Mt.Zero developers", - WS_CHILD | WS_VISIBLE, - 800-(200+p), 600-(p*2+sh)+p, 200, sh, window, NULL, NULL, NULL ); - close_button = CreateWindowEx( 0, WC_BUTTON, "Close", - WS_CHILD | WS_VISIBLE, - 800-(200+p)-(100+p), 600-(p*2+sh)+p, 100, sh, window, NULL, NULL, NULL ); - select_button = CreateWindowEx( 0, WC_BUTTON, "Select all", - WS_CHILD | WS_VISIBLE, - p, 600-(p*2+sh)+p, 100, sh, window, NULL, NULL, NULL ); - - Edit_SetText( textbox, report_text ); - Edit_SetSel( textbox, 0, 0 ); - - HFONT font = CreateFont( 16, 0, 0, 0, FW_NORMAL, 0, 0, 0, 0, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Consolas"); - SendMessage( textbox, WM_SETFONT, (WPARAM)font, 1 ); - - defWndProc = (WNDPROC)SetWindowLongPtr(window, GWLP_WNDPROC, (LONG_PTR)WndProc); - - ShowWindow(window, SW_SHOW); - - MSG message = { 0 }; - while( GetMessage(&message, NULL, 0, 0) ) - DispatchMessage(&message); - return (int)message.wParam; -} diff --git a/test.kv b/test.kv deleted file mode 100644 index 4b9d98f..0000000 --- a/test.kv +++ /dev/null @@ -1,3 +0,0 @@ -name program -append foundation.kv -append build/test.kv diff --git a/unit_engine.c b/unit_engine.c deleted file mode 100644 index 1c01be4..0000000 --- a/unit_engine.c +++ /dev/null @@ -1,5 +0,0 @@ -#include "vg/vg.hconf" - -#define VG_IMPLEMENTATION -#include "vg/vg.hconf" -#undef VG_IMPLEMENTATION diff --git a/unit_thirdparty.c b/unit_thirdparty.c deleted file mode 100644 index 17ff8c0..0000000 --- a/unit_thirdparty.c +++ /dev/null @@ -1,2 +0,0 @@ -#define VG_THIRDPARTY -#include "vg/vg.hconf" diff --git a/vg.h b/vg.h deleted file mode 100644 index 2d06aab..0000000 --- a/vg.h +++ /dev/null @@ -1,86 +0,0 @@ -hc vg_build.h -hc vg_build_utils_shader.h -hc vg_m.h - -u32arr vg_pxfont.h -u32arr vg_pxfont_thin.h - -vg_platform.h ?? - -# vg_vorbis.h -# vg_image.h -# vg_depencies.c - -# vg_async.h -# vg_async.c -# vg_audio_dsp.h -# vg_audio_dsp.c -# vg_audio.h -# vg_audio.c -# vg_audio_synth_bird.h -# vg_audio_synth_bird.c -# vg_binstr.h -# vg_binstr.c -# vg_bvh.h -# vg_bvh.c -# vg_camera.h -# vg_camera.c -# vg_engine.c -# vg_engine.h -# vg_log.h -# vg_log.c -# vg_tex.c -# vg_tex.h -# vg_console.h -# vg_console.c -# vg_loader.h -# vg_loader.c -# vg_imgui.h -# vg_imgui.c -# vg_input.h -# vg_input.c -# vg_io.h -# vg_io.c - -# vg_lines.h -# vg_lines.c - -vg_mem.h -vg_mem.c -vg_mem_pool.h -vg_mem_pool.c -vg_mem_queue.h -vg_mem_queue.c -vg_msg.h -vg_msg.c -vg_opt.h -vg_opt.c -vg_perlin.h -vg_perlin.c -vg_string.h -vg_string.c -vg_profiler.h -vg_profiler.c -vg_rigidbody_collision.h -vg_rigidbody_collision.c -vg_rigidbody_constraints.h -vg_rigidbody_constraints.c -vg_rigidbody.h -vg_rigidbody.c -vg_rigidbody_view.h -vg_rigidbody_view.c -vg_shader.h -vg_shader.c - -vg_steam.h -vg_steam_auth.h -vg_steam_friends.h -vg_steam_http.h -vg_steam_networking.h -vg_steam_remote_storage.h -vg_steam_ugc.h -vg_steam_user_stats.h -vg_steam_utils.h - -vg_tool.c -vg_tool.h diff --git a/vg.hconf b/vg.hconf deleted file mode 100644 index e1b78dc..0000000 --- a/vg.hconf +++ /dev/null @@ -1,194 +0,0 @@ -/* Dependence (Standard) - * ------------------------------------------------------------------------------------------------------------------ */ - -#if !defined( VG_THIRDPARTY ) -# if defined(_WIN32) -# include -# include -# include -# include -# else -# include -# include -# include -# endif -# include -# include - -# include -# include /* remove */ -# include -# include /* remove? eventually? */ -# include /* remove? */ -# include /* remove */ -# include /* remove? eventually? */ -# include -# include -# include -# include - -# if defined( VG_MULTITHREAD ) -# if !defined( VG_ENGINE ) -# include -# include -# endif -# endif -#endif - -/* Dependence (Third party) - * ------------------------------------------------------------------------------------------------------------------ */ - -#if defined( VG_THIRDPARTY ) -# include "vg/submodules/anyascii/impl/c/anyascii.c" -#else -# include "vg/submodules/anyascii/impl/c/anyascii.h" -#endif - -#if defined( VG_ENGINE ) || defined( VG_BUILD_TOOLS ) -# if defined( VG_THIRDPARTY ) -# define STB_IMAGE_IMPLEMENTATION -# define STB_IMAGE_WRITE_IMPLEMENTATION -# endif -# define STBI_NO_THREAD_LOCALS -# include "vg/submodules/stb/stb_image.h" -# include "vg/submodules/stb/stb_image_write.h" -#endif - -#if defined( VG_BUILD_TOOLS ) || defined( VG_ENGINE ) -# if defined( VG_THIRDPARTY ) -# define STB_INCLUDE_IMPLEMENTATION -# endif -# define STB_INCLUDE_LINE_GLSL -# include "vg/submodules/stb/stb_include.h" -#endif - -#if defined( VG_ENGINE ) -# define STB_VORBIS_MAX_CHANNELS 2 -# if defined( VG_THIRDPARTY ) -# undef STB_VORBIS_HEADER_ONLY -# include "vg/submodules/stb/stb_vorbis.c" -# include "vg/vg_vorbis.c" -# undef L -# undef R -# undef C -# else -# define STB_VORBIS_HEADER_ONLY -# include "vg/submodules/stb/stb_vorbis.c" -# include "vg/vg_vorbis.h" -# endif -# define SDL_MAIN_HANDLED -# include "vg/dep/sdl2-devel/include/SDL.h" -# if defined( VG_THIRDPARTY ) -# include "vg/submodules/rax/rax.c" -# else -# include "vg/submodules/rax/rax.h" -# endif -# if defined( VG_THIRDPARTY ) -# include "vg/dep/glad/glad.c" -# else -# include "vg/dep/glad/glad.h" -# endif -#endif - - -/* Tier 0 - * ------------------------------------------------------------------------------------------------------------------ */ -#if !defined( VG_THIRDPARTY ) -# include "vg/vg_platform.h" -# include "vg/vg_mutex.h" -# include "vg/vg_log.h" -# include "vg/vg_mem.h" -# include "vg/vg_mem_pool.h" -# include "vg/vg_mem_queue.h" -# include "vg/vg_string.h" - -/* Tier 1 - * ------------------------------------------------------------------------------------------------------------------ */ -# include "vg/vg_io.h" -# include "vg/vg_kv.h" -# if defined( VG_MSG_LEGACY ) || defined( VG_MSG_TO_KVS ) -# include "vg/vg_msg.h" -# endif -# if defined( VG_MULTITHREAD ) -# include "vg/vg_async2.h" -# endif -# if defined( VG_CONSOLE ) -# include "vg/vg_console.h" -# endif -# include "vg/vg_opt.h" -# include "vg/vg_binstr.h" - -/* Maths - * ------------------------------------------------------------------------------------------------------------------ */ -# if defined( VG_MATH ) -# include "vg/vg_m.h" -# include "vg/vg_perlin.h" -# endif - -/* Database - * ------------------------------------------------------------------------------------------------------------------ */ -# if defined( VG_DB ) -# include "vg/vg_db.h" -# endif - -/* Build tools - * ------------------------------------------------------------------------------------------------------------------ */ -# if defined( VG_BUILD_TOOLS ) -# include "vg/vg_font.h" -# include "vg/vg_build_font.h" -# include "vg/vg_build.h" -# include "vg/vg_build_utils_shader.h" -# if !defined( VG_IMPLEMENTATION ) -# include "vg/vg_tex.h" -# endif -# endif - -/* Game Engine - * ------------------------------------------------------------------------------------------------------------------ */ -# if defined( VG_ENGINE ) -# include "vg/vg_window.h" -# include "vg/vg_shader.h" -# include "src.generated/vg.shaders.h" -# include "vg/vg_tex.h" -# endif - -# if defined( VG_ENGINE ) || defined( VG_IMGUI ) -# include "vg/vg_font.h" -# include "vg/vg_ui/imgui.h" -# endif - -# if defined( VG_ENGINE ) -# include "vg/vg_ui/imgui_impl_opengl.h" -# include "vg/vg_ui/filebrowser.h" -# include "vg/vg_ui/console.h" -# include "vg/vg_magi.h" -# include "vg/vg_settings.h" - -# include "vg/vg_framebuffer.h" -# include "vg/vg_camera.h" -# include "vg/vg_loader.h" -# include "vg/vg_render.h" - -# include "vg/vg_audio.h" -# include "vg/vg_audio_dsp.h" -# include "vg/vg_audio_synth_bird.h" - -# include "vg/vg_bvh.h" -# include "vg/vg_rigidbody.h" -# include "vg/vg_rigidbody_collision.h" -# include "vg/vg_rigidbody_constraints.h" -# include "vg/vg_rigidbody_view.h" - -# include "vg/vg_input.h" - -# include "vg/vg_profiler.h" -# include "vg/vg_lines.h" -# include "vg/vg_mem_view.h" - -# include "vg/vg_steam2.h" -# include "vg/vg_engine.h" -# if defined( VG_IMPLEMENTATION ) -# include "vg/laptop_gpu.c" -# endif -# endif -#endif diff --git a/vg_array_file.c b/vg_array_file.c deleted file mode 100644 index e69de29..0000000 diff --git a/vg_async2.c b/vg_async2.c deleted file mode 100644 index 6debe92..0000000 --- a/vg_async2.c +++ /dev/null @@ -1,225 +0,0 @@ -struct _vg_async -{ - i16 group_counts[ 16 ]; - vg_mutex count_lock; -} -_vg_async; - -struct vg_async_task -{ - const c8 *alloc_debug_info; - vg_async_fn fn; - u32 buffer_size; - u16 groups, unused0; - - union - { - u64 _force_8byte_align[]; - u8 buffer[]; - }; -}; - -VG_API void _vg_async_init( void ) -{ - VG_ASSERT( VG_MUTEX_INIT( _vg_async.count_lock ) ); -} - -static void _vg_async_group_increment( u16 groups, i16 dir ) -{ - if( !groups ) - return; - - VG_MUTEX_LOCK( _vg_async.count_lock ); - for( u16 i=0; i<16; i ++ ) - { - if( (groups >> i) & 0x1 ) - { - _vg_async.group_counts[i] += dir; - - VG_ASSERT( _vg_async.group_counts[i] >= 0 ); - VG_ASSERT( _vg_async.group_counts[i] <= 2048 ); - - vg_warn( "The task count for group %d has %s to %d\n", - i, dir>0? "increased": "decreased", _vg_async.group_counts[i] ); - } - } - VG_MUTEX_UNLOCK( _vg_async.count_lock ); -} - -VG_API i16 _vg_async_group_count( u16 group ) -{ - VG_ASSERT( group ); - u32 index = __builtin_ctz( (u32)group ); - - VG_MUTEX_LOCK( _vg_async.count_lock ); - i16 count = _vg_async.group_counts[ index ]; - VG_MUTEX_UNLOCK( _vg_async.count_lock ); - - return count; -} - -bool vg_init_async_queue( vg_async_queue *queue ) -{ - if( !VG_MUTEX_INIT( queue->lock ) ) - goto e0; - - if( !VG_MUTEX_INIT( queue->data_lock ) ) - goto e1; - - if( !VG_SEMAPHORE_INIT( queue->blocking_signal, 0 ) ) - goto e2; - - if( !VG_SEMAPHORE_INIT( queue->work_semaphore, 0 ) ) - goto e3; - - queue->queue.buffer = malloc( queue->buffer_size ); - queue->queue.size = queue->buffer_size; - if( !queue->queue.buffer ) - goto e2; - - return 1; -e3: VG_SEMAPHORE_FREE( queue->blocking_signal ); -e2: VG_MUTEX_FREE( queue->data_lock ); -e1: VG_MUTEX_FREE( queue->lock ); -e0: return 0; -} - -void vg_free_async_queue( vg_async_queue *queue ) -{ - VG_MUTEX_FREE( queue->data_lock ); - VG_MUTEX_FREE( queue->lock ); - VG_SEMAPHORE_FREE( queue->work_semaphore ); - VG_SEMAPHORE_FREE( queue->blocking_signal ); -} - -bool vg_async_checksize( vg_async_queue *queue, u32 bytes ) -{ - u32 total_size = sizeof(vg_async_task) + bytes; - return total_size <= queue->queue.size; -} - -VG_TIER_1 vg_async_task *vg_create_task( vg_async_queue *queue, u32 buffer_size, u32 async_flags, const c8 *debug_info ) -{ - vg_queue *ring = &queue->queue; - u32 total_size = sizeof(vg_async_task) + buffer_size; - VG_ASSERT( total_size <= queue->queue.size ); - VG_MUTEX_LOCK( queue->data_lock ); - if( queue->allocating_task ) - { - vg_fatal_error( "Overlapping async allocations. \n" - " Previous allocation began at: %s\n" - " Overlapping call at: %s\n", queue->allocating_task->alloc_debug_info, debug_info ); - } - VG_MUTEX_LOCK( queue->lock ); - - vg_async_task *task = vg_queue_alloc( ring, total_size ); - while( (async_flags & (VG_ASYNC_CRIT|VG_ASYNC_BLOCKING)) && !task ) - { - VG_MUTEX_UNLOCK( queue->lock ); - - if( async_flags & VG_ASYNC_CRIT ) - vg_fatal_error( "Too much tasks (critical)\n" ); - - VG_SEMAPHORE_WAIT( queue->blocking_signal ); - VG_MUTEX_LOCK( queue->lock ); - task = vg_queue_alloc( ring, total_size ); - } - - if( task ) - { - queue->allocating_task = task; - task->alloc_debug_info = debug_info; - task->fn = NULL; - task->buffer_size = buffer_size; - task->groups = _vg_async_context_get_groups(); - _vg_async_group_increment( task->groups, +1 ); - VG_MUTEX_UNLOCK( queue->lock ); - return task; - } - else - { - VG_MUTEX_UNLOCK( queue->lock ); - return NULL; - } -} - -void *vg_task_buffer( vg_async_queue *queue, vg_async_task *task ) -{ - VG_ASSERT( task ); - VG_ASSERT( queue->allocating_task == task ); - return task->buffer; -} - -void vg_task_send( vg_async_queue *queue, vg_async_task *task, vg_async_fn fn ) -{ - VG_ASSERT( task ); - VG_ASSERT( queue->allocating_task == task ); - - if( fn ) task->fn = fn; - else _vg_async_group_increment( task->groups, -1 ); - queue->allocating_task = NULL; - - VG_MUTEX_UNLOCK( queue->data_lock ); - VG_SEMAPHORE_POST( queue->work_semaphore ); -} - -bool vg_async_has_work( vg_async_queue *queue ) -{ - return VG_SEMAPHORE_VALUE( queue->work_semaphore ) > 0? 1: 0; -} - -bool vg_async_process_next_task( vg_async_queue *queue ) -{ - VG_SEMAPHORE_WAIT( queue->work_semaphore ); - VG_MUTEX_LOCK( queue->lock ); - if( queue->quit == k_async_quit_immediate ) - { - VG_MUTEX_UNLOCK( queue->lock ); - return 0; - } - else if( queue->quit == k_async_quit_when_empty ) - { - if( queue->queue.allocation_count == 0 ) - { - VG_MUTEX_UNLOCK( queue->lock ); - return 0; - } - } - vg_async_task *task = vg_queue_tail_data( &queue->queue ); - VG_MUTEX_UNLOCK( queue->lock ); - - if( task ) - { - /* task can be NULL if it was cancelled (so this is a NOP). Makes code easier if we do this instead of - * reverting the queue to cancel. */ - if( task->fn ) - { - vg_async_info info = - { - .buffer_size = task->buffer_size, - }; - - _vg_async_context_push_groups( task->groups, 0 ); - task->fn( (void *)task->buffer, &info ); - _vg_async_context_pop_groups(); - _vg_async_group_increment( task->groups, -1 ); - } - - VG_MUTEX_LOCK( queue->lock ); - vg_queue_pop( &queue->queue ); - VG_MUTEX_UNLOCK( queue->lock ); - } - - if( VG_SEMAPHORE_VALUE( queue->blocking_signal ) <= 0 ) - VG_SEMAPHORE_POST( queue->blocking_signal ); - - return 1; -} - -void vg_async_queue_end( vg_async_queue *queue, enum async_quit quit ) -{ - VG_MUTEX_LOCK( queue->lock ); - queue->quit = quit; - VG_MUTEX_UNLOCK( queue->lock ); - VG_SEMAPHORE_POST( queue->work_semaphore ); -} diff --git a/vg_async2.h b/vg_async2.h deleted file mode 100644 index 77d9f60..0000000 --- a/vg_async2.h +++ /dev/null @@ -1,99 +0,0 @@ -/* VG Async 2 - * Type: Library - * Depends on: vg_platform, vg_mem, vg_mutex - */ - -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_async2.c" -#else - -typedef struct vg_async_queue vg_async_queue; -typedef struct vg_async_task vg_async_task; -typedef struct vg_async_data vg_async_data; -typedef struct vg_async_info vg_async_info; - -typedef void (*vg_async_fn)( void *user, vg_async_info *info ); - -struct vg_async_info -{ - u32 buffer_size; -}; - -struct vg_async_queue -{ - u32 buffer_size; - u32 requested_bytes; - - vg_semaphore blocking_signal; - vg_semaphore work_semaphore; - vg_mutex lock; - vg_mutex data_lock; - vg_queue queue; - vg_async_task *allocating_task; - - enum async_quit - { - k_async_no_quit, - k_async_quit_immediate, - k_async_quit_when_empty - } - quit; -}; - -VG_API void _vg_async_init( void ); - -VG_API u32 _vg_async_push_grouping( u32 group_ids ); -VG_API void _vg_async_pop_grouping(void); -VG_API i16 _vg_async_group_count( u16 group ); - -bool vg_init_async_queue( vg_async_queue *queue ); -void vg_free_async_queue( vg_async_queue *queue ); - -#define VG_ASYNC_CANCEL 0 -#define VG_ASYNC_OK 1 - -/* If task would exceed queue capacity, crash the program */ -#define VG_ASYNC_CRIT 0x4 - -/* If task currently would exceeed queue capacity, block until there is space */ -#define VG_ASYNC_BLOCKING 0x2 - -/* If queue is full, immediately return and don't conduct task */ -#define VG_ASYNC_NONBLOCK 0x1 - -/* Any asynchronous flag. NOTE: if you try to create a task that exceeds the queue capacity, regardless of which - * strategy you chose, the program will crash. */ -#define VG_ASYNC (VG_ASYNC_CRIT|VG_ASYNC_BLOCKING|VG_ASYNC_NONBLOCK) - -/* Used for clarity in other functions that you DONT wan't it to run asynchronously */ -#define VG_SYNC 0x0 - -#define VG_ASYNC_GROUP_OPENGL 0x1 -#define VG_ASYNC_GROUP_INIT 0x2 -#define VG_ASYNC_GROUP_RESERVED2 0x4 -#define VG_ASYNC_GROUP_RESERVED3 0x8 -#define VG_ASYNC_GROUP_RESERVED4 0x10 -#define VG_ASYNC_GROUP_RESERVED5 0x20 -#define VG_ASYNC_GROUP_RESERVED6 0x40 -#define VG_ASYNC_GROUP_RESERVED7 0x80 - -#define VG_ASYNC_GROUP_CLIENT0 0x100 -#define VG_ASYNC_GROUP_CLIENT1 0x200 -#define VG_ASYNC_GROUP_CLIENT2 0x400 -#define VG_ASYNC_GROUP_CLIENT3 0x800 -#define VG_ASYNC_GROUP_CLIENT4 0x1000 -#define VG_ASYNC_GROUP_CLIENT5 0x2000 -#define VG_ASYNC_GROUP_CLIENT6 0x4000 -#define VG_ASYNC_GROUP_CLIENT7 0x8000 - -VG_TIER_1 vg_async_task *vg_create_task( vg_async_queue *queue, u32 buffer_size, u32 async_flags, const c8 *debug_info ); -void *vg_task_buffer( vg_async_queue *queue, vg_async_task *task ); -void vg_task_send( vg_async_queue *queue, vg_async_task *task, vg_async_fn fn ); - -void vg_async_queue_end( vg_async_queue *queue, enum async_quit quit ); - -bool vg_async_has_work( vg_async_queue *queue ); -bool vg_async_process_next_task( vg_async_queue *queue ); -bool vg_async_checksize( vg_async_queue *queue, u32 bytes ); - -#endif diff --git a/vg_audio.h b/vg_audio.h deleted file mode 100644 index ef0acf9..0000000 --- a/vg_audio.h +++ /dev/null @@ -1,262 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_audio.c" -#else -#define AUDIO_FRAME_SIZE 512 -#define AUDIO_MIX_FRAME_SIZE 256 - -#define AUDIO_CHANNELS 32 -#define AUDIO_LFOS 8 -#define AUDIO_FILTERS 16 -#define AUDIO_FLAG_LOOP 0x1 -#define AUDIO_FLAG_NO_DOPPLER 0x2 -#define AUDIO_FLAG_SPACIAL_3D 0x4 -#define AUDIO_FLAG_AUTO_START 0x8 -#define AUDIO_FLAG_NO_DSP 0x10 -#define AUDIO_FLAG_WORLD 0x20 -#define AUDIO_FLAG_FORMAT 0x1E00 -#define AUDIO_FLAG_RELINQUISHED 0x2000 -#define AUDIO_FLAG_CUTSCENE 0x4000 - -enum audio_format -{ - k_audio_format_mono = 0x000u, - k_audio_format_stereo = 0x200u, - k_audio_format_vorbis = 0x400u, - k_audio_format_none0 = 0x600u, - k_audio_format_none1 = 0x800u, - k_audio_format_none2 = 0xA00u, - k_audio_format_none3 = 0xC00u, - k_audio_format_none4 = 0xE00u, - - k_audio_format_bird = 0x1000u, - k_audio_format_gen = 0x1200u, - k_audio_format_none6 = 0x1400u, - k_audio_format_none7 = 0x1600u, - k_audio_format_none8 = 0x1800u, - k_audio_format_none9 = 0x1A00u, - k_audio_format_none10 = 0x1C00u, - k_audio_format_none11 = 0x1E00u, -}; - -#define AUDIO_DECODE_SIZE (1024*256) /* 256 kb decoding buffers */ - -#define AUDIO_VOLUME_100 500000000 -#define AUDIO_PAN_RIGHT_100 500000000 -#define AUDIO_PAN_LEFT_100 -500000000 - -typedef struct audio_clip audio_clip; -typedef struct audio_channel audio_channel; -typedef struct audio_lfo audio_lfo; -typedef u16 audio_channel_id; -typedef u16 audio_channel_group; /* TODO: Create a generation system for this */ - -enum channel_stage -{ - k_channel_stage_none = 0, - k_channel_stage_allocation, - k_channel_stage_active, - k_channel_stage_orphan -}; - -enum channel_activity -{ - k_channel_activity_wake, - k_channel_activity_playing, - k_channel_activity_paused, - k_channel_activity_end, - k_channel_activity_error -}; - -struct audio_clip -{ - union - { - const char *path; - void *generative_function; - - u64 __serialized_pointer_width0; - }; - - u32 flags; - u32 size; - - union - { - void *any_data; - u64 __serialized_pointer_width1; - }; -}; - -struct audio_lfo -{ - enum channel_stage stage; - - struct audio_lfo_controls - { - u32 period_in_samples; - enum lfo_wave_type - { - k_lfo_triangle, - k_lfo_square, - k_lfo_saw, - k_lfo_polynomial_bipolar - } - wave_type; - - f32 polynomial_coefficient, sqrt_polynomial_coefficient; - u32 flags; - } - controls; - - struct audio_lfo_state - { - u32 time, last_period_in_samples, frame_reference_count, time_at_frame_start; - struct audio_lfo_controls *controls; - } - state; -}; - -#define LFO_FLAG_PERIOD_CHANGED 0x1 - -struct audio_channel -{ - enum channel_stage stage; - - char ui_name[32]; - u32 ui_colour; - i32 ui_volume, ui_pan; - f32 ui_spacial_volume, ui_spacial_pan; - - enum channel_activity ui_activity; - u16 group; - - audio_clip *clip; - - /* the controls structure is copied into the stack of the mixer function so it can work without locking. */ - struct audio_channel_controls - { - u32 flags; - - i32 volume_target, volume_slew_rate_per_sample; - i32 pan_target, pan_slew_rate_per_sample; - f32 sampling_rate_multiplier; - - audio_channel_id lfo_id; - f32 lfo_attenuation_amount; /* multiply volume by (1 + value) */ - - v4f spacial_falloff; /* xyz, range */ - bool pause; - } - controls; - - /* the channel state can be accessed when channel stage is in allocation, or by the mixer thread post allocation. */ - struct audio_channel_state - { - enum channel_activity activity; - - u32 cursor; - i32 volume, pan, - spacial_volume, spacial_pan; - bool spacial_warm; - - union - { - struct synth_bird *bird; - stb_vorbis *vorbis; - } - decoder_handle; - - u32 loaded_clip_length; - } - state; -}; - -struct vg_audio -{ - SDL_AudioDeviceID sdl_output_device; - vg_str device_choice; /* buffer is null? use default from OS */ - - void *decoding_buffer; - - SDL_mutex *mutex; - u32 samples_written_last_audio_frame; - - audio_lfo lfos[ AUDIO_LFOS ]; - audio_channel channels[ AUDIO_CHANNELS ]; - stb_vorbis_alloc vorbis_decoders[ AUDIO_CHANNELS ]; - - bool inspector_open; - - struct audio_master_controls - { - v3f listener_position, - listener_right_ear_direction, - listener_velocity; - - bool dsp_enabled; - i32 volume_target; - } - controls; - - struct audio_master_state - { - i32 volume, volume_at_frame_start; - } - state; - - f32 master_volume_ui; - i32 dsp_enabled_ui; - - bool working; - - u32 profiler; -} -extern _vg_audio; - -VG_API void _vg_audio_register(void); -VG_API void _vg_audio_init(void); - -void vg_audio_device_init(void); -void vg_audio_begin(void); - -VG_TIER_2 bool vg_audio_clip_load( audio_clip *clip, vg_stack_allocator *stack ); -VG_TIER_2 u32 vg_audio_clip_loadn( audio_clip *arr, u32 count, vg_stack_allocator *stack ); - -void vg_audio_lock(void); -void vg_audio_unlock(void); -void vg_audio_preupdate(void); - -/* channel API */ -audio_channel_id vg_audio_get_first_idle_channel(void); -void vg_audio_set_channel_clip( audio_channel_id id, audio_clip *clip ); -void vg_audio_set_channel_group( audio_channel_id id, u16 group ); -u32 vg_audio_count_channels_in_group( u16 group ); -audio_channel_id vg_audio_get_first_active_channel_in_group( u16 group ); -void vg_audio_sidechain_lfo_to_channel( audio_channel_id id, audio_channel_id lfo_id, f32 amount ); -void vg_audio_set_channel_spacial_falloff( audio_channel_id id, v3f co, f32 range ); -void vg_audio_set_channel_volume( audio_channel_id id, f64 volume, bool instant ); -void vg_audio_set_channel_volume_slew_duration( audio_channel_id id, f64 length_seconds ); -void vg_audio_set_channel_pan( audio_channel_id id, f64 pan, bool instant ); -void vg_audio_set_channel_pan_slew_duration( audio_channel_id id, f64 length_seconds ); -void vg_audio_set_channel_sampling_rate( audio_channel_id id, f32 rate ); -void vg_audio_start_channel( audio_channel_id id ); -void vg_audio_add_channel_flags( audio_channel_id id, u32 flags ); - -audio_channel_id vg_audio_get_first_idle_lfo(void); -void vg_audio_set_lfo_polynomial_bipolar( audio_channel_id lfo_id, f32 coefficient ); -void vg_audio_set_lfo_frequency( audio_channel_id lfo_id, f32 freq ); -void vg_audio_start_lfo( audio_channel_id lfo_id ); - -/* high level functions */ -void vg_audio_sync_ui_master_controls(void); -audio_channel_id vg_audio_crossfade( audio_channel_id id, audio_clip *new_clip, f32 transition_seconds ); -void vg_audio_oneshot_3d( audio_clip *clip, v3f co, f32 range, f32 volume, u16 group, u32 flags ); -void vg_audio_oneshot( audio_clip *clip, f32 volume, f32 pan, u16 group, u32 flags ); -void vg_audio_set_channel_pause( audio_channel_id id, bool pause ); - -/* half measures... Don't expect these functions to stay. */ -void vg_audio_fadeout_flagged_audio( u32 flag, f32 length ); -bool vg_audio_flagged_stopped( u32 flag ); -bool vg_audio_is_channel_using_clip( audio_channel_id id, audio_clip *clip ); -void vg_audio_set_flagged_pause( u32 flag, bool pause ); -#endif diff --git a/vg_audio_dsp.c b/vg_audio_dsp.c deleted file mode 100644 index e30a431..0000000 --- a/vg_audio_dsp.c +++ /dev/null @@ -1,272 +0,0 @@ -struct vg_dsp vg_dsp; - -float *dsp_allocate( u32 samples ) -{ - samples = vg_align4( samples ); - - if( vg_dsp.allocations + samples > (1024*1024)/4 ) - { - vg_fatal_error( "Ran out of memory in the DSP buffer\n" - " Request was %u samples\n", samples ); - } - - float *buf = &vg_dsp.buffer[ vg_dsp.allocations ]; - vg_dsp.allocations += samples; - - return buf; -} - - -/* - * filters - * ---------------------------------------------- - */ - -f32 dsp_biquad_process( struct dsp_biquad *bq, f32 xn ){ - f32 yn = + bq->a0*xn + bq->a1*bq->xnz1 + bq->a2*bq->xnz2 - - bq->b1*bq->ynz1 - bq->b2*bq->ynz2; - bq->xnz2 = bq->xnz1; - bq->xnz1 = xn; - bq->ynz2 = bq->ynz1; - bq->ynz1 = yn; - return yn + bq->offset; -} - -void dsp_init_biquad_butterworth_lpf( struct dsp_biquad *bq, f32 fc ){ - f32 c = 1.0f/tanf(VG_PIf*fc / 44100.0f); - bq->a0 = 1.0f / (1.0f + sqrtf(2.0f)*c + powf(c, 2.0f) ); - bq->a1 = 2.0f * bq->a0; - bq->a2 = bq->a0; - bq->b1 = 2.0f * bq->a0*(1.0f - powf(c, 2.0f)); - bq->b2 = bq->a0 * (1.0f - sqrtf(2.0f)*c + powf(c, 2.0f) ); -} - -void dsp_read_delay( struct dsp_delay *delay, float *s, u32 t ){ - u32 index = delay->cur+t; - - if( index >= delay->length ) - index -= delay->length; - - *s = delay->buffer[ index ]; -} - -void dsp_write_delay( struct dsp_delay *delay, float *s ) -{ - u32 index = delay->cur; - delay->buffer[ index ] = *s; - - delay->cur ++; - - if( delay->cur >= delay->length ) - delay->cur = 0; -} - -void dsp_init_delay( struct dsp_delay *delay, float length ) -{ - delay->length = 44100.0f * length; - delay->cur = 0; - delay->buffer = dsp_allocate( delay->length ); - - for( int i=0; ilength; i++ ) - delay->buffer[i] = 0.0f; -} - -void dsp_update_lpf( struct dsp_lpf *lpf, float freq ) -{ - lpf->exponent = 1.0f-expf( -(1.0f/44100.0f) * 2.0f * VG_PIf * freq ); -} - -void dsp_init_lpf( struct dsp_lpf *lpf, float freq ) -{ - lpf->buffer = dsp_allocate( 4 ); - lpf->buffer[0] = 0.0f; - dsp_update_lpf( lpf, freq ); -} - -void dsp_write_lpf( struct dsp_lpf *lpf, float *s ) -{ - float diff = *s - lpf->buffer[0]; - lpf->buffer[0] += diff * lpf->exponent; -} - -void dsp_read_lpf( struct dsp_lpf *lpf, float *s ) -{ - *s = lpf->buffer[0]; -} - -void dsp_init_schroeder( struct dsp_schroeder *sch, float length, float gain ) -{ - dsp_init_delay( &sch->M, length ); - sch->gain = gain; -} - -void dsp_process_schroeder( struct dsp_schroeder *sch, - float *input, float *output ) -{ - float dry = *input; - - float delay_output; - dsp_read_delay( &sch->M, &delay_output, 1 ); - - float feedback_attenuated = delay_output * sch->gain, - input_feedback_sum = dry + feedback_attenuated; - - dsp_write_delay( &sch->M, &input_feedback_sum ); - - *output = delay_output - input_feedback_sum*sch->gain; -} - -/* temporary global design */ -static struct dsp_lpf __lpf_mud_free; -static struct dsp_delay __echos[8]; - -#ifdef VG_ECHO_LPF_BUTTERWORTH -static struct dsp_biquad __echos_lpf[8]; -#else -static struct dsp_lpf __echos_lpf[8]; -#endif -static struct dsp_schroeder __diffusion_chain[8]; - -VG_API void _vg_dsp_init(void) -{ - vg_rand_seed( &vg_dsp.rand, 461 ); - vg_dsp.buffer = vg_stack_allocate( NULL, VG_MB(1), 8, "Audio DSP Buffer" ); - - /* temporary global design */ - dsp_init_lpf( &__lpf_mud_free, 125.0f ); - - float sizes[] = - { 2.0f, 4.0f, 8.0f, 16.0f, 32.0f, 64.0f, 128.0f, 256.0f }; - - float variance = 0.1f; - - for( int i=0; i<8; i++ ){ - float reflection_time = ((sizes[i])/343.0f) * 1000.0f; - - float var = 1.0f + (vg_randf64(&vg_dsp.rand)*2.0f - 1.0f) * variance, - total = reflection_time * var; - - dsp_init_delay( &__echos[i], total / 1000.0f ); - - float freq = vg_lerpf( 800.0f, 350.0f, sizes[i] / 256.0f ); - -#ifdef VG_ECHO_LPF_BUTTERWORTH - dsp_init_biquad_butterworth_lpf( &__echos_lpf[i], freq ); -#else - dsp_init_lpf( &__echos_lpf[i], freq ); -#endif - } - - float diffusions[] = { 187.0f, 159.0f, 143.0f, 121.0f, - 79.0f, 57.0f, 27.0f, 11.0f }; - - for( int i=0; i<8; i++ ){ - dsp_init_schroeder( __diffusion_chain+i, diffusions[i]/1000.0f, 0.7f ); - } -} - -void vg_dsp_process( float *stereo_in, float *stereo_out ) -{ - float in_total = (stereo_in[0]+stereo_in[1])*0.5f; - float recieved = 0.0f; - - for( int i=0; i<8; i++ ){ - f32 echo; - dsp_read_delay( __echos+i, &echo, 1 ); - -#ifdef VG_ECHO_LPF_BUTTERWORTH - echo = dsp_biquad_process( __echos_lpf+i, echo ); -#else - dsp_write_lpf( __echos_lpf+i, &echo ); - dsp_read_lpf( __echos_lpf+i, &echo ); -#endif - - recieved += echo * vg_dsp.echo_tunings[i]*0.98; - } - - float diffused = recieved; - - for( int i=0; i<8; i++ ){ - dsp_process_schroeder( __diffusion_chain+i, &diffused, &diffused ); - } - - float diffuse_mix = vg_dsp.reverb_wet_mix; - diffuse_mix = vg_lerpf( recieved, diffused, diffuse_mix ); - float total = in_total + diffuse_mix; - - float low_mud; - dsp_write_lpf( &__lpf_mud_free, &total ); - dsp_read_lpf( &__lpf_mud_free, &low_mud ); - - total -= low_mud; - - for( int i=0; i<8; i++ ) - dsp_write_delay( __echos+i, &total ); - - stereo_out[0] = stereo_in[0]*vg_dsp.reverb_dry_mix; - stereo_out[1] = stereo_in[1]*vg_dsp.reverb_dry_mix; - stereo_out[0] += diffuse_mix*2.0f*vg_dsp.reverb_wet_mix; - stereo_out[1] += diffuse_mix*2.0f*vg_dsp.reverb_wet_mix; -} - -void dsp_update_tunings(void) -{ - float sizes[] = - { 2.0f, 4.0f, 8.0f, 16.0f, 32.0f, 64.0f, 128.0f, 256.0f }; - float volumes[] = - { 0.2f, 0.3f, 0.5f, 0.7f, 0.8f, 0.9f, 1.0f, 1.0f }; - - float avg_distance = 0.0f; - - for( int i=0; i<8; i++ ) - vg_dsp.echo_tunings[i] = 0.5f; - - for( int j=0; j<14; j++ ){ - float d = vg_dsp.echo_distances[j]; - - for( int i=0; i<7; i++ ){ - if( d < sizes[i+1] ){ - float range = sizes[i+1]-sizes[i]; - float t = vg_clampf( (d - sizes[i])/range, 0.0f, 1.0f ); - - vg_dsp.echo_tunings[i ] += 1.0f-t; - vg_dsp.echo_tunings[i+1] += t; - - break; - } - } - - avg_distance += d; - } - avg_distance /= 14.0f; - - - vg_dsp.reverb_wet_mix =1.0f-vg_clampf((avg_distance-30.0f)/200.0f,0.0f,1.0f); - vg_dsp.reverb_dry_mix =1.0f-vg_dsp.reverb_wet_mix*0.4f; - - float total = 0.0f; - for( int i=0; i<8; i++ ) - total += vg_dsp.echo_tunings[i]; - - if( total > 0.0f ){ - float inverse = 1.0f/total; - - for( int i=0;i<8; i++ ){ - vg_dsp.echo_tunings[i] *= inverse; - } - } - - for( int i=0; i<8; i++ ){ - float freq = vg_lerpf( 200.0f, 500.0f, vg_dsp.echo_tunings[i] ); - -#ifdef VG_ECHO_LPF_BUTTERWORTH - dsp_init_biquad_butterworth_lpf( &__echos_lpf[i], freq ); -#else - dsp_update_lpf( &__echos_lpf[i], freq ); -#endif - } - - for( int i=0;i<8; i++ ){ - vg_dsp.echo_tunings[i] *= volumes[i]; - } -} diff --git a/vg_audio_dsp.h b/vg_audio_dsp.h deleted file mode 100644 index 219b971..0000000 --- a/vg_audio_dsp.h +++ /dev/null @@ -1,61 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_audio_dsp.c" -#else - -//#define VG_ECHO_LPF_BUTTERWORTH - -struct vg_dsp -{ - float *buffer; - u32 allocations; - - float echo_distances[14], - echo_tunings[8], - reverb_wet_mix, - reverb_dry_mix; - - vg_rand rand; -} -extern vg_dsp; - -struct dsp_delay -{ - u32 length, cur; - float *buffer; -}; - -struct dsp_lpf -{ - float exponent; - float *buffer; -}; - -struct dsp_schroeder -{ - struct dsp_delay M; - float gain; -}; - -struct dsp_biquad -{ - f32 a0, a1, a2, b1, b2, c0, d0, - xnz1, xnz2, ynz1, ynz2, offset; -}; - -VG_API void _vg_dsp_init(void); -void dsp_update_tunings(void); -void vg_dsp_process( float *stereo_in, float *stereo_out ); - -f32 dsp_biquad_process( struct dsp_biquad *bq, f32 xn ); -void dsp_init_biquad_butterworth_lpf( struct dsp_biquad *bq, f32 fc ); -void dsp_read_delay( struct dsp_delay *delay, float *s, u32 t ); -void dsp_write_delay( struct dsp_delay *delay, float *s ); -void dsp_init_delay( struct dsp_delay *delay, float length ); -void dsp_update_lpf( struct dsp_lpf *lpf, float freq ); -void dsp_init_lpf( struct dsp_lpf *lpf, float freq ); -void dsp_write_lpf( struct dsp_lpf *lpf, float *s ); -void dsp_read_lpf( struct dsp_lpf *lpf, float *s ); -void dsp_init_schroeder( struct dsp_schroeder *sch, float length, float gain ); -void dsp_process_schroeder( struct dsp_schroeder *sch, float *input, float *output ); - -#endif diff --git a/vg_audio_synth_bird.c b/vg_audio_synth_bird.c deleted file mode 100644 index 71d8519..0000000 --- a/vg_audio_synth_bird.c +++ /dev/null @@ -1,414 +0,0 @@ -#define DEFAULT_VOL 1.0f,0.5f,0.2f,0.125f -#define DEFAULT_TONES { {1,1}, {6,5}, {8,7}, {13,12} } -#define DEFAULT_RISE 0.00090702947f -#define DEFAULT_FALL 0.00226757369f - -static struct synth_bird_settings synth_bird__default_settings = -{ - .tones = DEFAULT_TONES, - .type = k_bird_lfo_sine_approx, - .adsr_rise = DEFAULT_RISE, - .adsr_fall = DEFAULT_FALL -}; - -static struct synth_bird_signature synth_bird__warbling_vireo[] = -{ - /* timing fundemental volumes lfo hz,depth */ - {0.13,0.10, 4000,100,100,0, DEFAULT_VOL, 60,200 }, - {0.10,0.05, 4200,-500,1700,0, DEFAULT_VOL, 60,96 }, - {0.10,0.00, 2400,-1200,1000,1700, DEFAULT_VOL, 60,96 }, - {0.06,0.04, 3100,200,-10,-1100, DEFAULT_VOL, 60,90 }, - {0.13,0.07, 4600,-2000,0,1300, DEFAULT_VOL, 60,10 }, - {0.05,0.00, 2700,-300,700,800, DEFAULT_VOL, 60,10 }, - {0.09,0.07, 3600,-300,0,0, DEFAULT_VOL, 60,20 }, - {0.05,0.07, 4800,1240,300,0, DEFAULT_VOL, 60,20 }, - {0.08,0.02, 2700,-800,150,1000, DEFAULT_VOL, 60,160 }, - {0.12,0.08, 2700,-800,150,1000, DEFAULT_VOL, 60,160 }, - {0.10,0.04, 6300,-100,-3200,1000, DEFAULT_VOL, 60,100 }, - {0.16,0.10, 4260,-200,300,1100, DEFAULT_VOL, 60,20 } -}; - -static struct synth_bird_signature synth_bird__pied_monarch[] = -{ - /* timing fundemental volumes lfo hz,depth */ - {0.18,0.13, 2200,700,-300,0, 0.6,0.05,0,0, 60,0 }, - {0.17,0.12, 2200,700,-300,0, 0.8,0.05,0,0, 60,0 }, - {0.16,0.11, 2200,700,-300,0, 0.9,0.05,0,0, 60,0 }, - {0.14,0.09, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 }, - {0.12,0.07, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 }, - {0.11,0.06, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 }, - {0.10,0.05, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 }, - {0.10,0.05, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 }, - {0.10,0.05, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 }, - {0.10,0.05, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 }, - {0.10,0.05, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 }, - {0.10,0.10, 2200,700,-300,0, 1.0,0.05,0,0, 60,0 } -}; - -static struct synth_bird_signature synth_bird__bridled_honeyeater[] = -{ - /* timing fundemental volumes lfo hz,depth */ - {0.10,0.10, 2000,-1000,600,0, 1.00,0.00,0.00,0.00, 30,60}, - {0.10,0.10, 4000,0,-200,-200, 0.80,0.25,0.25,0.25, 30,60}, - {0.06,0.01, 4000,0,-700,-800, 0.90,0.10,0.00,0.00, 60,20}, - {0.07,0.01, 3950,0,-700,-800, 0.90,0.10,0.00,0.00, 60,20}, - {0.08,0.01, 3900,0,-700,-800, 0.90,0.10,0.00,0.00, 60,20}, - {0.09,0.01, 3850,0,-700,-800, 0.90,0.10,0.00,0.00, 60,20}, - {0.10,0.02, 3800,0,-700,-800, 0.90,0.20,0.10,0.00, 60,20}, - {0.11,0.05, 3750,0,-700,-800, 0.90,0.40,0.20,0.00, 60,20}, - {0.12,0.20, 3700,0,-700,-800, 0.30,0.10,0.00,0.00, 60,20}, - {0.10,0.10, 2600,1300,600,0, 0.97,0.03,0.00,0.00, 60,20}, -}; - -static struct synth_bird_signature synth_bird__cricket[] = -{ - /* timing fundemental volumes lfo hz, depth */ - {0.10,0.15, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.11,0.14, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.13,0.15, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.09,0.16, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.10,0.12, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.10,0.15, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.11,0.14, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.13,0.15, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.09,0.16, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200}, - {0.10,0.12, 5000,0,0,100, 0.25,0.25,0.25,0.25, 40,200} -}; - -static struct synth_bird_signature synth_bird__gray_shrikethrush[] = -{ - /* timing fundemental volumes lfo hz, depth */ - { 0.13,0.1, 2600,-200,-100,200, 0.9,0.1,0.05,0.001, 60,10 } -}; - -static struct synth_bird_signature synth_bird__boobook[] = -{ - /* timing fundemental volumes lfo hz, depth */ - {0.3,0.14, 700,0,-100,100, 0.9,0.14,0.0,0.2, 30,18}, - {0.3,1.20, 630,0,-100,100, 0.9,0.00,0.3,0.0, 30,18} -}; - -static struct synth_bird_signature synth_bird__shrike_tit[] = -{ - /* timing fundemental volumes lfo hz, depth */ - {0.6,1.4, 2300,-300,-100,100, 1.0,0.14,0.0,0.1, 60,5 } -}; - -/* sine functions over the range [0, 44100] : [-pi, pi]. - * Not accurate! */ - -static float sine_1second_1( int o ) -{ - float s = (o<(BIRD_SAMPLE_RATE/2))?-1.0f:1.0f; - float t = ((float)o*(1.0f/(float)(BIRD_SAMPLE_RATE/2)))-1.0f - s*0.5f; - float t2 = t*t; - float t4 = t2*t2; - return s*(5.0f*t2-4.0f*t4-1.0f); -} - -static void sine_1second_4( int o[4], float v[4] ) -{ - float s[4],t[4],t2[4],t4[4]; - s[0] = (o[0]<(BIRD_SAMPLE_RATE/2))?-1.0f:1.0f; - s[1] = (o[1]<(BIRD_SAMPLE_RATE/2))?-1.0f:1.0f; - s[2] = (o[2]<(BIRD_SAMPLE_RATE/2))?-1.0f:1.0f; - s[3] = (o[3]<(BIRD_SAMPLE_RATE/2))?-1.0f:1.0f; - - t[0] = ((float)o[0]*(1.0f/(float)(BIRD_SAMPLE_RATE/2)))-1.0f - s[0]*0.5f; - t[1] = ((float)o[1]*(1.0f/(float)(BIRD_SAMPLE_RATE/2)))-1.0f - s[1]*0.5f; - t[2] = ((float)o[2]*(1.0f/(float)(BIRD_SAMPLE_RATE/2)))-1.0f - s[2]*0.5f; - t[3] = ((float)o[3]*(1.0f/(float)(BIRD_SAMPLE_RATE/2)))-1.0f - s[3]*0.5f; - - t2[0] = t[0]*t[0]; - t2[1] = t[1]*t[1]; - t2[2] = t[2]*t[2]; - t2[3] = t[3]*t[3]; - - t4[0] = t2[0]*t2[0]; - t4[1] = t2[1]*t2[1]; - t4[2] = t2[2]*t2[2]; - t4[3] = t2[3]*t2[3]; - - v[0] = s[0]*(5.0f*t2[0]-4.0f*t4[0]-1.0f); - v[1] = s[1]*(5.0f*t2[1]-4.0f*t4[1]-1.0f); - v[2] = s[2]*(5.0f*t2[2]-4.0f*t4[2]-1.0f); - v[3] = s[3]*(5.0f*t2[3]-4.0f*t4[3]-1.0f); -} - -static float saw_1second_1( int o ) -{ - float t = ((float)o*(1.0f/(float)(BIRD_SAMPLE_RATE/2)))-1.0f, - tt = t*t, - ttt = tt*t; - - return -2.5f*ttt+2.5f*t; -} - -u32 synth_bird_get_length_in_samples( struct synth_bird *bird ) -{ - u32 total = 0; - - for( int i=0; isettings->pattern_length; i ++ ) - { - struct synth_bird_signature *sig = &bird->settings->pattern[i]; - u32 l = sig->length * (float)BIRD_SAMPLE_RATE, - p = sig->pause * (float)BIRD_SAMPLE_RATE; - - total += l+p; - } - - return total; -} - -void synth_bird_reset( struct synth_bird *bird ) -{ - bird->rt.osc_main[0] = 0; - bird->rt.osc_main[1] = 0; - bird->rt.osc_main[2] = 0; - bird->rt.osc_main[3] = 0; - bird->rt.osc_lfo = 0; - - bird->rt.volume[0] = 0.0f; - bird->rt.volume[1] = 0.0f; - bird->rt.volume[2] = 0.0f; - bird->rt.volume[3] = 0.0f; - - bird->rt.fundamental = 0.0f; - bird->rt.x = 0; - bird->rt.length = bird->settings->pattern[0].length * (float)BIRD_SAMPLE_RATE; - bird->rt.gate = 1; - bird->rt.adsr = 0; - bird->rt.frame = 0; - bird->rt.lfo_hz = 0; - bird->rt.fm_depth = 0.0f; - - bird->rt.adsr_rise = bird->settings->adsr_rise * (float)BIRD_SAMPLE_RATE; - bird->rt.adsr_fall = bird->settings->adsr_fall * (float)BIRD_SAMPLE_RATE; -} - -static u32 synth_bird_save_size( struct synth_bird *bird ) -{ - return sizeof(struct synth_bird_signature) * bird->settings->pattern_length + - sizeof(struct synth_bird_settings); -} - -static void synth_bird_save( struct synth_bird *bird, void *txt ) -{ - void *src = &bird->settings; - vg_bin_str( src, txt, synth_bird_save_size( bird ) ); -} - -#if 0 -static void synth_bird_load( struct synth_bird *bird, - const char *txt, u32 length ) -{ - vg_str_bin( txt, &bird->settings, length ); - synth_bird_reset( bird ); -} - -/* expects a null terminated string */ -static u32 synth_bird_memory_requirement( u32 string_length ) -{ - return (string_length/2) + - sizeof(struct synth_bird) - sizeof(struct synth_bird_settings); -} -#endif - -#ifdef SYNTH_BIRD_STDLIB -#include "stdlib.h" -#include "string.h" - -static struct synth_bird *synth_bird_create( - struct synth_bird_settings *settings, - struct synth_bird_signature *pattern, - u32 pattern_length ) -{ - u32 pattern_size = sizeof( struct synth_bird_signature ) * pattern_length; - u32 total_size = sizeof( struct synth_bird ) + pattern_size; - struct synth_bird *bird = malloc( total_size ); - - bird->settings = *settings; - - memcpy( bird->settings->pattern, pattern, pattern_size ); - bird->settings->pattern_length = pattern_length; - - synth_bird_reset( bird ); - return bird; -} - -#endif - -static void synth_bird_think( struct synth_bird *bird ) -{ - struct synth_bird_signature *sig = &bird->settings->pattern[ bird->rt.frame ]; - - bird->rt.x ++; - if( bird->rt.x >= bird->rt.length ) - { - if( bird->rt.gate && (sig->pause != 0.0f) ) - { - bird->rt.gate = 0; - bird->rt.length = sig->pause * (float)BIRD_SAMPLE_RATE; - } - else - { - bird->rt.frame ++; - - if( bird->rt.frame >= bird->settings->pattern_length ) - bird->rt.frame = 0; - - sig = &bird->settings->pattern[ bird->rt.frame ]; - - bird->rt.gate = 1; - bird->rt.length = sig->length * (float)BIRD_SAMPLE_RATE; - } - - bird->rt.x = 0; - } - - if( bird->rt.gate ) - { - bird->rt.adsr += bird->rt.adsr_rise; - if( bird->rt.adsr > BIRD_SAMPLE_RATE ) - bird->rt.adsr = BIRD_SAMPLE_RATE; - } - else - { - bird->rt.adsr -= bird->rt.adsr_fall; - if( bird->rt.adsr < 0 ) - bird->rt.adsr = 0; - } - - if( bird->rt.gate ) - { - float l = (float)bird->rt.length, - t = ((float)bird->rt.x * (1.0f/l))*2.0f - 1.0f, - tt = t*t, - ttt = tt*t; - - bird->rt.fundamental = sig->x0 + t*sig->x1 + tt*sig->x2 + ttt*sig->x3; - } - - float vol = (float)bird->rt.adsr * (1.0f/(float)BIRD_SAMPLE_RATE); - - bird->rt.fm_depth = sig->fm; - bird->rt.lfo_hz = sig->lfo_hz; - bird->rt.volume[0] = sig->v0 * vol; - bird->rt.volume[1] = sig->v1 * vol; - bird->rt.volume[2] = sig->v2 * vol; - bird->rt.volume[3] = sig->v3 * vol; -} - -static inline void int_add_mod( int *a, int const b ) -{ - *a += b; - - if( *a > BIRD_SAMPLE_RATE ) - *a -= BIRD_SAMPLE_RATE; -} - -void synth_bird_generate_samples( struct synth_bird *bird, - float *stereo_buffer, int samples ) -{ - for( int _=0; _rt.osc_lfo, bird->rt.lfo_hz ); - float fm = sine_1second_1( bird->rt.osc_lfo ) * bird->rt.fm_depth; - - int freq = bird->rt.fundamental + fm; - int hz[4] = - { - (freq * bird->settings->tones[0][0]) / bird->settings->tones[0][1], - (freq * bird->settings->tones[1][0]) / bird->settings->tones[1][1], - (freq * bird->settings->tones[2][0]) / bird->settings->tones[2][1], - (freq * bird->settings->tones[3][0]) / bird->settings->tones[3][1], - }; - - int_add_mod( bird->rt.osc_main + 0, hz[0] ); - int_add_mod( bird->rt.osc_main + 1, hz[1] ); - int_add_mod( bird->rt.osc_main + 2, hz[2] ); - int_add_mod( bird->rt.osc_main + 3, hz[3] ); - - float v[4]; - sine_1second_4( bird->rt.osc_main, v ); - - float s = v[0] * bird->rt.volume[0] + - v[1] * bird->rt.volume[1] + - v[2] * bird->rt.volume[2] + - v[3] * bird->rt.volume[3] ; - - stereo_buffer[ _*2+0 ] = s; - stereo_buffer[ _*2+1 ] = s; - } -} - -#ifdef SYNTH_BIRD_STDLIB -#define KNRM "\x1B[00m" -#define KRED "\x1B[31m" -#define KGRN "\x1B[32m" -#define KYEL "\x1B[33m" -#define KBLU "\x1B[34m" -#define KMAG "\x1B[35m" -#define KCYN "\x1B[36m" -#define KWHT "\x1B[37m" - -#define LOG_BAR0 " . |" -#define LOG_BAR1 "-------+-------+-------+-------+" -#define LOG_BAR2 " " - -static void synth_bird_log_pattern( struct synth_bird *bird ) -{ - synth_bird_reset( bird ); - - char output[][400]= { -KNRM "9k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KNRM " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KNRM "8k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KNRM " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KNRM "7k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KNRM " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KMAG "6k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KMAG " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KCYN "5k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KCYN " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KBLU "4k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KBLU " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KGRN "3k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KGRN " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KYEL "2k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KYEL " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KRED "1k-" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KRED " -" LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0 LOG_BAR0, -KWHT " +" LOG_BAR1 LOG_BAR1 LOG_BAR1 LOG_BAR1 LOG_BAR1 -KWHT " 0.0s"LOG_BAR2"0.5s"LOG_BAR2"1.0s"LOG_BAR2"1.5s"LOG_BAR2"2.0s"LOG_BAR2 - }; - - for( int i=0; i<190*8; i++ ) - { - for( int j=0; jrt.fundamental / 500.0f; - int j = hz; - - if( j < 0 ) j = 0; - if( j > 18 ) j = 18; - j = 18-j; - - float level = bird->rt.adsr; - level *= (1.0f/(float)BIRD_SAMPLE_RATE); - - int ch = level*3.0f; - - if( ch ) - output[j][(i/8)+7] = " *###"[ch]; - } - - for( int i=0; i<20; i++ ) - { - puts( output[i] ); - } -} -#endif diff --git a/vg_audio_synth_bird.h b/vg_audio_synth_bird.h deleted file mode 100644 index ed1f973..0000000 --- a/vg_audio_synth_bird.h +++ /dev/null @@ -1,63 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_audio_synth_bird.c" -#else - -#ifndef BIRD_SAMPLE_RATE - #define BIRD_SAMPLE_RATE 44100 -#endif - -struct synth_bird_signature -{ - float length, pause, /* timings in seconds */ - x0,x1,x2,x3, /* polynomial coefficients for the fundemental */ - v0,v1,v2,v3; /* volume of each oscillator */ - - int lfo_hz; /* LFO frequency (30-60hz) */ - float fm; /* LFO modulation depth (+/- hz) */ -}; - -struct synth_bird -{ - struct - { - int osc_main[4], - osc_lfo; - float volume[4]; - - float fundamental; - int x, length, /* position/length of signature in samples */ - gate, adsr, /* adsr ranges 0->44100 */ - frame; /* current frame of the pattern */ - - int lfo_hz; - float fm_depth; - - int adsr_rise, - adsr_fall; - } - rt; - - struct synth_bird_settings - { - int tones[4][2]; /* fraction of the fundemental tone - for each oscillator */ - float adsr_rise, /* rise/fall in seconds */ - adsr_fall; - - enum bird_lfo_wave{ - k_bird_lfo_sine_approx, - k_bird_lfo_bipolar_poly - } - type; - - int pattern_length; - struct synth_bird_signature pattern[]; - } - *settings; -}; - -void synth_bird_reset( struct synth_bird *bird ); -u32 synth_bird_get_length_in_samples( struct synth_bird *bird ); -void synth_bird_generate_samples( struct synth_bird *bird, float *stereo_buffer, int samples ); - -#endif diff --git a/vg_binstr.c b/vg_binstr.c deleted file mode 100644 index 7047f15..0000000 --- a/vg_binstr.c +++ /dev/null @@ -1,21 +0,0 @@ -void vg_str_bin( const void *txt, void *bin, int size ) -{ - const u8 *src = txt; - u8 *dst = bin; - - for( u32 i=0; i>4u) & 0xf); - } -} diff --git a/vg_binstr.h b/vg_binstr.h deleted file mode 100644 index 5a2ec1e..0000000 --- a/vg_binstr.h +++ /dev/null @@ -1,11 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_binstr.c" -#else - -/* dead simple.. 4 bits/character encoding */ -#define VG_BINSTR_BASECHAR 0x41 - -void vg_str_bin( const void *txt, void *bin, int size ); -void vg_bin_str( const void *bin, void *txt, u32 size ); - -#endif diff --git a/vg_build.h b/vg_build.h deleted file mode 100644 index ad88c76..0000000 --- a/vg_build.h +++ /dev/null @@ -1,533 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -/* we dont free dynamic vg_strs in this program. so, we dont care.. */ -const c8 *__asan_default_options() { return "detect_leaks=0"; } - -struct vg_project -{ - vg_str uid, bin_folder; -}; - -struct vg_compiler_env -{ - u32 optimization; - bool debug_asan; - bool thread_san; - bool no_pdb; - - enum platform - { - k_platform_anyplatform, - k_platform_windows, - k_platform_linux, - } - platform; - - enum architecture - { - k_architecture_anyarch, - k_architecture_i386, - k_architecture_x86_64, - } - arch; - - enum compiler - { - k_compiler_blob, - k_compiler_clang, - k_compiler_zigcc, - } - compiler; - - enum libc_version - { - k_libc_version_native, - k_libc_version_2_23, - } - libc; -} -_vg_common_env = -{ - .optimization = 0, - .debug_asan = 1, - .thread_san = 0, - .platform = k_platform_linux, - .arch = k_architecture_x86_64, - .compiler = k_compiler_zigcc, - .libc = k_libc_version_2_23 -}; - -struct vg_compiler_conf -{ - vg_str include, - library, - link, - defines; - bool no_lto; -}; - -enum obj_type -{ - k_obj_type_none, - k_obj_type_exe, - k_obj_type_obj, - k_obj_type_shared, -}; - -/* - * string tables - * -------------------------------------------------------------------------- */ - -static const c8 *platform_names[] = -{ - [k_platform_anyplatform] = "anyplatform", - [k_platform_windows] = "windows", - [k_platform_linux] = "linux", -}; - -static const c8 *architecture_names[] = -{ - [k_architecture_anyarch] = "anyarch", - [k_architecture_i386] = "i386", - [k_architecture_x86_64] = "x86_64", -}; - -static const c8 *compiler_names[] = -{ - [k_compiler_blob] = "blob", - [k_compiler_clang] = "clang", - [k_compiler_zigcc] = "zig-cc", -}; - -static const c8 *libc_names[] = -{ - [k_libc_version_native] = "", - [k_libc_version_2_23] = ".2.23" -}; - -/* - * OS & file tools - * -------------------------------------------------------------------------- */ - -void vg_syscall( const c8 *fmt, ... ) -{ - va_list args; - va_start( args, fmt ); - - char call[4096]; - vsnprintf( call, sizeof(call), fmt, args ); - - va_end( args ); - vg_low( "%s\n", call ); - if( system(call) ) - exit(1); -} - -void vg_add_blob( struct vg_project *proj, const c8 *blob, const c8 *dest ) -{ - vg_syscall( "cp %s %s/%s", blob, proj->bin_folder.buffer, dest ); -} - -void vg_symlink( struct vg_project *proj, const c8 *folder, const c8 *bin_name ) -{ - char dest[512]; - snprintf( dest, 512, "%s/%s", proj->bin_folder.buffer, bin_name ); - if( !access( dest, F_OK ) ) - vg_syscall( "unlink %s", dest ); - vg_syscall( "ln -srf %s %s", folder, dest ); -} - -void vg_tarball_project( struct vg_project *proj ) -{ - vg_syscall( "tar -chzvf dist/%s-%u.tar.gz %s/", proj->uid.buffer, time(NULL), proj->bin_folder.buffer ); -} - -/* - * Project - * -------------------------------------------------------------------------- */ - -/* Initialize the project structure, proj, - * IN folder/name, - * CLEAR IF fresh - */ -void vg_project_init( struct vg_project *proj, - const c8 *folder, - const c8 *name, - struct vg_compiler_env *env, - bool fresh ) -{ - vg_strnull( &proj->uid, NULL, 0 ); - vg_strcat( &proj->uid, name ); - - if( env ) - { - vg_strcat( &proj->uid, "-" ); - vg_strcat( &proj->uid, platform_names[ env->platform ] ); - vg_strcat( &proj->uid, "-" ); - vg_strcat( &proj->uid, architecture_names[ env->arch ] ); - vg_strcat( &proj->uid, "-" ); - vg_strcat( &proj->uid, compiler_names[ env->compiler ] ); - } - - vg_strnull( &proj->bin_folder, NULL, 0 ); - vg_strcat( &proj->bin_folder, folder ); - vg_strcat( &proj->bin_folder, "/" ); - vg_strcat( &proj->bin_folder, proj->uid.buffer ); - - vg_info( "project_init: %s (fresh: %s)\n (%s)\n", - name, - fresh? "yes":"no", - proj->bin_folder.buffer ); - - if( fresh ) - vg_syscall( "rm -rf %s", proj->bin_folder.buffer ); - vg_syscall( "mkdir -p %s", proj->bin_folder.buffer ); -} - -struct compile_result -{ - vg_str path, - rel_path; -}; - -bool compiler_supports_sanitizers( enum compiler compiler ) -{ - if( compiler == k_compiler_clang ) return 1; - if( compiler == k_compiler_zigcc ) return 1; - return 0; -} - -/* run a compiler.. return compiled object relative to project folder - */ -struct compile_result -vg_compiler_run( struct vg_project *project, - struct vg_compiler_env *env, - struct vg_compiler_conf *conf, - const c8 *sources, - const c8 *target_name, - enum obj_type type ) -{ - /* check for problems in configuration */ - if( env->libc != k_libc_version_native ) - { - if( env->compiler != k_compiler_zigcc ) - { - vg_fatal_error( "Cannot specify libc version using the '%s' compiler.\n", compiler_names[ env->compiler ] ); - } - } - - if( env->compiler == k_compiler_clang ) - { - if( env->platform != k_platform_linux ) - { - vg_fatal_error( "Cannot compile for '%s' using the '%s' compiler;" ); - } - } - - vg_str cmd = {0}; - vg_strcat( &cmd, "ccache " ); - - /* compiler specification */ - - if( env->compiler == k_compiler_zigcc ) - { - vg_strcat( &cmd, "zig cc " ); - - if( env->platform == k_platform_windows ) - { - if( type == k_obj_type_exe ) - { - vg_strcat( &cmd, "-Wl,--subsystem=windows" ); - - if( env->no_pdb ) - vg_strcat( &cmd, "-Wl,/pdb:/dev/null" ); - } - } - - vg_strcat( &cmd, " -target " ); - vg_strcat( &cmd, architecture_names[env->arch] ); - vg_strcat( &cmd, "-" ); - vg_strcat( &cmd, platform_names[env->platform] ); - - if( env->platform == k_platform_linux ) - { - vg_strcat( &cmd, "-gnu" ); - vg_strcat( &cmd, libc_names[env->libc] ); - } - - vg_strcat( &cmd, " -fno-sanitize=undefined " ); - vg_strcat( &cmd, " -fkeep-static-consts -fkeep-persistent-storage-variables " ); - } - - else if( env->compiler == k_compiler_clang ) - vg_strcat( &cmd, "clang" ); - - vg_strcat( &cmd, " -std=gnu99 -D_REENTRANT \\\n" ); - - if( env->optimization ) - { - vg_strcat( &cmd, " -O" ); - vg_strcati64( &cmd, env->optimization, 10 ); - } - else - { - vg_strcat( &cmd, " -O0 -ggdb3 -fno-omit-frame-pointer " ); - vg_strcat( &cmd, "\\\n" ); - } - - if( compiler_supports_sanitizers(env->compiler) && env->debug_asan ) - vg_strcat( &cmd, " -lasan -rdynamic -fsanitize=address -fPIE -fstack-protector-strong " ); - - if( compiler_supports_sanitizers(env->compiler) && env->thread_san ) - vg_strcat( &cmd, " -lasan -rdynamic -fsanitize=thread -fPIE -fstack-protector-strong " ); - - vg_strcat( &cmd, conf->no_lto? " -fno-lto \\\n": " -flto \\\n" ); - - /* want a lot of warnings but not useless ones */ - vg_strcat( &cmd, " -Wall -ferror-limit=5000\\\n" - " -Wno-unused-function -Wno-unused-variable\\\n" - " -Wno-unused-command-line-argument -Wno-unused-but-set-variable\\\n" - ); - - if( env->compiler != k_compiler_clang ) - vg_strcat( &cmd, " -Wno-format-truncation\\\n" ); - - /* defines */ - vg_strcat( &cmd, " " ); - vg_strcat( &cmd, conf->defines.buffer ); - vg_strcat( &cmd, "\\\n" ); - - /* include paths */ - vg_strcat( &cmd, " " ); - vg_strcat( &cmd, conf->include.buffer ); - vg_strcat( &cmd, "\\\n" ); - - /* library paths */ - vg_strcat( &cmd, " " ); - vg_strcat( &cmd, conf->library.buffer ); - vg_strcat( &cmd, "\\\n" ); - - /* sources */ - vg_strcat( &cmd, " " ); - - if( type == k_obj_type_obj ) - vg_strcat( &cmd, "-c -fPIC " ); - - if( type == k_obj_type_shared ) - { - vg_strcat( &cmd, "-shared -fPIC " ); - } - - vg_strcat( &cmd, sources ); - vg_strcat( &cmd, "\\\n" ); - - struct compile_result res = {0}; - - vg_strcat( &res.rel_path, target_name ); - - if( env->platform == k_platform_windows ) - { - if( type == k_obj_type_exe ) - vg_strcat( &res.rel_path, ".exe" ); - else if( type == k_obj_type_shared ) - vg_strcat( &res.rel_path, ".dll" ); - else if( type == k_obj_type_obj ) - vg_strcat( &res.rel_path, ".obj" ); - } - - if( env->platform == k_platform_linux ) - { - if( type == k_obj_type_shared ) - vg_strcat( &res.rel_path, ".so" ); - else if( type == k_obj_type_obj ) - vg_strcat( &res.rel_path, ".o" ); - } - - vg_strcat( &res.path, project->bin_folder.buffer ); - vg_strcat( &res.path, "/" ); - vg_strcat( &res.path, res.rel_path.buffer ); - - vg_strcat( &cmd, " -o " ); - vg_strcat( &cmd, res.path.buffer ); - vg_strcat( &cmd, "\\\n" ); - - /* link */ - vg_strcat( &cmd, " " ); - vg_strcat( &cmd, conf->link.buffer ); - vg_strcat( &cmd, "\\\n" ); - - if( type == k_obj_type_exe ) - { - vg_strcat( &cmd, " -Wl,-rpath=./\\\n" ); - } - - vg_syscall( cmd.buffer ); - return res; -} - -/* - * Standard VG includes & libraries which we use for games/graphics - * -------------------------------------------------------------------------- */ - -struct vg_engine_config -{ - bool use_3d, - legacy_support_vg_msg1, - log_source_info, - steam_api, - custom_game_settings, - multiplayer, - release_mode; - i32 fixed_update_hz; -} -vg_engine_default_config = -{ - .use_3d = 1, - .fixed_update_hz = 60, - .legacy_support_vg_msg1 = 0, - .log_source_info = 1, - .steam_api = 0, - .custom_game_settings = 0, - .multiplayer = 0, - .release_mode = 0 -}; - -struct compile_result -vg_make_app( struct vg_project *proj, - struct vg_engine_config *vg_conf, - struct vg_compiler_env *env, - struct vg_compiler_conf *conf, - const c8 *sources, - const c8 *appname ) -{ - struct vg_project vg_proj; - vg_project_init( &vg_proj, "bin", ".vg", env, 0 ); - - /* building assets */ - vg_build_default_font(); - - /* add config defines to compiler config */ - if( !vg_conf ) vg_conf = &vg_engine_default_config; - - vg_strcat( &conf->defines, vg_conf->use_3d? "-DVG_3D \\\n": "-DVG_2D \\\n" ); - vg_strcatf( &conf->defines, "-DVG_TIMESTEP_FIXED=\"(1.0/%d.0)\" \\\n", vg_conf->fixed_update_hz ); - vg_strcat( &conf->defines, "-DVG_MULTITHREAD -DVG_CONSOLE -DVG_MATH \\\n" ); - - if( vg_conf->legacy_support_vg_msg1 ) - vg_strcat( &conf->defines, "-DVG_MSG_TO_KVS \\\n" ); - - if( vg_conf->log_source_info ) - vg_strcat( &conf->defines, "-DVG_LOG_SOURCE_INFO \\\n" ); - - if( vg_conf->custom_game_settings ) - vg_strcat( &conf->defines, "-DVG_GAME_SETTINGS \\\n" ); - - if( vg_conf->multiplayer ) - vg_strcat( &conf->defines, "-DVG_MULTIPLAYER \\\n" ); - - if( vg_conf->release_mode ) - vg_strcat( &conf->defines, "-DVG_RELEASE_MODE \\\n" ); - - vg_strcat( &conf->defines, "-DVG_ENGINE \\\n" ); - - vg_strcat( &conf->defines, "\\\n" ); - vg_strcat( &conf->include, "-I. -I./vg -I./vg/dep " ); - - vg_strcat( &conf->library, "-L. -L/usr/lib" ); - vg_strcat( &conf->link, "-lm " ); - - /* compile all the components - * ----------------------------------------------------------------------- */ - vg_str components = {0}; - vg_strcatf( &components, "%s ", sources ); - - struct vg_compiler_env denv = *env; - //denv.optimization = 3; - - /* external dependencies */ - struct compile_result depencies = vg_compiler_run( &vg_proj, &denv, conf, "vg/unit_thirdparty.c", "vg_deps", k_obj_type_obj ); - vg_strcatf( &components, "%s ", depencies.path ); - - /* core engine */ - struct compile_result vg = vg_compiler_run( &vg_proj, &denv, conf, "vg/unit_engine.c", "vg_engine_core", k_obj_type_obj ); - vg_strcatf( &components, "%s ", vg.path ); - - /* steamworks */ - if( vg_conf->steam_api ) - { - //struct compile_result steam = vg_compiler_run( &vg_proj, &denv, conf, "vg/vg_steam2.c", "vg_steam", k_obj_type_obj ); - //vg_strcatf( &components, "%s ", steam.path ); - - if( env->platform == k_platform_linux ) - { - vg_add_blob( proj, "vg/dep/steam/libsteam_api.so", "" ); - vg_strcat( &conf->link, "-lsteam_api " ); - } - else if( env->platform == k_platform_windows ) - { - vg_add_blob( proj, "vg/dep/steam/steam_api64.dll", "" ); - vg_strcat( &conf->link, "vg/dep/steam/steam_api64.dll " ); - } - - vg_strcat( &conf->library, "-L./vg/dep/steam " ); - } - - /* link */ - /* TODO: Could be /usr/lib/x86_64-linux-gnu or /usr/lib - */ - - if( env->platform == k_platform_linux ) - { - vg_strcat( &conf->link, "-lSDL2 -lGL -lX11 -lXxf86vm " - "-lXrandr -lXi -ldl -pthread " ); - return vg_compiler_run( proj, env, conf, components.buffer, appname, k_obj_type_exe ); - } - else if( env->platform == k_platform_windows ) - { - vg_strcat( &conf->link, "-lSDL2main -lSDL2 -lopengl32 -ldbghelp \\\n" ); - vg_strcat( &conf->link, "vg/dep/sdl/SDL2.dll " ); - vg_add_blob( proj, "vg/dep/sdl/SDL2.dll ", "" ); - vg_strcat( &conf->library, "-L./vg/dep/sdl " ); - return vg_compiler_run( proj, env, conf, components.buffer, appname, k_obj_type_exe ); - } - else - { - vg_fatal_error( "No compile procedure set for platform '%s'\n", platform_names[env->platform] ); - } - - return (struct compile_result){}; -} - -void vg_add_controller_database( struct vg_project *proj ) -{ - vg_add_blob( proj, "vg/submodules/SDL_GameControllerDB/gamecontrollerdb.txt", "" ); -} - -void vg_build_scripts(void); -int main( int argc, const c8 *argv[] ) -{ - _vg_log_pre_init(); - _vg_opt_init( argc, argv ); - - if( vg_long_opt( "windows", "Build for windows" ) ) - _vg_common_env.platform = k_platform_windows; - - if( vg_long_opt( "tsan", "Use Thread Sanitizer instead of Adress Sanitizer" ) ) - { - _vg_common_env.debug_asan = 0; - _vg_common_env.thread_san = 1; - } - - if( vg_opt( 'O', "Build with optimisations" ) ) - { - _vg_common_env.optimization = 3; - _vg_common_env.debug_asan = 0; - _vg_common_env.thread_san = 0; - } - - vg_build_scripts(); - - if( !_vg_opt_check() ) - return 0; -} - -#endif diff --git a/vg_build_font.h b/vg_build_font.h deleted file mode 100644 index 6f27360..0000000 --- a/vg_build_font.h +++ /dev/null @@ -1,156 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -void vg_build_font_face_run( vg_font_face *face, char first, char last, i16 x, i16 y ) -{ - u32 uf = *((u8 *)&first), - ul = *((u8 *)&last); - - u32 count = ul - uf; - for( u32 i=0; i<=count; i ++ ) - { - u32 index = uf + i; - face->map[index].x = x+(i*face->cw); - face->map[index].y = y; - } -} - -void vg_build_write_font_face( FILE *fp, vg_font_face *face ) -{ - fprintf( fp, "vg_font_face %s = {\n", face->name ); - fprintf( fp, " .name=\"%s\",\n", face->name ); - fprintf( fp, " .cw=%hd,.ch=%hd,\n", face->cw,face->ch ); - fprintf( fp, " .sx=%hd,.sy=%hd,\n", face->sx,face->sy ); - fprintf( fp, " .baseline=%hd,\n", face->baseline ); - fprintf( fp, " .map={\n" ); - - u32 chars = 0; - - for( u32 i=0; i<256; i ++ ) - { - if( face->map[i].x || face->map[i].y ) - { - chars += fprintf( fp, "[%u]={%hd,%hd},", - i, face->map[i].x, face->map[i].y ); - - if( chars > 80 ) - { - fprintf( fp, "\n" ); - chars = 0; - } - } - } - - fprintf( fp, "\n}};\n\n" ); -} - -void vg_build_font_sheet( FILE *fp, char *name, const char *source ) -{ - int x,y,n; - unsigned char *data = stbi_load( source, &x, &y, &n, 4 ); - - if( !data ) - { - vg_error( "Couldn't open source file\n" ); - return; - } - - fprintf( fp, "vg_font_sheet %s = {\n", name ); - fprintf( fp, " .w=%d, .h=%d,\n", x,y ); - fprintf( fp, " .bitmap={\n" ); - - u32 pixel_max = x*y; - u32 pixel = 0, chars = 0; - while( pixel_max ) - { - u32 buff = 0; - for( int b = 31; b >= 0; b-- ) - { - buff |= (data[pixel*4] > 128)? (0x1u<<(u32)b): 0; - pixel++; - - if( pixel >= pixel_max ) - { - pixel_max = 0; - break; - } - } - - chars += fprintf( fp, "%#x,", buff ); - if( chars > 80 ) - { - fprintf( fp, "\n" ); - chars = 0; - } - } - - fprintf( fp, "\n}};\n" ); - free( data ); -} - -void vg_build_default_font(void) -{ - FILE *fp = fopen( "vg/vg_default_font.gc", "w" ); - vg_build_font_sheet( fp, "vg_default_font_sheet", "vg/src/fonts/vg_font_thin_3.png" ); - vg_font_face small = - { - .name = "vgf_default_small", - .cw=8, .ch=14, - .sx=8, .sy=14, - .baseline = 4 - }; - vg_build_font_face_run( &small, '!', '/', 8, 0 ); - vg_build_font_face_run( &small, '[', '`', 128,0 ); - vg_build_font_face_run( &small, '{', '~', 176,0 ); - vg_build_font_face_run( &small, ':', '@', 208,0 ); - vg_build_font_face_run( &small, 'A', 'Z', 0, 14 ); - vg_build_font_face_run( &small, 'a', 'z', 0, 28 ); - vg_build_font_face_run( &small, '0', '9', 208,14 ); - vg_build_font_face_run( &small, 0x7f, 0xa4, 0,42 ); - vg_build_font_face_run( &small, 0xb0, 0xbf, 208,28 ); - vg_build_write_font_face( fp, &small ); - - vg_font_face large = - { - .name = "vgf_default_large", - .cw=12, .ch=21, - .sx=12, .sy=21, - .baseline=6, - }; - vg_build_font_face_run( &large, '!', '/', 12, 56 ); - vg_build_font_face_run( &large, '[', '`', 192,56 ); - vg_build_font_face_run( &large, '{', '~', 264,56 ); - vg_build_font_face_run( &large, ':', '@', 312,56 ); - vg_build_font_face_run( &large, 'A', 'Z', 0, 77 ); - vg_build_font_face_run( &large, 'a', 'z', 0, 98 ); - vg_build_font_face_run( &large, '0', '9', 312,77 ); - vg_build_font_face_run( &large, 0x7f, 0xa4, 0,119 ); - vg_build_font_face_run( &large, 0xb0, 0xbe, 312,98 ); - vg_build_write_font_face( fp, &large ); - - vg_font_face title = - { - .name = "vgf_default_title", - .cw=24, .ch=42, - .sx=20, .sy=42, - .baseline=12, - }; - vg_build_font_face_run( &title, '!', '/', 24, 140 ); - vg_build_font_face_run( &title, '[', '_', 384,140 ); - vg_build_font_face_run( &title, '`', '`', 0, 182 ); - vg_build_font_face_run( &title, '{', '~', 24, 182 ); - vg_build_font_face_run( &title, ':', '@', 120,182 ); - vg_build_font_face_run( &title, 'A', 'U', 0, 224 ); - vg_build_font_face_run( &title, 'V', 'Z', 0, 308 ); - vg_build_font_face_run( &title, 'a', 'u', 0, 266 ); - vg_build_font_face_run( &title, 'v', 'z', 0, 350 ); - vg_build_font_face_run( &title, '0', '9', 120,308 ); - vg_build_font_face_run( &title, 0x89, 0x8c, 409,182 ); - vg_build_font_face_run( &title, 0x8d, 0x92, 360,308 ); - vg_build_font_face_run( &title, 0x7f, 0x88, 120,350 ); - vg_build_font_face_run( &title, 0x93, 0x98, 360,350 ); - vg_build_font_face_run( &title, 0x99, 0xa4, 0,392 ); - vg_build_font_face_run( &title, 0xb0, 0xb2, 288,392 ); - vg_build_write_font_face( fp, &title ); - - fclose( fp ); -} -#endif diff --git a/vg_build_utils_shader.h b/vg_build_utils_shader.h deleted file mode 100644 index dc452fb..0000000 --- a/vg_build_utils_shader.h +++ /dev/null @@ -1,359 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) - -struct -{ - vg_str c_structs, - c_funcs, - c_enum; - - struct multi_string - { - vg_str str; - u32 ghost_count; - } - names, - infos, - glsl; - - u32 name_count, shader_count; - - bool init; - char shader_dir[ 256 ]; -} -_shadercomp; - -static void _shadercomp_pstr( struct multi_string *ms, vg_str *ref_place, const c8 *str, u32 length ) -{ - if( ref_place ) - { - vg_strcatu64( ref_place, ms->str.i - ms->ghost_count, 10 ); - vg_strcat( ref_place, "," ); - } - - if( str ) - { - vg_strcat_limit( &ms->str, str, length ); - vg_strcat( &ms->str, "\\0" ); - ms->ghost_count ++; - } -} - -static int compile_subshader( c8 *file, c8 *shader_name ) -{ - char error[256]; - char *full = stb_include_file( file, "", _shadercomp.shader_dir, error ); - - if( !full ) - { - vg_error( "stb_include_file error:\n%s\n", error ); - return 0; - } - - enum - { - k_nothing, - k_type, - k_name, - k_maybe_uniform_block - } - state = k_nothing; - - bool uniform = 0; - u32 t_length = 0, t_start = 0; - u32 type_index = 0; - c8 comment = 0; - - // glsl types have to be ordered by string length!!!!!!!! - const c8 *glsl_defs[][6] = - { - { "int", "int b", "glUniform1i(", ",b);" }, - { "vec2", "v2f v", "glUniform2fv(", ",1,v);" }, - { "vec3", "v3f v", "glUniform3fv(", ",1,v);" }, - { "vec4", "v4f v", "glUniform4fv(", ",1,v);" }, - { "bool", "int b", "glUniform1i(", ",b);" }, - { "mat2", "m2x2f m", "glUniformMatrix2fv(", ",1,GL_FALSE,(f32*)m);" }, - { "mat3", "m3x3f m", "glUniformMatrix3fv(", ",1,GL_FALSE,(f32*)m);" }, - { "mat4", "m4x4f m", "glUniformMatrix4fv(", ",1,GL_FALSE,(f32*)m);" }, - { "float", "f32 f", "glUniform1f(", ",f);" }, - { "mat4x3", "m4x3f m", "glUniformMatrix4x3fv(", ",1,GL_FALSE,(f32*)m);", - "m4x3f *m, u32 count", ",count,GL_FALSE,(f32*)m);"}, // 1,3 -> 4,5 - { "sampler2D", "int i", "glUniform1i(", ",i);" }, - { "usampler3D", "int i", "glUniform1i(", ",i);" }, - { "samplerCube", "int i", "glUniform1i(", ",i);" }, - { "samplerBuffer","int i", "glUniform1i(", ",i);" }, - }; - - _shadercomp_pstr( &_shadercomp.glsl, &_shadercomp.c_structs, NULL, 0 ); - vg_strcatch( &_shadercomp.glsl.str, '"' ); - _shadercomp.glsl.ghost_count += 1; - - for( u32 i=0; 1; i ++ ) - { - c8 c = full[i]; - if( !c ) - break; - - if( comment == '/' ) - { - if( c == '\n' ) comment = 0; - continue; - } - if( comment == '*' ) - { - if( (c == '*') && (full[i+1] == '/') ) - { - comment = 0; - i ++; - } - continue; - } - if( (c == '/') && ((full[i+1] == '/') || (full[i+1] == '*')) ) - { - comment = full[i+1]; - i ++; - continue; - } - - if( c == '\n' ) - { - vg_strcat( &_shadercomp.glsl.str, "\\n\"\n\"" ); - _shadercomp.glsl.ghost_count += 4; - } - else - vg_strcatch( &_shadercomp.glsl.str, c ); - - if( c==' '||c=='\t'||c=='\r'||c=='\n'||c=='{'||c=='}'||c==';'||c=='[' ) - { - if( t_length ) - { - if( state == k_nothing ) - { - if( !strncmp( full+t_start, "uniform", t_length ) ) - { - state = k_type; - } - } - else if( state == k_type ) - { - // check type - type_index = 9999; - - for( u32 j=0; jpos, b->pos, t, d->pos ); - vg_camera_lerp_angles( a->angles, b->angles, t, d->angles ); - d->fov = vg_lerpf( a->fov, b->fov, t ); -} - -void vg_camera_copy( vg_camera *a, vg_camera *d ) -{ - v3_copy( a->pos, d->pos ); - v3_copy( a->angles, d->angles ); - d->fov = a->fov; -} - -void vg_m4x3_transform_camera( m4x3f m, vg_camera *cam ) -{ - m4x3_mulv( m, cam->pos, cam->pos ); - - v3f v0; - v3_angles_vector( cam->angles, v0 ); - m3x3_mulv( m, v0, v0 ); - v3_normalize( v0 ); - v3_angles( v0, cam->angles ); -} - -/* - * 1) [angles, pos] -> transform - */ -void vg_camera_update_transform( vg_camera *cam ) -{ - v4f qyaw, qpitch, qroll, qcam; - q_axis_angle( qyaw, (v3f){ 0.0f, 1.0f, 0.0f }, -cam->angles[0] ); - q_axis_angle( qpitch, (v3f){ 1.0f, 0.0f, 0.0f }, -cam->angles[1] ); - q_axis_angle( qroll, (v3f){ 0.0f, 0.0f, 1.0f }, -cam->angles[2] ); - - q_mul( qyaw, qpitch, qcam ); - q_mul( qcam, qroll, qcam ); - q_m3x3( qcam, cam->transform ); - v3_copy( cam->pos, cam->transform[3] ); -} - -/* - * 2) [transform] -> transform_inverse, view matrix - */ -void vg_camera_update_view( vg_camera *cam ) -{ - m4x4_copy( cam->mtx.v, cam->mtx_prev.v ); - m4x3_invert_affine( cam->transform, cam->transform_inverse ); - m4x3_expand( cam->transform_inverse, cam->mtx.v ); -} - -/* - * 3) [fov,nearz,farz] -> projection matrix - */ -void vg_camera_update_projection( vg_camera *cam, f32 vw, f32 vh ) -{ - m4x4_copy( cam->mtx.p, cam->mtx_prev.p ); - m4x4_projection( cam->mtx.p, cam->fov, (float)vw / (float)vh, cam->nearz, cam->farz ); -} - -/* - * 4) [projection matrix, view matrix] -> previous pv, new pv - */ -void vg_camera_finalize( vg_camera *cam ) -{ - m4x4_copy( cam->mtx.pv, cam->mtx_prev.pv ); - m4x4_mul( cam->mtx.p, cam->mtx.v, cam->mtx.pv ); -} diff --git a/vg_camera.h b/vg_camera.h deleted file mode 100644 index c4f88f6..0000000 --- a/vg_camera.h +++ /dev/null @@ -1,53 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_camera.c" -#else - -typedef struct vg_camera vg_camera; -struct vg_camera -{ - /* Input */ - v3f angles; - v3f pos; - f32 fov, nearz, farz; - - /* Output */ - m4x3f transform, - transform_inverse; - - struct vg_camera_mtx{ - m4x4f p, - v, - pv; - } - mtx, - mtx_prev; -}; - -void vg_camera_lerp_angles( v3f a, v3f b, f32 t, v3f d ); - -/* lerp position, fov, and angles */ -void vg_camera_lerp( vg_camera *a, vg_camera *b, f32 t, vg_camera *d ); -void vg_camera_copy( vg_camera *a, vg_camera *d ); -void vg_m4x3_transform_camera( m4x3f m, vg_camera *cam ); - -/* - * 1) [angles, pos] -> transform - */ -void vg_camera_update_transform( vg_camera *cam ); - -/* - * 2) [transform] -> transform_inverse, view matrix - */ -void vg_camera_update_view( vg_camera *cam ); - -/* - * 3) [fov,nearz,farz] -> projection matrix - */ -void vg_camera_update_projection( vg_camera *cam, f32 vw, f32 vh ); - -/* - * 4) [projection matrix, view matrix] -> previous pv, new pv - */ -void vg_camera_finalize( vg_camera *cam ); - -#endif diff --git a/vg_console.c b/vg_console.c deleted file mode 100644 index 4454630..0000000 --- a/vg_console.c +++ /dev/null @@ -1,318 +0,0 @@ -struct vg_console vg_console; - -void vg_console_reg_var( const char *alias, void *ptr, enum vg_var_dtype type, u32 flags ) -{ -#if defined( VG_ENGINE ) - VG_ASSERT( vg_console.registration_blocked==0 ); - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_MAIN ) ); -#endif - VG_ASSERT( vg_console.var_count < VG_ARRAY_LEN(vg_console.vars) ); - - vg_var *var = &vg_console.vars[ vg_console.var_count ++ ]; - var->name = alias; - var->data = ptr; - var->data_type = type; - var->flags = flags; -} - -void vg_console_reg_cmd( const char *alias, int (*function)(int argc, const char *argv[]), - void (*poll_suggest)(int argc, const char *argv[]) ) -{ -#if defined( VG_ENGINE ) - VG_ASSERT( vg_console.registration_blocked==0 ); - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_MAIN ) ); -#endif - VG_ASSERT( vg_console.function_count < VG_ARRAY_LEN(vg_console.functions) ); - - vg_cmd *cmd = &vg_console.functions[ vg_console.function_count ++ ]; - - cmd->function = function; - cmd->poll_suggest = poll_suggest; - cmd->name = alias; -} - -static int _vg_console_list( int argc, char const *argv[] ) -{ - for( int i=0; iname ); - } - - for( int i=0; idata_type], cv->name ); - } - - return 0; -} - -#if defined( VG_ENGINE ) -static void vg_console_write_persistent(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_MAIN ) ); - FILE *fp = fopen( "cfg/auto.conf", "w" ); - if( !fp ) - { - vg_error( "Cannot open cfg/auto.conf\n" ); - return; - } - - for( int i=0; iflags & VG_VAR_PERSISTENT ) - { - if( cv->data_type == k_var_dtype_i32 ) - fprintf( fp, "%s %d\n", cv->name, *(i32 *)(cv->data) ); - else if( cv->data_type == k_var_dtype_u32 ) - fprintf( fp, "%s %u\n", cv->name, *(u32 *)(cv->data) ); - else if( cv->data_type == k_var_dtype_f32 ) - fprintf( fp, "%s %.5f\n", cv->name, *(float *)(cv->data ) ); - else if( cv->data_type == k_var_dtype_str ) - { - vg_str *str = cv->data; - if( str->buffer && (str->i > 0) ) - fprintf( fp, "%s %s\n", cv->name, str->buffer ); - } - } - } - - fclose( fp ); -} -#endif - -/* - * splits src into tokens and fills out args as pointers to those tokens - * returns number of tokens - * dst must be as long as src - */ -static int vg_console_tokenize( const char *src, char *dst, const char *args[32] ) -{ - int arg_count = 0; - bool in_token = 0, in_string = 0; - - for( int i=0;; i ++ ) - { - char c = src[i]; - dst[i] = c; - - if( c == '\0' ) - break; - - if( c == '"' ) - { - if( in_string ) - { - if( in_token ) - { - dst[i] = '\0'; - in_token = 0; - } - - in_string = 0; - } - else - in_string = 1; - } - else - { - if( !in_string && (c == ' ' || c == '\t') ) - { - if( in_token ) - { - dst[i] = '\0'; - in_token = 0; - } - else - dst[i] = '\0'; - } - else - { - if( in_token ) {} - else - { - if( arg_count == 32 ) - { - vg_error( "Console input exceeded maximum command tokens (>32)\n" ); - break; - } - else - { - args[ arg_count ++ ] = &dst[i]; - in_token = 1; - } - } - } - } - } - - return arg_count; -} - -static vg_var *vg_console_match_var( const char *kw ) -{ - for( int i=0; iname, kw ) ) - { - return cv; - } - } - - return NULL; -} - -static vg_cmd *vg_console_match_cmd( const char *kw ) -{ - for( int i=0; iname, kw ) ) - { - return cmd; - } - } - - return NULL; -} - -void vg_execute_console_input( const char *cmd, bool silent, bool cheat_override ) -{ - char temp[512]; - char const *args[32]; - int arg_count = vg_console_tokenize( cmd, temp, args ); - - if( arg_count == 0 ) - return; - - vg_var *cv = vg_console_match_var( args[0] ); - vg_cmd *fn = vg_console_match_cmd( args[0] ); - - if( cv ) - { - /* Cvar Matched, try get value */ - if( arg_count >= 2 ) - { -#ifdef VG_ENGINE - if( (cv->flags & VG_VAR_CHEAT) && !cheat_override ) - { - bool cheats = vg_console.cheats; - if( !cheats && !silent ) - { - vg_error( "variable is cheat protected\n" ); - return; - } - } -#endif - - if( (cv->data_type == k_var_dtype_u32) || (cv->data_type == k_var_dtype_i32) ) - { - int *ptr = cv->data; - *ptr = atoi( args[1] ); - } - else if( cv->data_type == k_var_dtype_f32 ) - { - float *ptr = cv->data; - *ptr = atof( args[1] ); - } - else if( cv->data_type == k_var_dtype_str ) - { - vg_str *str = cv->data; - vg_strfree( str ); - vg_strnull( str, NULL, 0 ); - - for( int i=1; idata_type == k_var_dtype_i32 ) - vg_info( "= %d\n", *((int *)cv->data) ); - else if( cv->data_type == k_var_dtype_u32 ) - vg_info( "= %u\n", *((u32 *)cv->data) ); - else if( cv->data_type == k_var_dtype_f32 ) - vg_info( "= %.4f\n", *((float *)cv->data) ); - else if( cv->data_type == k_var_dtype_str ) - { - vg_str *str = cv->data; - vg_info( "= '%s'\n", str->buffer ); - } - } - - return; - } - else if( fn ) - { - fn->function( arg_count-1, args+1 ); - return; - } - - if( !silent ) - vg_error( "No command/var named '%s'. Use 'list' to view all\n",args[0]); -} - -static int vg_console_exec( int argc, const char *argv[] ) -{ - if( argc < 1 ) - return 0; - - int silent=0; - if( argc == 2 ) - silent=1; - - char path[256]; - strcpy( path, "cfg/" ); - strncat( path, argv[0], 250 ); - - FILE *fp = fopen( path, "r" ); - if( fp ) - { - char line[256]; - - while( fgets( line, sizeof( line ), fp ) ) - { - line[ strcspn( line, "\r\n#" ) ] = 0x00; - if( line[0] == 0x00 ) - continue; - - if( line[0] == '/' ) - if( line[1] == '/' ) - continue; - - vg_execute_console_input( line, silent, 0 ); - } - - fclose( fp ); - } - else - vg_error( "Could not open '%s'\n", path ); - return 0; -} - - -VG_API void _vg_console_register(void) -{ - vg_console_reg_cmd( "list", _vg_console_list, NULL ); - vg_console_reg_cmd( "exec", vg_console_exec, NULL ); -#if defined( VG_ENGINE ) - vg_console_reg_var( "cheats", &vg_console.cheats, k_var_dtype_i32, 0 ); -#endif -} - -VG_API void _vg_console_init(void) -{ -#if defined( VG_ENGINE ) - vg_console.registration_blocked = 1; - vg_console_exec( 2, (const char *[]){ "auto.conf", "silent" } ); - _vg_add_exit_function( vg_console_write_persistent ); -#endif -} diff --git a/vg_console.h b/vg_console.h deleted file mode 100644 index bf4bdec..0000000 --- a/vg_console.h +++ /dev/null @@ -1,85 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_console.c" -#else - -#define VG_VAR_F32( NAME, ... ) \ - { u32 flags=0x00; __VA_ARGS__ ;\ - vg_console_reg_var( #NAME, &NAME, k_var_dtype_f32, flags ); } - -#define VG_VAR_I32( NAME, ... ) \ - { u32 flags=0x00; __VA_ARGS__ ;\ - vg_console_reg_var( #NAME, &NAME, k_var_dtype_i32, flags ); } - -#define VG_VAR_PERSISTENT 0x1 -#define VG_VAR_CHEAT 0x2 - -typedef struct vg_var vg_var; -typedef struct vg_cmd vg_cmd; - -struct vg_console -{ - struct vg_var - { - void *data; - const char *name; - enum vg_var_dtype - { - k_var_dtype_i32, - k_var_dtype_u32, - k_var_dtype_f32, - k_var_dtype_str - } - data_type; - u32 flags; - } - vars[ 128 ]; - - struct vg_cmd - { - int (*function)( int argc, char const *argv[] ); - void (*poll_suggest)( int argc, char const *argv[] ); - const char *name; - } - functions[ 32 ]; - -#if defined( VG_ENGINE ) - struct { - const char *str; - int len; - - u32 lev_score; - } - suggestions[12]; - u32 suggestion_count; - int suggestion_select, - suggestion_pastepos, - suggestion_maxlen; -#endif - - u32 var_count, function_count; - -#if defined( VG_ENGINE ) - char input[96], - input_copy[96]; - char history[32][96]; - int history_last, history_pos, history_count; - - i32 enabled, cheats; - bool auto_focus; -#endif - - bool registration_blocked; -} -extern vg_console; - -VG_API void _vg_console_register(void); -VG_API void _vg_console_init(void); - -void vg_console_reg_var( const char *alias, void *ptr, enum vg_var_dtype type, u32 flags ); - -void vg_console_reg_cmd( const char *alias, int (*function)(int argc, const char *argv[]), - void (*poll_suggest)(int argc, const char *argv[]) ); - -void vg_execute_console_input( const char *cmd, bool silent, bool cheat_override ); - -#endif diff --git a/vg_db.c b/vg_db.c deleted file mode 100644 index 1b1062c..0000000 --- a/vg_db.c +++ /dev/null @@ -1,898 +0,0 @@ -static void vg_db_touch( vg_db *db, u16 cache_id ); - -/* util - * ------------------------------------------------------------------------------------------------------------------ */ - -static void vg_db_abort( vg_db *db, const char *message, ... ) -{ - fclose( db->fp ); - db->fp = NULL; - va_list args; - va_start( args, message ); - _vg_logx_va( stderr, NULL, "vg_db fatal", KRED, message, args ); - va_end( args ); - vg_fatal_error( "Database error\n" ); -} - -static u32 vg_dbhash( u8 *buf, u32 len ) -{ - /* djb2 */ - u32 hash = 5381; - for( u32 i=0; ifp, log.db_file_offset, SEEK_SET ) ) - vg_db_abort( db, "While playing back WAL, SEEK_SET(0x%lx) failed\n", log.db_file_offset ); - if( !fwrite( temp_page, log.data_size, 1, db->fp ) ) - vg_db_abort( db, "While playing back WAL, fwrite failed (0x%lx bytes)\n", log.data_size ); - last_good_log = log_pos; - } - else - { - vg_warn( "Truncated log entry while playing back WAL (not enough redo data)\n" ); - break; - } - } - else - { - vg_warn( "Truncated log entry while playing back WAL (didn't make it to redo data)\n" ); - break; - } - } - else - { - last_good_log = log_pos; - last_good_checkpoint = log_pos; - } - } - - /* Rewind until we get back to a good checkpoint (if needed) */ - if( last_good_log != last_good_checkpoint ) - vg_warn( "Rewinding...\n" ); - - u32 writes_away = 0; - u64 rewind_cur = last_good_log; - while( rewind_cur != last_good_checkpoint ) - { - writes_away ++; - if( fseek( fwal, rewind_cur, SEEK_SET ) ) - vg_db_abort( db, "While rewinding WAL, SEEK_SET(0x%lx) failed\n", rewind_cur ); - if( !fread( &log, sizeof(log), 1, fwal ) ) - vg_db_abort( db, "While rewinding WAL, fread failed\n" ); - if( fread( temp_page, log.data_size, 1, fwal ) ) - { - vg_info( "Offset: %lx, size: %lu\n", log.db_file_offset, log.data_size ); - if( fseek( db->fp, log.db_file_offset, SEEK_SET ) ) - vg_db_abort( db, "While rewinding WAL, SEEK_SET(0x%lx) failed\n", log.db_file_offset ); - if( !fwrite( temp_page, log.data_size, 1, db->fp ) ) - vg_db_abort( db, "While rewinding WAL, fwrite failed (0x%lx bytes)\n", log.data_size ); - rewind_cur = log.previous_log_offset; - } - else - { - vg_warn( "Truncated log entry while playing back WAL (not enough redo data)\n" ); - break; - } - } - - if( last_good_log != last_good_checkpoint ) - vg_info( "Rewinding took %u writes back..\n", writes_away ); - - fflush( db->fp ); - free( temp_page ); -} - -void vg_db_open( vg_db *db, const char *path, const char *wal_path ) -{ - u32 k_ident = 0xf32b1a00; - vg_rand_seed( &db->rand, k_ident -#ifndef DB_PREDICTABLE - + time(NULL) -#else -#warning PREDICTABLE DB MODE ( DEBUGGING ONLY ) -#endif - ); - - db->fp = fopen( path, "rb+" ); - db->fp_wal = NULL; - db->wal_path = wal_path; - db->page_data = malloc( VG_PAGE_SIZE*VG_MAX_CACHED_PAGES ); - db->cache_count = 0; - db->lru_old = 0; - db->lru_young = 0; - if( db->fp ) - { - FILE *fwal = fopen( wal_path, "rb" ); - if( fwal ) - { - vg_db_commit( db, fwal ); - fclose( fwal ); - remove( wal_path ); - } - - u32 ident; - vg_db_read( db, 0, &ident, 4 ); - if( ident != k_ident ) - vg_db_abort( db, "Ident not found in db file '%s'\n", path ); - vg_db_read( db, offsetof(vg_db_header,userdata_address), &db->userdata_address, 8 ); - } - else - { - db->fp = fopen( path, "wb+" ); - if( !db->fp ) - vg_db_abort( db, "fopen(wb+) failed for '%s'\n", path ); - - vg_db_header init = {0}; - init.ident = k_ident; - init._end = k_ident; - init.physical_size = VG_PAGE_SIZE; - if( !fwrite( &init, sizeof(init), 1, db->fp ) ) - vg_db_abort( db, "fwrite header failed'\n" ); - - /* Sit it into the cache */ - u16 cache_id = ++db->cache_count; - vg_db_page *page = &db->page_cache[ cache_id-1 ]; - memset( page, 0, sizeof(vg_db_page) ); - u64 page_base = 0; - u32 hash = vg_dbhash( (void *)(&page_base), sizeof(page_base) ) & (VG_PAGE_CACHE_HASH_WIDTH-1u); - db->hash_table[ hash ] = cache_id; - vg_db_touch( db, cache_id ); - page->virtual_id = page_base; - page->physical_offset = page_base; - page->unwritten = 0; - memcpy( db->page_data, &init, sizeof(init) ); - - db->userdata_address = vg_db_virtual_allocate( db, VG_1GB ); - - db->unprotect0 ++; - vg_db_write( db, offsetof(vg_db_header,userdata_address), &db->userdata_address, 8 ); - vg_db_tree_init( db, offsetof(vg_db_header,address_tree) ); - db->unprotect0 --; - - vg_db_checkpoint( db ); - } -} - -void vg_db_close( vg_db *db ) -{ - vg_db_checkpoint( db ); - if( db->fp_wal ) - { - fclose( db->fp_wal ); - db->fp_wal = NULL; - } - fclose( db->fp ); - db->fp = NULL; -#if 0 - if( db->fp_wal ) - { - fclose( db->fp_wal ); - remove( db->wal_path ); /* dont need anymore */ - } -#endif - free( db->page_data ); - db->page_data = NULL; -} - -/* paging - * ------------------------------------------------------------------------------------------------------------------ */ - -static u64 vg_db_allocate_physical_page( vg_db *db ) -{ - u64 physical_size, address; - vg_db_read( db, 0x0lu + offsetof(vg_db_header,physical_size), &physical_size, sizeof(physical_size) ); - address = physical_size; - physical_size += VG_PAGE_SIZE; - db->unprotect0 ++; - vg_db_write( db, 0x0lu + offsetof(vg_db_header,physical_size), &physical_size, sizeof(physical_size) ); - db->unprotect0 --; - return address; -} - -static void vg_db_sync_page( vg_db *db, u16 cache_id ) -{ - vg_db_page *page = &db->page_cache[ cache_id-1 ]; - if( page->unwritten ) - { - //vg_low( "Syncing page @0x%lx to disk\n", page->physical_offset ); - if( fseek( db->fp, page->physical_offset, SEEK_SET ) ) - vg_db_abort( db, "SEEK_SET(%lx) failed\n", page->physical_offset ); - void *page_data = db->page_data + (u64)(cache_id-1)*VG_PAGE_SIZE; - if( !fwrite( page_data, VG_PAGE_SIZE, 1, db->fp ) ) - vg_db_abort( db, "fwrite failed\n" ); - page->unwritten = 0; - } -} - -static void vg_db_touch( vg_db *db, u16 cache_id ) -{ - vg_db_page *page = &db->page_cache[ cache_id-1 ]; - /* unlink entirely */ - if( page->lru_younger ) - db->page_cache[ page->lru_younger-1 ].lru_older = page->lru_older; - else if( db->lru_young == cache_id ) - db->lru_young = page->lru_older; - if( page->lru_older ) - db->page_cache[ page->lru_older-1 ].lru_younger = page->lru_younger; - else if( db->lru_old == cache_id ) - db->lru_old = page->lru_younger; - /* re-link */ - page->lru_younger = 0; - page->lru_older = db->lru_young; - if( db->lru_young ) - { - page->lru_older = db->lru_young; - db->page_cache[ db->lru_young-1 ].lru_younger = cache_id; - } - db->lru_young = cache_id; - if( !db->lru_old ) - db->lru_old = cache_id; -} - -static void *vg_db_devirtualize( vg_db *db, u64 address, bool write, u64 *out_physical_address ) -{ - u64 page_base = address & ~(VG_PAGE_SIZE-1lu), - inner_offset = address & (VG_PAGE_SIZE-1lu); - - /* Check hash table for our page */ - u32 hash = vg_dbhash( (void *)(&page_base), sizeof(page_base) ) & (VG_PAGE_CACHE_HASH_WIDTH-1u); - u16 current = db->hash_table[ hash ]; - while( current ) - { - vg_db_page *page = &db->page_cache[ current-1 ]; - if( page->virtual_id == page_base ) - { - page->unwritten |= write; - vg_db_touch( db, current ); - *out_physical_address = page->physical_offset + inner_offset; - return db->page_data + ((u64)(current-1)*VG_PAGE_SIZE + inner_offset); - } - else - current = page->hash_prev; - } - - /* Translate address & create page if need be */ - u64 translated_page_base = page_base; - if( address & VG_VIRTUAL_ADDRESS_BIT ) - { - u64 tree_address = offsetof(vg_db_header,address_tree); - translated_page_base = vg_db_translate( db, tree_address, page_base ); - if( translated_page_base == 0 ) - { - u64 new_page = vg_db_allocate_physical_page( db ); - db->unprotect0 ++; - vg_db_tree_map( db, tree_address, page_base, new_page ); - db->unprotect0 --; - translated_page_base = new_page; - } - } - - /* Allocate cache ID */ - u16 cache_id = 0; - vg_db_page *page = NULL; - if( db->cache_count < VG_MAX_CACHED_PAGES ) - { - cache_id = ++db->cache_count; - page = &db->page_cache[ cache_id-1 ]; - memset( page, 0, sizeof(vg_db_page) ); - } - else - { - cache_id = db->lru_old; - vg_db_sync_page( db, cache_id ); - page = &db->page_cache[ cache_id-1 ]; - u32 old_hash = vg_dbhash( (void *)(&page->virtual_id), sizeof(page->virtual_id) ) & (VG_PAGE_CACHE_HASH_WIDTH-1u); - u16 current = db->hash_table[ old_hash ], before = 0; - while( current != cache_id ) - { - before = current; - current = db->page_cache[ current-1 ].hash_prev; - } - if( before ) db->page_cache[ before-1 ].hash_prev = page->hash_prev; - else db->hash_table[ old_hash ] = page->hash_prev; - } - page->hash_prev = db->hash_table[ hash ]; - db->hash_table[ hash ] = cache_id; - vg_db_touch( db, cache_id ); - page->virtual_id = page_base; - page->physical_offset = translated_page_base; - page->unwritten = write; - - /* read entire page into memory */ - u8 *page_data = (u8 *)(db->page_data + (u64)(cache_id-1)*VG_PAGE_SIZE); - if( fseek( db->fp, translated_page_base, SEEK_SET ) ) - vg_db_abort( db, "SEEK_SET (%lx) failed\n", translated_page_base ); - - bool eof = 0; - for( u32 i=0; ifp ) ) - { - if( ferror( db->fp ) ) - vg_db_abort( db, "fread page failed\n" ); - else if( feof( db->fp ) ) - eof = 1; - else - vg_db_abort( db, "Invalid read condition\n" ); - } - } - - if( eof ) - page_data[i] = 0; - } - - *out_physical_address = translated_page_base + inner_offset; - return page_data + inner_offset; -} - -void vg_db_checkpoint( vg_db *db ) -{ - if( db->fp_wal == NULL ) - return; - - u64 file_pos = ftell( db->fp_wal ); - vg_db_wal log = { - .type = k_wal_log_checkpoint, - .previous_log_offset = db->previous_wal_log, - .db_file_offset = 0, - .data_size = 0 - }; - if( !fwrite( &log, sizeof(log), 1, db->fp_wal ) ) - vg_db_abort( db, "fwrite failed into WAL\n" ); - db->previous_wal_log = file_pos; - - if( db->wal_writes > 1000 ) - { - fflush( db->fp_wal ); - vg_db_commit( db, db->fp_wal ); - fclose( db->fp_wal ); - remove( db->wal_path ); - db->wal_writes = 0; - db->previous_wal_log = 0; - db->fp_wal = NULL; - } -} - -void vg_db_xch( vg_db *db, u64 base_address, void *buf, u32 length, bool write ) -{ - u64 address = base_address, - end = base_address + (u64)length; - - while( address != end ) - { - u64 byte_count = VG_PAGE_SIZE - (address & (VG_PAGE_SIZE-1lu)); - if( address + byte_count > end ) - byte_count = end - address; - - u64 physical_address = 0; - void *cache_buffer = vg_db_devirtualize( db, address, write, &physical_address ), - *user_buffer = buf + (address-base_address); - if( write ) - { - if( (physical_address < VG_PAGE_SIZE) && !db->unprotect0 ) - { - vg_db_abort( db, "Tried to write to the 0 page while unprotected!\n" - " base_address: %llu, length: %u\n", base_address, length ); - } - - if( db->fp_wal == NULL ) - { - db->fp_wal = fopen( db->wal_path, "wb+" ); - if( !db->fp_wal ) - vg_db_abort( db, "Failed to open wal file '%s'\n", db->wal_path ); - - vg_db_wal log = { - .type = k_wal_log_checkpoint, - .previous_log_offset = 0, - .db_file_offset = 0, - .data_size = 0 - }; - if( !fwrite( &log, sizeof(log), 1, db->fp_wal ) ) - vg_db_abort( db, "fwrite failed into WAL\n" ); - } - - u64 file_pos = ftell( db->fp_wal ); - vg_db_wal log = { - .type = k_wal_log_data, - .previous_log_offset = db->previous_wal_log, - .db_file_offset = physical_address, - .data_size = byte_count - }; - if( !fwrite( &log, sizeof(log), 1, db->fp_wal ) ) - vg_db_abort( db, "fwrite failed into WAL\n" ); - if( !fwrite( cache_buffer, byte_count, 1, db->fp_wal ) ) - vg_db_abort( db, "fwrite failed into WAL\n" ); - if( !fwrite( user_buffer, byte_count, 1, db->fp_wal ) ) - vg_db_abort( db, "fwrite failed into WAL\n" ); - - db->previous_wal_log = file_pos; - db->wal_writes ++; - memcpy( cache_buffer, user_buffer, byte_count ); - } - else - memcpy( user_buffer, cache_buffer, byte_count ); - - address += byte_count; - } -} - -u64 vg_db_virtual_allocate( vg_db *db, u64 bytes ) -{ - u64 page_count = 0; - vg_db_read( db, 0x0lu + offsetof(vg_db_header,virtual_pages), &page_count, sizeof(page_count) ); - u64 pages = (bytes + (VG_PAGE_SIZE-1lu)) >> VG_PAGE_BITS, - addr = page_count * VG_PAGE_SIZE; - page_count += pages; - db->unprotect0 ++; - vg_db_write( db,0x0lu + offsetof(vg_db_header,virtual_pages), &page_count, sizeof(page_count) ); - db->unprotect0 --; - return VG_VIRTUAL_ADDRESS_BIT | addr; -} - -/* AA search tree - * ------------------------------------------------------------------------------------------------------------------ */ - -static u64 vg_db_skew( vg_db *db, u64 t_offset ) -{ - if( t_offset == 0 ) - return t_offset; - vg_db_address_node t_node; - vg_db_read( db, t_offset, &t_node, sizeof(t_node) ); - if( t_node.left_offset == 0 ) - return t_offset; - - u64 l_offset = t_node.left_offset; - vg_db_address_node l_node; - vg_db_read( db, l_offset, &l_node, sizeof(l_node) ); - if( l_node.level == t_node.level ) - { - t_node.left_offset = l_node.right_offset; - l_node.right_offset = t_offset; - vg_db_write( db, t_offset, &t_node, sizeof(t_node) ); - vg_db_write( db, l_offset, &l_node, sizeof(l_node) ); - return l_offset; - } - else return t_offset; -} - -static u64 vg_db_split( vg_db *db, u64 t_offset ) -{ - if( t_offset == 0 ) - return t_offset; - vg_db_address_node t_node; - vg_db_read( db, t_offset, &t_node, sizeof(t_node) ); - if( t_node.right_offset == 0 ) - return t_offset; - - u64 r_offset = t_node.right_offset; - vg_db_address_node r_node; - vg_db_read( db, r_offset, &r_node, sizeof(r_node) ); - if( r_node.right_offset == 0 ) - return t_offset; - - u64 rr_node_offset = r_node.right_offset; - vg_db_address_node rr_node; - vg_db_read( db, rr_node_offset, &rr_node, sizeof(rr_node) ); - if( t_node.level == rr_node.level ) - { - t_node.right_offset = r_node.left_offset; - r_node.left_offset = t_offset; - r_node.level ++; - vg_db_write( db, t_offset, &t_node, sizeof(t_node) ); - vg_db_write( db, r_offset, &r_node, sizeof(r_node) ); - return r_offset; - } - else return t_offset; -} - -static u64 vg_db_tree_insert( vg_db *db, u64 t_offset, u64 x_offset, u64 key ) -{ - if( t_offset == 0 ) - return x_offset; - vg_db_address_node t_node; - vg_db_read( db, t_offset, &t_node, sizeof(t_node) ); - if( t_node.key <= key ) - t_node.left_offset = vg_db_tree_insert( db, t_node.left_offset, x_offset, key ); - else - t_node.right_offset= vg_db_tree_insert( db, t_node.right_offset,x_offset, key ); - vg_db_write( db, t_offset, &t_node, sizeof(t_node) ); - t_offset = vg_db_skew( db, t_offset ); - t_offset = vg_db_split( db, t_offset ); - return t_offset; -} - -void vg_db_tree_map( vg_db *db, u64 tree_address, u64 key, u64 value ) -{ - vg_db_address_tree tree; - vg_db_read( db, tree_address, &tree, sizeof(tree) ); - - u64 cluster_offset = (tree.last_node_offset & ~(VG_PAGE_SIZE-1lu)); - vg_db_address_cluster cluster; - vg_db_read( db, cluster_offset, &cluster, sizeof(vg_db_address_cluster) ); - if( cluster.count == VG_ADDRESS_NODES_PER_CLUSTER ) - { - cluster.count = 0; - cluster_offset = vg_db_allocate_physical_page( db ); - } - - u64 new_node_offset = cluster_offset + sizeof(vg_db_address_cluster) + cluster.count*sizeof(vg_db_address_node); - cluster.count ++; - vg_db_write( db, cluster_offset, &cluster, sizeof(vg_db_address_cluster) ); - - vg_db_address_node new_node; - new_node.left_offset = 0; - new_node.right_offset = 0; - new_node.key = key; - new_node.value = value; - new_node.level = 0; - vg_db_write( db, new_node_offset, &new_node, sizeof(new_node) ); - - tree.last_node_offset = new_node_offset; - tree.root_node_offset = vg_db_tree_insert( db, tree.root_node_offset, new_node_offset, key ); - vg_db_write( db, tree_address, &tree, sizeof(tree) ); -} - -u64 vg_db_translate( vg_db *db, u64 tree_address, u64 key ) -{ - vg_db_address_tree tree; - vg_db_read( db, tree_address, &tree, sizeof(tree) ); - - u64 t_offset = tree.root_node_offset; - while( t_offset ) - { - vg_db_address_node t_node; - vg_db_read( db, t_offset, &t_node, sizeof(t_node) ); - - if( t_node.key == key ) - { - return t_node.value; - break; - } - else - { - if( t_node.key <= key ) - t_offset = t_node.left_offset; - else - t_offset = t_node.right_offset; - } - } - return 0; -} - -void vg_db_tree_init( vg_db *db, u64 tree_address ) -{ - vg_db_address_tree tree = {0}; - vg_db_read( db, tree_address, &tree, sizeof(tree) ); - if( tree.last_node_offset == 0 ) - { - tree.root_node_offset = 0; - tree.last_node_offset = vg_db_allocate_physical_page( db ); - vg_db_write( db, tree_address, &tree, sizeof(tree) ); - } -} - -void vg_db_tree_iter_init( vg_db *db, vg_tree_iter *iter, u64 tree_addr ) -{ - iter->depth = 0; - iter->key = 0; - iter->value = 0; - iter->has_next = 0; - - struct vg_db_address_tree tree; - vg_db_read( db, tree_addr, &tree, sizeof(tree) ); - - /* go to far left */ - u64 t_offset = tree.root_node_offset; - while( t_offset ) - { - iter->route[ iter->depth ] = t_offset; - vg_db_address_node *t_node = &iter->route_nodes[ iter->depth ]; - vg_db_read( db, t_offset, t_node, sizeof(vg_db_address_node) ); - t_offset = t_node->left_offset; - iter->depth ++; - iter->has_next = 1; - } -} - -bool vg_db_tree_iter( vg_db *db, vg_tree_iter *iter ) -{ - if( iter->has_next ) - { - vg_db_address_node *t_node = &iter->route_nodes[ iter->depth-1 ]; - iter->key = t_node->key; - iter->value = t_node->value; - - /* right once, then left all way */ - if( t_node->right_offset ) - { - u64 t_offset = t_node->right_offset; - while( t_offset ) - { - iter->route[ iter->depth ] = t_offset; - vg_db_address_node *t_node = &iter->route_nodes[ iter->depth ]; - vg_db_read( db, t_offset, t_node, sizeof(vg_db_address_node) ); - t_offset = t_node->left_offset; - iter->depth ++; - } - } - else - { - u64 t_offset = iter->route[ iter->depth-1 ]; - while(1) - { - iter->depth --; - if( iter->depth == 0 ) - { - iter->has_next = 0; - break; - } - - if( iter->route_nodes[ iter->depth-1 ].left_offset == t_offset ) - break; - else - t_offset = iter->route[ iter->depth-1 ]; - } - } - - return 1; - } - else return 0; -} - -/* Randomized skiplist - * ------------------------------------------------------------------------------------------------------------------ */ - -void vg_db_skipper_init( vg_db *db, u64 skipper_address, u32 max_entries ) -{ - vg_db_skipper skipper; - vg_db_read( db, skipper_address, &skipper, sizeof(skipper) ); - if( skipper.skips_array_address == 0 ) - { - skipper.skips_array_address = vg_db_virtual_allocate( db, sizeof(vg_db_skip)*max_entries ); - skipper.sentry.height = 7; - for( u32 i=0; i<7; i ++ ) - skipper.sentry.links[i] = 0xffff; - vg_db_write( db, skipper_address, &skipper, sizeof(skipper) ); - } -} - -bool vg_db_skipper_find( vg_db *db, vg_skipper_context *ctx, u16 *out_index, void *comparand ) -{ - vg_db_skipper skipper; - vg_db_read( db, ctx->address, &skipper, sizeof(skipper) ); - - i32 level = skipper.sentry.height-1; - while( level>=0 ) - { - u16 next = skipper.sentry.links[level]; - if( next != 0xffff ) - { - i32 cmp = ctx->fn_compare( ctx, comparand, next ); - if( cmp == 0 ) - { - *out_index = next; - return 1; - } - else if( cmp > 0 ) - level --; - else - { - u64 skip_addr = skipper.skips_array_address + (u64)next*sizeof(vg_db_skip); - vg_db_read( db, skip_addr, &skipper.sentry, sizeof(vg_db_skip) ); - } - } - else level --; - } - return 0; -} - -void vg_db_skipper_placement( vg_db *db, vg_skipper_context *ctx, u16 item_index, void *comparand ) -{ - vg_db_skipper skipper; - vg_db_read( db, ctx->address, &skipper, sizeof(skipper) ); - - u16 path[7]; - i32 level = skipper.sentry.height-1; - u16 current_index = 0xffff; - - while( level>=0 ) - { - path[level] = current_index; - u16 next = skipper.sentry.links[level]; - if( next == 0xffff ) - level --; - else - { - i32 cmp = ctx->fn_compare( ctx, comparand, next ); - if( cmp >= 0 ) - level --; - else - { - current_index = next; - u64 skip_addr = skipper.skips_array_address + (u64)current_index*sizeof(vg_db_skip); - vg_db_read( db, skip_addr, &skipper.sentry, sizeof(vg_db_skip) ); - } - } - } - - vg_db_skip skip={0}; - skip.height = 1; - while( (skip.height < 7) && (vg_randu32( &db->rand ) & 0x1) ) - skip.height ++; - for( u32 i=0; i<7; i ++ ) - skip.links[i] = 0xffff; - for( i32 i=skip.height-1; i>=0; -- i ) - { - u64 prev_addr; - if( path[i] == 0xffff ) prev_addr = ctx->address+offsetof(vg_db_skipper,sentry); - else prev_addr = skipper.skips_array_address + (u64)path[i]*sizeof(vg_db_skip); - vg_db_skip prev; - vg_db_read( db, prev_addr, &prev, sizeof(prev) ); - skip.links[i] = prev.links[i]; - prev.links[i] = item_index; - vg_db_write( db, prev_addr, &prev, sizeof(prev) ); - } - u64 our_addr = skipper.skips_array_address + (u64)item_index*sizeof(vg_db_skip); - vg_db_write( db, our_addr, &skip, sizeof(skip) ); -} - -void vg_db_skipper_unplace( vg_db *db, vg_skipper_context *ctx, u16 item_index, void *comparand ) -{ - vg_db_skipper skipper; - vg_db_read( db, ctx->address, &skipper, sizeof(skipper) ); - - u16 path[7]; - i32 level = skipper.sentry.height-1; - u16 current_index = 0xffff; - - while( level>=0 ) - { - path[level] = current_index; - u16 next = skipper.sentry.links[level]; - if( (next == 0xffff) || (next == item_index) ) - level --; - else - { - i32 cmp = ctx->fn_compare( ctx, comparand, next ); - if( cmp > 0 ) - level --; - else - { - current_index = next; - u64 skip_addr = skipper.skips_array_address + (u64)current_index*sizeof(vg_db_skip); - vg_db_read( db, skip_addr, &skipper.sentry, sizeof(vg_db_skip) ); - } - } - } - - u64 our_addr = skipper.skips_array_address + (u64)item_index*sizeof(vg_db_skip); - vg_db_skip skip; - vg_db_read( db, our_addr, &skip, sizeof(vg_db_skip) ); - for( u32 i=0; iaddress+offsetof(vg_db_skipper,sentry); - else prev_addr = skipper.skips_array_address + (u64)path[i]*sizeof(vg_db_skip); - vg_db_skip prev; - vg_db_read( db, prev_addr, &prev, sizeof(prev) ); - prev.links[i] = skip.links[i]; - vg_db_write( db, prev_addr, &prev, sizeof(prev) ); - } -} - -void vg_db_skipper_iter_start( vg_db *db, vg_skipper_context *ctx ) -{ - vg_db_skipper skipper; - vg_db_read( db, ctx->address, &skipper, sizeof(skipper) ); - ctx->iter_array_address = skipper.skips_array_address; - ctx->iter_index = skipper.sentry.links[0]; -} - -bool vg_db_skipper_iter( vg_db *db, vg_skipper_context *ctx, u16 *out_index ) -{ - u16 return_index = ctx->iter_index; - if( ctx->iter_index == 0xffff ) - return 0; - else - { - vg_db_skip skip; - u64 skip_addr = ctx->iter_array_address + (u64)ctx->iter_index*sizeof(vg_db_skip); - vg_db_read( db, skip_addr, &skip, sizeof(skip) ); - ctx->iter_index = skip.links[0]; - *out_index = return_index; - return 1; - } -} - -/* Dumb table - * ------------------------------------------------------------------------------------------------------------------ */ - -void vg_db_table_init( vg_db *db, u64 table_address, u32 structure_size, u32 max_entries ) -{ - vg_db_table table; - vg_db_read( db, table_address, &table, sizeof(table) ); - if( table.array_address == 0 ) - { - table.array_address = vg_db_virtual_allocate( db, structure_size*max_entries ); - table.max_entries = max_entries; - table.structure_size = structure_size; - vg_db_write( db, table_address, &table, sizeof(table) ); - } -} - -u16 vg_db_table_count( vg_db *db, u64 table_address ) -{ - u16 count; - vg_db_read( db, table_address + offsetof(vg_db_table,current_entries), &count, sizeof(count) ); - return count; -} - -u64 vg_db_table_get( vg_db *db, u64 table_address, u16 index ) -{ - vg_db_table table; - vg_db_read( db, table_address, &table, sizeof(table) ); - return table.array_address + (u64)index * (u64)table.structure_size; -} - -u64 vg_db_table_append( vg_db *db, u64 table_address ) -{ - vg_db_table table; - vg_db_read( db, table_address, &table, sizeof(table) ); - if( table.current_entries < table.max_entries ) - { - u64 address = table.array_address + (u64)table.current_entries * (u64)table.structure_size; - table.current_entries ++; - vg_db_write( db, table_address, &table, sizeof(table) ); - return address; - } - else return 0; -} diff --git a/vg_db.h b/vg_db.h deleted file mode 100644 index d4a9ab7..0000000 --- a/vg_db.h +++ /dev/null @@ -1,159 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_db.c" -#else - -#define VG_PAGE_BITS 11 -#define VG_PAGE_SIZE (0x1lu<stereo - */ -int -stb_vorbis_get_samples_float_interleaved_stereo( stb_vorbis *f, float *buffer, - int len ) -{ - int n = 0, c = 1; - if( f->channels < 2 ) c = 0; - - while( n < len ) { - int k = f->channel_buffer_end - f->channel_buffer_start; - - if( n+k >= len ) - k = len - n; - - for( int j=0; j < k; ++j ) { - *buffer++ = f->channel_buffers[ 0 ][f->channel_buffer_start+j]; - *buffer++ = f->channel_buffers[ c ][f->channel_buffer_start+j]; - } - - n += k; - f->channel_buffer_start += k; - - if( n == len ) - break; - - if( !stb_vorbis_get_frame_float( f, NULL, NULL )) - break; - } - - return n; -} - -/* - * ........ more wrecked code sorry! - */ -int -stb_vorbis_get_samples_i16_downmixed( stb_vorbis *f, i16 *buffer, int len ) -{ - int n = 0, c = 1; - if( f->channels < 2 ) c = 0; - - while( n < len ) { - int k = f->channel_buffer_end - f->channel_buffer_start; - - if( n+k >= len ) - k = len - n; - - for( int j=0; j < k; ++j ) { - float sl = f->channel_buffers[ 0 ][f->channel_buffer_start+j], - sr = f->channel_buffers[ c ][f->channel_buffer_start+j]; - - *buffer++ = vg_clampf( 0.5f*(sl+sr), -1.0f, 1.0f ) * 32767.0f; - //*buffer++ = vg_clampf( sr, -1.0f, 1.0f ) * 32767.0f; - } - - n += k; - f->channel_buffer_start += k; - - if( n == len ) - break; - - if( !stb_vorbis_get_frame_float( f, NULL, NULL )) - break; - } - - return n; -} diff --git a/vg_engine.c b/vg_engine.c deleted file mode 100644 index a04efc6..0000000 --- a/vg_engine.c +++ /dev/null @@ -1,559 +0,0 @@ -struct vg_engine vg = -{ - .time_rate = 1.0, - .time_fixed_delta = VG_TIMESTEP_FIXED, - - .thread_tasks = { [0] = { .buffer_size = VG_MB(20) }, - [1] = { .buffer_size = VG_MB(20) } }, - .exit_tasks = { .buffer_size = VG_KB(16) }, - - .thread_contexts = - { - [0] = { .log_prefix = KMAG "1" }, - [1] = { .log_prefix = KCYN "2" }, - [2] = { .log_prefix = KGRN "3" } - } -}; - -VG_API bool _vg_thread_has_flags( u32 flags ) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - if( context ) - return (context->flags & flags) == flags; - else - return 0; -} - -VG_API void _vg_thread_set_flags( u32 flags ) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - VG_ASSERT( context ); - context->flags |= flags; -} - -VG_API const c8 *_vg_thread_prefix(void) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - if( context ) - return context->log_prefix; - else - return "?"; -} - -VG_API void _vg_terminate(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_MAIN ) ); - vg_low( "vg: exiting\n" ); - - /* Shutdown */ - vg_magi_save(); - vg_async_queue_end( &vg.exit_tasks, k_async_quit_when_empty ); - while( vg_async_process_next_task( &vg.exit_tasks ) ) {} - _vg_steam_shutdown(); - _vg_window_shutdown(); - SDL_Quit(); - exit(0); -} - -static int _vg_async_thread( void *pfn ) -{ - SDL_TLSSet( vg.thread_tls, &vg.thread_contexts[1], NULL ); - _vg_thread_set_flags( VG_THREAD_ASYNC ); - while( vg_async_process_next_task( &vg.thread_tasks[1] ) ) {} - return 0; -} - -VG_API u32 _vg_start_temp_frame(void) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - VG_ASSERT( context->temp_stack_depth < VG_TEMP_STACK_MAX ); - u32 offset = context->temporary_memory.offset; - context->temp_offsets[ context->temp_stack_depth ++ ] = offset; - return offset; -} - -VG_API void _vg_end_temp_frame( u32 whence ) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - VG_ASSERT( context->temp_stack_depth ); - context->temp_stack_depth --; - VG_ASSERT( context->temp_offsets[ context->temp_stack_depth ] == whence ); - context->temporary_memory.offset = whence; -} - -VG_API vg_stack_allocator *_vg_temp_stack(void) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - return &context->temporary_memory; -} - -/* group control */ -VG_API void _vg_async_context_push_groups( u16 groups, bool exclusive ) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - - context->async_group_depth ++; - VG_ASSERT( context->async_group_depth < VG_TEMP_STACK_MAX ); - - if( !exclusive ) - groups |= context->async_groups[ context->async_group_depth-1 ]; - - context->async_groups[ context->async_group_depth ] = groups; -} - -VG_API void _vg_async_context_pop_groups(void) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - - VG_ASSERT( context->async_group_depth ); - context->async_group_depth --; -} - -VG_API u16 _vg_async_context_get_groups(void) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - return context->async_groups[ context->async_group_depth ]; -} - -VG_API void *_vg_async_alloc ( u32 thread_id_target, u32 bytes ) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - VG_ASSERT( context->async_task == NULL ); - VG_ASSERT( context->async_task_queue == NULL ); - VG_ASSERT( (thread_id_target==0) || (thread_id_target==1) ); - if( thread_id_target==1 ) { VG_ASSERT( !_vg_thread_has_flags( VG_THREAD_BACKGROUND ) ); } - else { VG_ASSERT( _vg_thread_has_flags( VG_THREAD_BACKGROUND ) ); } - - context->async_task_queue = &vg.thread_tasks[ thread_id_target ]; - context->async_task = vg_create_task( context->async_task_queue, bytes, VG_ASYNC_BLOCKING, "engine (No info)" ); - return vg_task_buffer( context->async_task_queue, context->async_task ); -} - -VG_API void _vg_async_send( void *check_buffer, vg_async_fn fn ) -{ - struct vg_thread_context *context = SDL_TLSGet( vg.thread_tls ); - VG_ASSERT( context->async_task && context->async_task_queue ); - VG_ASSERT( vg_task_buffer( context->async_task_queue, context->async_task ) == check_buffer ); - vg_task_send( context->async_task_queue, context->async_task, fn ); - context->async_task = NULL; - context->async_task_queue = NULL; -} - -struct exit_task -{ - void (*fn)(void); -}; -static void vg_call_exit( struct exit_task *in_args, vg_async_info *async ) -{ - in_args->fn(); -} - -VG_API void _vg_add_exit_function( void( *fn )( void ) ) -{ - _vg_async_context_push_groups( 0, 1 ); - vg_async_task *task = vg_create_task( &vg.exit_tasks, sizeof(struct exit_task), VG_ASYNC_CRIT, "engine exit (No info)" ); - struct exit_task *out_args = vg_task_buffer( &vg.exit_tasks, task ); - out_args->fn = fn; - vg_task_send( &vg.exit_tasks, task, (vg_async_fn)vg_call_exit ); - _vg_async_context_pop_groups(); -} - -#ifdef _WIN32 -#include -#include -#endif - -#include -static void sync_signal_handler( int signum ) -{ - // We want signals to be caught by debuggers if we're just in the testing builds. -#if defined( VG_RELEASE_MODE ) - if( signum == SIGSEGV ) vg_fatal_exit( "SIGSEGV" ); -# if !defined( _WIN32 ) - if( signum == SIGBUS ) vg_fatal_exit( "SIGBUS" ); -# endif - if( signum == SIGFPE ) vg_fatal_exit( "SIGFPE" ); - if( signum == SIGILL ) vg_fatal_exit( "SIGILL" ); - vg_fatal_exit( "UNKNOWN SIGNAL" ); -#endif -} - -static int cmd_die( int argc, const char *argv[] ) -{ - if( argc ) - { - if( !strcmp( argv[0], "segv" ) ) - { - vg_info( "Trying to make a segfault\n" ); - u32 *nothing = (void *)3; - vg_info( "Uhm %u\n", *nothing ); - } - } - else - vg_fatal_error( "VG FATAL ASSERT ERROR" ); - return 0; -} - -static void _vg_engine_register(void) -{ - vg_console_reg_var( "vg_fps_limit", &vg.fps_limit, k_var_dtype_i32, VG_VAR_PERSISTENT ); - vg_console_reg_var( "vg_quality", &vg.quality_profile, k_var_dtype_i32, VG_VAR_PERSISTENT ); - vg_console_reg_cmd( "die", cmd_die, NULL ); -} - -static void _vg_engine_init(void) -{ - vg_info(" Copyright . . . -----, ,----- ,---. .---. \n" ); - vg_info(" 2021-2025 |\\ /| | / | | | | /| \n" ); - vg_info(" | \\ / | +-- / +----- +---' | / | \n" ); - vg_info(" | \\ / | | / | | \\ | / | \n" ); - vg_info(" | \\/ | | / | | \\ | / | \n" ); - vg_info(" ' ' '--' [] '----- '----- ' ' '---' " - "SOFTWARE\n" ); - - /* init SDL */ - vg_info( "SDL_INIT_VIDEO\n" ); - if( SDL_Init( SDL_INIT_VIDEO ) != 0 ) - { - vg_error( "SDL_Init failed: %s\n", SDL_GetError() ); - exit(0); - } - -#ifndef VG_NO_AUDIO - vg_info( "SDL_INIT_AUDIO\n" ); - SDL_InitSubSystem( SDL_INIT_AUDIO ); -#endif - vg_info( "SDL_INIT_GAMECONTROLLER\n" ); - SDL_InitSubSystem( SDL_INIT_GAMECONTROLLER ); - vg.base_path = SDL_GetBasePath(); - - if( !vg_init_async_queue( &vg.thread_tasks[0] ) ) - vg_fatal_error( "Failed to create main task queue\n" ); - if( !vg_init_async_queue( &vg.thread_tasks[1] ) ) - vg_fatal_error( "Failed to create async task queue\n" ); - if( !vg_init_async_queue( &vg.exit_tasks ) ) - vg_fatal_error( "Failed to create exit task queue\n" ); - - for( u32 i=0; i<3; i ++ ) - vg_stack_init( &vg.thread_contexts[i].temporary_memory, NULL, VG_MB(20), "Temporary memory stack" ); - - SDL_CreateThread( _vg_async_thread, "vg: async", NULL ); - vg.profiler = _vg_profiler_create( "vg.core", 1000.0f/60.0f ); - vg_rand_seed( &vg.rand, 461 ); -} - -VG_API void vg_run( int argc, const char *argv[], vg_event_callback callback_fn ) -{ - /* Pre-init - * -------------------------------------------------------- */ - vg.thread_tls = SDL_TLSCreate(); - SDL_TLSSet( vg.thread_tls, &vg.thread_contexts[0], NULL ); - _vg_thread_set_flags( VG_THREAD_MAIN ); - _vg_log_pre_init(); - - /* launch options - * --------------------------------------------------------------------------------------------------- */ - _vg_opt_init( argc, argv ); - const char *arg; - if( vg_long_opt( "high-performance", "Turn graphics to lowest quality" ) ) - vg.quality_profile = k_quality_profile_low; - - if( (arg = vg_long_opt_arg( "load-step-delay", "Loader step delay (ms)" )) ) - vg.load_step_delay = atoi(arg); - - if( (arg = vg_long_opt_arg( "log", "Log output to text file (without console colours)" )) ) - { - vg_log.plain_output_file = fopen( arg, "w" ); - if( !vg_log.plain_output_file ) - vg_error( "Could not open '%s' for logging.\n", arg ); - } - - if( vg_long_opt( "no-steam", "Disable Steam integration (Good idea for pirating)" ) ) - _steam_api.disabled = 1; - - callback_fn( (vg_event_info[]){{ .type = k_vg_event_opts }} ); - - if( !_vg_opt_check() ) - { - callback_fn( (vg_event_info[]){{ .type = k_vg_event_invalid_options }} ); - exit(0); - } - - /* Crash watcher - * --------------------------------------------------------------------------------------------------- */ -#ifdef _WIN32 - DWORD pid = GetCurrentProcessId(); - - char report_args_buf[ 512 ]; - vg_str report_args; - vg_strnull( &report_args, report_args_buf, sizeof(report_args_buf) ); - vg_strcat( &report_args, "vgcrashreport.exe " ); - vg_strcatu64( &report_args, pid, 16 ); - vg_strcat( &report_args, " " ); - vg_strcat( &report_args, vg_log.crash_path ); - - STARTUPINFO si={0}; - PROCESS_INFORMATION pi={0}; - si.cb = sizeof(si); - - if( CreateProcess( NULL, report_args_buf, NULL, NULL, 0, BELOW_NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi ) == 0 ) - vg_error( "Could not start crash reporter. Reason: %d\n", GetLastError() ); - else - vg_success( "Crash watcher started!\n" ); -#endif - - // We want signals to be caught by debuggers if we're just in the testing builds. -#if defined( VG_RELEASE_MODE ) - signal( SIGSEGV, sync_signal_handler ); -# if !defined( _WIN32 ) - signal( SIGBUS, sync_signal_handler ); -# endif - signal( SIGFPE, sync_signal_handler ); - signal( SIGILL, sync_signal_handler ); -#endif - - /* Registration step - * ----------------------------------------------- */ - _vg_console_register(); - _vg_magi_register(); - _vg_settings_register(); - _vg_engine_register(); - _vg_rigidbody_register(); - _vg_audio_register(); - _vg_framebuffer_register(); - _vg_render_register(); - _vg_input_register(); - _vg_lines_register(); - _vg_profiler_register(); - _vg_mem_view_register(); - _vg_shaders_register(); - callback_fn( (vg_event_info[]){{ .type = k_vg_event_register }} ); - - /* Init step - * ---------------------------------------------------- */ - _vg_async_init(); - _vg_profiler_init(); - _vg_engine_init(); - _vg_console_init(); - _vg_window_init(); - _vg_shaders_init(); - _vg_ui_init(); - _vg_loader_init(); - _vg_tex_init(); - _vg_render_init(); - _vg_input_init(); - _vg_lines_init(); - _vg_rb_view_init(); -#if !defined( VG_NO_AUDIO ) - _vg_audio_init(); -#endif - _vg_steam_init(); - callback_fn( (vg_event_info[]){{ .type = k_vg_event_init }} ); - - vg_magi_restore(); - - /* Frame pre-filter & timing - * -------------------------------------------- */ -L_new_frame: - _vg_profiler_tick( vg.profiler ); - - vg.time_frame_delta = 0.0; - vg.time_spinning = 0; - -L_filter_frame: - vg.time_hp = SDL_GetPerformanceCounter(); - u64 dt_hp = vg.time_hp - vg.time_hp_last; - vg.time_hp_last = vg.time_hp; - - f64 dt = (f64)dt_hp / (f64)SDL_GetPerformanceFrequency(); - vg.time_frame_delta += dt; - - /* TODO: limit time we can spend here */ - while( vg_async_has_work( &vg.thread_tasks[0] ) ) - { - if( vg_async_process_next_task( &vg.thread_tasks[0] ) == 0 ) - _vg_terminate(); - } - - if( vg.fps_limit == 0 ) - vg.fps_limit = _vg_window.monitor_refresh_rate; - if( vg.fps_limit < 24 ) - vg.fps_limit = 24; - if( vg.fps_limit > 300 ) - vg.fps_limit = 300; - - f64 min_frametime = 1.0/(f64)vg.fps_limit, - max_frametime = 1.0/(f64)24.0; - - if( vg.time_frame_delta < min_frametime ) - { - /* TODO: we can use high res nanosleep on Linux here */ - f64 sleep_ms = (min_frametime-vg.time_frame_delta) * 1000.0; - u32 ms = (u32)floor( sleep_ms ); - if( ms ) - SDL_Delay(ms); - else - vg.time_spinning ++; - goto L_filter_frame; - } - - if( vg.time_frame_delta > max_frametime ) - vg.time_frame_delta = max_frametime; - - /* New fame starts here - * --------------------------------------------------------------------------------------------------------------- */ - - vg.time_real += vg.time_frame_delta; - vg.time_delta = vg.time_frame_delta * vg.time_rate; - vg.time += vg.time_delta; - - /* SDL event loop */ - v2_zero( vg.mouse_wheel ); - v2_zero( vg.mouse_delta ); - SDL_Event event; - while( SDL_PollEvent( &event ) ) - { - if( event.type == SDL_KEYDOWN ) - { - if( vg_console.enabled && (vg_ui.ctx.focused_control_type != k_ui_control_modal) ) - { - if( (event.key.keysym.sym == SDLK_ESCAPE) || (event.key.keysym.scancode == SDL_SCANCODE_GRAVE) ) - { - vg_console.enabled = 0; - ui_defocus_all( &vg_ui.ctx ); - } - else if( (event.key.keysym.mod & KMOD_CTRL) && (event.key.keysym.sym == SDLK_n) ) - console_suggest_next( &vg_ui.ctx ); - else if( (event.key.keysym.mod & KMOD_CTRL ) && (event.key.keysym.sym == SDLK_p) ) - console_suggest_prev( &vg_ui.ctx ); - else - vg_ui_handle_sdl_key( &vg_ui.ctx, event.key.keysym ); - } - else - { - if( event.key.keysym.scancode == SDL_SCANCODE_GRAVE ) - { - vg_console.auto_focus = 1; - vg_console.enabled = 1; - } - else - vg_ui_handle_sdl_key( &vg_ui.ctx, event.key.keysym ); - } - } - else if( event.type == SDL_MOUSEWHEEL ) - { - vg.mouse_wheel[0] += event.wheel.preciseX; - vg.mouse_wheel[1] += event.wheel.preciseY; - } - else if( (event.type == SDL_CONTROLLERDEVICEADDED) || (event.type == SDL_CONTROLLERDEVICEREMOVED) ) - vg_input_device_event( &event ); - else if( event.type == SDL_CONTROLLERAXISMOTION || - event.type == SDL_CONTROLLERBUTTONDOWN || - event.type == SDL_CONTROLLERBUTTONUP ) - { - vg_input_controller_event( &event ); - } - else if( event.type == SDL_MOUSEMOTION ) - { - vg.mouse_delta[0] += event.motion.xrel; - vg.mouse_delta[1] += event.motion.yrel; - } - else if( event.type == SDL_WINDOWEVENT ) - { - if( event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED ) - { - _vg_window_size_changed(); - callback_fn( (vg_event_info[]){{ .type = k_vg_event_framebuffer_resize, - .framebuffer = { .w = _vg_window.w, .h = _vg_window.h } }} ); - } - else if( event.window.event == SDL_WINDOWEVENT_CLOSE ) - _vg_terminate(); - } - else if( event.type == SDL_TEXTINPUT ) - ui_proc_utf8( &vg_ui.ctx, event.text.text ); - } - vg.mouse_state = SDL_GetMouseState( &vg.mouse_pos[0], &vg.mouse_pos[1] ); - _vg_window_swap(); - - vg_audio_preupdate(); - vg_process_inputs(); - vg_steam_frame(); - - /* Update loop - * ----------------------------------------------------------------------------------------------------------- */ - { - _vg_profiler_enter_block( vg.profiler, "update" ); - vg.gameloop_stage = k_gameloop_update; - callback_fn( (vg_event_info[]){{ .type = k_vg_event_pre_update }} ); - - /* Fixed update loop */ - vg.gameloop_stage = k_gameloop_update_fixed; - vg.fixed_iterations = 0; - vg_lines.enabled = vg_lines.render; - vg.time_fixed_accumulator += vg.time_delta; - - while( vg.time_fixed_accumulator >= vg.time_fixed_delta ) - { - callback_fn( (vg_event_info[]){{ .type = k_vg_event_fixed_update }} ); - vg_lines.enabled = 0; - vg.time_fixed_accumulator -= vg.time_fixed_delta; - - vg.fixed_iterations ++; - if( vg.fixed_iterations == 8 ) - break; - } - vg_lines.enabled = vg_lines.render; - vg.time_fixed_extrapolate = vg.time_fixed_accumulator / vg.time_fixed_delta; - - vg.gameloop_stage = k_gameloop_update; - callback_fn( (vg_event_info[]){{ .type = k_vg_event_post_update }} ); - _vg_profiler_exit_block( vg.profiler ); - } - - if( vg_loader.loading_count == 0 ) - { - /* Render loop - * ------------------------------------------------------------------------------------------------------------ */ - _vg_profiler_enter_block( vg.profiler, "render" ); - vg.gameloop_stage = k_gameloop_rendering; - callback_fn( (vg_event_info[]){{ .type = k_vg_event_render }} ); - _vg_profiler_exit_block( vg.profiler ); - - /* ui --------------------------------------------------- */ - vg.gameloop_stage = k_gameloop_ui; - - ui_prerender( &vg_ui.ctx ); - vg_ui_set_screen( _vg_window.w, _vg_window.h ); - ui_update_mouse( &vg_ui.ctx, (ui_px[2]){ vg.mouse_pos[0], vg.mouse_pos[1] }, vg.mouse_state ); - - if( vg_console.enabled ) - ui_ignore_input_frames( &vg_ui.ctx, 10 ); - callback_fn( (vg_event_info[]){{ .type = k_vg_event_gui, .gui = { .ctx = &vg_ui.ctx } }} ); - if( vg_console.enabled ) - { - ui_ignore_input_frames( &vg_ui.ctx, 0 ); - ui_capture_mouse( &vg_ui.ctx, 1 ); - vg_console_draw( &vg_ui.ctx ); - } - - _vg_settings_gui( &vg_ui.ctx ); - vg_framebuffer_ui( &vg_ui.ctx ); - _vg_magi_render( &vg_ui.ctx ); - ui_postrender( &vg_ui.ctx, vg.time_frame_delta ); - vg_ui_post_update(); - } - else - vg_loader_render(); - - if( vg.loader_ring > 0.01f ) - { - vg_loader_render_ring( vg.loader_ring ); - vg.loader_ring -= vg.time_frame_delta * 0.5f; - } - - vg_audio_lock(); - vg_audio_sync_ui_master_controls(); - vg_audio_unlock(); - - goto L_new_frame; -} diff --git a/vg_engine.h b/vg_engine.h deleted file mode 100644 index d7df2ea..0000000 --- a/vg_engine.h +++ /dev/null @@ -1,187 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_engine.c" -#else - -/* configuration warnings */ -#if !defined( VG_TIMESTEP_FIXED ) - #warning VG_TIMESTEP_FIXED not defined; setting to 1/60 - #define VG_TIMESTEP_FIXED (1.0/60.0) -#endif - -#if !defined( VG_3D ) - #if !defined( VG_2D ) - #warning VG_3D or VG_2D not defined; defining VG_3D - #define VG_3D - #endif -#endif - -enum vg_event -{ - k_vg_event_opts, - k_vg_event_register, - k_vg_event_init, - k_vg_event_pre_update, - k_vg_event_fixed_update, - k_vg_event_post_update, - k_vg_event_render, - k_vg_event_gui, - k_vg_event_framebuffer_resize, - k_vg_event_invalid_options -}; - -typedef struct vg_event_info vg_event_info; -struct vg_event_info -{ - enum vg_event type; - union - { - struct - { - ui_context *ctx; - } - gui; - - struct - { - i32 w, h; - } - framebuffer; - }; -}; - -typedef void (*vg_event_callback)( vg_event_info *info ); - -/* API */ -VG_API void vg_run( int argc, const char *argv[], vg_event_callback fn ); - -/* Main thread */ -enum quality_profile -{ - k_quality_profile_high = 0, - k_quality_profile_low = 1, - k_quality_profile_min = 2 -}; - -#define VG_THREAD_OWNS_SDL 0x1 -#define VG_THREAD_OWNS_OPENGL 0x2 -#define VG_THREAD_OWNS_STEAM 0x4 -#define VG_THREAD_BACKGROUND 0x100 -#define VG_THREAD_MAIN (VG_THREAD_OWNS_SDL|VG_THREAD_OWNS_OPENGL|VG_THREAD_OWNS_STEAM) -#define VG_THREAD_ASYNC (VG_THREAD_BACKGROUND) -#define VG_THREAD_MAIN_ID 0 -#define VG_THREAD_ASYNC_ID 1 -#define VG_TEMP_STACK_MAX 8 - -VG_API bool _vg_thread_has_flags( u32 flags ); -VG_API void _vg_thread_set_flags( u32 flags ); -VG_API const c8 *_vg_thread_prefix(void); - -VG_API void _vg_async_context_push_groups( u16 groups, bool exclusive ); -VG_API void _vg_async_context_pop_groups(void); -VG_API u16 _vg_async_context_get_groups(void); - -VG_API void *_vg_async_alloc( u32 thread_id_target, u32 bytes ); -VG_API void _vg_async_send ( void *check_buffer, vg_async_fn fn ); -VG_API void _vg_add_exit_function( void( *fn )( void ) ); - -VG_API u32 _vg_start_temp_frame(void); -VG_API void _vg_end_temp_frame( u32 whence ); -VG_API vg_stack_allocator *_vg_temp_stack(void); - -VG_API void _vg_terminate(void); - -struct vg_engine -{ - /* Engine sync */ - SDL_TLSID thread_tls; - - struct vg_thread_context - { - u32 flags; - vg_stack_allocator temporary_memory; - - u32 temp_stack_depth, - temp_offsets[ VG_TEMP_STACK_MAX ]; - - u16 async_groups[ VG_TEMP_STACK_MAX ]; - u32 async_group_depth; - - vg_async_task *async_task; - vg_async_queue *async_task_queue; - const c8 *log_prefix; - } - thread_contexts[3]; - - vg_async_queue thread_tasks[2], exit_tasks; - const c8 *base_path; - - i32 mouse_pos[2], mouse_state; - v2f mouse_delta, - mouse_wheel; - - /* Runtime */ - f64 time, - time_real, - time_delta, - time_rate, - time_fixed_accumulator, - time_fixed_extrapolate, - time_frame_delta; - f32 time_fixed_delta; - u64 time_hp, time_hp_last, time_spinning; - - int fixed_iterations; - - enum vg_gameloop_stage - { - k_gameloop_update, - k_gameloop_update_fixed, - k_gameloop_rendering, - k_gameloop_ui - } - gameloop_stage; - - /* graphics */ -#if defined( VG_3D ) - m4x4f pv; -#else - m3x3f pv; -#endif - - i32 quality_profile; - - f32 loader_ring; - GLuint tex_missing; - vg_rand rand; - i32 load_step_delay; - - i32 fps_limit; - u32 profiler; -} -extern vg; - -struct vg_setting_enum -{ - i32 new_value, *actual_value; - - struct ui_enum_opt *options; - u32 option_count; - const char *label; -}; - -struct vg_setting_ranged_i32 -{ - i32 new_value, *actual_value, min, max; - char buf[10]; - const char *label; -}; - -void ui_settings_ranged_i32_init( struct vg_setting_ranged_i32 *prop ); -void ui_settings_enum_init( struct vg_setting_enum *prop ); -bool vg_settings_enum_diff( struct vg_setting_enum *prop ); -bool vg_settings_enum( ui_context *ctx, struct vg_setting_enum *prop, ui_rect rect ); -void vg_settings_ui_header( ui_context *ctx, ui_rect inout_panel, const char *name ); -bool vg_settings_apply_button( ui_context *ctx, ui_rect inout_panel, bool validated ); -enum engine_status _vg_engine_status(void); - -#endif diff --git a/vg_font.h b/vg_font.h deleted file mode 100644 index 4406418..0000000 --- a/vg_font.h +++ /dev/null @@ -1,23 +0,0 @@ -#if !defined( VG_IMPLEMENTATION ) -typedef struct vg_font_char vg_font_char; -typedef struct vg_font_face vg_font_face; -typedef struct vg_font_sheet vg_font_sheet; - -struct vg_font_char -{ - i16 x, y; -}; - -struct vg_font_face -{ - const char *name; - i16 cw, ch, sx, sy, baseline; - vg_font_char map[256]; -}; - -struct vg_font_sheet -{ - i16 w, h; - u32 bitmap[]; -}; -#endif diff --git a/vg_framebuffer.c b/vg_framebuffer.c deleted file mode 100644 index ceab2c5..0000000 --- a/vg_framebuffer.c +++ /dev/null @@ -1,541 +0,0 @@ -struct -{ - vg_framebuffer *list[16]; - u32 count; -} -static _vg_framebuffer; - -VG_API vg_framebuffer *_vg_framebuffer_alloc( vg_stack_allocator *stack, u32 attachment_count, bool track ) -{ - u32 size = sizeof(vg_framebuffer) + sizeof(vg_framebuffer_attachment)*attachment_count; - vg_framebuffer *fb = vg_stack_allocate( stack, size, 8, "Framebuffer metadata" ); - vg_zero_mem( fb, size ); - - fb->attachment_count = attachment_count; - if( track ) - { - if( _vg_framebuffer.count != VG_ARRAY_LEN(_vg_framebuffer.list) ) - _vg_framebuffer.list[ _vg_framebuffer.count ++ ] = fb; - else - vg_fatal_error( "Framebuffer list is full, and tried to allocate another.\n"); - } - return fb; -} - -VG_API void vg_framebuffer_get_res( vg_framebuffer *fb, int *x, int *y ) -{ - if( fb->resolution_div ) - { - *x = _vg_window.w / fb->resolution_div; - *y = _vg_window.h / fb->resolution_div; - } - else - { - *x = fb->fixed_w; - *y = fb->fixed_h; - } -} - -VG_API void vg_framebuffer_inverse_ratio( vg_framebuffer *fb, v2f inverse ) -{ - if( fb ) - { - int x, y; - vg_framebuffer_get_res( fb, &x, &y ); - - v2f render = { fb->render_w, fb->render_h }, - original = { x, y }; - - v2_div( render, original, inverse ); - } - else - { - v2_div( (v2f){1.0f,1.0f}, (v2f){ _vg_window.w, _vg_window.h }, inverse ); - } -} - -VG_API void vg_framebuffer_bind( vg_framebuffer *fb, f32 scaling ) -{ - int x, y; - vg_framebuffer_get_res( fb, &x, &y ); - - if( scaling != 1.0f ) - { - x = scaling*(float)x; - y = scaling*(float)y; - - x = VG_MAX( 16, x ); - y = VG_MAX( 16, y ); - - fb->render_w = x; - fb->render_h = y; - } - else - { - fb->render_w = x; - fb->render_h = y; - } - - glBindFramebuffer( GL_FRAMEBUFFER, fb->id ); - glViewport( 0, 0, x, y ); -} - -VG_TIER_0 void vg_framebuffer_bind_texture( vg_framebuffer *fb, u32 attachment, u32 slot ) -{ - vg_framebuffer_attachment *at = &fb->attachments[attachment]; - - if( (at->purpose != k_framebuffer_attachment_type_texture) && - (at->purpose != k_framebuffer_attachment_type_texture_depth) ) - { - vg_fatal_error( "illegal operation: bind non-texture framebuffer attachment to texture slot" ); - } - - vg_tex_bind( GL_TEXTURE_2D, &fb->attachments[attachment].tex, slot ); -} - -/* - * Convert OpenGL attachment ID enum to string - */ -#define FB_FORMAT_STR( E ) { E, #E }, -static const char *render_fb_attachment_str( GLenum e ) -{ - struct { GLenum e; const char *str; } - formats[] = - { - FB_FORMAT_STR(GL_COLOR_ATTACHMENT0) - FB_FORMAT_STR(GL_COLOR_ATTACHMENT1) - FB_FORMAT_STR(GL_COLOR_ATTACHMENT2) - FB_FORMAT_STR(GL_COLOR_ATTACHMENT3) - FB_FORMAT_STR(GL_COLOR_ATTACHMENT4) - FB_FORMAT_STR(GL_DEPTH_STENCIL_ATTACHMENT) - }; - - for( int i=0; itex.name == 0 ) - return; - - int rx, ry; - vg_framebuffer_get_res( fb, &rx, &ry ); - - if( a->purpose == k_framebuffer_attachment_type_renderbuffer ) - { - glBindRenderbuffer( GL_RENDERBUFFER, a->tex.name ); - glRenderbufferStorage( GL_RENDERBUFFER, a->internalformat, rx, ry ); - } - else if( a->purpose == k_framebuffer_attachment_type_texture || - a->purpose == k_framebuffer_attachment_type_texture_depth ) - { - glBindTexture( GL_TEXTURE_2D, a->tex.name ); - glTexImage2D( GL_TEXTURE_2D, 0, a->internalformat, rx, ry, 0, a->format, a->type, NULL ); - } -} - -VG_TIER_0 void vg_framebuffer_init( vg_framebuffer *fb ) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_OPENGL ) ); - glGenFramebuffers( 1, &fb->id ); - glBindFramebuffer( GL_FRAMEBUFFER, fb->id ); - - int rx, ry; - vg_framebuffer_get_res( fb, &rx, &ry ); - - vg_info( "allocate_framebuffer( %s, %dx%d )\n", fb->display_name, rx, ry ); - vg_info( "{\n" ); - - GLenum colour_attachments[ fb->attachment_count ]; - u32 colour_count = 0; - - for( u32 j=0; jattachment_count; j++ ) - { - vg_framebuffer_attachment *attachment = &fb->attachments[j]; - - if( attachment->purpose == k_framebuffer_attachment_type_none ) - continue; - - vg_info( " %s: %s\n", - render_fb_attachment_str( attachment->attachment ), - render_fb_format_str( attachment->internalformat ) ); - - if( attachment->purpose == k_framebuffer_attachment_type_renderbuffer ) - { - glGenRenderbuffers( 1, &attachment->tex.name ); - attachment->tex.flags = VG_TEX_COMPLETE|VG_TEX_FRAMEBUFFER_ATTACHMENT|VG_TEX_PRIVATE|VG_TEX_NOMIP; - - vg_framebuffer_allocate_texture( fb, attachment ); - glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, attachment->tex.name ); - } - else if( attachment->purpose == k_framebuffer_attachment_type_texture || - attachment->purpose == k_framebuffer_attachment_type_texture_depth ) - { - glGenTextures( 1, &attachment->tex.name ); - attachment->tex.flags = VG_TEX_COMPLETE|VG_TEX_FRAMEBUFFER_ATTACHMENT|VG_TEX_LINEAR|VG_TEX_CLAMP|VG_TEX_NOMIP; - - vg_framebuffer_allocate_texture( fb, attachment ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - glFramebufferTexture2D( GL_FRAMEBUFFER, attachment->attachment, GL_TEXTURE_2D, attachment->tex.name, 0 ); - - if( attachment->purpose == k_framebuffer_attachment_type_texture ) - colour_attachments[ colour_count ++ ] = attachment->attachment; - } - } - - glDrawBuffers( colour_count, colour_attachments ); - - /* - * Check result - */ - GLenum result = glCheckFramebufferStatus( GL_FRAMEBUFFER ); - if( result == GL_FRAMEBUFFER_COMPLETE ) - { - vg_success( " status: complete\n" ); - vg_info( "}\n" ); - } - else - { - if( result == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT ) - vg_info( " status: Incomplete attachment" ); - else if( result == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT ) - vg_info( " status: Missing attachment" ); - else if( result == GL_FRAMEBUFFER_UNSUPPORTED ) - vg_info( " status: Unsupported framebuffer format" ); - else - vg_info( " status: Generic Error" ); - vg_info( "}\n" ); - vg_fatal_error( "Bad framebuffer\n" ); - } -} - -VG_TIER_0 void vg_framebuffer_free( vg_framebuffer *fb ) -{ - glDeleteFramebuffers( 1, &fb->id ); - - for( u32 j=0; jattachment_count; j++ ) - { - vg_framebuffer_attachment *attachment = &fb->attachments[j]; - - if( attachment->purpose == k_framebuffer_attachment_type_none ) - continue; - - if( attachment->purpose == k_framebuffer_attachment_type_renderbuffer ) - { - glDeleteRenderbuffers( 1, &attachment->tex.name ); - vg_zero_mem( &attachment->tex, sizeof(vg_tex) ); - } - else if( attachment->purpose == k_framebuffer_attachment_type_texture || - attachment->purpose == k_framebuffer_attachment_type_texture_depth ) - { - vg_tex_delete( &attachment->tex ); - } - } -} - -VG_API void vg_framebuffer_ui( ui_context *ctx ) -{ - ui_px w = _vg_window.w/3, - h = _vg_window.h/3; - - ui_rect frame = {0,0,_vg_window.w/3,_vg_window.h/3}; - - for( int i=0; i<_vg_framebuffer.count; i++ ) - { - vg_framebuffer *fb = _vg_framebuffer.list[i]; - - for( int j=0; jattachment_count; j++ ) - { - vg_framebuffer_attachment *at = &fb->attachments[j]; - - if( !at->debug_view ) - continue; - - ui_fill( ctx, frame, 0xff000000 ); - if( at->purpose == k_framebuffer_attachment_type_renderbuffer ) - { - ui_text( ctx, frame, "", 1, k_ui_align_middle_center, 0 ); - } - else - { - f32 img_ratio = (f32)fb->render_w / (f32)fb->render_h, - frame_ratio = (f32)w / (f32)h; - - ui_rect img = { 0,0, 0,0 }; - - if( img_ratio >= frame_ratio ) - { - img[2] = w; - img[3] = w / img_ratio; - } - else - { - img[2] = h * img_ratio; - img[3] = h; - } - - ui_rect_center( frame, img ); - ui_image( ctx, img, &fb->attachments[j].tex, 0 ); - } - - ui_rect panel; - rect_copy( frame, panel ); - ui_info( ctx, panel, fb->display_name ); - ui_info( ctx, panel, at->display_name ); - ui_info( ctx, panel, render_fb_attachment_str( at->attachment ) ); - ui_info( ctx, panel, render_fb_format_str( at->internalformat ) ); - ui_info( ctx, panel, render_fb_format_str( at->format ) ); - - frame[0] += w; - - if( (frame[0] + w) > _vg_window.w ) - { - frame[0] = 0; - frame[1] += h; - } - } - } -} - -static void vg_framebuffer_show( vg_framebuffer *fb, vg_framebuffer_attachment *at, int operation ) -{ - at->debug_view = operation; - vg_info( "%s %s:%s\n", (operation? "shown": "hidden" ), fb->display_name, at->display_name ); -} - -/* - * arg0: command "show"/"hide" - * arg1: framebuffer name /"all" - * arg2: subname /none - */ -static int vg_framebuffer_control( int argc, char const *argv[] ) -{ - if( argc < 2 ) - { - vg_error( "Usage: fb \"show/hide\" /\"all\" /none\n" ); - return 0; - } - - int modify_all = 0, - operation = 0; - - if( !strcmp( argv[0], "show" ) ) - operation = 1; - else if( !strcmp( argv[0], "hide" ) ) - operation = 0; - else - { - vg_error( "Unknown framebuffer operation: '%s'\n", argv[0] ); - return 0; - } - - if( !strcmp( argv[1], "all" ) ) - modify_all = 1; - - for( int i=0; i<_vg_framebuffer.count; i++ ) - { - vg_framebuffer *fb = _vg_framebuffer.list[i]; - - for( int j=0; jattachment_count; j++ ) - { - vg_framebuffer_attachment *at = &fb->attachments[j]; - - if( at->purpose == k_framebuffer_attachment_type_none ) - continue; - - if( modify_all ) - { - vg_framebuffer_show( fb, at, operation ); - } - else - { - if( !strcmp( fb->display_name, argv[1] ) ) - { - if( argc == 2 ) - vg_framebuffer_show( fb, at, operation ); - else if( !strcmp( at->display_name, argv[2] ) ) - vg_framebuffer_show( fb, at, operation ); - } - } - } - } - - return 0; -} - -static void vg_framebuffer_poll( int argc, char const *argv[] ) -{ - const char *term = argv[argc-1]; - - if( argc == 1 ) - { - console_suggest_score_text( "show", term, 0 ); - console_suggest_score_text( "hide", term, 0 ); - } - else if( argc == 2 ) - { - console_suggest_score_text( "all", term, 0 ); - - for( int i=0; i<_vg_framebuffer.count; i++ ) - { - vg_framebuffer *fb = _vg_framebuffer.list[i]; - console_suggest_score_text( fb->display_name, term, 0 ); - } - } - else if( argc == 3 ) - { - int modify_all = 0; - - if( !strcmp( argv[1], "all" ) ) - modify_all = 1; - - for( int i=0; i<_vg_framebuffer.count; i++ ) - { - vg_framebuffer *fb = _vg_framebuffer.list[ i ]; - - for( int j=0; jattachment_count; j++ ) - { - vg_framebuffer_attachment *at = &fb->attachments[j]; - - if( at->purpose == k_framebuffer_attachment_type_none ) - continue; - - if( modify_all ) - { - console_suggest_score_text( at->display_name, term, 0 ); - } - else if( !strcmp( fb->display_name, argv[1] ) ) - { - console_suggest_score_text( at->display_name, term, 0 ); - } - } - } - } -} - -VG_API void _vg_framebuffer_register(void) -{ - vg_console_reg_cmd( "fb", vg_framebuffer_control, vg_framebuffer_poll ); -} - -VG_API void vg_framebuffer_update_sizes(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_OPENGL ) ); - - for( int i=0; i<_vg_framebuffer.count; i++ ) - { - vg_framebuffer *fb = _vg_framebuffer.list[i]; - for( int j=0; jattachment_count; j++ ) - { - vg_framebuffer_attachment *attachment = &fb->attachments[j]; - vg_framebuffer_allocate_texture( fb, attachment ); - } - } -} diff --git a/vg_framebuffer.h b/vg_framebuffer.h deleted file mode 100644 index df4ad6d..0000000 --- a/vg_framebuffer.h +++ /dev/null @@ -1,96 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_framebuffer.c" -#else -typedef struct vg_framebuffer vg_framebuffer; -typedef struct vg_framebuffer_attachment vg_framebuffer_attachment; - -#define VG_FRAMEBUFFER_GLOBAL 1 -#define VG_FRAMEBUFFER_SPECIALIZED 0 - -struct vg_framebuffer -{ - const c8 *display_name; - int resolution_div, /* If 0: Use fixed_w, fixed_h. - If non-0: Automatically size itself to - the window resolution divided by - this value */ - fixed_w, - fixed_h, - - render_w, /* The currently rendering resolution */ - render_h; - GLuint id; - u32 attachment_count; - - struct vg_framebuffer_attachment - { - const c8 *display_name; - enum vg_framebuffer_attachment_type - { - k_framebuffer_attachment_type_none, - k_framebuffer_attachment_type_texture, - k_framebuffer_attachment_type_renderbuffer, - k_framebuffer_attachment_type_texture_depth - } - purpose; - - enum vg_framebuffer_quality_profile - { - k_framebuffer_quality_all, - k_framebuffer_quality_high_only - } - quality; - - GLenum internalformat, - format, - type, - attachment; - vg_tex tex; - - /* Runtime */ - int debug_view; - } - attachments[]; -}; - -/* - * Initialize framebuffer system - */ -VG_API void _vg_framebuffer_register(void); -VG_API vg_framebuffer *_vg_framebuffer_alloc( vg_stack_allocator *stack, u32 attachment_count, bool track ); - -/* - * Get the current (automatically scaled or fixed) resolution of framebuffer - */ -VG_API void vg_framebuffer_get_res( vg_framebuffer *fb, int *x, int *y ); - -/* - * Get the inverse ratio to project pixel coordinates (0->1920) to UV coordinates - * - * NOTE: won't necesarily use the full 0->1 range, but may index a subsection - * of the framebuffer if using variable scale rendering. - */ -VG_API void vg_framebuffer_inverse_ratio( vg_framebuffer *fb, v2f inverse ); - -/* - * Bind framebuffer for drawing to - */ -VG_API void vg_framebuffer_bind( vg_framebuffer *fb, f32 scaling ); - -/* - * Bind framebuffer attachment's texture - */ -VG_TIER_0 void vg_framebuffer_bind_texture( vg_framebuffer *fb, u32 attachment, u32 slot ); - -/* - * Allocate graphics memory and initialize - */ -VG_TIER_0 void vg_framebuffer_init( vg_framebuffer *fb ); -VG_TIER_0 void vg_framebuffer_free( vg_framebuffer *fb ); - -/* - * Draw framebuffer debugging stuff - */ -VG_API void vg_framebuffer_ui( ui_context *ctx ); -VG_API void vg_framebuffer_update_sizes(void); -#endif diff --git a/vg_image.h b/vg_image.h deleted file mode 100644 index 880df61..0000000 --- a/vg_image.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -#include "vg/submodules/stb/stb_image_write.h" - -//#define STBI_ONLY_JPEG -#define STBI_NO_THREAD_LOCALS -#include "vg/submodules/stb/stb_image.h" diff --git a/vg_input.c b/vg_input.c deleted file mode 100644 index 8917e2d..0000000 --- a/vg_input.c +++ /dev/null @@ -1,609 +0,0 @@ -f32 controller_deadzone = 0.05f; - -struct vg_input vg_input = { - .active_controller_index = -2 -}; - -u8 vg_getkey( SDL_Keycode kc ) -{ - SDL_Scancode sc = SDL_GetScancodeFromKey( kc ); - return vg_input.sdl_keys[sc]; -} - -/* - * takes SDL device index, and tries to open that on any free channel - */ -static int vg_open_gamecontroller( Sint32 index ) -{ - struct vg_controller *controller = NULL; - int vg_id = 0; - const char *name = SDL_GameControllerNameForIndex( index ); - SDL_JoystickID instance_id = SDL_JoystickGetDeviceInstanceID( index ); - - if( instance_id == -1 ){ - vg_error( ". Invalid device index (vg_open_gamecontroller)\n" ); - return -1; - } - - for( int j=0; jhandle ){ - if( esta->instance_id == instance_id ){ - vg_warn( " . SDL_JoystickID[%d] is already in open at index #%d\n", - esta->instance_id, j ); - return -1; - } - } - else{ - if( !controller ){ - controller = &vg_input.controllers[j]; - vg_id = j; - } - } - } - - if( controller ) - { - controller->handle = SDL_GameControllerOpen( index ); - controller->instance_id = instance_id; - - if( controller->handle ) - { - vg_success( - " . opened SDL_JoystickID[%d] as controller '%s' at index #%d\n", - instance_id, name, vg_id ); - - for( u32 i=0; i< SDL_CONTROLLER_BUTTON_MAX; i++ ) - controller->buttons[i] = 0; - - for( u32 i=0; i< SDL_CONTROLLER_AXIS_MAX; i++ ) - controller->axises[i] = 0.0f; - - if( vg_input.active_controller_index == -2 ) - { - vg_input.active_controller_index = vg_id; - vg_input.display_input_method = k_input_method_controller; - vg_input.display_input_type = SDL_GameControllerGetType( controller->handle ); - } - - return vg_id; - } - else{ - vg_error( ". Failed to attach game controller '%s'. Reason: %s\n", - name, SDL_GetError() ); - return -1; - } - } - else{ - vg_error( ". Too many controllers open! ignoring '%s'\n", name ); - return -1; - } -} - -void vg_input_device_event( SDL_Event *ev ) -{ - if( ev->type == SDL_CONTROLLERDEVICEADDED ){ - int is_controller = SDL_IsGameController( ev->cdevice.which ); - const char *name = SDL_JoystickNameForIndex( ev->cdevice.which ); - - Sint32 index = ev->cdevice.which; - SDL_JoystickID instance_id = SDL_JoystickGetDeviceInstanceID( index ); - vg_info( "SDL_CONTROLLERDEVICEADDED | device index: %d, name: '%s'\n", - index, name ); - - if( is_controller ){ - vg_open_gamecontroller( index ); - } - } - else if( ev->type == SDL_CONTROLLERDEVICEREMOVED ){ - vg_info( "SDL_CONTROLLERDEVICEREMOVED | instance_id: %d\n", ev->cdevice.which ); - - for( int i=0; ihandle ){ - if( controller->instance_id == ev->cdevice.which ){ - vg_info( " . closing controller at index #%d\n", i ); - SDL_GameControllerClose( controller->handle ); - controller->handle = NULL; - controller->instance_id = -1; - - if( vg_input.active_controller_index == i ){ - vg_input.active_controller_index = -1; - vg_input.display_input_method = k_input_method_kbm; - vg_info( "display_input: k_input_method_kbm\n" ); - } - break; - } - } - } - } -} - -static void vg_input_set_active_controller( int index, const char *why ) -{ - if( vg_input.active_controller_index != index ) - { - vg_input.display_input_type = SDL_GameControllerGetType( vg_input.controllers[index].handle ); - vg_input.active_controller_index = index; - vg_info( "Switching controller index to #%d. (%s)\n", index, why ); - } - - if( vg_input.display_input_method != k_input_method_controller ) - { - vg_input.display_input_method = k_input_method_controller; - vg_info( "Switching input method to controller. (%s)\n", why ); - } -} - -void vg_input_controller_event( SDL_Event *ev ) -{ - if( ev->type == SDL_CONTROLLERAXISMOTION ) - { - for( int i=0; icaxis.which == esta->instance_id ) - { - float value = (float)ev->caxis.value / 32767.0f; - - if( ev->caxis.axis == SDL_CONTROLLER_AXIS_LEFTX || - ev->caxis.axis == SDL_CONTROLLER_AXIS_LEFTY || - ev->caxis.axis == SDL_CONTROLLER_AXIS_RIGHTX || - ev->caxis.axis == SDL_CONTROLLER_AXIS_RIGHTY ) - { - float deadz = vg_clampf( controller_deadzone, 0.0f, 0.999f ), - high = vg_maxf( 0.0f, fabsf(value) - deadz ); - - value = vg_signf(value) * (high / (1.0f-deadz)); - if( fabsf(value) > 0.5f ) - vg_input_set_active_controller( i, "Stick pushed >|0.5|" ); - } - - esta->axises[ ev->caxis.axis ] = value; - break; - } - } - } - else if( ev->type == SDL_CONTROLLERBUTTONDOWN ) - { - for( int i=0; iinstance_id == ev->cbutton.which ) - { - vg_input_set_active_controller( i, "Button press" ); - esta->buttons[ ev->cbutton.button ] = 1; - break; - } - } - } - else if( ev->type == SDL_CONTROLLERBUTTONUP ) - { - for( int i=0; icbutton.which == esta->instance_id ) - { - esta->buttons[ ev->cbutton.button ] = 0; - break; - } - } - } -} - -void vg_process_inputs(void) -{ - int count; - vg_input.sdl_keys = SDL_GetKeyboardState( &count ); - vg_input.sdl_mouse = SDL_GetMouseState(NULL,NULL); - - bool pressed_key = 0, moved_mouse = 0, clicked_mouse = 0; - int pressed_id = -1; - - for( int i=0; i 64.0f ) - { - moved_mouse = 1; - vg_input.hidden_mouse_travel = 0.0f; - } - - if( vg_input.display_input_method != k_input_method_kbm ) - { - if( pressed_key ) - { - vg_input.display_input_method = k_input_method_kbm; - vg_info( "display_input: k_input_method_kbm (keyboard %d)\n", pressed_id ); - } - - if( moved_mouse ) - { - vg_input.display_input_method = k_input_method_kbm; - vg_info( "display_input: k_input_method_kbm (mouse move)\n" ); - } - - if( clicked_mouse ) - { - vg_input.display_input_method = k_input_method_kbm; - vg_info( "display_input: k_input_method_kbm (mouse click)\n" ); - } - } - else - vg_input.hidden_mouse_travel = 0.0f; -} - -VG_API void _vg_input_register(void) -{ - VG_VAR_F32( controller_deadzone, flags=VG_VAR_PERSISTENT ); -} - -static void vg_input_free(void) -{ - for( int i=0; ihandle ) - { - SDL_GameControllerClose( controller->handle ); - controller->handle = NULL; - } - } -} - -VG_API void _vg_input_init(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_SDL ) ); - - vg_info( "Checking for controllers\n" ); - SDL_GameControllerAddMappingsFromFile( "gamecontrollerdb.txt" ); - - int joy_count = SDL_NumJoysticks(); - for( int i=0; i= 0 ) - return &vg_input.controllers[vg_input.active_controller_index]; - else - return NULL; -} - -u8 vg_controller_button( SDL_GameControllerButton button ) -{ - struct vg_controller *c = vg_active_controller(); - if( c ) return c->buttons[ button ]; - else return 0; -} - -f32 vg_controller_axis( SDL_GameControllerAxis axis ) -{ - struct vg_controller *c = vg_active_controller(); - if( c ) return c->axises[ axis ]; - else return 0; -} - -static void vg_input_apply_to_u8( vg_input_op mode, u8 data, u8 *inout_result ) -{ - if ( mode == vg_mode_absmax ) *inout_result |= data; - else if( mode == vg_mode_mul ) *inout_result &= data; - else vg_fatal_error( "mode not supported for destination type (%d)", mode ); -} - -static void vg_input_apply_to_f32( vg_input_op mode, f32 data, f32 *inout_result ) -{ - if( mode == vg_mode_absmax ) - { - if( fabsf(data) > fabsf(*inout_result) ) - *inout_result = data; - } - else if( mode == vg_mode_max ) *inout_result = vg_maxf(*inout_result,data); - else if( mode == vg_mode_mul ) *inout_result *= (f32)data; - else if( mode == vg_mode_sub ) *inout_result -= (f32)data; - else if( mode == vg_mode_add ) *inout_result += (f32)data; - else vg_fatal_error( "mode not supported for destination type (%d)", mode ); -} - -/* - * Run an input program. out_result must point to memory with sufficient - * storage respective to the size set by type. - */ -void vg_exec_input_program( enum vg_input_type type, vg_input_op *ops, void *out_result ) -{ - u8 *out_button = NULL; - f32 *out_joy = NULL; - - if( type == k_vg_input_type_button_u8 ) - { - out_button = out_result; - *out_button = 0; - } - else if( type == k_vg_input_type_axis_f32 ) - { - out_joy = out_result; - out_joy[0] = 0.0f; - } - else if( type == k_vg_input_type_joy_v2f ) - { - out_joy = out_result; - out_joy[0] = 0.0f; - out_joy[1] = 0.0f; - } - - /* computer state */ - vg_input_op mode = vg_mode_absmax; - u32 pc = 0, index = 0; - -next_code:; - vg_input_op op = ops[ pc ++ ]; - - if( (op >= vg_mode_mul) && (op <= vg_mode_max) ) - mode = op; - else if( (op == vg_keyboard) || (op == vg_mouse) || (op == vg_joy_button) ){ - u8 state = 0; - - if( op == vg_keyboard ) - state = vg_getkey(ops[pc ++]); - else if( op == vg_mouse ) - state = (vg_input.sdl_mouse & SDL_BUTTON(ops[pc ++]))?1:0; - else - state = vg_controller_button(ops[pc ++]); - - if( type == k_vg_input_type_button_u8 ) - vg_input_apply_to_u8( mode, state, out_button ); - else - vg_input_apply_to_f32( mode, (f32)state, &out_joy[index] ); - } - else if( op == vg_joy_axis ){ - f32 state = vg_controller_axis( ops[pc ++] ); - if( type == k_vg_input_type_button_u8 ) - vg_input_apply_to_u8( mode, state>0.5f?1:0, out_button ); - else - vg_input_apply_to_f32( mode, state, &out_joy[index] ); - } - else if( (op == vg_joy_ls) || (op == vg_joy_rs) ){ - if( type == k_vg_input_type_joy_v2f ){ - vg_input_apply_to_f32( mode, - vg_controller_axis( op==vg_joy_ls? SDL_CONTROLLER_AXIS_LEFTX: - SDL_CONTROLLER_AXIS_RIGHTX), - &out_joy[0] ); - vg_input_apply_to_f32( mode, - vg_controller_axis( op==vg_joy_ls? SDL_CONTROLLER_AXIS_LEFTY: - SDL_CONTROLLER_AXIS_RIGHTY), - &out_joy[1] ); - } - } - else if( op == vg_index ) - index = ops[pc ++]; - else if( op == vg_end ) - return; - else if( op == vg_normalize ) - v2_normalize( out_joy ); - else if( op == vg_gui_visible ) - pc ++; - else - vg_fatal_error( "unknown op (%u)\n", op ); - - goto next_code; -} - -/* - * Get vendor specific button glyphs based on SDL button ID - */ -const char *controller_button_str( SDL_GameControllerButton button ) -{ - static const char *controller_glyphs[ SDL_CONTROLLER_BUTTON_MAX ][2] = { - /* xbox/generic playstation */ - [ SDL_CONTROLLER_BUTTON_A ] = { KGRN "\x06\x02\x85",KBLU "\x06\x02\x82" }, - [ SDL_CONTROLLER_BUTTON_B ] = { KRED "\x06\x02\x86",KRED "\x06\x02\x81" }, - [ SDL_CONTROLLER_BUTTON_X ] = { KBLU "\x06\x02\x83",KMAG "\x06\x02\x7f" }, - [ SDL_CONTROLLER_BUTTON_Y ] = { KYEL "\x06\x02\x84",KGRN "\x06\x02\x80" }, - [ SDL_CONTROLLER_BUTTON_LEFTSTICK ] = { "\x87","\x87" }, - [ SDL_CONTROLLER_BUTTON_RIGHTSTICK ] = { "\x8b","\x8b" }, - [ SDL_CONTROLLER_BUTTON_LEFTSHOULDER ] = { "\x91","\x91" }, - [ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER ]= { "\x92","\x92" }, - [ SDL_CONTROLLER_BUTTON_DPAD_LEFT ] = { "\x93","\x93" }, - [ SDL_CONTROLLER_BUTTON_DPAD_UP ] = { "\x94","\x94" }, - [ SDL_CONTROLLER_BUTTON_DPAD_RIGHT ] = { "\x95","\x95" }, - [ SDL_CONTROLLER_BUTTON_DPAD_DOWN ] = { "\x96","\x96" }, - [ SDL_CONTROLLER_BUTTON_GUIDE ] = { "\x91","\x91" }, - }; - - if( vg_input.display_input_type == SDL_CONTROLLER_TYPE_PS3 || - vg_input.display_input_type == SDL_CONTROLLER_TYPE_PS4 || - vg_input.display_input_type == SDL_CONTROLLER_TYPE_PS5 ) - { - return controller_glyphs[ button ][ 1 ]; - } - else if( vg_input.display_input_type == - SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO || - vg_input.display_input_type == - SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT || - vg_input.display_input_type == - SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR || - vg_input.display_input_type == - SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT ) - { - return NULL; - } - else - return controller_glyphs[ button ][ 0 ]; -} - -/* - * Cat keyboard key string. special_glyphs include SR glyphs - */ -void vg_keyboard_key_string( vg_str *str, u32 key, int special_glyphs ) -{ - if( (key >= SDLK_a) && (key <= SDLK_z) ){ - key = (key-SDLK_a)+(u32)'A'; - vg_strcatch( str, key ); - } - else if( (key == SDLK_LSHIFT) || (key == SDLK_RSHIFT) ) - vg_strcat( str, special_glyphs? "\x9e": "shift" ); - else if( (key == SDLK_LCTRL) || (key == SDLK_RCTRL) ) - vg_strcat( str, special_glyphs? "\x9f": "ctrl" ); - else if( (key == SDLK_LALT) || (key == SDLK_RALT) ) - vg_strcat( str, special_glyphs? "\xa0": "alt" ); - else if( key == SDLK_SPACE ) - vg_strcat( str, special_glyphs? "\xa1": "space" ); - else if( (key == SDLK_RETURN) || (key == SDLK_RETURN2) ) - vg_strcat( str, special_glyphs? "\xa2": "return" ); - else if( key == SDLK_ESCAPE ) - vg_strcat( str, special_glyphs? "\xa3": "escape" ); - else if( key == SDLK_RIGHT ) - vg_strcat( str, special_glyphs? "\x95 ": "right" ); - else if( key == SDLK_LEFT ) - vg_strcat( str, special_glyphs? "\x93 ": "left" ); - else if( key == SDLK_UP ) - vg_strcat( str, special_glyphs? "\x94 ": "up" ); - else if( key == SDLK_DOWN ) - vg_strcat( str, special_glyphs? "\x96 ": "down" ); - else { - vg_strcat( str, "keyboard key #" ); - vg_strcati64( str, key, 10 ); - } -} - -/* - * Cat mouse button string. special_glyphs include SR glyphs - */ -void vg_mouse_button_string( vg_str *str, u32 button, int special_glyphs ) -{ - if ( button == SDL_BUTTON_LEFT ) - vg_strcat( str, special_glyphs? "\x99": "left mouse" ); - else if( button == SDL_BUTTON_RIGHT ) - vg_strcat( str, special_glyphs? "\x9a": "right mouse" ); - else if( button == SDL_BUTTON_MIDDLE ) - vg_strcat( str, special_glyphs? "\x9c": "middle mouse" ); - else{ - vg_strcat( str, "mouse button #" ); - vg_strcati64( str, button, 10 ); - } -} - -/* - * Cat string represeinting single axis - */ -void vg_joy_axis_string( vg_str *str, SDL_GameControllerAxis axis, - int special_glyphs ) -{ - if( axis == SDL_CONTROLLER_AXIS_TRIGGERLEFT ) - vg_strcat( str, special_glyphs?"\x8f":"left trigger" ); - else if( axis == SDL_CONTROLLER_AXIS_TRIGGERRIGHT ) - vg_strcat( str, special_glyphs?"\x90":"right trigger" ); - else if( axis == SDL_CONTROLLER_AXIS_LEFTX ) - vg_strcat( str, special_glyphs?"\x88":"left stick horizontal" ); - else if( axis == SDL_CONTROLLER_AXIS_LEFTY ) - vg_strcat( str, special_glyphs?"\x89":"left stick vertical" ); - else if( axis == SDL_CONTROLLER_AXIS_RIGHTX ) - vg_strcat( str, special_glyphs?"\x8c":"right stick horizontal" ); - else if( axis == SDL_CONTROLLER_AXIS_RIGHTY ) - vg_strcat( str, special_glyphs?"\x8d":"right stick vertical" ); - else{ - vg_strcat( str, "axis " ); - vg_strcati64( str, axis, 10 ); - } -} - -/* - * Cat string represeinting whole joystick - */ -void vg_joy_string( vg_str *str, vg_input_op op, int special_glyphs ) -{ - if( op == vg_joy_ls ) - vg_strcat( str, special_glyphs? "\x87": "left stick" ); - else - vg_strcat( str, special_glyphs? "\x8b": "right stick" ); -} - -/* - * Convert an input program into a readable string - */ -void vg_input_string( vg_str *str, vg_input_op *ops, int glyphs ) -{ - u32 pc = 0; - int applicable = 0, visible = 1; - -next_code:; - vg_input_op op = ops[ pc ++ ]; - - if( (op == vg_keyboard) || (op == vg_mouse) ) - { - if( (vg_input.display_input_method == k_input_method_kbm) && visible ) - { - applicable = 1; - - if( op == vg_keyboard ) - vg_keyboard_key_string( str, ops[pc], glyphs ); - else - vg_mouse_button_string( str, ops[pc], glyphs ); - } - else applicable = 0; - pc ++; - } - else if( (op == vg_joy_button) || (op == vg_joy_axis) ) - { - if( (vg_input.display_input_method == k_input_method_controller) && visible ) - { - applicable = 1; - - if( op == vg_joy_button ) - vg_strcat( str, controller_button_str(ops[pc]) ); - else - vg_joy_axis_string( str, ops[pc], glyphs ); - } - else applicable = 0; - pc ++; - } - else if( (op == vg_joy_ls) || (op == vg_joy_rs) ) - { - if( (vg_input.display_input_method == k_input_method_controller) && visible ) - { - applicable = 1; - vg_joy_string( str, op, glyphs ); - } - else applicable = 0; - } - else if( op == vg_mode_mul ){ - if( applicable && visible ) - vg_strcat( str, " + " ); - } - else if( op == vg_index ) - pc ++; - else if( op == vg_gui_visible ) - visible = ops[pc++]; - else if( op == vg_end ) - return; - - goto next_code; -} diff --git a/vg_input.h b/vg_input.h deleted file mode 100644 index c6320c4..0000000 --- a/vg_input.h +++ /dev/null @@ -1,93 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_input.c" -#else - -/* Copyright (C) 2021-2024 Harry Godden (hgn) - All Rights Reserved */ -#define VG_MAX_CONTROLLERS 4 - -extern f32 controller_deadzone; - -typedef u32 vg_input_op; -typedef vg_input_op *vg_input_program; - -enum vg_input_type -{ - k_vg_input_type_button_u8, - k_vg_input_type_axis_f32, - k_vg_input_type_joy_v2f -}; - -enum vg_input_op -{ - /* data source */ - vg_keyboard, - vg_mouse, - vg_joy_button, - vg_joy_axis, - vg_joy_ls, - vg_joy_rs, - - /* modes */ - vg_mode_mul, - vg_mode_sub, - vg_mode_add, - vg_mode_absmax, - vg_mode_max, - - /* control */ - vg_index, - vg_end, - vg_gui_visible, - - /* math */ - vg_normalize -}; - -struct vg_input -{ - const u8 *sdl_keys; - u32 sdl_mouse; - f32 hidden_mouse_travel; - - struct vg_controller{ - SDL_GameController *handle; /* handle for controller. NULL if unused */ - SDL_JoystickID instance_id; /* uid used in events */ - - float axises[ SDL_CONTROLLER_AXIS_MAX ]; - u32 buttons[ SDL_CONTROLLER_BUTTON_MAX ]; - } - controllers[4]; - - int active_controller_index; /* most recent controller (by button press) - will be -1 if no controllers active */ - - /* what the user is currently using. the keyboard and controller are still - * active simultaneously, but this reflects what the UI should show */ - enum input_method{ - k_input_method_kbm, - k_input_method_controller - } - display_input_method; - SDL_GameControllerType display_input_type; -} -extern vg_input; - -VG_API void _vg_input_register(void); -VG_API void _vg_input_init(void); - -u8 vg_getkey( SDL_Keycode kc ); -void vg_process_inputs(void); -struct vg_controller *vg_active_controller(void); -u8 vg_controller_button( SDL_GameControllerButton button ); -f32 vg_controller_axis( SDL_GameControllerAxis axis ); -void vg_exec_input_program( enum vg_input_type type, vg_input_op *ops, void *out_result ); -const char *controller_button_str( SDL_GameControllerButton button ); -void vg_keyboard_key_string( vg_str *str, u32 key, int special_glyphs ); -void vg_mouse_button_string( vg_str *str, u32 button, int special_glyphs ); -void vg_joy_axis_string( vg_str *str, SDL_GameControllerAxis axis, int special_glyphs ); -void vg_joy_string( vg_str *str, vg_input_op op, int special_glyphs ); -void vg_input_string( vg_str *str, vg_input_op *ops, int glyphs ); -void vg_input_device_event( SDL_Event *ev ); -void vg_input_controller_event( SDL_Event *ev ); - -#endif diff --git a/vg_io.c b/vg_io.c deleted file mode 100644 index b927e41..0000000 --- a/vg_io.c +++ /dev/null @@ -1,385 +0,0 @@ -#include -#include - -const char *dir_open_result_str[] = -{ - [k_dir_open_none] = "None", - [k_dir_open_ok] = "OK", - [k_dir_open_path_too_long] = "Path too long", - [k_dir_open_invalid_path] = "Invalid path" -}; - -bool vg_path_exists( const char *path ) -{ -#ifdef _WIN32 - DWORD attributes = GetFileAttributes( path ); - if( attributes == INVALID_FILE_ATTRIBUTES ) - return 0; - return 1; -#else - return access(path, F_OK) != -1; -#endif -} - -bool vg_make_directory( const char *path ) -{ -#ifdef _WIN32 - return CreateDirectory( path, NULL )? 1:0; -#else - return mkdir( path, S_IRWXU|S_IRWXG|S_IRWXO ) == 0; -#endif -} - -enum dir_open_result vg_dir_open( vg_dir *dir, const char *name ) -{ -#ifdef _WIN32 - char q_buf[4096]; - vg_str q; - vg_strnull( &q, q_buf, 4096 ); - vg_strcat( &q, name ); - - DWORD attributes = GetFileAttributes( q.buffer ); - if( attributes == INVALID_FILE_ATTRIBUTES ) - { - vg_error( "Big problem: %d\n", GetLastError() ); - return k_dir_open_invalid_path; - } - - if( !(attributes & FILE_ATTRIBUTE_DIRECTORY) ) - return k_dir_open_is_file; - - vg_strcat( &q, "/*" ); - if( !vg_strgood(&q) ) - return k_dir_open_path_too_long; - - vg_info( "FindFirstFile( '%s' )\n", q.buffer ); - dir->h = FindFirstFile( q.buffer, &dir->data ); - if( dir->h == INVALID_HANDLE_VALUE ) - { - if( GetLastError() == ERROR_FILE_NOT_FOUND ) - { - dir->index = 0; - return k_dir_open_ok; - } - else - return k_dir_open_invalid_path; - } -#else - dir->h = opendir( name ); - if( !dir->h ) - { - if( errno == ENOTDIR ) - return k_dir_open_is_file; - else - return k_dir_open_invalid_path; - } -#endif - dir->index = 1; - return k_dir_open_ok; -} - -const char *vg_dir_entry_name( vg_dir *dir ) -{ -#ifdef _WIN32 - return dir->data.cFileName; -#else - return dir->data->d_name; -#endif -} - -static int vg_dirskip( vg_dir *dir ) -{ - const char *s = vg_dir_entry_name(dir); -#ifdef _WIN32 - if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN ) - return 1; -#endif - if( s[0] == '.' ) - { - if( s[1] == '\0' ) - return 1; - else if( s[1] == '.' ) - { - if( s[2] == '\0' ) - return 1; - } - } - return 0; -} - -bool vg_dir_next_entry( vg_dir *dir ) -{ -#ifdef _WIN32 - if( dir->index == 0 ) - return 0; - - if( dir->index > 1 ) - { - dir->index ++; - if( !FindNextFile( dir->h, &dir->data ) ) - return 0; - } - while( vg_dirskip(dir) ) - { - dir->index ++; - if( !FindNextFile( dir->h, &dir->data ) ) - return 0; - } - if( dir->index == 1 ) - dir->index ++; - return 1; -#else - while( (dir->data = readdir(dir->h)) ) - { - dir->index ++; - if( !vg_dirskip(dir) ) - break; - } - if( dir->data ) - return 1; - else return 0; -#endif -} - -enum vg_entry_type vg_dir_entry_type( vg_dir *dir ) -{ -#ifdef _WIN32 - if( dir->data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) - return k_vg_entry_type_dir; - else - return k_vg_entry_type_file; /* sketchy? */ -#else - if( dir->data->d_type == DT_DIR ) return k_vg_entry_type_dir; - if( dir->data->d_type == DT_REG ) return k_vg_entry_type_file; -#endif - return k_vg_entry_type_unknown; -} - -void vg_dir_close( vg_dir *dir ) -{ -#ifdef _WIN32 - if( dir->index ) FindClose( dir->h ); - dir->h = INVALID_HANDLE_VALUE; -#else - closedir( dir->h ); - dir->h = NULL; - dir->data = NULL; -#endif - dir->index = 0; -} - -VG_TIER_0 void vg_buffer_stream_open( vg_stream *stream, const void *buffer, u32 buffer_length, u32 mode ) -{ - VG_ASSERT( buffer_length ); - VG_ASSERT( buffer ); - - stream->buffer = buffer; - stream->byte_limit = buffer_length; - stream->byte_count = 0; - stream->flags = mode; -} - -VG_TIER_0 bool vg_file_stream_open( vg_stream *stream, const c8 *path, u32 mode ) -{ -#if defined( VG_ENGINE ) - if( !_vg_thread_has_flags( VG_THREAD_BACKGROUND ) ) - vg_warn( "Performance: I/O file stream opened in main thread. This will cause frame stalls!\n" ); -#endif - stream->fp = fopen( path, (mode & VG_STREAM_WRITE)? "wb": "rb" ); - stream->byte_limit = 0; - stream->byte_count = 0; - stream->flags = mode | VG_STREAM_FILE; - - if( stream->fp ) - return 1; - else - { - vg_error( "Failed to open disk stream '%s'\n", path ); - return 0; - } -} - -VG_TIER_0 u32 vg_stream_usable_length( vg_stream *stream, u32 length ) -{ - if( stream->byte_limit && ((stream->byte_count + length) > stream->byte_limit) ) - length = stream->byte_limit - stream->byte_count; - return length; -} - -VG_TIER_0 u32 vg_stream_read( vg_stream *stream, void *buffer, u32 length ) -{ - VG_ASSERT( stream->flags & VG_STREAM_READ ); - u32 read_length = vg_stream_usable_length( stream, length ); - - if( stream->flags & VG_STREAM_FILE ) - { - u64 l = (u32)fread( buffer, 1, read_length, stream->fp ); - if( l != read_length ) - { - if( !feof( stream->fp ) ) - { - if( ferror( stream->fp ) ) - { - fclose( stream->fp ); - vg_fatal_error( "Read error (%u: %s)\n", (u32)errno, strerror(errno) ); - } - else - { - fclose( stream->fp ); - vg_fatal_error( "Unknown read error (fread)\n" ); - } - } - } - read_length = l; - } - else - { - for( u32 i=0; ibuffer)[stream->byte_count + i]; - } - - for( u32 i=read_length; ibyte_count += read_length; - return read_length; -} - -VG_TIER_0 u32 vg_stream_offset( vg_stream *stream ) -{ - return stream->byte_count; -} - -VG_TIER_0 void vg_stream_seek( vg_stream *stream, u32 offset ) -{ - if( stream->flags & VG_STREAM_FILE ) - { - if( fseek( stream->fp, offset, SEEK_SET ) == -1 ) - { - vg_fatal_error( "fseek error (%u: %s)\n", (u32)errno, strerror(errno) ); - } - } - stream->byte_count = offset; -} - -VG_TIER_0 u32 vg_stream_write( vg_stream *stream, const void *buffer, u32 length ) -{ - VG_ASSERT( stream->flags & VG_STREAM_WRITE ); - u32 write_length = vg_stream_usable_length( stream, length ); - - if( stream->flags & VG_STREAM_FILE ) - { - u64 l = fwrite( buffer, 1, write_length, stream->fp ); - if( l != write_length ) - { - if( ferror( stream->fp ) ) - { - fclose( stream->fp ); - vg_fatal_error( "Write error (%u: %s)\n", (u32)errno, strerror(errno) ); - } - else - { - fclose( stream->fp ); - vg_fatal_error( "Unknown write error (fwrite)\n" ); - } - } - } - else - { - for( u32 i=0; ibuffer)[stream->byte_count + i] = ((u8 *)buffer)[i]; - } - - stream->byte_count += write_length; - return write_length; -} - -VG_TIER_0 void vg_file_stream_close( vg_stream *stream ) -{ - VG_ASSERT( stream->flags & VG_STREAM_FILE ); - fclose( stream->fp ); - stream->fp = NULL; -} - -#define VG_FILE_IO_CHUNK_SIZE VG_KB(256) -/* read entire binary file */ -void *vg_file_read( vg_stack_allocator *stack, const char *path, u32 *size, bool text ) -{ - VG_ASSERT( stack ); - - FILE *f = fopen( path, "rb" ); - if( f ) - { - u8 *buffer = vg_stack_allocate( stack, 0, 8, "File data" ); - u64 current = 0; - - /* read in chunks */ - while(1) - { - vg_stack_extend_last( stack, +VG_FILE_IO_CHUNK_SIZE ); - u64 l = fread( buffer + current, 1, VG_FILE_IO_CHUNK_SIZE, f ); - current += l; - - if( l != VG_FILE_IO_CHUNK_SIZE ) - { - if( feof( f ) ) - break; - else - { - if( ferror( f ) ) - { - fclose(f); - vg_fatal_error( "Read error\n" ); - } - else - { - fclose(f); - vg_fatal_error( "Unknown error condition\n" ); - } - } - } - } - - if( text ) - { - vg_stack_extend_last( stack, +1 ); - buffer[ current ++ ] = '\0'; - } - fclose( f ); - - *size = (u32)current; - return buffer; - } - else - { - vg_error( "vg_disk_open_read: %s (file: %s)\n", strerror(errno), path ); - return NULL; - } -} - -bool vg_asset_write( const char *path, void *data, i64 size ) -{ - FILE *f = fopen( path, "wb" ); - if( f ) - { - fwrite( data, size, 1, f ); - fclose( f ); - return 1; - } - else - return 0; -} - -const char *vg_path_filename( const char *path ) -{ - const char *base = path; - for( int i=0; i<1024; i++ ) - { - if( path[i] == '\0' ) - break; - if( path[i] == '/' ) - base = path+i+1; - } - - return base; -} diff --git a/vg_io.h b/vg_io.h deleted file mode 100644 index ea2f5ee..0000000 --- a/vg_io.h +++ /dev/null @@ -1,81 +0,0 @@ -#include -#include -#include - -typedef struct vg_dir vg_dir; - -#if defined( _WIN32 ) -struct vg_dir -{ - HANDLE h; - WIN32_FIND_DATA data; - u32 index; -}; -#else -struct vg_dir -{ - DIR *h; - struct dirent *data; - u32 index; -}; -#endif - -typedef struct vg_stream vg_stream; -struct vg_stream -{ - u32 flags, byte_limit, byte_count; - - union - { - FILE *fp; - const void *buffer; - }; -}; - -#define VG_STREAM_FILE 0x4 -#define VG_STREAM_WRITE 0x2 -#define VG_STREAM_READ 0x1 - -VG_TIER_0 bool vg_file_stream_open( vg_stream *stream, const c8 *path, u32 mode ); -VG_TIER_0 void vg_buffer_stream_open( vg_stream *stream, const void *buffer, u32 buffer_length, u32 mode ); -VG_TIER_0 u32 vg_stream_read( vg_stream *stream, void *buffer, u32 length ); -VG_TIER_0 u32 vg_stream_write( vg_stream *stream, const void *buffer, u32 length ); -VG_TIER_0 void vg_file_stream_close( vg_stream *stream ); -VG_TIER_0 u32 vg_stream_offset( vg_stream *stream ); -VG_TIER_0 void vg_stream_seek( vg_stream *stream, u32 offset ); - -enum vg_entry_type -{ - k_vg_entry_type_unknown, - k_vg_entry_type_file, - k_vg_entry_type_dir -}; - -enum dir_open_result -{ - k_dir_open_none, - k_dir_open_ok, - k_dir_open_path_too_long, - k_dir_open_invalid_path, - k_dir_open_is_file -}; -extern const char *dir_open_result_str[]; -enum dir_open_result vg_dir_open( vg_dir *dir, const char *name ); - -const char *vg_dir_entry_name( vg_dir *dir ); -bool vg_dir_next_entry( vg_dir *dir ); -enum vg_entry_type vg_dir_entry_type( vg_dir *dir ); -void vg_dir_close( vg_dir *dir ); - -bool vg_path_exists( const char *path ); -bool vg_make_directory( const char *path ); - -/* - * File I/O - */ - -/* read entire binary file, if text is 1, appends a nul to the end of the buffer */ -void *vg_file_read( vg_stack_allocator *stack, const char *path, u32 *size, bool text ); - -bool vg_asset_write( const char *path, void *data, i64 size ); -const char *vg_path_filename( const char *path ); diff --git a/vg_kv.c b/vg_kv.c deleted file mode 100644 index 7af1fa0..0000000 --- a/vg_kv.c +++ /dev/null @@ -1,543 +0,0 @@ -static vg_kv *vg_kvs_newkv( vg_kvs *kvs ) -{ - void *kv_page; - if( (kvs->kv_page_count == VG_KV_PAGE_COUNT) || (kvs->kv_page_offset == 0) ) - { - u32 page_size = sizeof(vg_kv)*VG_KV_PAGE_COUNT; - kv_page = vg_stack_allocate( kvs->stack, page_size, 64, "KV Page" ); - vg_zero_mem( kv_page, page_size ); - kvs->kv_page_offset = vg_stack_offset( kvs->stack, kv_page ); - kvs->kv_page_count = 0; - kvs->stat_memory_pages += page_size; - } - else - kv_page = vg_stack_pointer( kvs->stack, kvs->kv_page_offset ); - - vg_kv *kv = kv_page + kvs->kv_page_count * sizeof(vg_kv); - kvs->kv_page_count ++; - return kv; -} - -void vg_kvs_init( vg_kvs *kvs, vg_stack_allocator *stack ) -{ - vg_zero_mem( kvs, sizeof(vg_kvs) ); - kvs->stack = stack; - - vg_kv *root_kv = vg_kvs_newkv( kvs ); - kvs->root_offset = vg_stack_offset( kvs->stack, root_kv ); -} - -static u32 vg_kv_string_append( vg_kvs *kvs, const c8 *string ) -{ - if( string == NULL ) - return 0; - char *buf = vg_stack_allocate( kvs->stack, strlen(string)+1, 1, "KV string (appended)" ); - strcpy( buf, string ); - return vg_stack_offset( kvs->stack, buf ); -} - -u32 vg_kv_append( vg_kvs *kvs, u32 parent_offset, const c8 *key, const c8 *value ) -{ - if( parent_offset == 0 ) - parent_offset = kvs->root_offset; - - vg_kv *kv = vg_kvs_newkv( kvs ); - u32 key_offset = vg_kv_string_append( kvs, key ), - value_offset = vg_kv_string_append( kvs, value ); - - kv->key_info = (vg_strdjb2(key) & 0xFFFFF) | (key?(strlen(key)<<20):0) | (value?(0x1<<30):0); - kv->key_offset = key_offset; - - if( value ) - { - VG_ASSERT( key ); - kv->value.offset_from_key = value_offset-key_offset; - kv->value.length = strlen(value); - } - - u32 kv_offset = vg_stack_offset( kvs->stack, kv ); - vg_kv *parent = vg_stack_pointer( kvs->stack, parent_offset ); - if( parent->first_child_offset ) - { - u32 brother_offset = parent->first_child_offset; - while( 1 ) - { - vg_kv *brother = vg_stack_pointer( kvs->stack, brother_offset ); - if( brother->brother_offset ) - brother_offset = brother->brother_offset; - else - { - brother->brother_offset = kv_offset; - break; - } - } - } - else parent->first_child_offset = kv_offset; - return kv_offset; -} - -/* - * Navigating, and read/writing the KV tree - * -------------------------------------------------------------------------------------------------------------------- - */ -u32 vg_kv_type( vg_kvs *kvs, u32 kv_offset ) -{ - vg_kv *kv = vg_stack_pointer( kvs->stack, kv_offset ); - return (kv->key_info >> 30) & 0x3; -} - -const c8 *vg_kv_key( vg_kvs *kvs, u32 kv_offset, u32 *out_length ) -{ - if( kv_offset == 0 ) - return NULL; - - vg_kv *kv = vg_stack_pointer( kvs->stack, kv_offset ); - u32 length = (kv->key_info >> 20) & 0x3FF; - if( out_length ) - *out_length = length; - return length? vg_stack_pointer( kvs->stack, kv->key_offset ): NULL; -} - -const c8 *vg_kv_value( vg_kvs *kvs, u32 kv_offset, u32 *out_length ) -{ - if( kv_offset == 0 ) - return NULL; - if( vg_kv_type( kvs, kv_offset ) == k_vg_kv_type_frame ) - return NULL; - else - { - vg_kv *kv = vg_stack_pointer( kvs->stack, kv_offset ); - if( out_length ) - *out_length = kv->value.length; - return vg_stack_pointer( kvs->stack, kv->key_offset + kv->value.offset_from_key ); - } -} - -u32 vg_kv_next( vg_kvs *kvs, u32 kv_offset ) -{ - vg_kv *kv = vg_stack_pointer( kvs->stack, kv_offset ); - return kv->brother_offset; -} - -u32 vg_kv_child( vg_kvs *kvs, u32 root_offset, u32 index ) -{ - if( vg_kv_type( kvs, root_offset ) == k_vg_kv_type_frame ) - { - vg_kv *parent = vg_stack_pointer( kvs->stack, root_offset ); - u32 offset = parent->first_child_offset; - - for( u32 i=0; (istack, offset ); - offset = kv->brother_offset; - } - return offset; - } - else return 0; -} - -u32 vg_kv_find( vg_kvs *kvs, u32 root_offset, const c8 *key ) -{ - if( root_offset == 0 ) - root_offset = kvs->root_offset; - - u32 hash = vg_strdjb2( key ); - u32 child_offset = vg_kv_child( kvs, root_offset, 0 ); - while( child_offset ) - { - vg_kv *kv = vg_stack_pointer( kvs->stack, child_offset ); - if( ((kv->key_info ^ hash) & 0xFFFFF) == 0 ) - { - u32 key_length; - const c8 *child_key = vg_kv_key( kvs, child_offset, &key_length ); - if( child_key ) - { - for( u32 i=0; istack ); - VG_ASSERT( out_kvs->kv_page_count ); - - vg_zero_mem( parser, sizeof(vg_kv_parser) ); - parser->kvs = out_kvs; - parser->frame_stack[0].frame_offset = root_offset; -} - -static void vg_kv_parser_link( vg_kv_parser *parser, u32 offset, u32 depth ) -{ - u32 parent_offset = parser->frame_stack[ depth ].frame_offset; - vg_kv *parent = vg_stack_pointer( parser->kvs->stack, parent_offset ); - if( parent->first_child_offset == 0 ) - parent->first_child_offset = offset; - - u32 brother_offset = parser->frame_stack[ depth ].latest_child_offset; - if( brother_offset ) - { - vg_kv *brother = vg_stack_pointer( parser->kvs->stack, brother_offset ); - brother->brother_offset = offset; - } - parser->frame_stack[ depth ].latest_child_offset = offset; -} - -void vg_kv_parse_stream( vg_kv_parser *parser, vg_stream *in_stream ) -{ - c8 c; - while( vg_stream_read( in_stream, &c, 1 ) ) - { - parser->stat_source_characters ++; - if( c == '\0' ) - break; - - bool is_control_character = 0; - if( parser->token0_deliminator ) - { - if( c == parser->token0_deliminator ) - is_control_character = 1; - } - else - { - if( c==' '||c=='\t'||c=='\r'||c=='\n'||c=='{'||c=='}' ) - is_control_character = 1; - } - - if( is_control_character ) - { - if( parser->token0_length ) - { - parser->token0_length --; - vg_stack_extend_last( parser->kvs->stack, +1 ); - parser->token0_buffer[ parser->token0_length ] = '\0'; - - if( parser->token1_length ) - { - /* KV pair */ - vg_kv *kv = vg_kvs_newkv( parser->kvs ); - kv->key_info = (0xFFFFF & parser->token1_hash) | - (0x3FF & parser->token1_length)<<20 | - (0x1) << 30; - kv->key_offset = parser->token1_start_offset; - kv->value.offset_from_key = parser->token0_start_offset - parser->token1_start_offset; - kv->value.length = parser->token0_length; - parser->token1_length = 0; - - vg_kv_parser_link( parser, vg_stack_offset( parser->kvs->stack, kv ), parser->depth ); - } - else - { - /* shift */ - parser->token1_start_offset = parser->token0_start_offset; - parser->token1_length = parser->token0_length; - parser->token1_hash = parser->token0_hash; - } - - parser->token0_length = 0; - } - - if( c=='{'||c=='}'||c=='\n' ) - { - if( c == '{' ) - { - vg_kv *kv = vg_kvs_newkv( parser->kvs ); - if( parser->token1_length ) - { - kv->key_info = (0xFFFFF & parser->token1_hash) | (0x3FF & parser->token1_length) << 20; - kv->key_offset = parser->token1_start_offset; - } - else - kv->key_info = 5381; - - u32 id = vg_stack_offset( parser->kvs->stack, kv ), - depth = parser->depth; - - parser->depth ++; - parser->frame_stack[ parser->depth ].latest_child_offset = 0; - parser->frame_stack[ parser->depth ].frame_offset = id; - vg_kv_parser_link( parser, id, depth ); - parser->token1_length = 0; - } - else if( c == '}' ) - { - if( parser->depth ) - parser->depth --; - parser->token1_length = 0; - } - } - - parser->token0_deliminator = 0; - } - else - { - if( parser->token0_length ) - { - vg_stack_extend_last( parser->kvs->stack, +1 ); - parser->token0_buffer[ parser->token0_length-1 ] = c; - parser->token0_length ++; - parser->token0_hash = ((parser->token0_hash << 5) + parser->token0_hash) + (u32)c; - parser->stat_memory_strings ++; - } - else - { - if( c =='"' || c=='\'' ) - { - parser->token0_buffer = vg_stack_allocate( parser->kvs->stack, 0, 1, "KV string" ); - parser->token0_start_offset = vg_stack_offset( parser->kvs->stack, parser->token0_buffer ); - parser->token0_deliminator = c; - parser->token0_hash = 5381; - parser->token0_length = 1; - } - else - { - parser->token0_buffer = vg_stack_allocate( parser->kvs->stack, 1, 1, "KV string" ); - parser->token0_start_offset = vg_stack_offset( parser->kvs->stack, parser->token0_buffer ); - parser->token0_buffer[0] = c; - parser->token0_length = 2; - parser->token0_hash = ((5381<<5)+5381) + (u32)c; - parser->stat_memory_strings ++; - } - } - } - } -} - -void vg_kv_parser_print_info( vg_kv_parser *parser ) -{ - vg_low( "KV stats\n" - " bytes pages: %u\n" - " bytes strings: %u\n" - " source characters: %u. compression ratio: %.2f%%\n", parser->kvs->stat_memory_pages, - parser->stat_memory_strings, - parser->stat_source_characters, - (f32)(parser->stat_memory_strings+parser->kvs->stat_memory_pages) / - (f32)parser->stat_source_characters * 100.0f ); -} - -/* - * Writing KVS to a stream (formatted) - * -------------------------------------------------------------------------------------------------------------------- - */ -void vg_kv_write_init( vg_kv_write *w, vg_stream *stream ) -{ - vg_zero_mem( w, sizeof(vg_kv_write) ); - w->stream = stream; -} - -static void vg_kv_write_indent( vg_kv_write *w ) -{ - for( u32 i=0; idepth; i ++ ) - vg_stream_write( w->stream, (c8[]){ ' ' }, 1 ); -} - -static void vg_kv_write_string( vg_kv_write *w, const c8 *string, u32 length ) -{ - if( length == 0 ) - length = 0xffffffff; - - u32 i=0; - char delim=0; - for( ;istream, (c8[]){ delim }, 1 ); - vg_stream_write( w->stream, string, i ); - if( delim ) vg_stream_write( w->stream, (c8[]){ delim }, 1 ); -} - -void vg_kv_write_block( vg_kv_write *w, const c8 *name, u32 name_length ) -{ - vg_kv_write_indent( w ); - if( name ) - { - vg_kv_write_string( w, name, name_length ); - vg_stream_write( w->stream, (c8[]){ '\n' }, 1 ); - vg_kv_write_indent( w ); - } - - vg_stream_write( w->stream, (c8[]){ '{', '\n' }, 2 ); - w->depth ++; -} - -void vg_kv_end_block( vg_kv_write *w ) -{ - w->depth --; - vg_kv_write_indent( w ); - vg_stream_write( w->stream, (c8[]){ '}', '\n' }, 2 ); -} - -void vg_kv_write_kv( vg_kv_write *w, const c8 *key, u32 key_len, const c8 *value, u32 value_len ) -{ - vg_kv_write_indent( w ); - vg_kv_write_string( w, key, key_len ); - vg_stream_write( w->stream, (c8[]){ ' ' }, 1 ); - vg_kv_write_string( w, value, value_len ); - vg_stream_write( w->stream, (c8[]){ '\n' }, 1 ); -} - -void vg_kv_write_tree( vg_kv_write *w, vg_kvs *kvs, u32 root_offset ) -{ - if( root_offset == 0 ) - root_offset = kvs->root_offset; - - VG_ASSERT( vg_kv_type( kvs, root_offset ) == k_vg_kv_type_frame ); - - u32 root_len; - const c8 *root_str = vg_kv_key( kvs, root_offset, &root_len ); - vg_kv_write_block( w, root_str, root_len ); - - u32 child_offset = vg_kv_child( kvs, root_offset, 0 ); - while( child_offset ) - { - if( vg_kv_type( kvs, child_offset ) == k_vg_kv_type_frame ) - vg_kv_write_tree( w, kvs, child_offset ); - else - { - u32 key_len; - const c8 *key_str = vg_kv_key( kvs, child_offset, &key_len ); - - u32 value_len; - const c8 *value_str = vg_kv_value( kvs, child_offset, &value_len ); - - if( key_str && value_str ) - vg_kv_write_kv( w, key_str, key_len, value_str, value_len ); - } - - child_offset = vg_kv_next( kvs, child_offset ); - } - - vg_kv_end_block( w ); -} - -bool vg_kv_read_file( vg_kvs *kvs, const c8 *path, vg_stack_allocator *stack ) -{ - vg_stream stream; - if( vg_file_stream_open( &stream, path, VG_STREAM_READ ) ) - { - vg_kvs_init( kvs, stack ); - vg_kv_parser parser; - vg_kv_parser_init( &parser, kvs, 0 ); - vg_kv_parse_stream( &parser, &stream ); - vg_file_stream_close( &stream ); - return 1; - } - else return 0; -} - -bool vg_kv_write_file( vg_kvs *kvs, const c8 *path ) -{ - vg_stream stream; - if( vg_file_stream_open( &stream, path, VG_STREAM_WRITE ) ) - { - vg_kv_write writer; - vg_kv_write_init( &writer, &stream ); - vg_kv_write_tree( &writer, kvs, 0 ); - vg_file_stream_close( &stream ); - return 1; - } - else return 0; -} diff --git a/vg_kv.h b/vg_kv.h deleted file mode 100644 index 41f17b6..0000000 --- a/vg_kv.h +++ /dev/null @@ -1,126 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_kv.c" -#else - -#define VG_KV_PAGE_COUNT 32 -#define VG_KV_APPEND_FRAME NULL - -/* define VG_MSG_TO_KVS to automatically convert from old vg_msg stream to plain text KVs */ - -typedef struct vg_kv vg_kv; -typedef struct vg_kvs vg_kvs; -typedef struct vg_kv_parser vg_kv_parser; -typedef struct vg_kv_write vg_kv_write; - -/* Initialize kvs set and set the allocator for it */ -void vg_kvs_init( vg_kvs *kvs, vg_stack_allocator *stack ); - -/* Initialize KV parser ready to accept buffer fragments - * out_kvs must be initialized - */ -void vg_kv_parser_init( vg_kv_parser *parser, vg_kvs *out_kvs, u32 root_offset ); -void vg_kv_parse_stream( vg_kv_parser *parser, vg_stream *in_stream ); -void vg_kv_parser_print_info( vg_kv_parser *parser ); - -/* returns the type of this KV. - * 0: frame - * 1: kv pair - */ -enum vg_kv_type -{ - k_vg_kv_type_frame = 0, - k_vg_kv_type_pair = 1, - k_vg_kv_type_unused2 = 2, - k_vg_kv_type_unused3 = 3 -}; -u32 vg_kv_type( vg_kvs *kvs, u32 kv_offset ); - -/* get key / values associated with KV pair or only key for a frame. */ -const c8 *vg_kv_key( vg_kvs *kvs, u32 kv_offset, u32 *out_length ); -const c8 *vg_kv_value( vg_kvs *kvs, u32 kv_offset, u32 *out_length ); - -/* get the child KV at index, returns 0 if out of range */ -u32 vg_kv_child( vg_kvs *kvs, u32 root_offset, u32 index ); -u32 vg_kv_next( vg_kvs *kvs, u32 kv_offset ); -u32 vg_kv_find( vg_kvs *kvs, u32 root_offset, const c8 *key ); - -bool vg_kv_read_vu32( vg_kvs *kvs, u32 root_offset, const c8 *key, u32 *default_value, u32 *out_value, u32 len ); -bool vg_kv_read_vf32( vg_kvs *kvs, u32 root_offset, const c8 *key, f32 *default_value, f32 *out_value, u32 len ); -const c8 *vg_kv_read_string( vg_kvs *kvs, u32 root_offset, const c8 *key, const c8 *default_value ); - -/* editing kvs - * if value is NULL, it appends a named frame - * if key is NULL, value must also be NULL. it appends a nameless frame - * if both key and value are set, it appends a KV pair - * returns the new KV offset - */ -u32 vg_kv_append( vg_kvs *kvs, u32 parent_offset, const c8 *key, const c8 *value ); -u32 vg_kv_append_vi32( vg_kvs *kvs, u32 parent_offset, const c8 *key, i32 *values, u32 len ); -u32 vg_kv_append_vu32( vg_kvs *kvs, u32 parent_offset, const c8 *key, u32 *values, u32 len ); -u32 vg_kv_append_vf32( vg_kvs *kvs, u32 parent_offset, const c8 *key, f32 *values, u32 len ); - -/* Writing KV files. w should be initialized with depth 0, and fp to a valid C stream pointer */ -void vg_kv_write_init( vg_kv_write *w, vg_stream *stream ); -void vg_kv_write_block( vg_kv_write *w, const c8 *name, u32 name_length ); -void vg_kv_end_block( vg_kv_write *w ); -void vg_kv_write_kv( vg_kv_write *w, const c8 *key, u32 key_len, const c8 *value, u32 value_len ); - -void vg_kv_write_tree( vg_kv_write *w, vg_kvs *kvs, u32 root_offset ); - -/* Helpers */ -bool vg_kv_read_file( vg_kvs *kvs, const c8 *path, vg_stack_allocator *stack ); -bool vg_kv_write_file( vg_kvs *kvs, const c8 *path ); - -struct vg_kv_parser -{ - vg_kvs *kvs; - u32 token0_start_offset, token0_length, token0_hash, - token1_start_offset, token1_length, token1_hash; - - u32 stat_memory_strings, - stat_source_characters; - - c8 token0_deliminator; - c8 *token0_buffer; - u32 depth; - - struct - { - u32 frame_offset, latest_child_offset; - } - frame_stack[64]; -}; - -struct vg_kvs -{ - vg_stack_allocator *stack; - u32 root_offset; - u32 kv_page_offset, kv_page_count; - u32 stat_memory_pages; -}; - -struct vg_kv -{ - u32 key_info; /* 20 bit hash, 10 bit key length, 2 bit type */ - u32 key_offset; /* 32 bit, indexes kvs->stack.data. same for any other _offset field */ - u32 brother_offset; - - union - { - struct - { - u16 offset_from_key, length; - } - value; - - u32 first_child_offset; - }; -}; - -struct vg_kv_write -{ - vg_stream *stream; - u32 depth; -}; - -#endif diff --git a/vg_lines.c b/vg_lines.c deleted file mode 100644 index e54eb90..0000000 --- a/vg_lines.c +++ /dev/null @@ -1,311 +0,0 @@ -struct vg_lines vg_lines; - -#define VG_LINES_MAX_VERTS 50000 - -VG_API void _vg_lines_register(void) -{ - vg_console_reg_var( "vg_lines", &vg_lines.render, k_var_dtype_i32, VG_VAR_CHEAT ); -} - -VG_API void _vg_lines_init(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_OPENGL ) ); - - vg_lines.vertex_buffer = vg_malloc( VG_LINES_MAX_VERTS*sizeof(struct vg_lines_vert) ); - glGenVertexArrays( 1, &vg_lines.vao ); - glGenBuffers( 1, &vg_lines.vbo ); - glBindVertexArray( vg_lines.vao ); - glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo ); - glBufferData( GL_ARRAY_BUFFER, VG_LINES_MAX_VERTS*sizeof(struct vg_lines_vert), NULL, GL_DYNAMIC_DRAW ); - glBindVertexArray( vg_lines.vao ); - - /* Pointers */ - glVertexAttribPointer( - 0, - 3, - GL_FLOAT, - GL_FALSE, - sizeof( struct vg_lines_vert ), - (void *)0 - ); - glEnableVertexAttribArray( 0 ); - - glVertexAttribPointer( - 1, - 4, - GL_UNSIGNED_BYTE, - GL_TRUE, - sizeof( struct vg_lines_vert ), - (void*)(offsetof( struct vg_lines_vert, colour )) - ); - glEnableVertexAttribArray( 1 ); -} - -void vg_lines_drawall( void ) -{ - shader_debug_lines_use(); - shader_debug_lines_uPv( vg.pv ); - - glBindVertexArray( vg_lines.vao ); - glBindBuffer( GL_ARRAY_BUFFER, vg_lines.vbo ); - glBufferSubData( GL_ARRAY_BUFFER, 0, vg_lines.vertex_count*sizeof(struct vg_lines_vert), vg_lines.vertex_buffer ); - - glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - glBlendEquation( GL_FUNC_ADD ); - - if( vg_lines.render ) - glDrawArrays( GL_LINES, 0, vg_lines.vertex_count ); - - glDisable( GL_BLEND ); - vg_lines.vertex_count = 0; -} - -void vg_line2( line_co from, line_co to, u32 fc, u32 tc ) -{ - if( !vg_lines.enabled ) - return; - - if( vg_lines.vertex_count < VG_LINES_MAX_VERTS ) - { - struct vg_lines_vert *v = &vg_lines.vertex_buffer[ vg_lines.vertex_count ]; - - v3_copy( from, v[0].co ); - v3_copy( to, v[1].co ); - - v[0].colour = fc; - v[1].colour = tc; - - vg_lines.vertex_count += 2; - } -} - -void vg_line( line_co from, line_co to, u32 colour ) -{ - if( !vg_lines.enabled ) - return; - - vg_line2( from, to, colour, colour ); -} - -void vg_line_arrow( line_co co, line_co dir, f32 size, u32 colour ) -{ - if( !vg_lines.enabled ) - return; - - v3f p1, tx, ty, p2, p3; - v3_muladds( co, dir, size, p1 ); - v3_tangent_basis( dir, tx, ty ); - - v3_muladds( p1, dir, -size * 0.125f, p2 ); - v3_muladds( p2, ty, size * 0.125f, p3 ); - v3_muladds( p2, ty, -size * 0.125f, p2 ); - - vg_line( co, p1, colour ); - vg_line( p1, p2, colour ); - vg_line( p1, p3, colour ); -} - -void vg_line_box_verts( boxf box, v3f verts[8] ) -{ - if( !vg_lines.enabled ) - return; - - for( u32 i=0; i<8; i++ ) - for( u32 j=0; j<3; j++ ) - verts[i][j] = i&(0x1< 0; -} - -void vg_loader_render_ring( f32 opacity ) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_OPENGL ) ); - glDisable(GL_CULL_FACE); - glDisable(GL_DEPTH_TEST); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBlendEquation(GL_FUNC_ADD); - - opacity *= opacity; - - shader_vgloader_use(); - shader_vgloader_uInverseRatio( (v2f){1.0f,1.0f} ); - shader_vgloader_uTime( vg.time_real ); - - f32 ratio = (f32)_vg_window.w / (f32)_vg_window.h; - shader_vgloader_uRatio( ratio ); - shader_vgloader_uOpacity( opacity ); - glBindVertexArray( vg_loader.vao ); - glDrawArrays( GL_TRIANGLES, 0, 6 ); - - ui_prerender( &vg_ui.ctx ); - vg_ui_set_screen( _vg_window.w, _vg_window.h ); - - - ui_rect test = { 0, _vg_window.h - 28*2, _vg_window.w, 28 }; - if( vg_loader.information_for_user ) - { - vg_ui.ctx.font = &vgf_default_large; - ui_text( &vg_ui.ctx, test, vg_loader.information_for_user, - 1, k_ui_align_middle_center, 0 ); - vg_ui.ctx.font = &vgf_default_small; - } - - ui_postrender( &vg_ui.ctx, vg.time_frame_delta ); -} - -void vg_loader_render(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_OPENGL ) ); - glViewport( 0,0, _vg_window.w, _vg_window.h ); - glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); - glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); - vg.loader_ring = 1.0f; -} - diff --git a/vg_loader.h b/vg_loader.h deleted file mode 100644 index 59b7c92..0000000 --- a/vg_loader.h +++ /dev/null @@ -1,37 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_loader.c" -#else - -#define VG_ENGINE_READY 0x1 -#define VG_CLIENT_READY 0x2 -#define VG_ALL_READY (VG_ENGINE_READY|VG_CLIENT_READY) -#define VG_READYNESS_MAX 0x8000 -#define VG_CLIENT_READYNESS_MAX 0x80000000 - -struct vg_loader -{ - /* Shutdown steps */ - struct loader_free_step - { - void (*fn_free)(void); - } - step_buffer[16]; - u32 step_count, step_action; - - GLuint vao, vbo; - const char *information_for_user; - - u32 loading_count; -} -extern vg_loader; - -VG_API void _vg_loader_init(void); - -VG_API void _vg_loader_set_user_information( const c8 *information ); -void vg_loader_render(void); -void vg_loader_render_ring( f32 opacity ); - -VG_API void _vg_loader_increment( i32 inc ); -VG_API bool _vg_loader_visible(void); - -#endif diff --git a/vg_log.c b/vg_log.c deleted file mode 100644 index 68ba4df..0000000 --- a/vg_log.c +++ /dev/null @@ -1,260 +0,0 @@ -struct vg_log vg_log; - -static void _vg_log_append_line( const char *str ) -{ - if( vg_log.log_line_count < VG_ARRAY_LEN( vg_log.log ) ) - vg_log.log_line_count ++; - - char *dest = vg_log.log[ vg_log.log_line_current ++ ]; - vg_strncpy( str, dest, VG_ARRAY_LEN(vg_log.log[0]), k_strncpy_allow_cutoff ); - - if( vg_log.log_line_current >= VG_ARRAY_LEN( vg_log.log ) ) - vg_log.log_line_current = 0; -} - -VG_API void _vg_log_pre_init(void) -{ - vg_log.initialized = 1; - - vg_str log_path; - vg_strnull( &log_path, vg_log.crash_path, sizeof(vg_log.crash_path) ); - vg_strcat( &log_path, "crash-" ); - vg_strcatu64( &log_path, time(NULL), 10 ); - vg_strcat( &log_path, "-trace.txt" ); - - if( !vg_strgood( &log_path ) ) - exit(-2); - - VG_ASSERT( VG_MUTEX_INIT( vg_log.lock ) ); -} - -void _vg_logx_va( FILE *file, const char *location, const char *prefix, - const char *colour, - const char *fmt, va_list args ) -{ - if( vg_log.initialized == 0 ) - { - printf( "vg_log not initialized before use. (call vg_log_init()).\n" ); - exit(-1); - return; - } - - VG_MUTEX_LOCK( vg_log.lock ); - - char buffer[4096], line[96]; - vsnprintf( buffer, VG_ARRAY_LEN(buffer), fmt, args ); - -#if defined( VG_ENGINE ) - if( vg_log.plain_output_file ) - { - fputs( prefix, vg_log.plain_output_file ); - fputs( " | ", vg_log.plain_output_file ); - fputs( buffer, vg_log.plain_output_file ); - } -#endif - - int line_length = snprintf( line, 90, "%s%3s" KNRM "|%s ", colour, prefix, colour ); - - for( u32 i=0; i= 90 ) - { - line[ line_length ++ ] = '\n'; - line[ line_length ] = '\0'; - flush = 1; - marker = '.'; - } - - if( c == '\n' ) - { - line[ line_length ] = '\0'; - flush = 1; - } - - if( flush || c == '\0' ) - { - if( location ) - { - -#if defined( VG_MULTITHREAD ) -# if defined( VG_ENGINE ) - fprintf( file, "%s|"KNRM"%.32s", _vg_thread_prefix(), location ); -# else - fprintf( file, KNRM "%.32s", location ); -# endif -#endif - } - - _vg_log_append_line( line ); - fputs( line, file ); - line_length = snprintf( line, 90, "%s " KNRM "%c%s ", colour, marker, colour ); - } - - if( c == '\0' ) break; - if( buffer[i+1] == '\0' ) break; - } - - VG_MUTEX_UNLOCK( vg_log.lock ); -} - -void vg_logx( FILE *file, - const char *location, const char *prefix, - const char *colour, - const char *fmt, ... ) -{ - va_list args; - va_start( args, fmt ); - _vg_logx_va( file, -#if defined( VG_LOG_SOURCE_INFO ) - location, -#else - NULL, -#endif - prefix, colour, fmt, args ); - va_end( args ); -} - -void vg_fatal_error( const char *fmt, ... ) -{ - va_list args; - va_start( args, fmt ); - _vg_logx_va( stderr, NULL, "sos", KRED, fmt, args ); - va_end( args ); - vg_fatal_exit( "VG Assertion (check STDOUT, or the text logfile if enabled)" ); -} - -void vg_fatal_exit( const char *comment ) -{ -#if defined( VG_RELEASE_MODE ) - int fd = open( vg_log.crash_path, O_CREAT | O_WRONLY, 0666 ); - if( fd == -1 ) - exit(-3); -#else - fflush( stdout ); - int fd = STDOUT_FILENO; -#endif - - char buf[ 1024 ]; - vg_str line; - vg_strnull( &line, buf, sizeof(buf) ); - -#if defined( _WIN32 ) - HANDLE process = GetCurrentProcess(); - HANDLE thread = GetCurrentThread(); - CONTEXT context; - STACKFRAME64 stack; - DWORD machine_type; - - RtlCaptureContext( &context ); - ZeroMemory( &stack, sizeof(STACKFRAME64) ); - machine_type = IMAGE_FILE_MACHINE_AMD64; - stack.AddrPC.Offset = context.Rip; - stack.AddrFrame.Offset = context.Rsp; - stack.AddrStack.Offset = context.Rsp; - stack.AddrPC.Mode = AddrModeFlat; - stack.AddrFrame.Mode = AddrModeFlat; - stack.AddrStack.Mode = AddrModeFlat; - - SymInitialize( process, NULL, TRUE ); - SymSetOptions( SYMOPT_LOAD_LINES | SYMOPT_UNDNAME ); - - vg_strcat( &line, "OS: Windows\n" - "Comment: " ); - vg_strcat( &line, comment ); - vg_strcat( &line, "\nStack trace\n" - "-----------------------------------\n" ); - vg_str_flushfd( &line, fd ); - - DWORD frame_number = 0; - while( StackWalk64( machine_type, process, thread, &stack, &context, NULL, SymFunctionTableAccess64, - SymGetModuleBase64, NULL)) - { - if( stack.AddrPC.Offset == 0 ) - break; - - DWORD64 symbol_addr = stack.AddrPC.Offset; - DWORD64 displacement = 0; - char symbol_buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(TCHAR)] = {0}; - SYMBOL_INFO *symbol = (SYMBOL_INFO *)symbol_buffer; - symbol->SizeOfStruct = sizeof(SYMBOL_INFO); - symbol->MaxNameLen = MAX_SYM_NAME; - - char function_name[ MAX_SYM_NAME ] = "Unknown"; - if( SymFromAddr( process, symbol_addr, &displacement, symbol ) ) - { - strncpy( function_name, symbol->Name, MAX_SYM_NAME - 1 ); - function_name[ MAX_SYM_NAME - 1 ] = '\0'; - } - - vg_strcat( &line, " [" ); - vg_strcatu64( &line, frame_number, 10 ); - vg_strcat( &line, "] " ); - vg_strcatu64( &line, symbol_addr, 16 ); - vg_strcat( &line, " " ); - vg_strcat( &line, function_name ); - vg_strcat( &line, "\n" ); - vg_str_flushfd( &line, fd ); - - frame_number ++; - } - - SymCleanup(process); - -#else - vg_strcat( &line, "OS: GNU/Linux\n" - "Comment: " ); - vg_strcat( &line, comment ); - vg_strcat( &line, "\n\nStack trace\n" - "-----------------------------------\n" ); - vg_str_flushfd( &line, fd ); - void *functions[20]; - int count = backtrace( functions, 20 ); - backtrace_symbols_fd( functions, count, fd ); -#endif - -#if defined( VG_RELEASE_MODE ) - vg_strcat( &line, "\n\nVG Console log\n" - "-----------------------------------\n" ); - - int ptr = vg_log.log_line_current; - for( int i=0; i= vg_log.log_line_count ) - ptr = 0; - - bool vt=0; - for( u32 j=0; jrect[0] = 32; - panel->rect[1] = 32; - panel->rect[2] = w; - panel->rect[3] = h; - panel->title = ""; - panel->data = NULL; - panel->minimized = 0; - panel->flags = flags; - panel->ui_cb = NULL; - panel->close_cb = NULL; - panel->min_w = w; - panel->min_h = h; - panel->corner = 0; - - if( flags & VG_MAGI_PERSISTENT ) - strcpy( panel->cmd, vg_console.input ); - - return panel; -} - -void _vg_magi_area_change( i32 d[2] ) -{ - for( u32 i=0; i<_vg_magi.panel_count; i ++ ) - { - struct vg_magi_panel *panel = &_vg_magi.panels[ i ]; - if( panel->corner & 0x1 ) - panel->rect[0] += d[0]; - if( panel->corner & 0x2 ) - panel->rect[1] += d[1]; - } -} - -static void vg_magi_getcorner( ui_rect rect, u32 id, ui_px corner[2] ) -{ - corner[0] = rect[0]; - corner[1] = rect[1]; - if( id&0x1 ) corner[0] += rect[2]; - if( id&0x2 ) corner[1] += rect[3]; -} - -void _vg_magi_render( ui_context *ctx ) -{ - if( _vg_magi.panel_count == 0 ) return; - - u32 highlight = 0xffffffff, - top = _vg_magi.panel_count-1; - - if( _vg_magi.mode == k_magi_mode_none ) - { - for( u32 i=0; i<_vg_magi.panel_count; i ++ ) - { - struct vg_magi_panel *panel = &_vg_magi.panels[ i ]; - if( ui_inside_rect( panel->rect, ctx->mouse ) ) - highlight = i; - } - - /* bring to top */ - if( (highlight < top) && ui_click_down( ctx, UI_MOUSE_ANY ) ) - { - struct vg_magi_panel temp = _vg_magi.panels[ highlight ]; - - for( i32 i=0, j=0; i<_vg_magi.panel_count; i ++ ) - if( i != highlight ) - _vg_magi.panels[ j ++ ] = _vg_magi.panels[ i ]; - - _vg_magi.panels[ top ] = temp; - highlight = top; - } - } - else - { - highlight = top; - struct vg_magi_panel *ptop = &_vg_magi.panels[ top ]; - - if( _vg_magi.mode == k_magi_mode_drag ) - { - ptop->rect[0] = _vg_magi.drag_original[0] + ctx->mouse_delta[0]; - ptop->rect[1] = _vg_magi.drag_original[1] + ctx->mouse_delta[1]; - - ui_rect vp = { 0,0, ctx->area[0],ctx->area[1] }; - - f32 min2 = 9999999.9f; - for( u32 i=0; i<4; i ++ ) - { - ui_px c0[2], c1[2]; - vg_magi_getcorner( vp, i, c0 ); - vg_magi_getcorner( ptop->rect, i, c1 ); - - f32 dx = c0[0]-c1[0], - dy = c0[1]-c1[1], - d2 = dx*dx + dy*dy; - - if( d2 < min2 ) - { - min2 = d2; - ptop->corner = i; - } - } - } - else if( _vg_magi.mode == k_magi_mode_resize ) - { - ui_px dx = ctx->mouse_delta[0]; - if( _vg_magi.drag_left ) dx = -dx; - - ptop->rect[2] = _vg_magi.drag_original[2] + dx; - if( ptop->rect[2] < ptop->min_w ) - { - ptop->rect[2] = ptop->min_w; - dx = ptop->min_w - _vg_magi.drag_original[2]; - } - - if( _vg_magi.drag_left ) - ptop->rect[0] = _vg_magi.drag_original[0] - dx; - - if( !ptop->minimized ) - { - ui_px dy = ctx->mouse_delta[1]; - if( _vg_magi.drag_top ) dy = -dy; - - ptop->rect[3] = _vg_magi.drag_original[3] + dy; - if( ptop->rect[3] < ptop->min_h ) - { - ptop->rect[3] = ptop->min_h; - dy = ptop->min_h - _vg_magi.drag_original[3]; - } - - if( _vg_magi.drag_top ) - ptop->rect[1] = _vg_magi.drag_original[1] - dy; - } - } - - if( ui_click_up( ctx, UI_MOUSE_ANY ) ) - _vg_magi.mode = k_magi_mode_none; - } - - i32 j=0; - for( i32 i=0; i<_vg_magi.panel_count; i ++ ) - { - struct vg_magi_panel *panel = &_vg_magi.panels[ i ]; - - ui_rect title, rect; - ui_split( panel->rect, k_ui_axis_h, 28, 0, title, rect ); - ui_fill( ctx, title, ui_opacity( ui_colour( ctx, k_ui_bg+7 ), 0.9f ) ); - - ui_rect min_button, quit_button; - ui_split( title, k_ui_axis_v, title[2]-title[3], 2, title, quit_button ); - int should_close = ui_button_text( ctx, quit_button, "X", 1 ); - - ui_split( title, k_ui_axis_v, title[2]-title[3], 2, title, min_button ); - int should_min = ui_button_text( ctx, min_button, - panel->minimized? "+": "-", 1 ); - - if( panel->flags & VG_MAGI_PERSISTENT ) - { - ui_text( ctx, title, panel->cmd, 1, k_ui_align_middle_center, - ui_colourcont( ctx, k_ui_bg+7 ) ); - } - else - { - ui_text( ctx, title, panel->title, 1, k_ui_align_middle_center, - ui_colourcont( ctx, k_ui_bg+7 ) ); - } - - ui_fill( ctx, rect, ui_opacity( ui_colour( ctx, k_ui_bg+1 ), 0.7f ) ); - - if( i == highlight ) - { - /* TODO: enable interaction */ - - if( ui_click_down( ctx, UI_MOUSE_MIDDLE ) ) - { - if( panel->flags & VG_MAGI_MOVEABLE ) - { - _vg_magi.mode = k_magi_mode_drag; - rect_copy( panel->rect, _vg_magi.drag_original ); - } - } - else if( ui_click_down( ctx, UI_MOUSE_RIGHT ) ) - { - if( panel->flags & VG_MAGI_RESIZEABLE ) - { - _vg_magi.mode = k_magi_mode_resize; - _vg_magi.drag_top = 0; - _vg_magi.drag_left = 0; - - if( ctx->mouse[0] < panel->rect[0]+panel->rect[2]/2 ) - _vg_magi.drag_left = 1; - if( ctx->mouse[1] < panel->rect[1]+panel->rect[3]/2 ) - _vg_magi.drag_top = 1; - - rect_copy( panel->rect, _vg_magi.drag_original ); - } - } - - ui_outline( ctx, panel->rect, 1, ui_colour( ctx, k_ui_bg+7 ), 0 ); - } - else - { - /* TODO: disable interaction */ - } - - if( !panel->minimized ) - panel->ui_cb( ctx, rect, panel ); - - if( should_close == 1 ) - { - if( panel->close_cb ) - panel->close_cb( panel ); - - continue; - } - - if( should_min == 1 ) - { - panel->minimized ^= 0x1; - if( panel->minimized ) - { - panel->sh = panel->rect[3]; - panel->rect[3] = 32; - } - else - { - panel->rect[3] = panel->sh; - } - } - - if( j != i ) - _vg_magi.panels[ j ] = _vg_magi.panels[ i ]; - - j ++; - } - - _vg_magi.panel_count = j; -} - -void vg_magi_restore(void) -{ - vg_console_exec( 2, (const char *[]){ "magi.conf", "silent" } ); -} - -void vg_magi_save(void) -{ - FILE *fp = fopen( "cfg/magi.conf", "w" ); - - if( !fp ) - { - vg_error( "Cannot open cfg/magi.conf\n" ); - return; - } - - for( u32 i=0; i<_vg_magi.panel_count; i ++ ) - { - struct vg_magi_panel *magi = &_vg_magi.panels[i]; - - if( magi->flags & VG_MAGI_PERSISTENT ) - { - ui_rect vp = {0,0,_vg_window.w,_vg_window.h}; - ui_px c[2], p[2]; - vg_magi_getcorner( vp, magi->corner, c ); - p[0] = magi->rect[0] - c[0]; - p[1] = magi->rect[1] - c[1]; - - fprintf( fp, "%s\n", magi->cmd ); - fprintf( fp, "magi_pos %d %d %d %d %d %d\n", - p[0], p[1], magi->rect[2], - magi->minimized? magi->sh: magi->rect[3], - (i32)magi->minimized, magi->corner ); - } - } - - fclose( fp ); -} - -static int cmd_vg_magi_dim( int argc, const char *argv[] ) -{ - if( !_vg_magi.panel_count ) - { - vg_error( "No active panels to apply that to.\n" ); - return 0; - } - - if( argc == 0 ) - { - vg_error( "Usage: magi_pos x y w h \n" ); - return 0; - } - - struct vg_magi_panel *magi = &_vg_magi.panels[ _vg_magi.panel_count-1 ]; - for( int i=0; i<4; i ++ ) - if( argc >= i+1 ) - magi->rect[i] = atoi( argv[i] ); - - if( argc >= 5 ) - { - magi->minimized = atoi( argv[4] ); - if( magi->minimized ) - { - magi->sh = magi->rect[3]; - magi->rect[3] = 32; - } - } - - if( argc >= 6 ) - { - ui_rect vp = {0,0,_vg_window.w,_vg_window.h}; - ui_px c[2]; - magi->corner = atoi( argv[5] ); - vg_magi_getcorner( vp, magi->corner, c ); - magi->rect[0] += c[0]; - magi->rect[1] += c[1]; - } - - return 1; -} - -VG_API void _vg_magi_register(void) -{ - vg_console_reg_cmd( "magi_pos", cmd_vg_magi_dim, NULL ); -} diff --git a/vg_magi.h b/vg_magi.h deleted file mode 100644 index d986e73..0000000 --- a/vg_magi.h +++ /dev/null @@ -1,58 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_magi.c" -#else - -#define VG_MAGI_MAX_PANELS 8 - -#define VG_MAGI_RESIZEABLE 0x1 -#define VG_MAGI_MOVEABLE 0x2 -#define VG_MAGI_PERSISTENT 0x4 -#define VG_MAGI_ALL (VG_MAGI_RESIZEABLE|VG_MAGI_MOVEABLE|VG_MAGI_PERSISTENT) - -struct vg_magi -{ - struct vg_magi_panel - { - bool minimized; - const char *title; - ui_rect rect; - ui_px sh; - - u32 corner; /* which corner of screen relative to? TL, TR, BL, BR */ - - u32 flags; - void *data; - - char cmd[96]; /* used for persistence */ - ui_px min_w, min_h; - - void(*ui_cb)( ui_context *ctx, ui_rect rect, struct vg_magi_panel *magi ); - void(*close_cb)( struct vg_magi_panel *me ); - } - panels[ VG_MAGI_MAX_PANELS ]; - u32 panel_count; - - enum magi_mode - { - k_magi_mode_none, - k_magi_mode_drag, - k_magi_mode_resize - } - mode; - - bool drag_top, drag_left; - - ui_rect drag_original; - ui_px drag_start[2]; -} -extern _vg_magi; - -VG_API void _vg_magi_register(void); - -struct vg_magi_panel *_vg_magi_open( ui_px w, ui_px h, u32 flags ); -void _vg_magi_render( ui_context *ctx ); -void vg_magi_save(void); -void vg_magi_restore(void); -void _vg_magi_area_change( i32 d[2] ); - -#endif diff --git a/vg_mem.c b/vg_mem.c deleted file mode 100644 index 821213b..0000000 --- a/vg_mem.c +++ /dev/null @@ -1,190 +0,0 @@ -void *vg_malloc( u64 size ) -{ - void *buf = malloc( size ); - if( !buf ) - vg_fatal_error( "Out of memory (OS)\n" ); - return buf; -} - -void vg_free( void *buf ) -{ - free( buf ); -} - -void *vg_realloc( void *buf, u64 size ) -{ - buf = realloc( buf, size ); - if( !buf ) - vg_fatal_error( "Out of memory (OS)\n" ); - return buf; -} - -void vg_zero_mem( void *buffer, u32 length ) -{ - u8 *u8s = buffer; - for( u32 i=0; i> 4; - return m << 4; -} - -u32 vg_align8( u32 s ) -{ - u32 m = (s + 7) >> 3; - return m << 3; -} - -u32 vg_align4( u32 s ) -{ - u32 m = (s + 3) >> 2; - return m << 2; -} - -void vg_stack_init( vg_stack_allocator *stack, void *buffer, u32 capacity, const char *debug_name ) -{ - VG_ASSERT( sizeof( vg_stack_allocator ) == 24 ); - vg_zero_mem( stack, sizeof(vg_stack_allocator) ); - stack->data = buffer? buffer: vg_malloc( capacity ); - stack->capacity = capacity; - stack->flags = buffer? 0: VG_STACK_ALLOCATOR_BUFFER_FROM_MALLOC; -} - -void *vg_stack_allocate( vg_stack_allocator *stack, u32 size, u32 alignment, const char *debug_name ) -{ - if( !stack ) - return vg_malloc( size ); - VG_ASSERT( (alignment >= 1) && (alignment <= 64) ); - VG_ASSERT( ~stack->offset & 0x10000000 ); - VG_ASSERT( ~size & 0x10000000 ); - - u32 new_usage = stack->offset + size + alignment; - if( new_usage > stack->capacity ) - { - vg_fatal_error( "Stack allocator overflow (capacity: %u, used: %u, new_usage: %u)\n", - stack->capacity, stack->offset, new_usage ); - } - while( ((u64)stack->data + stack->offset) & (alignment-1) ) - stack->offset ++; - void *block = stack->data + stack->offset; - stack->offset += size; - return block; -} - -void vg_stack_clear( vg_stack_allocator *stack ) -{ - stack->offset = 0; -} - -void vg_stack_free( vg_stack_allocator *stack ) -{ - VG_ASSERT( stack->flags & VG_STACK_ALLOCATOR_BUFFER_FROM_MALLOC ); - vg_free( stack->data ); - vg_zero_mem( stack, sizeof(vg_stack_allocator) ); -} - -u32 vg_stack_offset( vg_stack_allocator *stack, void *pointer ) -{ - return pointer - stack->data; -} - -void *vg_stack_pointer( vg_stack_allocator *stack, u32 offset ) -{ - return stack->data + offset; -} - -void vg_stack_extend_last( vg_stack_allocator *stack, i32 extra_bytes ) -{ - stack->offset += extra_bytes; -} - -static void vg_mem_print_size( u32 bytes, char buf[32] ) -{ - if( bytes > 1024*1024 ) - snprintf( buf, 32, "%umb", bytes/(1024*1024) ); - else if( bytes > 1024 ) - snprintf( buf, 32, "%ukb", bytes/1024 ); - else - snprintf( buf, 32, "%ub", bytes ); -} - -#if 0 -void vg_mem_dumphex( FILE *fp, void *buffer, u32 offset, u32 bytes ) -{ - fprintf( fp, "buffer at %p, offset +%u, length %u\n", buffer, offset, bytes ); - fprintf( fp, "----------------------------------------------------------------------------\n" ); - - u32 x = 0; - for( u32 i=0; i= 33 && charbyte <= 126 ) - fputc( charbyte, fp ); - else - fputc( charbyte == 0? '.': ' ', fp ); - } - - fputc( '\n', fp ); - x = 0; - } - } - - fprintf( fp, "----------------------------------------------------------------------------\n" ); -} -#endif - -#if !defined( VG_ENGINE ) - -#define VG_TEMP_STACK_MAX 8 -vg_stack_allocator _temp_allocator; -u32 _temp_offsets[ VG_TEMP_STACK_MAX ]; -u32 _temp_stack_depth = 0; - -VG_API u32 _vg_start_temp_frame(void) -{ - if( !_temp_allocator.data ) - vg_stack_init( &_temp_allocator, NULL, VG_MB(20), "Temp allocator" ); - VG_ASSERT( _temp_stack_depth < VG_TEMP_STACK_MAX ); - u32 offset = _temp_allocator.offset; - _temp_offsets[ _temp_stack_depth ++ ] = offset; - return offset; -} - -VG_API void _vg_end_temp_frame( u32 whence ) -{ - VG_ASSERT( _temp_stack_depth ); - _temp_stack_depth --; - VG_ASSERT( _temp_offsets[ _temp_stack_depth ] == whence ); - _temp_allocator.offset = whence; -} - -VG_API void *_vg_temp_alloc( u32 bytes, u32 alignment ) -{ - VG_ASSERT( _temp_stack_depth ); - return vg_stack_allocate( &_temp_allocator, bytes, alignment, NULL ); -} - -VG_API vg_stack_allocator *_vg_temp_stack(void) -{ - return &_temp_allocator; -} - -#endif diff --git a/vg_mem.h b/vg_mem.h deleted file mode 100644 index a2d7810..0000000 --- a/vg_mem.h +++ /dev/null @@ -1,58 +0,0 @@ -#include - -#define VG_KB( X ) (X*1024) -#define VG_MB( X ) (X*1024*1024) -#define VG_GB( X ) (X*1024*1024*1024) -#define VG_STACK_USE_HEAP NULL - -void *vg_malloc( u64 size ); -void *vg_realloc( void *buf, u64 size ); -void vg_free( void *buf ); -void vg_zero_mem( void *buffer, u32 length ); - -typedef struct vg_stack_allocator vg_stack_allocator; - -/* system flags */ -#define VG_STACK_ALLOCATOR_BUFFER_FROM_MALLOC 0x4 - -/* 24 bytes */ -struct vg_stack_allocator -{ - u32 capacity; /* bytes */ - u32 offset; - u16 flags; - u16 unused0, unused1; - void *data; -}; - -#if 0 -void vg_mem_dumphex( FILE *fp, void *buffer, u32 offset, u32 bytes ); -#endif - -/* NOT USED IN THIS FILE */ -u32 vg_align16( u32 s ); -u32 vg_align8( u32 s ); -u32 vg_align4( u32 s ); - -/* If parent_stack is NULL, it will malloc a new stack of size - * If parent_stack is not NULL, it will allocate the new stack inside of this one. This allows it to be seen in the - * metadata as a tree structure. - */ -void vg_stack_init( vg_stack_allocator *stack, void *buffer, u32 capacity, const char *debug_name ); -void *vg_stack_allocate( vg_stack_allocator *stack, u32 size, u32 alignment, const char *debug_name ); -void *vg_stack_allocate_locked(); - -void vg_stack_clear( vg_stack_allocator *stack ); -void vg_stack_free( vg_stack_allocator *stack ); -void vg_stack_set_flags( vg_stack_allocator *stack, u16 append_flags ); -void vg_stack_extend_last( vg_stack_allocator *stack, i32 extra_bytes ); - -u32 vg_stack_offset( vg_stack_allocator *stack, void *pointer ); -void *vg_stack_pointer( vg_stack_allocator *stack, u32 offset ); - -#if !defined( VG_ENGINE ) -VG_API u32 _vg_start_temp_frame(void); -VG_API void _vg_end_temp_frame( u32 whence ); -VG_API void *_vg_temp_alloc( u32 bytes, u32 alignment ); -VG_API vg_stack_allocator *_vg_temp_stack(void); -#endif diff --git a/vg_mem_pool.c b/vg_mem_pool.c deleted file mode 100644 index 68e9d32..0000000 --- a/vg_mem_pool.c +++ /dev/null @@ -1,94 +0,0 @@ -void vg_pool_switch( vg_pool *pool, vg_pool_chain *source, vg_pool_chain *dest, u16 which ) -{ - VG_ASSERT( which ); - - vg_pool_node *pnode = &pool->nodes[ which -1 ]; - if( source ) - { - /* unlink from source list pointers */ - if( source->tail == which ) - source->tail = pnode->l; - if( source->head == which ) - source->head = pnode->r; - - VG_ASSERT( source->count ); - source->count --; - } - - /* unlink self from chain */ - if( pnode->l ) - pool->nodes[ pnode->l -1 ].r = pnode->r; - if( pnode->r ) - pool->nodes[ pnode->r -1 ].l = pnode->l; - pnode->r = 0; - pnode->l = 0; - - /* update destination list head/tail pointers */ - if( dest ) - { - pnode->r = dest->head; - if( dest->head ) - pool->nodes[ dest->head -1 ].l = which; - dest->head = which; - if( dest->tail == 0 ) - dest->tail = which; - - dest->count ++; - VG_ASSERT( dest->count ); // Overflow? in some mad scenario... - } -} - -u16 vg_pool_reference( vg_pool *pool, u16 pool_id, bool increment ) -{ - VG_ASSERT( pool_id ); - VG_ASSERT( pool ); - - vg_pool_node *pnode = &pool->nodes[ pool_id -1 ]; - if( increment ) - { - VG_ASSERT( pnode->refcount < 100 ); // 100 is one of the largest numbers known to man - pnode->refcount ++; - } - else - { - VG_ASSERT( pnode->refcount > 0 ); - pnode->refcount --; - } - - return pnode->refcount; -} - -void vg_pool_init( vg_pool *pool, vg_pool_chain *start_chain, u16 count, vg_stack_allocator *stack ) -{ - u32 size = sizeof(vg_pool_node) * count; - pool->nodes = vg_stack_allocate( stack, size, 8, "Pool Nodes" ); - pool->count = count; - - for( u16 i=0; inodes[ i ].l = id-1; - pool->nodes[ i ].r = id==count? 0: id+1; - pool->nodes[ i ].refcount = 0; - pool->nodes[ i ].unused0 = 0; - } - - start_chain->head = 1; - start_chain->tail = count; - start_chain->count = count; - start_chain->unused0 = 0; -} - -u32 vg_pool_index( vg_pool *pool, u16 id ) -{ - VG_ASSERT( id ); - VG_ASSERT( id <= pool->count ); - return id-1; -} - -u16 vg_pool_next( vg_pool *pool, u16 pool_id, bool right ) -{ - VG_ASSERT( pool_id ); - if( right ) return pool->nodes[ pool_id -1 ].r; - else return pool->nodes[ pool_id -1 ].l; -} diff --git a/vg_mem_pool.h b/vg_mem_pool.h deleted file mode 100644 index 7a518d4..0000000 --- a/vg_mem_pool.h +++ /dev/null @@ -1,39 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_mem_pool.c" -#else - -/* - * This is most straightforwardly a way to maintain stable ID's for various other things, it does not directly manage - * the memory here. - */ - -#define VG_POOL_INCREMENT 1 -#define VG_POOL_DECREMENT 0 - -typedef struct vg_pool vg_pool; -typedef struct vg_pool_node vg_pool_node; -typedef struct vg_pool_chain vg_pool_chain; - -struct vg_pool_node -{ - u16 l, r, refcount, unused0; -}; - -struct vg_pool -{ - vg_pool_node *nodes; - u32 count; -}; - -struct vg_pool_chain -{ - u16 head, tail, count, unused0; -}; - -u32 vg_pool_index( vg_pool *pool, u16 pool_id ); -u16 vg_pool_reference( vg_pool *pool, u16 pool_id, bool increment ); -void vg_pool_init( vg_pool *pool, vg_pool_chain *chain, u16 count, vg_stack_allocator *stack ); -u16 vg_pool_next( vg_pool *pool, u16 pool_id, bool right ); -void vg_pool_switch( vg_pool *pool, vg_pool_chain *source, vg_pool_chain *dest, u16 which ); - -#endif diff --git a/vg_mem_view.c b/vg_mem_view.c deleted file mode 100644 index e77edd4..0000000 --- a/vg_mem_view.c +++ /dev/null @@ -1,527 +0,0 @@ -struct mem_view_data -{ - void *base_buffer; - u32 route[8]; - u32 route_depth; - - bool vis_dirty; - u32 vis_offset; - v4f vis_colour; - f32 vis_inv_max; - GLuint vis_tex; - u32 vis_i, vis_size; - - struct mem_view_info - { - const char *display_name; - u32 buffer_offset, buffer_size; /* offset + size into route[0]->data */ - - bool is_stack; - u32 stack_used_bytes, - stack_children_start, stack_children_count; /* offset + count into this array (infos), children are sorted - by capacity / size */ - } - infos[ 4096 ]; - u32 info_count; - f32 sizes[ 4096 ]; - - f32 vis_data[256*256]; -}; - -void squarey_layout( ui_rect rect, f32 *areas, u32 area_count, void (*cb)( u32, ui_rect, void* ), void *cb_user ) -{ - f32 area_total = 0.0f; - for( u32 i=0; imv->infos[ context->root_id ], - *this_info = &context->mv->infos[ root_info->stack_children_start + idx ]; - - u32 colour; - if( context->root_colour ) colour = context->root_colour; - else colour = ~0xff000000&((idx+5)*0x45d9f3b); - - if( this_info->is_stack ) - { - struct vg_mem_draw_blocks_context next_level = *context; - next_level.depth ++; - next_level.root_colour = colour; - next_level.root_id = root_info->stack_children_start + idx; - - ui_rect subrect; - rect_copy( rect, subrect ); - vg_mem_view_stack( &next_level, subrect ); - } - else - { - ui_fill( context->ui_ctx, tmp, 0x80000000 | colour ); - ui_outline( context->ui_ctx, tmp, -1, 0xff000000 | colour, 0 ); - } - - if( context->depth == 0 ) - { - if( ui_inside_rect( rect, context->ui_ctx->mouse ) ) - { - context->highlight_colour = colour; - context->highlight_id = root_info->stack_children_start + idx; - rect_copy( rect, context->highlight_rect ); - } - } -} - -static void vg_mem_view_stack( struct vg_mem_draw_blocks_context *context, ui_rect rect ) -{ - struct mem_view_info *info = &context->mv->infos[ context->root_id ]; - VG_ASSERT( info->is_stack ); - - if( info->stack_used_bytes ) - { - /* draw unused stack space as dark black */ - if( info->stack_used_bytes < info->buffer_size ) - { - u32 short_side = rect[3] < rect[2]? 1: 0; - f32 p = 1.0f-((f32)info->stack_used_bytes / (f32)info->buffer_size); - ui_px h = (f32)rect[2+short_side^0x1] * p*p; - ui_rect out_box = {rect[0], rect[1]}; - out_box[ 2+short_side^0x1 ] = h; - out_box[ 2+short_side ] = rect[ 2+short_side ]; - - ui_fill( context->ui_ctx, out_box, 0x80000000 ); - - char asize[32]; - vg_mem_print_size( info->buffer_size - info->stack_used_bytes, asize ); - ui_text( context->ui_ctx, out_box, asize, 1, k_ui_align_middle_center, 0 ); - - rect[ short_side^0x1 ] += h; - rect[ 2+short_side^0x1 ] -= h; - } - - if( info->stack_children_count ) - { - squarey_layout( rect, &context->mv->sizes[ info->stack_children_start ], info->stack_children_count, - vg_mem_draw_block_cb, context ); - } - else - ui_fill( context->ui_ctx, rect, 0x80101010 ); - } - else - ui_fill( context->ui_ctx, rect, 0x80000000 ); -} - -static void cb_vg_mem_view( ui_context *ctx, ui_rect rect, struct vg_magi_panel *magi ) -{ - struct mem_view_data *mv = magi->data; - - ui_rect left; - ui_split( rect, k_ui_axis_v, 256+16, 2, left, rect ); - ui_fill( ctx, left, ui_opacity( ui_colour( ctx,k_ui_bg+1 ), 0.8f ) ); - - /* Tree back-tracker */ - { - ui_rect box = { left[0],left[1],left[2],24 }; - u32 new_depth = mv->route_depth; - for( u32 i=0; iroute_depth+1; i ++ ) - { - struct mem_view_info *info = &mv->infos[ mv->route[i] ]; - if( i != mv->route_depth ) - { - if( ui_button_text( ctx, box, info->display_name, 1 ) == 1 ) - { - new_depth = i; - } - } - else - { - ui_fill( ctx, box, ui_colour( ctx, k_ui_bg ) ); - ui_text( ctx, box, info->display_name, 1, k_ui_align_middle_center, 0 ); - } - - box[0] += 8; - box[2] -= 8; - box[1] += 24; - } - mv->route_depth = new_depth; - ui_px v = (mv->route_depth+1)*24; - left[1] += v; - left[3] -= v; - } - - struct vg_mem_draw_blocks_context context = - { - .ui_ctx = ctx, - .mv = mv, - .root_colour = 0, - .root_id = mv->route[ mv->route_depth ], - .highlight_id = 0xffffffff, - .depth = 0 - }; - vg_mem_view_stack( &context, rect ); - - if( context.highlight_id != 0xffffffff ) - { - struct mem_view_info *highlight_info = &mv->infos[ context.highlight_id ]; - - ui_outline( ctx, context.highlight_rect, 1, ui_colour( ctx,k_ui_bg+7 ), 0 ); - ui_info( ctx, left, highlight_info->display_name ); - - char buf[32]; - vg_mem_print_size( highlight_info->buffer_size, buf ); - ui_info( ctx, left, buf ); - - if( mv->vis_offset != highlight_info->buffer_offset ) - { - mv->vis_offset = highlight_info->buffer_offset; - mv->vis_i = 0; - mv->vis_size = highlight_info->buffer_size; - mv->vis_dirty = 1; - mv->vis_inv_max = 1.0f; - - f32 nrm = 2.6f / 255.0f; - mv->vis_colour[0] = (f32)((context.highlight_colour ) & 0xff) * nrm; - mv->vis_colour[1] = (f32)((context.highlight_colour>>8 ) & 0xff) * nrm; - mv->vis_colour[2] = (f32)((context.highlight_colour>>16) & 0xff) * nrm; - mv->vis_colour[3] = 1.0f; - - for( u32 i=0; i<256*256; i++ ) - mv->vis_data[i] = 0.0f; - } - - if( mv->vis_i+1 < mv->vis_size ) - { - const u8 *src = mv->base_buffer + mv->vis_offset; - for( u32 it=0; itvis_i+1 < mv->vis_size); it ++ ) - { - u8 x = src[mv->vis_i], y = src[mv->vis_i+1]; - u32 coord = y*256 + x; - mv->vis_data[ coord ] += 1.0f; - mv->vis_i ++; - } - - f32 median = (f32)mv->vis_i; - mv->vis_inv_max = 1.0f/logf(1.0f+median*2.0f); - mv->vis_dirty = 1; - } - - if( mv->vis_dirty ) - { - glBindTexture( GL_TEXTURE_2D, mv->vis_tex ); - glTexSubImage2D( GL_TEXTURE_2D, 0, 0, 0, 256, 256, GL_RED, GL_FLOAT, mv->vis_data ); - } - - if( highlight_info->is_stack ) - ui_info( ctx, left, "Linear Allocator (expand)" ); - else - ui_info( ctx, left, "Leaf" ); - - ui_rect freq_box = { left[0]+8, left[1], 256,256 }; - - ui_flush( ctx, k_ui_shader_colour, NULL ); - ui_fill_rect( ctx, freq_box, 0xffffffff, (ui_px[4]){ 0,256,256,0 } ); - - // FIXME FIXME -#if 0 - struct ui_batch_shader_data_image_gradient inf = { - .resource = &mv->vis_tex, - .log = 1, - .scale = mv->vis_inv_max - }; - v4_copy( mv->vis_colour, vg_ui.colour ); - ui_flush( ctx, k_ui_shader_grad, &inf ); - v4_copy( (v4f){1,1,1,1}, vg_ui.colour ); - - if( highlight_info->is_stack ) - { - if( ui_click_down( ctx, UI_MOUSE_LEFT ) ) - { - mv->route_depth ++; - mv->route[ mv->route_depth ] = context.highlight_id; - } - } -#endif - } -} - -static void cb_mem_view_close( struct vg_magi_panel *me ) -{ - struct mem_view_data *mv = me->data; - glDeleteTextures( 1, &mv->vis_tex ); - vg_free( me->data ); -} - -static struct -{ - const c8 *name; - vg_stack_allocator *stack; -} -_vg_mem_named_buffers[] = -{ -}; - -int _CB_vg_mem_infosort( const void *a, const void *b ) -{ - const struct mem_view_info *info_a = a, - *info_b = b; - return (i32)(info_a->buffer_size < info_b->buffer_size) - (i32)(info_a->buffer_size > info_b->buffer_size); -} - -static int cmd_vg_mem_view( int argc, const char *argv[] ) -{ - if( argc != 1 ) - { - vg_error( "Usage: vg_mem_view \n" ); - return 0; - } - -#if 0 - for( u32 i=0; ititle = "Memory outliner"; - - struct mem_view_data *mv = vg_malloc(sizeof(struct mem_view_data)); - mv->route[0] = 0; - mv->route_depth = 0; - mv->vis_offset = 0xffffffff; - mv->info_count = 1; - - /* cache all allocations in full tree */ - struct route_frame - { - bool init; - vg_stack_allocator *stack; - struct mem_view_info *info; - u32 buffer_base_offset; - - u32 descend_i; - } - route[8]; - u32 route_depth = 0; - - route[0].init = 0; - route[0].stack = _vg_mem_named_buffers[i].stack; - route[0].info = &mv->infos[ 0 ]; - route[0].buffer_base_offset = 0; - route[0].descend_i = 0; - - mv->infos[0].display_name = _vg_mem_named_buffers[i].name; - mv->infos[0].buffer_offset = 0; - mv->infos[0].buffer_size = _vg_mem_named_buffers[i].stack->capacity; - mv->infos[0].is_stack = 1; - mv->infos[0].stack_used_bytes = _vg_mem_named_buffers[i].stack->offset; - mv->sizes[0] = sqrtf(mv->infos[0].buffer_size); - - mv->base_buffer = _vg_mem_named_buffers[i].stack->data; - - l0:{ - struct route_frame *frame = &route[ route_depth ]; - - if( !frame->init ) - { - frame->init = 1; - frame->info->stack_children_start = mv->info_count; - frame->info->stack_children_count = 0; - - /* create array of all immediate child allocations */ - u32 offset = frame->stack->offset - frame->stack->last_allocation_totalsize; - - if( (frame->stack->offset == 0) || !(frame->stack->flags & VG_STACK_ALLOCATOR_METADATA) ) - goto l1; - - l2:{ - vg_allocation_meta *meta = frame->stack->data + offset; - - if( mv->info_count == VG_ARRAY_LEN(mv->infos) ) - { - vg_error( "Reached maximum allocation infos! (%u)\n", mv->info_count ); - goto e1; - } - - struct mem_view_info *info = &mv->infos[ mv->info_count ]; - info->display_name = meta->name; - info->buffer_offset = frame->buffer_base_offset + offset + sizeof(vg_allocation_meta); - info->buffer_size = meta->size; - - mv->info_count ++; - frame->info->stack_children_count ++; - - if( meta->flags & VG_ALLOCATION_FLAG_IS_STACK ) - { - info->is_stack = 1; - vg_stack_allocator *substack = mv->base_buffer + info->buffer_offset; - - info->stack_used_bytes = substack->offset; - info->stack_children_start = 0; /* deferred to !frame->init */ - info->stack_children_count = 0; - } - else - info->is_stack = 0; - - if( offset ) - { - offset = meta->previous_offset; - goto l2; - } - } - } - - l1: if( frame->descend_i < frame->info->stack_children_count ) - { - struct mem_view_info *info = &mv->infos[ frame->info->stack_children_start + frame->descend_i ]; - frame->descend_i ++; - - if( info->is_stack ) - { - route_depth ++; - - struct route_frame *next_frame = &route[ route_depth ]; - next_frame->init = 0; - next_frame->stack = mv->base_buffer + info->buffer_offset; - next_frame->info = info; - next_frame->buffer_base_offset = info->buffer_offset + sizeof(vg_stack_allocator); - next_frame->descend_i = 0; - - goto l0; - } - else goto l1; - } - else - { - /* Sort children by size, calculate sqrt f32 sizes, and step down */ - qsort( &mv->infos[ frame->info->stack_children_start ], frame->info->stack_children_count, - sizeof(struct mem_view_info), _CB_vg_mem_infosort ); - - for( u32 i=0; iinfo->stack_children_count; i ++ ) - { - u32 index = frame->info->stack_children_start + i; - struct mem_view_info *info = &mv->infos[ index ]; - mv->sizes[ index ] = sqrtf(info->buffer_size); - } - - if( route_depth ) - { - route_depth --; - goto l0; - } - } - } - - vg_success( "Cached %u allocations.\n", mv->info_count ); - - e1: glGenTextures( 1, &mv->vis_tex ); - glBindTexture( GL_TEXTURE_2D, mv->vis_tex ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_R32F, 256,256, 0, GL_RED, GL_FLOAT, NULL ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); - - magi->data = mv; - magi->ui_cb = cb_vg_mem_view; - magi->close_cb = cb_mem_view_close; - return 1; - } - } -#endif - - vg_error( "No named buffer '%s'\n", argv[0] ); - return 0; -} - -static void cmd_vg_mem_view_poll( int argc, const char *argv[] ) -{ - const char *term = argv[ argc-1 ]; - - if( argc == 1 ) - for( u32 i=0; ierror != k_vg_msg_error_OK ) return; - if( msg->cur.co+len > msg->max ){ - msg->error = k_vg_msg_error_overflow; - return; - } - - for( u32 i=0; ibuf[ msg->cur.co ++ ] = buf[i]; - } -} -#endif - -/* read a buffer from msg, rang checked. */ -void vg_msg_rbuf( vg_msg *msg, u8 *buf, u32 len ) -{ - if( msg->error != k_vg_msg_error_OK ) return; - if( msg->cur.co+len > msg->max ){ - msg->error = k_vg_msg_error_overflow; - return; - } - - for( u32 i=0; ibuf[ msg->cur.co ++ ]; - } -} - -#if defined( VG_MSG_LEGACY ) -/* write null terminated string to stream */ -void vg_msg_wstr( vg_msg *msg, const char *str ) -{ - if( msg->error != k_vg_msg_error_OK ) return; - for( u32 i=0;; i++ ){ - vg_msg_wbuf( msg, (u8[]){ str[i] }, 1 ); - if( !str[i] ) break; - } -} -#endif - -/* read null terminated string, range check and generate hash (djb2) */ -const char *vg_msg_rstr( vg_msg *msg, u32 *djb2 ) -{ - if( msg->error != k_vg_msg_error_OK ) return 0; - - u32 hash = 5381, c; - const char *str = (void *)(&msg->buf[ msg->cur.co ]); - - while( (c = msg->buf[ msg->cur.co ++ ]) ){ - if( msg->cur.co >= msg->max ){ - msg->error = k_vg_msg_error_overflow; - return 0; - } - hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ - } - - *djb2 = hash; - return str; -} - -#if defined( VG_MSG_LEGACY ) -/* begin a new frame in message stream */ -void vg_msg_frame( vg_msg *msg, const char *name ) -{ - if( msg->error != k_vg_msg_error_OK ) return; - - msg->cur.depth ++; - vg_msg_wbuf( msg, (u8[]){ k_vg_msg_frame }, 1 ); - vg_msg_wstr( msg, name ); -} - -/* end frame in message stream */ -void vg_msg_end_frame( vg_msg *msg ) -{ - if( msg->error != k_vg_msg_error_OK ) return; - if( !msg->cur.depth ){ - msg->error = k_vg_msg_error_unbalanced; - return; - } - msg->cur.depth --; - vg_msg_wbuf( msg, (u8[]){ k_vg_msg_endframe }, 1 ); -} - -/* write a KV string to stream */ -void vg_msg_wkvstr( vg_msg *msg, const char *key, const char *value ) -{ - vg_msg_wbuf( msg, (u8[]){ k_vg_msg_kvstring }, 1 ); - vg_msg_wstr( msg, key ); - vg_msg_wstr( msg, value ); -} - -/* write a binary block to stream */ -void vg_msg_wkvbin( vg_msg *msg, const char *key, u8 *bin, u32 len ) -{ - vg_msg_wbuf( msg, (u8[]){ k_vg_msg_kvbin }, 1 ); - vg_msg_wstr( msg, key ); - vg_msg_wbuf( msg, (u8 *)(&len), 4 ); - vg_msg_wbuf( msg, bin, len ); -} -#endif - -u32 vg_msg_cmd_array_count( u8 code ) -{ - return ((code & k_vg_msg_array_count_bits)>>2) + 1; -} - -u32 vg_msg_cmd_type_size( u8 code ) -{ - return 0x1 << (code & k_vg_msg_type_size_bits); -} - -/* get the byte count of a sized code */ -u32 vg_msg_cmd_bytecount( u8 code ) -{ - return vg_msg_cmd_array_count( code ) * vg_msg_cmd_type_size( code ); -} - -u8 vg_msg_count_bits( u32 count ) -{ - VG_ASSERT( count <= 16 ); - return ((count-1)<<2); -} - -#if defined( VG_MSG_LEGACY ) -/* write a sized type */ -void vg_msg_wkvnum( vg_msg *msg, const char *key, u8 type, u8 count, void *data ) -{ - u8 code = type | vg_msg_count_bits(count); - vg_msg_wbuf( msg, &code, 1 ); - vg_msg_wstr( msg, key ); - vg_msg_wbuf( msg, data, vg_msg_cmd_bytecount(code) ); -} -#endif - -void vg_msg_init( vg_msg *msg, u8 *buffer, u32 len ) -{ - msg->buf = buffer; - msg->cur.co = 0; - msg->cur.depth = 0; - msg->error = k_vg_msg_error_OK; - msg->max = len; -} - -/* - * The stream reading interface - * ----------------------------------------------------------------------------- - */ - -/* move the cursor through the next message. it will always read in the value or - * create an error if it runs of the end of the stream. every possible command - * must be handled in this function */ -int vg_msg_next( vg_msg *msg, vg_msg_cmd *cmd ) -{ - vg_msg_rbuf( msg, &cmd->code, 1 ); - if( msg->error != k_vg_msg_error_OK ) return 0; - - /* |sized| |count-1| |shift| - * 0 1 0 0 0 1 0 0 0x44 (1 byte, float[2]. So, never used anyway) - * converts to - * 1 0 0 0 0 0 1 0 0x82 - */ - if( cmd->code == 0x44 ) cmd->code = 0x82; - - cmd->key_djb2 = 0; - if( msg->error != k_vg_msg_error_OK ) return 0; - - if( cmd->code == k_vg_msg_frame ){ - cmd->key = vg_msg_rstr( msg, &cmd->key_djb2 ); - msg->cur.depth ++; - } - else if( cmd->code == k_vg_msg_endframe ){ - if( !msg->cur.depth ){ - msg->error = k_vg_msg_error_unbalanced; - return 0; - } - msg->cur.depth --; - } - else if( cmd->code >= k_vg_msg_kv ){ - cmd->key = vg_msg_rstr( msg, &cmd->key_djb2 ); - cmd->value_djb2 = 0; - - if( cmd->code & k_vg_msg_type_base_bits ){ - u32 bytes = vg_msg_cmd_bytecount( cmd->code ); - cmd->value = &msg->buf[ msg->cur.co ]; - msg->cur.co += bytes; - } - else if( cmd->code == k_vg_msg_kvstring ){ - cmd->value = vg_msg_rstr( msg, &cmd->value_djb2 ); - } - else if( cmd->code == k_vg_msg_kvbin ){ - vg_msg_rbuf( msg, (u8 *)(&cmd->len), 4 ); - if( msg->error != k_vg_msg_error_OK ) - return 0; - cmd->value = &msg->buf[ msg->cur.co ]; - msg->cur.co += cmd->len; - } - else - msg->error = k_vg_msg_error_unhandled_cmd; - - if( msg->cur.co > msg->max ) - msg->error = k_vg_msg_error_overflow; - } - else - msg->error = k_vg_msg_error_unhandled_cmd; - - if( msg->error != k_vg_msg_error_OK ) - return 0; - else - return 1; -} - -#if defined( VG_MSG_LEGACY ) -/* move through the frame(and subframes) until we fall out of it */ -int vg_msg_skip_frame( vg_msg *msg ) -{ - vg_msg_cmd cmd; - - u32 start_depth = msg->cur.depth; - while( vg_msg_next( msg, &cmd ) ) - if( msg->cur.depth < start_depth ) - return 1; - return 0; -} - -/* - * A more friendly but slower interface - * ----------------------------------------------------------------------------- - */ - -/* moves to a frame, - * returns 0 if drops out of scope or ends. - */ -int vg_msg_seekframe( vg_msg *msg, const char *name ) -{ - vg_msg_cursor orig = msg->cur; - vg_msg_cmd cmd; - while( vg_msg_next( msg, &cmd ) ){ - if( msg->cur.depth < orig.depth ){ - msg->cur = orig; - return 0; - } - if( msg->cur.depth != orig.depth+1 ) - continue; - if( cmd.code == k_vg_msg_frame ) - if( !name || VG_STRDJB2_EQ( name, cmd.key, cmd.key_djb2 ) ) - return 1; - } - - msg->cur = orig; - return 0; -} -#endif - -/* - * Convert any type integral type to u64 - */ -u64 vg_msg_cast_to_u64( const void *src, u8 src_base, u8 src_size ) -{ - if( src_base == k_vg_msg_float ) - { - return (u64)vg_msg_cast_to_f64( src, src_base, src_size ); - } - else - { - u64 a = 0; - memcpy( &a, src, src_size ); - return a; - } -} - -/* - * Convert any integral type to i64 - */ -i64 vg_msg_cast_to_i64( const void *src, u8 src_base, u8 src_size ) -{ - if( src_base == k_vg_msg_float ) - { - return (i64)vg_msg_cast_to_f64( src, src_base, src_size ); - } - else - { - u64 a = 0; - memcpy( &a, src, src_size ); - - if( (src_base == k_vg_msg_signed) && (src_size != 8) ){ - /* extend sign bit */ - u64 sign_bit = 0x1llu << ((src_size*8)-1); - if( a & sign_bit ) - a |= (0xffffffffffffffffllu << (64-__builtin_clzll( a ))); - } - - return *((i64*)&a); - } -} - -/* - * Convert any integral type to f64 - */ -f64 vg_msg_cast_to_f64( const void *src, u8 src_base, u8 src_size ) -{ - if( src_base == k_vg_msg_float ) - { - if( src_size == 4 ) - { - f32 a = 0; - memcpy( &a, src, sizeof(a) ); - return (f64)a; - } - else if( src_size == 8 ) - { - f64 a = 0; - memcpy( &a, src, sizeof(a) ); - return a; - } - else return 0.0; - } - else - return (f64)vg_msg_cast_to_i64( src, src_base, src_size ); -} - -#if defined( VG_MSG_LEGACY ) -/* - * Convert any full integral type code to another - * Passing in non-integral codes is undefined - */ -void vg_msg_cast( const void *src, u8 src_code, void *dst, u8 dst_code ) -{ - if( src_code == dst_code ){ - memcpy( dst, src, vg_msg_cmd_bytecount( src_code ) ); - } - else { - u32 src_n = vg_msg_cmd_array_count( src_code ), - dst_n = vg_msg_cmd_array_count( dst_code ), - src_s = vg_msg_cmd_type_size( src_code ), - dst_s = vg_msg_cmd_type_size( dst_code ), - src_b = src_code & k_vg_msg_type_base_bits, - dst_b = dst_code & k_vg_msg_type_base_bits; - - memset( dst, 0, dst_s * dst_n ); - - for( u32 i=0; icur; - while( vg_msg_next( msg, cmd ) ){ - if( msg->cur.depth < orig.depth ){ - msg->cur = orig; - return 0; - } - if( msg->cur.depth > orig.depth ) - continue; - if( cmd->code > k_vg_msg_kv ){ - if( VG_STRDJB2_EQ( key, cmd->key, cmd->key_djb2 ) ){ - msg->cur = orig; - return 1; - } - } - } - msg->error = k_vg_msg_error_OK; - msg->cur = orig; - return 0; -} - -#if defined( VG_MSG_LEGACY ) -/* - * Read a integral KV out to dst, and perform conversion if needed - * dst is always defined, if its not found its set to 0 - */ -int vg_msg_getkvintg( vg_msg *msg, const char *key, u8 type, void *dst, void *default_value ) -{ - vg_msg_cmd cmd; - if( vg_msg_getkvcmd( msg, key, &cmd ) ) - { - vg_msg_cast( cmd.value, cmd.code, dst, type ); - return 1; - } - else - { - if( default_value ) - memcpy( dst, default_value, vg_msg_cmd_bytecount(type) ); - else - memset( dst, 0, vg_msg_cmd_bytecount(type) ); - - return 0; - } -} - -/* helper for reading string kvs. returns NULL if not found */ -const char *vg_msg_getkvstr( vg_msg *msg, const char *key ) -{ - vg_msg_cmd cmd; - if( vg_msg_getkvcmd( msg, key, &cmd ) ) - return cmd.value; - else - return NULL; -} -#endif - -#if defined( VG_MSG_LEGACY ) -int vg_msg_getkvvecf( vg_msg *msg, const char *key, u8 type, - void *v, void *default_value ) -{ - vg_msg_cmd cmd; - if( vg_msg_getkvcmd( msg, key, &cmd ) ) - { - vg_msg_cast( cmd.value, cmd.code, v, type ); - return 1; - } - else if( default_value ) - vg_msg_cast( default_value, type, v, type ); - - return 0; -} -#endif - - -/* debug the thing */ -void vg_msg_print( vg_msg *msg, u32 len ) -{ - if( msg->error != k_vg_msg_error_OK ){ - printf( "Message contains errors\n" ); - return; - } - - vg_msg b; - vg_msg_init( &b, msg->buf, len ); - - vg_msg_cmd cmd; - while( vg_msg_next( &b, &cmd ) ) - { - if( cmd.code == k_vg_msg_frame ) - { - for( u32 i=0; i (%u bytes)\n", cmd.key, cmd.len ); - else { - u32 base = cmd.code & k_vg_msg_type_base_bits, - count = vg_msg_cmd_array_count( cmd.code ), - size = vg_msg_cmd_type_size( cmd.code ); - - printf( "'%s': ", cmd.key ); - - if( count > 1 ) printf( "{ " ); - - for( u32 i=0; i 1 ) printf( " }" ); - printf( "\n" ); - } - } - } -} - -#if defined( VG_MSG_TO_KVS ) -bool vg_kvs_append_from_legacy_msg2( vg_kvs *kvs, u32 root, void *buffer, u32 len ) -{ - vg_msg b; - vg_msg_init( &b, buffer, len ); - - u32 frame_stack[ 16 ]; - u32 frame_depth = 0; - frame_stack[0] = root; - - vg_msg_cmd cmd; - while( vg_msg_next( &b, &cmd ) ) - { - if( cmd.code == k_vg_msg_frame ) - { - VG_ASSERT( frame_depth < VG_ARRAY_LEN(frame_stack) ); - u32 next = vg_kv_append( kvs, frame_stack[frame_depth++], cmd.key, NULL ); - } - else - { - if( cmd.code == k_vg_msg_endframe ) - { - VG_ASSERT( frame_depth ); - frame_depth --; - } - else if( cmd.code == k_vg_msg_kvstring ) - { - vg_kv_append( kvs, frame_stack[frame_depth], cmd.key, cmd.value ); - } - else if( cmd.code == k_vg_msg_kvbin ) - { - vg_warn( "Unsupported legacy kv code: binary blob.\n" ); - } - else - { - u32 base = cmd.code & k_vg_msg_type_base_bits, - count = vg_msg_cmd_array_count( cmd.code ), - size = vg_msg_cmd_type_size( cmd.code ); - c8 formatted[ 1024 ]; - vg_str value_str; - vg_strnull( &value_str, formatted, sizeof(formatted) ); - - for( u32 i=0; i= VG_ARRAY_LEN( _vg_opt.args ) ) - { - vg_error( "Too many arguments!\n" ); - exit(-1); - } - - _vg_opt.arg_count = 0; - for( u32 i=1; iarg = NULL; - arg->value = NULL; - arg->arg_len = 0; - arg->used = 0; - if( v[0] == '-' ) - { - if( v[1] == '-' ) - { - arg->arg = v+2; - arg->type = k_arg_long; - u32 k=2; - while( v[ k ] ) - { - if( v[ k ] == '=' ) - { - arg->arg_len = k-2; - arg->value = v + k + 1; - arg->type = k_arg_assign; - goto next; - } - k ++; - } - } - else - { - arg->arg = v+1; - arg->type = k_arg_singles; - u32 k=1; - while( v[k] ) - k ++; - arg->arg_len = k-1; - arg->used = ~((0x1<arg_len)-1); - } - } - else - { - arg->type = k_arg_regular; - arg->value = v; - arg->arg = v; - } -next:; - } -} - -bool _vg_opt_check(void) -{ - if( vg_long_opt( "help", "Helps you" ) ) - { - for( u32 i=0; i<_vg_opt.info_count; i ++ ) - { - struct vg_opt_reg *reg = &_vg_opt.infos[i]; - const char *desc = reg->desc? reg->desc: ""; - - if( reg->type == k_opt_flag ) - printf( "-%c %s\n", reg->alias_c, desc ); - - if( reg->type == k_opt_opt ) - printf( "-%c %s\n", reg->alias_c, desc ); - - if( reg->type == k_opt_long_flag ) - printf( "--%-21s %s\n", reg->alias, desc ); - - if( reg->type == k_opt_long_opt ) - { - char temp[32]; - snprintf( temp, 32, "--%s=", reg->alias ); - printf( "%-23s %s\n", temp, desc ); - } - } - exit(0); - } - - bool errors = 0; - for( u32 i=0; i<_vg_opt.arg_count; i ++ ) - { - struct vg_arg *arg = &_vg_opt.args[ i ]; - if( arg->used != 0xffffffff ) - { - if( arg->type == k_arg_singles ) - { - for( u32 j=0; j<32; j ++ ) - { - if( !(arg->used & (0x1<arg[j] ); - } - } - else - vg_error( "Unknown option '%s'\n", arg->arg ); - errors = 1; - } - } - - return errors == 0; -} - -bool vg_opt( char c, const char *desc ) -{ - _vg_opt_reg( (struct vg_opt_reg){ .alias=NULL, .alias_c=c, .desc=desc, .type=k_opt_flag } ); - for( u32 i=0; i<_vg_opt.arg_count; i ++ ) - { - struct vg_arg *arg = &_vg_opt.args[ i ]; - if( arg->type == k_arg_singles ) - { - for( u32 j=0; jarg_len; j ++ ) - { - if( arg->arg[j] == c ) - { - arg->used |= 0x1 << j; - return 1; - } - } - } - } - return 0; -} - -const char *vg_opt_arg( char c, const char *desc ) -{ - _vg_opt_reg( (struct vg_opt_reg){ .alias=NULL, .alias_c=c, .desc=desc, .type=k_opt_opt } ); - for( u32 i=0; i+1<_vg_opt.arg_count; i ++ ) - { - struct vg_arg *arg = &_vg_opt.args[ i ]; - if( arg->type == k_arg_singles ) - { - for( u32 j=0; jarg_len; j ++ ) - { - if( arg->arg[j] == c ) - { - arg->used |= 0x1 << j; - return _vg_opt.args[ i + 1 ].value; - } - } - } - } - return NULL; -} - -bool vg_long_opt( char *name, const char *desc ) -{ - _vg_opt_reg( (struct vg_opt_reg){ .alias=name, .alias_c=0, .desc=desc, .type=k_opt_long_flag } ); - for( u32 i=0; i<_vg_opt.arg_count; i ++ ) - { - struct vg_arg *arg = &_vg_opt.args[ i ]; - if( arg->type == k_arg_long ) - { - if( !strcmp( arg->arg, name ) ) - { - arg->used = 0xffffffff; - return 1; - } - } - } - return 0; -} - -const char *vg_long_opt_arg( char *name, const char *desc ) -{ - _vg_opt_reg( (struct vg_opt_reg){ .alias=name, .alias_c=0, .desc=desc, .type=k_opt_long_opt } ); - for( u32 i=0; i<_vg_opt.arg_count; i ++ ) - { - struct vg_arg *arg = &_vg_opt.args[ i ]; - if( arg->type == k_arg_assign ) - { - if( !strncmp( arg->arg, name, arg->arg_len ) ) - { - arg->used = 0xffffffff; - return arg->value; - } - } - } - return NULL; -} - -const char *vg_arg( u32 index ) -{ - u32 count = 0; - for( u32 i=0; i<_vg_opt.arg_count; i ++ ) - { - struct vg_arg *arg = &_vg_opt.args[ i ]; - if( arg->type == k_arg_regular ) - { - count ++; - if( index+1 == count ) - { - arg->used = 0xffffffff; - return arg->value; - } - } - } - return NULL; -} diff --git a/vg_opt.h b/vg_opt.h deleted file mode 100644 index bd8f498..0000000 --- a/vg_opt.h +++ /dev/null @@ -1,23 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_opt.c" -#else - -void _vg_opt_init( int argc, const char *argv[] ); -bool _vg_opt_check(void); - -/* Example: see if -c is set */ -bool vg_opt( char c, const char *desc ); - -/* Example: get -c *value* */ -const char *vg_opt_arg( char c, const char *desc ); - -/* Example see if --big is set */ -bool vg_long_opt( char *name, const char *desc ); - -/* Example: get --big=value */ -const char *vg_long_opt_arg( char *name, const char *desc ); - -/* Example: get regular_thing */ -const char *vg_arg( u32 index ); - -#endif diff --git a/vg_perlin.h b/vg_perlin.h deleted file mode 100644 index 56d240c..0000000 --- a/vg_perlin.h +++ /dev/null @@ -1,10 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_perlin.c" -#else - -f32 vg_perlin_noise2d( f32 x, f32 y, int seed ); -f32 vg_perlin_noise1d( f32 v, int seed ); -f32 vg_perlin_fract_1d( f32 v, f32 freq, int octaves, int seed ); -f32 vg_perlin_fract_2d( f32 x, f32 y, f32 freq, int octaves, int seed ); - -#endif diff --git a/vg_platform.h b/vg_platform.h deleted file mode 100644 index f8db5bd..0000000 --- a/vg_platform.h +++ /dev/null @@ -1,106 +0,0 @@ -#if !defined( VG_IMPLEMENTATION ) - -/* - * Tiers: each tier can only access functions from the tier below it. - * All client code is considered to be above VG_TIER_HL - */ - -#define VG_TIER_0 -/* Tier0: subroutines - * - * Operate on simple structures or arrays, and return a code to indicate status or void. Operates purely in stack - * area. Each function should be likely inlineable, each invocation will take up a MAXIMUM of 8kb - * - * Example functions: - * v3_add( v3f a, v3f b, v3f d ); - * u32 i32_to_string( i32 i, char buffer[32] ); - * - * Restrictions: - * No dynamic allocation - * No dynamic fatal errors (only assertions allowed) - * No globals / external interaction - * No multi-threading - */ - -#define VG_TIER_1 -/* Tier1: Allocating routines - * - * These functions are ones who require dynamic memory, or operating sizes larger than 8kb. They will either; - * - Take some allocator as a parameter eg. vg_stack_allocator - * - Or reference a structure that happens to have an allocator attached earlier, like vg_str. - * - * The only fatal errors that are allowed here are out of memory errors (eg. malloc fails, or an allocator overflows). - * - * Example functions: - * void vg_strcat( vg_str *str, const c8 *substr ); - * - * Restrictions: - * No globals - * Must be thread safe / does not START anything asynchronously, but can be an async call itself. - */ - -#define VG_TIER_2 -/* Tier2: Composite allocating routines - * - * Very similar to tier 1, except will allocate in multiple places and/or make use of scratch allocators. - * These functions typically take a vg_mem_context structure which defines how exactly memory is to be allocated. - */ - -#define VG_API -#define VG_API_INTERNAL -/* Tier HL: Global, high level system functions - * - * These functions typically do not take any allocators, as they are pre-determined by the systems. Raw data and - * allocations are innaccessible to client code, and functions on this level typically return a handle of small size. - * (usually from a pool, or circular buffer). - * - * These types of functions are often asynchronous - * - * Example functions: - * u32 vg_texture_handle( const c8 *path ); - * void vg_texture_release( u32 id ); - */ - -#define VG_ENGINE_HOOK( X ) -#define VG_STACK_INLINE - -typedef unsigned char u8; -typedef char c8; -typedef unsigned short int u16; -typedef unsigned int u32; -typedef unsigned long int u64; -typedef char i8; -typedef signed short int i16; -typedef signed int i32; -typedef signed long int i64; -typedef float f32; -typedef double f64; -typedef unsigned char bool; - -/* TODO: delete these!!!!!!! */ -typedef i32 v2i[2]; -typedef i32 v3i[3]; -typedef i32 v4i[4]; -typedef f32 v2f[2]; -typedef f32 v3f[3]; -typedef f32 v4f[4]; -typedef v2f m2x2f[2]; -typedef v3f m3x3f[3]; -typedef v3f m4x3f[4]; -typedef v4f m4x4f[4]; -typedef v3f boxf[2]; - -/* anything compiled against VG shall implement vg_fatal_exit() somewhere. */ -void vg_fatal_exit( const char *comment ); -void vg_fatal_error( const char *fmt, ... ); - -#define VG_ASSERT( ITEM, ... ) \ - if( !( ITEM ) ) { \ - vg_fatal_error( "Assertion failed: " VG_LOG_MCSTR(ITEM) "\n" VG_LOG_WHERE "\n" );\ - } - -#define VG_MIN( A, B ) ((A)<(B)?(A):(B)) -#define VG_MAX( A, B ) ((A)>(B)?(A):(B)) -#define VG_ARRAY_LEN( A ) (sizeof(A)/sizeof(A[0])) - -#endif diff --git a/vg_profiler.h b/vg_profiler.h deleted file mode 100644 index 8c57e3f..0000000 --- a/vg_profiler.h +++ /dev/null @@ -1,14 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_profiler.c" -#else - -VG_API void _vg_profiler_register(void); -VG_API void _vg_profiler_init(void); - -VG_API u32 _vg_profiler_create( const c8 *name, f32 default_budget_ms ); -VG_API void _vg_profiler_tick( u32 profiler_id ); -VG_API void _vg_profiler_enter_block( u32 profiler_id, const c8 *block_name ); -VG_API void _vg_profiler_exit_block( u32 profiler_id ); -VG_API void _vg_profiler_draw( ui_context *ctx, u32 profiler_id, f32 budget_ms, ui_rect panel, i32 dir, bool normalize ); - -#endif diff --git a/vg_pxfont.h b/vg_pxfont.h deleted file mode 100644 index b978235..0000000 --- a/vg_pxfont.h +++ /dev/null @@ -1,257 +0,0 @@ -/* Font buffer generated from source file: '/home/harry/Documents/vg/src/fonts/vg_font.png' */ -0xffff0000,0,0,0,0,0,0,0, -0xffff0000,0,0,0,0,0,0,0, -0xffff0000,0,0,0,0,0,0,0, -0xffff0000,0,0,0,0,0,0,0, -0xffff0c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30, -0xffff0810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810, -0xffff0000,0,0,0,0,0,0,0, -0xffff0040,0x8000c0,0x1000140,0x18001c0,0x2000240,0x28002c0,0x3000340,0x38003c0, -0xffff0000,0,0,0,0,0,0,0, -0xffff0000,0,0,0,0,0,0,0, -0xffff0000,0,0,0,0,0,0,0, -0xffff0000,0,0,0,0,0,0,0, -0xffff0810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810, -0xffff0c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30, -0xffff0000,0,0,0,0,0,0,0, -0xffff0000,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30, -0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810, -0x400040,0x400040,0x400040,0x400040,0x400040,0x400040,0x400040,0x400040, -0x40,0x8000c0,0x1000140,0x18001c0,0x2000240,0x28002c0,0x3000340,0x38003c0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810,0x8100810, -0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30,0xc300c30, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x6600000,0x1800000,0x180,0,0,0,0, -0,0x6600000,0x1800000,0x180,0x1c00380,0,0,0, -0xc300180,0x6600660,0x3c00660,0x3c00180,0x38001c0,0x800000,0,0x60, -0x8100180,0x2200660,0x7e00660,0x7e00080,0x30000c0,0x2a00180,0,0x60, -0x800180,0xff0,0x60000e0,0x6600000,0x6000060,0x1c00180,0,0xe0, -0x180,0xff0,0x60000c0,0x6600000,0x6000060,0x1c00180,0,0xc0, -0x180,0x660,0x7c00180,0x3200000,0x6000060,0x2a00ff0,0x7e0,0x180, -0x180,0x660,0x3e00180,0x3800000,0x6000060,0x800ff0,0x7e0,0x180, -0,0xff0,0x600300,0x6c00000,0x6000060,0x180,0,0x300, -0,0xff0,0x600700,0x6600000,0x6000060,0x180,0,0x700, -0x8100180,0x660,0x7e00660,0x7f00000,0x30000c0,0x180,0x1800000,0x1800600, -0xc300180,0x660,0x3c00660,0x3b00000,0x38001c0,0,0x1800000,0x1800600, -0,0,0x1800000,0,0x1c00380,0,0x1000000,0, -0,0,0x1800000,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x3c00180,0x3c003c0,0xe007c0,0x3c007c0,0x3c003c0,0,0x600000,0x60003e0, -0x7e00380,0x7e007e0,0x1e007e0,0x7e007e0,0x7e007e0,0,0xe00000,0x70007f0, -0x6600380,0x4600060,0x3e00600,0x6000060,0x6600660,0x1800180,0x1c007e0,0x3800630, -0xcf00180,0x600060,0x7600600,0x6000060,0x6600660,0x1800180,0x38007e0,0x1c00030, -0xdf00180,0xe001e0,0xe6007c0,0x7c000c0,0x7e007e0,0,0x7000000,0xe000f0, -0xfb00180,0x1c001e0,0xff007e0,0x7e000c0,0x7e007e0,0,0x7000000,0xe001e0, -0xf300180,0x3800060,0xff00060,0x6600180,0x6600060,0x1800180,0x38007e0,0x1c00180, -0x6600180,0x7000060,0x600060,0x6600180,0x6600060,0x1800180,0x1c007e0,0x3800000, -0x7e003c0,0x7e007e0,0x6007e0,0x7e00300,0x7e007e0,0x80,0xe00000,0x7000180, -0x3c003c0,0x7e003c0,0x6003c0,0x3c00300,0x3c003c0,0,0x600000,0x6000180, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x3c0,0x7c001c0,0x78007e0,0x3e003e0,0x66007e0,0x7e00660,0x6000660,0x3c003c0, -0x3c007e0,0x7e003e0,0x7c007e0,0x3e007f0,0x66007e0,0x3e00660,0x6000ff0,0x7e007e0, -0x7e00660,0x6600700,0x6e00600,0x3000e00,0x6600180,0x6006c0,0x6000ff0,0x6600e70, -0x300660,0x6600600,0x6600600,0x3000c00,0x6600180,0x6007c0,0x6000db0,0x6600c30, -0x3b00660,0x7e00600,0x66007c0,0x3e00c00,0x7e00180,0x600780,0x6000db0,0x6600c30, -0x7f007e0,0x7c00600,0x66007c0,0x3e00c70,0x7e00180,0x600780,0x6000db0,0x6600c30, -0x67007e0,0x6600600,0x6600600,0x3000c30,0x6600180,0x6007c0,0x6000c30,0x6600c30, -0x7f00660,0x6600700,0x6e00600,0x3000e30,0x6600180,0xe006c0,0x6000c30,0x6600e70, -0x3e00660,0x7e003e0,0x7c007e0,0x30007e0,0x66007e0,0x7c00660,0x7e00c30,0x66007e0, -0x660,0x7c001c0,0x78007e0,0x30003c0,0x66007e0,0x7800660,0x3e00c30,0x66003c0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0x3c0,0x3c0,0x1800000, -0x7c003c0,0x3c003c0,0x7e00660,0x6600c30,0xc300660,0x7e003c0,0x60003c0,0x3c00000, -0x7e007e0,0x7e007e0,0x7e00660,0x6600c30,0xe700660,0x3e00380,0x60001c0,0x3c00000, -0x6600660,0x6600600,0x1800660,0x6600c30,0x6600660,0xc00300,0x70000c0,0x6600000, -0x6600660,0x6600600,0x1800660,0x6600c30,0x7e00660,0xc00300,0x30000c0,0x4200000, -0x6600660,0x7e007c0,0x1800660,0x6600db0,0x3c007e0,0x1800300,0x18000c0,0, -0x7e006e0,0x7c003e0,0x1800660,0x6600db0,0x3c003e0,0x1800300,0x18000c0,0, -0x7c006e0,0x6c00060,0x1800660,0x6600db0,0x7e00060,0x3000300,0xc000c0,0, -0x6000670,0x6e00060,0x1800660,0x7e00ff0,0x6600060,0x3000300,0xe000c0,0, -0x60007b0,0x66007e0,0x18007e0,0x3c00ff0,0xe7007e0,0x7c00380,0x6001c0,0, -0x60003d0,0x66003c0,0x18003c0,0x1800660,0xc3003c0,0x7e003c0,0x6003c0,0xff0, -0,0,0,0,0,0x3c0,0x3c0,0xff0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x3000000,0,0,0,0,0,0,0, -0x3000000,0,0,0,0,0,0,0, -0x1800000,0x6000000,0x600000,0,0x6000180,0x1800600,0,0, -0x800000,0x6000000,0x600000,0,0x6000180,0x1800600,0x6000000,0, -0x1c0,0x60003c0,0x6003c0,0x1e003c0,0x6000000,0x600,0x60007e0,0x3c003c0, -0x3e0,0x7c007e0,0x3e007e0,0x3e007e0,0x6000380,0x38006e0,0x6000ff0,0x7e007e0, -0x60,0x7e00600,0x7e00660,0x3000660,0x7c00180,0x18007c0,0x6000db0,0x7e00660, -0x3e0,0x6600600,0x66006e0,0x3000660,0x7e00180,0x1800780,0x6000db0,0x6600660, -0x660,0x6600600,0x66007c0,0x3000660,0x6600180,0x18007c0,0x6000c30,0x6600660, -0x660,0x6600600,0x6600700,0x3e007e0,0x6600180,0x18006c0,0x6000c30,0x6600660, -0x7e0,0x7e007e0,0x7e003e0,0x3c003e0,0x6600180,0x1800660,0x7c00c30,0x66007e0, -0x3e0,0x7c003c0,0x3e001c0,0x3000060,0x6600180,0x1800660,0x3c00c30,0x66003c0, -0,0,0,0x70007e0,0,0x3800000,0,0, -0,0,0,0x60003c0,0,0x3000000,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0xc0,0x300,0, -0,0,0,0,0,0x1c0,0x1800380,0, -0,0,0x3000000,0,0,0x180,0x1800180,0x1ce0, -0x3c003c0,0x1c001c0,0x3000660,0xc300c30,0xc300660,0x7e00180,0x1800180,0x3ff0, -0x7e007e0,0x3c003c0,0x3000660,0xc300c30,0xe700660,0x7e00380,0x18001c0,0x7303ff0, -0x6600660,0x3000300,0x3c00660,0x6600c30,0x7e00660,0xe00700,0x18000e0,0xfb03ff0, -0x6600660,0x3000380,0x3c00660,0x6600c30,0x3c00660,0x1c00700,0x18000e0,0xdf03ff0, -0x6600660,0x30001c0,0x3000660,0x6600db0,0x3c00660,0x3800380,0x18001c0,0xce01fe0, -0x6600660,0x30000c0,0x3000660,0x3c00db0,0x7e007e0,0x7000180,0x1800180,0x1fe0, -0x7e007e0,0x30003c0,0x3c007e0,0x3c00ff0,0xe7003e0,0x7e00180,0x1800180,0xfc0, -0x7c003e0,0x3000380,0x1c003c0,0x1800660,0xc300060,0x7e001c0,0x1800380,0x300, -0x6000060,0,0,0,0x7e0,0xc0,0x300,0, -0x6000060,0,0,0,0x3c0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x100,0x800100,0x800000,0,0,0,0, -0,0x100,0x800100,0x800000,0,0,0,0, -0,0,0,0,0x2000040,0,0x1ff81ff8,0x1ff81ff8, -0,0x100,0x800100,0x800000,0x4000020,0,0x1c381e78,0x1c381c38, -0,0x100,0x800100,0x800000,0x8000010,0,0x18181c78,0x18181818, -0,0,0,0,0x8000010,0,0x19981c78,0x1b981f98, -0,0x100,0x800100,0x800000,0x8000010,0,0x13081e78,0x1f981f98, -0x1b66db6,0x6d800100,0x800100,0x800000,0x68000016,0x1800180,0x12081e78,0x1f181e18, -0,0,0,0,0x8000010,0,0x10481e78,0x1e381e18, -0x1000000,0x800100,0x8001b6,0x6d806db6,0x8000010,0x1000080,0x10c81e78,0x1c781f98, -0x1000000,0x800100,0x800000,0,0x8000010,0x1000080,0x19981e78,0x18f81f98, -0,0,0,0,0x8000010,0,0x18181c38,0x18181818, -0x1000000,0x800100,0x800000,0,0x4000020,0x1000080,0x1c381c38,0x18181c38, -0x1000000,0x800100,0x800000,0,0x2000040,0x1000080,0x1ff81ff8,0x1ff81ff8, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, diff --git a/vg_pxfont_thin.h b/vg_pxfont_thin.h deleted file mode 100644 index e796af6..0000000 --- a/vg_pxfont_thin.h +++ /dev/null @@ -1,1025 +0,0 @@ -/* Font buffer generated from source file: 'vg/src/fonts/vg_font_thin_3.png' */ -0xc3002800,0x8000020,0x8100000,0,0x3c003c18,0x100018,0,0, -0,0,0,0,0,0,0,0, -0x81102800,0x1c000020,0x10080010,0x2,0x20800424,0x180c18,0x30000000,0, -0x18000000,0,0,0,0,0,0,0, -0x102822,0x22202020,0x20040010,0x2,0x20800442,0x81018,0x8000000,0x38, -0x24000000,0,0,0,0,0,0,0, -0x100022,0x20525000,0x20045410,0x4,0x20400400,0x1018,0x8000000,0x8001044, -0x440000fe,0x10380000,0,0,0,0,0,0, -0x10007f,0x20245000,0x200438fe,0x8,0x20200400,0x2018,0x4621010,0x10000804, -0x440000fe,0x387c0000,0,0,0,0,0,0, -0x100022,0x1c086000,0x20043810,0x8,0x20200400,0x4018,0x2920000,0x20000404, -0x540000fe,0x38fe0000,0,0,0,0,0,0, -0x100022,0x2109400,0x20045410,0x3c0010,0x20100400,0x4018,0x28c0000,0x403c0208, -0x540000fe,0x7cfe0000,0,0,0,0,0,0, -0x22,0x2248800,0x20040010,0x20,0x20080400,0x2018,0x4000000,0x40000210, -0x5c0000fe,0x7cfe0000,0,0,0,0,0,0, -0x7f,0x224a9400,0x10080000,0x20,0x20080400,0x1018,0x8000010,0x203c0400, -0xfe,0xfe7c0000,0,0,0,0,0,0, -0x100022,0x1c046200,0x8100000,0x10002000,0x20000400,0x1018,0x8001010,0x10000810, -0xfe,0xfe380000,0,0,0,0,0,0, -0x22,0x8000000,0,0x20000000,0x3c003c00,0xff000c00,0x30000020,0x8001000, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x81000000,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xc3000000,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x18303c70,0x7c383844,0x7c784440,0x44443c78,0x38787cfe,0x42828282,0x82fe3c10,0x3c7c407c, -0x387c3838,0,0,0,0,0,0,0, -0x24484048,0x40404444,0x10084840,0x44444244,0x44448210,0x42828282,0x82024630,0x42084840, -0x44044444,0,0,0,0,0,0,0, -0x24484044,0x40404044,0x10084840,0xaa644244,0x44448010,0x42449244,0x82044650,0x42104840, -0x40084444,0,0,0,0,0,0,0, -0x42484044,0x40404044,0x10085040,0xaa544244,0x44448010,0x42449228,0x82084a10,0x4204840, -0x40084444,0,0,0,0,0,0,0, -0x42784044,0x78705c7c,0x10086040,0xaa544278,0x54787c10,0x42449210,0x7e105a10,0x8784878, -0x78107c3c,0,0,0,0,0,0,0, -0x7e444044,0x40404444,0x10085040,0x924c4240,0x4c440210,0x4228aa28,0x2205210,0x10043c04, -0x44104404,0,0,0,0,0,0,0, -0x42444044,0x40404444,0x10084840,0x924c4240,0x44440210,0x4228aa44,0x2406210,0x20040804, -0x44204404,0,0,0,0,0,0,0, -0x42444048,0x40404444,0x10104840,0x92444240,0x42448210,0x4228aa82,0x82806210,0x40040844, -0x44204444,0,0,0,0,0,0,0, -0x42783c70,0x7c403844,0x7c60447c,0x82443c40,0x3a447c10,0x3c104482,0x7cfe3c7c,0x7e780838, -0x38203838,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x400004,0x40,0x4060,0,0x40,0,0x4,0x7000000, -0,0,0,0,0,0,0,0, -0x400004,0x380040,0x10084020,0,0x40,0,0x3008,0x73000000, -0,0,0,0,0,0,0,0, -0x400004,0x440040,0x4020,0,0x40,0,0x4810,0x4500606c, -0x98000000,0,0,0,0,0,0,0, -0x38783c3c,0x38403878,0x30384820,0x6c383838,0x38383c78,0x44428244,0x447c4810,0x4806706c, -0xe4e00000,0,0,0,0,0,0,0, -0x4444044,0x44404444,0x10085020,0x92444444,0x44444040,0x44429228,0x44083010,0x420c786c, -0xe2900000,0,0,0,0,0,0,0, -0x3c444044,0x44784444,0x10086020,0x92444444,0x44403840,0x44249210,0x4410000e,0x42d87c6c, -0xf28e0000,0,0,0,0,0,0,0, -0x44444044,0x78404444,0x10086020,0x82444444,0x44400440,0x44249228,0x44200000,0x7e70786c, -0x2820000,0,0,0,0,0,0,0, -0x44444044,0x40404444,0x10085020,0x82444464,0x44404440,0x4424aa44,0x44400000,0x20706c, -0x44820000,0,0,0,0,0,0,0, -0x3c783c3c,0x3c403c44,0x3808481c,0x82443858,0x3c403838,0x38184444,0x3c7c0000,0x606c, -0x38fe0000,0,0,0,0,0,0,0, -0,0x400400,0x80000,0x40,0x4000000,0,0x4000000,0, -0,0,0,0,0,0,0,0, -0,0x400400,0x300000,0x40,0x6000000,0,0x8000000,0, -0,0,0,0,0,0,0,0, -0,0x807800,0,0x40,0x4000000,0,0x70000000,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0x1818,0x1818,0x7c1e3c3c,0,0,0, -0,0xdc000000,0,0,0,0,0,0, -0xfe103882,0x82441060,0x3c002424,0x3c002424,0x82214242,0x18001800,0,0x1000, -0xe80000,0x90000000,0,0,0,0,0,0, -0x82284444,0x44442890,0x42000000,0x42000000,0x80010000,0x38181c7e,0x3c7c6c6c,0x6c6c2810, -0xdca80000,0xdc6c0000,0,0,0,0,0,0, -0x82288228,0x28284490,0x52521052,0x5a5a185a,0xaedd8868,0x783c1e7e,0x40eaae,0xee828228, -0x88e80022,0x84aa0000,0,0,0,0,0,0, -0x82448210,0x101044f0,0x52911091,0x52911091,0xa4898888,0x787e1e3c,0x3c5eeaae,0xee101044, -0xc8ae0042,0xdcaa0000,0,0,0,0,0,0, -0x82448228,0x28107c88,0x5a5a185a,0x52521052,0xb4898e8e,0x387e1c18,0x12eaae,0xee929282, -0x429e,0xaa0000,0,0,0,0,0,0, -0x82824444,0x44108288,0x42000000,0x42000000,0x80018a8a,0x18001800,0x3c1eeeee,0xee1000ee, -0xd0e04240,0x70ee0000,0,0,0,0,0,0, -0xfefe3882,0x821082f0,0x3c002424,0x3c002424,0x80016e8e,0,0x8282,0x8282aa28, -0x90407e20,0x40820000,0,0,0,0,0,0, -0,0,0x1818,0x1818,0,0,0,0x1038, -0x9c400000,0x70000000,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xe0700000,0,0,0,0,0,0,0x800000, -0x80000000,0,0,0,0,0,0,0, -0x8010800a,0x200,0x100,0x2008000,0,0,0x1f80001f,0x81400000, -0xc0070040,0x38000000,0,0,0,0,0,0, -0x8010800a,0x703,0x100,0x4004000,0,0x4,0x10040000,0x82200000, -0x60080040,0x4000000,0,0x1e0,0,0,0,0, -0x800a,0x1040884,0x80380100,0x8002000,0,0x8,0x10020000,0x84100000, -0x20080040,0x4000000,0,0x210,0,0,0,0, -0x8000,0x1041044,0x84440000,0x8002000,0x400000,0x8,0x10020000,0x80000000, -0x80040,0x4000000,0,0x408,0,0xc03,0xf0000000,0, -0x8000,0x1041004,0x88440000,0x10001008,0x400000,0x10,0x10010000,0x80000000, -0x80040,0x4000000,0x200,0x80408,0x1e000000,0xffc1e07,0xf8000000,0, -0x8000,0x7ff1003,0x10440000,0x1000102a,0x400000,0x20,0x10008000,0x80000000, -0x100040,0x2038408,0x800400,0x40008,0x21000000,0xffc1e0f,0xfc000000,0, -0x8000,0x1040800,0x20440000,0x1000101c,0x400000,0x20,0x10008000,0x80000000, -0x100040,0x2044400,0x800,0x20008,0x40800000,0xffc3f0f,0xfc000000,0, -0x8000,0x1040700,0x40780000,0x1000101c,0x7fc0001,0xf8000040,0x10004000,0x80000000, -0x600040,0x1842400,0x1000,0x10010,0x4c800000,0xffc3f0f,0xfc000000,0, -0x8000,0x1040080,0x80880000,0x1000102a,0x400000,0x80,0x10002000,0x80000000, -0x100040,0x2041800,0x2001,0xf8008060,0x52800000,0xffc7f8f,0xfc000000,0, -0x8000,0x1040041,0x18850000,0x10001008,0x400000,0x80,0x10002000,0x80000000, -0x100040,0x2000000,0x4000,0x4080,0x52800000,0xffc7f8f,0xfc000000,0, -0,0x1040042,0x24820000,0x10001000,0x400000,0x100,0x10001000,0x80000000, -0x80040,0x4000000,0x2000,0x8000,0x52800000,0xffc7f8f,0xfc000000,0, -0x80100000,0x7ff1044,0x24850000,0x8002000,0x400000,0x200,0x10000800,0x80000000, -0x80040,0x4000000,0x1001,0xf8010000,0x52800000,0xffcffcf,0xfc000000,0, -0x80108000,0x1040880,0x24888000,0x8002000,0xc00,0x180200,0x10000800,0x80000000, -0x80040,0x4000000,0x800800,0x20080,0x4d000000,0xffcffc7,0xf8000000,0, -0xe0708000,0x1040700,0x18704000,0x4004000,0x800,0x180400,0x10000400,0x80000000, -0x80040,0x4000008,0x800400,0x40080,0,0xffcffc3,0xf0000000,0, -0,0x1040200,0,0x2008000,0x1000,0,0x1f80001f,0x8000fff0, -0x70000,0x38000000,0x1000200,0x80000,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xc03e01f,0x87c07f83,0xf01f0410,0x7f07e041,0x84006304,0x81e07e0,0x1c07e01f,0x8ff84088, -0x8808808,0x808ffc1e,0xc01e07,0xf84007f8,0x1f07f81e,0x1e00000,0,0, -0x12041020,0x4204004,0x208410,0x8002042,0x4009486,0x8210410,0x22041020,0x40804088, -0x8808808,0x80800421,0x1402100,0x10420400,0x20800821,0x2100000,0,0, -0x21041040,0x4104004,0x400410,0x8002042,0x4009486,0x8408408,0x41040840,0x804084, -0x10808410,0x80800842,0x82404080,0x20420400,0x40001040,0x84080000,0,0, -0x21041040,0x4104004,0x400410,0x8002044,0x4009485,0x8408408,0x41040840,0x804084, -0x10888220,0x80801042,0x80404080,0x40420400,0x40002040,0x84080000,0,0, -0x40841040,0x4104004,0x400410,0x8002048,0x4009485,0x8408408,0x41040840,0x804084, -0x10888140,0x80802044,0x80400080,0x80420400,0x40002021,0x4080000,0,0, -0x4087e040,0x4104004,0x400410,0x8002070,0x4009484,0x88408410,0x49041020,0x804084, -0x10888080,0x41804044,0x80400101,0x4207e0,0x5e00401e,0x4080000,0,0, -0x40841040,0x4107e07,0xe04f87f0,0x8002070,0x4009484,0xc84087e0,0x4507e01f,0x804084, -0x10888080,0x3e808048,0x80400203,0xe0220010,0x61004021,0x2180000,0,0, -0x7f840840,0x4104004,0x408410,0x8002048,0x4008884,0x48408400,0x43041000,0x80804082, -0x20948080,0x810048,0x80400400,0x101f8008,0x40808040,0x81e80000,0,0, -0x40840840,0x4104004,0x408410,0x8002044,0x4008884,0x28408400,0x41040800,0x40804082, -0x20948140,0x820050,0x80400800,0x8020008,0x40808040,0x80080000,0,0, -0x40840840,0x4104004,0x408410,0x8002042,0x4008884,0x28408400,0x40840800,0x40804082, -0x20948220,0x840050,0x80401000,0x8020008,0x40810040,0x80080000,0,0, -0x40840840,0x4104004,0x408410,0x8002042,0x4008884,0x18408400,0x40040800,0x40804082, -0x20948410,0x80880060,0x80402000,0x8020408,0x40810040,0x80080000,0,0, -0x40841020,0x4204004,0x210410,0x8004041,0x2008084,0x18210400,0x22040840,0x80802101, -0x40948808,0x41080021,0x404000,0x10020210,0x21010021,0x4100000,0,0, -0x4087e01f,0x87c07f84,0x1e0410,0x7f078040,0x81f88084,0x81e0400,0x1c04083f,0x801e00, -0x80630808,0x3e0ffc1e,0x3f87f87,0xe00201e0,0x1e01001e,0x3e00000,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x40000,0x80000,0x400,0x40,0x6000000,0,0,0x2000000, -0,0,0x80000,0,0,0,0,0, -0x40000,0x80000,0x400,0x40,0x2000000,0,0,0x2000000, -0,0,0x1001e0,0,0,0,0,0, -0x40000,0x80001,0xe0000400,0x4002040,0x2000000,0,0,0x2000000, -0,0xc,0x207c60,0,0,0,0,0, -0x40000,0x80002,0x10000400,0x40,0x2000000,0,0,0x2000000, -0,0x12,0x4060a0,0,0,0,0,0, -0x40000,0x80004,0x8000400,0x40,0x2000000,0,0,0x2000000, -0,0x12,0x806120,0x83803b8,0xf000000,0,0,0, -0x3e05e01e,0x1e81e04,0x1e85c0,0xc00e042,0x2003b85,0xe01e05e0,0x1e85f03f,0x3f04084, -0x4808410,0x4087f80c,0x806200,0x1c3c03b8,0x90877000,0,0,0, -0x1061021,0x2182104,0x218620,0x4002044,0x2004446,0x10210610,0x21860840,0x82004084, -0x4808410,0x40801000,0x806040,0x383e03b8,0xe0488800,0,0,0, -0x1040840,0x84084084,0x408410,0x4002048,0x2004444,0x8408408,0x40840040,0x2004082, -0x8888220,0x40802000,0x406044,0x703f03b8,0xe0484800,0,0,0, -0x3d040840,0x4084087,0xe0408410,0x4002070,0x2004444,0x8408408,0x4084003e,0x2004082, -0x8888140,0x40804000,0x3c604e,0xe03f83b8,0xf0483c00,0,0,0, -0x43040840,0x4087f04,0x408410,0x4002050,0x2004444,0x8408408,0x40840001,0x2004081, -0x10888080,0x40808000,0x7fc7,0xc03f83b8,0xf8480400,0,0,0, -0x41040840,0x4084004,0x408410,0x4002048,0x2004044,0x8408408,0x40840000,0x82004081, -0x10888140,0x40810000,0x7fc3,0x803f03b8,0x480400,0,0,0, -0x41040840,0x84084004,0x408410,0x4002044,0x2004044,0x8408408,0x40840000,0x82004081, -0x10948220,0x40820000,0x1,0x3e03b8,0x20480400,0,0,0, -0x43061021,0x2182084,0x218410,0x4002042,0x1004044,0x8210610,0x21840041,0x1002100, -0xa0a28410,0x21840000,0,0x3c03b8,0x10880400,0,0,0, -0x3c85e01e,0x1e81f04,0x1e8410,0xe002041,0xf04044,0x81e05e0,0x1e84003e,0xf01e00, -0x40410410,0x1e87f800,0,0x3803b8,0xf0ffc00,0,0,0, -0,0x4,0x8000,0x2000,0,0x400,0x800000,0, -0,0x800000,0,0,0,0,0,0, -0,0x4,0x8000,0x4000,0,0x400,0x800000,0, -0,0x800000,0,0,0,0,0,0, -0,0x4,0x410000,0x18000,0,0x400,0xc00000,0, -0,0x41000000,0,0,0,0,0,0, -0,0x8,0x3e0000,0,0,0x400,0x800000,0, -0,0x3e000000,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0x4,0x400000,0x40040,0,0, -0,0,0,0,0,0,0,0, -0xc03f,0x804804c,0xc0c07f0,0x1f00000a,0xa01f00,0xa00a0,0x3f81fc3f,0xc3fc0e00, -0x1c0000,0,0,0,0,0,0,0, -0xffc1e07f,0x8c0cc0ce,0x1c1e0ff8,0x20800011,0x1102080,0x110110,0x40420240,0x24021e00, -0x1e0000,0,0,0x80000,0,0,0,0, -0xffc1e0e1,0xc6186186,0x18330c18,0x40400000,0x4040,0,0x40420240,0x24023e00, -0xe01f07fc,0x1f87f873,0x87387387,0x701400c0,0x1b800000,0x7,0x38000000,0, -0xc0c330c0,0xc3303303,0x30330c18,0x48428808,0x2884642,0x68060268,0x40000200,0x7e01, -0xf01f87fc,0x400f2,0x493cf3c8,0x8808120,0x21000000,0x9,0x24000000,0, -0xc0c330c0,0xc1e01e03,0xf0618c38,0x48448408,0x4844844,0x84080484,0x5381ba11,0xd07e03, -0xf81f87fc,0x400f2,0x493cf3c8,0x8808210,0x21000000,0x1040009,0x24000000,0, -0xc0c618c0,0xc0c00c01,0xe0618ff8,0x48488208,0x8824848,0x82080882,0x51021211,0x1107e07, -0xfc1f83f8,0x1f84fcf2,0x493cf3c0,0x80080408,0x19024e00,0x2042669,0x24000000,0, -0xc0c618c0,0xc1e01e00,0xc0ffcffc,0x48448408,0x4844844,0x84080484,0x51021211,0xc11c3e07, -0xfc1f01f0,0x84f2,0x493cf3c8,0x88888804,0x54400,0x4044889,0x24000000,0, -0xc0c618c0,0xc3303300,0xc0ffcc0c,0x4e426806,0x2684842,0x88080288,0x51021211,0x41141e07, -0xfc1e00e0,0x84f2,0x493cf3c8,0x88888804,0x1a054400,0x8f86489,0x24000000,0, -0xc0cc0ce1,0xc6186180,0xc0c0cc0c,0x40400000,0x4040,0,0x4d02120d,0xc11c0e00, -0x1c0000,0x1f80fcf3,0xcf3cf3c0,0x80000f3c,0x22074440,0x4400428f,0x3c000000,0, -0xffcffc7f,0x8c0cc0c0,0xc0c0cffc,0x20800011,0x1102080,0x110110,0x40000200,0, -0,0x80,0x48048048,0x8808120,0x22053440,0x42002c68,0x4000000,0, -0xffcffc3f,0x8048040,0xc0c0c7f8,0x1f00000a,0xa01f00,0xa00a0,0x40000200,0, -0,0x80,0x48048048,0x8948120,0x2180007f,0xc1000008,0x4000000,0, -0,0,0,0x4,0x400000,0x40040,0,0, -0,0,0,0x801e0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xfc003f00,0,0,0,0,0,0,0, -0,0,0,0,0,0,0xc000,0, -0xfc003f00,0,0,0,0,0,0,0, -0,0,0,0,0,0,0x1e000,0, -0xc0000300,0xf00001ce,0,0xc0000,0,0x30000,0xc0000,0xc0000000, -0,0,0,0,0x3ffc000,0x3ff,0xc003f000,0, -0xc0000300,0xf00001ce,0,0xc0000,0,0x30000,0x1c0000,0xe0000000, -0,0,0,0,0x3ffc000,0x3ff,0xc0073800,0, -0xc0000300,0xf00001ce,0,0x3f000f,0,0x30000,0x380000,0x70000000, -0,0,0,0x70,0x3ffc030,0x3ff,0xc00e1c00,0, -0xc0000300,0xf00001ce,0,0x7f801f,0x80000000,0x30000,0x700000,0x38000000, -0,0,0,0xf0,0x3800038,0x1,0xc01c0e00,0, -0,0xf00000cc,0x38070,0xffc03f,0xc0000fc0,0x30000,0xe00000,0x1c000000, -0,0,0,0xe0,0x380003c,0x1,0xc0380700,0, -0,0xf00000cc,0x38070,0x1e1e039,0xc0001fc0,0x30000,0xe00000,0x1c000000, -0,0,0,0x1c0,0x380001c,0x1,0xc0300300,0, -0,0xf0000000,0x38070,0x3c0f039,0xc0303ff0,0,0x1c00000,0xe000000, -0x3000,0,0,0x1c0,0x380001e,0x1,0xc0000000,0, -0,0xf0000000,0x38070,0x3807039,0xc0703870,0,0x1c00000,0xe000000, -0x3000,0,0,0x380,0x380000e,0x1,0xc0000000,0, -0,0xf0000000,0x38070,0x3800039,0xc0f03870,0,0x3c00000,0xf0000c0, -0x3000,0,0,0x380,0x380000f,0x1,0xc0000000,0, -0,0xf0000000,0x38070,0x380003f,0xc1e03870,0,0x3800000,0x70000c0, -0x3000,0,0,0x700,0x3800007,0x80000001,0xc0000000,0, -0,0xf0000000,0x3fffff,0x380001f,0x83c03870,0,0x3800000,0x7000ccc, -0x3000,0,0,0xe00,0x3800003,0xc0000001,0xc0000000,0, -0,0xf0000000,0x3fffff,0x380000f,0x7803870,0,0x3800000,0x7000ccc, -0x3000,0,0,0xe00,0x3800001,0xc0000001,0xc0000000,0, -0,0xf0000000,0x3fffff,0x3c00000,0xf003870,0,0x3800000,0x70003f0, -0x3000,0,0,0x1c00,0x3800000,0xe0000001,0xc0000000,0, -0,0xf0000000,0x38070,0x3e00000,0x1e003ff0,0,0x3800000,0x70003f0, -0x3000,0,0,0x1c00,0x3800000,0xe0000001,0xc0000000,0, -0,0xf0000000,0x38070,0x1ff8000,0x3c003fc0,0,0x3800000,0x70003f0, -0x3ffff0,0x3,0xffc00000,0x3800,0x3800000,0x70000001,0xc0000000,0, -0,0xf0000000,0x38070,0xffc000,0x78007fc0,0,0x3800000,0x70003f0, -0x3ffff0,0x3,0xffc00000,0x7000,0x3800000,0x38000001,0xc0000000,0, -0,0xf0000000,0x38070,0x7fe000,0xf000f9e0,0,0x3800000,0x7000ccc, -0x3000,0,0,0x7000,0x3800000,0x3c000001,0xc0000000,0, -0,0x60000000,0x38070,0xf001,0xe000f0f0,0,0x3800000,0x7000ccc, -0x3000,0,0,0xe000,0x3800000,0x1c000001,0xc0000000,0, -0,0x60000000,0x38070,0x7003,0xc3c0e07b,0,0x3800000,0x70000c0, -0x3000,0,0,0xe000,0x3800000,0xe000001,0xc0000000,0, -0,0x60000000,0x38070,0x7007,0x87e0e03f,0,0x3800000,0x70000c0, -0x3000,0,0,0x1c000,0x3800000,0xe000001,0xc0000000,0, -0,0x60000000,0x38070,0x700f,0xff0e01f,0,0x3c00000,0xf000000, -0x3000,0,0,0x3c000,0x3800000,0x7000001,0xc0000000,0, -0,0,0x3fffff,0x701e,0xe70e01f,0,0x3c00000,0xf000000, -0x3000,0,0,0x38000,0x3800000,0x3800001,0xc0000000,0, -0xc0000300,0,0x3fffff,0x380703c,0xe70e03f,0x80000000,0x1c00000,0xe000000, -0x3000,0,0,0x70000,0x3800000,0x1c00001,0xc0000000,0, -0xc0000300,0,0x3fffff,0x3c0f038,0xe70e07b,0xc0000000,0x1c00000,0xe000000, -0x3000,0,0,0x70000,0x3800000,0x1c00001,0xc0000000,0, -0xc0000300,0x60000000,0x38070,0x1e1f030,0xe70f0f1,0xe0000000,0xe00000,0x1c000000, -0,0xf00000,0x180,0xe0000,0x3800000,0xe00001,0xc0000000,0, -0xc0000300,0xf0000000,0x38070,0xffe000,0xff07fe0,0xf0000000,0xe00000,0x1c000000, -0,0xf00000,0x3c0,0xe0000,0x3800000,0xe00001,0xc0000000,0, -0xfc003f00,0xf0000000,0x38070,0x7fc000,0x7e07fc0,0x70000000,0x700000,0x38000000, -0,0xe00000,0x3c0,0x1c0000,0x3800000,0x700001,0xc0000000,0, -0xfc003f00,0x60000000,0x38070,0x3f8000,0x3c01f00,0x30000000,0x380000,0x70000000, -0,0x1c00000,0x180,0x1c0000,0x3ffc000,0x3003ff,0xc0000000,0, -0,0,0x38070,0xc0000,0,0,0x1c0000,0xe0000000, -0,0x3800000,0,0,0x3ffc000,0x3ff,0xc0000000,0xffffff00, -0,0,0x38070,0xc0000,0,0,0xc0000,0xc0000000, -0,0x3000000,0,0,0x3ffc000,0x3ff,0xc0000000,0xffffff00, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xc00000,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xe00000,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xf00000,0x3f000070,0xfc000,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0xf80000,0x7f000070,0xfe000,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x7c0000,0xff000070,0xff000,0,0,0,0,0x3fc, -0,0,0,0,0,0,0,0, -0x1c0000,0xf0000070,0xf000,0,0,0,0,0x7fe, -0,0,0,0,0,0,0,0, -0xc0000,0xe0000070,0x7000,0,0,0,0,0xfff, -0,0,0,0,0,0x30000030,0,0, -0,0xe0000070,0x7000,0,0,0,0,0x1e07, -0x80000000,0,0,0,0,0x78000078,0,0, -0,0xe0000070,0x7800,0,0,0,0,0x3c03, -0xc0000000,0,0,0xf000,0x3fc0000,0xfc0000fc,0x3ff00,0, -0x1,0xe0000070,0x7800,0,0,0,0,0x3801, -0xc0000000,0,0,0x1f800,0xfff0001,0xce0001ce,0x7ff80,0, -0x1,0xe0000070,0x7800,0,0,0xc00,0,0xc0003801, -0xc003fc00,0,0xffff,0xf003fc00,0x1fff8003,0x87000387,0xe01c0,0, -0x1,0xc0000070,0x3800,0,0,0x1c00,0,0xe0003801, -0xc007fe00,0,0xffff,0xf003fc00,0x3fffc003,0x3000303,0x1c00e0,0, -0x3,0xc0000070,0x3c00,0xfc07000,0xc00000c0,0x3800,0,0x70000001, -0xc00e0700,0,0xffff,0xf007fe00,0x7fffe000,0,0x380070,0, -0x3,0x80000070,0x1c00,0x1fe07001,0xe00001e0,0x7000,0,0x38000001, -0xc01c0380,0,0xffff,0xf007fe00,0x7fffe000,0,0x300030,0, -0x7,0x80000070,0x1e00,0x3ff07001,0xe00001e0,0xe000,0,0x1c000001, -0xc03801c0,0,0xffff,0xf00fff00,0xfffff000,0xc0000cc0,0xc0303c30,0xc3cc000, -0x3f,0x80000070,0x1fc0,0x38787000,0xc00000c0,0x1c000,0,0xe000003, -0xc03000c0,0,0xffff,0xf00fff00,0xfffff000,0xc0001cc0,0xe0307c30,0x1c7ce000, -0x3e,0x70,0x7c0,0x383c7000,0,0x38000,0,0x7000007, -0x8030f0c0,0,0xffff,0xf01fff80,0xfffff000,0xc00038c0,0x7030e030,0x38e07000, -0x3e,0x70,0x7c0,0x381ff000,0,0x70000,0,0x380007f, -0x31f8c0,0,0xffff,0xf01fff80,0xfffff000,0xc00070c0,0x3830c030,0x70c03800, -0x7,0x80000070,0x1e00,0x380fe000,0,0xe0000,0x3ffc000,0x1c000fe, -0x339cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc000e0c0,0x1c30c030,0xe0c01c00, -0x3,0x80000070,0x1c00,0x3807c000,0,0x1c0000,0x3ffc000,0xe001fc, -0x330cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc000e0c0,0x1c30c030,0xe0c01c00, -0x3,0x80000070,0x1c00,0,0,0x380000,0,0x7001e0, -0x330cc0,0,0xffff,0xf03fffc0,0xfffff000,0xc00070c0,0x3830c030,0x70c03800, -0x3,0xc0000070,0x3c00,0,0,0x380000,0,0x7001e0, -0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0xe00038e0,0x7030c030,0x38c07000, -0x1,0xc0000070,0x3800,0,0,0x1c0000,0,0xe000c0, -0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0x7c001c7c,0xe030c030,0x1cc0e000, -0x1,0xe0000070,0x7800,0,0,0xe0000,0,0x1c00000, -0x330cc0,0,0xffff,0xf07fffe0,0xfffff000,0x3c000c3c,0xc030c030,0xcc0c000, -0x1,0xe0000070,0x7800,0,0,0x70000,0x3ffc000,0x3800000, -0x330cc0,0,0xffff,0xf0fffff0,0x7fffe000,0,0x300030,0, -0,0xe0000070,0x7800,0,0,0x38000,0x3ffc000,0x7000000, -0x339cc0,0,0xffff,0xf0fffff0,0x7fffe000,0,0x380070,0, -0,0xe0000070,0x7000,0,0xc00001e0,0x1c000,0,0xe0000c0, -0x31ff80,0,0xffff,0xf0fffff0,0x3fffc003,0x3000303,0x1c00e0,0, -0,0xe0000070,0x7000,0x1,0xe00001e0,0xe000,0,0x1c0001e0, -0x30f300,0,0xffff,0xf0fffff0,0x1fff8003,0x87000387,0xe01c0,0, -0,0xf0000070,0xf000,0x1,0xe00001c0,0x7000,0,0x380001e0, -0,0,0xffff,0xf0fffff0,0xfff0001,0xce0001ce,0x7ff80,0, -0,0xff000070,0xff000,0,0xc0000380,0x3800,0,0x700000c0, -0,0,0xffff,0xf0fffff0,0x3fc0000,0xfc0000fc,0x3ff00,0, -0,0x7f000000,0xfe000,0,0x700,0x1c00,0,0xe0000000, -0,0,0,0,0,0x78000078,0,0, -0,0x3f000000,0xfc000,0,0x600,0xc00,0,0xc0000000, -0,0,0,0,0,0x30000030,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x1f0003f,0xfe001fff,0x3ffe00,0x1fff001f,0xff001ffe,0x3c0780,0xfff0000,0x38003c0f, -0x801c0000,0xf003c038,0x3803ffe,0x3ffe00,0x3ffe003f,0xfc001ffe,0x7fff00,0x3c1f0000, -0x1f8003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c0f, -0x803c0000,0xf807c03c,0x7803fff,0x3fff00,0x3fff003f,0xfe003ffe,0x7fff00,0x3e1f0000, -0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c1f, -0x3c0000,0xf807c03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7fff00,0x3e1f0000, -0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xffe0000,0x3c003c1f, -0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7ffe00,0x3e1f0000, -0x3fc003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, -0x3c0000,0xfc0fc03e,0x7803c0f,0x3c1f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, -0x3fc003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, -0x3c0000,0xfc0fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, -0x3fc003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3c, -0x3c0000,0xfe1fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, -0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c7c, -0x3c0000,0xfe1fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, -0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c78, -0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, -0x7de003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf8, -0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, -0x79e003c,0x1f803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf0, -0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, -0x79e003f,0xff003c00,0x3c0f00,0x3c00003e,0x3c00,0x3fff80,0xf00000,0x3c003cf0, -0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, -0x79f003f,0xfe003c00,0x3c0f00,0x3ffc003e,0x3c00,0x3fff80,0xf00000,0x3c003df0, -0x3c0000,0xf7f7c03f,0xc7803c0f,0x3e1f00,0x3c0f003e,0x1f003ffc,0x1e000,0x3e1f0000, -0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003de0, -0x3c0000,0xf7f7c03f,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, -0xf8f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003fe0, -0x3c0000,0xf7f7c03d,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, -0xf0f003c,0xf803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3e0780,0xf00000,0x3c003de0, -0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfc001ffe,0x1e000,0x3e1f0000, -0xfef003c,0x7803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3e0780,0xf00000,0x3c003df0, -0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfe00001e,0x1e000,0x3e1f0000, -0xfef003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf0, -0x3c0000,0xf3e7c03c,0xf7803c0f,0x3c0000,0x3c0f003c,0x3f00001e,0x1e000,0x3e1f0000, -0xfcf803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, -0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, -0x1f8f803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, -0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, -0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c78, -0x3c0000,0xf1c7c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, -0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, -0x3c0000,0xf087c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, -0x1f07803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c3c, -0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, -0x1f07c03c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c3e, -0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, -0x3e07c03c,0xf803e00,0x3c0f00,0x3e00003e,0x3e1e,0x3e0780,0xf00000,0x7c003c3e, -0x3e0000,0xf007c03c,0x3f803e0f,0x3c0000,0x3e0f003c,0x1f003e3e,0x1e000,0x3e1f0000, -0x3e07c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0x7ff0007,0xfc003c1f, -0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, -0x3e03c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, -0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, -0x3c03c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c0f, -0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, -0x3c03e03f,0xff001fff,0x3ffe00,0x1fff003e,0x1ffe,0x3e0780,0xfff0007,0xf8003c0f, -0x803ffe00,0xf007c03c,0xf801fff,0x3c0000,0x1fff003c,0x1f003ffc,0x1e000,0x3ffe0000, -0,0,0,0,0,0,0,0, -0,0,0,0,0x3c0000,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0x3c0000,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0x3c0000,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x1f8003f,0xfe001fff,0x3ffe00,0x1fff001f,0xff001ffe,0x3c0780,0xfff0000,0x38003c0f, -0x801c0000,0xf003c038,0x3803ffe,0x3ffe00,0x3ffe003f,0xfc001ffe,0x7fff00,0x3c1f0000, -0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c0f, -0x803c0000,0xf807c03c,0x7803fff,0x3fff00,0x3fff003f,0xfe003ffe,0x7fff00,0x3e1f0000, -0x1fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xfff0000,0x3c003c1f, -0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7fff00,0x3e1f0000, -0x3fc003f,0xff803fff,0x3fff00,0x3fff003f,0xff003ffe,0x3e0780,0xffe0000,0x3c003c1f, -0x3c0000,0xfc0fc03e,0x7803fff,0x3fff00,0x3fff003f,0xff003ffe,0x7ffe00,0x3e1f0000, -0x3fc003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3e, -0x3c0000,0xfc0fc03f,0x7803c0f,0x3c1f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, -0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c3c, -0x3c0000,0xfe1fc03f,0x7803c0f,0x3c0f00,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, -0x3fe003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c7c, -0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, -0x7de003c,0x7803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003c78, -0x3c0000,0xff3fc03f,0x87803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, -0x79e003c,0xf803c00,0x3c0f00,0x3c00003e,0x3c00,0x3e0780,0xf00000,0x3c003cf8, -0x3c0000,0xffffc03f,0xc7803c0f,0x3c0f00,0x3c0f003c,0x1f003e00,0x1e000,0x3e1f0000, -0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003cf0, -0x3c0000,0xffffc03f,0xc7803c0f,0x3fff00,0x3c0f003c,0x1f003ffe,0x1e000,0x3e1f0000, -0x79f003f,0xff003c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003df0, -0x3c0000,0xf7f7c03f,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, -0xf8f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c00,0x3fff80,0xf00000,0x3c003fe0, -0x3c0000,0xf7f7c03d,0xe7803c0f,0x3fff00,0x3c0f003f,0xfe003ffe,0x1e000,0x3e1f0000, -0xf0f003f,0xff803c00,0x3c0f00,0x3ffc003f,0xf0003c1e,0x3fff80,0xf00000,0x3c003ff0, -0x3c0000,0xf3e7c03d,0xf7803c0f,0x3fff00,0x3c0f003f,0xfc001ffe,0x1e000,0x3e1f0000, -0xfef803c,0xf803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003df0, -0x3c0000,0xf3e7c03c,0xf7803c0f,0x3c0000,0x3c0f003f,0xfe00001e,0x1e000,0x3e1f0000, -0xfcf803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, -0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x3f00001e,0x1e000,0x3e1f0000, -0x1f8f803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003cf8, -0x3c0000,0xf1c7c03c,0xff803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, -0x1f87803c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, -0x3c0000,0xf1c7c03c,0x7f803c0f,0x3c0000,0x3c0f003c,0x1f00001e,0x1e000,0x3e1f0000, -0x1f07c03c,0x7803c00,0x3c0f00,0x3c00003e,0x3c1e,0x3e0780,0xf00000,0x3c003c7c, -0x3c0000,0xf007c03c,0x3f803c0f,0x3c0000,0x3c0f003c,0x1f003e1e,0x1e000,0x3e1f0000, -0x1f07c03c,0xf803e00,0x3c0f00,0x3e00003e,0x3e1e,0x3e0780,0xf00000,0x3c003c3e, -0x3e0000,0xf007c03c,0x3f803e0f,0x3c0000,0x3e0f003c,0x1f003e3e,0x1e000,0x3e1f0000, -0x3e07c03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0x7ff0000,0x7c003c3f, -0x3ffe00,0xf007c03c,0x3f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, -0x3e07e03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, -0x3ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, -0x3c03e03f,0xff803fff,0x3fff00,0x3fff003e,0x3ffe,0x3e0780,0xfff0007,0xfc003c1f, -0x803ffe00,0xf007c03c,0x1f803fff,0x3c0000,0x3fff003c,0x1f003ffe,0x1e000,0x3fff0000, -0x3c03e03f,0xff001fff,0x3ffe00,0x1fff003e,0x1ffe,0x3e0780,0xfff0007,0xf8003c0f, -0x803ffe00,0xf007c03c,0xf801fff,0x3c0000,0x1fff003c,0x1f003ffc,0x1e000,0x3ffe0000, -0,0,0,0,0,0,0,0, -0,0,0,0,0x3c0000,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0x3c0000,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0x3c0000,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x3c03e07c,0x7c07c07,0xc03c03c0,0x1fff803f,0xfc0007f0,0xffc00,0x3ff00003,0xe0003ffc, -0x1ffe00,0x3ff8001f,0xfc000ffe,0,0,0,0,0, -0x3c03e07c,0x7c07c07,0xc03e07c0,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, -0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, -0x3c03e07c,0x7c07c07,0xc03e07c0,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, -0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, -0x3c03e07c,0x7c03e0f,0x801f0f80,0x1fff803f,0xfe0007f8,0x1ffe00,0x3ff80003,0xc0003ffc, -0x3ffe00,0x3ffc003f,0xfe001fff,0,0,0,0,0, -0x3e03e07c,0x7c03e0f,0x801f0f80,0xfff803c,0x1e0007f8,0x1e3e00,0xf80003,0xc0003c00, -0x3c0000,0x78003c,0x1e001e0f,0x3000,0x300000,0,0,0, -0x1e03c07c,0x7c01f1f,0xf0f00,0xf003c,0x1e0000f8,0x1e3e00,0x780007,0xc0003c00, -0x3c0000,0x78003c,0x1e001e0f,0x7800,0x780000,0,0,0, -0x1e07c07c,0x7c01f1f,0xf9f00,0x1f003c,0x1e0000f8,0x1e7e00,0x780007,0xc0003c00, -0x3c0000,0x78003c,0x1e001e0f,0xfc00,0xfc000f,0xffc003ff,0xf00ffff0,0xffff000, -0x1e07c07c,0x7800fbe,0xf9f00,0x1f003c,0x1e0000f8,0x7c00,0x780007,0x80003c00, -0x3c0000,0xf8003c,0x1e001e0f,0x1ce00,0x1ce001f,0xffe007ff,0xf81ffff8,0x1ffff800, -0x1f07c07c,0x7800fbe,0x79e00,0x3e003c,0x1e0000f8,0x7c00,0x780007,0x80003c00, -0x3c0000,0xf0003c,0x1e001e0f,0x38700,0x3870038,0x700e00,0x1c38001c,0x38001c00, -0xf07803c,0x7800ffe,0x7fe00,0x3e003c,0x1e0000f8,0xfc00,0x780007,0x80003c00, -0x3c0000,0xf0003c,0x1e001e0f,0x30300,0x3030030,0x300c00,0xc30000c,0x30000c00, -0xf07803e,0x4f8007fc,0x7fe00,0x7c003c,0x1e0000f8,0xf800,0xff80007,0x80003ff8, -0x3c0000,0xf0003f,0xfe001e0f,0,0x30,0x300c00,0xc30000c,0x30000c00, -0xf0f803e,0x4f8007fc,0x3fc00,0x7c003c,0x1e0000f8,0x1f800,0xff8000f,0x80003ffc, -0x3c0000,0xf0001f,0xfc001e0f,0,0x30,0x300c00,0xc30000c,0x30000c00, -0xf0f003e,0x4f8007fc,0x3fc00,0xf8003c,0x1e0000f8,0x1f000,0xff0000f,0x80003ffc, -0x3ffc00,0x1e0001f,0xfc001fff,0x3c00,0xc3cc030,0,0xc000000,0, -0xf8f003e,0xef8003f8,0x1f800,0xf8003c,0x1e0000f8,0x1f000,0xff8000f,0x3ffc, -0x3ffe00,0x1e0003f,0xfe001fff,0x7c00,0x1c7ce030,0,0xc000000,0, -0x78f003e,0xef8003f8,0x1f800,0x1f0003c,0x1e0000f8,0x3f000,0xff8000f,0x3c, -0x3ffe00,0x1e0003c,0x1e001fff,0xe000,0x38e07033,0xfc003cf,0xcc030300,0xf30000, -0x78f003e,0xef0003f8,0xf000,0x1f0003c,0x1e0000f8,0x3e000,0x78000f,0x3c, -0x3ffe00,0x1e0003c,0x1e000fff,0xc000,0x70c03833,0xfc007cf,0xcc030300,0x1f30000, -0x78f003e,0xef0003f8,0xf000,0x3e0003c,0x1e0000f8,0x7e000,0x78000f,0x3c, -0x3c1e00,0x3e0003c,0x1e00000f,0xc000,0xe0c01c33,0x3000e03,0xc030300,0x3830000, -0x79e001f,0xff0007fc,0xf000,0x3e0003c,0x1e0000f8,0x7e000,0x78001f,0x3c, -0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0xe0c01c33,0x3000c03,0xc030300,0x3030000, -0x7de001f,0xff0007fc,0xf000,0x3c0003c,0x1e0000f8,0x7c000,0x78001f,0x3c, -0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x70c03833,0x3000c03,0xc0303e0,0x303e000, -0x3de001f,0xff000ffc,0xf000,0x7c0003c,0x1e0000f8,0xfc000,0x78001e,0x3c, -0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x38c07033,0x3000c03,0xc0303f0,0x303f000, -0x3de001f,0xff000fbe,0xf000,0x780003c,0x1e0000f8,0xf8000,0x78001e,0x3c, -0x3c1e00,0x3c0003c,0x1e00000f,0xc000,0x1cc0e033,0x3000c03,0xc030330,0x3033000, -0x3de001f,0xff000fbe,0xf000,0xf80003c,0x1e0000f8,0x1f8000,0x78001e,0x3c00003c, -0x3c1e00,0x780003c,0x1e00000f,0xc000,0xcc0c033,0x83000c03,0xc038330,0x3033000, -0x3fc001f,0xff001f1f,0xf000,0xf80003c,0x1e0000f8,0x1f8000,0x78001e,0x3e00003c, -0x3c1e00,0x780003c,0x1e00000f,0,0x31,0xf3000c03,0xc01f3f0,0x303f000, -0x3fc001f,0xbe001f1f,0xf000,0x1f00003c,0x1e0000f8,0x1f0000,0x78001e,0x3e00003c, -0x3c1e00,0x780003c,0x1e00000f,0,0x30,0xf3000c03,0xc00f1e0,0x301e000, -0x1fc001f,0xbe003e0f,0x8000f000,0x1fff003c,0x1e0000f8,0x3f0000,0xf8003e,0x3e00003c, -0x3c1e00,0x780003c,0x1e00000f,0x30300,0x3030030,0,0xc000000,0, -0x1fc000f,0xbe003e0f,0x8000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, -0x3ffe00,0xf00003f,0xfe000fff,0x38700,0x3870030,0,0xc000000,0, -0x1fc000f,0x1e003c07,0x8000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, -0x3ffe00,0xf00003f,0xfe001fff,0x1ce00,0x1ce0030,0,0xc000000,0, -0x1f8000f,0x1e007c07,0xc000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff8003f,0xfe003ffc, -0x3ffe00,0xf00003f,0xfe001fff,0xfc00,0xfc0030,0,0xc000000,0, -0x1f8000e,0x1e007c07,0xc000f000,0x1fff803f,0xfe0007ff,0x3fff00,0x3ff0003f,0xfe003ffc, -0x3ffe00,0xf00001f,0xfc001ffe,0x7800,0x780000,0,0,0, -0,0,0,0,0,0,0,0x3e000000, -0,0,0,0x3000,0x300000,0,0,0, -0,0,0,0,0,0,0,0x3e000000, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0x3c01e07c,0x7c07c07,0xc03c03c0,0x3fff0000,0xf0,0xfff00,0xc00030c0,0x30f000, -0xf000f000,0x3fff0003,0xff000000,0xfc00,0x3,0xf0000000,0,0, -0x3c01e07c,0x7c07c07,0xc03c03c0,0x3fff0000,0x1f8,0x1fff80,0xe00070e0,0x70f801, -0xf001f800,0x7fff8007,0xff800000,0x1fc00,0x3,0xf8000000,0,0, -0x3c01e07c,0x7c07c07,0xc03e07c0,0x3fff00ff,0xfff003fc,0x3fffc0,0xf000f0f0,0xf0f801, -0xf003fc00,0xffffc00e,0x1c00000,0x3fc00,0x3,0xfc000000,0,0, -0x3c01e07c,0x7c07e0f,0xc03e07c0,0x3fff00ff,0xfff003fc,0x7fffe0,0xf801f0f8,0x1f0fc03, -0xf007fe00,0xffffc01c,0xe00000,0x7fc00,0x3,0xfe000000,0,0, -0x3c01e07c,0x7c03e0f,0x801f0f80,0x1f00ff,0xfff007fe,0xfc03f0,0x7c03e07c,0x3e07c03, -0xe00fff00,0xf00fc038,0x700000,0xffc00,0xfc0003,0xff003fff,0xf003ffc0,0x3fffc000, -0x3e03e07c,0x7c03f1f,0x801f0f80,0x1f00ff,0xfff007fe,0xf801f0,0x3e07c03e,0x7c03e07, -0xc00f9f00,0xf007c030,0x300000,0x1ffc00,0x1fe0003,0xff803fff,0xf003ffc0,0x3fffc000, -0x1e03c07c,0x7c01f1f,0xf0f00,0x3e00f0,0xf00f9f,0xf000f0,0x1f0f801f,0xf801f0f, -0x801f0f80,0xf003c030,0xc0300cc0,0xc03ffc00,0x3ff0003,0xffc03fff,0xf0000000,0x30000000, -0x1e03c07c,0x7c00fbe,0xf9f00,0x3e00f0,0xf00f0f,0xf000f0,0xf9f000f,0x9f000f9f, -0x1f0f80,0xf003c030,0xc0301cc0,0xe03ffc00,0x7ff8003,0xffc03fff,0xf0000000,0x30000000, -0x1f07c07c,0x7c00fbe,0x79e00,0x7c00f0,0xf01f0f,0x80f000f0,0x7fe0007,0xfe0007fe, -0x3e07c0,0xf007c030,0xc03038c0,0x703ffc00,0xfffc003,0xffc03fff,0xf0000000,0x30000000, -0xf07803c,0x78007fc,0x7fe00,0x7c00f0,0xf01f0f,0x80f000f0,0x3fc0003,0xfc0003fc, -0x3e07c0,0xf00fc030,0xc03070c0,0x383ffc00,0x1fffe003,0xffc03fff,0xf0000000,0x30000000, -0xf07803e,0x4f8007fc,0x3fc00,0xf800f0,0xf03e07,0xc0f000f0,0x1f80001,0xf80001f8, -0x7c03e0,0xffff8030,0xc030e0c0,0x1c3ffc00,0x3ffff003,0xffc01fff,0xe003ffc0,0x30fff000, -0xf07803e,0x4f8003f8,0x3fc00,0x1f000f0,0xf03e07,0xc0f000f0,0x1f80001,0xf80000f0, -0x7c03e0,0xffff8030,0xc030e0c0,0x1c3ffc00,0x3ffff003,0xffc00fff,0xc003ffc0,0x30fff000, -0xf8f803e,0x4f8003f8,0x1f800,0x1f000f0,0xf03e07,0xc0f000f0,0x3fc0003,0xfc0000f0, -0xfffff0,0xffffe030,0xc03070c0,0x381ffc00,0x3ffff003,0xff8007ff,0x80000000,0xc03000, -0x78f003e,0xef8003f8,0x1f800,0x3e000f0,0xf07c03,0xe0f000f0,0x7fe0007,0xfe0000f0, -0xfffff0,0xfffff030,0xc03038e0,0x700ffc00,0x3ffff003,0xff0003ff,0,0xc03000, -0x78f003e,0xef0007fc,0xf000,0x7c000f0,0xf07c03,0xe0f000f0,0xf9f000f,0x9f0000f0, -0xfffff0,0xf001f030,0xfc301c7c,0xe007fc00,0x3ffff003,0xfe0001fe,0,0xc03000, -0x78f001f,0xff0007fc,0xf000,0x7c000f0,0xf0fc03,0xf0f000f0,0x1f0f801f,0xf8000f0, -0xfffff0,0xf000f030,0x7c300c3c,0xc003fc00,0x3ffff003,0xfc0000fc,0,0xc03000, -0x7df001f,0xff000ffe,0xf000,0xf8000f0,0xf0f801,0xf0f801f0,0x3e07c03e,0x7c000f0, -0xf000f0,0xf000f030,0x300000,0x1fc00,0x3,0xf8000000,0x3ffc0,0xfff000, -0x3de001f,0xff001fbf,0xf000,0x1f8000f0,0xf0f801,0xf0fc03f0,0x7c03e07c,0x3e000f0, -0xf000f0,0xf001f038,0x700000,0xfc00,0x3,0xf0000000,0x3ffc0,0xfff000, -0x3de001f,0xff001f1f,0xf000,0x1f0000ff,0xfff0ffff,0xf07fffe0,0xf801f0f8,0x1f000f0, -0xf000f0,0xfffff01c,0xe00000,0,0,0,0,0, -0x3fe001f,0xff003f1f,0x8000f000,0x3fff00ff,0xfff0ffff,0xf03fffc0,0xf000f0f0,0xf000f0, -0xf000f0,0xfffff00e,0x1c00000,0,0,0,0,0, -0x3fe001f,0xbf007e0f,0xc000f000,0x3fff00ff,0xfff0ffff,0xf01fff80,0xe00070e0,0x7000f0, -0xf000f0,0x7fffe007,0xff800000,0,0,0,0,0, -0x1fc000f,0xbe007e0f,0xc000f000,0x3fff00ff,0xfff0ffff,0xf00fff00,0xc00030c0,0x3000f0, -0xf000f0,0x3fffc003,0xff000000,0,0,0,0,0, -0x1fc000f,0x1e007c07,0xc000f000,0x3fff0000,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0xf00000,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x3fc0000,0xc00000,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x39c0000,0x1c00000,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x70e0000,0x3800003,0xfc000000,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x6060000,0x7000003,0xfc000000,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x6060000,0xe003ff0,0x3c000000,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x70e0000,0x1c003ff0,0x7c000000,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x39c0000,0x38003c00,0xec000000,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0x3fc0000,0x70003c01,0xcc000000,0,0,0,0, -0,0,0,0xc00000,0,0,0,0, -0,0xf00000,0xe0003c03,0x8c000000,0,0,0,0, -0,0,0,0x1e00000,0,0,0,0, -0,0,0xc0003c07,0xc000000,0,0,0,0, -0x3f0fc03f,0xfc03f0f,0xc03f3f00,0x3f00000,0xf00003cf,0xc0000000,0,0, -0x3f0fc0,0,0xc0003c0e,0,0,0,0,0, -0x7f0fe07f,0xfe07f0f,0xe03f3f00,0x3300001,0xf80007cf,0xc0000000,0,0, -0x7f0fe0,0,0xc0003c0c,0,0,0,0,0, -0xff0c70e3,0xff0ff0f,0xf0c000c0,0xc000c003,0x9c000e03,0,0,0, -0xe30c70,0,0xc0003c00,0x30000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c007,0xe000c03,0,0,0, -0xc30c30,0,0xe0003c00,0x30000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c00e,0x7000c03,0,0x3,0x300000, -0xc30c30,0,0x70003c00,0x30000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf0c000c0,0xc000c01c,0x3800e03,0,0x7,0x300000, -0xc30c30,0,0x38003c00,0x30000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf000c000,0xc00038,0x1c007c3,0xc30fc,0xe,0x301c7c, -0x3cc30c30,0,0x1ff03c00,0x30000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf000c000,0xc00070,0xe003c3,0x1e30fc,0x1c,0x303cfc, -0x7cc30c30,0,0xff03c00,0x30000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0e0,0x700000,0x3f3030,0x38,0x3030c0, -0xe0c30c30,0,0x3fff,0xf0000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x300000,0x333030,0x70,0x7030e0, -0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x3003cc,0x333030,0xe0,0xffe03c70, -0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, -0xff0c30c3,0xff0ff0f,0xf0c0c0c0,0xc0c0c0c0,0x3007cc,0x333030,0xe0,0xffc03c38, -0xc0c30c30,0,0x3fff,0xf0000000,0,0,0,0, -0xff0ff0ff,0xff0ff0f,0xf000c000,0xff,0xff00e0c,0x3f3030,0x30003070,0x301c, -0xc0ff0ff0,0,0,0,0,0,0,0, -0xff0ff0ff,0xff0ff0f,0xf000c000,0xff,0xff00c0c,0x3f3830,0x30003038,0x300c, -0xe0ff0ff0,0,0,0,0,0,0,0, -0xc00030c0,0x30c000,0x30c000c0,0xc000c003,0xc000c0c,0x331f30,0x3000301c,0x3cfc, -0x7cc00030,0,0,0,0,0,0,0, -0xc00030c0,0x30c000,0x30c000c0,0xc000c003,0xc000c0e,0x330f30,0x3000300e,0x1cf8, -0x3cc00030,0,0,0,0,0,0,0, -0xc00030c0,0x30c000,0x30c000c0,0xc330c003,0xc000c07,0xc0000000,0x3ffff007,0, -0xc00030,0,0,0,0,0,0,0, -0xc00030c0,0x30c000,0x30c000c0,0xc3f0c003,0xc000c03,0xc0000000,0x3ffff003,0, -0xc00030,0,0,0,0,0,0,0, -0,0,0,0x1e00003,0xfc000000,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0xc00003,0xfc000000,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0, diff --git a/vg_render.c b/vg_render.c deleted file mode 100644 index 4a22a89..0000000 --- a/vg_render.c +++ /dev/null @@ -1,175 +0,0 @@ -struct vg_postprocess _vg_postprocess = -{ -#ifdef VG_3D - .blur_effect = 1, - .blur_strength = 0.3f, -#endif -}; - -struct vg_render _vg_render = -{ - .scale = 1.0f -}; - -VG_API void _vg_render_register(void) -{ - vg_console_reg_var( "render_scale", &_vg_render.scale, k_var_dtype_f32, VG_VAR_PERSISTENT ); - vg_console_reg_var( "blur_strength", &_vg_postprocess.blur_strength, k_var_dtype_f32, 0 ); - vg_console_reg_var( "blur_effect", &_vg_postprocess.blur_effect, k_var_dtype_i32, VG_VAR_PERSISTENT ); -} - -VG_API void _vg_render_init(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_OPENGL ) ); - f32 quad[] = - { - 0.00f,0.00f, 1.00f,1.00f, 0.00f,1.00f, - 0.00f,0.00f, 1.00f,0.00f, 1.00f,1.00f, - }; - - glGenVertexArrays( 1, &_vg_postprocess.quad_vao ); - glGenBuffers( 1, &_vg_postprocess.quad_vbo ); - glBindVertexArray( _vg_postprocess.quad_vao ); - glBindBuffer( GL_ARRAY_BUFFER, _vg_postprocess.quad_vbo ); - glBufferData( GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW ); - glBindVertexArray( _vg_postprocess.quad_vao ); - glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, sizeof(f32)*2, (void*)0 ); - glEnableVertexAttribArray( 0 ); - -#if defined( VG_3D ) - - /* - * Main framebuffer - */ - _vg_render.fb_main = _vg_framebuffer_alloc( NULL, 3, VG_FRAMEBUFFER_GLOBAL ); - _vg_render.fb_main->display_name = "main"; - _vg_render.fb_main->resolution_div = 1; - _vg_render.fb_main->attachments[0] = (vg_framebuffer_attachment) - { - "colour", k_framebuffer_attachment_type_texture, - - .internalformat = GL_RGB, - .format = GL_RGB, - .type = GL_UNSIGNED_BYTE, - .attachment = GL_COLOR_ATTACHMENT0 - }; - _vg_render.fb_main->attachments[1] = (vg_framebuffer_attachment) - { - "motion", k_framebuffer_attachment_type_texture, - - .quality = k_framebuffer_quality_high_only, - .internalformat = GL_RG16F, - .format = GL_RG, - .type = GL_FLOAT, - .attachment = GL_COLOR_ATTACHMENT1 - }; - _vg_render.fb_main->attachments[2] = (vg_framebuffer_attachment) - { - "depth_stencil", k_framebuffer_attachment_type_texture_depth, - .internalformat = GL_DEPTH24_STENCIL8, - .format = GL_DEPTH_STENCIL, - .type = GL_UNSIGNED_INT_24_8, - .attachment = GL_DEPTH_STENCIL_ATTACHMENT - }; - vg_framebuffer_init( _vg_render.fb_main ); - - /* - * Water reflection - */ - _vg_render.fb_water_reflection = _vg_framebuffer_alloc( NULL, 2, VG_FRAMEBUFFER_GLOBAL ); - _vg_render.fb_water_reflection->display_name = "water_reflection"; - _vg_render.fb_water_reflection->resolution_div = 2; - _vg_render.fb_water_reflection->attachments[0] = (vg_framebuffer_attachment) - { - "colour", k_framebuffer_attachment_type_texture, - .internalformat = GL_RGB, - .format = GL_RGB, - .type = GL_UNSIGNED_BYTE, - .attachment = GL_COLOR_ATTACHMENT0 - }; - _vg_render.fb_water_reflection->attachments[1] = (vg_framebuffer_attachment) - { - "depth_stencil", k_framebuffer_attachment_type_renderbuffer, - .internalformat = GL_DEPTH24_STENCIL8, - .attachment = GL_DEPTH_STENCIL_ATTACHMENT - }; - vg_framebuffer_init( _vg_render.fb_water_reflection ); - - /* - * Thid rendered view from the perspective of the camera, but just - * captures stuff thats under the water - */ - _vg_render.fb_water_beneath = _vg_framebuffer_alloc( NULL, 2, VG_FRAMEBUFFER_GLOBAL ); - _vg_render.fb_water_beneath->display_name = "water_beneath"; - _vg_render.fb_water_beneath->resolution_div = 2; - _vg_render.fb_water_beneath->attachments[0] = (vg_framebuffer_attachment) - { - "colour", k_framebuffer_attachment_type_texture, - .internalformat = GL_RED, - .format = GL_RED, - .type = GL_UNSIGNED_BYTE, - .attachment = GL_COLOR_ATTACHMENT0 - }; - _vg_render.fb_water_beneath->attachments[1] = (vg_framebuffer_attachment) - { - "depth_stencil", k_framebuffer_attachment_type_renderbuffer, - .internalformat = GL_DEPTH24_STENCIL8, - .attachment = GL_DEPTH_STENCIL_ATTACHMENT - }; - vg_framebuffer_init( _vg_render.fb_water_beneath ); -#endif -} - -void vg_render_fullscreen_quad(void) -{ - glBindVertexArray( _vg_postprocess.quad_vao ); - glDrawArrays( GL_TRIANGLES, 0, 6 ); -} - -/* - * Utility - */ - -void vg_postprocess_to_screen( vg_framebuffer *fb ) -{ - glBindFramebuffer( GL_FRAMEBUFFER, 0 ); - glViewport( 0,0, _vg_window.w, _vg_window.h ); - - glEnable(GL_BLEND); - glDisable(GL_DEPTH_TEST); - glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA); - glBlendEquation(GL_FUNC_ADD); - - v2f inverse; - vg_framebuffer_inverse_ratio( fb, inverse ); - -#ifdef VG_3D - if( _vg_postprocess.blur_effect ) - { - shader_blitblur_use(); - shader_blitblur_uTexMain( 0 ); - shader_blitblur_uTexMotion( 1 ); - - f32 s = vg.time_frame_delta*60.0; - shader_blitblur_uBlurStrength( _vg_postprocess.blur_strength / s ); - shader_blitblur_uInverseRatio( inverse ); - - inverse[0] -= 0.0001f; - inverse[1] -= 0.0001f; - shader_blitblur_uClampUv( inverse ); - shader_blitblur_uOverrideDir( _vg_postprocess.motion_blur_override ); - - vg_framebuffer_bind_texture( fb, 0, 0 ); - vg_framebuffer_bind_texture( fb, 1, 1 ); - } - else -#endif - { - shader_blit_use(); - shader_blit_uTexMain( 0 ); - shader_blit_uInverseRatio( vg_ui.bg_inverse_ratio ); - vg_framebuffer_bind_texture( fb, 0, 0 ); - } - - vg_render_fullscreen_quad(); -} diff --git a/vg_render.h b/vg_render.h deleted file mode 100644 index 7a4f74e..0000000 --- a/vg_render.h +++ /dev/null @@ -1,35 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_render.c" -#else - -struct vg_postprocess -{ - GLuint quad_vao, - quad_vbo; - -#ifdef VG_3D - i32 blur_effect; - f32 blur_strength; - v2f motion_blur_override; -#endif -} -extern _vg_postprocess; - -struct vg_render -{ - f32 scale; - -#if defined( VG_3D ) - vg_framebuffer *fb_main, - *fb_water_reflection, - *fb_water_beneath; -#endif -} -extern _vg_render; -VG_API void _vg_render_register(void); -VG_API void _vg_render_init(void); - -void vg_render_fullscreen_quad(void); -void vg_postprocess_to_screen( vg_framebuffer *fb ); - -#endif diff --git a/vg_rigidbody_view.c b/vg_rigidbody_view.c deleted file mode 100644 index b161d5a..0000000 --- a/vg_rigidbody_view.c +++ /dev/null @@ -1,204 +0,0 @@ -#pragma pack(push,1) -struct rb_view_vert { - v4f co; - v3f n; -}; -#pragma pack(pop) - -typedef struct rb_view_vert rb_view_vert; - -struct -{ - GLuint vao, vbo, ebo; - u32 sphere_start, sphere_count, - box_start, box_count; -} -static vg_rb_view; - -VG_API void _vg_rb_view_init(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_OPENGL ) ); - - u32 H = 20, - V = 16, - verts_count = 0, - tris_count = 0; - - /* box */ - verts_count += 4*6; - tris_count += 2*6; - vg_rb_view.box_count = 2*6; - vg_rb_view.box_start = 0; - - /* sphere */ - verts_count += H*(V-2) + 2; - tris_count += H*2 + (V-2)*(H*2); - vg_rb_view.sphere_count = H*2 + (V-2)*(H*2); - - rb_view_vert verts[ verts_count ]; - u16 tris[ tris_count*3 ]; - - u32 tri_index = 0, - vert_index = 0; - - /* box - * ----------------------------------------------------------- */ - for( u32 i=0; i<6; i ++ ) - { - v3f n = {i%3==0,i%3==1,i%3==2}; - if( i >= 3 ) v3_negate( n, n ); - v3f v0, v1; - v3_tangent_basis( n, v0, v1 ); - - rb_view_vert *vs = &verts[vert_index]; - vert_index += 4; - - for( u32 j=0; j<4; j ++ ) - { - v3_copy( n, vs[j].n ); - v3_muladds( n, v0, j&0x1?1.0f:-1.0f, vs[j].co ); - v3_muladds( vs[j].co, v1, j&0x2?1.0f:-1.0f, vs[j].co ); - vs[j].co[3] = 0.0f; - } - - tris[tri_index*3+0] = i*4+0; - tris[tri_index*3+1] = i*4+1; - tris[tri_index*3+2] = i*4+3; - tris[tri_index*3+3] = i*4+0; - tris[tri_index*3+4] = i*4+3; - tris[tri_index*3+5] = i*4+2; - tri_index += 2; - } - - /* sphere / capsule - * ----------------------------------------------------------- */ - u32 base = vert_index; - vg_rb_view.sphere_start = tri_index; - v4_copy( (v4f){0,-1,0,0}, verts[vert_index].co ); - v3_copy( (v3f){0,-1,0}, verts[vert_index ++].n ); - - for( u32 x=0; x=(V/2) }; - v4_copy( co, verts[vert_index].co ); - v4_copy( co, verts[vert_index ++].n ); - - if( y < V-2 ) - { - tris[tri_index*3+0] = base+1 + ybase*H + x; - tris[tri_index*3+1] = base+1 + (ybase+1)*H + ((x+1)%H); - tris[tri_index*3+2] = base+1 + ybase*H + ((x+1)%H); - tris[tri_index*3+3] = base+1 + ybase*H + x; - tris[tri_index*3+4] = base+1 + (ybase+1)*H + x; - tris[tri_index*3+5] = base+1 + (ybase+1)*H + ((x+1)%H); - tri_index += 2; - } - } - } - - v4_copy( (v4f){0, 1,0,1}, verts[vert_index].co ); - v3_copy( (v3f){0, 1,0}, verts[vert_index ++].n ); - - for( u32 x=0; x= '0') && (buf[i] <= '9')) || (buf[i] == '\0') ) - buf[j ++] = buf[i]; - } -} - -struct ui_textbox_callbacks static vg_settings_ui_int_callbacks = -{ - .change = vg_settings_ui_int -}; - -static bool vg_settings_ranged_i32_valid( struct vg_setting_ranged_i32 *prop ) -{ - if( prop->new_value < prop->min ) return 0; - if( prop->new_value > prop->max ) return 0; - return 1; -} - -static bool vg_settings_ranged_i32_diff( struct vg_setting_ranged_i32 *prop ) -{ - if( prop->new_value != *prop->actual_value ) return 1; - else return 0; -} - -static bool vg_settings_ui_ranged_i32( ui_context *ctx, struct vg_setting_ranged_i32 *prop, ui_rect rect ) -{ - ui_rect orig; - rect_copy( rect, orig ); - - ui_textbox( ctx, rect, prop->label, prop->buf, sizeof(prop->buf), - 1, 0, &vg_settings_ui_int_callbacks ); - prop->new_value = atoi( prop->buf ); - - if( vg_settings_ranged_i32_diff( prop ) ) - vg_settings_ui_draw_diff( ctx, orig ); - - bool valid = vg_settings_ranged_i32_valid( prop ); - if( !valid ) - { - ui_rect _null, line; - ui_split( orig, k_ui_axis_h, -1, 0, _null, line ); - line[1] += 3; - - ui_fill( ctx, line, ui_colour( ctx, k_ui_red ) ); - } - - return valid; -} - -void ui_settings_ranged_i32_init( struct vg_setting_ranged_i32 *prop ) -{ - vg_str tmp; - vg_strnull( &tmp, prop->buf, sizeof(prop->buf) ); - vg_strcati64( &tmp, *prop->actual_value, 10 ); - prop->new_value = *prop->actual_value; -} - -/* enum settings - * ------------------------------------------------------------------------- */ - -bool vg_settings_enum_diff( struct vg_setting_enum *prop ) -{ - if( prop->new_value != *prop->actual_value ) return 1; - else return 0; -} - -bool vg_settings_enum( ui_context *ctx, struct vg_setting_enum *prop, ui_rect rect ) -{ - ui_rect orig; - rect_copy( rect, orig ); - - ui_enum( ctx, rect, prop->label, - prop->options, prop->option_count, &prop->new_value ); - - if( vg_settings_enum_diff( prop ) ) - vg_settings_ui_draw_diff( ctx, orig ); - - return 1; -} - -void ui_settings_enum_init( struct vg_setting_enum *prop ) -{ - prop->new_value = *prop->actual_value; -} - -/* .. */ -void vg_settings_ui_header( ui_context *ctx, ui_rect inout_panel, const char *name ) -{ - ui_rect rect; - ui_standard_widget( ctx, inout_panel, rect, 2 ); - ui_text( ctx, rect, name, 1, k_ui_align_middle_center, ui_colour(ctx, k_ui_fg+3) ); -} - -bool vg_settings_apply_button( ui_context *ctx, ui_rect inout_panel, bool validated ) -{ - ui_rect last_row; - ui_px height = ui_standard_widget_height( ctx, 1 ); - ui_split( inout_panel, k_ui_axis_h, -height, 8, inout_panel, last_row ); - - const char *string = "Apply"; - if( validated ) - { - if( ui_button( ctx, last_row, string ) == 1 ) - return 1; - } - else - { - ui_rect rect; - ui_standard_widget( ctx, last_row, rect, 1 ); - ui_fill( ctx, rect, ui_colour( ctx, k_ui_bg+1 ) ); - ui_outline( ctx, rect, -1, ui_colour( ctx, k_ui_red ), 0 ); - - ui_rect t = { 0,0, ui_text_line_width( ctx, string ), 14 }; - ui_rect_center( rect, t ); - ui_text( ctx, t, string, 1, k_ui_align_left, ui_colour(ctx,k_ui_fg+3) ); - } - - return 0; -} - -static void vg_settings_video_apply(void) -{ - if( vg_settings_enum_diff( &vg_settings.screenmode ) ) - { - _vg_window.display_mode = vg_settings.screenmode.new_value; - - if( (_vg_window.display_mode == k_vg_window_fullscreen_desktop) || - (_vg_window.display_mode == k_vg_window_fullscreen) ) - { - SDL_DisplayMode video_mode; - if( SDL_GetDesktopDisplayMode( 0, &video_mode ) ) - { - vg_error("SDL_GetDesktopDisplayMode failed: %s\n", SDL_GetError()); - } - else - { - //vg.display_refresh_rate = video_mode.refresh_rate; - _vg_window.w = video_mode.w; - _vg_window.h = video_mode.h; - } - SDL_SetWindowSize( _vg_window.sdl_hwindow, _vg_window.w, _vg_window.h ); - } - - if( _vg_window.display_mode == k_vg_window_fullscreen_desktop ) - SDL_SetWindowFullscreen( _vg_window.sdl_hwindow, SDL_WINDOW_FULLSCREEN_DESKTOP ); - if( _vg_window.display_mode == k_vg_window_fullscreen ) - SDL_SetWindowFullscreen( _vg_window.sdl_hwindow, SDL_WINDOW_FULLSCREEN ); - if( _vg_window.display_mode == k_vg_window_windowed ) - { - SDL_SetWindowFullscreen( _vg_window.sdl_hwindow, 0 ); - SDL_SetWindowSize( _vg_window.sdl_hwindow, 1280, 720 ); - SDL_SetWindowPosition( _vg_window.sdl_hwindow, 16, 16 ); - SDL_SetWindowMinimumSize( _vg_window.sdl_hwindow, 1280, 720 ); - SDL_SetWindowMaximumSize( _vg_window.sdl_hwindow, 4096, 4096 ); - } - } - - vg.fps_limit = vg_settings.fps_limit.new_value; - vg.quality_profile = vg_settings.quality.new_value; - _vg_window.vsync = vg_settings.vsync.new_value; -} - -static void vg_settings_video_gui( ui_context *ctx, ui_rect panel ) -{ - bool validated = 1; - ui_rect rq; - ui_standard_widget( ctx, panel, rq, 1 ); - vg_settings_enum( ctx, &vg_settings.quality, rq ); - - /* FIXME */ -#if 0 - if( vg.vsync_feature == k_vsync_feature_error ){ - ui_info( panel, "There was an error activating vsync feature." ); - } -#endif - - /* frame timing */ - vg_settings_ui_header( ctx, panel, "Frame Timing" ); - ui_rect duo, d0,d1; - ui_standard_widget( ctx, panel, duo, 1 ); - ui_split_ratio( duo, k_ui_axis_v, 0.5f, 16, d0, d1 ); - - vg_settings_enum( ctx, &vg_settings.vsync, d0 ); - validated &= vg_settings_ui_ranged_i32( ctx, &vg_settings.fps_limit, d1 ); - - /* profiler */ - ui_standard_widget( ctx, panel, duo, 10 ); - int frame_target = _vg_window.monitor_refresh_rate; - if( !_vg_window.vsync ) - frame_target = vg.fps_limit; - - _vg_profiler_draw( ctx, vg.profiler, (1.0f/(f32)frame_target)*1500.0f, duo, 1, 0 ); - ui_fill( ctx, (ui_rect){ duo[0], duo[1]+(duo[3]*2)/3, duo[2], 1 }, ui_colour(ctx, k_ui_fg) ); - - /* window spec */ - vg_settings_ui_header( ctx, panel, "Window Specification" ); - - ui_standard_widget( ctx, panel, duo, 1 ); - vg_settings_enum( ctx, &vg_settings.screenmode, duo ); - - if( vg_settings_apply_button( ctx, panel, validated ) ) - vg_settings_video_apply(); -} - -static void vg_settings_audio_apply(void) -{ - if( vg_settings_enum_diff( &vg_settings.audio_devices ) ) - { - if( _vg_audio.sdl_output_device ) - { - vg_info( "Closing audio device %d\n", _vg_audio.sdl_output_device ); - SDL_CloseAudioDevice( _vg_audio.sdl_output_device ); - _vg_audio.sdl_output_device = 0; - } - - vg_strfree( &_vg_audio.device_choice ); - - if( vg_settings.audio_devices.new_value == -1 ){ } - else if( vg_settings.audio_devices.new_value == -2 ) - { - vg_fatal_error( "" ); - } - else - { - struct ui_enum_opt *selected = NULL, *oi; - - for( int i=0; ivalue == vg_settings.audio_devices.new_value ) - { - selected = oi; - break; - } - } - - vg_strnull( &_vg_audio.device_choice, NULL, 0 ); - vg_strcat( &_vg_audio.device_choice, oi->alias ); - } - - vg_audio_device_init(); - *vg_settings.audio_devices.actual_value = vg_settings.audio_devices.new_value; - } - - if( vg_settings_enum_diff( &vg_settings.dsp ) ) - *vg_settings.dsp.actual_value = vg_settings.dsp.new_value; -} - -static void vg_settings_audio_gui( ui_context *ctx, ui_rect panel ) -{ - ui_rect rq; - ui_standard_widget( ctx, panel, rq, 1 ); - vg_settings_enum( ctx, &vg_settings.audio_devices, rq ); - - ui_standard_widget( ctx, panel, rq, 1 ); - vg_settings_enum( ctx, &vg_settings.dsp, rq ); - - if( vg_settings_apply_button( ctx, panel, 1 ) ) - vg_settings_audio_apply(); -} - -VG_API void _vg_settings_open(void) -{ - vg_settings.open = 1; - - ui_settings_ranged_i32_init( &vg_settings.fps_limit ); - ui_settings_enum_init( &vg_settings.vsync ); - ui_settings_enum_init( &vg_settings.quality ); - ui_settings_enum_init( &vg_settings.screenmode ); - - /* Create audio options */ - int count = SDL_GetNumAudioDevices( 0 ); - - struct ui_enum_opt *options = malloc( sizeof(struct ui_enum_opt)*(count+1) ); - vg_settings.audio_devices.options = options; - vg_settings.audio_devices.option_count = count+1; - - struct ui_enum_opt *o0 = &options[0]; - o0->alias = "OS Default"; - o0->value = -1; - - for( int i=0; ialias = malloc( len+1 ); - memcpy( (void *)oi->alias, device_name, len+1 ); - oi->value = i; - } - - if( _vg_audio.device_choice.buffer ) - { - vg_settings.temp_audio_choice = -2; - - for( int i=0; ialias, _vg_audio.device_choice.buffer ) ) - { - vg_settings.temp_audio_choice = oi->value; - break; - } - } - } - else - { - vg_settings.temp_audio_choice = -1; - } - - ui_settings_enum_init( &vg_settings.audio_devices ); - ui_settings_enum_init( &vg_settings.dsp ); - -#ifdef VG_GAME_SETTINGS - vg_game_settings_init(); -#endif -} - -VG_API void _vg_settings_close(void) -{ - vg_settings.open = 0; - - struct ui_enum_opt *options = vg_settings.audio_devices.options; - for( int i=1; i < vg_settings.audio_devices.option_count; i ++ ) - free( (void *)options[i].alias ); - free( vg_settings.audio_devices.options ); -} - -VG_API void _vg_settings_gui( ui_context *ctx ) -{ - if( !vg_settings.open ) - return; - - ui_rect null; - ui_rect screen = { 0, 0, ctx->area[0], ctx->area[1] }; - ui_rect window = { 0, 0, 1000, 700 }; - ui_rect_center( screen, window ); - ui_capture_mouse( ctx, 1 ); - - ui_fill( ctx, window, ui_colour( ctx, k_ui_bg+1 ) ); - ui_outline( ctx, window, 1, ui_colour( ctx, k_ui_bg+7 ), 0 ); - - ui_rect title, panel; - ui_split( window, k_ui_axis_h, 28, 0, title, panel ); - ui_fill( ctx, title, ui_colour( ctx, k_ui_bg+7 ) ); - ui_text( ctx, title, "Settings", 1, k_ui_align_middle_center, - ui_colourcont(ctx, k_ui_bg+7) ); - - ui_rect quit_button; - ui_split( title, k_ui_axis_v, title[2]-title[3], 2, title, quit_button ); - - if( ui_button_text( ctx, quit_button, "X", 1 ) == k_ui_button_click ) - { - _vg_settings_close(); - return; - } - - ui_rect_pad( panel, (ui_px[2]){ 8, 8 } ); - - const char *opts[] = { "video", "audio" }; - - static i32 page = 0; - ui_tabs( ctx, panel, panel, opts, VG_ARRAY_LEN(opts), &page ); - - if( page == 0 ) - { - vg_settings_video_gui( ctx, panel ); - } - else if( page == 1 ) - vg_settings_audio_gui( ctx, panel ); -} - -static int cmd_vg_settings_toggle( int argc, const char *argv[] ) -{ - _vg_settings_open(); - return 0; -} - -VG_API void _vg_settings_register(void) -{ - vg_console_reg_cmd( "vg_settings", cmd_vg_settings_toggle, NULL ); -} - -VG_API bool _vg_settings_is_open(void) -{ - return vg_settings.open; -} diff --git a/vg_settings.h b/vg_settings.h deleted file mode 100644 index fd9d842..0000000 --- a/vg_settings.h +++ /dev/null @@ -1,9 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_settings.c" -#else -VG_API void _vg_settings_register(void); -VG_API void _vg_settings_gui( ui_context *ctx ); -VG_API void _vg_settings_open(void); -VG_API void _vg_settings_close(void); -VG_API bool _vg_settings_is_open(void); -#endif diff --git a/vg_shader.h b/vg_shader.h deleted file mode 100644 index 4f7bdf7..0000000 --- a/vg_shader.h +++ /dev/null @@ -1,27 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_shader.c" -#else - -typedef struct vg_shader vg_shader; -struct vg_shader -{ - u32 alias_offset; - struct vg_subshader - { - u32 glsl, src; - } - vs, fs; - - u32 names_start, uniform_aliases_offset, uniform_count; - bool compiled; -}; - -VG_API void _vg_shaders_register(void); -VG_API void _vg_shaders_init(void); - -int vg_shaders_live_recompile(int argc, const char *argv[]); -void vg_compile_shader( struct vg_shader *shader ); -void vg_recompile_shader( struct vg_shader *shader ); -void vg_free_shader( struct vg_shader *shader ); - -#endif diff --git a/vg_steam2.h b/vg_steam2.h deleted file mode 100644 index 010647d..0000000 --- a/vg_steam2.h +++ /dev/null @@ -1,1209 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_steam2.c" -#else -# if defined( VG_ENGINE ) || defined( VG_SERVER ) -# if defined( VG_ENGINE ) && defined( VG_SERVER ) -# error Can't be both! -# endif -# else -# error Must define VG_ENGINE or VG_SERVER -# endif - -#define STEAMTIMELINE_INTERFACE_VERSION "STEAMTIMELINE_INTERFACE_V004" -#define STEAMUTILS_INTERFACE_VERSION "SteamUtils010" -#define STEAMGAMECOORDINATOR_INTERFACE_VERSION "SteamGameCoordinator001" -#define STEAMHTTP_INTERFACE_VERSION "STEAMHTTP_INTERFACE_VERSION003" -#define STEAMREMOTESTORAGE_INTERFACE_VERSION "STEAMREMOTESTORAGE_INTERFACE_VERSION016" -#define STEAMAPPS_INTERFACE_VERSION "STEAMAPPS_INTERFACE_VERSION008" -#define STEAMUGC_INTERFACE_VERSION "STEAMUGC_INTERFACE_VERSION021" -#define STEAMAPPTICKET_INTERFACE_VERSION "STEAMAPPTICKET_INTERFACE_VERSION001" -#define STEAMSCREENSHOTS_INTERFACE_VERSION "STEAMSCREENSHOTS_INTERFACE_VERSION003" -#define STEAMHTMLSURFACE_INTERFACE_VERSION "STEAMHTMLSURFACE_INTERFACE_VERSION_005" -#define STEAMNETWORKING_INTERFACE_VERSION "SteamNetworking006" -#define STEAMMUSICREMOTE_INTERFACE_VERSION "STEAMMUSICREMOTE_INTERFACE_VERSION001" -#define STEAMREMOTEPLAY_INTERFACE_VERSION "STEAMREMOTEPLAY_INTERFACE_VERSION003" -#define STEAMNETWORKINGMESSAGES_INTERFACE_VERSION "SteamNetworkingMessages002" -#define STEAMCONTROLLER_INTERFACE_VERSION "SteamController008" -#define STEAMUSERSTATS_INTERFACE_VERSION "STEAMUSERSTATS_INTERFACE_VERSION013" -#define STEAMINPUT_INTERFACE_VERSION "SteamInput006" -#define STEAMVIDEO_INTERFACE_VERSION "STEAMVIDEO_INTERFACE_V007" -#define STEAMINVENTORY_INTERFACE_VERSION "STEAMINVENTORY_INTERFACE_V003" -#define STEAMMUSIC_INTERFACE_VERSION "STEAMMUSIC_INTERFACE_VERSION001" -#define STEAMUSER_INTERFACE_VERSION "SteamUser023" -#define STEAMGAMESERVERSTATS_INTERFACE_VERSION "SteamGameServerStats001" -#define STEAMNETWORKINGUTILS_INTERFACE_VERSION "SteamNetworkingUtils004" -#define STEAMGAMESERVER_INTERFACE_VERSION "SteamGameServer015" -#define STEAMFRIENDS_INTERFACE_VERSION "SteamFriends018" -#define STEAMNETWORKINGSOCKETS_INTERFACE_VERSION "SteamNetworkingSockets012" -#define STEAMPARENTALSETTINGS_INTERFACE_VERSION "STEAMPARENTALSETTINGS_INTERFACE_VERSION001" -#define STEAMMATCHMAKING_INTERFACE_VERSION "SteamMatchMaking009" -#define STEAMMATCHMAKINGSERVERS_INTERFACE_VERSION "SteamMatchMakingServers002" -#define STEAMGAMESEARCH_INTERFACE_VERSION "SteamMatchGameSearch001" -#define STEAMPARTIES_INTERFACE_VERSION "SteamParties002" - -typedef i32 HSteamPipe; -typedef i32 HSteamUser; -typedef u64 SteamAPICall_t; -typedef u64 uint64_steamid; -typedef u32 AppId_t; -typedef u32 SteamNetworkingPOPID; -typedef u32 AccountID_t; - -typedef enum EResult EResult; -enum EResult -{ - k_EResultNone = 0, - k_EResultOK = 1, - k_EResultFail = 2, - k_EResultNoConnection = 3, -// k_EResultNoConnectionRetry = 4, - k_EResultInvalidPassword = 5, - k_EResultLoggedInElsewhere = 6, - k_EResultInvalidProtocolVer = 7, - k_EResultInvalidParam = 8, - k_EResultFileNotFound = 9, - k_EResultBusy = 10, - k_EResultInvalidState = 11, - k_EResultInvalidName = 12, - k_EResultInvalidEmail = 13, - k_EResultDuplicateName = 14, - k_EResultAccessDenied = 15, - k_EResultTimeout = 16, - k_EResultBanned = 17, - k_EResultAccountNotFound = 18, - k_EResultInvalidSteamID = 19, - k_EResultServiceUnavailable = 20, - k_EResultNotLoggedOn = 21, - k_EResultPending = 22, - k_EResultEncryptionFailure = 23, - k_EResultInsufficientPrivilege = 24, - k_EResultLimitExceeded = 25, - k_EResultRevoked = 26, - k_EResultExpired = 27, - k_EResultAlreadyRedeemed = 28, - k_EResultDuplicateRequest = 29, - k_EResultAlreadyOwned = 30, - k_EResultIPNotFound = 31, - k_EResultPersistFailed = 32, - k_EResultLockingFailed = 33, - k_EResultLogonSessionReplaced = 34, - k_EResultConnectFailed = 35, - k_EResultHandshakeFailed = 36, - k_EResultIOFailure = 37, - k_EResultRemoteDisconnect = 38, - k_EResultShoppingCartNotFound = 39, - k_EResultBlocked = 40, - k_EResultIgnored = 41, - k_EResultNoMatch = 42, - k_EResultAccountDisabled = 43, - k_EResultServiceReadOnly = 44, - k_EResultAccountNotFeatured = 45, - k_EResultAdministratorOK = 46, - k_EResultContentVersion = 47, - k_EResultTryAnotherCM = 48, - k_EResultPasswordRequiredToKickSession = 49, - k_EResultAlreadyLoggedInElsewhere = 50, - k_EResultSuspended = 51, - k_EResultCancelled = 52, - k_EResultDataCorruption = 53, - k_EResultDiskFull = 54, - k_EResultRemoteCallFailed = 55, - k_EResultPasswordUnset = 56, - k_EResultExternalAccountUnlinked = 57, - k_EResultPSNTicketInvalid = 58, - k_EResultExternalAccountAlreadyLinked = 59, - k_EResultRemoteFileConflict = 60, - k_EResultIllegalPassword = 61, - k_EResultSameAsPreviousValue = 62, - k_EResultAccountLogonDenied = 63, - k_EResultCannotUseOldPassword = 64, - k_EResultInvalidLoginAuthCode = 65, - k_EResultAccountLogonDeniedNoMail = 66, - k_EResultHardwareNotCapableOfIPT = 67, - k_EResultIPTInitError = 68, - k_EResultParentalControlRestricted = 69, - k_EResultFacebookQueryError = 70, - k_EResultExpiredLoginAuthCode = 71, - k_EResultIPLoginRestrictionFailed = 72, - k_EResultAccountLockedDown = 73, - k_EResultAccountLogonDeniedVerifiedEmailRequired = 74, - k_EResultNoMatchingURL = 75, - k_EResultBadResponse = 76, - k_EResultRequirePasswordReEntry = 77, - k_EResultValueOutOfRange = 78, - k_EResultUnexpectedError = 79, - k_EResultDisabled = 80, - k_EResultInvalidCEGSubmission = 81, - k_EResultRestrictedDevice = 82, - k_EResultRegionLocked = 83, - k_EResultRateLimitExceeded = 84, - k_EResultAccountLoginDeniedNeedTwoFactor = 85, - k_EResultItemDeleted = 86, - k_EResultAccountLoginDeniedThrottle = 87, - k_EResultTwoFactorCodeMismatch = 88, - k_EResultTwoFactorActivationCodeMismatch = 89, - k_EResultAccountAssociatedToMultiplePartners = 90, - k_EResultNotModified = 91, - k_EResultNoMobileDevice = 92, - k_EResultTimeNotSynced = 93, - k_EResultSmsCodeFailed = 94, - k_EResultAccountLimitExceeded = 95, - k_EResultAccountActivityLimitExceeded = 96, - k_EResultPhoneActivityLimitExceeded = 97, - k_EResultRefundToWallet = 98, - k_EResultEmailSendFailure = 99, - k_EResultNotSettled = 100, - k_EResultNeedCaptcha = 101, - k_EResultGSLTDenied = 102, - k_EResultGSOwnerDenied = 103, - k_EResultInvalidItemType = 104, - k_EResultIPBanned = 105, - k_EResultGSLTExpired = 106, - k_EResultInsufficientFunds = 107, - k_EResultTooManyPending = 108, - k_EResultNoSiteLicensesFound = 109, - k_EResultWGNetworkSendExceeded = 110, - k_EResultAccountNotFriends = 111, - k_EResultLimitedUserAccount = 112, - k_EResultCantRemoveItem = 113, - k_EResultAccountDeleted = 114, - k_EResultExistingUserCancelledLicense = 115, - k_EResultCommunityCooldown = 116, - k_EResultNoLauncherSpecified = 117, - k_EResultMustAgreeToSSA = 118, - k_EResultLauncherMigrated = 119, - k_EResultSteamRealmMismatch = 120, - k_EResultInvalidSignature = 121, - k_EResultParseFailure = 122, - k_EResultNoVerifiedPhone = 123, -}; - -#if defined(__linux__) || defined(__APPLE__) -# pragma pack( push, 4 ) -#else -# pragma pack( push, 8 ) -#endif - -typedef struct CallbackMsg_t CallbackMsg_t; -struct CallbackMsg_t -{ - HSteamUser m_hSteamUser; // Specific user to whom this callback applies. - i32 m_iCallback; // Callback identifier. (Corresponds to the k_iCallback enum in the callback structure.) - void *m_pubParam; // Points to the callback structure - i32 m_cubParam; // Size of the data pointed to by m_pubParam -}; - -typedef struct SteamAPICallCompleted_t SteamAPICallCompleted_t; -struct SteamAPICallCompleted_t -{ - SteamAPICall_t m_hAsyncCall; - i32 m_iCallback; - u32 m_cubParam; -}; - -// Steam universes. Each universe is a self-contained Steam instance. -typedef enum EUniverse EUniverse; -enum EUniverse -{ - k_EUniverseInvalid = 0, - k_EUniversePublic = 1, - k_EUniverseBeta = 2, - k_EUniverseInternal = 3, - k_EUniverseDev = 4, - // k_EUniverseRC = 5, // no such universe anymore - k_EUniverseMax -}; - -#pragma pack( push, 1 ) -typedef struct SteamIDComponent_t SteamIDComponent_t; -struct SteamIDComponent_t -{ - u32 m_unAccountID : 32; - u32 m_unAccountInstance : 20; - u32 m_EAccountType : 4; - EUniverse m_EUniverse : 8; -}; - -typedef struct CSteamID CSteamID; -struct CSteamID -{ - union - { - SteamIDComponent_t m_comp; - u64 m_unAll64Bits; - }; -}; - -typedef struct GameID_t GameID_t; -struct GameID_t -{ - u32 m_nAppID : 24; - u32 m_nType : 8; - u32 m_nModID : 32; -}; -#pragma pack(pop) - -enum -{ - k_iSteamUserCallbacks = 100, - k_iSteamUser_SteamServersConnected = 101, - k_iSteamUser_SteamConnectFailure = 102, - k_iSteamUser_SteamServersDisconnected = 103, - k_iSteamUser_EncryptedAppTicketReponse = 154, - - k_iSteamGameServerCallbacks = 200, - - k_iSteamFriendsCallbacks = 300, - k_iSteamFriends_GameOverlayActivated = 331, - k_iSteamFriends_PersonaStateChange = 304, - - k_iSteamUtilsCallbacks = 700, - k_iSteamUtils_SteamAPICallCompleted = 703, - - k_iSteamUserStatsCallbacks = 1100, - k_iSteamUserStats_UserStatsReceived = 1101, - - k_iSteamNetworkingCallbacks = 1200, - - k_iSteamNetworkingSocketsCallbacks = 1220, - k_iSteamNetworkingSockets_SteamNetConnectionStatusChangedCallback = 1221, - k_iSteamNetworkingSockets_SteamNetAuthenticationStatus = 1222, - - k_iSteamNetworkingMessagesCallbacks = 1250, - k_iSteamNetworkingUtilsCallbacks = 1280, - - k_iSteamUGCCallbacks = 3400, - k_iSteamUGC_QueryCompleted = 3401, - k_iSteamUGC_CreateItemResult = 3403, - k_iSteamUGC_SubmitItemUpdateResult = 3404, -}; - -typedef struct SteamServerConnectFailure_t SteamServerConnectFailure_t; -struct SteamServerConnectFailure_t -{ - EResult m_eResult; - bool m_bStillRetrying; -}; - -typedef struct SteamServersDisconnected_t SteamServersDisconnected_t; -struct SteamServersDisconnected_t -{ - EResult m_eResult; -}; - -/* - * ------------------------------------------------------------------------------------------------------------------ - * MAIN - * ------------------------------------------------------------------------------------------------------------------ - */ - -typedef c8 SteamErrMsg[ 1024 ]; - -typedef enum EServerMode EServerMode; -enum EServerMode -{ - eServerModeInvalid = 0, - eServerModeNoAuthentication = 1, // Don't authenticate user logins and don't list on the server list - eServerModeAuthentication = 2, // Authenticate users, list on the server list, don't run VAC on clients that connect - eServerModeAuthenticationAndSecure = 3, // Authenticate users, list on the server list and VAC protect clients -}; - -typedef enum ESteamAPIInitResult ESteamAPIInitResult; -enum ESteamAPIInitResult -{ - k_ESteamAPIInitResult_OK = 0, - k_ESteamAPIInitResult_FailedGeneric = 1, // Some other failure - k_ESteamAPIInitResult_NoSteamClient = 2, // We cannot connect to Steam, steam probably isn't running - k_ESteamAPIInitResult_VersionMismatch = 3, // Steam client appears to be out of date -}; - - -#if defined( VG_ENGINE ) -extern ESteamAPIInitResult SteamInternal_SteamAPI_Init( const char *pszInternalCheckInterfaceVersions, SteamErrMsg *pOutErrMsg ); -extern void SteamAPI_Shutdown(); -extern HSteamPipe SteamAPI_GetHSteamPipe(); -extern HSteamUser SteamAPI_GetHSteamUser(); -#else - -/* usLegacySteamPort must be 0 */ - -extern ESteamAPIInitResult SteamInternal_GameServer_Init_V2( - u32 unIP, u16 usGamePort, u16 usQueryPort, EServerMode eServerMode, const c8 *pchVersionString, - const c8 *pszInternalCheckInterfaceVersions, SteamErrMsg *pOutErrMsg ); - -typedef void ISteamGameServer; -extern ISteamGameServer *SteamAPI_SteamGameServer_v015(); -extern void SteamAPI_ISteamGameServer_LogOn( ISteamGameServer *self, const c8 *pszToken ); -extern void SteamAPI_ISteamGameServer_LogOnAnonymous( ISteamGameServer *self ); -extern void SteamAPI_ISteamGameServer_LogOff( ISteamGameServer *self ); - -extern void SteamGameServer_Shutdown(); -HSteamPipe SteamGameServer_GetHSteamPipe(); -HSteamUser SteamGameServer_GetHSteamUser(); - -enum { k_nSteamEncryptedAppTicketSymmetricKeyLen = 32 }; -extern bool SteamEncryptedAppTicket_BDecryptTicket( const u8 *rgubTicketEncrypted, u32 cubTicketEncrypted, - u8 *rgubTicketDecrypted, u32 *pcubTicketDecrypted, - const u8 rgubKey[k_nSteamEncryptedAppTicketSymmetricKeyLen], i32 cubKey ); - -extern bool SteamEncryptedAppTicket_BIsTicketForApp( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted, AppId_t nAppID ); -extern u32 SteamEncryptedAppTicket_GetTicketIssueTime( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted ); -extern void SteamEncryptedAppTicket_GetTicketSteamID( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted, CSteamID *psteamID ); -extern AppId_t SteamEncryptedAppTicket_GetTicketAppID( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted ); -extern bool SteamEncryptedAppTicket_BUserOwnsAppInTicket( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted, AppId_t nAppID ); -extern bool SteamEncryptedAppTicket_BUserIsVacBanned( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted ); -extern bool SteamEncryptedAppTicket_BGetAppDefinedValue( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted, u32 *pValue ); -extern const u8 *SteamEncryptedAppTicket_GetUserVariableData( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted, u32 *pcubUserData ); -extern bool SteamEncryptedAppTicket_BIsTicketSigned( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted, const u8 *pubRSAKey, u32 cubRSAKey ); -extern bool SteamEncryptedAppTicket_BIsLicenseBorrowed( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted ); -extern bool SteamEncryptedAppTicket_BIsLicenseTemporary( u8 *rgubTicketDecrypted, u32 cubTicketDecrypted ); - -#endif - -/* LOOP (PUT IT THREAD 0) - * ------------------------------------------------------------------------------------------------------------------ */ -extern void SteamAPI_ManualDispatch_Init(); -extern void SteamAPI_ManualDispatch_RunFrame( HSteamPipe hSteamPipe ); -extern bool SteamAPI_ManualDispatch_GetNextCallback( HSteamPipe hSteamPipe, CallbackMsg_t *pCallbackMsg ); -extern void SteamAPI_ManualDispatch_FreeLastCallback( HSteamPipe hSteamPipe ); -extern bool SteamAPI_ManualDispatch_GetAPICallResult( HSteamPipe hSteamPipe, SteamAPICall_t hSteamAPICall, - void *pCallback, i32 cubCallback, i32 iCallbackExpected, bool *pbFailed ); - -/* - * ------------------------------------------------------------------------------------------------------------------ - * ISteamFriends - * ------------------------------------------------------------------------------------------------------------------ - */ -#if defined( VG_ENGINE ) - -typedef void ISteamFriends; -extern ISteamFriends *SteamAPI_SteamFriends_v018(); - -typedef enum EActivateGameOverlayToWebPageMode EActivateGameOverlayToWebPageMode; -enum EActivateGameOverlayToWebPageMode -{ - k_EActivateGameOverlayToWebPageMode_Default = 0, - k_EActivateGameOverlayToWebPageMode_Modal = 1 -}; -extern void SteamAPI_ISteamFriends_ActivateGameOverlayToWebPage( ISteamFriends *self, const c8 *pchURL, - EActivateGameOverlayToWebPageMode eMode ); - -void SteamFriends_ActivateGameOverlayToWebPage( const c8 *pchURL, EActivateGameOverlayToWebPageMode eMode ); - -typedef enum EOverlayToStoreFlag EOverlayToStoreFlag; -enum EOverlayToStoreFlag -{ - k_EOverlayToStoreFlag_None = 0, - k_EOverlayToStoreFlag_AddToCart = 1, - k_EOverlayToStoreFlag_AddToCartAndShow = 2, -}; -extern void SteamAPI_ISteamFriends_ActivateGameOverlayToStore( ISteamFriends *self, AppId_t nAppID, EOverlayToStoreFlag eFlag ); - -extern i32 SteamAPI_ISteamFriends_GetSmallFriendAvatar( ISteamFriends *self, uint64_steamid steamIDFriend ); -extern i32 SteamAPI_ISteamFriends_GetMediumFriendAvatar( ISteamFriends *self, uint64_steamid steamIDFriend ); -extern i32 SteamAPI_ISteamFriends_GetLargeFriendAvatar( ISteamFriends *self, uint64_steamid steamIDFriend ); -extern const c8 *SteamAPI_ISteamFriends_GetPersonaName( ISteamFriends *self ); - -typedef struct GameOverlayActivated_t GameOverlayActivated_t; -struct GameOverlayActivated_t -{ - bool m_bActive; -}; - -typedef struct PersonaStateChange_t PersonaStateChange_t; -struct PersonaStateChange_t -{ - u64 m_ulSteamID; // steamID of the friend who changed - int m_nChangeFlags; // what's changed -}; - -typedef enum EPersonaChange EPersonaChange; -enum EPersonaChange -{ - k_EPersonaChangeName = 0x0001, - k_EPersonaChangeStatus = 0x0002, - k_EPersonaChangeComeOnline = 0x0004, - k_EPersonaChangeGoneOffline = 0x0008, - k_EPersonaChangeGamePlayed = 0x0010, - k_EPersonaChangeGameServer = 0x0020, - k_EPersonaChangeAvatar = 0x0040, - k_EPersonaChangeJoinedSource= 0x0080, - k_EPersonaChangeLeftSource = 0x0100, - k_EPersonaChangeRelationshipChanged = 0x0200, - k_EPersonaChangeNameFirstSet = 0x0400, - k_EPersonaChangeBroadcast = 0x0800, - k_EPersonaChangeNickname = 0x1000, - k_EPersonaChangeSteamLevel = 0x2000, - k_EPersonaChangeRichPresence = 0x4000, -}; - -typedef enum EFriendFlags EFriendFlags; -enum EFriendFlags -{ - k_EFriendFlagNone = 0x00, - k_EFriendFlagBlocked = 0x01, - k_EFriendFlagFriendshipRequested = 0x02, - k_EFriendFlagImmediate = 0x04, // "regular" friend - k_EFriendFlagClanMember = 0x08, - k_EFriendFlagOnGameServer = 0x10, - // k_EFriendFlagHasPlayedWith = 0x20, // not currently used - // k_EFriendFlagFriendOfFriend = 0x40, // not currently used - k_EFriendFlagRequestingFriendship = 0x80, - k_EFriendFlagRequestingInfo = 0x100, - k_EFriendFlagIgnored = 0x200, - k_EFriendFlagIgnoredFriend = 0x400, - // k_EFriendFlagSuggested = 0x800, // not used - k_EFriendFlagChatMember = 0x1000, - k_EFriendFlagAll = 0xFFFF, -}; -extern bool SteamAPI_ISteamFriends_HasFriend( ISteamFriends *self, uint64_steamid steamIDFriend, i32 iFriendFlags ); - -#endif - -/* - * ------------------------------------------------------------------------------------------------------------------ - * ISteamUGC - * ------------------------------------------------------------------------------------------------------------------ - */ - -typedef void ISteamUGC; -typedef u64 PublishedFileId_t; -typedef u64 UGCQueryHandle_t; -typedef u64 UGCUpdateHandle_t; -typedef u64 UGCHandle_t; -typedef u64 PublishedFileUpdateHandle_t; - -typedef enum EItemUpdateStatus EItemUpdateStatus; -enum EItemUpdateStatus -{ - k_EItemUpdateStatusInvalid = 0, - k_EItemUpdateStatusPreparingConfig = 1, - k_EItemUpdateStatusPreparingContent = 2, - k_EItemUpdateStatusUploadingContent = 3, - k_EItemUpdateStatusUploadingPreviewFile= 4, - k_EItemUpdateStatusCommittingChanges = 5 -}; - -typedef enum EItemState EItemState; -enum EItemState -{ - k_EItemStateNone = 0, - k_EItemStateSubscribed = 1, - k_EItemStateLegacyItem = 2, - k_EItemStateInstalled = 4, - k_EItemStateNeedsUpdate = 8, - k_EItemStateDownloading = 16, - k_EItemStateDownloadPending= 32, - k_EItemStateDisabledLocally = 64, -}; - -typedef enum EWorkshopFileType EWorkshopFileType; -enum EWorkshopFileType -{ - k_EWorkshopFileTypeFirst = 0, - k_EWorkshopFileTypeCommunity = 0, - k_EWorkshopFileTypeMicrotransaction = 1, - k_EWorkshopFileTypeCollection = 2, - k_EWorkshopFileTypeArt = 3, - k_EWorkshopFileTypeVideo = 4, - k_EWorkshopFileTypeScreenshot = 5, - k_EWorkshopFileTypeGame = 6, - k_EWorkshopFileTypeSoftware = 7, - k_EWorkshopFileTypeConcept = 8, - k_EWorkshopFileTypeWebGuide = 9, - k_EWorkshopFileTypeIntegratedGuide = 10, - k_EWorkshopFileTypeMerch = 11, - k_EWorkshopFileTypeControllerBinding = 12, - k_EWorkshopFileTypeSteamworksAccessInvite = 13, - k_EWorkshopFileTypeSteamVideo = 14, - k_EWorkshopFileTypeGameManagedItem = 15, - k_EWorkshopFileTypeMax = 16 -}; - -typedef enum ERemoteStoragePublishedFileVisibility ERemoteStoragePublishedFileVisibility; -enum ERemoteStoragePublishedFileVisibility -{ - k_ERemoteStoragePublishedFileVisibilityPublic = 0, - k_ERemoteStoragePublishedFileVisibilityFriendsOnly = 1, - k_ERemoteStoragePublishedFileVisibilityPrivate = 2, - k_ERemoteStoragePublishedFileVisibilityUnlisted = 3, -}; - -typedef enum EUGCMatchingUGCType EUGCMatchingUGCType; -enum EUGCMatchingUGCType -{ - k_EUGCMatchingUGCType_Items = 0, - k_EUGCMatchingUGCType_Items_Mtx = 1, - k_EUGCMatchingUGCType_Items_ReadyToUse = 2, - k_EUGCMatchingUGCType_Collections = 3, - k_EUGCMatchingUGCType_Artwork = 4, - k_EUGCMatchingUGCType_Videos = 5, - k_EUGCMatchingUGCType_Screenshots = 6, - k_EUGCMatchingUGCType_AllGuides = 7, - k_EUGCMatchingUGCType_WebGuides = 8, - k_EUGCMatchingUGCType_IntegratedGuides = 9, - k_EUGCMatchingUGCType_UsableInGame = 10, - k_EUGCMatchingUGCType_ControllerBindings = 11, - k_EUGCMatchingUGCType_GameManagedItems = 12, - k_EUGCMatchingUGCType_All = ~0, -}; - -typedef enum EUserUGCList EUserUGCList; -enum EUserUGCList -{ - k_EUserUGCList_Published, - k_EUserUGCList_VotedOn, - k_EUserUGCList_VotedUp, - k_EUserUGCList_VotedDown, - k_EUserUGCList_WillVoteLater, - k_EUserUGCList_Favorited, - k_EUserUGCList_Subscribed, - k_EUserUGCList_UsedOrPlayed, - k_EUserUGCList_Followed, -}; - -// Sort order for user published UGC lists (defaults to creation order descending) -typedef enum EUserUGCListSortOrder EUserUGCListSortOrder; -enum EUserUGCListSortOrder -{ - k_EUserUGCListSortOrder_CreationOrderDesc, - k_EUserUGCListSortOrder_CreationOrderAsc, - k_EUserUGCListSortOrder_TitleAsc, - k_EUserUGCListSortOrder_LastUpdatedDesc, - k_EUserUGCListSortOrder_SubscriptionDateDesc, - k_EUserUGCListSortOrder_VoteScoreDesc, - k_EUserUGCListSortOrder_ForModeration, -}; - -// Combination of sorting and filtering for queries across all UGC -typedef enum EUGCQuery EUGCQuery; -enum EUGCQuery -{ - k_EUGCQuery_RankedByVote = 0, - k_EUGCQuery_RankedByPublicationDate = 1, - k_EUGCQuery_AcceptedForGameRankedByAcceptanceDate = 2, - k_EUGCQuery_RankedByTrend = 3, - k_EUGCQuery_FavoritedByFriendsRankedByPublicationDate = 4, - k_EUGCQuery_CreatedByFriendsRankedByPublicationDate = 5, - k_EUGCQuery_RankedByNumTimesReported = 6, - k_EUGCQuery_CreatedByFollowedUsersRankedByPublicationDate = 7, - k_EUGCQuery_NotYetRated = 8, - k_EUGCQuery_RankedByTotalVotesAsc = 9, - k_EUGCQuery_RankedByVotesUp = 10, - k_EUGCQuery_RankedByTextSearch = 11, - k_EUGCQuery_RankedByTotalUniqueSubscriptions = 12, - k_EUGCQuery_RankedByPlaytimeTrend = 13, - k_EUGCQuery_RankedByTotalPlaytime = 14, - k_EUGCQuery_RankedByAveragePlaytimeTrend = 15, - k_EUGCQuery_RankedByLifetimeAveragePlaytime = 16, - k_EUGCQuery_RankedByPlaytimeSessionsTrend = 17, - k_EUGCQuery_RankedByLifetimePlaytimeSessions = 18, - k_EUGCQuery_RankedByLastUpdatedDate = 19, -}; - -typedef struct SteamUGCDetails_t SteamUGCDetails_t; -struct SteamUGCDetails_t -{ - PublishedFileId_t m_nPublishedFileId; - EResult m_eResult; - EWorkshopFileType m_eFileType; - AppId_t m_nCreatorAppID; - AppId_t m_nConsumerAppID; - c8 m_rgchTitle[ 128+1 ]; - c8 m_rgchDescription[ 8000 ]; - u64 m_ulSteamIDOwner; - u32 m_rtimeCreated; - u32 m_rtimeUpdated; - u32 m_rtimeAddedToUserList; - ERemoteStoragePublishedFileVisibility m_eVisibility; - bool m_bBanned; - bool m_bAcceptedForUse; - bool m_bTagsTruncated; - c8 m_rgchTags[ 1024 + 1 ]; - UGCHandle_t m_hFile; - UGCHandle_t m_hPreviewFile; - c8 m_pchFileName[ 260 ]; - i32 m_nFileSize; - i32 m_nPreviewFileSize; - c8 m_rgchURL[ 256 ]; - u32 m_unVotesUp; - u32 m_unVotesDown; - f32 m_flScore; - u32 m_unNumChildren; -}; - -typedef struct CreateItemResult_t CreateItemResult_t; -struct CreateItemResult_t -{ - EResult m_eResult; - PublishedFileId_t m_nPublishedFileId; - bool m_bUserNeedsToAcceptWorkshopLegalAgreement; -}; - -typedef struct SubmitItemUpdateResult_t SubmitItemUpdateResult_t; -struct SubmitItemUpdateResult_t -{ - EResult m_eResult; - bool m_bUserNeedsToAcceptWorkshopLegalAgreement; - PublishedFileId_t m_nPublishedFileId; -}; - -typedef struct SteamUGCQueryCompleted_t SteamUGCQueryCompleted_t; -struct SteamUGCQueryCompleted_t -{ - UGCQueryHandle_t m_handle; - EResult m_eResult; - u32 m_unNumResultsReturned; - u32 m_unTotalMatchingResults; - bool m_bCachedData; - c8 m_rgchNextCursor[256]; -}; - -#if defined( VG_ENGINE ) -extern ISteamUGC *SteamAPI_SteamUGC_v021(); -#else -extern ISteamUGC *SteamAPI_SteamGameServerUGC_v021(); -#endif -extern SteamAPICall_t SteamAPI_ISteamUGC_CreateItem( ISteamUGC *self, AppId_t nConsumerAppId, - EWorkshopFileType eFileType ); - -extern bool SteamAPI_ISteamUGC_GetItemInstallInfo( ISteamUGC *self, PublishedFileId_t nPublishedFileID, - u64 *punSizeOnDisk, c8 *pchFolder, u32 cchFolderSize, - u32 *punTimeStamp ); - -extern u32 SteamAPI_ISteamUGC_GetItemState( ISteamUGC *self, PublishedFileId_t nPublishedFileID ); - -extern bool SteamAPI_ISteamUGC_GetQueryUGCMetadata( ISteamUGC *self, UGCQueryHandle_t handle, u32 index, - c8 *pchMetadata, u32 cchMetadatasize ); - -extern bool SteamAPI_ISteamUGC_GetQueryUGCResult( ISteamUGC *self, UGCQueryHandle_t handle, u32 index, - SteamUGCDetails_t *pDetails ); - -extern u32 SteamAPI_ISteamUGC_GetSubscribedItems( ISteamUGC *self, PublishedFileId_t *pvecPublishedFileID, - u32 cMaxEntries, bool bIncludeLocallyDisabled ); - -extern bool SteamAPI_ISteamUGC_ReleaseQueryUGCRequest( ISteamUGC *self, UGCQueryHandle_t handle ); -extern SteamAPICall_t SteamAPI_ISteamUGC_SendQueryUGCRequest( ISteamUGC *self, UGCQueryHandle_t handle ); -extern bool SteamAPI_ISteamUGC_SetItemContent( ISteamUGC *self, UGCUpdateHandle_t handle, const c8 *pszContentFolder ); -extern bool SteamAPI_ISteamUGC_SetItemDescription( ISteamUGC *self, UGCUpdateHandle_t handle, const c8 *pchDescription ); -extern bool SteamAPI_ISteamUGC_SetItemMetadata( ISteamUGC *self, UGCUpdateHandle_t handle, const c8 *pchMetaData ); -extern bool SteamAPI_ISteamUGC_SetItemPreview( ISteamUGC *self, UGCUpdateHandle_t handle, const c8 *pszPreviewFile ); -extern bool SteamAPI_ISteamUGC_SetItemTitle( ISteamUGC *self, UGCUpdateHandle_t handle, const c8 *pchTitle ); - -extern bool SteamAPI_ISteamUGC_SetItemVisibility( ISteamUGC *self, UGCUpdateHandle_t handle, - ERemoteStoragePublishedFileVisibility eVisibility ); - -extern bool SteamAPI_ISteamUGC_SetReturnMetadata( ISteamUGC *self, UGCQueryHandle_t handle, bool bReturnMetadata ); - -extern UGCUpdateHandle_t SteamAPI_ISteamUGC_StartItemUpdate( ISteamUGC *self, AppId_t nConsumerAppId, - PublishedFileId_t nPublishedFileID ); - -extern SteamAPICall_t SteamAPI_ISteamUGC_SubmitItemUpdate( ISteamUGC *self, UGCUpdateHandle_t handle, - const c8* pchChangeNote ); - -extern UGCQueryHandle_t SteamAPI_ISteamUGC_CreateQueryUserUGCRequest( - ISteamUGC *self, AccountID_t unAccountID, EUserUGCList eListType, - EUGCMatchingUGCType eMatchingUGCType, EUserUGCListSortOrder eSortOrder, - AppId_t nCreatorAppID, AppId_t nConsumerAppID, u32 unPage ); -/* - * ------------------------------------------------------------------------------------------------------------------ - * ISteamNetworkingSockets - * ------------------------------------------------------------------------------------------------------------------ - */ - -typedef void ISteamNetworkingSockets; -typedef u32 HSteamNetConnection; -typedef u32 HSteamListenSocket; -typedef u32 HSteamNetPollGroup; -typedef i64 SteamNetworkingMicroseconds; - -#pragma pack(push,1) -typedef struct SteamNetworkingIPAddr SteamNetworkingIPAddr; -struct SteamNetworkingIPAddr -{ - union - { - u8 m_ipv6[ 16 ]; - - /* RFC4038, section 4.2 */ - struct IPv4MappedAddress - { - u64 m_8zeros; - u16 m_0000; - u16 m_ffff; - u8 m_ip[ 4 ]; /* NOTE: As bytes, i.e. network byte order */ - } - m_ipv4; - }; - - u16 m_port; // Host byte order -}; - -typedef enum ESteamNetworkingIdentityType ESteamNetworkingIdentityType; -enum ESteamNetworkingIdentityType -{ - k_ESteamNetworkingIdentityType_Invalid = 0, - k_ESteamNetworkingIdentityType_SteamID = 16, // 64-bit CSteamID - k_ESteamNetworkingIdentityType_IPAddress = 1, - k_ESteamNetworkingIdentityType_GenericString = 2, - k_ESteamNetworkingIdentityType_GenericBytes = 3, - k_ESteamNetworkingIdentityType_UnknownType = 4, - k_ESteamNetworkingIdentityType__Force32bit = 0x7fffffff, -}; - -typedef struct SteamNetworkingIdentity SteamNetworkingIdentity; -struct SteamNetworkingIdentity -{ - ESteamNetworkingIdentityType m_eType; - - i32 m_cbSize; - union - { - u64 m_steamID64; - c8 m_szGenericString[ 32 ]; - u8 m_genericBytes[ 32 ]; - c8 m_szUnknownRawString[ 128 ]; - SteamNetworkingIPAddr m_ip; - u32 m_reserved[ 32 ]; - }; -}; -#pragma pack(pop) - -typedef enum ESteamNetworkingConfigValue ESteamNetworkingConfigValue; -enum ESteamNetworkingConfigValue -{ - k_ESteamNetworkingConfig_Invalid = 0, - k_ESteamNetworkingConfig_TimeoutInitial = 24, - k_ESteamNetworkingConfig_TimeoutConnected = 25, - k_ESteamNetworkingConfig_SendBufferSize = 9, - k_ESteamNetworkingConfig_ConnectionUserData = 40, - k_ESteamNetworkingConfig_SendRateMin = 10, - k_ESteamNetworkingConfig_SendRateMax = 11, - k_ESteamNetworkingConfig_NagleTime = 12, - k_ESteamNetworkingConfig_IP_AllowWithoutAuth = 23, - k_ESteamNetworkingConfig_MTU_PacketSize = 32, - k_ESteamNetworkingConfig_MTU_DataSize = 33, - k_ESteamNetworkingConfig_Unencrypted = 34, - k_ESteamNetworkingConfig_LocalVirtualPort = 38, - k_ESteamNetworkingConfig_DualWifi_Enable = 39, - k_ESteamNetworkingConfig_EnableDiagnosticsUI = 46, - k_ESteamNetworkingConfig_FakePacketLoss_Send = 2, - k_ESteamNetworkingConfig_FakePacketLoss_Recv = 3, - k_ESteamNetworkingConfig_FakePacketLag_Send = 4, - k_ESteamNetworkingConfig_FakePacketLag_Recv = 5, - k_ESteamNetworkingConfig_FakePacketReorder_Send = 6, - k_ESteamNetworkingConfig_FakePacketReorder_Recv = 7, - k_ESteamNetworkingConfig_FakePacketReorder_Time = 8, - k_ESteamNetworkingConfig_FakePacketDup_Send = 26, - k_ESteamNetworkingConfig_FakePacketDup_Recv = 27, - k_ESteamNetworkingConfig_FakePacketDup_TimeMax = 28, - k_ESteamNetworkingConfig_PacketTraceMaxBytes = 41, - k_ESteamNetworkingConfig_FakeRateLimit_Send_Rate = 42, - k_ESteamNetworkingConfig_FakeRateLimit_Send_Burst = 43, - k_ESteamNetworkingConfig_FakeRateLimit_Recv_Rate = 44, - k_ESteamNetworkingConfig_FakeRateLimit_Recv_Burst = 45, - k_ESteamNetworkingConfig_Callback_ConnectionStatusChanged = 201, - k_ESteamNetworkingConfig_Callback_AuthStatusChanged = 202, - k_ESteamNetworkingConfig_Callback_RelayNetworkStatusChanged = 203, - k_ESteamNetworkingConfig_Callback_MessagesSessionRequest = 204, - k_ESteamNetworkingConfig_Callback_MessagesSessionFailed = 205, - k_ESteamNetworkingConfig_Callback_CreateConnectionSignaling = 206, - k_ESteamNetworkingConfig_Callback_FakeIPResult = 207, - k_ESteamNetworkingConfig_P2P_STUN_ServerList = 103, - k_ESteamNetworkingConfig_P2P_Transport_ICE_Enable = 104, - k_ESteamNetworkingConfig_P2P_Transport_ICE_Penalty = 105, - k_ESteamNetworkingConfig_P2P_Transport_SDR_Penalty = 106, - k_ESteamNetworkingConfig_SDRClient_ConsecutitivePingTimeoutsFailInitial = 19, - k_ESteamNetworkingConfig_SDRClient_ConsecutitivePingTimeoutsFail = 20, - k_ESteamNetworkingConfig_SDRClient_MinPingsBeforePingAccurate = 21, - k_ESteamNetworkingConfig_SDRClient_SingleSocket = 22, - k_ESteamNetworkingConfig_SDRClient_ForceRelayCluster = 29, - k_ESteamNetworkingConfig_SDRClient_DebugTicketAddress = 30, - k_ESteamNetworkingConfig_SDRClient_ForceProxyAddr = 31, - k_ESteamNetworkingConfig_SDRClient_FakeClusterPing = 36, - k_ESteamNetworkingConfig_LogLevel_AckRTT = 13, // [connection int32] RTT calculations for inline pings and replies - k_ESteamNetworkingConfig_LogLevel_PacketDecode = 14, // [connection int32] log SNP packets send/recv - k_ESteamNetworkingConfig_LogLevel_Message = 15, // [connection int32] log each message send/recv - k_ESteamNetworkingConfig_LogLevel_PacketGaps = 16, // [connection int32] dropped packets - k_ESteamNetworkingConfig_LogLevel_P2PRendezvous = 17, // [connection int32] P2P rendezvous messages - k_ESteamNetworkingConfig_LogLevel_SDRRelayPings = 18, // [global int32] Ping relays - k_ESteamNetworkingConfig_DELETED_EnumerateDevVars = 35, - k_ESteamNetworkingConfigValue__Force32Bit = 0x7fffffff -}; - -typedef enum ESteamNetworkingConfigDataType ESteamNetworkingConfigDataType; -enum ESteamNetworkingConfigDataType -{ - k_ESteamNetworkingConfig_Int32 = 1, - k_ESteamNetworkingConfig_Int64 = 2, - k_ESteamNetworkingConfig_Float = 3, - k_ESteamNetworkingConfig_String = 4, - k_ESteamNetworkingConfig_Ptr = 5, - k_ESteamNetworkingConfigDataType__Force32Bit = 0x7fffffff -}; - -#pragma pack(push,8) -typedef struct SteamNetworkingConfigValue_t SteamNetworkingConfigValue_t; -struct SteamNetworkingConfigValue_t -{ - ESteamNetworkingConfigValue m_eValue; - ESteamNetworkingConfigDataType m_eDataType; - - /// Option value - union - { - i32 m_int32; - i64 m_int64; - f32 m_float; - const c8 *m_string; // Points to your '\0'-terminated buffer - void *m_ptr; - } - m_val; -}; - -typedef struct SteamNetworkingMessage_t SteamNetworkingMessage_t; -struct SteamNetworkingMessage_t -{ - void *m_pData; - i32 m_cbSize; - HSteamNetConnection m_conn; - SteamNetworkingIdentity m_identityPeer; - i64 m_nConnUserData; - SteamNetworkingMicroseconds m_usecTimeReceived; - i64 m_nMessageNumber; - void (*m_pfnFreeData)( SteamNetworkingMessage_t *pMsg ); - void (*m_pfnRelease)( SteamNetworkingMessage_t *pMsg ); - i32 m_nChannel; - i32 m_nFlags; - i64 m_nUserData; - u16 m_idxLane; - u16 _pad1__; -}; -#pragma pack(pop) - -#if defined( VG_ENGINE ) -extern ISteamNetworkingSockets *SteamAPI_SteamNetworkingSockets_SteamAPI_v012(); -#else -extern ISteamNetworkingSockets *SteamAPI_SteamGameServerNetworkingSockets_SteamAPI_v012(); -#endif - -extern EResult SteamAPI_ISteamNetworkingSockets_AcceptConnection( ISteamNetworkingSockets *self, HSteamNetConnection hConn ); -extern bool SteamAPI_ISteamNetworkingSockets_CloseConnection( ISteamNetworkingSockets *self, HSteamNetConnection hPeer, - i32 nReason, const c8 *pszDebug, bool bEnableLinger ); - -extern bool SteamAPI_ISteamNetworkingSockets_CloseListenSocket( ISteamNetworkingSockets *self, HSteamListenSocket hSocket ); -extern EResult SteamAPI_ISteamNetworkingSockets_ConfigureConnectionLanes( - ISteamNetworkingSockets *self, HSteamNetConnection hConn, i32 nNumLanes, const i32 *pLanePriorities, - const u16 *pLaneWeights ); - -extern HSteamNetConnection SteamAPI_ISteamNetworkingSockets_ConnectByIPAddress( - ISteamNetworkingSockets *self, - SteamNetworkingIPAddr *address, i32 nOptions, - SteamNetworkingConfigValue_t *pOptions ); - -extern HSteamListenSocket SteamAPI_ISteamNetworkingSockets_CreateListenSocketIP( - ISteamNetworkingSockets *self, SteamNetworkingIPAddr *localAddress, - i32 nOptions, const SteamNetworkingConfigValue_t *pOptions ); - -extern HSteamNetPollGroup SteamAPI_ISteamNetworkingSockets_CreatePollGroup( ISteamNetworkingSockets *self ); -extern bool SteamAPI_ISteamNetworkingSockets_DestroyPollGroup( - ISteamNetworkingSockets *self, HSteamNetPollGroup hPollGroup ); - -extern i64 SteamAPI_ISteamNetworkingSockets_GetConnectionUserData( - ISteamNetworkingSockets *self, HSteamNetConnection hPeer ); - -extern i32 SteamAPI_ISteamNetworkingSockets_ReceiveMessagesOnConnection( - ISteamNetworkingSockets *self, HSteamNetConnection hConn, - SteamNetworkingMessage_t **ppOutMessages, i32 nMaxMessages ); -extern i32 SteamAPI_ISteamNetworkingSockets_ReceiveMessagesOnPollGroup( - ISteamNetworkingSockets *self, HSteamNetPollGroup hPollGroup, - SteamNetworkingMessage_t **ppOutMessages, i32 nMaxMessages ); - -enum -{ - k_nSteamNetworkingSend_Unreliable = 0, - k_nSteamNetworkingSend_NoNagle = 1, - k_nSteamNetworkingSend_UnreliableNoNagle = k_nSteamNetworkingSend_Unreliable|k_nSteamNetworkingSend_NoNagle, - k_nSteamNetworkingSend_NoDelay = 4, - k_nSteamNetworkingSend_UnreliableNoDelay = k_nSteamNetworkingSend_Unreliable|k_nSteamNetworkingSend_NoDelay| - k_nSteamNetworkingSend_NoNagle, - k_nSteamNetworkingSend_Reliable = 8, - k_nSteamNetworkingSend_ReliableNoNagle = k_nSteamNetworkingSend_Reliable|k_nSteamNetworkingSend_NoNagle, - k_nSteamNetworkingSend_UseCurrentThread = 16, - k_nSteamNetworkingSend_AutoRestartBrokenSession = 32 -}; - -extern void SteamAPI_ISteamNetworkingSockets_SendMessages( - ISteamNetworkingSockets *self, i32 nMessages, - SteamNetworkingMessage_t *const *pMessages, i64 *pOutMessageNumberOrResult ); - -extern EResult SteamAPI_ISteamNetworkingSockets_SendMessageToConnection( - ISteamNetworkingSockets *self, HSteamNetConnection hConn, const void *pData, - u32 cbData, i32 nSendFlags, i64 *pOutMessageNumber ); - -extern bool SteamAPI_ISteamNetworkingSockets_SetConnectionPollGroup( - ISteamNetworkingSockets *self, HSteamNetConnection hConn, HSteamNetPollGroup hPollGroup ); -extern bool SteamAPI_ISteamNetworkingSockets_SetConnectionUserData( - ISteamNetworkingSockets *self, HSteamNetConnection hPeer, i64 nUserData ); - -typedef enum ESteamNetworkingConnectionState ESteamNetworkingConnectionState; -enum ESteamNetworkingConnectionState -{ - k_ESteamNetworkingConnectionState_None = 0, - k_ESteamNetworkingConnectionState_Connecting = 1, - k_ESteamNetworkingConnectionState_FindingRoute = 2, - k_ESteamNetworkingConnectionState_Connected = 3, - k_ESteamNetworkingConnectionState_ClosedByPeer = 4, - k_ESteamNetworkingConnectionState_ProblemDetectedLocally = 5, - k_ESteamNetworkingConnectionState_FinWait = -1, - k_ESteamNetworkingConnectionState_Linger = -2, - k_ESteamNetworkingConnectionState_Dead = -3, - k_ESteamNetworkingConnectionState__Force32Bit = 0x7fffffff -}; - -/// Enumerate various causes of connection termination. These are designed to work similar -/// to HTTP error codes: the numeric range gives you a rough classification as to the source -/// of the problem. -typedef enum ESteamNetConnectionEnd ESteamNetConnectionEnd; -enum ESteamNetConnectionEnd -{ - // Invalid/sentinel value - k_ESteamNetConnectionEnd_Invalid = 0, - k_ESteamNetConnectionEnd_App_Min = 1000, - k_ESteamNetConnectionEnd_App_Generic = k_ESteamNetConnectionEnd_App_Min, - k_ESteamNetConnectionEnd_App_Max = 1999, - k_ESteamNetConnectionEnd_AppException_Min = 2000, - k_ESteamNetConnectionEnd_AppException_Generic = k_ESteamNetConnectionEnd_AppException_Min, - k_ESteamNetConnectionEnd_AppException_Max = 2999, - k_ESteamNetConnectionEnd_Local_Min = 3000, - k_ESteamNetConnectionEnd_Local_OfflineMode = 3001, - k_ESteamNetConnectionEnd_Local_ManyRelayConnectivity = 3002, - k_ESteamNetConnectionEnd_Local_HostedServerPrimaryRelay = 3003, - k_ESteamNetConnectionEnd_Local_NetworkConfig = 3004, - k_ESteamNetConnectionEnd_Local_Rights = 3005, - k_ESteamNetConnectionEnd_Local_P2P_ICE_NoPublicAddresses = 3006, - k_ESteamNetConnectionEnd_Local_Max = 3999, - k_ESteamNetConnectionEnd_Remote_Min = 4000, - k_ESteamNetConnectionEnd_Remote_Timeout = 4001, - k_ESteamNetConnectionEnd_Remote_BadCrypt = 4002, - k_ESteamNetConnectionEnd_Remote_BadCert = 4003, - k_ESteamNetConnectionEnd_Remote_BadProtocolVersion = 4006, - k_ESteamNetConnectionEnd_Remote_P2P_ICE_NoPublicAddresses = 4007, - k_ESteamNetConnectionEnd_Remote_Max = 4999, - k_ESteamNetConnectionEnd_Misc_Min = 5000, - k_ESteamNetConnectionEnd_Misc_Generic = 5001, - k_ESteamNetConnectionEnd_Misc_InternalError = 5002, - k_ESteamNetConnectionEnd_Misc_Timeout = 5003, - k_ESteamNetConnectionEnd_Misc_SteamConnectivity = 5005, - k_ESteamNetConnectionEnd_Misc_NoRelaySessionsToClient = 5006, - k_ESteamNetConnectionEnd_Misc_P2P_Rendezvous = 5008, - k_ESteamNetConnectionEnd_Misc_P2P_NAT_Firewall = 5009, - k_ESteamNetConnectionEnd_Misc_PeerSentNoConnection = 5010, - k_ESteamNetConnectionEnd_Misc_Max = 5999, - k_ESteamNetConnectionEnd__Force32Bit = 0x7fffffff -}; - -typedef enum ESteamNetworkingAvailability ESteamNetworkingAvailability; -enum ESteamNetworkingAvailability -{ - k_ESteamNetworkingAvailability_CannotTry = -102, - k_ESteamNetworkingAvailability_Failed = -101, - k_ESteamNetworkingAvailability_Previously = -100, - k_ESteamNetworkingAvailability_Retrying = -10, - k_ESteamNetworkingAvailability_NeverTried = 1, - k_ESteamNetworkingAvailability_Waiting = 2, - k_ESteamNetworkingAvailability_Attempting = 3, - k_ESteamNetworkingAvailability_Current = 100, - k_ESteamNetworkingAvailability_Unknown = 0, - k_ESteamNetworkingAvailability__Force32bit = 0x7fffffff, -}; - -typedef struct SteamNetConnectionInfo_t SteamNetConnectionInfo_t; -struct SteamNetConnectionInfo_t -{ - SteamNetworkingIdentity m_identityRemote; - i64 m_nUserData; - HSteamListenSocket m_hListenSocket; - SteamNetworkingIPAddr m_addrRemote; - u16 m__pad1; - SteamNetworkingPOPID m_idPOPRemote; - SteamNetworkingPOPID m_idPOPRelay; - ESteamNetworkingConnectionState m_eState; - i32 m_eEndReason; - c8 m_szEndDebug[ 128 ]; - c8 m_szConnectionDescription[ 128 ]; - i32 m_nFlags; - u32 reserved[63]; -}; - -typedef struct SteamNetConnectionStatusChangedCallback_t SteamNetConnectionStatusChangedCallback_t; -struct SteamNetConnectionStatusChangedCallback_t -{ - HSteamNetConnection m_hConn; - SteamNetConnectionInfo_t m_info; - ESteamNetworkingConnectionState m_eOldState; -}; - -typedef struct SteamNetAuthenticationStatus_t SteamNetAuthenticationStatus_t; -struct SteamNetAuthenticationStatus_t -{ - ESteamNetworkingAvailability m_eAvail; - c8 m_debugMsg[ 256 ]; -}; - - -/* - * ------------------------------------------------------------------------------------------------------------------ - * ISteamNetworkingUtils - * ------------------------------------------------------------------------------------------------------------------ - */ - -typedef void ISteamNetworkingUtils; -extern ISteamNetworkingUtils *SteamAPI_SteamNetworkingUtils_SteamAPI_v004(); -extern SteamNetworkingMessage_t *SteamAPI_ISteamNetworkingUtils_AllocateMessage( - ISteamNetworkingUtils *self, i32 cbAllocateBuffer ); - - -/* - * ------------------------------------------------------------------------------------------------------------------ - * ISteamUser - * ------------------------------------------------------------------------------------------------------------------ - */ -#if defined( VG_ENGINE ) -typedef void ISteamUser; -extern ISteamUser *SteamAPI_SteamUser_v023(); -extern bool SteamAPI_ISteamUser_GetEncryptedAppTicket( ISteamUser *self, void *pTicket, i32 cbMaxTicket, u32 *pcbTicket ); -extern uint64_steamid SteamAPI_ISteamUser_GetSteamID( ISteamUser *self ); -extern SteamAPICall_t SteamAPI_ISteamUser_RequestEncryptedAppTicket( ISteamUser *self, void *pDataToInclude, i32 cbDataToInclude ); - -typedef struct EncryptedAppTicketResponse_t EncryptedAppTicketResponse_t; -struct EncryptedAppTicketResponse_t -{ - EResult m_eResult; -}; - -#endif - -/* - * ------------------------------------------------------------------------------------------------------------------ - * ISteamUserStats - * ------------------------------------------------------------------------------------------------------------------ - */ - -#if defined( VG_ENGINE ) -typedef void ISteamUserStats; -extern ISteamUserStats *SteamAPI_SteamUserStats_v013(); -extern bool SteamAPI_ISteamUserStats_GetAchievement( ISteamUserStats *self, const c8 *pchName, bool *pbAchieved ); -extern bool SteamAPI_ISteamUserStats_SetAchievement( ISteamUserStats *self, const c8 *pchName ); -extern bool SteamAPI_ISteamUserStats_ClearAchievement( ISteamUserStats *self, const c8 *pchName ); -extern SteamAPICall_t SteamAPI_ISteamUserStats_RequestUserStats( ISteamUserStats *self, uint64_steamid steamIDUser ); -extern bool SteamAPI_ISteamUserStats_StoreStats( ISteamUserStats *self ); - -typedef struct UserStatsReceived_t UserStatsReceived_t; -struct UserStatsReceived_t -{ - u64 m_nGameID; - EResult m_eResult; - CSteamID m_steamIDUser; -}; -#endif - -/* - * ------------------------------------------------------------------------------------------------------------------ - * ISteamUtils - * ------------------------------------------------------------------------------------------------------------------ - */ -typedef void ISteamUtils; -#if defined( VG_ENGINE ) -extern ISteamUtils *SteamAPI_SteamUtils_v010(); -#else -extern ISteamUtils *SteamAPI_SteamGameServerUtils_v010(); -#endif - -typedef void (*SteamAPIWarningMessageHook_t)(i32, const c8 *); -extern bool SteamAPI_ISteamUtils_GetImageSize( ISteamUtils *self, i32 iImage, u32 *pnWidth, u32 *pnHeight ); -extern bool SteamAPI_ISteamUtils_GetImageRGBA( ISteamUtils *self, i32 iImage, u8 *pubDest, i32 nDestBufferSize ); -extern void SteamAPI_ISteamUtils_SetWarningMessageHook( ISteamUtils *self, SteamAPIWarningMessageHook_t pFunction ); - -typedef enum ESteamAPICallFailure ESteamAPICallFailure; -enum ESteamAPICallFailure -{ - k_ESteamAPICallFailureNone = -1, - k_ESteamAPICallFailureSteamGone = 0, - k_ESteamAPICallFailureNetworkFailure = 1, - k_ESteamAPICallFailureInvalidHandle = 2, - k_ESteamAPICallFailureMismatchedCallback = 3, -}; -extern ESteamAPICallFailure SteamAPI_ISteamUtils_GetAPICallFailureReason( ISteamUtils *self, SteamAPICall_t hSteamAPICall ); - -extern void SteamAPI_SteamNetworkingIPAddr_Clear( SteamNetworkingIPAddr *self ); -extern bool SteamAPI_SteamNetworkingIPAddr_ParseString( SteamNetworkingIPAddr *self, const c8 *pszStr ); -extern void SteamAPI_SteamNetworkingMessage_t_Release( SteamNetworkingMessage_t *self ); - -#pragma pack( pop ) - - -/* - * ------------------------------------------------------------------------------------------------------------------ - * VG STEAM API - * ------------------------------------------------------------------------------------------------------------------ - */ - -typedef struct vg_steam_api_call vg_steam_api_call; -struct vg_steam_api -{ - bool disabled, demo_mode; - void (*cb_connection_changed)( SteamNetConnectionStatusChangedCallback_t *info ); - - HSteamPipe hPipe; - ISteamNetworkingSockets *pSteamNetworkingSockets; - ISteamUtils *pSteamUtils; - ISteamUGC *pSteamUGC; - ISteamNetworkingUtils *pSteamNetworkingUtils; - -#if defined( VG_ENGINE ) - void (*cb_persona_changed)( PersonaStateChange_t *info ); - - ISteamUtils *pSteamUser; - ISteamFriends *pSteamFriends; - ISteamUserStats *pSteamUserStats; - - c8 username_at_startup[ 128 ]; -#endif - -#if defined( VG_SERVER ) - ISteamGameServer *pSteamGameServer; - bool is_connected; -#endif - - struct vg_steam_api_call - { - SteamAPICall_t id; - void *userdata; - void( *cb )( void *result, void *userdata ); - } - api_calls[ 32 ]; - u32 api_call_count; - -#if defined( VG_SERVER ) - u8 server_symmetric_key[ k_nSteamEncryptedAppTicketSymmetricKeyLen ]; -#else - u8 app_symmetric_key[ 1024 ]; - u32 app_key_length; -#endif -} -extern _steam_api; - -#if defined( VG_SERVER ) -VG_API bool _vg_steam_init( u32 unIP, u16 usGamePort, u16 usQueryPort, EServerMode eServerMode, - const c8 *pchVersionString, const c8 *appid_str ); -#else -VG_API bool _vg_steam_init(void); -#endif -void vg_steam_frame(void); -VG_API void _vg_steam_shutdown(void); - -vg_steam_api_call *vg_alloc_async_steam_api_call(void); -void vg_steam_set_achievement( const c8 *name, bool yes ); - -#endif diff --git a/vg_string.c b/vg_string.c deleted file mode 100644 index 175e525..0000000 --- a/vg_string.c +++ /dev/null @@ -1,571 +0,0 @@ -i32 vg_str_storage( vg_str *str ) -{ - if( str->len == 0 ) - { - if( str->buffer ) - { - vg_str_dynamic *arr = (vg_str_dynamic *)str->buffer; - return (arr-1)->len; - } - else return 0; - } - else return str->len; -} - -void vg_strclip( vg_str *str, i32 i ) -{ - str->buffer[i] = '\0'; - str->i = i; -} - -/* - * Reset string. If len is 0 (dynamically allocated), buffer must be either - * NULL or be acquired from malloc or realloc - */ -void vg_strnull( vg_str *str, c8 *buffer, i32 len ) -{ - VG_ASSERT( len >= 0 ); - - str->buffer = buffer; - if( buffer ) - str->buffer[0] = '\0'; - - str->i = 0; - str->len = len; -} - -void vg_strfree( vg_str *str ) -{ - if( str->len == 0 ) - { - if( str->buffer ) - { - vg_str_dynamic *arr = (vg_str_dynamic *)str->buffer; - vg_free( arr-1 ); - - str->buffer = NULL; - str->i = 0; - } - } -} - -/* - * Double the size of the dynamically allocated string. If unallocated, alloc of - * 16 bytes minimum. - */ -static i32 vg_str_dynamic_grow( vg_str *str ) -{ - if( str->buffer ) - { - vg_str_dynamic *hdr = ((vg_str_dynamic *)str->buffer) - 1; - i32 total = (hdr->len + sizeof(vg_str_dynamic)) * 2; - hdr = vg_realloc( hdr, total ); - hdr->len = total - sizeof(vg_str_dynamic); - str->buffer = (c8 *)(hdr+1); - return hdr->len; - } - else - { - vg_str_dynamic *hdr = vg_malloc(16); - hdr->len = 16-sizeof(vg_str_dynamic); - str->buffer = (c8 *)(hdr+1); - str->buffer[0] = '\0'; - return hdr->len; - } -} - -static bool _vg_strcatch( vg_str *str, c8 c ) -{ - if( str->i == -1 ) return 0; - - i32 max = vg_str_storage( str ); - if( str->i == max ) - { - if( str->len == 0 ) - max = vg_str_dynamic_grow( str ); - else - { - str->i = -1; - str->buffer[ max-1 ] = '\0'; - return 0; - } - } - - str->buffer[ str->i ++ ] = c; - return 1; -} - -void vg_strcat_limit( vg_str *str, const c8 *append, u32 max ) -{ - if( !append || (str->i == -1) ) - return; - - i32 i = 0; - -append:; - c8 c = append[ i ++ ]; - if( !_vg_strcatch( str, c ) ) - return; - - if( max && i >= max ) - return; - - if( c == '\0' ) - { - str->i --; - return; - } - else goto append; -} - -void vg_strcat( vg_str *str, const c8 *append ) -{ - vg_strcat_limit( str, append, 0 ); -} - -void vg_strcatch( vg_str *str, c8 c ) -{ - _vg_strcatch( str, c ); - _vg_strcatch( str, '\x00' ); - str->i --; -} - -int vg_strgood( vg_str *str ) -{ - if( str->i == -1 ) return 0; - else return 1; -} - -bool vg_str_flushfd( vg_str *str, int fd ) -{ - bool good = write( fd, str->buffer, str->i ) == str->i; - str->i = 0; - return good; -} - -c8 vg_str_character( vg_str *str, i32 index ) -{ - return str->buffer[ index ]; -} - -/* - * Returns pointer to last instance of character - */ -i32 vg_strch( vg_str *str, i32 start, c8 c ) -{ - i32 last_index = -1; - for( i32 i=start; ii; i++ ) - if( str->buffer[i] == c ) - last_index = i; - return last_index; -} - -u32 vg_strcpy( const c8 *src, c8 *dst ) -{ - for( u32 i=0; i<32*1024; i ++ ) - { - dst[i] = src[i]; - if( !src[i] ) - return i; - } - - vg_fatal_error( "Hit string copy limit! (32 KB max length)\n" ); - return 0; -} - -u32 vg_strlen( const c8 *src ) -{ - for( u32 i=0; i<32*1024; i ++ ) - if( !src[i] ) - return i; - - vg_fatal_error( "Hit string len limit! (32 KB max length)\n" ); - return 0; -} - -u32 vg_strncpy( const c8 *src, c8 *dst, u32 len, enum strncpy_behaviour behaviour ) -{ - if( src == NULL ) - { - dst[0] = '\0'; - return 0; - } - - for( u32 i=0; i> k)) ) - return k; - } - - return 0; -} - -u32 str_utf8_collapse( const c8 *str, c8 *buf, u32 length ) -{ - u8 *ustr = (u8 *)str; - u32 utf32_code = 0x00000000; - u32 i=0, j=0, utf32_byte_ct=0; - for(;j < length-1;) - { - if( ustr[i] == 0x00 ) - break; - if( ustr[i] & 0x80 ) - { - if( utf32_byte_ct ) - { - utf32_byte_ct --; - utf32_code |= (ustr[i] & 0x3F) << (utf32_byte_ct*6); - if( !utf32_byte_ct ) - { - const c8 *match; - size_t c8s = anyascii( utf32_code, &match ); - for( u32 k=0; k> utf32_byte_ct); - utf32_code <<= utf32_byte_ct*6; - } - } - else - { - utf32_byte_ct = 0x00; - buf[j ++] = str[i]; - } - i++; - } - buf[j] = 0x00; - return j; -} -#endif - -const c8 *vg_strp_info_str[] = -{ - [k_vg_strp_ok] = "ok", - [k_vg_strp_eof] = "eof", - [k_vg_strp_error] = "error", - [k_vg_strp_whitespace] = "whitespace" -}; - -vg_strp_info vg_strp_c8( vg_strp *p, c8 *c ) -{ - *c = 0; - if( p->buffer == NULL ) - return k_vg_strp_eof; - - *c = *p->buffer; - if( *c == '\0' ) - { - p->buffer = NULL; - return k_vg_strp_eof; - } - p->buffer ++; - - if( *c == '\t' || *c == '\n' || *c == ' ' || *c == '\r' ) - return k_vg_strp_whitespace; - else - return k_vg_strp_ok; -} - -vg_strp_info vg_strp_u64( vg_strp *p, u64 *value ) -{ - c8 c; - vg_strp_info info = k_vg_strp_whitespace; - while( info == k_vg_strp_whitespace ) - info = vg_strp_c8( p, &c ); - - u64 result = 0; - bool got = 0; - while( info == k_vg_strp_ok ) - { - if( c >= '0' && c <= '9' ) - { - result = result*10 + ((u64)c - (u64)'0'); - got = 1; - } - else - goto err; - info = vg_strp_c8( p, &c ); - } - info = k_vg_strp_ok; - goto ok; - - err: while( info == k_vg_strp_ok ) - info = vg_strp_c8( p, &c ); - info = k_vg_strp_error; - - ok: *value = result; - return got? info: k_vg_strp_eof; -} - -vg_strp_info vg_strp_i64( vg_strp *p, i64 *value ) -{ - c8 c; - vg_strp_info info = k_vg_strp_whitespace; - while( info == k_vg_strp_whitespace ) - info = vg_strp_c8( p, &c ); - - i64 result = 0, - sign = 1; - - if( c == '+' || c == '-' ) - { - if( c == '-' ) - sign = -1; - info = vg_strp_c8( p, &c ); - } - - bool got = 0; - while( info == k_vg_strp_ok ) - { - if( c >= '0' && c <= '9' ) - { - result = result*10 + ((i64)c - (i64)'0'); - got = 1; - } - else - goto err; - - info = vg_strp_c8( p, &c ); - } - info = k_vg_strp_ok; - goto ok; - - err: while( info == k_vg_strp_ok ) - info = vg_strp_c8( p, &c ); - info = k_vg_strp_error; - - ok: *value = result*sign; - return got? info: k_vg_strp_eof; -} - -vg_strp_info vg_strp_f64( vg_strp *p, f64 *value ) -{ - c8 c; - vg_strp_info info = k_vg_strp_whitespace; - while( info == k_vg_strp_whitespace ) - info = vg_strp_c8( p, &c ); - - i64 result = 0, - resultm= 0; - u32 dp = 0; - f64 sign = 1.0; - - if( c == '+' || c == '-' ) - { - if( c == '-' ) - sign = -1.0; - info = vg_strp_c8( p, &c ); - } - - bool got = 0, got_decimal = 0; - while( info == k_vg_strp_ok ) - { - if( c == '.' ) - { - if( got_decimal ) - goto err; - resultm = result; - result = 0; - got_decimal = 1; - dp = 0; - } - else if( c >= '0' && c <= '9' ) - { - result = result*10 + ((i64)c - (i64)'0'); - got = 1; - dp ++; - } - else - goto err; - info = vg_strp_c8( p, &c ); - } - - info = k_vg_strp_ok; - goto ok; - - err: while( info == k_vg_strp_ok ) - info = vg_strp_c8( p, &c ); - info = k_vg_strp_error; - - ok:; - f64 int_part = 0.0, decimal_part = 0.0; - - if( got_decimal ) - { - decimal_part = (f64)result; - for( u32 i=0; i= 2 ); - - if( max_characters == 0 ) - max_characters = 64; - - const c8 *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; - if( value ) - { - u32 i = 0; - while( value && (i= 2 ); - - c8 temp[65]; - u32 digits = vg_strcatu64_internal( temp, value<0? -value: value, base, 0 ); - if( value < 0 ) - temp[ digits ++ ] = '-'; - - u32 padding = 0; - if( digits > width ) - padding = 0; - else - padding = width - digits; - - for( u32 i=0; i= 2 ); - - c8 temp[64]; - u32 digits = vg_strcatu64_internal( temp, value, base, 0 ); - for( u32 i=0; i= 2 ); - - if( value < 0 ) - { - vg_strcatch( str,'-' ); - value = -value; - } - vg_strcatu64( str, value, base ); -} - -void vg_strcatf64( vg_str *str, f64 value, u64 base, u32 decimal_places ) -{ - VG_ASSERT( decimal_places ); - VG_ASSERT( base >= 2 ); - - if( value < 0.0 ) - { - value = -value; - vg_strcat( str, "-" ); - } - - u64 m = 10; - for( u32 i=0; i<(decimal_places-1); i ++ ) - m *= 10; - - // decimal part gets +1.0f because anything less than 1 does not have leading 0s when printing it in the u64 print - u64 decimal_part = (u64)((f64)m * (value+1.0f) + 0.5), - normal_part = (u64)value; - - vg_strcatu64( str, normal_part, base ); - vg_strcat( str, "." ); - - c8 temp[64]; - u32 digits = vg_strcatu64_internal( temp, decimal_part, base, decimal_places ); - for( u32 i=0; iname = name; - _vg_tower.signal_count ++; - return id; -} - -void _vg_tower_register_trigger( u64 mask, void(*fn)( vg_signal_id id, bool state ) ) -{ - THREAD_0; - VG_ASSERT( _vg_tower.trigger_count < VG_ARRAY_LEN( _vg_tower.triggers ) ); - struct tower_trigger *trigger = &_vg_tower.triggers[ _vg_tower.trigger_count ++ ]; - trigger->mask = mask; - trigger->fn = fn; -} - -struct async_tower_info -{ - vg_signal_id id; - bool state; -}; -static void _vg_tower_set_flag_recall( vg_async_task *task ) -{ - struct async_tower_info *info = (void *)task->data; - _vg_tower_set_flag( info->id, info->state ); -} -void _vg_tower_set_flag( vg_signal_id id, bool state ) -{ - if( vg_thread_purpose() == _thread_purpose_loader ) - { - vg_async_task *task = vg_allocate_async_task( &vg.main_tasks, sizeof(struct async_tower_info), 1 ); - struct async_tower_info *info = (void *)task->data; - info->id = id; - info->state = state; - vg_async_task_dispatch( task, _vg_tower_set_flag_recall ); - return; - } - - THREAD_0; - - u64 bit = 0x1lu << (u64)id; - if( state ) _vg_tower.state |= bit; - else _vg_tower.state &= ~bit; - vg_info( "[tower] %s:%s [%lx]\n", _vg_tower.signals[id].name, state? "true": "false", _vg_tower.state ); - - for( u32 i=0; i<_vg_tower.trigger_count; i ++ ) - { - struct tower_trigger *trig = &_vg_tower.triggers[i]; - if( trig->mask & bit ) - { - trig->fn( id, state ); - } - } -} - -bool _vg_tower_clearence( u64 mask ) -{ - THREAD_0; - return (_vg_tower.state & mask) == mask; -} - -u64 _vg_tower_mask( vg_signal_id id ) -{ - u64 bit = 0x1lu << (u64)id; - return bit; -} diff --git a/vg_tower.h b/vg_tower.h deleted file mode 100644 index 988c56e..0000000 --- a/vg_tower.h +++ /dev/null @@ -1,33 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_tower.c" -#else - -typedef u8 vg_signal_id; - -struct _vg_tower -{ - struct tower_trigger - { - u64 mask; - void( *fn )( vg_signal_id id, bool state ); - } - triggers[ 64 ]; - - struct signal_info - { - const char *name; - } - signals[ 64 ]; - - u32 trigger_count, signal_count; - u64 state; -} -extern _vg_tower; - -vg_signal_id _vg_tower_create_signal( const char *name ); -void _vg_tower_register_trigger( u64 mask, void(*fn)( vg_signal_id id, bool state ) ); -void _vg_tower_set_flag( vg_signal_id id, bool state ); -bool _vg_tower_clearence( u64 mask ); -u64 _vg_tower_mask( vg_signal_id id ); - -#endif diff --git a/vg_ui/console.c b/vg_ui/console.c deleted file mode 100644 index 3639d05..0000000 --- a/vg_ui/console.c +++ /dev/null @@ -1,408 +0,0 @@ -u32 str_lev_distance( const char *s1, const char *s2 ) -{ - u32 m = strlen( s1 ), - n = strlen( s2 ); - - if( m==0 ) return n; - if( n==0 ) return m; - - u32 costs[ 256 ]; - - for( u32 k=0; k<=n; k++ ) - costs[k] = k; - - u32 i = 0; - for( u32 i=0; i=0; j -- ) - if( score > vg_console.suggestions[j].lev_score ) - best_pos = j; - - /* insert if good score */ - if( best_pos < VG_ARRAY_LEN( vg_console.suggestions ) ) - { - int start = VG_MIN( vg_console.suggestion_count, VG_ARRAY_LEN( vg_console.suggestions )-1 ); - for( int j=start; j>best_pos; j -- ) - vg_console.suggestions[j] = vg_console.suggestions[j-1]; - - vg_console.suggestions[ best_pos ].str = str; - vg_console.suggestions[ best_pos ].len = strlen( str ); - vg_console.suggestions[ best_pos ].lev_score = score; - - if( vg_console.suggestion_count < VG_ARRAY_LEN( vg_console.suggestions ) ) - vg_console.suggestion_count ++; - } -} - -static void console_update_suggestions( ui_context *ctx ) -{ - if( ctx->focused_control_type != k_ui_control_textbox || ctx->textbuf != vg_console.input ) - return; - - vg_console.suggestion_count = 0; - vg_console.suggestion_select = -1; - vg_console.suggestion_maxlen = 0; - - /* - * - must be typing something - * - must be at the end - * - prev char must not be a whitespace - * - cursors should match - */ - - if( ctx->textbox.cursor_pos == 0 ) return; - if( ctx->textbox.cursor_pos != ctx->textbox.cursor_user ) return; - if( vg_console.input[ ctx->textbox.cursor_pos ] != '\0' ) return; - - if( (vg_console.input[ ctx->textbox.cursor_pos -1 ] == ' ') || - (vg_console.input[ ctx->textbox.cursor_pos -1 ] == '\t') ) - return; - - char temp[128]; - const char *args[32]; - - int token_count = vg_console_tokenize( vg_console.input, temp, args ); - if( !token_count ) return; - vg_console.suggestion_pastepos = args[token_count-1]-temp; - - /* Score all our commands and cvars */ - if( token_count == 1 ) - { - for( int i=0; iname, args[0], 1 ); - } - - for( int i=0; iname, args[0], 1 ); - } - } - else - { - vg_cmd *cmd = vg_console_match_cmd( args[0] ); - vg_var *var = vg_console_match_var( args[0] ); - - if( cmd ) - if( cmd->poll_suggest ) - cmd->poll_suggest( token_count-1, &args[1] ); - } - - /* some post processing */ - for( int i=0; itextbox.cursor_user, - &ctx->textbox.cursor_pos, 10000, 1 ); - } - else - { - strncpy( target, - vg_console.suggestions[ vg_console.suggestion_select ].str, - VG_ARRAY_LEN( vg_console.input )-1 ); - - _ui_textbox_move_cursor( ctx, - &ctx->textbox.cursor_user, - &ctx->textbox.cursor_pos, 10000, 1 ); - _ui_textbox_put_char( ctx, ' ' ); - } -} - -static void _console_suggest_store_normal(void) -{ - if( vg_console.suggestion_select == -1 ) - { - char *target = &vg_console.input[ vg_console.suggestion_pastepos ]; - strcpy( vg_console.input_copy, target ); - } -} - -void console_suggest_next( ui_context *ctx ) -{ - if( vg_console.suggestion_count ) - { - _console_suggest_store_normal(); - - vg_console.suggestion_select ++; - - if( vg_console.suggestion_select >= vg_console.suggestion_count ) - vg_console.suggestion_select = -1; - - _console_fetch_suggestion( ctx ); - } -} - -void console_suggest_prev( ui_context *ctx ) -{ - if( vg_console.suggestion_count ) - { - _console_suggest_store_normal(); - - vg_console.suggestion_select --; - - if( vg_console.suggestion_select < -1 ) - vg_console.suggestion_select = vg_console.suggestion_count-1; - - _console_fetch_suggestion( ctx ); - } -} - -static void _vg_console_on_update( ui_context *ctx, char *buf, u32 len, void *userdata ) -{ - if( buf == vg_console.input ) - { - console_update_suggestions( ctx ); - } -} - -static void console_history_get( char* buf, int entry_num ) -{ - if( !vg_console.history_count ) - return; - - int offset = VG_MIN( entry_num, vg_console.history_count -1 ), - pick = (vg_console.history_last - offset) % - VG_ARRAY_LEN( vg_console.history ); - strcpy( buf, vg_console.history[ pick ] ); -} - -static void _vg_console_on_up( ui_context *ctx, char *buf, u32 len, void *userdata ) -{ - if( buf == vg_console.input ) - { - vg_console.history_pos = - VG_MAX - ( - 0, - VG_MIN - ( - vg_console.history_pos+1, - VG_MIN - ( - VG_ARRAY_LEN( vg_console.history ), - vg_console.history_count - 1 - ) - ) - ); - - console_history_get( vg_console.input, vg_console.history_pos ); - _ui_textbox_move_cursor( ctx, - &ctx->textbox.cursor_user, - &ctx->textbox.cursor_pos, - VG_ARRAY_LEN(vg_console.input)-1, 1 ); - } -} - -static void _vg_console_on_down( ui_context *ctx, char *buf, u32 len, void *userdata ) -{ - if( buf == vg_console.input ) - { - vg_console.history_pos = VG_MAX( 0, vg_console.history_pos-1 ); - console_history_get( vg_console.input, vg_console.history_pos ); - - _ui_textbox_move_cursor( ctx, - &ctx->textbox.cursor_user, - &ctx->textbox.cursor_pos, - VG_ARRAY_LEN(vg_console.input)-1, 1 ); - } -} - -static void _vg_console_on_enter( ui_context *ctx, char *buf, u32 len, void *userdata ) -{ - if( buf == vg_console.input ) - { - if( !strlen( vg_console.input ) ) - return; - - vg_info( "%s\n", vg_console.input ); - - if( strcmp( vg_console.input, vg_console.history[ vg_console.history_last ]) ) - { - vg_console.history_last = ( vg_console.history_last + 1) % VG_ARRAY_LEN(vg_console.history ); - vg_console.history_count = VG_MIN( VG_ARRAY_LEN( vg_console.history ), vg_console.history_count + 1 ); - strcpy( vg_console.history[ vg_console.history_last ], vg_console.input ); - } - - vg_console.history_pos = -1; - vg_execute_console_input( vg_console.input, 0, 0 ); - _ui_textbox_move_cursor( ctx, &ctx->textbox.cursor_user, &ctx->textbox.cursor_pos, -10000, 1 ); - vg_console.input[0] = '\0'; - console_update_suggestions( ctx ); - } - - vg_console.auto_focus = 1; -} - -void vg_console_draw( ui_context *ctx ) -{ - if( !vg_console.enabled ) - return; - VG_MUTEX_LOCK( vg_log.lock ); - - int ptr = vg_log.log_line_current; - int const fh = ctx->font->sy, log_lines = 32; - int console_lines = VG_MIN( log_lines, vg_log.log_line_count ); - ui_rect rect_log = { 0, 0, ctx->area[0], log_lines*fh }, - rect_input = { 0, log_lines*fh + 1, ctx->area[0], fh*2 }, - rect_line = { 0, 0, ctx->area[0], fh }; - - /* - * log - */ - u32 bg_colour = (ui_colour( ctx, k_ui_bg )&0x00ffffff)|0x9f000000; - - ui_fill( ctx, rect_log, bg_colour ); - rect_line[1] = rect_log[1]+rect_log[3]-fh; - - for( int i=0; ifont->sx*vg_console.suggestion_pastepos; - rect_suggest[1] += rect_input[3]; - rect_suggest[2] = ctx->font->sx * vg_console.suggestion_maxlen; - rect_suggest[3] = vg_console.suggestion_count * fh; - - ui_fill( ctx, rect_suggest, bg_colour ); - - rect_suggest[3] = fh; - - for( int i=0; iopen_result = k_dir_open_none; - browser->view_top_entry = NULL; - browser->whole_list = NULL; - browser->selected_entry = NULL; - browser->current_path[0] = '\0'; - browser->entry_count = 0; - browser->view_top_index = 0; - browser->slider_value = 0.0f; - browser->mode = k_filebrowser_mode_pick_file; - browser->filter = 0; -} - -void vg_filebrowser_set_path_to_home( struct vg_filebrowser *browser ) -{ -#ifdef _WIN32 - u16 *path = NULL; - if( SHGetKnownFolderPath( &FOLDERID_Documents, 0, NULL, &path ) == S_OK ) - { - if( !WideCharToMultiByte( CP_UTF8, 0, path, -1, browser->current_path, sizeof(browser->current_path), NULL, NULL ) ) - { - vg_error( "WideCharToMultiByte failed... defaulting to C:/\n" ); - vg_strncpy( "C:/", browser->current_path, sizeof(browser->current_path), k_strncpy_always_add_null ); - } - } - else - { - vg_error( "SHGetKnownFolderPath failed... defaulting to C:/\n" ); - vg_strncpy( "C:/", browser->current_path, sizeof(browser->current_path), k_strncpy_always_add_null ); - } - CoTaskMemFree( path ); -#else - vg_strncpy( getenv("HOME"), browser->current_path, sizeof(browser->current_path), k_strncpy_always_add_null ); -#endif -} - -static bool vg_filebrowser_up( struct vg_filebrowser *browser ) -{ - vg_str str = - { - .buffer = browser->current_path, - .i = strlen( browser->current_path ), - .len = sizeof(browser->current_path)-1 - }; - - char *sep = vg_strch( &str, '/' ); - if( sep ) - { - sep[0] = '\0'; - return 1; - } - else return 0; -} - -void filebrowser_textbox_callback( ui_context *ctx, char *buffer, u32 len, void *userdata ) -{ - struct vg_filebrowser *browser = userdata; - vg_filebrowser_free_entries( browser ); - vg_filebrowser_populate( browser ); -} - -enum filebrowser_action vg_filebrowser_ui( ui_context *ctx, ui_rect root_rect, struct vg_filebrowser *browser ) -{ - enum filebrowser_action result_action = k_filebrowser_action_none; - - ui_rect panel; - rect_copy( root_rect, panel ); - ui_rect_pad( panel, (ui_px[2]){8,8} ); - - ui_rect top_bar, box_refresh, box_up, bottom_bar; - ui_standard_widget( ctx, panel, top_bar, 1 ); - - ui_px height = ui_standard_widget_height( ctx, 1 ); - ui_split( panel, k_ui_axis_h, -height, ctx->padding, panel, bottom_bar ); - - ui_split( top_bar, k_ui_axis_v, 24, 1, box_refresh, top_bar ); - ui_split( top_bar, k_ui_axis_v, 24, 1, box_up, top_bar ); - - struct ui_textbox_callbacks callbacks = - { - .enter = filebrowser_textbox_callback, - .up = NULL, - .down = NULL, - .change = NULL, - .escape = NULL, - .userdata = browser - }; - - ctx->text_encoding = k_ui_text_encoding_utf8; - ui_textbox( ctx, top_bar, NULL, browser->current_path, sizeof(browser->current_path)-1, 1, 0, &callbacks ); - ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; - - ctx->font = &vgf_default_large; - if( ui_button_text( ctx, box_refresh, "\xb6", 1 ) == k_ui_button_click ) - { - vg_filebrowser_free_entries( browser ); - vg_filebrowser_populate( browser ); - } - - if( ui_button_text( ctx, box_up, "\xb8", 1 ) == k_ui_button_click ) - { - if( vg_filebrowser_up( browser ) ) - { - vg_filebrowser_free_entries( browser ); - vg_filebrowser_populate( browser ); - } - } - ctx->font = &vgf_default_small; - - if( browser->open_result == k_dir_open_none ) - { - ui_text( ctx, panel, "...", 1, k_ui_align_middle_center, 0 ); - } - else if( browser->open_result == k_dir_open_ok ) - { - ui_rect list_panel, scrollbar; - ui_split( panel, k_ui_axis_v, -16, 8, list_panel, scrollbar ); - u32 max_view = (list_panel[3]-2) / 24; - - /* scrollbar */ - f32 t; - enum ui_button_state state = ui_slider_base( ctx, scrollbar, k_ui_axis_v, 0, - browser->entry_count+1, &browser->slider_value, &t ); - enum ui_button_state mask_using = k_ui_button_holding_inside | - k_ui_button_holding_outside | - k_ui_button_click; - - if( state & mask_using ) - { - u32 target = browser->slider_value, - index = browser->view_top_index; - - while( index != target ) - { - struct vg_filebrowser_entry *new_top; - if( index < target ) - { - new_top = browser->view_top_entry->prev; - index ++; - } - else - { - new_top = browser->view_top_entry->next; - index --; - } - - if( new_top ) - { - browser->view_top_entry = new_top; - browser->view_top_index = index; - } - else break; - } - } - - ui_fill( ctx, scrollbar, ui_colour( ctx, k_ui_bg ) ); - ui_outline( ctx, scrollbar, -1, ui_colour(ctx, k_ui_bg+2), 0 ); - - ui_rect bar; - rect_copy( scrollbar, bar ); - bar[3] = (f32)scrollbar[3] * vg_minf(((f32)max_view / (f32)(browser->entry_count+1)), 1.0f); - bar[1] = scrollbar[1] + (f32)scrollbar[3] * ((f32)browser->view_top_index / (f32)(browser->entry_count+1)); - - ui_rect bar_top; - rect_copy( bar, bar_top ); - bar_top[3] = 1; - - ui_clip( scrollbar, bar, bar ); - ui_fill( ctx, bar, ui_colour( ctx, k_ui_bg+1 ) ); - ui_fill( ctx, bar_top, ui_colour( ctx, k_ui_fg ) ); - - /* entries */ - ui_fill( ctx, list_panel, ui_colour( ctx, k_ui_bg+3 ) ); - ui_rect entry_box = { list_panel[0]+1, list_panel[1]+1, list_panel[2]-2, 24 }; - struct vg_filebrowser_entry *entry = browser->view_top_entry; - - bool reload_next_time = 0; - - for( u32 i=0; iselected_entry ) - { - ui_fill( ctx, entry_box, ui_colour( ctx, k_ui_bg ) ); - ui_outline( ctx, entry_box, -1, ui_colour( ctx, k_ui_orange ), 0 ); - } - else - { - enum ui_button_state click_state = k_ui_button_none; - click_state = ui_colourbutton( ctx, entry_box, k_ui_bg+2+(i&0x1), 0, 0 ); - - if( click_state == k_ui_button_click ) - { - if( entry->type == k_vg_entry_type_dir ) - { - u32 cur_len = strlen( browser->current_path ); - if( (cur_len + strlen( entry->name ) + 2) > sizeof(browser->current_path) ) - vg_fatal_error( "Max path size exceeded." ); - else - { - strcat( browser->current_path, "/" ); - strcat( browser->current_path, entry->name ); - reload_next_time = 1; - } - } - else - { - browser->selected_entry = entry; - } - } - else if( click_state != k_ui_button_none ) - { - text_colour = ui_colour( ctx, k_ui_bg ); - } - } - - ui_rect icon_box, label_box; - ui_split( entry_box, k_ui_axis_v, 24, 0, icon_box, label_box ); - - ctx->font = &vgf_default_large; - if( entry->type == k_vg_entry_type_dir ) - { - ui_text( ctx, icon_box, "\xb7", 1, k_ui_align_middle_center, 0 ); - } - else - { - if( entry->media_type != 0 ) - { - const struct - { - const char *icon_str; - enum ui_scheme_colour colour; - } - scheme[] = - { - [k_media_type_image] = { "\xb9", k_ui_green }, - [k_media_type_video] = { "\xba", k_ui_blue }, - [k_media_type_audio] = { "\xbb", k_ui_purple }, - [k_media_type_text ] = { "\xbc", k_ui_yellow } - }; - - ui_text( ctx, icon_box, scheme[entry->media_type].icon_str, 1, - k_ui_align_middle_center, ui_colour(ctx,scheme[entry->media_type].colour) ); - } - } - ctx->font = &vgf_default_small; - - ctx->text_encoding = k_ui_text_encoding_utf8; - ui_text( ctx, label_box, entry->name, 1, k_ui_align_middle_left, 0 ); - ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; - - entry_box[1] += entry_box[3]; - entry = entry->prev; - } - else - break; - } - - if( reload_next_time ) - { - vg_filebrowser_free_entries( browser ); - vg_filebrowser_populate( browser ); - } - - ui_rect ok_box, cancel_box; - ui_split( bottom_bar, k_ui_axis_v, -120, ctx->padding, bottom_bar, ok_box ); - ui_split( bottom_bar, k_ui_axis_v, -80, ctx->padding, bottom_bar, cancel_box ); - - if( ui_button_text( ctx, cancel_box, "Cancel", 1 ) == k_ui_button_click ) - { - vg_filebrowser_free_entries( browser ); - result_action = k_filebrowser_action_escape; - } - - if( browser->selected_entry ) - { - if( ui_button_text( ctx, ok_box, "OK", 1 ) == k_ui_button_click ) - { - u32 cur_len = strlen( browser->current_path ); - if( (cur_len + strlen( browser->selected_entry->name ) + 2) > sizeof(browser->current_path) ) - vg_fatal_error( "Max path size exceeded." ); - else - { - strcat( browser->current_path, "/" ); - strcat( browser->current_path, browser->selected_entry->name ); - } - - vg_filebrowser_free_entries( browser ); - result_action = k_filebrowser_action_accept; - } - } - else - { - ui_fill( ctx, ok_box, ui_colour( ctx, k_ui_bg ) ); - ui_text( ctx, ok_box, "OK", 1, k_ui_align_middle_center, ui_colour( ctx, k_ui_bg+4 ) ); - } - } - else - { - ui_text( ctx, panel, dir_open_result_str[browser->open_result], 1, k_ui_align_middle_center, - ui_colour(ctx,k_ui_yellow) ); - } - - return result_action; -} - -void vg_filebrowser_free_entries( struct vg_filebrowser *browser ) -{ - struct vg_filebrowser_entry *entry = browser->whole_list; - - while( entry ) - { - struct vg_filebrowser_entry *prev = entry->prev; - - free( entry ); - entry = prev; - } - - browser->whole_list = NULL; - browser->view_top_entry = NULL; - browser->selected_entry = NULL; - browser->entry_count = 0; - browser->view_top_index = 0; - browser->slider_value = 0.0f; -} - -void vg_filebrowser_populate( struct vg_filebrowser *browser ) -{ - VG_ASSERT( browser->whole_list == NULL ); - - vg_dir dir; - browser->open_result = vg_dir_open( &dir, browser->current_path ); - browser->entry_count = 0; - browser->view_top_index = 0; - browser->slider_value = 0.0f; - - if( browser->open_result == k_dir_open_is_file ) - { - if( vg_filebrowser_up( browser ) ) - { - browser->open_result = vg_dir_open( &dir, browser->current_path ); - } - } - - if( browser->open_result != k_dir_open_ok ) - { - return; - } - - rax *rt_files = raxNew(), - *rt_dirs = raxNew(); - - while( vg_dir_next_entry( &dir ) ) - { - enum vg_entry_type type = vg_dir_entry_type( &dir ); - if( type == k_vg_entry_type_unknown ) - continue; - - const char *entry_name = vg_dir_entry_name( &dir ); - - enum vg_media_type media_type = k_media_type_none; - if( type == k_vg_entry_type_file ) - { - const char *ch = entry_name, *ext = NULL; - while( *ch ) - { - if( *ch == '.' ) - ext = (ch+1); - - ch ++; - } - - if( ext ) - { - if( !strcmp( ext, "jpg" ) || !strcmp( ext, "jpeg" ) || !strcmp( ext, "png" ) || !strcmp( ext, "tga" ) || - !strcmp( ext, "bmp" ) || !strcmp( ext, "psd" ) ) - { - media_type = k_media_type_image; - } - else if( !strcmp( ext, "mp4" ) || !strcmp( ext, "mkv" ) || !strcmp( ext, "mov" ) ) - { - media_type = k_media_type_video; - } - else if( !strcmp( ext, "opus" ) || !strcmp( ext, "ogg" ) || !strcmp( ext, "mp3" ) || !strcmp( ext, "wav" ) ) - { - media_type = k_media_type_audio; - } - else if( !strcmp( ext, "txt" ) || !strcmp( ext, "conf" ) || !strcmp( ext, "cfg" ) || !strcmp( ext, "c" ) || - !strcmp( ext, "h" ) || !strcmp( ext, "py" ) || !strcmp( ext, "sh" ) || !strcmp( ext, "gitignore" )) - { - media_type = k_media_type_text; - } - } - - if( browser->filter ) - { - if( !((0x1 << media_type) & browser->filter) ) - continue; - } - } - - u32 len = strlen( entry_name ); - struct vg_filebrowser_entry *entry = malloc( sizeof(struct vg_filebrowser_entry) + len + 1 ); - entry->next = NULL; - entry->prev = NULL; - entry->type = type; - entry->media_type = media_type; - strcpy( entry->name, entry_name ); - - if( type == k_vg_entry_type_dir ) - { - raxInsert( rt_dirs, (u8 *)entry->name, strlen(entry->name), entry, NULL ); - } - else if( type == k_vg_entry_type_file ) - { - raxInsert( rt_files, (u8 *)entry->name, strlen(entry->name), entry, NULL ); - } - else - continue; - - browser->entry_count ++; - } - vg_dir_close( &dir ); - - /* compile lists */ - struct vg_filebrowser_entry *folder_list_head = NULL, - *folder_list_tail = NULL, - *file_list_head = NULL; - raxIterator rt_iter; - raxStart( &rt_iter, rt_files ); - raxSeek( &rt_iter, "$", NULL, 0 ); - while( raxPrev( &rt_iter ) ) - { - struct vg_filebrowser_entry *entry = rt_iter.data; - entry->prev = file_list_head; - if( file_list_head ) - file_list_head->next = entry; - file_list_head = entry; - } - - raxStart( &rt_iter, rt_dirs ); - raxSeek( &rt_iter, "$", NULL, 0 ); - while( raxPrev( &rt_iter ) ) - { - struct vg_filebrowser_entry *entry = rt_iter.data; - entry->prev = folder_list_head; - if( folder_list_head ) - folder_list_head->next = entry; - else - folder_list_tail = entry; - folder_list_head = entry; - } - - /* attatch the two lists */ - if( folder_list_head ) - { - browser->whole_list = folder_list_head; - folder_list_tail->prev = file_list_head; - - if( file_list_head ) - file_list_head->next = folder_list_tail; - } - else - { - browser->whole_list = file_list_head; - } - - browser->view_top_entry = browser->whole_list; - - raxFree( rt_files ); - raxFree( rt_dirs ); -} diff --git a/vg_ui/filebrowser.h b/vg_ui/filebrowser.h deleted file mode 100644 index c5e4f1d..0000000 --- a/vg_ui/filebrowser.h +++ /dev/null @@ -1,57 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_ui/filebrowser.c" -#else - -struct vg_filebrowser_entry -{ - struct vg_filebrowser_entry *prev, *next; - - enum vg_entry_type type; - enum vg_media_type - { - k_media_type_none = 0, - k_media_type_image = 1, - k_media_type_video = 2, - k_media_type_audio = 3, - k_media_type_text = 4 - } - media_type; - - char name[]; -}; - -enum filebrowser_action -{ - k_filebrowser_action_none, - k_filebrowser_action_escape, - k_filebrowser_action_accept -}; - -struct vg_filebrowser -{ - char current_path[ 4096 ]; - - enum dir_open_result open_result; - - struct vg_filebrowser_entry *whole_list, *view_top_entry, *selected_entry; - u32 entry_count, view_top_index; - f32 slider_value; - - enum filebrowser_mode - { - k_filebrowser_mode_pick_folder, - k_filebrowser_mode_pick_file, - } - mode; - - u32 filter; -}; - -void vg_filebrowser_init( struct vg_filebrowser *browser ); -enum filebrowser_action vg_filebrowser_ui( ui_context *ctx, ui_rect root_rect, struct vg_filebrowser *browser ); -void vg_filebrowser_populate( struct vg_filebrowser *browser ); -void vg_filebrowser_free_entries( struct vg_filebrowser *browser ); - -void vg_filebrowser_set_path_to_home( struct vg_filebrowser *browser ); - -#endif diff --git a/vg_ui/imgui.c b/vg_ui/imgui.c deleted file mode 100644 index 95c33a8..0000000 --- a/vg_ui/imgui.c +++ /dev/null @@ -1,2029 +0,0 @@ -// TODO move this to the hconf! :D -#include "vg/vg_default_font.gc" - -void ui_init( ui_context *ctx, ui_vert *verts_buf, u32 verts_max, u16 *indices_buf, u32 indices_max ) -{ - ctx->vertex_buffer = verts_buf; - ctx->max_verts = verts_max; - ctx->cur_vert = 0; - ctx->vert_start = 0; - ctx->indice_buffer = indices_buf; - ctx->max_indices = indices_max; - ctx->cur_indice = 0; - ctx->indice_start = 0; - ctx->text_encoding = k_ui_text_encoding_ascii_vg_extended; - - if( !verts_buf || !indices_buf ) - exit(0); -} - -ui_vert *ui_fill_rect( ui_context *ctx, ui_rect rect, u32 colour, ui_px uv[4] ) -{ - /* this if far from ideal but stops us from crashing */ - if( (ctx->cur_vert + 4 > ctx->max_verts) || - (ctx->cur_indice + 6 > ctx->max_indices)) - { - return &ctx->vertex_buffer[0]; - } - - ui_vert *vertices = &ctx->vertex_buffer[ ctx->cur_vert ]; - u16 *indices = &ctx->indice_buffer[ ctx->cur_indice ]; - - for( int i=0; i<4; i++ ) - vertices[i].colour = colour; - - vertices[0].co[0] = rect[0]; - vertices[0].co[1] = rect[1]; - vertices[0].uv[0] = uv[0]; - vertices[0].uv[1] = uv[1]; - vertices[1].co[0] = rect[0]+rect[2]; - vertices[1].co[1] = rect[1]; - vertices[1].uv[0] = uv[2]; - vertices[1].uv[1] = uv[1]; - vertices[2].co[0] = rect[0]+rect[2]; - vertices[2].co[1] = rect[1]+rect[3]; - vertices[2].uv[0] = uv[2]; - vertices[2].uv[1] = uv[3]; - vertices[3].co[0] = rect[0]; - vertices[3].co[1] = rect[1]+rect[3]; - vertices[3].uv[0] = uv[0]; - vertices[3].uv[1] = uv[3]; - - u16 start = ctx->cur_vert; - u32 mesh[] = { 0,2,1, 0,3,2 }; - - for( u32 i=0; icur_indice += 6; - ctx->cur_vert += 4; - - return vertices; -} - -ui_vert *ui_fill( ui_context *ctx, ui_rect rect, u32 colour ) -{ - return ui_fill_rect( ctx, rect, colour, (ui_px[4]){ 4,4,4,4 } ); -} - -void ui_outline( ui_context *ctx, ui_rect rect, ui_px thickness, u32 colour, u32 mask ) -{ - /* this if far from ideal but stops us from crashing */ - if( (ctx->cur_vert + 8 > ctx->max_verts) || - (ctx->cur_indice + 24 > ctx->max_indices)) - return; - - ui_vert *vertices = &ctx->vertex_buffer[ ctx->cur_vert ]; - u16 *indices = &ctx->indice_buffer[ ctx->cur_indice ]; - - for( int i=0; i<8; i++ ) - { - vertices[i].uv[0] = 4; - vertices[i].uv[1] = 4; - vertices[i].colour = colour; - } - - vertices[0].co[0] = rect[0]; - vertices[0].co[1] = rect[1]; - vertices[1].co[0] = rect[0]+rect[2]; - vertices[1].co[1] = rect[1]; - vertices[2].co[0] = rect[0]+rect[2]; - vertices[2].co[1] = rect[1]+rect[3]; - vertices[3].co[0] = rect[0]; - vertices[3].co[1] = rect[1]+rect[3]; - vertices[4].co[0] = vertices[0].co[0]-thickness; - vertices[4].co[1] = vertices[0].co[1]-thickness; - vertices[5].co[0] = vertices[1].co[0]+thickness; - vertices[5].co[1] = vertices[1].co[1]-thickness; - vertices[6].co[0] = vertices[2].co[0]+thickness; - vertices[6].co[1] = vertices[2].co[1]+thickness; - vertices[7].co[0] = vertices[3].co[0]-thickness; - vertices[7].co[1] = vertices[3].co[1]+thickness; - - u16 start = ctx->cur_vert; - u32 mesh[] = { 0,5,4,0,1,5, 1,6,5,1,2,6, 2,7,6,2,3,7, 3,4,7,3,0,4 }; - - if( !mask ) - mask = UI_TOP|UI_LEFT|UI_BOTTOM|UI_RIGHT; - - u32 c = 0; - for( u32 i=0; icur_indice += c; - ctx->cur_vert += 8; -} - -void rect_copy( ui_rect a, ui_rect b ) -{ - for( int i=0; i<4; i++ ) - b[i] = a[i]; -} - -void ui_split( ui_rect rect, enum ui_axis other, ui_px width, ui_px gap, - ui_rect l, ui_rect r ) -{ - enum ui_axis dir = other ^ 0x1; - - if( width < 0 ) width = rect[ 2+dir ] + width; - - ui_rect temp; - rect_copy( rect, temp ); - - l[ dir ] = temp[ dir ]; - r[ dir ] = temp[ dir ] + width + (gap/2); - l[ other ] = temp[ other ]; - r[ other ] = temp[ other ]; - l[ 2+dir ] = width - (gap/2); - r[ 2+dir ] = temp[ 2+dir ] - width - (gap/2); - l[ 2+other ] = temp[ 2+other ]; - r[ 2+other ] = temp[ 2+other ]; -} - -void ui_split_ratio( ui_rect rect, enum ui_axis dir, float ratio, - ui_px gap, ui_rect l, ui_rect r ) -{ - ui_px width = (float)rect[ 2+(dir^0x1) ] * ratio; - ui_split( rect, dir, width, gap, l, r ); -} - -void ui_rect_pad( ui_rect rect, ui_px pad[2] ) -{ - rect[0] += pad[0]; - rect[1] += pad[1]; - rect[2] -= pad[0]*2; - rect[3] -= pad[1]*2; -} - -static ui_px ui_min( ui_px a, ui_px b ){ return ab?a:b; } -static ui_px ui_clamp( ui_px a, ui_px min, ui_px max ) -{ - return ui_min( max, ui_max( a, min ) ); -} - -int ui_clip( ui_rect parent, ui_rect child, ui_rect clipped ) -{ - ui_px parent_max[2], child_max[2]; - parent_max[0] = parent[0]+parent[2]; - parent_max[1] = parent[1]+parent[3]; - child_max[0] = child[0]+child[2]; - child_max[1] = child[1]+child[3]; - - clipped[0] = ui_clamp( child[0], parent[0], parent_max[0] ); - clipped[1] = ui_clamp( child[1], parent[1], parent_max[1] ); - clipped[2] = ui_clamp( child_max[0], parent[0], parent_max[0] ); - clipped[3] = ui_clamp( child_max[1], parent[1], parent_max[1] ); - - if( clipped[0] == clipped[2] || - clipped[1] == clipped[3] ) - return 0; - - clipped[2] -= clipped[0]; - clipped[3] -= clipped[1]; - - return 1; -} - -int ui_inside_rect( ui_rect rect, ui_px co[2] ) -{ - if( co[0] >= rect[0] && - co[1] >= rect[1] && - co[0] < rect[0]+rect[2] && - co[1] < rect[1]+rect[3] ){ - return 1; - } - else - return 0; -} - -int ui_click_down( ui_context *ctx, u32 mask ) -{ - if( ctx->ignore_input_frames ) return 0; - if( (ctx->mouse_state[0] & mask) && - !(ctx->mouse_state[1] & mask) ) - return 1; - else - return 0; -} - -int ui_clicking( ui_context *ctx, u32 mask ) -{ - if( ctx->ignore_input_frames ) return 0; - return ctx->mouse_state[0] & mask; -} - -int ui_click_up( ui_context *ctx, u32 mask ) -{ - if( ctx->ignore_input_frames ) return 0; - if( (ctx->mouse_state[1] & mask) && - !(ctx->mouse_state[0] & mask) ) - return 1; - else - return 0; -} - -void ui_update_mouse( ui_context *ctx, ui_px mouse[2], i32 mouse_state ) -{ - ctx->mouse_state[1] = ctx->mouse_state[0]; - ctx->mouse_state[0] = mouse_state; - ctx->mouse_delta[0] = mouse[0]-ctx->mouse_click[0]; - ctx->mouse_delta[1] = mouse[1]-ctx->mouse_click[1]; - - if( !ctx->mouse_pos_overriden ) - { - ctx->mouse[0] = mouse[0]; - ctx->mouse[1] = mouse[1]; - } - - if( ctx->ignore_input_frames ) - { - ctx->ignore_input_frames --; - return; - } - - if( ui_click_down(ctx, UI_MOUSE_ANY) ) - { - ctx->mouse_click[0] = ctx->mouse[0]; - ctx->mouse_click[1] = ctx->mouse[1]; - } -} - -void ui_prerender( ui_context *ctx ) -{ - ctx->cur_vert = 0; - ctx->cur_indice = 0; - ctx->vert_start = 0; - ctx->indice_start = 0; - ctx->focused_control_hit = 0; - ctx->cursor = k_ui_cursor_default; - ctx->wants_mouse = 0; - ctx->mouse_pos_overriden = 0; -} - -void ui_set_area( ui_context *ctx, i32 width, i32 height ) -{ - ctx->area[0] = width; - ctx->area[1] = height; -} - -void ui_ignore_input_frames( ui_context *ctx, u32 frames ) -{ - ctx->ignore_input_frames = frames; -} - -void ui_capture_mouse( ui_context *ctx, bool on ) -{ - ctx->wants_mouse = on; -} - -void ui_flush( ui_context *ctx, enum ui_shader shader, void *shader_data ) -{ - ui_batch batch; - batch.vert_offset = ctx->vert_start * sizeof(ui_vert); - batch.indice_offset = ctx->indice_start * sizeof(u16); - batch.vert_buf = ctx->vertex_buffer + ctx->vert_start; - batch.vert_count = ctx->cur_vert - ctx->vert_start; - batch.indice_buf = ctx->indice_buffer + ctx->indice_start; - batch.indice_count = ctx->cur_indice - ctx->indice_start; - - ctx->render_batch( ctx, &batch, shader, shader_data ); - - ctx->indice_start = ctx->cur_indice; - ctx->vert_start = ctx->cur_vert; -} - -void ui_rect_center( ui_rect parent, ui_rect rect ) -{ - rect[0] = parent[0] + (parent[2]-rect[2])/2; - rect[1] = parent[1] + (parent[3]-rect[3])/2; -} - -void ui_fit_item( ui_rect rect, ui_px size[2], ui_rect d ) -{ - i32 rp = (i32)rect[2] * (i32)size[1], - rc = (i32)size[0] * (i32)rect[3]; - - enum ui_axis dir, other; - if( rc > rp ) dir = k_ui_axis_h; - else dir = k_ui_axis_v; - other = dir ^ 0x1; - - d[2+dir] = rect[2+dir]; - d[2+other] = (rect[2+dir] * size[other]) / size[dir]; - - ui_rect_center( rect, d ); -} - -ui_px ui_text_line_width( ui_context *ctx, const char *str ) -{ - int length = 0; - const char *_c = str; - u8 c; - - while( (c = *(_c ++)) ) - { - /* skip vt colour codes */ - if( c == '\x1B' ) - { - while( (c = *(_c ++)) ) - { - if( c == 'm' ) - break; - } - - if( c == 0 ) break; - else continue; - } - - if( c >= 32 ) length ++; - else if( c == '\n' ) break; - } - - return length * ctx->font->sx; -} - -ui_px ui_text_string_height( ui_context *ctx, const char *str ) -{ - int height = 1; - const char *_c = str; - u8 c; - - while( (c = *(_c ++)) ) - { - if( c == '\n' ) height ++; - } - - return height * ctx->font->sy; -} - -ui_px ui_text_aligned_x( ui_context *ctx, - const char *str, ui_rect rect, ui_px scale, - enum ui_align align ) -{ - enum ui_align lwr = k_ui_align_lwr & align; - if( lwr == k_ui_align_left ){ - return rect[0]; - } - else{ - ui_px width = ui_text_line_width( ctx, str ) * scale; - - if( lwr == k_ui_align_right ) - return rect[0] + rect[2]-width; - else - return rect[0] + (rect[2]-width)/2; - } -} - -u32 ui_colour( ui_context *ctx, enum ui_scheme_colour id ) -{ - return ctx->scheme[ id ]; -} - -/* get an appropriately contrasting colour given the base */ -u32 ui_colourcont( ui_context *ctx, enum ui_scheme_colour id ) -{ - if ( id < k_ui_bg+6 ) return ui_colour(ctx, k_ui_fg ); - else if( id < k_ui_fg ) return ui_colour(ctx, k_ui_bg+1 ); - else if( id < k_ui_hue ) return ui_colour(ctx, k_ui_bg+3 ); - else if( id < k_ui_red+k_ui_brighter ) return ui_colour(ctx, k_ui_fg ); - else return ui_colour(ctx, k_ui_fg+1 ); -} - -void ui_hex_to_norm( u32 hex, v4f norm ) -{ - norm[0] = ((hex ) & 0xff); - norm[1] = ((hex>>8 ) & 0xff); - norm[2] = ((hex>>16) & 0xff); - norm[3] = ((hex>>24) & 0xff); - v4_muls( norm, 1.0f/255.0f, norm ); -} - -u32 v4f_u32_colour( v4f colour ) -{ - u32 r = colour[0] * 255.0f, - g = colour[1] * 255.0f, - b = colour[2] * 255.0f, - a = colour[3] * 255.0f; - - return r | (g<<8) | (b<<16) | (a<<24); -} - -static void ui_text_glyph( const struct vg_font_face *ff, u8 glyph, ui_rect out_texcoords ) -{ - const vg_font_char *ch = &ff->map[ glyph ]; - - out_texcoords[0] = ch->x; - out_texcoords[1] = ch->y; - out_texcoords[2] = ch->x + ff->cw; - out_texcoords[3] = ch->y + ff->ch; -} - -u32 ui_opacity( u32 colour, f32 opacity ) -{ - u32 alpha = opacity * 255.0f; - return (colour & 0x00ffffff) | (alpha << 24); -} - -u32 ui_ntext( ui_context *ctx, - ui_rect rect, const char *str, u32 len, ui_px scale, - enum ui_align align, u32 colour ) -{ - if( str == NULL ) - str = "NULL"; - - ui_px glow_text = 0; - - ui_rect text_cursor; - if( colour == 0 ) - colour = ui_colour( ctx, k_ui_fg ); - - colour &= 0x00ffffff; - - const char *_c = str; - u8 c; - - text_cursor[0] = ui_text_aligned_x( ctx, str, rect, scale, align ); - text_cursor[1] = rect[1]; - text_cursor[2] = ctx->font->cw*scale; - text_cursor[3] = ctx->font->ch*scale; - - u32 printed_chars = 0; - - if( align & (k_ui_align_middle|k_ui_align_bottom) ) - { - ui_px height = ui_text_string_height( ctx, str ) * scale; - - if( align & k_ui_align_bottom ) - text_cursor[1] += rect[3]-height; - else - text_cursor[1] += (rect[3]-height)/2; - } - - u32 utf8_counter = 0; - - while( (c = *(_c ++)) ) - { - if( ctx->text_encoding == k_ui_text_encoding_utf8 ) - { - if( utf8_counter ) - { - c = 0xbe; - utf8_counter --; - } - else - { - if ( (c & 0xe0) == 0xc0 ) utf8_counter = 1; - else if( (c & 0xf0) == 0xe0 ) utf8_counter = 2; - else if( (c & 0xf8) == 0xf0 ) utf8_counter = 3; - - if( utf8_counter ) - c = 0xbd; - } - } - - if( printed_chars >= len ) - { - printed_chars = 0; - text_cursor[1] += ctx->font->sy*scale; - text_cursor[0] = ui_text_aligned_x( ctx, _c, rect, scale, align ); - text_cursor[0] -= ctx->font->sx*scale; - - ui_rect glyph; - ui_text_glyph( ctx->font, '\xb1' /*FIXME*/, glyph ); - ui_fill_rect( ctx, text_cursor, 0x00ffffff, glyph ); - text_cursor[0] += ctx->font->sx*scale; - } - - if( c == '\n' ) - { - text_cursor[1] += ctx->font->sy*scale + ctx->kern[1]; - text_cursor[0] = ui_text_aligned_x( ctx, _c, rect, scale, align ); - printed_chars = 0; - continue; - } - else if( c >= 33 ) - { - ui_rect glyph; - ui_text_glyph( ctx->font, c, glyph ); - - ui_rect cursor_clipped; - if( ui_clip( rect, text_cursor, cursor_clipped ) ) - { - if( glow_text ) - { - cursor_clipped[1] += glow_text; - ui_fill_rect( ctx, cursor_clipped, 0x00ffffff, glyph ); - cursor_clipped[1] -= glow_text; - } - - ui_fill_rect( ctx, cursor_clipped, colour, glyph ); - } - } - else if( c == '\x1B' ) - { - /* vt codes */ - _c ++; - u16 colour_id = 0; - for( int i=0; i<3; i ++ ) - { - if( _c[i] ) - { - if( _c[i] == 'm' ) - { - _c = _c + i + 1; - - switch( colour_id ){ - case '0': colour = ui_colour(ctx, k_ui_fg ); break; - case '3'|'0'<<8: colour = ui_colour(ctx, k_ui_bg ); break; - case '3'|'1'<<8: colour = ui_colour(ctx, k_ui_red ); break; - case '3'|'2'<<8: colour = ui_colour(ctx, k_ui_green ); break; - case '3'|'3'<<8: colour = ui_colour(ctx, k_ui_yellow ); break; - case '3'|'4'<<8: colour = ui_colour(ctx, k_ui_blue ); break; - case '3'|'5'<<8: colour = ui_colour(ctx, k_ui_purple ); break; - case '3'|'6'<<8: colour = ui_colour(ctx, k_ui_aqua ); break; - case '3'|'7'<<8: colour = 0xffffffff; break; - } - - colour &= 0x00ffffff; - break; - } - - colour_id |= _c[i] << (i*8); - } - else - { - _c = _c +i; - break; - } - } - - continue; - } - else if( c == '\x06' ) - { - glow_text = *_c; - _c ++; - continue; - } - else if( c == '\x07' ) - { - glow_text = 0; - colour = ui_colour( ctx, k_ui_fg ) & 0x00ffffff; - continue; - } - else if( c == '\t' ) - { - text_cursor[0] += ctx->font->sx*scale*4; - printed_chars += 4; - continue; - } - - text_cursor[0] += ctx->font->sx*scale; - printed_chars ++; - } - - return printed_chars; -} - -u32 ui_text( ui_context *ctx, ui_rect rect, const char *str, ui_px scale, enum ui_align align, u32 colour ) -{ - return ui_ntext( ctx, rect, str, 1024, scale, align, colour ); -} - -/* - * Standard layout stuff - * ----------------------------------------------------------------------------- - */ - -void ui_panel( ui_context *ctx, ui_rect in_rect, ui_rect out_panel ) -{ - //ui_fill( ctx, in_rect, ui_colour(ctx, k_ui_bg+1 ) ); - ui_fill( ctx, in_rect, ui_opacity( ui_colour( ctx, k_ui_bg+1 ), 0.7f ) ); - ui_outline( ctx, in_rect, 1, ui_colour(ctx, k_ui_bg+7 ), 0 ); - rect_copy( in_rect, out_panel ); - ui_rect_pad( out_panel, (ui_px[2]){ 8, 8 } ); -} - -void ui_label( ui_context *ctx, - ui_rect rect, const char *text, ui_px size, - ui_px gap, ui_rect r ) -{ - ui_rect l; - ui_px width = (ui_text_line_width(ctx,text)+ctx->font->sx) * size; - ui_split( rect, k_ui_axis_v, width, gap, l, r ); - ui_text( ctx, l, text, 1, k_ui_align_middle_left, 0 ); -} - -ui_px ui_standard_widget_height( ui_context *ctx, ui_px count ) -{ - return (count * ctx->font->sy + 18) * ctx->scale; -} - -void ui_standard_widget( ui_context *ctx, ui_rect inout_panel, ui_rect out_rect, ui_px count ) -{ - ui_px height = ui_standard_widget_height( ctx, count ); - ui_split( inout_panel, k_ui_axis_h, height, ctx->padding, out_rect, inout_panel ); -} - -void ui_info( ui_context *ctx, ui_rect inout_panel, const char *text ) -{ - ui_rect box; - ui_standard_widget( ctx, inout_panel, box, 1 ); - ui_text( ctx, box, text, 1, k_ui_align_middle_left, 0 ); -} - -void ui_spacer( ui_context *ctx, ui_rect inout_panel ) -{ - ui_rect box; - ui_standard_widget( ctx, inout_panel, box, 1 ); - - ui_rect inner; - rect_copy( box, inner ); - inner[3] = 1; - inner[2] -= 16; - ui_rect_center( box, inner ); - ui_fill( ctx, inner, ui_colour( ctx, k_ui_bg+6 ) ); -} - -void ui_image( ui_context *ctx, ui_rect rect, void *image_resource, bool flip ) -{ - ui_flush( ctx, k_ui_shader_colour, NULL ); - if( flip ) - ui_fill_rect( ctx, rect, 0xffffffff, (ui_px[4]){ 0,0,256,256 } ); - else - ui_fill_rect( ctx, rect, 0xffffffff, (ui_px[4]){ 0,256,256,0 } ); - ui_flush( ctx, k_ui_shader_image, image_resource ); -} - -void ui_defocus_all( ui_context *ctx ) -{ - if( ctx->focused_control_type == k_ui_control_textbox ) - { - ctx->stop_text_input(); - if( ctx->textbox.callbacks.escape ) - ctx->textbox.callbacks.escape( ctx, ctx->textbox.callbacks.userdata ); - } - - ctx->focused_control_id = NULL; - ctx->focused_control_hit = 0; - ctx->focused_control_type = k_ui_control_none; -} - -enum ui_button_state ui_button_base( ui_context *ctx, ui_rect rect ) -{ - int clickup= ui_click_up(ctx, UI_MOUSE_LEFT), - click = ui_clicking(ctx, UI_MOUSE_LEFT) | clickup, - target = ui_inside_rect( rect, ctx->mouse_click ) && click, - hover = ui_inside_rect( rect, ctx->mouse ); - - if( ctx->focused_control_type != k_ui_control_none ) - { - clickup = 0; - click = 0; - target = 0; - hover = 0; - } - - if( hover ) - ctx->cursor = k_ui_cursor_hand; - - if( click ) - { - if( target ) - { - if( hover ) - { - if( clickup ) - { - ui_ignore_input_frames( ctx, 2 ); - ui_defocus_all( ctx ); - return k_ui_button_click; - } - else return k_ui_button_holding_inside; - } - else return k_ui_button_holding_outside; - } - else return k_ui_button_none; - } - else - { - if( hover ) return k_ui_button_hover; - else return k_ui_button_none; - } -} - -/* TODO: split this out into a formatless button and one that auto fills */ -enum ui_button_state ui_colourbutton( ui_context *ctx, ui_rect rect, - enum ui_scheme_colour colour, - enum ui_scheme_colour hover_colour, - enum ui_scheme_colour hi_colour ) -{ - enum ui_button_state state = ui_button_base( ctx, rect ); - - u32 col_base = ctx->scheme[ colour ], - col_highlight = ctx->scheme[ hi_colour? hi_colour: k_ui_fg ], - col_hover = ctx->scheme[ hover_colour? hover_colour: colour + k_ui_brighter ]; - - if( state == k_ui_button_click ) - { - ui_fill( ctx, rect, col_highlight ); - rect_copy( rect, ctx->click_fader ); - rect_copy( rect, ctx->click_fader_end ); - ctx->click_fader_end[3] = 0; - ui_rect_center( rect, ctx->click_fader_end ); - ctx->click_fade_opacity = 1.0f; - } - else if( state == k_ui_button_holding_inside ) - { - ui_fill( ctx, rect, col_highlight ); - } - else if( state == k_ui_button_holding_outside ) - { - ui_fill( ctx, rect, col_base ); - ui_outline( ctx, rect, 1, col_highlight, 0 ); - } - else if( state == k_ui_button_hover ) - { - ui_fill( ctx, rect, col_hover ); - } - else ui_fill( ctx, rect, col_base ); - - return state; -} - -enum ui_button_state ui_colourbutton_text( - ui_context *ctx, - ui_rect rect, const char *string, ui_px scale, - enum ui_scheme_colour colour ) -{ - enum ui_button_state state = ui_colourbutton( ctx, rect, colour, 0, 0 ); - - u32 text_colour = ui_colourcont( ctx, colour ); - if( state == k_ui_button_holding_inside ) - text_colour = colour; - - ui_text( ctx, rect, string, scale, k_ui_align_middle_center, text_colour ); - return state; -} - -enum ui_button_state ui_button_text( ui_context *ctx, ui_rect rect, - const char *string, ui_px scale ) -{ - return ui_colourbutton_text( ctx, rect, string, scale, k_ui_bg+4 ); -} - -enum ui_button_state ui_button( ui_context *ctx, - ui_rect inout_panel, const char *string ) -{ - ui_rect rect; - ui_standard_widget( ctx, inout_panel, rect, 1 ); - return ui_colourbutton_text( ctx, rect, string, 1, k_ui_bg+4 ); -} - -static void ui_enum_post( ui_context *ctx ); -void ui_postrender( ui_context *ctx, f32 delta_time ) -{ - if( ctx->click_fade_opacity > 0.0f ) - { - float scale = ctx->click_fade_opacity; - scale = vg_maxf( 1.0f/255.0f, scale*scale ); - - ctx->click_fade_opacity -= delta_time * 3.8f; - u32 colour = (0x00ffffff & ui_colour(ctx,k_ui_fg))|0x7f000000; - - v4f begin, end, dest; - for( int i=0; i<4; i++ ){ - begin[i] = ctx->click_fader[i]; - end[i] = ctx->click_fader_end[i]+1; - } - - v4_lerp( end, begin, scale, dest ); - - ui_rect rect; - for( int i=0; i<4; i++ ){ - rect[i] = dest[i]; - } - - ui_fill( ctx, rect, colour ); - } - - if( ctx->focused_control_type == k_ui_control_enum ) - { - ui_enum_post( ctx ); - } - else if( ctx->focused_control_type == k_ui_control_modal ) - { - ui_rect screen = { 0,0, ctx->area[0], ctx->area[1] }; - ui_fill( ctx, screen, 0xa0000000 ); - ui_rect box = {0,0,416,216}; - - u32 colour = ui_colour(ctx,k_ui_fg), - type = ctx->modal.options & UI_MODAL_TYPE_BITS; - if ( type == 1 ) colour = ui_colour(ctx,k_ui_green); - else if( type == 2 ) colour = ui_colour(ctx,k_ui_red); - else if( type == 3 ) colour = ui_colour(ctx,k_ui_yellow); - - ui_rect_center( screen, box ); - ui_fill( ctx, box, ui_colour(ctx,k_ui_bg) ); - ui_outline( ctx, box, -1, colour, 0 ); - ui_rect_pad( box, (ui_px[]){8,8} ); - - ui_rect message; - rect_copy( box, message ); - message[3] = 150; - ui_rect_center( box, message ); - - ui_rect row0, row1; - ui_split( message, k_ui_axis_h, -28, 0, row0, row1 ); - row0[0] += ctx->font->sx; - ui_ntext( ctx, row0, ctx->modal.message, (box[2]/ctx->font->sx)-2, 1, k_ui_align_left, colour ); - - ui_rect btn_ok; - ui_split( row1, k_ui_axis_v, -120, 8, row1, btn_ok ); - - ctx->focused_control_type = k_ui_control_none; /* HACK */ - - bool close_modal = 0; - if( ctx->modal.options & UI_MODAL_CANCEL ) - { - ui_rect btn_cancel; - ui_split( row1, k_ui_axis_v, -120, 8, row1, btn_cancel ); - if( ui_button_text( ctx, btn_cancel, "Cancel", 1 ) == k_ui_button_click ) - { - if( ctx->modal.callbacks.close ) - ctx->modal.callbacks.close( UI_MODAL_CANCEL ); - - close_modal = 1; - } - } - - if( ui_button_text( ctx, btn_ok, ctx->modal.ok_text, 1 ) == k_ui_button_click ) - { - if( ctx->modal.callbacks.close ) - ctx->modal.callbacks.close( 0 ); - - close_modal = 1; - } - - if( !close_modal ) - ctx->focused_control_hit = 1; - - ctx->focused_control_type = k_ui_control_modal; /* HACK */ - ctx->wants_mouse = 1; - } - - ui_flush( ctx, k_ui_shader_colour, NULL ); - - if( !ctx->focused_control_hit ) - { - ui_defocus_all( ctx ); - } -} - -/* - * checkbox - * ----------------------------------------------------------------------------- - */ - -enum ui_button_state ui_checkbox_base( ui_context *ctx, ui_rect box, i32 *data ) -{ - enum ui_button_state state = ui_button_base( ctx, box ); - if( state == k_ui_button_click ) - *data = (*data) ^ 0x1; - return state; -} - -int ui_checkbox( ui_context *ctx, - ui_rect inout_panel, const char *str_label, i32 *data ) -{ - ui_rect rect, label, box; - ui_standard_widget( ctx, inout_panel, rect, 1 ); - - ui_split( rect, k_ui_axis_v, -rect[3], 0, label, box ); - ui_text( ctx, label, str_label, ctx->scale, k_ui_align_middle_left, 0 ); - - enum ui_button_state state = ui_checkbox_base( ctx, box, data ); - - if( state == k_ui_button_holding_inside ) - { - ui_fill( ctx, box, ui_colour(ctx,k_ui_bg+2) ); - ui_outline( ctx, box, 1, ui_colour(ctx,k_ui_fg), 0 ); - } - else if( state == k_ui_button_holding_outside ) - { - ui_fill( ctx, box, ui_colour(ctx,k_ui_bg) ); - ui_outline( ctx, box, 1, ui_colour(ctx,k_ui_fg), 0 ); - } - else if( state == k_ui_button_hover ) - { - ui_fill( ctx, box, ui_colour(ctx,k_ui_bg) ); - ui_outline( ctx, box, 1, ui_colour(ctx,k_ui_fg), 0 ); - } - else - { - ui_fill( ctx, box, ui_colour(ctx,k_ui_bg) ); - ui_outline( ctx, box, 1, ui_colour(ctx,k_ui_bg+4), 0 ); - } - - bool changed = (state == k_ui_button_click); - - if( *data ) - { - ui_rect_pad( box, (ui_px[2]){4,4} ); - ui_fill( ctx, box, ui_colour(ctx, k_ui_orange ) ); - } - - return changed; -} - -/* - * Dropdown / Enum - * ----------------------------------------------------------------------------- - */ - -/* - * unfortunately no return value since we only find out that event in the - * postrender step. - */ -void ui_enum( ui_context *ctx, ui_rect inout_panel, const char *str_label, - struct ui_enum_opt *options, u32 len, i32 *value ) -{ - ui_rect rect, box; - ui_standard_widget( ctx, inout_panel, rect, 1 ); - - if( str_label ) - ui_label( ctx, rect, str_label, ctx->scale, 0, box ); - else - rect_copy( rect, box ); - - const char *display = "OUT OF RANGE"; - int valid = 0; - for( u32 i=0; iscale ) == 1 ) - { - ctx->focused_control_type = k_ui_control_enum; - ctx->ptr_enum = value; - ctx->_enum.option_count = len; - ctx->_enum.options = options; - rect_copy( box, ctx->_enum.rect ); - } - - if( !valid ) - ui_outline( ctx, box, 1, ui_colour(ctx,k_ui_red), 0 ); -} - -static void ui_enum_post( ui_context *ctx ) -{ - ui_rect drawer; - rect_copy( ctx->_enum.rect, drawer ); - drawer[3] *= ctx->_enum.option_count; - - int close = 0; - int clickany= ui_click_up( ctx, UI_MOUSE_ANY ), - hover = ui_inside_rect( drawer, ctx->mouse ); - - if( clickany && !hover ) - return; - - /* HACK */ - ctx->focused_control_type = k_ui_control_none; - i32 *value = ctx->ptr_enum; - - for( u32 i=0; i_enum.option_count; i++ ){ - ui_rect button; - ui_split( drawer, k_ui_axis_h, ctx->_enum.rect[3], 0, button,drawer ); - - enum ui_scheme_colour colour = k_ui_bg+3; - if( ctx->_enum.options[i].value == *value ) - colour = k_ui_orange; - - if( ui_colourbutton_text( ctx, button, ctx->_enum.options[i].alias, - ctx->scale, colour ) == 1 ){ - *value = ctx->_enum.options[i].value; - close = 1; - } - } - - /* HACK */ - ctx->focused_control_type = k_ui_control_enum; - - if( !close ) - ctx->focused_control_hit = 1; -} - -/* - * Slider - * ----------------------------------------------------------------------------- - */ - -enum ui_button_state ui_slider_base( ui_context *ctx, ui_rect box, enum ui_axis axis, - f32 min, f32 max, f32 *value, f32 *out_t ) -{ - enum ui_button_state mask_using = k_ui_button_holding_inside | - k_ui_button_holding_outside | - k_ui_button_click, - state = ui_button_base( ctx, box ); - - f32 t; - if( state & mask_using ) - { - t = vg_clampf( (f32)(ctx->mouse[axis] - box[axis]) / (f32)( box[2+axis] ), 0,1 ); - *value = vg_lerpf( min, max, t ); - } - else - t = vg_clampf( (*value - min) / (max-min), 0.0f, 1.0f ); - - *out_t = t; - - return state; -} - -void ui_slider_text( ui_context *ctx, ui_rect box, const char *format, f32 value ) -{ - /* TODO: replace this one day with our own function */ - char buf[32]; - snprintf( buf, sizeof(buf), format? format: "%.2f", value ); - ui_text( ctx, box, buf, 1, k_ui_align_middle_center, 0 ); -} - -bool ui_slider_standard( ui_context *ctx, ui_rect box, f32 min, f32 max, f32 *value, const char *format ) -{ - f32 t; - - enum ui_button_state mask_using = - k_ui_button_holding_inside | - k_ui_button_holding_outside | - k_ui_button_click, - mask_brighter = mask_using | k_ui_button_hover, - state = ui_slider_base( ctx, box, k_ui_axis_h, min, max, value, &t ); - - ui_rect line = { box[0], box[1], t * (f32)box[2], box[3] }; - ui_fill( ctx, line, ui_colour(ctx,state&mask_brighter? k_ui_bg+4: k_ui_bg+2) ); - ui_fill( ctx, (ui_rect){ box[0]+line[2], box[1], box[2]-line[2], box[3] }, ui_colour(ctx, k_ui_bg ) ); - ui_outline( ctx, box, 1, ui_colour(ctx,state? k_ui_fg+3: k_ui_bg+3), 0 ); - ui_slider_text( ctx, box, format, *value ); - - return (state & mask_using) && 1; -} - -bool ui_slider( ui_context *ctx, ui_rect inout_panel, const char *str_label, - f32 min, f32 max, f32 *value ) -{ - ui_rect rect, label, box; - ui_standard_widget( ctx, inout_panel, rect, 1 ); - ui_label( ctx, rect, str_label, ctx->scale, 0, box ); - return ui_slider_standard( ctx, box, min, max, value, NULL ); -} - -/* - * Colour picker - * ----------------------------------------------------------------------------- - */ - -bool ui_colourpicker( ui_context *ctx, ui_rect inout_panel, const char *str_label, v4f value, enum ui_colour_type type ) -{ - ui_rect widget, left, right; - ui_standard_widget( ctx, inout_panel, widget, 8 ); - ui_split_ratio( widget, k_ui_axis_v, 0.5f, 8, left, right ); - - ui_rect sliders[4]; - ui_split_ratio( right, k_ui_axis_h, 0.5f, 2, sliders[0], sliders[2] ); - ui_split_ratio( sliders[0], k_ui_axis_h, 0.5f, 2, sliders[0], sliders[1] ); - ui_split_ratio( sliders[2], k_ui_axis_h, 0.5f, 2, sliders[2], sliders[3] ); - - v4f hsv; - vg_rgb_hsv( value, hsv ); - hsv[3] = value[3]; - - enum ui_button_state modified = 0x00; - - for( u32 i=0; i<4; i ++ ) - { - const char *labels[] = { "hue %.2f", "sat %.2f", "lum %.2f", "alpha %.2f" }; - - if( (i == 3) && (type == k_ui_colour_type_rgb) ) - { - ui_fill( ctx, sliders[i], ui_colour( ctx, k_ui_bg ) ); - ui_text( ctx, sliders[i], "alpha 1.0", 1, k_ui_align_middle_center, ui_colour( ctx, k_ui_bg+3 ) ); - } - else - modified |= ui_slider_standard( ctx, sliders[i], 0.0f, 1.0f, hsv+i, labels[i] ); - } - - ui_rect preview, square; - ui_split_ratio( left, k_ui_axis_v, 0.8f, 8, square, preview ); - - u32 state = ui_button_base( ctx, square ); - modified |= state; - - enum ui_button_state - mask_using = - k_ui_button_holding_inside | - k_ui_button_holding_outside | - k_ui_button_click; - - if( state & mask_using ) - { - for( u32 i=0; i<2; i ++ ){ - hsv[1+i] = vg_clampf( - (f32)(ctx->mouse[i] - square[i]) / (f32)(square[2+i]), - 0.0f, 1.0f ); - } - - hsv[2] = 1.0f-hsv[2]; - } - - if( modified & (k_ui_button_click|k_ui_button_holding_inside|k_ui_button_holding_outside) ) - { - vg_hsv_rgb( hsv, value ); - value[3] = hsv[3]; - } - - ui_outline( ctx, square, 1, ui_colour(ctx, state? k_ui_fg+3: k_ui_bg+3 ), 0 ); - - /* preview colour */ - v4f colour; - vg_hsv_rgb( hsv, colour ); - colour[3] = 1.0f; - ui_fill( ctx, preview, v4f_u32_colour( colour ) ); - - /* Draw hsv shader thingy */ - ui_flush( ctx, k_ui_shader_colour, NULL ); - ui_fill_rect( ctx, square, 0xffffffff, (ui_px[4]){ 0,256,256,0 } ); - - struct ui_batch_shader_data_hsv inf = { .hue = hsv[0] }; - ui_flush( ctx, k_ui_shader_hsv, &inf ); - - ui_rect marker = { square[0] + hsv[1] * (f32)square[2] - 4, - square[1] + (1.0f-hsv[2]) * (f32)square[3] - 4, - 8, 8 }, - lx = { square[0], - square[1] + (1.0f-hsv[2]) * (f32)square[3], - square[2], 1 }, - ly = { square[0] + hsv[1] * (f32)square[2], - square[1], - 1, square[3] }; - - ui_fill( ctx, marker, ui_colour(ctx, k_ui_fg ) ); - ui_fill( ctx, lx, ui_colour(ctx, k_ui_fg ) ); - ui_fill( ctx, ly, ui_colour(ctx, k_ui_fg ) ); - - return modified? 1: 0; -} - -/* - * Textbox chaos - * ----------------------------------------------------------------------------- - */ - -static void _ui_textbox_make_selection( ui_context *ctx, int *start, int *end ) -{ - *start = VG_MIN( ctx->textbox.cursor_pos, ctx->textbox.cursor_user ); - *end = VG_MAX( ctx->textbox.cursor_pos, ctx->textbox.cursor_user ); -} - -void _ui_textbox_move_cursor( ui_context *ctx, int *cursor0, int *cursor1, - int dir, int snap_together ) -{ - *cursor0 = VG_MAX( 0, ctx->textbox.cursor_user + dir ); - *cursor0 = - VG_MIN( - VG_MIN( ctx->textbox.len-1, strlen( ctx->textbuf )), - *cursor0 ); - - if( snap_together ) - *cursor1 = *cursor0; -} - -static int _ui_textbox_makeroom( ui_context *ctx, int datastart, int length ) -{ - int move_to = VG_MIN( datastart+length, ctx->textbox.len-1 ); - int move_amount = strlen( ctx->textbuf )-datastart; - int move_end = VG_MIN( move_to+move_amount, ctx->textbox.len-1 ); - move_amount = move_end-move_to; - - if( move_amount ) - memmove( &ctx->textbuf[ move_to ], - &ctx->textbuf[ datastart ], - move_end-move_to ); - - ctx->textbuf[ move_end ] = '\0'; - - return VG_MIN( length, ctx->textbox.len-datastart-1 ); -} - -int _ui_textbox_delete_char( ui_context *ctx, int direction ) -{ - int start, end; - _ui_textbox_make_selection( ctx, &start, &end ); - - /* There is no selection */ - if( !(end-start) ){ - if( direction == 1 ) end = VG_MIN( end+1, strlen( ctx->textbuf ) ); - else if( direction == -1 ) start = VG_MAX( start-1, 0 ); - } - - /* Still no selction, no need to do anything */ - if( !(end-start) ) - return start; - - /* Copy the end->terminator to start */ - int remaining_length = strlen( ctx->textbuf )+1-end; - memmove( &ctx->textbuf[ start ], - &ctx->textbuf[ end ], - remaining_length ); - return start; -} - -void _ui_textbox_to_clipboard( ui_context *ctx ) -{ - int start, end; - _ui_textbox_make_selection( ctx, &start, &end ); - char buffer[512]; - - if( end-start ) - { - memcpy( buffer, &ctx->textbuf[ start ], end-start ); - buffer[ end-start ] = 0x00; - ctx->set_clipboard_text( buffer ); - } -} - -static void _ui_textbox_change_callback( ui_context *ctx ) -{ - if( ctx->textbox.callbacks.change ) - { - ctx->textbox.callbacks.change( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); - - /* we gave permission to modify the buffer in this callback so.. */ - int len = strlen( ctx->textbuf ); - ctx->textbox.cursor_user = VG_MIN( ctx->textbox.cursor_user, len ); - ctx->textbox.cursor_pos = VG_MIN( ctx->textbox.cursor_pos, len ); - } -} - -void _ui_textbox_clipboard_paste( ui_context *ctx ) -{ - if( !ctx->have_clipboard_text() ) - return; - - char *text = ctx->get_clipboard_text(); - - if( !text ) - return; - - int datastart = _ui_textbox_delete_char( ctx, 0 ); - int length = strlen( text ); - - if( (ctx->textbox.len - strlen(ctx->textbuf)) < length ) - { - ui_start_modal( ctx, "Clipboard content exceeds buffer size.", NULL, UI_MODAL_BAD, NULL ); - return; - } - - int cpylength = _ui_textbox_makeroom( ctx, datastart, length ); - - memcpy( ctx->textbuf + datastart, text, cpylength); - _ui_textbox_move_cursor( ctx, - &ctx->textbox.cursor_user, - &ctx->textbox.cursor_pos, cpylength, 1 ); - - ctx->free_clipboard_text( text ); - _ui_textbox_change_callback( ctx ); -} - -void _ui_textbox_put_char( ui_context *ctx, char c ) -{ - ctx->textbox.cursor_user = _ui_textbox_delete_char(ctx, 0); - if( (ctx->textbox.len - strlen(ctx->textbuf)) <= 1 ) return; - - if( _ui_textbox_makeroom( ctx, ctx->textbox.cursor_user, 1 ) ) - ctx->textbuf[ ctx->textbox.cursor_user ] = c; - - _ui_textbox_move_cursor( ctx, - &ctx->textbox.cursor_user, - &ctx->textbox.cursor_pos, 1, 1 ); -} - -/* Receed secondary cursor */ -void _ui_textbox_left_select( ui_context *ctx ) -{ - _ui_textbox_move_cursor( ctx, &ctx->textbox.cursor_user, NULL, -1, 0 ); -} - -/* Match and receed both cursors */ -void _ui_textbox_left( ui_context *ctx ) -{ - int cursor_diff = ctx->textbox.cursor_pos - ctx->textbox.cursor_user? 0: 1; - - _ui_textbox_move_cursor( ctx, - &ctx->textbox.cursor_user, - &ctx->textbox.cursor_pos, -cursor_diff, 1 ); -} - -void _ui_textbox_up( ui_context *ctx ) -{ - if( ctx->textbox.flags & UI_TEXTBOX_MULTILINE ) - { - int line_begin = ctx->textbox.cursor_user; - - while( line_begin ) - { - if( ctx->textbuf[ line_begin-1 ] == '\n' ) - { - break; - } - - line_begin --; - } - - if( line_begin ) - { - int line_above_begin = line_begin-1; - - while( line_above_begin ) - { - if( ctx->textbuf[ line_above_begin-1 ] == '\n' ) - { - break; - } - - line_above_begin --; - } - - int offset = ctx->textbox.cursor_user - line_begin, - line_length_above = line_begin - line_above_begin -1; - - offset = VG_MIN( line_length_above, offset ); - - ctx->textbox.cursor_user = line_above_begin+offset; - ctx->textbox.cursor_pos = line_above_begin+offset; - } - else - { - ctx->textbox.cursor_user = line_begin; - ctx->textbox.cursor_pos = line_begin; - } - } - else - { - if( ctx->textbox.callbacks.up ) - { - ctx->textbox.callbacks.up( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); - } - } -} - -void _ui_textbox_down( ui_context *ctx ) -{ - if( ctx->textbox.flags & UI_TEXTBOX_MULTILINE ) - { - int line_begin = ctx->textbox.cursor_user; - - while( line_begin ) - { - if( ctx->textbuf[ line_begin-1 ] == '\n' ) - { - break; - } - - line_begin --; - } - - int line_below_begin = ctx->textbox.cursor_user; - - while(1) - { - if( ctx->textbuf[ line_below_begin ] == '\0' ) - { - ctx->textbox.cursor_user = line_below_begin; - ctx->textbox.cursor_pos = line_below_begin; - return; - } - - if( ctx->textbuf[ line_below_begin ] == '\n' ) - { - line_below_begin ++; - break; - } - - line_below_begin ++; - } - - int line_below_end = line_below_begin; - while(1) - { - if( ctx->textbuf[ line_below_end ] == '\0' || - ctx->textbuf[ line_below_end ] == '\n' ){ - line_below_end ++; - break; - } - line_below_end ++; - } - - int offset = ctx->textbox.cursor_user - line_begin, - line_length_below = line_below_end - line_below_begin -1; - - offset = VG_MIN( line_length_below, offset ); - - ctx->textbox.cursor_user = line_below_begin+offset; - ctx->textbox.cursor_pos = line_below_begin+offset; - } - else - { - if( ctx->textbox.callbacks.down ) - { - ctx->textbox.callbacks.down( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); - } - } -} - -void _ui_textbox_right_select( ui_context *ctx ) -{ - _ui_textbox_move_cursor( ctx, &ctx->textbox.cursor_user, NULL, 1, 0 ); -} - -void _ui_textbox_right( ui_context *ctx ) -{ - int cursor_diff = ctx->textbox.cursor_pos - ctx->textbox.cursor_user? 0: 1; - - _ui_textbox_move_cursor( ctx, - &ctx->textbox.cursor_user, - &ctx->textbox.cursor_pos, +cursor_diff, 1 ); -} - -void _ui_textbox_backspace( ui_context *ctx ) -{ - if( ctx->focused_control_type == k_ui_control_textbox ) - { - ctx->textbox.cursor_user = _ui_textbox_delete_char( ctx, -1 ); - ctx->textbox.cursor_pos = ctx->textbox.cursor_user; - _ui_textbox_change_callback( ctx ); - } -} - -void _ui_textbox_delete( ui_context *ctx ) -{ - if( ctx->focused_control_type == k_ui_control_textbox ) - { - ctx->textbox.cursor_user = _ui_textbox_delete_char( ctx, 1 ); - ctx->textbox.cursor_pos = ctx->textbox.cursor_user; - _ui_textbox_change_callback( ctx ); - } -} - -void _ui_textbox_home_select( ui_context *ctx ) -{ - i32 start = ctx->textbox.cursor_user; - - if( ctx->textbox.flags & UI_TEXTBOX_MULTILINE ) - { - while( start ) - { - if( ctx->textbuf[start-1] == '\n' ) - break; - else - start --; - } - } - else - start = 0; - - ctx->textbox.cursor_user = start; -} - -void _ui_textbox_home( ui_context *ctx ) -{ - _ui_textbox_home_select( ctx ); - ctx->textbox.cursor_pos = ctx->textbox.cursor_user; -} - -void _ui_textbox_end_select( ui_context *ctx ) -{ - i32 end = ctx->textbox.cursor_user; - - if( ctx->textbox.flags & UI_TEXTBOX_MULTILINE ) - { - while( ctx->textbuf[end] ) - { - if( ctx->textbuf[end] == '\n' ) - break; - else - end ++; - } - } - else - end = VG_MIN( ctx->textbox.len-1, strlen(ctx->textbuf) ); - - ctx->textbox.cursor_user = end; -} - -void _ui_textbox_end( ui_context *ctx ) -{ - _ui_textbox_end_select( ctx ); - ctx->textbox.cursor_pos = ctx->textbox.cursor_user; -} - -void _ui_textbox_select_all( ui_context *ctx ) -{ - _ui_textbox_move_cursor( ctx, &ctx->textbox.cursor_user, NULL, 10000, 0 ); - _ui_textbox_move_cursor( ctx, &ctx->textbox.cursor_pos, NULL, -10000, 0 ); -} - -void _ui_textbox_cut( ui_context *ctx ) -{ - _ui_textbox_to_clipboard( ctx ); - ctx->textbox.cursor_user = _ui_textbox_delete_char( ctx, 0 ); - ctx->textbox.cursor_pos = ctx->textbox.cursor_user; - _ui_textbox_change_callback( ctx ); -} - -void _ui_textbox_enter( ui_context *ctx ) -{ - if( ctx->focused_control_type == k_ui_control_textbox ) - { - ui_ignore_input_frames( ctx, 2 ); - - if( ctx->textbox.callbacks.enter ) - ctx->textbox.callbacks.enter( ctx, ctx->textbuf, ctx->textbox.len, ctx->textbox.callbacks.userdata ); - - if( ctx->focused_control_type != k_ui_control_textbox ) return; - - if( ctx->textbox.flags & UI_TEXTBOX_MULTILINE ) - { - _ui_textbox_put_char( ctx, '\n' ); - _ui_textbox_change_callback( ctx ); - } - else - { - if( !(ctx->textbox.flags & UI_TEXTBOX_AUTOFOCUS ) ) - ui_defocus_all( ctx ); - } - } -} - -/* - * based on a visual character coordinate relative to the anchor of the textbox, - * this works out the linear place in the buffer that coordinate maps to - * - * input coordinates go in co[0], co[1], and the result index is in co[2] - */ -static void _ui_textbox_calc_index_from_grid( ui_context *ctx, int co[3], int wrap_length ) -{ - int i[3] = {0,0,0}; - - char c; - while( (c = ctx->textbuf[i[2]]) ) - { - if( i[1]==co[1] && i[0]>=co[0] ) break; - - if( i[0] >= wrap_length ) - { - i[1] ++; - i[0] = 0; - } - - if( c >= 32 && c <= 126 ) - { - i[0] ++; - i[2] ++; - } - else if( c == '\n' ) - { - i[1] ++; - - if( i[1] > co[1] ) break; - - i[2] ++; - i[0] = 0; - } - else i[2] ++; - } - - co[0] = i[0]; - co[1] = i[1]; - co[2] = i[2]; -} - -/* - * based on the index specied in co[2], work out the visual character - * coordinates and store them in co[0], co[1] - */ -static void _ui_textbox_index_calc_coords( ui_context *ctx, - int co[3], int wrap_length ) -{ - co[0] = 0; - co[1] = 0; - - char c; - int i=0; - - while( (c = ctx->textbuf[i ++]) ) - { - if( i > co[2] ) break; - if( co[0] >= wrap_length ) - { - co[1] ++; - co[0] = 0; - } - if( c >= 32 && c <= 126 ) co[0] ++; - else if( c == '\n' ) - { - co[1] ++; - co[0] = 0; - } - } -} - -/* - * calculate the number of characters remaining until either: - * - the wrap_length limit is hit - * - end of the line/string - * - * index must be fully populated with visual X/Y, and linear index - */ -static int _ui_textbox_run_remaining( ui_context *ctx, - int index[3], int wrap_length ) -{ - int i=0, printed_chars=0; - char c; - while( (c = ctx->textbuf[index[2] + (i ++)]) ) - { - if( index[0]+i >= wrap_length ) break; - if( c >= 32 && c <= 126 ) printed_chars ++; - else if( c == '\n' ) break; - } - - return printed_chars+1; -} - -int ui_textbox( ui_context *ctx, ui_rect inout_panel, const char *label, - char *buf, u32 len, u32 lines, u32 flags, - struct ui_textbox_callbacks *callbacks ) -{ - if( lines > 1 ) flags |= UI_TEXTBOX_MULTILINE; - - ui_rect rect; - ui_standard_widget( ctx, inout_panel, rect, lines ); - - if( label ) - ui_label( ctx, rect, label, 1, 0, rect ); - - int clickup= ui_click_up(ctx, UI_MOUSE_LEFT), - clickdown = ui_click_down(ctx, UI_MOUSE_LEFT), - click = ui_clicking(ctx, UI_MOUSE_LEFT) | clickup, - target = ui_inside_rect( rect, ctx->mouse_click ) && click, - hover = ui_inside_rect( rect, ctx->mouse ); - - /* allow instant transitions from textbox->textbox */ - if( (ctx->focused_control_type != k_ui_control_none) && - (ctx->focused_control_type != k_ui_control_textbox) ) - { - clickup = 0; - clickdown = 0; - click = 0; - target = 0; - hover = 0; - flags &= ~UI_TEXTBOX_AUTOFOCUS; - } - - u32 col_base = ui_colour(ctx, k_ui_bg ), - col_highlight = ui_colour(ctx, k_ui_fg ), - col_cursor = (0x00ffffff & ui_colour(ctx,k_ui_fg))|0x7f000000; - - ui_px border = -1; - - ui_rect text_rect; - rect_copy( rect, text_rect ); - - if( flags & UI_TEXTBOX_MULTILINE ) text_rect[3] = rect[3]-16; - else text_rect[3] = ctx->font->sy; - - text_rect[2] -= 16; - ui_rect_center( rect, text_rect ); - - ui_px wrap_length = 1024; - - if( flags & UI_TEXTBOX_WRAP ) - wrap_length = text_rect[2] / ctx->font->sx; - - if( hover ) - { - ctx->cursor = k_ui_cursor_ibeam; - } - - if( ctx->focused_control_id == buf ) - { - ui_fill( ctx, rect, col_base ); - ui_ntext( ctx, text_rect, buf, wrap_length, 1, k_ui_align_left, 0 ); - - if( !(flags & UI_TEXTBOX_AUTOFOCUS) && ((clickup||clickdown) && !target)) - { - ui_defocus_all( ctx ); - } - else - { - ctx->focused_control_hit = 1; - if( click && target ) - { - int p0[3] ={ - (ctx->mouse_click[0] - text_rect[0]) / ctx->font->sx, - (ctx->mouse_click[1] - text_rect[1]) / ctx->font->sy, - -1 - }, - p1[3] = { - (ctx->mouse[0] - text_rect[0]) / ctx->font->sx, - (ctx->mouse[1] - text_rect[1]) / ctx->font->sy, - -1 - }; - - if( flags & UI_TEXTBOX_MULTILINE ) - { - _ui_textbox_calc_index_from_grid( ctx, p0, wrap_length ); - _ui_textbox_calc_index_from_grid( ctx, p1, wrap_length ); - - ctx->textbox.cursor_pos = p0[2]; - ctx->textbox.cursor_user = p1[2]; - } - else - { - int max = strlen( buf ); - ctx->textbox.cursor_pos = VG_MAX( 0, VG_MIN( max, p0[0] )), - ctx->textbox.cursor_user = VG_MAX( 0, VG_MIN( max, p1[0] )); - } - } - - ui_outline( ctx, rect, -2, ctx->scheme[ k_ui_orange ], 0 ); - ui_rect cursor; - - int c0 = ctx->textbox.cursor_pos, - c1 = ctx->textbox.cursor_user, - start = VG_MIN( c0, c1 ), - end = VG_MAX( c0, c1 ), - chars = end-start; - - if( flags & (UI_TEXTBOX_WRAP|UI_TEXTBOX_MULTILINE) ) - { - int pos[3], remaining = chars; - - pos[2] = start; - _ui_textbox_index_calc_coords( ctx, pos, wrap_length ); - - if( start==end ) - { - cursor[0] = text_rect[0] + pos[0]*ctx->font->sx-1; - cursor[1] = text_rect[1] + pos[1]*14; - cursor[2] = 2; - cursor[3] = 13; - ui_fill( ctx, cursor, col_cursor ); - rect_copy( cursor, ctx->click_fader_end ); - } - else - { - while( remaining ) - { - int run = _ui_textbox_run_remaining( ctx, pos, wrap_length ); - run = VG_MIN( run, remaining ); - - cursor[0] = text_rect[0] + pos[0]*ctx->font->sx-1; - cursor[1] = text_rect[1] + pos[1]*14; - cursor[2] = (float)(run)*(float)ctx->font->sx; - cursor[3] = 13; - - ui_fill( ctx, cursor, col_cursor ); - - remaining -= run; - pos[0] = 0; - pos[1] ++; - pos[2] += run; - } - rect_copy( cursor, ctx->click_fader_end ); - } - } - else - { - cursor[0] = text_rect[0] + start*ctx->font->sx-1; - cursor[1] = text_rect[1]; - cursor[3] = 13; - - if( start==end ) - { - cursor[2] = 2; - } - else - { - cursor[2] = (float)(chars)*(float)ctx->font->sx; - } - - if( (ctx->click_fade_opacity<=0.0f) && ui_clip( rect, cursor, cursor ) ) - { - ui_fill( ctx, cursor, col_cursor ); - } - - rect_copy( cursor, ctx->click_fader_end ); - } - } - - return 0; - } - - if( click || (flags & UI_TEXTBOX_AUTOFOCUS) ) - { - if( (target && hover) || (flags & UI_TEXTBOX_AUTOFOCUS) ) - { - ui_defocus_all( ctx ); - - ui_fill( ctx, rect, col_highlight ); - ui_ignore_input_frames( ctx, 2 ); - rect_copy( rect, ctx->click_fader ); - rect_copy( rect, ctx->click_fader_end ); - - ctx->click_fade_opacity = 1.0f; - ctx->textbuf = buf; - ctx->focused_control_hit = 1; - ctx->focused_control_type = k_ui_control_textbox; - ctx->textbox.len = len; - ctx->textbox.flags = flags; - ctx->textbox.cursor_pos = 0; - ctx->textbox.cursor_user = 0; - - if( callbacks ) - { - ctx->textbox.callbacks = *callbacks; - } - else - { - ctx->textbox.callbacks.change = NULL; - ctx->textbox.callbacks.down = NULL; - ctx->textbox.callbacks.up = NULL; - ctx->textbox.callbacks.enter = NULL; - ctx->textbox.callbacks.userdata = NULL; - } - - ctx->start_text_input(); - } - } - - ui_fill( ctx, rect, col_base ); - - if( hover ) - { - ui_outline( ctx, rect, -1, col_highlight, 0 ); - } - - ui_ntext( ctx, text_rect, buf, wrap_length, 1, k_ui_align_left, 0 ); - return 0; -} - -/* - * Tabs - * ----------------------------------------------------------------------------- - */ - -void ui_tabs( ui_context *ctx, ui_rect inout_panel, ui_rect out_content_panel, - const char **titles, u32 count, i32 *page ) -{ - ui_rect bar; - ui_standard_widget( ctx, inout_panel, bar, 1 ); - - i32 cur_page = *page; - - f32 width = (f32)inout_panel[2] / (f32)count; - - ui_px h = (inout_panel[1] + inout_panel[3]) - (bar[1]+bar[3]); - inout_panel[1] = bar[1]+bar[3]; - inout_panel[3] = h; - - ui_fill( ctx, inout_panel, ui_colour(ctx, k_ui_bg+2 ) ); - ui_outline( ctx, inout_panel, 1, ui_colour(ctx, k_ui_bg+5 ), 0 ); - - rect_copy( inout_panel, out_content_panel ); - ui_rect_pad( out_content_panel, - (ui_px[2]){ ctx->padding, ctx->padding } ); - - /* place buttons */ - for( i32 i=0; ifocused_control_type = k_ui_control_modal; - ctx->modal.message = message; - ctx->modal.ok_text = ok_text? ok_text: "OK"; - if( callbacks ) - ctx->modal.callbacks = *callbacks; - else - ctx->modal.callbacks.close = NULL; - - ctx->modal.options = options; - u32 type = options & UI_MODAL_TYPE_BITS; - if( type == UI_MODAL_OK ) vg_info( message ); - else if( type == UI_MODAL_WARN ) vg_warn( message ); - else if( type == UI_MODAL_GOOD ) vg_success( message ); - else if( type == UI_MODAL_BAD ) vg_error( message ); -} - -/* - * Input handling - * ----------------------------------------------------------------------------- - */ - -/* - * Callback for text entry mode - */ -void ui_proc_utf8( ui_context *ctx, const char *text ) -{ - if( ctx->focused_control_type == k_ui_control_textbox ) - { - const char *ptr = text; - - while( *ptr ) - { - if( *ptr != '`' ) - _ui_textbox_put_char( ctx, *ptr ); - - ptr ++; - } - - _ui_textbox_change_callback( ctx ); - } -} - -/* - * Development utils - * ----------------------------------------------------------------------------- - */ - -void ui_dev_colourview( ui_context *ctx ) -{ - ui_rect window = {ctx->area[0]-256,0,256,ctx->area[1]}, swatch; - - const char *names[VG_ARRAY_LEN(ctx->scheme)] = { - [k_ui_bg] = "k_ui_bg", "k_ui_bg+1", "k_ui_bg+2", "k_ui_bg+3", - "k_ui_bg+4", "k_ui_bg+5", "k_ui_bg+6", "k_ui_bg+7", - - [k_ui_fg] = "k_ui_fg", "k_ui_fg+1", "k_ui_fg+2", "k_ui_fg+3", - "k_ui_fg+4", "k_ui_fg+5", "k_ui_fg+6", "k_ui_fg+7", - - [k_ui_red] = "k_ui_red", "k_ui_orange", "k_ui_yellow", "k_ui_green", - "k_ui_aqua", "k_ui_blue", "k_ui_purple", "k_ui_gray", - "k_ui_red+8","k_ui_orange+8","k_ui_yellow+8","k_ui_green+8", - "k_ui_aqua+8","k_ui_blue+8","k_ui_purple+8","k_ui_gray+8" }; - - ui_rect col[2]; - ui_split_ratio( window, k_ui_axis_v, 0.5f, 0, col[0], col[1] ); - - for( int i=0; ischeme); i++ ) - { - int which = (i/8)%2; - - ui_split( col[which], k_ui_axis_h, 24, 0, swatch, col[which] ); - ui_fill( ctx, swatch, ui_colour(ctx,i) ); - - if( names[i] ) - { - ui_text( ctx, swatch, names[i], 1, k_ui_align_middle_left, ui_colourcont(ctx,i)); - } - } -} diff --git a/vg_ui/imgui.h b/vg_ui/imgui.h deleted file mode 100644 index 67fd0dd..0000000 --- a/vg_ui/imgui.h +++ /dev/null @@ -1,381 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_ui/imgui.c" -#else - -typedef i16 ui_px; -typedef ui_px ui_rect[4]; -typedef ui_px ui_point[2]; -typedef struct ui_vert ui_vert; -typedef struct ui_context ui_context; -typedef struct ui_batch ui_batch; - -enum ui_axis { - k_ui_axis_h = 0x0u, - k_ui_axis_v = 0x1u, -}; - -/* Relative to cursor p0 */ -enum ui_align -{ /* DC BA */ - k_ui_align_lwr = 0xff, - k_ui_align_left = 0x0000| 0x00, - k_ui_align_right = 0x0000| 0x01, - k_ui_align_center = 0x0000| 0x02, - - k_ui_align_middle = 0x0100, - k_ui_align_middle_left = 0x0100| 0x00, - k_ui_align_middle_right = 0x0100| 0x01, - k_ui_align_middle_center = 0x0100| 0x02, - - k_ui_align_bottom = 0x0200, - k_ui_align_bottom_left = 0x0200| 0x00, - k_ui_align_bottom_right = 0x0200| 0x01, - k_ui_align_bottom_center = 0x0200| 0x02, -}; - -enum ui_shader -{ - k_ui_shader_colour, - k_ui_shader_image, - k_ui_shader_hsv, - k_ui_shader_grad -}; - -typedef u32 ui_scheme[8*4]; -enum ui_scheme_colour -{ - k_ui_bg = 0, - k_ui_fg = 8, - k_ui_hue = 16, - k_ui_red = 16, - k_ui_orange, - k_ui_yellow, - k_ui_green, - k_ui_aqua, - k_ui_blue, - k_ui_purple, - k_ui_gray, - k_ui_brighter = 8 -}; - -#define UI_RGB( STDHEX ) 0xff000000 |\ - ((STDHEX&0x000000ff)<<16) |\ - ((STDHEX&0x0000ff00) ) |\ - ((STDHEX&0x00ff0000)>>16) - -#define UI_TEXTBOX_MULTILINE 0x1 -#define UI_TEXTBOX_WRAP 0x2 -#define UI_TEXTBOX_AUTOFOCUS 0x4 - -#define UI_MODAL_OK 0x0 -#define UI_MODAL_GOOD 0x1 -#define UI_MODAL_BAD 0x2 -#define UI_MODAL_WARN 0x3 -#define UI_MODAL_TYPE_BITS 0x3 -#define UI_MODAL_CANCEL 0x8 - -#define UI_MOUSE_LEFT 1 -#define UI_MOUSE_MIDDLE 2 -#define UI_MOUSE_RIGHT 4 -#define UI_MOUSE_ANY (UI_MOUSE_LEFT|UI_MOUSE_RIGHT|UI_MOUSE_MIDDLE) - -#define UI_TOP 0x1 -#define UI_LEFT 0x2 -#define UI_BOTTOM 0x4 -#define UI_RIGHT 0x8 - -#pragma pack(push,1) -struct ui_vert -{ - ui_px co[2]; - u16 uv[2]; - u32 colour; -}; -#pragma pack(pop) - -enum ui_button_state -{ - k_ui_button_none = 0x0, - k_ui_button_click = 0x1, - k_ui_button_holding_inside = 0x2, - k_ui_button_holding_outside = 0x4, - k_ui_button_hover = 0x8 -}; - -struct ui_context -{ - struct ui_vert *vertex_buffer; - u16 *indice_buffer; - u32 max_verts, max_indices, - cur_vert, cur_indice, - vert_start, indice_start; - - ui_px area[2]; - - union - { - void *focused_control_id; /* uses the memory location of various locking - controls as an id */ - char *textbuf; - i32 *ptr_enum; - }; - - u32 focused_control_hit; - enum ui_control_type{ - k_ui_control_none, - k_ui_control_textbox, - k_ui_control_enum, - k_ui_control_modal - } - focused_control_type; - - union /* controls data that can be focused */ - { - struct ui_textbuf - { - int cursor_user, cursor_pos; - u32 len; - u32 flags; - - struct ui_textbox_callbacks - { - void (*enter)( ui_context *ctx, char *, u32, void * ), - (*up)( ui_context *ctx, char *, u32, void * ), - (*down)( ui_context *ctx, char *, u32, void * ), - (*change)( ui_context *ctx, char *, u32, void * ), - (*escape)( ui_context *ctx, void * ); - void *userdata; - } - callbacks; - } - textbox; - - struct ui_enum - { - struct ui_enum_opt - { - i32 value; - const char *alias; - } - *options; - u32 option_count; - ui_rect rect; - } - _enum; - }; - - struct ui_modal - { - const char *message, *ok_text; - u32 options; - - struct ui_modal_callbacks - { - void (*close)(u32); - } - callbacks; - } - modal; - - ui_px mouse[2], mouse_delta[2], mouse_click[2]; - u32 mouse_state[2]; - u32 ignore_input_frames; - - bool mouse_pos_overriden; - int wants_mouse; - - ui_rect click_fader, click_fader_end; - float click_fade_opacity; - - ui_scheme scheme; - const vg_font_face *font; - - ui_px kern[2]; - - enum ui_cursor - { - k_ui_cursor_default, - k_ui_cursor_ibeam, - k_ui_cursor_hand, - k_ui_cursor_max - } - cursor; - - enum ui_text_encoding - { - k_ui_text_encoding_ascii_vg_extended, - k_ui_text_encoding_utf8 - } - text_encoding; - - ui_px widget_height, scale, padding; - - void (*render_batch)(ui_context *ctx, ui_batch *batch, - enum ui_shader shader, void *shader_data ); - bool (*have_clipboard_text)(void); - char *(*get_clipboard_text)(void); - void (*free_clipboard_text)(void *text); - int (*set_clipboard_text)(const char *text); - - void (*start_text_input)(void); - void (*stop_text_input)(void); -}; - -struct ui_batch_shader_data_hsv -{ - f32 hue; -}; - -struct ui_batch_shader_data_image_gradient -{ - void *image_resource; - bool log; - f32 scale; -}; - -struct ui_batch -{ - ui_vert *vert_buf; /* base vertex array + [vert_offset] */ - u32 vert_count, - vert_offset; /* in bytes */ - - u16 *indice_buf; /* base indice array + [indice_offset] */ - u32 indice_count, - indice_offset; /* in bytes */ -}; - -/* set the memory buffer and limits of ui context */ -void ui_init( ui_context *ctx, - ui_vert *verts_buf, u32 verts_max, - u16 *indices_buf, u32 indices_max ); - -/* simple fill drawing commands */ -ui_vert *ui_fill_rect( ui_context *ctx, ui_rect rect, u32 colour, ui_px uv[4] ); -ui_vert *ui_fill( ui_context *ctx, ui_rect rect, u32 colour ); -void ui_outline( ui_context *ctx, ui_rect rect, ui_px thickness, u32 colour, u32 mask ); - -/* rect controls */ -void rect_copy( ui_rect a, ui_rect b ); -void ui_split( ui_rect rect, enum ui_axis other, ui_px width, ui_px gap, ui_rect l, ui_rect r ); -void ui_split_ratio( ui_rect rect, enum ui_axis dir, float ratio, ui_px gap, ui_rect l, ui_rect r ); -void ui_rect_pad( ui_rect rect, ui_px pad[2] ); -int ui_clip( ui_rect parent, ui_rect child, ui_rect clipped ); -int ui_inside_rect( ui_rect rect, ui_px co[2] ); -void ui_fit_item( ui_rect rect, ui_px size[2], ui_rect d ); - -/* ui interactions */ -void ui_update_mouse( ui_context *ctx, ui_px mouse[2], i32 mouse_state ); -int ui_click_down( ui_context *ctx, u32 mask ); -int ui_clicking( ui_context *ctx, u32 mask ); -int ui_click_up( ui_context *ctx, u32 mask ); -void ui_ignore_input_frames( ui_context *ctx, u32 frames ); -void ui_capture_mouse( ui_context *ctx, bool on ); - -/* ui cycle */ -void ui_prerender( ui_context *ctx ); -void ui_flush( ui_context *ctx, enum ui_shader shader, void *shader_data ); -void ui_rect_center( ui_rect parent, ui_rect rect ); -void ui_set_area( ui_context *ctx, i32 width, i32 height ); - -/* text drawing */ -ui_px ui_text_line_width( ui_context *ctx, const char *str ); -ui_px ui_text_string_height( ui_context *ctx, const char *str ); -ui_px ui_text_aligned_x( ui_context *ctx, - const char *str, ui_rect rect, ui_px scale, - enum ui_align align ); -u32 ui_ntext( ui_context *ctx, - ui_rect rect, const char *str, u32 len, ui_px scale, - enum ui_align align, u32 colour ); -u32 ui_text( ui_context *ctx, - ui_rect rect, const char *str, ui_px scale, - enum ui_align align, u32 colour ); - -/* colour schemes */ -u32 ui_colour( ui_context *ctx, enum ui_scheme_colour id ); -u32 ui_colourcont( ui_context *ctx, enum ui_scheme_colour id ); - -/* generic colour functions */ -void ui_hex_to_norm( u32 hex, v4f norm ); -u32 v4f_u32_colour( v4f colour ); -u32 ui_opacity( u32 colour, f32 opacity ); - -/* standard widgets & controls */ -ui_px ui_standard_widget_height( ui_context *ctx, ui_px count ); -void ui_standard_widget( ui_context *ctx, ui_rect inout_panel, ui_rect out_rect, ui_px count ); -void ui_panel( ui_context *ctx, ui_rect in_rect, ui_rect out_panel ); -void ui_label( ui_context *ctx, ui_rect rect, const char *text, ui_px size, ui_px gap, ui_rect r ); -void ui_info( ui_context *ctx, ui_rect inout_panel, const char *text ); -void ui_spacer( ui_context *ctx, ui_rect inout_panel ); -void ui_image( ui_context *ctx, ui_rect rect, void *image_resource, bool flip ); - -enum ui_button_state ui_button_base( ui_context *ctx, ui_rect rect ); - -/* TODO: split this out into a formatless button and one that auto fills */ -enum ui_button_state ui_colourbutton( ui_context *ctx, ui_rect rect, - enum ui_scheme_colour colour, - enum ui_scheme_colour hover_colour, - enum ui_scheme_colour hi_colour ); -enum ui_button_state ui_colourbutton_text( - ui_context *ctx, - ui_rect rect, const char *string, ui_px scale, - enum ui_scheme_colour colour ); - -enum ui_button_state ui_button_text( ui_context *ctx, ui_rect rect, const char *string, ui_px scale ); -enum ui_button_state ui_button( ui_context *ctx, ui_rect inout_panel, const char *string ); -void ui_postrender( ui_context *ctx, f32 delta_time ); -enum ui_button_state ui_checkbox_base( ui_context *ctx, ui_rect box, i32 *data ); -int ui_checkbox( ui_context *ctx, ui_rect inout_panel, const char *str_label, i32 *data ); -void ui_enum( ui_context *ctx, ui_rect inout_panel, const char *str_label, - struct ui_enum_opt *options, u32 len, i32 *value ); - -enum ui_button_state ui_slider_base( ui_context *ctx, - ui_rect box, enum ui_axis axis, f32 min, f32 max, f32 *value, f32 *out_t ); -void ui_slider_text( ui_context *ctx, ui_rect box, const char *format, f32 value ); -bool ui_slider_standard( ui_context *ctx, ui_rect box, f32 min, f32 max, f32 *value, const char *format ); -bool ui_slider( ui_context *ctx, ui_rect inout_panel, const char *str_label, f32 min, f32 max, f32 *value ); - -enum ui_colour_type -{ - k_ui_colour_type_rgba, - k_ui_colour_type_rgb -}; - -bool ui_colourpicker( ui_context *ctx, ui_rect inout_panel, const char *str_label, v4f value, enum ui_colour_type type ); -void _ui_textbox_move_cursor( ui_context *ctx, int *cursor0, int *cursor1, int dir, int snap_together ); -int _ui_textbox_delete_char( ui_context *ctx, int direction ); -void ui_start_modal( ui_context *ctx, const char *message, const char *ok_text, - u32 options, const struct ui_modal_callbacks *callbacks ); - -void _ui_textbox_put_char( ui_context *ctx, char c ); -void _ui_textbox_left_select( ui_context *ctx ); -void _ui_textbox_left( ui_context *ctx ); -void _ui_textbox_up( ui_context *ctx ); -void _ui_textbox_down( ui_context *ctx ); -void _ui_textbox_right_select( ui_context *ctx ); -void _ui_textbox_right( ui_context *ctx ); -void _ui_textbox_backspace( ui_context *ctx ); -void _ui_textbox_delete( ui_context *ctx ); -void _ui_textbox_home_select( ui_context *ctx ); -void _ui_textbox_home( ui_context *ctx ); -void _ui_textbox_end_select( ui_context *ctx ); -void _ui_textbox_end( ui_context *ctx ); -void _ui_textbox_select_all( ui_context *ctx ); -void _ui_textbox_cut( ui_context *ctx ); -void _ui_textbox_enter( ui_context *ctx ); -void _ui_textbox_to_clipboard( ui_context *ctx ); -void _ui_textbox_clipboard_paste( ui_context *ctx ); - -int ui_textbox( ui_context *ctx, ui_rect inout_panel, const char *label, - char *buf, u32 len, u32 lines, u32 flags, - struct ui_textbox_callbacks *callbacks ); -void ui_tabs( ui_context *ctx, ui_rect inout_panel, ui_rect out_content_panel, - const char **titles, u32 count, i32 *page ); -void ui_defocus_all( ui_context *ctx ); - -void ui_proc_utf8( ui_context *ctx, const char *text ); -void ui_dev_colourview( ui_context *ctx ); - -extern vg_font_sheet vg_default_font_sheet; -extern vg_font_face vgf_default_small, vgf_default_large, vgf_default_title; - -#endif diff --git a/vg_ui/imgui_impl_opengl.c b/vg_ui/imgui_impl_opengl.c deleted file mode 100644 index b26475e..0000000 --- a/vg_ui/imgui_impl_opengl.c +++ /dev/null @@ -1,313 +0,0 @@ -struct vg_ui vg_ui = -{ - .ctx = - { - .scheme = - { - [ k_ui_bg+0 ] = UI_RGB( 0x1d2021 ), - [ k_ui_bg+1 ] = UI_RGB( 0x282828 ), - [ k_ui_bg+2 ] = UI_RGB( 0x3c3836 ), - [ k_ui_bg+3 ] = UI_RGB( 0x504945 ), - [ k_ui_bg+4 ] = UI_RGB( 0x665c54 ), - [ k_ui_bg+5 ] = UI_RGB( 0x7c6f64 ), - [ k_ui_bg+6 ] = UI_RGB( 0x928374 ), - [ k_ui_bg+7 ] = UI_RGB( 0xa89984 ), - - [ k_ui_fg+0 ] = UI_RGB( 0xebdbb2 ), - [ k_ui_fg+1 ] = UI_RGB( 0xfbf1c7 ), - [ k_ui_fg+2 ] = UI_RGB( 0xd5c4a1 ), - [ k_ui_fg+3 ] = UI_RGB( 0xbdae93 ), - [ k_ui_fg+4 ] = UI_RGB( 0xa89984 ), - [ k_ui_fg+5 ] = UI_RGB( 0x000000 ), - [ k_ui_fg+6 ] = UI_RGB( 0x000000 ), - [ k_ui_fg+7 ] = UI_RGB( 0x000000 ), - - [ k_ui_red ] = UI_RGB( 0xcc241d ), - [ k_ui_orange ] = UI_RGB( 0xd65d0e ), - [ k_ui_yellow ] = UI_RGB( 0xd79921 ), - [ k_ui_green ] = UI_RGB( 0x98971a ), - [ k_ui_aqua ] = UI_RGB( 0x689d6a ), - [ k_ui_blue ] = UI_RGB( 0x458588 ), - [ k_ui_purple ] = UI_RGB( 0xb16286 ), - [ k_ui_gray ] = UI_RGB( 0x928374 ), - [ k_ui_red + k_ui_brighter ] = UI_RGB( 0xfb4934 ), - [ k_ui_orange + k_ui_brighter ] = UI_RGB( 0xfe8019 ), - [ k_ui_yellow + k_ui_brighter ] = UI_RGB( 0xfabd2f ), - [ k_ui_green + k_ui_brighter ] = UI_RGB( 0xb8bb26 ), - [ k_ui_aqua + k_ui_brighter ] = UI_RGB( 0x8ec07c ), - [ k_ui_blue + k_ui_brighter ] = UI_RGB( 0x83a598 ), - [ k_ui_purple + k_ui_brighter ] = UI_RGB( 0xd3869b ), - [ k_ui_gray + k_ui_brighter ] = UI_RGB( 0xa89984 ), - }, - .font = &vgf_default_small, - .scale = 1, - .padding = 8, - .widget_height = 28 - }, - .colour = {1.0f,1.0f,1.0f,1.0f}, - .bg_inverse_ratio = {1,1}, -}; - -VG_API void vg_ui_set_screen( i32 width, i32 height ) -{ - ui_set_area( &vg_ui.ctx, width, height ); - m3x3_identity( vg_ui.pv ); - m3x3_translate( vg_ui.pv, (v3f){ -1.0f, 1.0f, 0.0f } ); - m3x3_scale( vg_ui.pv, (v3f){ 1.0f/((f32)width*0.5f), -1.0f/((f32)height*0.5f), 1.0f } ); -} -void ui_impl_render_batch( ui_context *ctx, ui_batch *batch, enum ui_shader shader, void *shader_data ) -{ - glBindVertexArray( vg_ui.vao ); - glBindBuffer( GL_ARRAY_BUFFER, vg_ui.vbo ); - glBufferSubData( GL_ARRAY_BUFFER, - batch->vert_offset, - batch->vert_count*sizeof(ui_vert), - batch->vert_buf ); - - glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vg_ui.ebo ); - glBufferSubData( GL_ELEMENT_ARRAY_BUFFER, - batch->indice_offset, - batch->indice_count*sizeof(u16), - batch->indice_buf ); - - glDisable( GL_DEPTH_TEST ); - glDisable( GL_CULL_FACE ); - glEnable( GL_BLEND ); - glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); - glBlendEquation( GL_FUNC_ADD ); - - if( shader == k_ui_shader_colour ) - { - shader_vgui_use(); - shader_vgui_uPv( vg_ui.pv ); - shader_vgui_uColour( vg_ui.colour ); - - glActiveTexture( GL_TEXTURE0 ); - glBindTexture( GL_TEXTURE_2D, vg_ui.tex_glyphs ); - shader_vgui_uTexGlyphs( 0 ); - - vg_tex_bind( GL_TEXTURE_2D, (vg_tex *)vg_ui.tex_bg, 1 ); - shader_vgui_uTexBG( 1 ); - shader_vgui_uSpread( vg_ui.frosting ); - shader_vgui_uBGInverseRatio( vg_ui.bg_inverse_ratio ); - shader_vgui_uInverseFontSheet( vg_ui.inverse_font_sheet ); - } - else if( shader == k_ui_shader_image ) - { - shader_vgui_image_use(); - shader_vgui_image_uPv( vg_ui.pv ); - shader_vgui_image_uTexImage( 0 ); - shader_vgui_image_uColour( vg_ui.colour ); - vg_tex_bind( GL_TEXTURE_2D, (vg_tex *)shader_data, 0 ); - } - else if( shader == k_ui_shader_grad ) - { - shader_vgui_image_grad_use(); - shader_vgui_image_grad_uPv( vg_ui.pv ); - shader_vgui_image_grad_uTexImage( 0 ); - shader_vgui_image_grad_uColour( vg_ui.colour ); - - struct ui_batch_shader_data_image_gradient *inf = shader_data; - shader_vgui_image_grad_uLog( inf->log ); - shader_vgui_image_grad_uScale( inf->scale ); - vg_tex_bind( GL_TEXTURE_2D, (vg_tex *)inf->tex, 0 ); - } - else if( shader == k_ui_shader_hsv ) - { - struct ui_batch_shader_data_hsv *inf = shader_data; - shader_vgui_image_hsv_use(); - shader_vgui_image_hsv_uPv( vg_ui.pv ); - shader_vgui_image_hsv_uHue( inf->hue ); - } - else - vg_fatal_error( "Invalid UI shader (%d)\n", shader ); - - glDrawElements( GL_TRIANGLES, batch->indice_count, GL_UNSIGNED_SHORT, (void *)((size_t)batch->indice_offset) ); -} - -VG_API void vg_ui_post_update(void) -{ - _vg_window_set_fpv_mouse( !vg_ui.ctx.wants_mouse ); - SDL_SetCursor( vg_ui.cursor_map[ vg_ui.ctx.cursor ] ); - SDL_ShowCursor(1); -} - -void vg_ui_set_mouse_pos( ui_px x, ui_px y ) -{ - _vg_window_set_mouse( x, y ); - vg_ui.ctx.mouse[0] = x; - vg_ui.ctx.mouse[1] = y; - vg_ui.ctx.mouse_pos_overriden = 1; -} - -void vg_ui_handle_sdl_key( ui_context *ctx, SDL_Keysym ev ) -{ - if( ctx->focused_control_type != k_ui_control_textbox ) - { - return; - } - - struct textbox_mapping - { - u16 mod; - SDL_Keycode key; - - void (*handler)( ui_context *ctx ); - } - mappings[] = - { - { 0, SDLK_LEFT, _ui_textbox_left }, - { KMOD_SHIFT, SDLK_LEFT, _ui_textbox_left_select }, - { 0, SDLK_RIGHT, _ui_textbox_right }, - { KMOD_SHIFT, SDLK_RIGHT, _ui_textbox_right_select }, - { 0, SDLK_DOWN, _ui_textbox_down }, - { 0, SDLK_UP, _ui_textbox_up }, - { 0, SDLK_BACKSPACE, _ui_textbox_backspace }, - { KMOD_SHIFT, SDLK_BACKSPACE, _ui_textbox_backspace }, - { KMOD_CTRL, SDLK_BACKSPACE, _ui_textbox_backspace }, - { 0, SDLK_DELETE, _ui_textbox_delete }, - { 0, SDLK_HOME, _ui_textbox_home }, - { KMOD_SHIFT, SDLK_HOME, _ui_textbox_home_select }, - { 0, SDLK_END, _ui_textbox_end }, - { KMOD_SHIFT, SDLK_END, _ui_textbox_end_select }, - { KMOD_CTRL, SDLK_a, _ui_textbox_select_all }, - { KMOD_CTRL, SDLK_c, _ui_textbox_to_clipboard }, - { KMOD_CTRL, SDLK_x, _ui_textbox_cut }, - { KMOD_CTRL, SDLK_v, _ui_textbox_clipboard_paste }, - { 0, SDLK_RETURN, _ui_textbox_enter }, - { 0, SDLK_ESCAPE, ui_defocus_all }, - }; - - SDL_Keymod mod = 0; - - if( ev.mod & KMOD_SHIFT ) - mod |= KMOD_SHIFT; - - if( ev.mod & KMOD_CTRL ) - mod |= KMOD_CTRL; - - if( ev.mod & KMOD_ALT ) - mod |= KMOD_ALT; - - for( int i=0; ikey == ev.sym ) - { - if( mapping->mod == 0 ) - { - if( mod == 0 ) - { - mapping->handler( ctx ); - return; - } - } - else if( (mod & mapping->mod) == mapping->mod ) - { - mapping->handler( ctx ); - return; - } - } - } -} - -bool _wrap_sdl_hasclipboard_text(void) -{ - return SDL_HasClipboardText(); -} - -VG_API void _vg_ui_init(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_OPENGL ) ); - - u32 verts = 30000, indices = 20000; - ui_init( &vg_ui.ctx, vg_malloc( sizeof(ui_vert)*verts ), verts, vg_malloc( sizeof(u16)*indices ), indices ); - - /* callbacks */ - vg_ui.ctx.render_batch = ui_impl_render_batch; - - vg_ui.ctx.have_clipboard_text = _wrap_sdl_hasclipboard_text; - vg_ui.ctx.get_clipboard_text = SDL_GetClipboardText; - vg_ui.ctx.free_clipboard_text = SDL_free; - vg_ui.ctx.set_clipboard_text = SDL_SetClipboardText; - vg_ui.ctx.start_text_input = SDL_StartTextInput; - vg_ui.ctx.stop_text_input = SDL_StopTextInput; - - /* Generate the buffer we are gonna be drawing to */ - glGenVertexArrays( 1, &vg_ui.vao ); - glGenBuffers( 1, &vg_ui.vbo ); - glGenBuffers( 1, &vg_ui.ebo ); - - glBindVertexArray( vg_ui.vao ); - glBindBuffer( GL_ARRAY_BUFFER, vg_ui.vbo ); - glBufferData( GL_ARRAY_BUFFER, verts*sizeof(ui_vert), NULL, GL_DYNAMIC_DRAW ); - - glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vg_ui.ebo ); - glBufferData( GL_ELEMENT_ARRAY_BUFFER, indices*sizeof(u16), NULL, GL_DYNAMIC_DRAW ); - - /* Set pointers */ - u32 const stride = sizeof(ui_vert); - - /* XY */ - glVertexAttribPointer( 0, 2, GL_SHORT, GL_FALSE, stride, (void *)offsetof( ui_vert, co ) ); - glEnableVertexAttribArray( 0 ); - - /* UV */ - glVertexAttribPointer( 1, 2, GL_UNSIGNED_SHORT, GL_FALSE, stride, (void *)offsetof( ui_vert, uv ) ); - glEnableVertexAttribArray( 1 ); - - /* COLOUR */ - glVertexAttribPointer( 2, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, (void *)offsetof( ui_vert, colour ) ); - glEnableVertexAttribArray( 2 ); - - vg_ui.cursor_map[ k_ui_cursor_default ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_ARROW ); - vg_ui.cursor_map[ k_ui_cursor_hand ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_HAND ); - vg_ui.cursor_map[ k_ui_cursor_ibeam ] = SDL_CreateSystemCursor( SDL_SYSTEM_CURSOR_IBEAM ); - - /* font - * ----------------------------------------------------- - */ - - /* Load default font */ - - vg_font_sheet *sheet = &vg_default_font_sheet; - u32 pixels = 0, - total = sheet->w*sheet->h, - data = 0; - - /* This is fince since its before the load thread even starts */ - u8 image[512*512]; - while( pixels < total ) - { - for( int b = 31; b >= 0; b-- ) - { - image[ pixels ++ ] = (sheet->bitmap[data] & (0x1u << b))? 0xffu: 0x00u; - - if( pixels >= total ) - { - total = 0; - break; - } - } - data++; - } - - vg_ui.inverse_font_sheet[0] = 1.0/(f64)sheet->w; - vg_ui.inverse_font_sheet[1] = 1.0/(f64)sheet->h; - - glGenTextures( 1, &vg_ui.tex_glyphs ); - glBindTexture( GL_TEXTURE_2D, vg_ui.tex_glyphs ); - glTexImage2D( GL_TEXTURE_2D, 0, GL_R8, sheet->w, sheet->h, 0, GL_RED, GL_UNSIGNED_BYTE, image ); - - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST ); -} - -void ui_free(void) -{ - free( vg_ui.ctx.indice_buffer ); - free( vg_ui.ctx.vertex_buffer ); -} diff --git a/vg_ui/imgui_impl_opengl.h b/vg_ui/imgui_impl_opengl.h deleted file mode 100644 index 5cc4cd4..0000000 --- a/vg_ui/imgui_impl_opengl.h +++ /dev/null @@ -1,28 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_ui/imgui_impl_opengl.c" -#else - -struct vg_ui -{ - GLuint vao, vbo, ebo; - m3x3f pv; - ui_context ctx; - GLuint tex_glyphs; - v2f inverse_font_sheet; - - SDL_Cursor *cursor_map[ k_ui_cursor_max ]; - - /* at some point this should be implementation specific? */ - v4f colour; - f32 frosting; - v2f bg_inverse_ratio; - - vg_tex *tex_bg; -} -extern vg_ui; - -VG_API void _vg_ui_init(void); -VG_API void vg_ui_post_update(void); -VG_API void vg_ui_set_screen( i32 width, i32 height ); - -#endif diff --git a/vg_vorbis.c b/vg_vorbis.c deleted file mode 100644 index 266a167..0000000 --- a/vg_vorbis.c +++ /dev/null @@ -1,69 +0,0 @@ -/* - * adapted from stb_vorbis.h, since the original does not handle mono->stereo - */ -int stb_vorbis_get_samples_float_interleaved_stereo( stb_vorbis *f, float *buffer, int len ) -{ - int n = 0, c = 1; - if( f->channels < 2 ) c = 0; - - while( n < len ) { - int k = f->channel_buffer_end - f->channel_buffer_start; - - if( n+k >= len ) - k = len - n; - - for( int j=0; j < k; ++j ) { - *buffer++ = f->channel_buffers[ 0 ][f->channel_buffer_start+j]; - *buffer++ = f->channel_buffers[ c ][f->channel_buffer_start+j]; - } - - n += k; - f->channel_buffer_start += k; - - if( n == len ) - break; - - if( !stb_vorbis_get_frame_float( f, NULL, NULL )) - break; - } - - return n; -} - -/* - * ........ more wrecked code sorry! - */ -int stb_vorbis_get_samples_i16_downmixed( stb_vorbis *f, signed short *buffer, int len ) -{ - int n = 0, c = 1; - if( f->channels < 2 ) c = 0; - - while( n < len ) { - int k = f->channel_buffer_end - f->channel_buffer_start; - - if( n+k >= len ) - k = len - n; - - for( int j=0; j < k; ++j ) { - float sl = f->channel_buffers[ 0 ][f->channel_buffer_start+j], - sr = f->channel_buffers[ c ][f->channel_buffer_start+j], - s = 0.5f*(sl+sr); - - if( s < -1.0f ) s = -1.0f; - if( s > 1.0f ) s = 1.0f; - - *buffer++ = s * 32767.0f; - } - - n += k; - f->channel_buffer_start += k; - - if( n == len ) - break; - - if( !stb_vorbis_get_frame_float( f, NULL, NULL )) - break; - } - - return n; -} diff --git a/vg_vorbis.h b/vg_vorbis.h deleted file mode 100644 index f1e60e9..0000000 --- a/vg_vorbis.h +++ /dev/null @@ -1,4 +0,0 @@ -/* This is just an extension to submodules/stb/stb_vorbis.c, so that we don't have to patch the file directly. */ - -int stb_vorbis_get_samples_float_interleaved_stereo( stb_vorbis *f, float *buffer, int len ); -int stb_vorbis_get_samples_i16_downmixed( stb_vorbis *f, signed short *buffer, int len ); diff --git a/vg_window.c b/vg_window.c deleted file mode 100644 index fc4d50f..0000000 --- a/vg_window.c +++ /dev/null @@ -1,255 +0,0 @@ -struct _vg_window _vg_window; - -void GLAPIENTRY MessageCallback( GLenum source, - GLenum type, - GLuint id, - GLenum severity, - GLsizei length, - const GLchar* message, - const void* userParam ) -{ - if( severity == GL_DEBUG_SEVERITY_HIGH ) - { - vg_error( "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), - type, severity, message ); - } - else - { - vg_low( "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", - ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), - type, severity, message ); - } -} - -VG_API void _vg_window_register(void) -{ - vg_console_reg_var( "vg_screen_mode", &_vg_window.display_mode, k_var_dtype_i32, VG_VAR_PERSISTENT ); - vg_console_reg_var( "vg_vsync", &_vg_window.vsync, k_var_dtype_i32, VG_VAR_PERSISTENT ); -} - -VG_API void _vg_window_init(void) -{ - VG_ASSERT( _vg_thread_has_flags( VG_THREAD_OWNS_SDL|VG_THREAD_OWNS_OPENGL ) ); - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); -#if 0 - SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 ); - SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 ); -#endif - SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 4 ); - SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 3 ); - SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE ); - SDL_GL_SetAttribute( SDL_GL_CONTEXT_RELEASE_BEHAVIOR, SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH ); - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8 ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8 ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8 ); - SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8 ); - SDL_GL_SetAttribute( SDL_GL_STENCIL_SIZE, 0 ); - - /* - * Get monitor information - */ - vg_info( "Getting display count\n" ); - i32 display_count = 0, - display_index = 0, - mode_index = 0; - - SDL_DisplayMode video_mode; - if( SDL_GetDesktopDisplayMode( display_index, &video_mode ) ) - { - vg_error( "SDL_GetDesktopDisplayMode failed: %s\n", SDL_GetError() ); - SDL_Quit(); - exit(0); - } - - _vg_window.monitor_refresh_rate = video_mode.refresh_rate; - _vg_window.w = video_mode.w; - _vg_window.h = video_mode.h; - if( _vg_window.display_mode == k_vg_window_windowed ) - { - _vg_window.w = 1280; - _vg_window.h = 720; - } - -#ifndef _WIN32 - SDL_SetHint( "SDL_VIDEO_X11_XINERAMA", "1" ); - SDL_SetHint( "SDL_VIDEO_X11_XRANDR", "0" ); - SDL_SetHint( "SDL_VIDEO_X11_XVIDMODE", "0" ); -#endif - - u32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_INPUT_GRABBED | - SDL_WINDOW_RESIZABLE; - - if( _vg_window.display_mode == k_vg_window_fullscreen ) - flags |= SDL_WINDOW_FULLSCREEN; - else if( _vg_window.display_mode == k_vg_window_fullscreen_desktop ) - flags |= SDL_WINDOW_FULLSCREEN_DESKTOP; - - vg_info( "CreateWindow( %d %d %u )\n", _vg_window.w, _vg_window.h, flags ); - if(( _vg_window.sdl_hwindow = SDL_CreateWindow( "Voyager Game Engine", 0, 0, _vg_window.w, _vg_window.h, flags ))) - { - if( _vg_window.display_mode == k_vg_window_windowed ) - SDL_SetWindowPosition( _vg_window.sdl_hwindow, video_mode.w-_vg_window.w, 0 ); - } - else - { - vg_error( "SDL_CreateWindow failed: %s", SDL_GetError() ); - exit(0); - } - - SDL_RaiseWindow( _vg_window.sdl_hwindow ); - SDL_SetWindowMinimumSize( _vg_window.sdl_hwindow, 1280, 720 ); - SDL_SetWindowMaximumSize( _vg_window.sdl_hwindow, 4096, 4096 ); - - vg_info( "CreateContext\n" ); - - /* ????? */ - if( SDL_IsTextInputActive() ) - SDL_StopTextInput(); - - /* - * OpenGL loading - */ - if( ( _vg_window.sdl_hopengl = SDL_GL_CreateContext( _vg_window.sdl_hwindow ) )) - { - SDL_GL_GetDrawableSize( _vg_window.sdl_hwindow, &_vg_window.w, &_vg_window.h ); - vg_success( "Window created (%dx%d)\n", _vg_window.w, _vg_window.h ); - } - else - { - vg_error( "SDL_GL_CreateContext failed: %s\n", SDL_GetError() ); - SDL_Quit(); - exit(0); - } - - if( !gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress) ) - { - vg_error( "Glad Failed to initialize\n" ); - SDL_GL_DeleteContext( _vg_window.sdl_hopengl ); - SDL_Quit(); - exit(0); - } - - const unsigned char* glver = glGetString( GL_VERSION ); - vg_success( "Load setup complete, OpenGL version: %s\n", glver ); - - - glEnable ( GL_DEBUG_OUTPUT ); - glDebugMessageCallback( MessageCallback, 0 ); - - SDL_GL_SetSwapInterval(0); /* disable vsync while loading */ - SDL_DisplayMode dispmode; - if( !SDL_GetWindowDisplayMode( _vg_window.sdl_hwindow, &dispmode ) ) - if( dispmode.refresh_rate ) - _vg_window.monitor_refresh_rate = dispmode.refresh_rate; - - if( _vg_window.monitor_refresh_rate < 25 || _vg_window.monitor_refresh_rate > 300 ) - _vg_window.monitor_refresh_rate = 60; - vg_info( "Display refresh rate: %d, we chose: %d\n", dispmode.refresh_rate, _vg_window.monitor_refresh_rate ); - - SDL_SetRelativeMouseMode(1); -} - -VG_API void _vg_window_swap(void) -{ - /* Vsync switching - * ----------------------------- */ - if( _vg_window.vsync && (_vg_window.vsync_feature != k_vsync_feature_error) ) - { - /* turn on vsync if not enabled */ - - enum vsync_feature requested = k_vsync_feature_enabled; - if( _vg_window.vsync < 0 ) - requested = k_vsync_feature_enabled_adaptive; - - if( _vg_window.vsync_feature != requested ) - { - vg_info( "Setting swap interval\n" ); - int swap_interval = 1; - if( requested == k_vsync_feature_enabled_adaptive ) - swap_interval = -1; - - if( SDL_GL_SetSwapInterval( swap_interval ) == -1 ) - { - if( requested == k_vsync_feature_enabled ) - { - ui_start_modal( &vg_ui.ctx, "Vsync not supported on this system.\n\n" - "You may be overriding it in your" - " graphics \ncontrol panel.\n", - NULL, UI_MODAL_BAD, NULL ); - } - else - { - ui_start_modal( &vg_ui.ctx, "Adaptive Vsync is not supported by your system\n\n" - "You may be overriding it in your" - " graphics \ncontrol panel.\n", - NULL, UI_MODAL_BAD, NULL ); - } - _vg_window.vsync_feature = k_vsync_feature_error; - _vg_window.vsync = 0; - } - else - { - vg_success( "Vsync enabled (%d)\n", requested ); - _vg_window.vsync_feature = requested; - } - } - } - else - { - if( _vg_window.vsync_feature != k_vsync_feature_disabled ) - { - SDL_GL_SetSwapInterval( 0 ); - _vg_window.vsync_feature = k_vsync_feature_disabled; - } - } - - _vg_profiler_enter_block( vg.profiler, "vg_engine:swap" ); - SDL_GL_SwapWindow( _vg_window.sdl_hwindow ); - _vg_profiler_exit_block( vg.profiler ); -} - -VG_API void _vg_window_size_changed(void) -{ - i32 w, h; - SDL_GL_GetDrawableSize( _vg_window.sdl_hwindow, &w, &h ); - - if( !w || !h ) - { - vg_warn( "Got a invalid framebuffer size: %dx%d... ignoring\n", w, h ); - } - else - { - - i32 delta[2] = { w - _vg_window.w, h - _vg_window.h }; - _vg_magi_area_change( delta ); - _vg_window.w = w; - _vg_window.h = h; - - vg_framebuffer_update_sizes(); - } -} - -VG_API void _vg_window_set_fpv_mouse( bool yes ) -{ - if( yes ) - { - SDL_SetWindowGrab( _vg_window.sdl_hwindow, SDL_TRUE ); - SDL_SetRelativeMouseMode( SDL_TRUE ); - } - else - { - SDL_SetWindowGrab( _vg_window.sdl_hwindow, SDL_FALSE ); - SDL_SetRelativeMouseMode( SDL_FALSE ); - } -} - -VG_API void _vg_window_set_mouse( i32 x, i32 y ) -{ - SDL_WarpMouseInWindow( _vg_window.sdl_hwindow, x, y ); -} - -VG_API void _vg_window_shutdown(void) -{ - SDL_GL_DeleteContext( _vg_window.sdl_hopengl ); -} diff --git a/vg_window.h b/vg_window.h deleted file mode 100644 index f1b99b2..0000000 --- a/vg_window.h +++ /dev/null @@ -1,42 +0,0 @@ -#if defined( VG_IMPLEMENTATION ) -# include "vg/vg_window.c" -#else - -enum vg_window_display_mode -{ - k_vg_window_fullscreen_desktop = 0, - k_vg_window_fullscreen = 1, - k_vg_window_windowed = 2 -}; - -struct _vg_window -{ - SDL_Window *sdl_hwindow; - SDL_GLContext *sdl_hopengl; - i32 w, h, monitor_refresh_rate, vsync, display_index; - - i32 display_mode; - - enum vsync_feature - { - k_vsync_feature_disabled=0, - k_vsync_feature_enabled=1, - k_vsync_feature_enabled_adaptive=2, - k_vsync_feature_error=3 - } - vsync_feature; - - u32 swap_profiler; -} -extern _vg_window; - -VG_API void _vg_window_register(void); -VG_API void _vg_window_init(void); - -VG_API void _vg_window_shutdown(void); -VG_API void _vg_window_swap(void); -VG_API void _vg_window_size_changed(void); -VG_API void _vg_window_set_fpv_mouse( bool yes ); -VG_API void _vg_window_set_mouse( i32 x, i32 y ); - -#endif -- 2.25.1

|NLW2=bB5GH_iCJ-c>iedzrQ)xM_?&iaHFc=exVocE2exb6%?nj9}2^AlfQC`aS)Ol=x@%KmvQG^8*z3R> zfcwvpapz><;a!AZuZQ1i^r7=?!_Z&_{^JQZ{{N-;=h46?uspSw59^b5T)voauGdKAhqprB zd0G0`iQstw@@b{#w~&wHJ(_bNzsJ#1ZbIerof#+l1U8C4Sp83fd<=P@-M5VZ52<#) zgmCWHD^z~91oBC>-}(~dlPV5>Y4A=o-g(!P_c%uMcW_VIO4REJ-~n}RAw)RqGeGsn zdf;i5hb&?qvP0%%X)k+DCJlaPFK>QQPw~*?X(|p+dJcJly4UMx@MLcDj(2 zqHVtvj*5>GiJLNuK>7rtI^)!RZ{J>R(45 zk9;rX_2<=(N}eCV_ovFB&nM8+zf|=620;=GOL9r6SZsCnE#;A!M(XTl%O1@2xhb`GIj z7kFxdj5`YnD*kW^?C>7s6YBiNcHpsT-gV=B@}(V1R6FJqZv0Ti z&ohmDXS!Ga08^r!Pt5|)c9l0i4EcE~&s@j+q<`Q}vBL)R_nrF)9>hL!chqYt<81$1 zyyNm*$h#B7AMCvct012`OxoA3BYi+P`$<&A;q8`Zyzu-8`=4AO^u3xsKYu_!K-NmHi8U z6@8+&Nxt+Nc=qcnc1~R^^|k$O2;*dDAKp8TLOx75*LSH}Ke+<VBy()<|j&n13;{8NV>pw35532jSGK6zHjHtY5-~OU!W>@JcG3a?T;cU-{ z%5O(QKCSxiRLIBFxx|GAr@Td#`wa6?z2c8bjqv$T=R5HGI!M2>dsPLbP{yTy3mJNmfej(v(pBI%sTy5mZ{+qq|$z4XC=Jjfx@)qQy z>ibHYfxBwme)oZ5=SI~}^9g7F@joO17-@l1NVs_q^d`XvpKAE8yKX!i^3HQIv$JvRLBjc79cP%VRM>gnX9n-&xT?MfpCI`1M{t3=qzK8&~?ANjUF=`*D7t2kbltJV7;oe-wC1_3L*HKdnosyye;%;%`o) z^wX>0hksd~q~w{Wq1+=*6#K;ReeI#}pHqN`21)ylhWsSLxn8%b_PUPc*-t)}JZ%kl z9susB^`$q#)2Qt8laWVZE&kc#B=D>ASDk_T4i&!*;5U64r*;owych)h>i1<_i}#Z8 z!mcl!4W9H_qW?G<_MEA}{YwR~|-3wTuJdp|QydM1yMb`h-{ zXaAGM&S@3*jyE{n&!FPld5|wx@^cB#7FX{koa0sOO=&2bC%ltG{u}UbRr$t#L1~vX z#yc4$9j6EIfLfoQa-R5SatCjJDI|IJs}(Arbiw2ADgJE7kwuW-ru^`E;14SNd*-3~ zM*fs>c@g}f`(VNK{VElVbDY^OEn>^P7Pt@VqBf2_4j%uh(qH619cL5aTrZ!}=iP1M zhfc^FhdU0Da%1Y;%K*aJ-x{%Aif-+c19w!OylpndmlH*Q8;38Wc`?T^o&Suc_n;Zq z?`tok_lX$S?;kBdxjoc+#Ulo%yj1n;cL`_vJGdXxuG4N~ocJSZAM;QOL@e*WSSqd2)3iRvf3{v15pL|G>~Ih8w8CF8IK^kxUw&eK(kHM={LQYb>^@BN2~j`bKfCVn zn+tzF%iE5fjuAYH^Tu{xGC(}+59`!E(RjjnT<~2f>qrq(isMv5euL^4HyWJg%PN2V z;S4D^b(gn)tt5G_SIQ^x&D!lf@EoM$Nl)SN?ckMfN9)_BUDSE|PK*=3{;qlf@VHth z??d+_uwUu>8O{cOyqnnhc-UbPcw9AJzX06-gZOzN{NyX(dL6#~2+==+eVGRE_adDA zXQayaCa^sFL!;z%=b+9d>F=S%;wSbT+LPe%*Lw4=kAcUR zNxZ5>fA^bD$bbZ^30&zL%IHU{zuHUDZfIK^A#|F;5 zl4n1Oy&&~!gq;r>DS9UE@%mK(<0K!zKJsX6XpMz@@)8+Y>^kaH;I5ia-A*{S<3eSh z=fNMmQS3>_c+8(~l<4DE>tOwW>w82)gfo9!+4HbD;?K$1(!L*}z89AYo+uUnd>r_6 z@JH~zyd7We1Rg*;9t`=H8Rz)9MD(}g&UT|uCnu=dtNW=E=VPaN$FE_8v!D3R6Tck; zJA87v$VVV= zkXk1^i~kh~ekRlD3s zINLd)#^rwj@1fp9|Io^-^?|<#XFWse98TBK!XH$5?@+>xeIE4sTRHH6+Sk6!@X&dC zl}|1P?pOZ&8hAqLd!sMWd$?=|{od{-!_&c8k9%BYG$iAlF6|Of_t=jFp1^mY9+d9k zTxoHvCwE31UJu+oMDmkfXqUeTXTOc8dR;1XJ<0k}`CbN&iEsM@hpNbHumN8*o-OJfP=`o5_8*EE)= za^v_;)QwQ85JQ4N%=ua(=`p!%H zv0~5m%K!6$Z&7}A4&ki7?={iqZTRQqjFbJHD`nkg4e-Ul{TEAqOKG0@TWRsb#qu`( zr+|lWo?#*E^DXe;A{n`?{LbS<|BUj_qk(r+e!};18b4X>U0=G8ajI7gc@Z67H-C>q zJ~-H`=UT`|V9zelbIQ)r@AP|oKR`Y@TH0#?f5AyoEKXLFUPZWK6K%ZA2A5-ryd;&bG-UHovyx9LB)h~Jw&iY63 z9gv>jKO1=95AmOyfInq;sP<~S2!15~tna`580GG%#_Re^#18Jiyz`MA&Vrrq^o|$D z63*k-JaumNRN&jxy7zSO#MO6=Z-M+sHBPN$d9s7Er`Y)<)b}gMw^#AgcQ)F+hjgH8 zur4%;acbX~T9>OPob@kP^QmhI=k=BZ?j?|3<2cV6dD>@G?ez)sle{0_5fJZkoV_MU z`*v01LO$>U)$h&%ewm7&mlJOM0qdOIVTU{J!aU_>uRlKwd4E^w7t;_=z672=TkJUp zJO`g6_KB}J3oD&%OyKI(TAh3zh!=M>y+~DG}yZB#b(@Lq4YB z$;*&WoiF-#Lc4D<@}244^#hFMZJylu0>0-9`BAyl)8M z>{kO+Tq=QlNZp4v4|qWB$34V2+y5vj5Y=_wfV}g9cfPq(FY!-(e(4vIH}P4G3kQd# zzP=wNPqz8YMj!h7KGMFk;h%Ys*Z1*`B%JvZYF}mw@b)UtpU*s0uXuOqkN-qovHuNH zZs7N&o0{A-Ea#`6t#Bk}GAvwE8~^`2@aeZ1bG=4L_}mDnI#iqxf4O;O$>K z6p23V)x5O_;T#_lA&E^qx2I_kz#b@>(J&wF*%BB4XHBS8w{tV7-+Idh1axmj3sBabc z`!i1barJ%h(+FpO%cy?jLf(h-oI&th0X(Dj-R=XPR_D{!8Gd@dRmI6)AsK%Wxe?jph80)9E+++I7WavwA}y$A8R#9@j7@SxbJi@ zczz+=kN@8CpM6Wkp88(aqY3A7x2o}FJmixqPn%)nDKAoS@^+S|`bNGHKPf|Aare>U z=jrFY{d5iUv{VrPeFNbpPn#!kqYLm+Wukv-gWz`lRcvu}zHu(&q)+^18ILXk&pm{* z|MXCK-5T&j)w=OkBTwrXYFzGfiquQzjr&e!JzM`BX>f`^Di1vDDa5gRBtF>r*QqR@ zrQcmiINK+#<_jwc=XwoL^OS#sCwQsY!N%>s80UD1^<-MsGk=F&3V+^BBG^Z$N|$mz zZ${^W*2+GVtzl2XnJ0;Za@T`r1n`*Jznew}<~eQzItagw|5YT<^>T0?!{)1ZGY{b@ z%y*7Q!JB}m@f|LUZz&Oe|8c@F1r^?>QtA~@=ks^25dROT_C1Plu2cA$1=yXkg6oN>}8hI>dxL7$<(<7*{4 ziB%n^7GhK(gq!?UjlZiQAE^}oFO+WSd}QP)KU8sbrz+toQ1v?2 z;GLbI+HWc(-1JABO9`T0#lQpYz4Mo=z_Uf=`OASXRQh~t@J`MRN}qkJrM-MgpMD0X zaZSk=6V7_N^F^OeuzqqWTJfYSru4A0)<#rUmnhl<$l~?up z33&2i@e}KBySd^ImFnEcK*Cv1{hiz~z+>ut(iz~nOvSy$EKhnSaUZW8%T`*RJ;cv3 zEpgs}ydU>1AU$z@CftnUZ%TX^iu!h$DtZQ%d;M_LT#4JMxJ0UMkUxRtNgoIEP04~B z=Um_s+%ME0^0UDoohLoF7WmD;Q@4888Lp@GYBLW~>*0@(Jon#=)%^NH%cJsSr&j8f z!1w4+N4fhmPWnfW5<5s#cbpS|Cnt!Xp9}e7!nxcPDsEf}Jg)M?rya3d@}J)L|0v|w zDE(hYxq(+C@Qg;e-xKb~e{cEE-gTmXdZy@k8y@}#`M+MbIfmppZf{ZJ$POdK&iXq| zA?7E)jRw5=Nh5GaoqN0!co66M@}SQ%z|;87<4a<0XFcJpPe#qJe+M2_dUmN7`G}Gq zM!4+@E$veT`HafDqAXAC9(hDs+|D=e1s=as>}l6SHX0tf7hSb`3D%uL8Hqo(U+ml< zc1s`Z_2+|uCr|U*b1>tiPkf1#YtOe_2HZDJ3}*MEH|#EcrSB1XjO0!Gs&V-}!nq$s z)jVj(6@q7QzplM!=4-=4?>nn`_x`ki%;%j}sC%?dAe_q$sqyH1gLiU*s$X0J`SogC zyPI&fLvkN!7rJ)O{JjU<#rwkc+|G9JxGLW}g4Q+IZ++@J<|hM><9wIRAI1~T{kp5t z^Lymm`n!ZPNS^JPQ1*<0KcT*d^0?ur`xDf>`(u`;`uef|C9Ur`yEKYDSEza&LpaMj z%VfQ79Gra&Ah|V1w5Wqrj8J{81@qZQi>3xuoVxA6h=XJ(O zpVYZBZuWpa`_B;llWLtOdWQI|i~Q$Q$nX1^%(L9Xyz`EM#KZh)^&P`WjI;gK`$}^l z@5lLhJKimWK7JJk-UUxu@x1t)=#x%($H8rok6j@X=<8vhy=RI((OFVrA@Bg>q<>J| zv$sQq*dc}wZrHdnj^w!?t;fAdVhzV>FgUG)seIrTl$+TsEn<0Ifc#D>5BY*{9`~ba ze%kRO(KCegy))4+ClYSPS)CsOAExsBtAN)l{9)#&_DZSmv#bN2#`k=Cq1;axCp{B8 zOB{F`_}&+bK80%B-2Ds8(|_{Xp%3KODLb4`IP2p)?vi|JWKQmT`&49M}4~j54`Esvp?{tx;N$m#>s9eoL{p3 zf6l?^cj}zdeDFlneDhJl*$;in4jaJldsF)RkI-|Me~5fi%`c82+_dA#(ji=|JB??Y z>>pM470d!pTIKmmfxBvd_Eq5X)cLgUz#qg0}p;UWK5*AT>)sFMgr|7@cf_HCH?3@D0K$# zbO&kQ(~`POS~*Vg9I>-Lx6t7-sh4|> z1h&P{fA(O}GuFpz=iV$&{O&es7y7)E`I|;Kw_^nUZ~ggt@Tb*%$WIc^{i37l7atm& z-rH4qX8X%U-ckLx7vbD4Y4x3pvw>$m^2Ucc;3=%<*m=`j;CkQiHo|!viK@8$8sS{u z1m0)2_1yv(U3#6MF`Kkht_E^zTPF=aUJXPZMiUzDhXr zzpmzw3xP*tvQKf4Ux=P$evS`n|L$YpzW2R$zWYqrU+ouc1OFD)Ufr$~{q^^2B80P^ zQI)UGW_i*_pMP8Zl9ZeIhxA`ctIXfc;Ezof`;0*xcm+I}hb8V=KmQiEgZHv6-tqrn z=N=MIrU|`sCgH5-WlGOR$fxl=5%FHfxz)(iIIi-jXMs1WeCbodd3;H$d!Bc@O6-tQ z??2`NPh-3&hMuDcXFbc+Jf)81$xr;fWW0_`^_)e7a~$xgdGuq3hxR+v{P6?uKd9bk z*$)0lo)8}bM?8E!>qF;-R6aA9aBknAx*uQyg3Jk5WLlv?wJ}9@s$kV-!%AWICp7hM%{wvzHHhd= zdOqY`Pk0aVkrI)&`us__S)a%EsrNyBPoni1E;pn0!KVO^tNGORgo`IY5&UxxM>1_}H6wJ8LJMEa zlR8TD84CFT8azJ5)A668f1*+9`wHX>7$<)BBB}3= zu)~dA#Gdg-y#6*0Jjva?<(2`DfFeqzYKnl47Q)HC!F)Ngjxr17D~CH zg!scT(6a~O9JhmN{QYCB#Ap2;&_u{PO8ye&Cw&5MNWZZDkpH^GpVaGu9ENg#q&Ug_ zH-G>+1o%?$BvgMnkG^}(^7=dMYayS!-COQ2z#|I;FGN4;vIy;>;%A6(*57xicU-H3 z{C1UJ{rsNP%e~X<&rV%Ybwz!}%+lI$aZOcKO?B^L*X>>7geOisJufdDZhD;GXKblk zQ(Hf}s>mHtR8iSbTROP9WLQP%@T$;h#pCkA6_bYN^{p)}Zm6xRsHrBlhU$8v@v;== z6-*A-*VGqPhO3CEv}AZ|k^FqOwx+nWt}a|%R8<--E-EfB4cFDzW)sbuR8d`2JL7L9 z^GN%mk|9QTSVisdP;pi7;+o15u4kW?)eILEPi?5ErDAJ~>dL9uqWaR|c?A_zp=O}9 z&izM^7+F&@rEYi&d)AlMR#AcVWQ``HDr@8iMpctobx|c5a%fRy<)orwCTVT9zT@jk zYg-6qlNmU)ytH`A`0D8u)g_jU1IWMD{itYo=~( z>n5~G3pQ#K+DvO96u=wFzyewXm`WS#R8^tnr#*t+Q9U1-Y;&Zn9D~Zorz`E8WcP z5pSv`St%PgV9o87ZsrEw%GONX+SW~IlNM~$CbXH>!pa`(so8DKu-4ft-GW?L6gOEZ z8#iFh?Uiok_J}vtlB|@C8?ff~N;h)@Z)IzyZf)x(v`Gu&z^!F1tn5M78xqRu*9>c& zz0%D(16SN+rEJ`QHMdu~ncE}YR7_=+<-N=SGt+oBi>X; zGEg>dz?$1D-OLTVm7STowV|8PCN0>eO=vT%g_S+ndVR9nnqaN7SGoncuqbY}QWkE& zn%gVg%809XRmY% za$!;2Y^5yRfHk*Qx|!P}-c(DrQWkE&n%gVg%niJ?t%*8|tu5N5g)yo{n`teq?7`OS zo88s~Yn{E)Ey#sMakG`Oa0AxdUg>6Tk9bop*-BZs0c&orbTc>b*0v_HLT1%pHUzs800^9rfl%E2WiwX~Qz&Mhh~J*%R0`f&Qo z>p#{kZ=G4w#4tQWKgr7z3Az8rL^GT=0S>Ia;=>uj4h}3#)op)YTUC z4zyY=?2}bNqs&lV%r(komHD44LDk3~R$Ek2J+i2>Y;;j0YuZ0NAXHjwY%@GGu3tE( zj(LGG4Mnv@)%6wCqz|l~H=r48T0lLWR!0X8rq&u--cUVd`0# z`5Ug?xO}o2{f9M=I6-lJ#Wb}RY}-0-pb@F43zw7@i5wQjtweslk!bNaTvk~$nO2H{ z*A>@RxV+L_m&M8Q#+4V9)J#8}R@3b-N^5ItYO~4qIis3d*sdZEAA6cw2<|hkVlpjP z53Qkf>&ALoJ)TBZ4}|ju3~4AUE3GXpF~2^umYhwNo>7JT{NY@raicS5xTT{j>Z*$B zi_80lYAdSiY27!k57my{*{tQ)nPuz$`nP#4e`!ooRy2h-4X7qr3{ueiG+bY4Z8EvC zW>QgQ7Ng_`M$n4-*wV=rvm&U*EI)18fAb2e8p35YwRj|J`nEay z;$23$FPZ`R~=p$-s$5*>G6?HY$ zrN&}4)x)c*$S|~eKfRWtN(pg?iz{pDN=qtgL(|NofXmgR1$%df`QHOti1M~Tvt-LB zHEwA&KRK<~{HR}xA5~Jz*V6;=_igdW^CUmtKB+6Fy@d+0PemowHKg5sK#QHQFv*pY z&ze#Tygy{DH7V_^QM-lyE7oy+!d_zeu^}!{+V(5Rp>KYmwZ8odMB{$Yxar5asB>tY zgWKxeg1%Yvyn@D(TG|^7Pp_r_D{@1{?Cq>9y2d z2tN%En&j(BOQ#S%!|*q^#nd|5ybPONPHv0Srcu-q_h^=xR99M5TU^dNM@=%O)P5B; z#k6ZwUo@$*luceKe(QnjXizr7c`bw)$j_rVK*26NxwJk!t*Ekr0u#v=lj@V?2ZQT} zHWm%0fLc)xk8P@^=_vsFo6cBocFH)m)k3;Y{?JNNT%x=T;M5NhqQ`Lztg7nW6gVd4 z_YG4gZ|c$Ey6Hu3G2(e%zgn})OWkyOQEfHtv{5AT2-nxvxz$Z<`dM*X58X+%Q?mb( zEW>-f71d=m*##)@njtG(oBcTvP?FP7QPS4q$+;dAd$BvC>8BGZS`8RYL(!B`b>pk+ z8eHD@E-j(GNtXvJvo~3oKVTGZoEKGcE@pPlM>X5Dj{SpLzHJ%GU#d#$i%N>>i^5f< z#=rAvr@6Uhnx7WA##8!>YjKE{lFbJ8-(*3OmT_oN zDUK)Bi_mZhK6xCA{=fWA3aqH1(YIz_ z-;!KCs;suO(arud^C(Ao=2?#7O6$uhlc}z+$x)HA`iiR3>_wKass#gbDO=h0v3&q)zpR@QBa=c&{rNdYfO%w*MM9sTwm4N?+RM_ zU40d02OgKBkWp7(Qc*((UrOl^O!juk-C}j6RXpIC@h!E5WW=QIKa@au0i9T@ zsHA-9fB02x&7_9991fmUGx;Vvcue!a90GL} zlXFMl3Tn=2*~_h$X;k)y)=6!(j0cDxd6>V zb3Bxhj~Ln>diiNd?$(=LTvu6|V;bi+)aP(09@87DDaz$&Fk-FFNsHy0CR=)3wXB36 z=XjP|A@YoBYCvAO`kO(G48}q^qZ-+~rOBzG3!0KAKA`HhZfQ^6Ze(PE1=EWvn#g5y z5YO~NgtUKPts=WQrq|S#v`o#_>Ds(JUhp4DhnHy)e^h?oR&&$Qm~s|Y^~nqL%^N`$;1)#gJwrkgc7(Ap_Y zHgYsOVq30Xnz)#Yn4HSACNHaIC!jrp`Y^4A=5Sc@wP_Sovj3LiP+fJ7?1h)qDOaQ| zjqJa5YiSiK`y-;QEzS{-ODc1BE~=~~sM%>vu*?1^ciK*zygybnEmty>`=@Rj1!Xmu7|Yrn8P;wq^!24d06p;rRlU7Up1+z{uCAZHbn)O_TQ%e?ec*U(*2vJR^f*5 z)CO8i$l+luK`TKtHn$;AS(7W>lmgm*&QJOO+bW@fm1wHI$28C|_rucah8$KE?dr;D zRW0|=8^Yx@rOGh~GQ;0IZXnGEv{kpiE1!N(ySQy?_}`hZnC2^O)bnqf`EL~|qu$nr zo_}Wudfq3$&5Hi5#H5;Bv7cM&?;O2t1C`V?(5icr0jUr6A6H*XgUyJF#=-QW3vWBo z;7pr6w5yQM+X@~(rC`)Rug=t!m*yI{WPU({RF0@yQD(LzX%MTXfwxH!T?)s8oDakF zS`=>@@!pYP%PvVH2Tk3IT2xn;QanA!*uiVUX4uN1L>U<(*CQSta)r*~+8HfoK4kp> z2ioxeww6ghleN?TKdE{+Jc(XY%ds@p#v@AY$gWKWXI;pFXwBcc4)4T}=P1W%$emQu zZ(F9h6Y~l}HFXt@bi`tM^{6Vha@2^5Pz8G=?J^aFL#L5r_NOxe738L8hH2l43L~8V zuRs5vD!6HFD|d!p#tTGcxtdcR=4w#$+i7k7n4aePwV8X;N0!k zG=a}vCQZDHD(l;r88@{;QCS&x{2VK8^~IzGE1ta=?)KqHGs5L2;}7Q=LujH;K9hrk zrhJ?t&P9xK-ue7nWIQtLHye#)X z&J#MbjGX<~m4EY`N6$_dm%C$ZgeMe$ZPXp1|@AY ziKRW?oI#VH=Uz+Uj3D=dqkZb_8qITbbF3`OBCTf)PK3!^9%e%`p^#d^|rbz^%#Dhv&&Gg%N^J1=oDU4-8|K%pS3k3p~oeql@&P# zfw1g`=6p`SZX+01w*8n!5kBLUUG1{mt7Tl*`W!P5N?vpS5D#-@)jX>4@!0GNQG3@^ zSJ1SOc6s^q8LeXH?6Pid9qQ>g5B)HE877j{*Zf^BNFA=yEvhfiP9lM`4OgkJZ7i$J zp#dihoH)}UnLATzduqc^bIxq!r`Z*!D8`C~b7q@{H&^SK#ILR2Q^(3(?{FB8bCuru zF-4F*<|tZo7|0p~_#oSVAxP)Y{vT~`x}C_8tquE%dMOi)|6WO;GGA%nfK+z(9~NSe zC^4BqD*5Wa=h-_VGNuG|pFX|Zb`>O%5j*xgYHyeE=mB{Tk)j|wdlW$KoTY6SRO1!Uf>+`K1|n@^TLY zDCtk1KdBqKU*k?q8lctvpoS#M-vRB9R?ze3)-!tdhLIp&{v54Q_V9<~aIbIY1p`N> zR}SkS8V3SLcp>wDqgjV?YK(mk3+Hxx`>Vf#><3x&k%6~^zw@iV5(@wF!&XQ5>JLD0 zs#JXS2bE3u)n8PW(N}+g#6BdB{(JkHzb%%dF9X#@*1o!>>0$}L!>4pW`d}H)mtQ3t z1C#dOga%cnRHZzvlBzF3j~?M}SR-`uG1y4!C*-FuMN~yu);+0C@_&~5mE_USwPpy~ z%I=q~5em5P-smzbl`JLca#A=43R+S_vkSVDK@dy*m@6woLMBqW?ZFXPypshw`uppv zr1T19f4dEHqQ@g`mbJNsw%@`s@_sG4pds}g?y3n`r0@;bf z7S(d>dOm-i|MVikZga&65%p^K^77dkb`S@P_NA+3A%R6*N3sk6PtuJT@!Og|Pp7OM zsdiBa5+G|7H6*PNv(6tDx66-Pq}$FewO$lG`=g}L2i9YP7hVVrwUsL`skTuzP$+|>Ho=yOm);g`sW|1H$S8!)QH|Jg z!F_=O5=2q%NPz@bZAuMCps_8=?7j_FgoFM>ve43JFASG}AC1WwQn+IfpOPq34Og7r zjn^+@B~hGxyMcNXbW$wN^vi2q^GZ^0!YjLg(sDT*?&iB0u9P*EvP@44QT4C>1(ruB zOm1~MvPgsXzzV8pWzk*$r4gcHK47l@(?v4?YD9+w`)gr7y z4Y@;c`sPWFd)U~~OZ=~YOb0i+1-$F1aP%QqmeEtU)8{o>R0ay-rr z0(v(o#+FA!2jF~wH(|YaS(tiLg8&9$gSVFFBJ$uM*E-OBkDltgfNH4h1fn7*X>$oP z1Q+yWe0G#wob!CTVpmIEKPk=&ikGU8$#IwR$b*M1k_{nPo|)albpkPn7NEhc<8?-t zcSo+^8c^eH{&FV;xE?hG@5oi`H_A2& z?oq7YC{f6M($wN-Q2Q12DJ?BetM2a+IxZS0uU>2*0`*assTW&Q=pmp-Vr8(lAgDMc zC^pz5ET!;qk^PXyf_%q5l zJ!~IwJp2jj;2frRZbQfMFK7WVFq?b$#6b|e?-M8~%|Q{KRB<1Ir#N4uc`ZDbD5M_$ z8jia0&tshXXx*rHq#FzapvgF5P)94LAp|xBWHHciC0*B<$rg@SG24VBD6xn|@ z-TsgT+OXbR{OTB@XF9AtpR+YY>m1&O*60PiQ943g#H&8u_S#5YXtm})rxx`patqYy z6vevO;ys|&8?SDlCZqqvdOi4L6WR{accx*yDsEhR3O3kUyz}W6(21HUIB)b4|Dm(- z;(fYaF7`jwKrTo6L{TcgqLMvcpS96zWBNXBO2eOOeE!@j z%gx(#ML)Kw0WxN`*CW_hz^{9MJYN6)kFyK^d&C5{lbRbx0{kT^>KB0M{28(i5CmvG zUtgb}ML7(yvTTT4o*-vR8J;smaFUo89HW>RMK=12>*Z*Cztjc~t!G>luPcf;L^l_$ zSDeP{VV!i5;NUFoT*2B4yHdvsA1PCCicECoLcT`LCTc~Y5YAv;U{RmG(EouqL{rvl z&=M|lJd!RE3787%zJNTNFAzKW`dmc~k&LRj$Kp5?jm2@*Qlzun7-5jn8m$3Zy->(6 zX}}x3xMV{geio%_^b$a6$vR|+g zUUoTxhY6J$kSvoWnM--xHWG?m#g#kVFR#Jmgms}S&H$`amjY+9$4&3y94mtzpjZfH zy?n#)xfQ+7*xTX77Dq^b1p=_jEytltbAgPfv%v}!Cw;VnxKQvRh@Zk1fjnqUEALwj z=(3Qm*lo7`0e?gWkm{Dx&doa#$8bA7)*^KVVc;=p0cIn-94?GQTPUeD499ClHNTU% zDCQwt$`f<&jd3~f&ag4lkLX|b--GANlbmbfmfI@M$P`6K1G0hl^g3uBMCpUtc-2m- zyKh4Rb>^-6?@zON3r#|@YS)Q>4)ynF$-){5c3e29z(FPhv5jt$6m3d>shUULdY_A- zzDBKu;N%G9K9l#r6vCTu%NZ;xj$n$ouPe+M!mGEY*TeKn?=Qw56^GCeHJ&L-*WvuW zU!af5AB-I&!Z8dDNcL!aHwk#4UBYQ5{uIU{qke*pOcj=DiK?vrC0SXVZa$_HWXg}{1M;H&Bm?!^ z^7#67i6&C5Un)d;?hIlH2Hb$@Xg*1C9KH_yp^(V~#1=|UKA7pwC3vHK#~p#z@u%?EU1!GjAuV21ln%nC#|_&I6=x?_m( zM>N;Feuk!Ey_WhVs2fapxV;?@-ZI~pM+&C)1mx~iqA&Z)=>O99T(n;n;AbQ2t{ji5 z%>;B^ls()h)T-tfDYL@Yb9&X!mKgj6nG@`~TT&`MYqj3HkNw9Z*QyYjf!o8WIjh-9 zwE^=4oLUGg!QOotgQb`l&xVfv(A=n1^u7;)I_DA<1GrnUXmA@TZ)VHo2s~%T$G*7w z*OsnxD$6Y#bSmpz)jO5-`%}mjcagBRoX^>PUHPPmSEAcghhHz3Xj=vaI{sx@-VN69 zHM1KX60tw|TOUu{66dc7ny!WLp)8=(*Gw3450ql&1MeXnHmxoR`iQG3GKc#?6jR&$ z@d3nS$*=4}r5P-=T+5eE{Kris>m!+zu4c8OXu@wb(6)kPQsrOA!34G zaa|N^0k_~MhAuw>UD~HkglZ*#z!tQODX$;N97D>jrco zCnE3FGw^5Y!qrDM{-B>|EsWRZ5}Jm7c0YcB3hN8M3ZO-4KX0O$TWc;dQOV~)+p@}a zl!Y!Okp;Pw4TY$;&WZQc{-sWIsUNqOvJeDL2f=(anH_t}mGp1d&?an`(UXW z@66nhw!%CO)(2Pd7C$zN$Yfa-{_ z$2eFRels4vE;rRe$lM%!^04qn$(r)LSwCHHG@VR#lGcHx++X@&+0#X}C`ww_OGHZ7 zzx@N@eEHWu3jI&{n=6-LZk>Pl{%XoB6x1-GP)VO|1m8cer|4!gLcgZP_>(>;v-ENB z6rB6;;cj(-li;ft#3%ck*Yyb}(JAW*zR!}$!hFu*Y$UE16T zTF(bFHE2h}HW(nqi*XD0Cm!Swqp-1!s z8fzA8I6lEvrPN%gPTpR4KB#7)23dI0|9H~DiA-03#SMe7cFKXjr=v^YfI2=KJIqgGeV;Tf1~8DClMZvNf57t9X0LAxJ!Z+f~k(dH)- zB=fril43Yv@Fm!!KRdSeJIpJ=p}xb$BxRJxYM7d|D$f&Uh9W=>se^9eb^M0+MPV*r zg|&(djsGehU|5LGyO`(v)>SDdBXRu?5);1eRu8JuV-58m7>{Bc=dDRwt5BZTksr zr}Nmay(Q91bW0V2;R-SL394cPi=&=GB9S`Z09*mm1m!en;eqZQMStGHzxZEs74+Kp z?h!=0S1Y(qD<_WeiiAX1}3Wdv^8X8_H~6<@o=8`VJaGj5;XM zYt6gg;biS-OfYyud8*8#q5@_)t3`5M7z3YPpvr{z-4ta>$BcJksKE5CmIbKG`xuBx z+-4NlCnZNMI(vr{5$rAuRlVMRHp;Wpb3~wyk1kHhfB!cDs07-@iHip?&vy8BE~Ev} zNkhuHAIHqgo@j(Yl2j6*%>P{kBDUPcPVIsBAjQ5$wFsDW9c3K{_T8++b zE1qy4vpaq!eNnF*>r{H}g`&5Y%C%@G!LY*#p zK?Mrz8G|@$-+pet0s~nO`kNK}{C&hI2HceK#s>UWz121nCd6m3y72T5NF_vZB-vds zgklkselUWC_I^Q4r1HIFA;T-g#An?F<#lnaBKp}R_p9n4l@R(O!v?`BYZp`9r8s zxxBh-0)?AWeg6I1LVOE*`FDN?&>Q7+cIoVMIHR`|-*;KFr+^9?HPXj)1iq9Nl_8E5Y zMP!o^oOoBn1RA#NC*)xaax!3`8A#5hM=PN|U?6CHq(8ZYsos)tLH^NwoZ!7jn<-1l zJa}46f2l%<*bbcmErgm;n}w_~(6tT;BG(|jUO4q8G{*3J6zIrKFT;6s1rtrlZkEU` zY~HeLLvPjBdyX2&S*+n}mPKsMiZL!gD4qOr&2ing$K$MJRHLNc;7;8?{3LE~9}ETzWA=@STu{dr?`2+lVsE`^Pi-?()}GNo=nTfho_uPG@Vu7 zv7jH%!#p{L%>Q6MiNE6tr>M(1OpMP;T{e=$)i3c~EjI&x^QiT&jMQhhDmj1McK~kf zqIhA9JZ?>#qW*~c7Ul7yBL<7sZ4`&li?-U8bF7!&t}}%bCwCm8bo#WINsej_+;Bt{ z5LlI-PO$I)YLZ{gYjGGTToHpVo6VvjyKXHuyY;x;R9*U{*~GYP_CxbD?6YQ5ALTLz zB;^Twbia=grP0D=3IgUnBdjH9iZED8?`zKiADQqKc>z8#?YY}B_!ys}aJ2WZxFMsL zfQ`^$a^wQDI3NjZhsU32oPm%~2c}I8;K&PVDT|jGQC4*lQ6o}Lk#e+#k%|V`pLQp{ zL^%f$?lUK1lB%|`pKic7)E2bpSm${@7MuExrPEc`EW?)>CvM3gkdggVejvkPXV$Ouf!EGM3QsnKqAJy8B9_NRb5bH=I#>4_isd z`T~A{0QR(p;6@I50$>}pY8eR*zn4|lULbzBPcDA($p3CM|I9ZXO(y{|mNcAy57#*} zotXk&XAc%qv_^*VxMX9X8gvA%)*hAOI8sR~Bq#5z{Aw`~0)px~GNLZ9Hcz0zPy!&o z{}r8nkffgssFxTvdPz{*Fnt~fio*LD6!q{>4l8k{jNdAUOQ)=HvMDQgK@M~O&1-D6 zV86kaJEK%M3mi|Uae&|L7_?olZ&UHvXIrJZX6~p#c23Pv16M|HkcWQus0y-y3}0pr_nCj{cT!+RXs zcqk$!96C+byM^gijLsK!fJ;`(!Uoh-3I*KPgY^F{LIb*uMtzQ0lilB$Bv$#s>sWU{ zZoN~o?uaotP~wJCypDacCvs`6pIWx(p+*aOeFAP#YkSmAPDK2`Xqh7wCV3L!L^PwM^6U6;jj{ZLw-o|$O=}JJ!Tgp@IxC0(aZ|xo2`{>|cTH}BV z;iP!Vv>tO^bU2L zJ1%*Q>Ix|qkU3kk{zirbP~2DBc|n&OW`t|w=LBiX0-3?P;kN(E;YG_ix)vev`ERTd z^M!NkpO99aeRM_4JXKz_AFdy7`@M&!`)2>H{b#G&@3txV3B{WPZnOjOD@ zr6;goLQn}d?<5Ye79wa>iW10lr^mX7PWz#MeRtW>v&0ZP5uXb?V(X~6%!wNUVs`36 zD0T&x%zQeXrW~_zl%DyIZu_y-f9$r9h>=;@?C=pkyneXv;fa0coXs}lF;FM>j6yGDIi$W7d4KNWZ4^biEO#~IIPZE|uAv@BwP#eq&HBRU@adjxZlK5IEN zaFAY2SK~}j=-hCocWuCmeoYyM;|F5diS1!6L0s}ue;=b6X1;C4(We_^a$<4>KK08$ zwEzY^`M|%Irt3lU!+;gq8FB07^A0~*tnhFK>#O5}+%U5?!Rz7_<*m~H7EE|-+6v`X zvOw1c-tkd!a7?woxahyzoa6j{>?$Z%!tJ@iU0DusDjb5Y2vkmDp0>7O4#=XcxaDTb zk|dU#aBj3XOQ1h0?A^8JZf_9EV2ed`;i!?94$gzw zU`@5z#{&=tN@|$4oPghUyI@`DaQU)8G*aD;2VX?_4mA%>xBZY7rpTs)QEC<3q)e^4 zN6W~KRUtKAA-YBMc$iJvfL1^VCkaBG*EHT&WTN;5+sqmlx;kictt4ovK$)%5-NmaA z@9bPvB57R=4?B^$z>v(9SOqt0cqb)fo)JL}K``9T>cchejM-Zu&qz_&yW&awgrcc8 zT7_IIAZ?7)Vf#+o%JUr=w9hEmOYX#HD@YDT!(IlFvaH38TZ~XmX7XgIsg#3Q@<`uZ zHBH437|zth1%JetObJ;{BHoX9nCk#NF@4cllWjd02!V+X$OsuP`j{W5lvtE4ChHEj zkIOgN(-2gR?vu&7R^DDWyAOBN{w|*&d3hJ2@uEf&yaBQsK7b4=D0JpyRAiv@W_*FJ zxhvMPrLr}5SQbMalQ&`TfDI(Jee{LWgT<(GEO$bn%7p36>Aj2}wC$I2IQrWkK2V5R zaNY?2gtWbtH0nu!Qk*EWySn|}>-`Jdjz_D+giP}Tr%HZzal;7iAJDjzIuj!g@%IcA zRi{HETKq2ifa<^1ysi9GN|$z~Tnd%aoT_)<6t%zgKmEs6@A0nPq+%4X-uX^~&YoVY{9Ho*SigsHPLx~qLs(0%L zuHzem%Lg_Cmeelm6+lW>@+Y*WpfIQS z-h?`P+u|wWbJ~mHF+1P7HCB+`?*>EesD$e>F=?1*rY}omSn?SUZPVKW9m(jv9Hfd1 zp)zd<1_~EqKD6LFIB#hDpq-wSqbUFIHHxxoQ4OJNr|E)yzDtRvuL+pBQQW3ckQ)~o zckNkI9yD#^FC*raq1%SgI2>Z31kYv?AAr+7bG}qj=QO#=icw*9L<{ib8AWW~{tGzN zrO%g)PG?@-S2r5tPN}Tw@w#`_{eI|vI34f6S*@Wr7>)WeIL6yG1_wxUIcf)fE(Ua( z1j=o?Jkn@~W;6a6tmXF_@2EJdLs6&j`WWhCPf@kz7Hh$n%fTb33K}EYKz;G0K$OBI zGamyap|m^B1Ig}6XHpMFKlR7)l^BBm2AlHc;ht~B6EUSa#bSZsV)}@``O@gy>YV9Z z->GW`bFUs-YM|Dwh-@G3OfqvN?4~@DroY;bwL~KWw5Mg8Dl}qej@X_Xfn-1d zyfhuiJmmz#{4W&LBf<^+e2k7a1i^RL+(?oSixS&_MzhsaL~#XJ^B2i&Y&!QmHugk& zqRwh@t;;dA78HZ|IC(h>V70K(KjGH^gR_lr&7I8cdHeE)7?&*OUqxX^?6&jRzLNl* zzXMSXt*=l@PpMx#ZP3#R?rNklCF_+&HVR(eJ>5RGd#zrt{cw*v+q*xSz*$?=T`V>; zBRWa5S$%Vicgn5+`r*f@=7ko`(e0M6Ob?K89I6xTwte3!xT+5!9Lf~bBD;pt!T)mh zGJwNw(qE@<*;fKvilr)@4gC;FvPfZQ@wNlyU+>fZrf9I{0fT15j@%UG z1a=X}kXRQ3fE|m!HO%009Lr*8Rzq2|QCmMPyYTmbg8u0<-zi>4>v)1OTev@W zkW(zKpNg8RM5p~1ywVFc(zhr?8Pe&GjHG-?g$8Md#dw)lI!O!dU?J_6Q~EW+(U9fi zT^C&Twsmc^C?6(FSsaY6rsyp6DUj1rhU&f6_E3LybVVi%_l~<Ybo??Y2~BPw5Nudzgi7fcMO74fPcn z6g~!O@UqZL4HnB_zQGuq1uza9WkJ;RWw+dI_$Rh!*WrPQ0h9Vim6l^XQg0NFhL|$u zW9vf!o}L<%L2oMFj)X>XaI!2HJk8A$&GFAdofyceHK&f*PsCtt&_gii(0xvZi|x#4 znbA>=^8}8!&2}_hno+@A&}aMry&AoZU(zRdP|&;WGof%Dino z*2P{Oe$i${pxNL(iOKeRW)|~u$dqLE#g^KFfZXf60{+3~&zl9JB=GYFFA$ogM+UK+ zK2n|*h%Ll0K^`h;BUnv#1Scn>quLcLR!xI!s&g^Dd(upn8IWeoQUYdC`9>2?y$aq3 z1T{Uv_R}b6YW1>CJ$f$r09HXC$05mCEyPe=)w2W&BqKilc{LW0Y)hiOYFz?Plw?n^ED&o}pm9qsN~XfQfF>0Px77 zjoIwWQX8&SA^+_mlu(}^ie z1wH49+rXz1rGVkM0z(eNt!P*8S!NHa{D?~kMw!4WV4r_&vZ2o^{5S<1We_r}NMhm- zT^UPVn8sA{O|RLmDa3LN5W?JJbYaMYQ~s}4rPT3 z1m9*A4ACtv+DLyuGVa_f&osWyXpvGSljk;ZX#oK~fSEC0&B+32tJ}#YuZcF4X<8hS zEJuqdfIJ*DQ?N^&VP&D+NPWttgII#><&ik<9u_h~2QBZmQxObTqrq24kUCM5@f0cOd0A>XlEyL?gT-<)8;?`H z4>v7#8K!^Y552p~Kd&Vcn^6?h>(Q5aec+NZu(9zLBFd~3F@p1vs)im-|E$wB4}{_kA)Kj4)8xB<2!_h7KE;Txxf6xq9cv(R=)aVNU}YGdXZ79E&pTW zpx2^aecNNq#M`>_=2^C;f&&~Y9|T9W4n1(fOl&Jiyjshef?;&IdZhwoP~v`_Z*jAR zzSIO}l8-Dc@&%EY{oBL_p$F!Y!{JDPCrXqi)U^v@qjw98BACUSqm?i@%H_9;cf zH8!0I)Tm!t{m5l{Ib~_OUn`Aw=;~(sYiNBD&mtRwFGU57>UwkyrcXf~-Y)fp2fZSq z0Zy2>W6W-+JU0B>EZ%;fzPw_KEg8QW@KWsSWi3RokEG{tJS&DI7^h-phIOn8k}yEw z-NpuEu`noazlphTE3)C`Zgq&dU(qclkCIM;k^@K{dcrfy;~U7f%XjolqI*Pd*M>(} zNhysTe3=Bj6B#YW^DXPeq^{mFI_gf3$wB>JTYCip55pW(YONrCF-I^s16&pyG6U^K z4A_iUrnCX!=>ooGI=yjmeHaRL6=5bc{Jr_@`<0|Ch|k8UiS9(z3UUksDk5gmNdLNe-96;rS)Cxla zL9O*R2aui=*8$^ zQnhHIAkC;R?#eL*g5{&$GpijYyx2K7I_XA+G3p>KfCI3Yj%-i{KNaEWJK@B0+4yGF zWGydWe^$W|?`_G&*<`_e&rG1hF4z)=cVda9VI2f2$!Kla>{@!w=MgO+3C_+ z?i?s-QSiKn)P65`9w564a_1&>zR^HX$)!^41fL@8#pr1k!BoRlw+!Y+Q5}uMiLD^J zX)+<}fkwswLZhUh4JaXwFyv-KZM$l;V1OJ<{m=qEqC%I00bo8%~m=D97?9P@D#O z)?i-{;7C-;P3MMTrO7d#13=4j;${&DhE_fTz5V=Np(g*eTgue)FoIj*IItTYv`+W# z0FJ{QDaq6+f|@LkOq&3A`3@>IMPsE+S&b|FnWxKmW<;V<>{N0hd#(HCT`%v9jcXq^ z@Kl-FhYT-wyIrv|J$ZRiX$-La7oc0?1`I_*McJ!i|7AD8q`r)WrCFkRnsWP)d>tL{ zr+&eTMPvIiH0W_@0yL~siUTuqY>@7m%vqh>TJ4w<5g zi2_gf8Yd(({cV`DhYLKH_X8@8BkY6FnFJ+tlGe}Z({kM*>6a&_bL4oWbh}}u<1MQJ zq{W?n2zURSUVKeo3e*$S_HVbJ!AA*B9T`s!O2ffqIsQ&H?Fjb@n5*QlRAoE-KyI%txKl;`}Tv?3E+jah-o z41i-+L!q&NF$GjoAck886vmSL8(d`)70bTLWMI5i310zJ&J2X#o;?FFcn$Lxa_tc= zOer3{mSgltWb?IFN9JPpVNeq1zrUM|W&f4sF$_~kw=wj82x*bDn4?WC{{USxg@$yU z329nCJbjSuo4dy+tQDLh5U19DWhOrJXor9@ZYX|%G2d@kLwH!INDd!>=edhaeu<{S`d69p zb)P>hJc%6ufY_|+Scd62#!98l3buU^&eWO(Z*vLH{f&?(l_Z}Lf+-=QN5uBt5;;#A z>5(ICS;XA!!)2~A)4y0?(C^^dFi>yaQLtKSm#vsBXnYd-wM(-gc7}X6(|wA$IvAV$ zgS64Tgn?$(w>49Z!m2S(h{nLaACIoauY-3)hK!?~EURqPeH%f}+n>b~<5Z`CgksGA z&PE;wU`_mpT!o3=bz$(`tNz;6ny;l=a;-yO)1l-%&E<4sWl6>K&Xl4tvmE z7bmY;a%ZA!#gT-?bm9bRe9|qPRUM8dt6#uS#Vv=RuipA7AIv@mpPPP~ zh*dPGoN0kk6D8IAqp^W!gcs&xJ?Pvt00{hcIo}H%k|+XW8MeOyU2EgTE^|>;@*_vA zW0pOvz1B4IVBicw>@}lztdW{)*k)de_~1*HF-x!FwkPNEH!pcr{P! zn2la-pbA}^awlnM=*Mc*K^WY%S>)M#X$D6MDJngOXVBPINGcj=mmVmxaCiAO{)Kox ze-XV_;#xx(@zXJ0T{N8HO70UgUr>65p=i8fOhA0BZ9Z=C?Hz*9j7Ss+tNpb@!Vz;e zXwRk$NfPpUFq)p1zmUjq4R%KVhI$iHKv>s3*f_jlHfu9RH!s;=`kI-+rkx=-;B7x) z{4)Syx9X1^Fj5Rv-lw4jNoA>^kt{cSU4GC_U8`LcN0}os=g#)nS`25q(fAbB5;A&J z)e10XGMVi*9QD0NkFF~35^__NrxL|Rd_+gt>TZSGb5Ug2V3LptZ8i@*hhZ8zfOeqC zk2y%YXAJ~-ev3PWo|=;%stJbNP@&qfO2w;BxRxWVtf>(MslPtUc*I5klc38yJpH8tNk( z_IbHMqKfbp^Oh2hE-LyRgzsVVIy37_O$ZE(1(Ky$AK%6(@SY9>qr+Dda!s&RHSPWL z{!ts(g|gN(D5h)R^3U=Fr+hL65%zYEc&~a2EKh$a%;6_YNLxXDK`${G6mrd~0HIRp z;i6_JV7@n)V!`{p*=+YNucT39Rn%0325+OK;px4|DY7mlO``y4S20%nMU2O(ClXn7 z?WxeJIWO*_fH>3yrbwdyE-BGRJK!X}cT-GRIzWO8tux)jl(3d|g=RWba)hFQQO25W zrc=|srqU>u)5-;5{-Qx;CeNv~;VtxJ$F|?cNIA)du8c?Ndy}3Qb8(ii%1fNW%*Yba z;awRcdaL0EKswaNTaq{Xlw`IUL&^&p$_uQpUVqT7WJ4)$Q0y{S@;)$e-TZ}E{RDR^ zjbei9B*WeH|Jn@@Bs%zWj-{?k_;lP9#a-G*KJ+?9Y0BvPv{5E{iGHe^?2x&difAZi z+0?XY9S_viY)IF& zxJj80+*_j&CZ)zIRHz!*1Tc6bk+6#f;VIO;b}i7cz{$G@u39)sra6L_y8xzQVw~^v z!35L*^iWH(&s4UE?N$EtM0ru7#mn`X6e3=44GoKDduwF0v(soF6R!fl8og4orCm>2 zZEm65t{GOB`h*%K(_#E9SkAIL?Jq=z21hJ5AexwQ{fL?$Z3;j$9n$bchQKTbLUP(r z>x_IP^bOB*u=@>rlee-R*`l1Vj45*fKeU98{cv;pbYS6QyJz@B6O_ETX6ySKHlR?6 z6^kR)V+D~$yF_|A9ghoVO}djGu68>?Gb`$lNwuj|Wbb17aV84!@nHFa>dM+qDgX>c zo4ERp1rG6173+EV(sd)ndcSuF+LKuK&bmqp%?9DIqBM3w>kw!eS!u1!R(>D^fg-QW~2@KJ7e zYu-+VJbbisf+|%FOhYW~A5A>>cM9RI?Trq+qBc*_ZNelf2CI{;vL1#;!5VL%eT|S8 zqhg%*BsI1!Mi%^%-ZSXelBz0f#6_@JWNd6a8*Eb@8w^@HXSrwzba=e)nuA}>+^_Cq z2W&uA+oHhA%33vmYpd_ew4r^r1YB2^AD^`(UawLg>zP6Q}}lXtTwz6bGtg`Cq+N-2Qfn z+|m6z;L7Qw7D{%2ShMo+@7*}T*s@A^hc9`$0jWMCxFDG=`938gBy)B*Mupbc+ZoQM zLe&-x;dBv#7uLT%N7kDH%<5980^GAVa}Ek;x>9dE;30xmv(lJ zD7sxcb1D_*;N0)rXS%BHBP?js^;sNQ5Es zH|08_ADS`jVqOANGC?n*V3SZ@i3X#{1QH?zTNK%}w($m`6-G9Lb5)ht@%F5mHv2_l z$REMn58U;t$)$TSA{i(7waUbZiiQZSJ2Yi_WQR;@t)D*`-r(beaSxHRr^AgSVIn$BX%z?^bLut zXds0jR{%+OfdjLFClXAv-HdGimkoR!edLHi6RBq)?r3aGwWoKQV>EBjmy8P{!rD?J zIg~cmMT=*p34~&BAV;d69$Gex@b!E?we6AoN5k+xorUUQy+%3reM`pIc;KQ{07Dl^ zPd33n%K((Zuvd&+fg_dA82b_(oLGj?HvW)H+nk~YO3Z0=MM+^pRNKR+9hjlAq-L9K zGk(XYyB0P9y?huHr%b{_7hh<9THr60aGBKKfWsIj785qpEc(#>5h_8($2*l5(V6oa zbG#KVsr5@yacj4qlOWV7)fLrTC-_-W=;cuvrRw4U9gwtH-H;(gt>kqjt+sP^036MD z^KQO4db^vB?py_Yh6XJez!NW71Hpn;Xj`T~U7+#aR2z%PF8v#ILHEt`6sypx1Pe7N zlsSM#P=Fm#b;XkqlQ zYvT-`#fj^sYGaoV0FBHs1A{_QNF%54LWKo?xdzwI94>FI=4!_uo% zln>D1L>{VY_rW>^&lf8fa$>H0fN)GKOy0<}oo=s}i~fZ{>)!3<4+a2(CBXo_g6Z!Q%~JJKCa8Q*V-OxJI{NR7r6`2K3fnbMgu9D^ zC!YCQMM`rtY0(<}nsgS4_fRFcf$+)Kx$J_~QT>=swwH_1^`Czl?j}qW`W)0c;DfSM ziEcxItMSQMIHJ7+OKOsxV_y5~ayJ{@!J~bH4B_2+jD|C;v{#1e-|F*b%*0Q*R;vO@ z2dTTkN|JnSoaE$TfseFl%^r|WhOhG_(jp?<=02&l0)tSJk)X5>Uh5KVjv(6_h$OClOD=tI1SRw_g1jf;I-WU#TBCibbWzRI$*b& z1RibAp5mt2dAPkr1+STq5kKa&w*A(11p)yXN@AIiutD#l)HAE;gxW8sb*>d3@}5$SqpC+GaHVog`gDjPAJA=)x2T$(yOH8l z6FQqSYDs)o9kaG%9eTPfS|J+XAql(`tV?=|3Z*a&(}N z4y6h+_(z)`?-VrU@|7 zf=;|tYRVriPtS372T3p>BHP+2k7e%M=07veWKCwJ*_c23GmiwoEUOsQC{ zI4vAr)-SlL$rgE&K2l0?)Sj!6-0h!|h8g^BqSO>(#bW%z)NZ6<$jl#`q89wnvZ62# zvTDibZw{sp{y9K0;0_BU`{F6#n9#`jFm{$mVGtJ%^3XKvKUk*fSWp*Xuof!JMe*5~ z4AVTbvr}`d1iSd=W+N}x534PBIC>Z`YJKW_rjVNj{maL%wYyZmap8q)!` z=aG$N+o2Y4iaTB``>lsR?pxg^L^eg{o@Kmf+rGyt_qe&r3zvFdoH3lx-n0>mdsE#L z%87apb4xm^HwTBcmQ~Q+kGcL8z+^3w{9gC91FG^W@+^B$n}*o_0E4E zY%J!0T37@n=tF{lGk34)o9U+_l{v;ctGc~+MW7`hKcbyzz|((5#fKDkIog#_miC|m z2L?-KgPu?cttkol(%7g{)xADEvYM|TA$Z$vAi#l?8(2N%WZUQjdp9X|5>3S^QTTe( z&O48y;=^ae)uv;Fw}alwneAk#9wWODOeLLTPaTnug~tSRkrGR%RO zw77oz{)QTPbh#PUVP$!OdfI6gSfXRriKAFBhfxmuY{VjZtF<>JbbWjM{jq!3evrgH zpMz7t%~j4+RIx&{fTdYFe3P?CwL|3o_ykaZMO?8mM61XHE+~yIW$!=n@&4_n4;h z$l;u_OUKJaB~)D>TmbpJ7|h-I>U>=Q%oyQ}1+owx^s09e16#S<`-)i*xwN5@kw<1B zAR1sbLH@Njo=y1C6=Gg;_yj;EhJ|a?E8M3>Y(N#Y3|PgEP2WPFiG$dS)l7EFUN66O z4p|pk9ya36S!Enew!rSkBOB9V>KUtSf+Eg(^{Y=f!);scu8kEPg4b7X4ah1d;@#C`CxL~?$Z zMz9O^$jCDMHsH<6muiMNPDObQXT=t?0O_-6&7Xgo z4%`vcOtvPpO158!1e}z+ZkPR6xXn?ZsR?)%P+m-^Ks_lFscaL0fa%*L#JE476?niT zQ&yW21c8R~OlmNNFb8{M0HE5i%jfrYej}4%OxJlI+BH26p(b?1JoJ|W zz{1gg`>RbXvzp|4UK^%o`;1@TvZ^oU5w`TNDp^3xqaR-RW)mGLQSPqVP!lcgiOy}xi(&)W9u8%$Fr~#Y^BuWpPQxOfD1v%@bclg0 zg(S@+8rbO_+qv~K`kLhCW3Yme&W>cN$9?muA6P=}B`Y1;xw*^1;ABpL5&wL;?gkW>SyDpP|1a%?~8KwJYy{@E& zIIXK@mV^*aXlACtBVtm5#uvj?G}8 zr4@QFGtG}o#F71T-*( zIf0s|d0`W*^$>K+O7`RQ*T+KX?Cb;=(`=?cc84fD-QiUA6lTV}W2jyW|Nj~J3WGv5 zm?=4Ox4^DaSErEhJXr2&hi882cmTeNDWr$1rmxWW4D98yWDf+67nT;D%AhUx+j9-? zP_bTEf*pzca1Q1->ygxJfW(tH&4DvY?nSb)%NS+4mKihdG|Pwu7Me%`M8I6l`QR6L zSPrW84y=pS6m0kk7W(XZaho&ezbdI6Est`;1HeyPy+*z@cI7=l4|v%~3>?*q*r7?IeDM_mc;fwF2)94q zbwUS0OYN45tM2eW}h&;5&dnUjTS){J38MJcjjrTvcn z!xWPj6pDw3^PLwJu=a9 z+cA}1b~|y<$A={oE+*)ho}fmF!h>VU4Y-`ZI|8Ew6%0}fjk&5YY_z!@K5(T6&*~S8 zh`#b>!7WtH#N0>QG#ABgQszw!)($b2jB`U-2g0Q}z!>(7)iDl^9$X-ikmp9Ma#C4e zWVADBf;^+ztSaUDxN)sM%-r><-)ddoXPjQZ%sV8!WQbz9Gc;7#{FOq{|v-2r1Df^u_mnMEkeze2aCRPzz5F zhbqBvKW}9Zi>QKlQqWgF&! zG6KxZflAy))O@-zE~R`h!-i%*kk+I*EE%*hiRhT?37-TK1@)0Us4ckzige7^K+%CG zSL5O0lXhCBmhcZ}7q+QDQjyr?(X6)K*HDLf% za}3D=UFK;Ggsli7p{`*v&ERwgM*CbB>;^-S_MYuP9L#YD2X+vau@-J_6$iNr^$-;&QPU?m6$A(9{~c zC(AqnxfoAxD%@psuEmAZFHYP?BeClARsJgArg4R^$go(bo9WB_e5b_n7+Sczp@+^` z(&)auVB^lzOH<_u)OGx^h@mlia9#=96G&E9M05en?K-R)jBtmLGl?YoxFpu0t)42q zEKHVqL+W(i=ysWu9vF~ja=YPeNbf}7OD|+@w&`N+bm?VpT$Q6aa;xRW_|Vj7D#FbitI(6`C)A-78q~gOSl# zZ!uagnM(d*lbEA-7H3f!{&IbODe)cjs?Fc7+G7kleIaN}2uAqKijfyKjLiez5zVV+ z%a+Rq2RBo6QmwThzm0wpa)9pT?hX{2pg|vP0AND2(B~@)dm4Jur^E6R8|?2B}0Rh zewf@z`>(H^I-$4%c~I;ghAauB>-EMjtUZy|4!)!{ITc^&t>w@}Dqte`;TR}C&T=rN zDRu42Q3H78+!j)T^I*C+#fb0KZKH#Ub&aJ^Hntij`~Wc#rF@0}S@c<)lA{5~7Ojsw z&L>GtznwIEO5t8PK@nUSzqO{H@Ivf;CrfT}T4|{_C`=u_3f@s%OMUzRTG_Up3hPL{ zHWO?I7z=JpMqiZ!_nJ=NKwf7Y*Dh2EeaMZAjV{M(#8R~dEx+F=(Po(-_uryb<5^r$ z%HTFcJcXC#6>VqBwapG)$=LT+tAouVRQgT)Uuq0W2np>Ty!`g)6ou0Qkilvc1BNuA zj`AjD850|S$H=R+jb~{iws8gL7d&yQPl24AJ{6Kn7~Q?ocN~kEg`Yt@?GN@-HdOwAKwEpksPK zy<&1`@P;xbA-U3qSz$?_5nqrj5Wk&)&km#yRbZ7mA$)Cvr1=)pBSQ|4$ zWA`rTA$M)?Y?enRUmu$A6t`j=HR9hq!CZsj(=6B3;3^@?a0dS``CGt{SbC`S!zYKY z@bKm#>2M7maT%&nx8CF_IWV&}m1Y9;UWhH|(hH2OA!6G~`i>O{#T&IpHIPJb)VZJ(rdGul%tnA^* zdz2JiKj6XSDW~TJSxgU4$e7nOrW{SW3qfpgMnRA)n=n!cYMeLTqLDf9=G@zX1|i$G zqY+f^*sL&9jF_*WV$1VRapP)Ll>3WIkcGJ0xi%Y9V| zMQ5(_v#$;I`yV?v&(cyFWaUwDm)^A$bl7U{YOAOp!=hBB>9V!+4@04=xC}q+P4^P& zX^N$2PsMDTr6yWs1ahNP`>d_aVGa18Cwk@msq;w?GUlZkK!z1)3nBzsa#?o9XCwPV z*J5uq8>>&ts`2`7HymIfAnfkpEz*ebqmXHhn)u>MIBvDr!QI*mtdav{cmb z3NbQWzoJraJbG9&gd+EU;jlG_0*%}0^BUSIv!vP*WEF3pcR-#8!U$OmoO&gYlRsIi zs1bAyqW~=*%FH8GVh$@nYLdV51GA&;A<-3C$%aZp9#KNmq!yfM`WSTLg8~?B6xg*y z03gFRy~c{tqe0tk6N2!oJxmyvf_G7T)FdaS@ns~Y#h3bVA-Vh4>T+mfx2+$bLA9u? zxq;@TnnIn$eM2;wASLu`8Ct{e2qv7OPYs1$aAm0QfP!nfwr7sw@EH>Y*gs+X8%!Io zeo|+y#zgE4R$V;9QM`~K9lhCTsclws+p*I^_W>JMgK5?v5k|A3V@_5`>JiBKoX<{? zmokIPr)K-%>gk3hBl~aFi>JqFj%fS?H-YvD#e|Im3(?gDheKV5F$a2_%=!6iS`0~n zs<2&KTeS~Vb9Ru$A?tfEWNYogE|`Fh_BJz4KdG=qbwB0N()cw3Ka1S(3i|jWn&~{d^E_j+bULRB+q5u_xF0d_=ms+0k$Oc%Kf26xA zPMNgG&Zmz{9UN`alQK}SS7Vwg02KSL(C7qgeCbh73RE%%R8LXQ!;`53WSaAyrl&K# zV;-+>ZhM*0ca7r?OA3F-|Ba5eTwf0sD0=i#4^u;-exl!ZI5UEPV*X?nP`H@k2i#)0 z)7xjH<|1d)oXQn5jh3n*hS$S2GOckU+r`AcZVZf==@^Akx`2}B41W#SU>Azw-{UHW z`X47Ll+zsbvmT4yP+KIxv-ScyR(?KX`l_~_)E)rTB^09~a;OX1nhA5f3>|fi{%d3B0>oEa0lC z%bav?bpmJ)GlB1fWrzKDcv;Z8dQ6pV&*NfQ=O1ye#b6~`fOyL1k^z^=2ox2{mex`# zumYE?meG-nz=aj7V}fN|+MZK@F^nL!O*u|-6{jZA3`oPF!+mO2nH}qm*EOID z7Hq*!NKIbw47Fjc`|Hb&yufDCm9-^Z1xfk;prmUs`bk9pmA_ca-KdGqWyGr$ii6R8 zbZXKCz?SR5+AyssdQ}I#$IEZuT20ArxU!>PBfeRaZza--h8n@1x#%QbV8ayepyN8X2TTSFld1?i0aINPWi#01Dbs|6H=)yoO~tuM~}nGad{7+n z9BdeMql*x&aUA)oP-ZY5i8|zYtB_@vsy5L|g;ijkA*U=be#`{VOw#XN_bDWiAb^|Y zYlE`T zn+$zA`Q8j@uoj88I2ma^GRpZdj~c1Dgo639WObI?uqvREH-Wy@GUp{=Hed`09!YnX z11tvyJ>Z#t$l^;Cipq%t`xKPA?F;C~i}ggv<+p&ZT7aXz7Yzka%b&2B!dcvxR}bCC zhfYhTo%tw8ZDIzG7)N;Ia7H6#kZ7cd3YcXTO0wxraNgvaTv*SN8Jm0k(CPMnzr3Yu zeIGEKQi=fDbP44TLzJeO*79BpDJG3yx)xHo#hoBx4iC~w!v+Qk;;QS;aWnxys4Yb~ zb|}w1*vLDkVpT0&5)$HA!`B@`6v<^?km*b)GFrb4hJWoah&?k}DtBy)V4ULVP1E*` z6~8g(iBL(pfzwOWp`$YsYUbYc+vqG+nFJbV=bumx1g`?7ktQd!=z7Eae`F9n{!?|& z5aw0u56~S=U$HZTXUb!Z<2WXK_jK#Rh_!rC^3P>gmN&5|@$t4-btPoTyeh=WoWPr= z2zH~))2vqg4t^E*pOG5Dg{5qtFl9zAt6U?YH5qBb*}jXVjf z1PEq)I&h@xr3M~9uN?!gb8y-Quc1s;2FNj z^C8D7pu$-Wlz-Av7ips}6;XK3XR)r&P$=aQDR!bPC502tb=bc4#&iPm#@H=X++Si} zqHQ&D6(_(S1&b^YlcUp>q&Ih>D`kKF+nfW!wDEc;m_MkU8oHP9z>zgH;woZAs4_kmKqx5ez7z(91I=mjEOWSzY6TvP(1b+9O2R z=^WQ8x1SK!*>|d8Mg7!7NO%CBfa&luU5uh{ESm$>X%a1=kU;hVX%p?21>2RKJuFNP z1#LZa+{)@*VeWAgLB3|Q%Uv1jq5zk6g+ruRd<;G}tUu1(yM_7Ybv^>UMd(|EeKdxz^>dBcugEIFk@wSM?lmJP92(++Ewl3(Gn4r`A32Z|e%X66w;VS+ z7vG8|S6rgf|IiM!M0F27u)^qz0^dN_5DUv}BxG#}2DwE6Ho-giiv>bHh8^%}JGilz zANOprod65EOT`W~O$+^)awO+ zILf6wmx{~)VZ?EXyHx!$$#BkWOJzS<*XeTg%h`wR)kCUuzOfV;27ki*rF= z=|H5Fewqs8P_tw=j+w1PLu)!Dg$+#+)CqZX^%XFLZT6jlm>VAEg6z10&i6X6M|Jy% zu}Ksoy2-*Dfr(VNDSSjWdDtgMZNQn}L2N1q)Qy26nI*BWdJ&lU+TOiiSC zJB2BSe?rbHjY-(8Ioz*obp{dMCEDBh4o-c{raDQ=P*9LEuPaD#z?uvfl0P8A1x3mj zoU)iPUxW2=Y(T$zc>%qu+c08W#3w*50oA$R?s%^#*ey&T(a1JP$&$-i?$hW{l}kf3 z2+)W?&n@nVr;_Q|x4gilen{q9f8nX9@-0#^5&8CBZyNF7_9O{ZN;Lu>Nv zXZ%*rRV_Tju}TT&Q$@<4gzew#(-k%cqwL}WS=D08V7D38=MYoM`jV4piy2%`bpLoZ zh~PydJKcw?R{!^hUc^GYh>4w3nx@$1Cdr~X@u#Vt+1FGiCQDoxnuwCmKu9&ETGkGl_oXpUPD+c@r^18iW|#tYBc~cH~gK>N#dwO5~ol`-f!P zuoN&O<(0|sl@KTq=xi24N>SDwgebL6kB?>vfsmjAUT)yTg6EMf9NS4NYoG86w4;47 zQ&=As!oVjKZwG*YbK&0e581P8XA~OF(CPAzI-nAXY|`F7c*67p+9qHrPXR<`6q#(o z$w)^LI*UEu-t$5uL6DpompVdEmR+ooE4ACa#u~fzsku|w-FYX#!M>1NU#dJ|4a=hP zhX5;5ym5M;<#%W!=;KT`^B=^Uzq5P#v9}b!>3Lk7HCeF z&Ow6Cp`GdCgScFP;ZPh!bA?t2?d{sMwF~Y5O(;~230ZU;XG5*^o`JbPe`Xq48KB)X z?|R=JZltO>!)YDz(%(eYSF^+YJ)$=}bdm!UJbaZO#*lFhu6p0E?($Gpzc>9U|uRmWk#U$5pR3Q+wbMY?Atb_~cj8>`Z{gSBQ&K ziS&D9Q3d(|r&tA0Ym_?K<`wGv0g47=A?=zH#XkD=_FMPOzP9cRX!OMJ#>JZX)l9Ee zUTFgf!NW&gpn#@6(;p}0%xD@qths*6>k+9Q!W@Vg49`M`=mFI68oov7gK_g3d-F=q zwNmD`ecviuzfs%oJHf7*NBb@lnhJ+*WL0cej_JKj%Ch(_o!}bK=tXGSE(nS}P0a!}f)`+!((1kHB3F%vXbeDXC z4_&&r#6YwGNrwa1i@Q6-K?r;>9pZireDEHpLEyle=Wry&l4I(R_ha zY_8@Ui35=KI|r2Jl3i@2Get9+clZ8i-->A~vY&4AvNGHwymUo7B-_8Csn%knLQ=f3 zCi&OrS=HR^KOay%DR&Wkf7Y`N3YZ{Bww8G)5L6o7575F?sax#vM`=1^q{xLdvK{Pw z<+9OW(TV!QxjDbs&^S|&m;jx;Bh4p@qri0@0kxE&XAmD4<~RdK9zpsbaLnZN=*hxl zCi3RK{ei|5b)|2PMXCRX)fr)2-!B~+tOXqdM(KuiYn}VeUH|ssvWY2bNL|X@L}i`Q z>1xw#qupOzlhr>(qszpd4oz97|wyRDO|6jFv z7Uc@w7Fx>tR54R*8G$*@28_6b>$6r9_E8f9*4QLRLk1a82i|L4Kf-OEUQCJlcyPPR znWRE)(JqFz7z|C@t1QuIlx^cT;8J7s!jd(k6wFLxAq2ZjLopVS=Z3=)m zHET4?kutNv#AZ+wI2)X7rYVT=Lv&z=$CEiT1N}q*N2pky;G$3(DYJP@OCBw6VUl(9 zaLzH6rYy(uPw#F;^<0;XAE-hG5FB3^HC5?r89c0b+>qX8oFIOk#$pu6)Thkw%)rC$ za|P{kfPz9>TADy5t#3!CLf7CR5Qk7-MJqW#L~(rtm`M_g)d+cfIyEF=%sb;4Ko7QH zVrP3`1D(dY&@>H61R_2)&iekdDh$u4Z!dXMHDXf(-LMKQ>1{|+(lv=^&o zRYz}k)6v~{el>pK&NEl+czPA$-}{)1JdS{Xdl-tl%*nsX8FvB2b;Ax2vsR4`Ws!_y zOSOz8gJ*gZif7P)2Lj3%5LI1=MHIivY6T)L)m*(mpSj% z6ynB6p^5YWl3cY4BY)7>5H5m=^v% zl+buTD28zXGFG9Es$ouoNa~~9V5qaM7g1rqkG30qX8hrcfC0bH2C%--eH&w`9ETArrtD}%x+wRG%F0%e=Sqyeq&<<$Z7 zHvW~`b;JOB--309x;0Au%b<8|j> z4S@a026Ebq=NtFmgDvT>1X(0PB;$F7YXpwz%!S46zhOg#S(#vVoWG0Mkm0k*R$W9f z_U5$Na3{Mdb->Z+klAp#eW^PNTJlxzUx?$%BauR@!{?+$j|QYJ07@q#`_Q`MS*iTan(uTy?t%viBqtZY>PC;ip$6?0%54e%T6`ZToVGTv# zCev%BXrib9xeEQ+^cfy<(~t?uG|AA%8ipjmsYqU#Q(I9tG0x`Tr?hPL|BUJ!iv~af z>M4w=HPf=o4ve@NY+#7sf2pHAi0`BBz0+;?q}nH5zA|iC;6RCYpn(AZJP~LDWoW?E zwP;7jH)AlF9$fodFat`lHj11{TTq*zgYT<=X=a0BO}5??kAy!k!RdnKg~ZIB7K`y1 zxs#VYjG})XjFunJOVK3|u*}k+${^C9q@#s548|Sfi?Idv+Po5oPN})xx$N~>jv1HA zG`QZj#)^&~s4^=|9_k^QnTT$^5x0s@3L15(IheJq=THlnl#`w=W4xkN8rT~u3DY?n zJE4vPl`8Nhi&MB>Lr@M$rBu?wYmR2g)XQFup`_OgMu2~G@9`7rJO>4QVPXuj5X4lY zT1u?49JYiuYI829s5`dQ5z3O3jWImXkEi`6MzEs7gm2D(-`H|0D%78nV`+|c&Y`=$ zLD$0tS^vK8(^raBGJW=2-(=XNTN4*0jTKUo_8OtPE~5q7g`sE)F#?JDL=x9Q$=S*@>RfsWaEsOrqOfXWY}b-fIA*1m5ytw2J9|3+WkVPOW+E^{c4YJb{N~Rj>OF=MPWn- zwX<*s{o!uS*%sETL-${Lv=gMALtr4Ti^Kr>w3A0{-m0oNa<$bT+LMUoA?v0TVy@0w+hTT&}%7I*g#$*ya8zl|aXh|FYQ3L$`@~)+58SPBV z;qyWc`Sm++2&Ao!G;FfDMe_LVbg}z&dWjJm3j|g6LyqeT*!YKZi$_Gq4(D~Pivrc3UB-br9dTJze(Yt@S_>=3oK@JZmR>s1_zeCu-hmsg(Z1EKaCb3&2}_pq7=Z z2;oxB*twL*Fb=4hlpM}w44AGzqJUWoSTnj4Hx?0ZfxNRyuDsZ#%psX5Am^%RH(Aa{ zx1J<>#V^dNd}n0qBw9??kvvVU``A+@&md_y8mI2IE!@RfOuub#7E7--p8+NBKz&Nb zF`nF~wp1ODa*sJ2W1$McZj6D(vAA1|3DAKz^cO5q@gh0Q-kYAK28rRQdZ7`kEDR!< zA;EYiw?PXQ=+6>fQ@pa`;Wz>l1p*B`QD8GramQUNo%T`2og!ORl>&Q>@H z;2~4m!_o`(Y$joX8>~0TQs{Nm{;#}(RZoRBidjs3ObjJs*+Du01PVx>c&s|?T3Mi0 z;{LInb?i1C(U5xvl)2+b0(w+T!$foG#R(c*YA6bqO}9gacbS$knCo_V{n-9dKh(|M z++RDmkxgjSz6ed?)IBeXqIKwl2IJGK3GFC3k4PH#0!Kn^?eizi(d=`jF6Q#zs>Jr} z<3>A%Zne-^ZV`(pPodd0`MT*)*)T2{!~w@S#v$T=z|A1SAo|Qy+rIaupx8zi6sa|I zVd5ZJ)~mQccNnrqvFRMaI1~q;gbbU+Zh4|K$3;h{fjR5*HAD$bMsJ3S?9J9rLoF`k zUd5{m4YG<%M=v$K(|-M!uD83vi~=4GQ8A?*YbVswWN51#d%@q1seK84iE+IFA9W2M z@OdJ(SkRg|u7fB$cpP{H@`<{c%`??kNGKioSmXXh3iry8n;_9tCX%!`UZi5h4WAVY z_l?6fG1inNp1HGDS6eYsx0CX$wb<;|U>{RkiQa4@a|$*c23cl! zh0RBWZpc!u`v41k})>@Js1T24v?An_Z@^BO+c$YS|H;yb5p5xTb$f7PCV`mG2)m#P%^33r?5axkk_!=Al)lhXJ_5$ZLn)H$M{8hGF5gNLV5mCqtM39&n0S~D7UW*HX-Zx-* z@Y`51i&AraVnqKu8x2@9wbBa(?!!k}kx>|z@M|+QYI_m~2xc{en_eGu$o8H;ka>zZ zHis_QA_3@dL|fs%kn#mJ{-$t>^fv9WKNJ2D4+2d^_}~NUZPRe0nGmv%+)N+ilzz(& zOO~(a)Uk83@2r!A4qS8xW-)n0F8%&?wh_kU>gNoOhn4T857ww5CW}%xDzQ!jzb6HK*w5Y?C z|6W>Gz~#@`?G_%GToUb(k_;RCfuA7u4WX$C@2YF>I|X=XUqFiSgJX5Z`jEGtc)3Nb z)~~tml6sKvj|m7?cjSBHfogL7mai9~)(ay7y*9ilS%EwWw$yAE7uWCvY{%i`Lbdc` zs_~O1k$kl<`jJsY8;vR{(AJ9dFxzc9nGUTBh$;cHS7B|tZu$_U;ccyH@ zrz;p|+7uz6Hk^gIdO{rW_SL2pvu0)Tiv0!qB#EyKEF>$FaT9^bx_O;W&@}_C^p+FN zj#H5p?ZRZbSw4uh2#fxLZS^9wNBrdC8yzD=Le0YRT9@ea(dwox@iWF+E;9>SBO}gS zdhE7bUv?iqY~+P8o(J3mmfXt}$k1WIW+$Y$N>-Z%l}WA_HA+&X5@6VX=lAB*J%nYm z4IdGA^SPNVUzqFa1PB~m0Avi96JiF_Eyt`otJCcDsj9_A9?0rjkbViZZLTbDgN&h- zi_W9DZI!wdBnIHdo*2eF2?1>rs*2MTERmgXA~6jLqulGPpN2J+8!ehJJft|f1Z&e+ zOL2y>q3PzeCoQ9H*fC15uS&vZpXY`agvM|-o=UpBf!GQ^AEg*?B0leRmr_BIni=tp z*x+bH9+^Cpf+0*O(%bd&Q%mmy=Ag5%weY~-Q&A;)uhz`JnHrx|hTA(e1h^gy2FpBa zaiDgfrW=*u5u{e30=qB2x4J3(tcI`QABg!piYl+$4#8jO2T#{wI|nFVvzg!FRnrRB zaMjO_rnEqf#nX89%8w`o~ewt=<)xz_BFAQ zcG+2m5C}p81Bf4yEIw(nK#=M9ExX=K_JncAxK-s=v<0XwC%|M$NrI85Ix(mLQOz5qSv) z$2%{SYqaoUCiRAtmOa792N!jDC9K~__hIS;IF?L96?$CkE1?2U!tN}97!?O4hR2#( zQmI@9Y8E08KM+Z3<{uqraj2%XX&am(O=5(93PJ{%gxJ;$YZ)z%%gQFeopdU3@d!i- zVt;L=@UGR%Zg=|?0rQ2eQMY~V4fF{VtZF@{he)0c+evmoy9r@2U!h8cepV$vt>g)+&UE_f>jW0{~T2Q zeE%}J6DS}hP9g-aAWqNZlwGy~U6PP$%QW#WNKP6mD-q~QeGw`Ib*U)7cxZJ7-jkxy zl&&m6eI{2ygwquo?Cdn(Yow zd&>S`5(P9BeVF|*;)|1WiN0XVK)0~lw@TQbj;ETefp?c`!5Bw@(k0+1nA(gq){G(L zM@msN)dXbK{g{!rZ0M>i70)L>Z7^~Cir_S{!Ufa9AM?w);G^F|PF)vN8?p^=lOIcW zwZ+EHboOyD6{*qe41SC)nQCW>7|$IwB=})nls@PL0EV2aaor1`An~dXFYbmw!Hi_C z!$7B7ECu^Mu?aguq@hNkE9*xx^Boo7-WkQd;ETfi?KU~dx>ub;quwekEZkx+#2%cH zkF%3a#Kqoh^#+0~aq!A`c?r_Krdw)SDt>|$>fss$%5BRsjHi=!VcnIBn<4s0qN4^H z;ap$Lef*^@oG0ROvh@n7sYJGsamEBex96|C*{8Y{goNyvkR-lNx`fu42RRtN+}-US z^p1J`f{HiQ0GHgCHAg~+tXzFJ1oPfZme=ZubaNZ4AaSZ%po~$>iDyV25+S|n>ES&r zi)}H?C`GaYLQ-P+0*GljuFD*aQ}D3l0%%~{>m}@&jnApQvE@14Lal>5Zrc<*K`5W# zfR_ks+x=;&T_T3w(4Wu+k{_Vmp;NdIrs4p8$*Z@w8Z!$8+eNE)f$32%J$f>-<~F3b z^_FHHLW*O{Fqx;yqLo;m6X;;yNmgcJF4~_uMTlNY`K7;7i$tt>+K*nK2W9qzFBct>b@VWs;QjG74*4m6c8K{5N}5}el@ zVu1c0x$OD%?KB094T}u~6Y0<>WQ3rIqOUCToiC%{Ytk!Ad``r%@1_9$Yp$nN`+AzB zAj~NIb0<58xsIyfWooq+vtWdB-+~`1r+M;MRq~~N_v^#Ki_>oZ#jz4~)kBTd=F3?` zd0@`~rT9nijAz0n84v6P(_0qt2FfqzSShs7cF`WGNpbm#P(k29ZsEt25aL*!wS{s| z)N%mpv?UC?lXf4*hbnN3jsAXg=tTHHDK{V0i*@WiM%%W@6c|*5d!X#9HG?Tg@1wW< z&M>bSHWyS%Wh`qZI!h3h=N~={r9C0i$YAC?d>CR=Ub(i;Q8bTY@nlg#GEglm zPG4jWphTHE8vv*IIN}Yer5jE(w?yPM$3qsq5`UC8Yk16n?pQ~l(Ff2z0l$>cX%5do z{Q(pG0DkjfMyDW@D`(l__+`GtES1JYH2fP^pc9>M`{Y|ViMVvQ>j^EwBW8%# zz1*uB8d|AK#0`yQ`KpFelheDvLM$OkyH-{2@ygyuNv~*kRjP`D@~bi1K!2j?&cIpM z>4o&sV6_UuSZhsNWCFhCyj&!*X1=zBoQFQ3%4!{fu@#5LZT3PO611l;ypW58GAMP> z-+o25UT>3BIc<8i3VK^f{}mEwh~cqOdUyrR8}@hmEUJuGUQMMz<+H|`lfnpjS%K&J zSkG2x;txOwIdGLvP|bpZt#+peU@8?vPQg1!7_bJ1r^7+-u)B>gU2%LXwHKild=w%d zTi*y9DrFAdr4RFz(kHjl>afn_lDIB$Y{R9?DLua)0k_mTS_}#aPkMN6-SNAiH|0Q< zYB4P0hNvvnmthe>=_yRpk)`zh43X&Ub_f~fy)AdQ23r`#NS$~iT0>T$tzT7d(5x2J zI?fIO`IZ_YrAP8&bni;QN(b3aTK-`mnuLjM4-Vek?o`Wmg;p0+)aM(%B5;$~UuIDt?Ol)xa4B8;` zkvC5nE_kCAE3;G zy10*SCks{Ra|TL2;A}uT8X!S66xJofFki_^h+tqwP8FHSo9N`%0I7_!izf$LUkpxP z_9P)24HSk=AyC#8D1C-dFZW+<@4PrFFrJ^InbX;g+%s;KpEeIL|we&2Gc!I zT|kY$c;lKvrh`=jn!pi0o)vl(G_sgcxv2=G3tyMCZ?Araf=#w2kET%;UN%r3`l_LV z!`^NWB+Yva(&n0@(xCl~tsLH>P0@n03$%kUqGx^Ap94Oib~ zi^=78dGt2%2B)w9T}*^!nIl!PbL4%W`}#lW2FE zU~?w_hIA4m{XYGWY5Zggt~X0*vwYtA3(3+UMIsL>RJ18Kl9 zSkvEJHkn_c;g|-)`HOO33fq4Az|%9l26lM7&-wNJozl64lej5x#(hLIQghB*jFvqr zuN@nGXm{yhpQ@Q4sQ7#v^Zc%d3{zF%j>mHat901{H&AnH&-Hct!pCE^dm5t_;M#(L z=o>)Su*V?n!tBc@A_JpE6m&dpe>L?ZQ&evo$wOu82@EX_;RlD|(wf+C6Dw-@X5wwH zo{i5lnSe&)XJ_k#<=zFOL?7+_xzOWKx3=ghM1&Q4(RvUAe2f)0IBZD1b~e`E-olvru+8S9Ys*XQ?!q3Zg$0*iPFdV1dGY)M$NSLcJVeno1p*trd5q z(@^!ROyQ1EDj5Mp6cH>`&iUL**us_coqO6lmg>%NJO%r%|k`)<4aUB zs9J`J7ig7$m8WB8@VZ>0V_d?4j! zXBAt!5`b`P_jk=v*@Dvj&n1aQH}6Lu7sE6vh*UJe{lx*dwzY3~1cY>T&O%@7@dExvpa1y>bqP90PfP=H8(;;|R>kPL@a>m|od(-*J zIXsYQ460R5(r#qv#;YB>5t%@_j+G>4;|%YY0WQ;u*Ai^wro5F19ebeG$q zwkv2}^?8O~9P+_HlT{kRf~*@rQ*hhW`iD4?S1$*wNx0|`yfVO8jU;JaE1pPvu9^bh>AqR-aN(i@HIqCC( z(tCgjvPT|XYFU+JJyHc053M;y_71l8X?3;@MZLBnZ3um=WW8L?94S-PRY&X4RPTzz zwBDcI1HtdLcG-z)_M2o~Koz%geu^X4{Y&Wd#TN<{HzGc*n0VD~yotL9E|AXb(>|k_ z(CU3Os03QH5Z45stZQ?!^ZDmn+dcKt+lJO>QVWvk*SZ*h=F6pOQ3ICX&SY|YcvEN;P!ezK-^cQKc{Y}D*Quf zn{gHFWV`^PZ+MM#7h3lenW)`9m+xS%aZ02vz%Nm*_jCvz3DA}{%IcYD9Y+1F1sPo< zT&y%LW({epgk0kkBQ=JMwir#M-yLF1;JZTFcLX#rYpq$i2q+&7(quhT=@Iapd`%Lf z*;3L@wg{d|kh?ZC>)2pzUYHff5Et{W!)i5qFW-quJNI(^4oCMF#B*rY*PNVHh8rd* z`Tq9U%w1>=s{|_+t3{q5NOA???;P;wv)s8e_wp?(N6{VEC2^|mkjr+)0A$teRN|_C`)}_vY5O(x)CPQj% z;?acu=^nw-`_Q%nDy4&{mO~cE6bgu(3c*^=?2$yMi^e=iCiPzwUOI1i`t%g_v=-S5 z^?VhW@6{?s8f)PW@k4IS1=rCGT@6gDfu0%yDFXdDk{*lu+p&fi89+hZHkVo3z~0}E z7UeLO#sct|%PAY6l&)fm1N*4fE2pwMUOu2PY5U1oZ&2;$W0?nA<7-+CdN$rtY(wvI zUl6}F)FTl;gWm6)yjr-n>e+%vfW#pNxOGmUgM=MzZIv2i=LRWAr&Ol%HIOg^&?;Bz z!AR^BkKtd|w@%hNUH*$+Gurk=eZ>zPWX&y>kB6JzFHj&#qysMQBV+e5D;AGvWUHJNlv#q61~A;aqrVv+tq~c4vFW-^H=8M6yobu&0ouEH?an! zr>OEmW&^FRGPKa_41i5{Q$9wg%2dRQv12U=-a1%^=C-%5#;WqdJ7>f#P(dr% zUto9_O+C(o9q0%4zxOS*w{MXT?(ehjGu3%{4;d{K7)Uigx zLOXqNjRGJMfJ&TI`<8GbC0+ z7RmSY2jUQ*UyJ^NzSaV_H#wQR!bnoA*>^?_0#Z15KMT(QiqU2dD6#|kAt(1|VLa4} zcR>brxqoa>)S#bnUV-B(jf<(2$B*h6F7+S(nSHr1DC1mLX9rtk8!&Z2>iHH#)yC{7g%MJzbq9~(A{d?c6YRI+sGQDfb* zOhZalQ2QdBiqoPb%s4$LO^qk_sA{hfLW%!597CYwI_mtM7K-m`Et6i> zjeri-K=Ohu%W|e8ARBx<%Yn^Wt)GtJS1+zZQp=W$;o$YZ(Pu>mf%RE@g!n09^T#}VE1~8n93&BPL05d^R z+7F8wLg`Flxb}ER4|?z>a<%?uI=|>Gv|9>-jr7aKymH%xCLGPG=3lg5)b0%;CXAlB z7=CO(AO|`Vnp%r&!^K^k>;#4NupWYJM#dNX9_3=gYd|L?9^n$Ir9pI!5&gR>LcL+3 z`kBTQmPpGZWWPf&MK6Y8Sw4i>Rb)j}!m+?cWt9f2g2h5==8@0mJFXAzYB^RxwESC0 zw3@6hEP+7JjneqI?nIX?&44|rcTJa|n)zD${^-!r4_qP!QTD&py?hus5iGo=MVhfb zK?Y*GV`*WUUWMbsW=Por(PEpy&4O_fRcUT!qMCiABpGf!n=Y5gi^Fs(C?Q>nXA6L@ z&`}6$Ae{CXRiFIvL5Li(XOrl%s@^_t57+}96!ew1*pc;r$%SawpN$I_!iFondLQqW z*LW^ZcM(1!gaD^6r`k3syGR)2b3Rl-uxz{$`NH*tEgRNjx|@ZO2;iUxuO5>aALPug zWU#V;I2?l#JQ)%eXVVXCA+G!n@n6&0ZY?azpSYu2!NCbxdHA#uyxlq(ffV#yQSNmo zC2$VDw!1t9D*>L_w@T$;inGmWb;em|V|RKA&;)kz(b>(|m&(7MDt}=v*A0Z4K{v(n za?ouK3Q!u#V7vldo2dXeilf<(Oi`YKsBpM#8aNs+@F^`x7T5P+V0tg+O2RuG^M`C& zB(>zOL_R59amCg@@=hd9ahZciAe;yDa<`_h&qrPTe$??()KYOwvR-SeKmZ#O0-%^K z+FYtRV1e|#2Q3cLZ;>M-Gu1Yf9dfctP8ZA$wA>JsMqr*DLV>f1IrjsU1WO_#f7D9X zkHCVsC`u1pYmxme;h3%sThUUQSyuZtB;1LeZ#Qy^o;mGih&>pd;tK>XlgF#@GH}`( zq24BAbd-}tt~lA`%fK2E<}0c2ZINA<;!$*@nUF-r>f9VLwXDe4!bSX+iPv(K1)&-s zATyU1H);nb%&hOdVzq2(fb7Mst7+yuD=iPE8Mkq)3Hem}V)>d33W;OD8IeXhzz_0x z>F(-N*ECwtAV-dJW3yJNzo@c-GD@NlPA6B_%hU12x2Jd96mBIIU>a_nQr};qtvU?h zK01;OuE+2^Z%ESkfGWgDrjXPuG??bHkQK8jK|QP~D#``!F0BkA)eiw+Yo~nNgCNKH z3CwbU?^cKC6$CIf1aLvW4KtBBz?~XgR9I`ORbgVlcVPH4RSm&S>x!bL+iQd+dK)vD z3b$5s%xLIwZ|9*#9Tz6 zoMdF!vW;sYeE7O^SzWQywtzu_4;_bLmoSWl-CG#BBSaWWq@}8-?G_Co@Qx@W+P6e? z#7HZY$Ie{6BP8SMel))T`54WRt8u$R;#6tFfg$0x`5*?dT?F7Hwi{|i8Gl$rMcA4H z^+>t~M8fS)0~({wp;gF|*Q6Xo z(HYcX!?W;p64_K+`@KEJ`46`~M@^*O#f>nCFg-|e3)WkYS!{*m=qME|I$O4xN1We1 z*xFrp3aRu9);WP5vcD!m;Zw9G67iPpqHL%;=>xBicf-hhBZU~ZRP=HnTV5>>9hZ)- zm-5GjOHifTsrp2qtrx<2)VwJSGoD27kog%j>WEC}wqcGDIFCT7OJU}Avui{2P;dxK z=7&fht&a|eBV3YL(!!Mem}kJqPKkNaZ5xu(BX7=O9~JtzsKO1sepZ-*n3JAMjm;ZF z1JeS7YSn}bYI7H1!5#v>fsK*8#B5BaA?lRq^&ES-$ZI-dYRT1bw?`yJo1?c&6BOG_ zoHrlRAaC$O>s!VbVy73Tta|1`I5?m5`x?W6V5E<%`3X;%oQO_m&33#y>Zs9~xM5