TileRenderSystem::collect walks the global ECS, so leftover TileLayer
entities from earlier cases made tilesContributeDepthY (and dual-grid
depth sort) see extra draw items. Hide other layers first, matching
the rest of the map suite.
drawMeshShader always runs inside an open 3D pass, so lazily calling
vkCreateGraphicsPipelines for the xray variant crashed Lavapipe.
Create that pipeline with the shader (and recreate it on MSAA/RP
change) instead, and skip the draw if it is still missing.
Also refresh module counts after rebasing onto grid / buildingfx.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
Marks the architecture document as implemented, replaces the roadmap section
with what each step actually landed and the measured result, and regenerates
the module inventory against the post-change dependency graph (scene is L1 now,
gameplay modules no longer pull data, and each row names the first profile that
includes it).
Adds docs/usr/TRIMMING.md for the user-facing side: profiles, per-module
switches, how dependency closure and the configure-time conflict errors behave,
has_module() in scripts, what cannot be trimmed and why, and measured savings.
Linked from the user and developer indexes.
Headline numbers after S1-S6: dependency cycles 26 -> 0, layering back-edges
16 -> 3, JSON implementations 6 -> 1, modules using Poco 15 -> 9, boot scripts
2 -> 1, and any module trimmable on desktop where none were before.
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 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>