diff options
| author | navewindre <boneyaard@gmail.com> | 2025-09-03 20:10:09 +0200 |
|---|---|---|
| committer | navewindre <boneyaard@gmail.com> | 2025-09-03 20:10:09 +0200 |
| commit | f8b92ce3aa08b1445c9f956d8166830946562d12 (patch) | |
| tree | 94e63a5aec9f8f52b577f56799e0c9201fd976a5 /src/game.cpp | |
a
Diffstat (limited to 'src/game.cpp')
| -rw-r--r-- | src/game.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/src/game.cpp b/src/game.cpp new file mode 100644 index 0000000..bd3c4c8 --- /dev/null +++ b/src/game.cpp @@ -0,0 +1,149 @@ +#include <unistd.h> +#include "game.h" + +#include "game/world/draw.h" +#include "render/gl_2d.h" +#include "render/gl_3d.h" +#include "render/gl_2d_font.h" + +#include "editor/editor.h" +#include "game/assets.h" +#include "game/vars.h" +#include "game/objlist.h" +#include "game/world/map.h" + +#include "gui.h" +#include "render/gl_batch.h" +#include "util.h" + + +GAME_DATA* game_init( GL_DATA* gl ) { + GAME_DATA* game = (GAME_DATA*)malloc( sizeof( GAME_DATA ) ); + memset( game, 0, sizeof(GAME_DATA) ); + game->gl = gl; + + VEC2 screensize = { (F32)gl->canvas_size[0], (F32)gl->canvas_size[1] }; + + game->shaders.gl2d = gl_2d_init( gl, screensize, "2d" ); + game->shaders.gl2d_texcoord = gl_2d_init( gl, screensize, "2d_texcoord" ); + game->shaders.gl3d = gl_3d_init( gl, screensize, "3d" ); + + game_create_batches( game ); + + assets_init( game ); + assets_on_frame( game ); + varl = vars_init(); + objl = objl_init(); + +#if IS_EDITOR + game->editor = editor_create( game ); +#else + gui_create( game ); + game->state.ingame = 1; +#endif + + return game; +} + +void game_create_batches( GAME_DATA *game ) { + game->render.batch_3d = gl_batch_create( game->gl, game->shaders.gl3d, &gl_3d_batch_setup ); +} + +#ifdef DEBUG +void game_draw_fpsoverlay( GAME_DATA* game ) { + GL_DATA* gl = game->gl; + char buf[256]; + sprintf( buf, "fps: %1.3f (%2.5f ms) %dx%d", gl->fps, gl->frametime, canvas[0], canvas[1] ); + + VEC2 dim = gl_font_dim( game->assets.font, buf ); + gl_font_draw( + game->assets.font, + game->shaders.gl2d_texcoord, + s_tr({ -dim.x - 30.f, dim.y + 5.f }), + buf, + (CLR){ 1.f, 1.f, 1.f, 1.f } + ); +} + +void game_draw_fontoverlay( GAME_DATA* game ) { + for( U32 i = 0; i < 255; ++i ) { + char str[64]; + sprintf( str, "%d:%c", i, (char)i ); + gl_font_draw( + game->assets.jpn12, + game->shaders.gl2d_texcoord, + s_tl({ 10.f + ( i % 18 ) * 33, + 280.f + floorf( i / 18.f ) * 14.f }), + str, + CLR::WHITE() + ); + } +} +#endif + +WORLD_MAP* game_load_map( GAME_DATA* game, const char* mapname ) { + WORLD_MAP* m = map_from_file( game, mapname ); + if( !m ) { + dlog( "game_load_map() : failed to load file %s", mapname ); + return 0; + } + + objl_load_world( game, m ); + game->state.map = m; + return m; +} + +void game_unload_map( GAME_DATA* game ) { + map_free( game, game->state.map ); + game->state.map = 0; + + objl_clear( 1 ); +} + +void game_draw( GAME_DATA* game ) { + if( !objl->pl || !objl->world ) { + game_load_map( game, "../assets/maps/test.hmap" ); + } + + VEC2 window = { 270.f, 25.f }; + VEC2 winsize = { 480.f, 360.f }; + gl_2d_rect( game->shaders.gl2d, window, winsize, (CLR){ 0.3f, 0.3f, 0.3f, 1.f } ); + world_draw( game, objl->world, window, winsize ); +} + +void game_main_loop( GAME_DATA* game ) { + GL_DATA* gl = game->gl; + GL_SHADER_PROGRAM* gl2d = game->shaders.gl2d; + + if( !assets_on_frame( game ) ) + return; + + gl_beginframe( gl ); + gl_2d_frect( gl2d, s_tl(), s_br(), { 0.f, 0.f, 0.f, 1.f } ); + + if( game->state.ingame ) { + game_on_tick( game ); + game_draw( game ); + } + + gui_onframe( game ); + +#ifdef DEBUG + game_draw_fpsoverlay( game ); +#endif + + if( !OK( gl_endframe( gl ) ) ) + exit( 0 ); +} + +void game_on_tick( GAME_DATA* game ) { + U64 tick = u_tick(); + if( tick - game->state.last_tick > (U64)(TICK_INTERVAL * 10000) ) { + player_input( game, objl->pl ); + game->state.last_tick = tick; + } +} + +void game_destroy( GAME_DATA *game ) { + free( game ); +} |
