From 737214b71be8fe5fdf51155ad50bb064b3156bd3 Mon Sep 17 00:00:00 2001 From: Indrajith K L Date: Mon, 3 Nov 2025 17:48:56 +0530 Subject: Add embedded assets, splash screens, and asset loading support Features added: - Embedded main.lua and Lua files support (EMBED_MAIN option) - Embedded assets support (EMBED_ASSETS option) - Splash screens with dual logo display (always embedded) - Asset loading progress tracking API (BeginAssetLoading, UpdateAssetLoading, EndAssetLoading) - Custom font embedding for splash/loading screens - --log flag for Windows console control - --no-logo flag to skip splash screens in development - Python scripts for embedding (embed_lua.py, embed_assets.py, embed_logo.py, embed_font.py) - Documentation (EMBEDDING.md, ASSET_LOADING.md, SPLASH_SCREENS.md) This allows building single-executable releases with all Lua code and assets embedded. --- src/main.c | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 100 insertions(+), 14 deletions(-) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index f35d2bf..d4d8fd2 100644 --- a/src/main.c +++ b/src/main.c @@ -1,6 +1,15 @@ #include "main.h" #include "state.h" #include "lua_core.h" +#include "splash.h" + +#ifdef _WIN32 +// Forward declarations for Windows console functions +extern __declspec(dllimport) int __stdcall AllocConsole(void); +extern __declspec(dllimport) int __stdcall FreeConsole(void); +extern __declspec(dllimport) void* __stdcall GetStdHandle(unsigned long nStdHandle); +extern __declspec(dllimport) int __stdcall SetStdHandle(unsigned long nStdHandle, void* hHandle); +#endif static inline void printVersion() { if ( VERSION_DEV ) { @@ -22,30 +31,92 @@ static inline void printVersion() { int main( int argn, const char** argc ) { char basePath[ STRING_LEN ] = { '\0' }; bool interpret_mode = false; + bool show_console = false; + bool skip_splash = false; + +#ifdef _WIN32 + /* Check for --log and --no-logo arguments */ + for ( int i = 1; i < argn; i++ ) { + if ( strcmp( argc[i], "--log" ) == 0 ) { + show_console = true; + } + if ( strcmp( argc[i], "--no-logo" ) == 0 ) { + skip_splash = true; + } + } + + /* Show or hide console based on --log argument */ + if ( show_console ) { + /* Allocate a console if we don't have one */ + if ( AllocConsole() ) { + freopen( "CONOUT$", "w", stdout ); + freopen( "CONOUT$", "w", stderr ); + freopen( "CONIN$", "r", stdin ); + } + } + else { + /* Hide console window */ + FreeConsole(); + } +#else + /* Check for --no-logo on non-Windows platforms */ + for ( int i = 1; i < argn; i++ ) { + if ( strcmp( argc[i], "--no-logo" ) == 0 ) { + skip_splash = true; + break; + } + } +#endif if ( 1 < argn ) { - if ( strcmp( argc[1], "--version" ) == 0 || strcmp( argc[1], "-v" ) == 0 ) { + /* Skip --log and --no-logo flags to find the actual command */ + int arg_index = 1; + while ( arg_index < argn && ( strcmp( argc[arg_index], "--log" ) == 0 || strcmp( argc[arg_index], "--no-logo" ) == 0 ) ) { + arg_index++; + } + + if ( arg_index < argn && ( strcmp( argc[arg_index], "--version" ) == 0 || strcmp( argc[arg_index], "-v" ) == 0 ) ) { printVersion(); return 1; } - else if ( strcmp( argc[1], "--help" ) == 0 || strcmp( argc[1], "-h" ) == 0 ) { - printf( "Usage: ReiLua [Options] [Directory to main.lua or main]\nOptions:\n-h --help\tThis help\n-v --version\tShow ReiLua version\n-i --interpret\tInterpret mode [File name]\n" ); + else if ( arg_index < argn && ( strcmp( argc[arg_index], "--help" ) == 0 || strcmp( argc[arg_index], "-h" ) == 0 ) ) { + printf( "Usage: ReiLua [Options] [Directory to main.lua or main]\nOptions:\n-h --help\tThis help\n-v --version\tShow ReiLua version\n-i --interpret\tInterpret mode [File name]\n--log\t\tShow console for logging\n--no-logo\tSkip splash screens (development)\n" ); return 1; } - else if ( strcmp( argc[1], "--interpret" ) == 0 || strcmp( argc[1], "-i" ) == 0 ) { + else if ( arg_index < argn && ( strcmp( argc[arg_index], "--interpret" ) == 0 || strcmp( argc[arg_index], "-i" ) == 0 ) ) { interpret_mode = true; - if ( 2 < argn ) { - sprintf( basePath, "%s/%s", GetWorkingDirectory(), argc[2] ); + if ( arg_index + 1 < argn ) { + sprintf( basePath, "%s/%s", GetWorkingDirectory(), argc[arg_index + 1] ); } } - else{ - sprintf( basePath, "%s/%s", GetWorkingDirectory(), argc[1] ); + else if ( arg_index < argn ) { + sprintf( basePath, "%s/%s", GetWorkingDirectory(), argc[arg_index] ); + } + else { + /* Only flags were provided, use default path search */ + char testPath[ STRING_LEN ] = { '\0' }; + sprintf( testPath, "%s/main.lua", GetWorkingDirectory() ); + + if ( FileExists( testPath ) ) { + sprintf( basePath, "%s", GetWorkingDirectory() ); + } + else { + sprintf( basePath, "%s", GetApplicationDirectory() ); + } } } - /* If no argument given, assume main.lua is in exe directory. */ + /* If no argument given, check current directory first, then exe directory. */ else { - sprintf( basePath, "%s", GetApplicationDirectory() ); + char testPath[ STRING_LEN ] = { '\0' }; + sprintf( testPath, "%s/main.lua", GetWorkingDirectory() ); + + if ( FileExists( testPath ) ) { + sprintf( basePath, "%s", GetWorkingDirectory() ); + } + else { + sprintf( basePath, "%s", GetApplicationDirectory() ); + } } if ( interpret_mode ) { @@ -65,15 +136,30 @@ int main( int argn, const char** argc ) { else { printVersion(); stateInit( argn, argc, basePath ); - luaCallMain(); - luaCallInit(); + + /* Show splash screens if not skipped */ + if ( !skip_splash ) { + splashInit(); + bool splashDone = false; + + while ( !splashDone && !WindowShouldClose() ) { + float delta = GetFrameTime(); + splashDone = splashUpdate( delta ); + splashDraw(); + } + + splashCleanup(); + } + + /* Now run the main Lua program */ + state->run = luaCallMain(); while ( state->run ) { - luaCallUpdate(); - luaCallDraw(); if ( WindowShouldClose() ) { state->run = false; } + luaCallUpdate(); + luaCallDraw(); } luaCallExit(); } -- cgit v1.2.3