Resolved conflicts:
- test/*: keep the shared Fixtures.h migration (drop the per-file
openGfxWindow copies that dev still had).
- vulkan/Graphics.cpp: keep dev's extName loop variable rename AND the
headless set_headless() line.
Local win32-debug build + headless/sampler/mocks/binding tests pass after
forcing a rebuild of EVProcgen (stale object from the pre-merge tree caused
a duplicate PbrTextureSet::destroy symbol).
- Add RGBA-float drawSolidRect/drawTexturedRect overloads so the C++ names
match the script-facing API (script already bound those names).
- Add string-based setTextureSampler(Texture*, filter, mipmap, aniso, lodBias)
overload with strict magic-string validation (unknown filter/mipmap now
throws instead of silently falling back to linear); keep
setTextureSamplerParams as a deprecated alias. Script binding now targets
the overload with an explicit cast.
- Document error contracts: DataModule encode/decode (new[] ownership +
throws), Filesystem setSource/mount/unmount (false on recoverable failure,
no throw), ModelData getMesh vs numeric getters (nullptr vs throw), plus a
two-state error-semantics section in API-CONVENTIONS.md.
- Tests: TextureSampler string validation (valid + deprecated alias + typo
throws), headless test now exercises the RGBA-float overloads.
- EVENGINE_ENABLE_STRICT_WARNINGS option: MSVC /W4 /WX, GCC/Clang
-Wall -Wextra -Werror, with documented noise suppressions and
-isystem/-external:I for third-party headers; enabled on the
Windows/Linux debug CI jobs.
- Fix warnings across engine, modules and tests exposed by the gate,
including real bugs (incomplete-type deletes, Timespan microsecond
overflow, overload hiding, enum switch gaps, dead code).
- Add Linux ASan+UBSan job, example smoke step, python-tools test
job, ruff config (scripts+tools), weekly Linux coverage job and a
CodeQL workflow.
sq_newslot(-3) expects a [table, key, value] three-level stack; the code
pushed only the value, so the slot write silently targeted the native
frame's mode argument (a string, not a table) and was skipped. Handles
therefore had methods but empty _path/_data, making read()/getSize()
throw 'file not readable' on every platform where the stack layout
did not accidentally alias the table.
Fix cardgame's ui.sameLine() calls to pass an id (the binding requires
one), and make the example smoke failure output print non-frame-error
lines so future CI failures carry the real root cause instead of being
buried under per-frame error spam.
FileWatch::add/remove/clear unsubscribed Poco DirectoryWatcher delegates while holding mu_. Poco's Delegate::notify() invokes the callback while holding the delegate's own mutex, so a watcher thread blocked in handlePocoEvent() on mu_ while dispatching a write event deadlocks (ABBA) against the thread doing the unsubscribe (Delegate::disable()). Moving both the unsubscribe and the DirectoryWatcher destruction (which joins its thread) outside mu_ eliminates the lock-order inversion. Reproduced by hotreload.tryReloadParticleJson and a standalone FileWatch stress test; fixed build passes 100/100 runs.
Makefile: defer the WSL capability probe so make run no longer cold-starts the WSL VM (use wsl -l -q for make all). filesystem: file() now fails when the file is missing so file_exists() returns false (eve run from a dir without config.nut no longer dies at dofile). Add temporary [startup] stage timers and EVE_BOOT_BENCH auto-exit to profile boot time.
Normalize all header comments to Doxygen @brief form and fill in missing class/method docs across engine common, cmdline, and module headers (~2368 @brief entries). Add root Doxyfile, 'make docs' target, CMake docs target, .gitignore for docs/api, README/docs/dev updates, and a Windows (native) + code-conventions section in AGENTS.md.
HotReload knew what lived at every watched path: it included graphics to
refresh textures, particles to reload emitter configs and map to reload tile
layers. That made the engine's lowest-level module depend on three of its
highest, and it was the only reason filesystem sat in a dependency cycle.
Each module now registers an eve::caps::IAssetReloader for the assets it owns
and HotReload only routes paths. Behaviour is unchanged: automatic dispatch
still matches by extension, an explicit bind() still targets one kind and
ignores the extension, and the texture reloader runs at kTexture priority so
the GPU upload happens before emitters and tile layers re-bind to it.
The reloadable set now follows the linked module set, so a build without
particles simply has no particle reloader rather than a dangling reference.
Reload kinds also become extensible: a module or plugin can add one without
touching filesystem.
Back-edge whitelist 14 -> 11; the dependency graph is now acyclic apart from
the event pump.
(map.render.tilesContributeDepthY fails when run after the hotreload cases both
before and after this change -- pre-existing test-order state, not from here.)
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
Add a development-server based remote hot reload so script/resource changes
made on the host are synced and reloaded live on devices whose game bundle is
read-only (iOS app bundle, Android APK).
- Implement the previously stubbed `eve dev` command as a small HTTP file
server (GET /manifest, /raw/<path>, /ping) serving a game directory.
- Extend HotReload with a background remote-sync client: poll the server
manifest, compare mtime/size, download changed files into a writable overlay
directory mounted at "/" via the new Filesystem::mountRealDirectory, and
queue changed virtual paths for the script layer to dofile/reload.
- Wire it into load.nut: config.devServer/devSyncMs, shared handle_change(),
poll_remote_reload(), and a `eve run --dev-server <url>` CLI override.
- Add iOS/Android hot-reload dir helpers and cleartext-HTTP platform config
(iOS ATS + NSLocalNetworkUsageDescription, Android usesCleartextTraffic).
- Add test/remotesync.cpp covering overlay shadowing, end-to-end sync, and
unreachable-recovery; update docs.
- Add eve zip <game> to compress a game directory into a .eve archive
(custom streaming ZIP writer, DEFLATE via zlib, PhysFS-readable).
- Add eve package <game> -o <out> --sdk <sdk> to assemble a runnable
Windows game folder from the target SDK: eve.exe + game.eve + runtime
(vulkan + VC CRT) DLLs + platform template. SDK auto-detected from the
running binary, --sdk, or \.
- Run a packaged game entirely from memory: detect game.eve, mount it via
PHYSFS_mountMemory (no extraction to disk) and route Squirrel's
file/dofile/loadfile through PhysFS so scripts load from the archive.
- Link eve to eve.html via --shell-file so the shell template is actually applied and regenerated on every build; track the shell as a link dependency.
- Keep C++ exception catching enabled under ASYNCIFY so expose() failures abort cleanly instead of asserting on __cxa_throw.
- ModuleManager::exposeVM no longer find()+catch for the eve table: Runtime::initialize() guarantees expose() runs once, and ASYNCIFY-wrapped frames can drop the catch and leak NotFoundException.
- Expose window.hideEVELoading and call it on the first presented frame so the shell's loading overlay is dismissed.
- FileWatch.h includes common/config.h so EVENGINE_WEBGPU is defined before the Poco guard.
- Added support for the WebGPU backend in the CMake configuration, enabling builds for Emscripten and native Dawn.
- Implemented conditional compilation for WebGPU-specific features, including shader management and file system handling.
- Updated the build process to exclude unnecessary modules and dependencies for WebGPU, optimizing the engine for browser environments.
- Enhanced the installation script to include WebGPU-related files and directories in the output.
- Refactored existing modules to accommodate WebGPU, ensuring compatibility and performance improvements across the engine.
- Introduced new compile options and configurations tailored for WebGPU builds, including handling of third-party libraries and assets.
- Implemented multi-layer tilemap functionality, allowing for the reading and saving of Tiled JSON formats.
- Added support for various tile projections (orthogonal, isometric, staggered, hexagonal) and depth calculations.
- Introduced object layer parsing and caching for improved map object management.
- Updated the rendering system to unify 2D depth queues and enhance sprite handling.
- Added new methods for accessing object properties, including position and dimensions.
This update significantly improves the map module's capabilities and integration with the rendering system.
- Updated the zeroerr submodule to the latest commit for improved functionality.
- Modified CMakeLists.txt to include additional system libraries for better compatibility across UNIX platforms.
- Added <cstdint> includes in multiple header files to ensure proper type definitions.
- Introduced a new hotReload variable in the demo script to support dynamic updates.
- Updated the physics module to include Box2D support, enabling management of physics bodies and collision events.
- Enhanced the map module to support tile layers and improved hot-reload functionality for tilemaps.
- Updated documentation to reflect the new features in the physics and map systems, including usage examples and API references.
- Modified CMakeLists.txt to include new modules for physics and font management, ensuring proper build configurations.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Enhanced the README to include WSL2 support and updated package requirements for Ubuntu.
- Modified CMakeLists.txt to define compile options for the EVParticles module.
- Improved the FileWatch module to handle directory normalization across platforms.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Added support for soft hot-reloading of scripts and assets in the engine, allowing for dynamic updates without restarting.
- Introduced new functions in the load.nut script to track and reload modified scripts and assets.
- Enhanced the filesystem module with a HotReload class to manage asset reloading based on file changes.
- Updated CMakeLists.txt to include new timidity share data for desktop platforms.
- Improved the audio module to support MIDI playback with dynamic asset loading.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Added methods for file watching, including `watch`, `unwatch`, `unwatchAll`, `getWatchCount`, `pollWatch`, `getLastWatchPath`, and `getLastWatchRealPath`.
- Enhanced the `Filesystem` class to support monitoring file changes, allowing for real-time updates.
- Updated the `physfs` implementation to handle file watch targets and events.
- Improved documentation and added unit tests to validate the new file watching features.
Co-authored-by: Cursor <cursoragent@cursor.com>
Inject bundle game launch args, share Android-style resume surface rebuild, and skip validation layers for the first device bring-up.
Co-authored-by: Cursor <cursoragent@cursor.com>
Unpack APK game assets into internal storage, route SDL_main into the engine cmdline entry, and keep Android filesystem paths aligned with the runtime root.
Co-authored-by: Cursor <cursoragent@cursor.com>
- Updated file handling to ensure proper opening in binary mode for reading, addressing issues with the PhysFS backend.
- Refactored audio source management by renaming and consolidating stream unregistration methods to prevent potential deadlocks.
- Enhanced mouse position handling to ensure reliable updates in SDL, particularly when window focus is lost.
- Added new tests for filesystem operations and HTTP request handling, including verification of SSL behavior in HTTPS requests.