Move the user-maintained VKBuilder from the third-party aggregate into external/ (git submodule), and relocate the third-party DungeonTemplateLibrary and Box3D from external/ into the third-party aggregate (previously pushed to EVEngine/third-party). Update .gitmodules, include paths, DTL/box3d build wiring, and docs.
Add 18 new MCP tools to the embedded McpServer so agents can drive
the live game beyond the debugger surface:
- scene/entity query + transform mutation
- procgen recipe enumeration, map grid generation, mesh build
- 2D physics world create/list/raycast/remove
- render status + frame screenshot (PNG)
- particle emitter spawn, audio master control
Tool handlers use ModuleManager to reach Scene/Procgen/Physics/
Graphics/Particles/Audio and degrade gracefully when a module is
not mounted. Extend the tools/list and unit-test coverage.
Add mesh.skyscraper recipe producing a deterministic setback-tiered tower
with a window grid and optional spire. Window quads are raised a thin lip
above each facade so openings read under directional lighting without
coplanar z-fighting.
- Register recipe in MeshRecipeRegistry
- Add topology/height/reproducibility unit tests
- Add render smoke test outputting out/skyscraper.png
- Add interactive example examples/skyscraper-generator/
- Update procgen and module design docs
- 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.
- Introduced CubeType to define block properties including texture mappings and orientation.
- Added CubeTypeRegistry for managing block types, including methods for adding and loading from JSON.
- Updated Voxel and VoxelWorld classes to utilize the new registry for voxel management.
- Enhanced GreedyMesher to resolve face textures based on the CubeTypeRegistry.
- Refactored existing methods to support the new block type system, ensuring backward compatibility with previous voxel ID handling.
- Added comprehensive tests for the new functionality, including multi-texture support and block type resolution.
- Updated documentation to reflect changes in voxel management and block type registration.
- Added setIcon and getIcon methods to the Window interface for managing application icons.
- Implemented setIcon in the SDL window class, ensuring compatibility with RGBA8 image formats.
- Introduced a new test case to validate icon setting and retrieval functionality.
- Updated documentation to reflect the new icon management features.
- 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>
Shadow ortho now uses the same Vulkan Y-flip as the camera, with nearest depth sampling so manual PCF does not invent false umbra. Tonemap only compresses HDR peaks, and scene sun intensity is no longer overwritten per config.
Co-authored-by: Cursor <cursoragent@cursor.com>
Record shadow and G-buffer into the in-flight swapchain command buffer, add Graphics::setVSync for IMMEDIATE present, and measure ClassicScenes FPS with image-audit snapshots.
Co-authored-by: Cursor <cursoragent@cursor.com>
* test(rpg): add village-defense cross-module simulation
Drive tilemap, sprite walk animation, tile/world/screen/cell
coordinate conversion, 2D normal litPath + optional GPU lighting,
buff/DOT combat, and building placement in one RPG scenario test.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* test(rpg): soft-skip GPU normal sample on software Vulkan ICDs
Lavapipe can return black Canvas pixels for lit2d; keep the optional
GPU normal-map check only when samples are non-zero.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.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>
* 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>
Add Erin Catto's Box3D (v0.1.0) as external/box3d and expose World3D,
Body3D, and Shape3D through Physics.newWorld3D, mirroring the existing
Box2D script API with meter-space coordinates, queries, and contact events.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* feat(physics): add interactive cloth and 2D fluid solvers
Extend the Physics module with Verlet cloth (pin/grab) and
double-density-relaxation fluid (emit/interact), plus Squirrel
bindings, tests, docs, and an examples/softbody demo.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(physics): improve cloth constraint solve and softbody tests
Apply full distance correction when one cloth particle is pinned, and
tighten unit tests around pin hold, free-fall, grab, and fluid behavior.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Add a voxel module that remeshes 32³ chunks into six face-direction
buffers of 32-bit packed rectangles (xyz+wh+tex), culls by frustum,
view range, and camera-facing normals, then draws via a new Vulkan
instanced unit-quad path (Graphics::drawVoxelFaceInstances).
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* feat(tests): classic scene flythroughs with render config switching
Add Cornell Box (committed), procedural metal/roughness chart, and
downloadable Sponza/DamagedHelmet tests that fly the camera while
cycling ambient, directional, shadows, point lights, and IBL.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* fix(tests): bake Assimp node transforms and light classic scenes
Apply scene-graph world matrices when spawning meshes, fix Cornell face
winding for inward normals, keep Sponza dielectric under missing MR
texture sampling, and link sndio when OpenAL builds that backend.
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
* docs(tests): note ClassicScenes coverage
Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Expand Theme into a full design-token set (palette, rounding, borders,
spacing, font scale) shared by dark/light presets. Add setTheme/getTheme
script APIs and apply tokens with DPI scale so geometry stays consistent
across theme switches.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Deleted several obsolete documentation files related to volumetric rendering, avatar dialogue, database module, and stylized rendering. These changes streamline the documentation and remove references to features that are no longer supported or relevant.
Introduce a comprehensive implementation plan for GPGPU backend abstraction, detailing the transition to backend-agnostic interfaces for ComputeShader, GpuBuffer, and Gpgpu. The plan outlines architecture, global constraints, file structure, and specific tasks for integrating Vulkan while maintaining API compatibility. This change aims to enhance modularity and facilitate future backend support.