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 an i18n module (eve.I18n) for game localization:
- Load per-language JSON locale tables from VFS or raw JSON.
- Dot-path key lookup with {name} placeholder substitution.
- CLDR-style plural rules (en/fr/ru/pl/cs/zh and more).
- Fall back to default language, then to the raw key.
- Optional file auto-reload via update(dt).
Self-contained JSON parser (no Poco) so it builds on WASM too.
Includes C++ + Squirrel script tests, user/module docs, an
examples/i18n demo, and i18n integration in the dialogue example.
Integrate the latest main (weather system, outline shader, camera controller,
model converter, hidpi-ui). Resolve additive conflicts in shared registration
files so both the day/night and weather modules are registered:
- src/modules/CMakeLists.txt, src/engine/CMakeLists.txt, test/CMakeLists.txt
- src/scripts/load.nut, docs/usr/MODULES.md
Add a DayNight module (src/modules/daynight) exposing eve.DayNight() to script:
- A 24-hour clock (configurable speed / pause) derives the sun elevation and
azimuth each frame, repositioning the directional light so the sun sweeps the
sky over the day and fades to zero below the horizon.
- A procedural IBL sky cubemap (sky gradient + sun disc + deterministic night
stars) is regenerated per sun-angle bucket and registered as the 3D env map,
so both the skybox angle and the reflected sky follow the sun.
- Night light systems, each a set of Light3D entities toggled by name:
moonlight (cool directional), starlight (ambient boost), fire (warm point
light at a set position) and fireflies (a ring of gently-drifting points).
Add examples/daynight: a 3D diorama with a UI panel and hotkeys to pause/speed
the clock and toggle moonlight, fire and fireflies.
Add test/daynight.cpp (9 cases) and docs/usr/modules/daynight.md. Verified with
a syntax-only compile per the weather module precedent.
Add a Weather module (src/modules/weather) exposing eve.Weather() to script:
- Rain and snow rendered as camera-facing billboards animated in the vertex
shader from a few per-frame uniforms (time/wind/intensity), with alpha-tested
procedural streak/flake textures and distance fog.
- Wind exposed as a global vector field (speed + direction) feeding the
precipitation shaders for tilt and drift.
- Lightning: jagged, midpoint-displaced bolts (tapered quad strips) that flicker
and decay, with an optional key-light flash value for the scene.
- Presets: clear / drizzle / rain / storm / snow / fog, with smooth intensity
transitions and storm mood (sky darkening, sun falloff, fog, ambient).
Add examples/weather: a 3D diorama (trees, pillars, rocks, ground) with a UI
panel and hotkeys to switch weather and tune intensity/wind/lightning.
Docs: docs/usr/modules/weather.md with API reference and notes on mature weather
rendering techniques. Weather module verified with a syntax-only compile.
- Added functionality to enable hardware MSAA (2x, 4x, 8x) for the 3D scene color pass, enhancing edge quality for 3D models and voxels.
- Introduced `setMsaaSamples` and `getMsaaSamples` methods in the Graphics API to control MSAA sample count.
- Updated RenderControl to include MSAA as a feature, with default settings for enabling/disabling.
- Modified the rendering pipeline to accommodate MSAA, including adjustments to render passes and framebuffers.
- Enhanced documentation and tests to cover new MSAA functionality and ensure stability across various scenarios.
- Added a new 3D rendering pipeline section in the documentation, detailing initialization, VKBuilder, and asynchronous frame handling.
- Updated the Ambient Occlusion module to support depth-based sampling, allowing for improved visual fidelity in 3D scenes.
- Introduced new shader functionalities for ambient occlusion and global illumination, enhancing the overall rendering quality.
- Updated GBuffer to include hardware depth texture for more accurate depth sampling in 3D rendering.
- Enhanced the RenderControl to manage new features for ambient occlusion and global illumination, ensuring they are enabled by default.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
Introduce a compilable render feature control (shadow/gbuffer/forward/hair),
package shading into Material+ModelPart attachable to Renderable3D, and fill
sampleable linear-depth/normal (optional albedo) G-buffer targets while
keeping forward HW z-testing and CSM shadows.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Introduce mesh3d_hair GLSL shaders with alpha-blended Vulkan pipeline
(no back-face cull, depth write disabled). Expose gfx.newHairShader(),
Renderable3D.setHair() for a back-to-front transparent pass in
RenderSystem3D, plus HairShader helpers and unit tests.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* feat(image): ImageData::rotate with inverse-map nearest/linear
Add CPU pixel rotation on ImageData using destination-to-source inverse
mapping (Geometric Tools / standard image processing). Supports nearest
and bilinear filters, optional canvas expand to fit the rotated AABB,
and matches Math::rotate2* angle convention. Includes unit tests, Font
script binding, and docs.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* test(image): assert exact 90° rotate pixel positions
Pin nearest+expand 90° mapping of corner markers to (1,2) and (0,0).
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* feat(image): implement RotSprite pixel-art rotation filter
Add Xenowhirl RotSprite as ImageData::rotate filter "rotsprite":
Scale2x×3 with color similarity, best 8×8 sampling offset search,
nearest-neighbor rotate+downscale, and single-pixel detail restore.
Quarter turns use an exact remapping fast path. Tests cover 90°
palette preservation and 45° no-new-colors.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(ci): M_PI on MSVC and GitHub API 403 for asset downloads
Windows unit tests failed because test/image.cpp used M_PI without the
MSVC fallback used by other test files. macOS build failed when
download_skinned_character.sh hit GitHub API 403 during PRE_BUILD; add
User-Agent + optional GITHUB_TOKEN auth to asset fetch scripts and pass
GITHUB_TOKEN in CI build steps.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* Add extensible building placement module for strategy/ETS games
Introduce eve.Building with data-driven definitions, grid occupancy worlds,
ghost previews, and pluggable validate/snap/change hooks. Includes design docs,
user module guide, unit tests, and a gitignore fix so build*/ no longer ignores
src/modules/building/.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(building): preserve free-snap world pose on placeAtWorld
placeAtWorld now keeps the snap rule's worldX/worldY on the placed
instance instead of always rewriting to the cell origin, so free and
custom snap modes stay accurate for ETS-style soft placement.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* Add examples/building town placement sandbox demo
Interactive demo covering grid snap ghost preview, terrain (dock on water),
road adjacency (stall), L-mask barn, rotate/remove, and resource costs.
Also adds make building shortcut, docs links, and a unit test locking the
demo building definitions.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(ci): vendor CesiumMan test assets to avoid flaky Linux SSL download
Linux CI failed linking unit_test when PRE_BUILD curl hit a self-signed
certificate fetching CesiumMan from api.github.com. Commit the ~464 KiB
glTF fixture, skip download when files are present, and add curl retries
with explicit CA bundle for refresh runs.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Record timed samples (manual points or bone world projection), fade by
duration, and draw dotted trajectories via Graphics for animation FX.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* feat(particles): bind emitters to bones and emit from skinned mesh
Add ParticleEmitter Attach/SkinSource components so VFX can follow
AnimPose bones (with plane/scale projection) and sample CPU-skinned
vertices for character-surface effects. Expose AnimSkin skinned-position
cache to scripts and cover with unit tests.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(particles): use ComponentRef correctly for Attach/SkinSource
attach()/skinSource() return ecs::ComponentRef, not raw pointers.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* feat(animation): CPU skinning + CesiumMan download test
Add AnimSkin linear-blend skinning, ModelData bone/weight APIs, and a
network download script for Khronos CesiumMan used by animation.skinned
integration tests during unit_test builds.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(test): mount CesiumMan via physfs for skinned animation tests
Model3D loads through the VFS; use allowMountingForPath + mount like
ClassicScenes so CesiumMan.gltf resolves with its .bin sidecar.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Introduce Flex containers with gap, flexGrow, align, and justify so
toolbars and panels can lay out without manual SameLine, including
Spacer and script builder APIs.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* feat(graphics): add mipmap, anisotropic filtering, and mesh LOD
Enable texture LOD sampling with CPU-generated mip chains, sampler
anisotropy (when supported), and LOD bias via TextureCreateInfo /
TextureSampler. Cubemaps generate mips by default for IBL textureLod.
Renderable3D gains distance-based geometric LOD selection.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(graphics): avoid X11 None clash; link sndio on Linux
Rename MipmapMode::None to Disabled (X11 defines None), fix ComponentRef
usage in setMeshLod, and link libsndio for OpenAL on Linux builds.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(build): link sndio only when available on Linux
Unconditional -lsndio broke GitHub Actions Linux CI where libsndio is
not installed. Detect the library with find_library instead.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* ci: retrigger Linux check after optional sndio fix
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* feat(graphics): texture cell bombing to break tiling
Add UV-space cell bombing on the default mesh3d / clustered PBR paths:
per-cell random offset and rotation blended across a 2x2 neighborhood
(with textureGrad for stable mips). Opt-in via Renderable3D::setTexCellBomb
(strength 0 keeps prior behavior). Includes GLSL helper, SPIR-V embeds,
CPU reference header, docs, and smoke tests.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(graphics): rotate UVs in cell bombing; harden GPU test
Rotate UVs about each cell center (not just translate) so periodic
textures actually break tiling. Use the known-good UV cube + repeating
motif in the pixel smoke test.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>