Commit Graph
181 Commits
Author SHA1 Message Date
西风逍遥游 90b28f9fbc Merge pull request #205 from EVEngine/codex/crowd-flowfield
feat(crowd): flow-field pathfinding + boids crowd behavior module
2026-08-23 21:43:05 +08:00
sunxfancy fd5febe73e Merge remote-tracking branch 'origin/dev' into codex/dynamic-surface-fluid
# Conflicts:
#	docs/dev/images/surface-fluid-dynamic.png
#	docs/dev/specs/2026-08-23-surface-fluid-simulation.md
#	examples/surface-fluid-dynamic/README.md
#	examples/surface-fluid-dynamic/main.cpp
#	src/modules/fluids/Fluids.h
#	src/modules/fluids/SurfaceDropletSimulation.cpp
#	src/modules/fluids/SurfaceDropletSimulation.h
#	src/modules/fluids/SurfaceWetnessField.cpp
#	src/modules/fluids/SurfaceWetnessField.h
2026-08-23 20:27:50 +08:00
西风逍遥游 0387f7f14a Merge pull request #200 from EVEngine/codex/atmosphere-volumetric-clouds
Improve atmospheric day/night skies and add volumetric clouds
2026-08-23 20:05:09 +08:00
西风逍遥游 9d5e61fde8 feat(crowd): flow-field pathfinding + boids crowd behavior module
- CrowdField: Dijkstra integration field to continuous gradient flow
  field with bilinear sampling, terrain cost and multi-goal support
- Crowd: SOA simulation for massive crowds - flow/seek/boids/idle
  actions, turn-rate-limited heading, Boids separation/alignment/
  cohesion, wall penetration resolution, per-frame counting-sort
  spatial grid and overlap relaxation
- Squirrel API: eve.Crowd with batch getPositions/getHeadings
- example: examples/crowd (2000-agent marching / boids demo)
- tests: flow field correctness, turning, seek arrival, boids
  convergence, wall penetration, 20k-agent smoke + script round-trip
2026-08-23 19:17:12 +08:00
sunxfancy 60b01b6ce2 fix(fluids): stabilize surface simulation timesteps 2026-08-23 19:11:18 +08:00
sunxfancy e831797957 feat(fluids): bridge droplet caps into scene rendering 2026-08-23 19:07:05 +08:00
sunxfancy 7435721367 feat(fluids): build oriented droplet render instances 2026-08-23 18:58:29 +08:00
sunxfancy 27a44960e6 fix(fluids): render continuous identity-stable wet trails 2026-08-23 18:43:49 +08:00
sunxfancy f8ad9900bc fix(fluids): preserve sphere reference visuals 2026-08-23 18:35:14 +08:00
西风逍遥游 5841b84b2e Merge pull request #201 from EVEngine/codex/urban-procgen
feat(procgen): hierarchical parcel & street co-generation (EG 2024 urban modeling)
2026-08-23 18:25:40 +08:00
sunxfancy dd35636a9f feat(fluids): support droplets on dynamic surfaces 2026-08-23 18:01:44 +08:00
sunxfancy 6bdf4ef00c feat(fluids): support droplets on dynamic surfaces 2026-08-23 18:01:13 +08:00
西风逍遥游 8a53d9d8a6 feat(procgen): hierarchical parcel & street co-generation (EG 2024 urban modeling) 2026-08-23 17:47:19 +08:00
sunxfancy b152da9a1c feat(graphics): add procedural volumetric cloud rendering 2026-08-23 16:33:32 +08:00
西风逍遥游 e48551911f Merge pull request #194 from EVEngine/codex/cloth-simulation
feat(physics): 2D/3D cloth with self-collision, fold limits, body collision, and GPU backend
2026-08-23 16:19:33 +08:00
西风逍遥游 426059d299 Merge pull request #195 from EVEngine/codex/animskin-script-skinning-writeback
feat(animation): script-playable skeletal animation via AnimSkin writeback
2026-08-23 15:02:29 +08:00
西风逍遥游 c65daede2e feat(animation): script-playable skeletal animation via AnimSkin writeback
AnimSkin can now write CPU-skinning results back to the render mesh so skeletal animation actually plays from scripts:
- capture bind normals at fromModel and skin them per pose (updateSkinnedNormals / getSkinnedNormals, cofactor inverse-transpose + normalize)
- packed getSkinnedPositions() array getter, matching AnimLattice's script pattern
- one-call applyToMesh(gfx, mesh, pose): skin positions+normals then in-place gpu.updateMeshVertices
- Renderable3D.getMesh() script binding so createRenderable meshes are reachable
- Mesh::gpuVertexCount so getVertexCount() is correct for non-morph meshes (both backends)
- tests: packed positions == skinPositionsTo, normals follow pose and stay unit length, applyToMesh render test with in-place updates
- docs: animation/graphics user guides + design spec
2026-08-23 14:24:11 +08:00
西风逍遥游 188012ee47 feat(physics): 2D/3D cloth with self-collision, fold limits, body collision, and GPU backend
- Cloth3D: meter-space Verlet cloth with triangle-level self-collision, dihedral fold-angle limit, mass-proportional rigid-body collision, double-sided mesh rendering
- Cloth (2D): self-collision, fold-angle limit, mass-proportional body collision, Fluid-style interactAt
- ClothGPU: compute-shader Verlet + distance constraints (double-buffered Jacobi), overflow-free atomicExchange spatial-hash self-collision, Sequence single-submission per frame
- World/World3D point probes for particle-vs-body queries; Body3D::getMass; Squirrel bindings for all new APIs
- examples/softbody3d demo; softbody/softbody_gpu/physics_cloth tests; user/dev docs
2026-08-23 13:54:20 +08:00
西风逍遥游 0087072636 Merge pull request #192 from EVEngine/codex/fluid-surface-sim
feat(fluids): interactive surface fluid simulation with screen-space reconstruction
2026-08-23 13:02:57 +08:00
西风逍遥游 b5282e7c5b Merge pull request #191 from EVEngine/codex/interactive-snow
feat(snow): interactive snow — depth field + real displacement + POM detail + snowfall recovery
2026-08-23 13:02:45 +08:00
西风逍遥游 ffff64588c feat(decal): P1 full PBR channel blending with instanced decal layer
Completes the PBR surface-parameter layer: mesh3d.frag now blends normal / roughness / metallic / emissive (in addition to albedo) from the DecalLayer before lighting; decals are drawn as grouped instanced draws (112B per-instance SSBO, alpha-over non-premultiplied layer, per-decal uvRect/atlas + channel strengths + blend mode API); DecalManager gains frustum + distance culling and setUvRect/setTextures/setBlend; new headless readback readDecalLayerToImageData validates the pass without a swapchain. Fixes two Vulkan validation violations found by the layer (missing vertex/index binds on instanced draws, blend attachmentCount).
2026-08-23 00:52:26 +08:00
西风逍遥游 203c2a21e9 feat(fluids): Bingham yield stress and screen-space surface reconstruction
Phase 3 of the surface fluid simulation:
- Bingham yield stress in the CPU solver and integrate kernel: effective
  viscosity grows as local shear rate drops, so mud piles up and freezes
  instead of spreading like water.
- FluidSurfaceRenderer: screen-space fluid rendering pipeline (splat depth+
  thickness with atomic min/add, bilateral depth smoothing, view-space normal
  reconstruction from depth gradients, water/mud shading), mirrored 1:1 in
  FluidSsfKernels.h and driven through the gpgpu compute queue with a CPU
  fallback and PPM debug output.
- Script API: Fluids.newSurfaceRenderer + FluidSurface (render/setCamera/
  setMode/writePpm).
- Design + usage spec under docs/dev/specs.
- Tests: yield-stress freeze, SSF single-particle depth/normal/thickness,
  water-vs-mud shading, GPU SSF pipeline with PPM artifact (17 fluids cases).
2026-08-23 00:17:00 +08:00
西风逍遥游 7a11a9a638 docs(snow): user guide, module index and design notes 2026-08-22 23:49:21 +08:00
西风逍遥游 5c1ba73994 docs(decal): add decal system design spec 2026-08-22 23:28:58 +08:00
西风逍遥游 a6e9db4086 test(docs): expand map/rpg/building coverage matrix + accessor round-trips
Add §17b–§17d API detail tables to docs/dev/测试覆盖.md for map, rpg and
building (all rows now '已展开'), backed by a fresh audit of the existing
70+ map cases, 28 rpg cases and 15 building cases.

Fill the audit gaps with two compact accessor tests:
- map.path.accessorRoundTrips: diagonal, blockEmpty, cellCost getter,
  unblockGid/clearBlockedGids, invalidateCache, setBlocked/isWalkable.
- map.fov.accessorRoundTrips: cornerPeek, eyeOffset, cliffBlock,
  verticalRange, perceptionRadiusScale, revealerPosition3/perception,
  revealer count and unknown-id behavior.

Local win32-debug: map/map_fov/map_path bundles pass.
2026-08-22 17:13:22 +08:00
西风逍遥游 5624388f1c test(event): cover Event::wait with a pre-queued message
The blocking-wake path was already covered by event.workerPushWakesWait;
add the queued-message fast path (wait returns immediately). Update
docs/dev/测试覆盖.md §9: wait marked 已覆盖.
2026-08-22 14:05:43 +08:00
西风逍遥游 d995497842 Merge remote-tracking branch 'origin/dev' into codex/headless-tests-ci 2026-08-22 12:57:15 +08:00
西风逍遥游 ff77852fcd Merge pull request #176 from EVEngine/codex/thread-test-gaps
test(thread): close last API gaps + fix JobSystem use-after-free found by ASan
2026-08-22 12:56:46 +08:00
西风逍遥游 3e9d2814fa Merge pull request #171 from EVEngine/codex/cmdline-fixes
feat(cmdline): eve get/build 基于官方 release SDK,release CI 增加消费侧全链路验证
2026-08-22 12:38:40 +08:00
西风逍遥游 c47e061181 test(thread): cover Channel::demand and Thread::postMain
Fill the last thread-module API gaps: blocking demand() and cross-thread
postMain() into the Event queue (same-thread, empty-name throw, worker
thread). 46/46 thread bundle cases pass locally on win32-debug. Update
docs/dev/测试覆盖.md: thread row to '已展开' with a full API detail table.
2026-08-22 12:22:31 +08:00
西风逍遥游 2d079b39ef ci(linux): verify headless GPU tests run without Xvfb
Add a dedicated Linux step that runs the six headless GPU bundles
(graphics_font, TextureSampler, gpgpu, tensor, virtualgeometry_gpu,
graphics_headless) with no display server — proving the headless-vs-window
policy in docs/dev/测试覆盖.md §0. The regular xvfb run keeps covering the
full suite including windowed demo tests.
2026-08-22 11:54:15 +08:00
西风逍遥游 a7ec3938b7 test: adopt headless graphics for functional GPU tests, keep windowed demos
Introduce the headless-vs-window test policy (docs/dev/测试覆盖.md §0):
functional GPU tests run via Graphics::initHeadless + offscreen canvas
readback; visual/demo tests (ClassicScenes, RenderImageAudit, animation,
voxel, particles, UI, swapchain-readback cases) keep real windows.

Mechanics:
- Graphics::initHeadless is now re-entrant: the process-wide singleton
  updates the logical viewport on repeat calls instead of throwing, so
  multiple cases in a bundle can share one headless device.
- test/Fixtures.h adds openHeadlessGfx() and a useHeadless mode for
  GfxFixture; EVENGINE_TEST_VIEW_W/H overrides apply to both paths.

Migrated (window-free, no behavior change to assertions):
- test/graphics_font.cpp: atlas + print-to-canvas pixel readback; the
  interactive debug-preview loop is guarded by isHeadless().
- test/TextureSampler.cpp: sampler parameter round-trips.

graphics_headless.cpp now asserts the re-entrant resize semantics.
2026-08-22 11:12:43 +08:00
西风逍遥游 80aca00f67 Merge remote-tracking branch 'origin/dev' into codex/cmdline-fixes
# Conflicts:
#	src/engine/cmdline/Doc.cpp
2026-08-22 10:45:21 +08:00
西风逍遥游 55184c7e4a docs(release): document the consumer-side validation gates in the release flow 2026-08-22 10:38:12 +08:00
西风逍遥游 7437224c90 api(graphics): align C++/script names, validate sampler strings, document error contracts
- 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.
2026-08-22 02:30:12 +08:00
西风逍遥游 9b5d6f654d feat(common): expose Runtime reflection API to scripts as eve.reflect
Runtime::initialize() now adds an eve.reflect sub-table binding the reflection layer (classes/classInfo/scan/scripts, createInstance, inspect/read/write/readObject, array*/table* editing) so Squirrel tools and editors can introspect and edit script classes and instances with the same semantics as the C++ Runtime API.

Scalar reads/writes keep the slot's own type; container/instance slots are read as live script objects; mutators return false instead of throwing on missing or method members. Adds test/ReflectScript.cpp covering the full surface.
2026-08-21 23:26:47 +08:00
西风逍遥游 4fc5277ff1 Merge pull request #161 from EVEngine/codex/gpu-driven-rendering
GPU-driven rendering: bindless + indirect draw + GPU cull + visibility buffer/resolve + VirtualGeometry integration
2026-08-21 21:40:20 +08:00
西风逍遥游 453d33387f Merge remote-tracking branch 'origin/dev' into codex/gpu-driven-rendering
# Conflicts:
#	AGENTS.md
#	external/VKBuilder
#	src/modules/graphics/Graphics.h
#	src/modules/graphics/RenderControl.cpp
#	src/modules/graphics/RenderSystem3D.cpp
#	src/modules/graphics/vulkan/Graphics.cpp
#	src/modules/graphics/vulkan/Graphics.h
2026-08-21 20:45:42 +08:00
西风逍遥游 4c6f27d0f5 Merge pull request #158 from EVEngine/codex/runtime-inspector-mvvm
feat(ui): reflection-driven property inspector (MVVM DevTools)
2026-08-21 20:19:48 +08:00
西风逍遥游 11c6444853 Merge pull request #160 from EVEngine/codex/state-hot-reload
feat: state hot reload for scripts and state machines
2026-08-21 20:19:38 +08:00
西风逍遥游 54dea0d561 feat: state hot reload for scripts and state machines
Adds a capture -> reload -> restore pipeline so code/asset changes can be hot-applied without resetting running state:

- common: StateValue (JSON-compatible state tree) + IStateProvider capability interface.
- devtools: Snapshot v2 (script roots + native provider section, v1 compatible, strict rejection of non-data roots), ReloadSession (begin/commit/abort), eve.dev script API (stateRoots / beginStateReload / commitStateReload / abortStateReload).
- load.nut: three-phase soft reload (capture -> dofile -> restore) with migrate_instance / remap_instances helpers and eve_before_reload / eve_after_reload hooks.
- dialogue + AnimStateMachine: IStateProvider for phase/vars/rng and params/current state.
- animation: AnimClip::adopt + AnimClipRegistry + 'animclip' IAssetReloader so .eva content reloads keep clip identity.
- rpg + card: IStateProvider for casting/cooldowns and card phases.
- Tests: stateValue, snapshot v2/strict, reload script protocol, dialogue, animation state machine + reload, rpg/card state roundtrips.
2026-08-21 19:46:25 +08:00
西风逍遥游 4f527476fa Merge pull request #157 from EVEngine/codex/docs-user-docs-and-doxygen-sidebar
docs: rework user docs and rebuild the Doxygen sidebar
2026-08-21 18:47:15 +08:00
西风逍遥游 96dae32c38 feat(ui): DevTools panel suite - database grid, nested editing, scene tree, editor shell 2026-08-21 18:15:59 +08:00
西风逍遥游 06061d9d99 feat(ui): reflection-driven property inspector (MVVM DevTools) 2026-08-21 17:34:26 +08:00
西风逍遥游 d86f9eceec docs: rework user docs and rebuild the Doxygen sidebar
- Readme (zh/en): make "download prebuilt SDK, no build" the primary path for
  game developers; move build-from-source content under an engine-developers
  section.
- Rewrite docs/usr/README.md: download/run, capabilities, debugging,
  packaging, and a "things to keep in mind" section.
- Unify wording in MODULES/TRIMMING/dev docs and the SDK README.
- Replace the JS treeview with a plain-HTML static sidebar (home, user guide,
  module handbook grouped into 5 categories, API indexes) so docs navigate
  without JavaScript.
- Add a Doxygen landing page and page-hierarchy wrappers generated by
  docs/CMakeLists.txt; tune Doxyfile for the static layout.
2026-08-21 17:05:51 +08:00
西风逍遥游 5065d0a91b merge: integrate origin/dev (PR #134 JobSystem, #151-#154) into codex/framegraph-mt-render
dev is the repo's feature branch (main is release-gated to promote/docs PRs).
Resolved JobSystemThreadPool.cpp to our completeJob ordering (decrement
outstanding counters after fireCompletion/releaseDependents) — dev's merged
PR #134 version kept the pre-fix order that can reset the frame arena under a
still-running worker.
2026-08-21 12:57:16 +08:00
西风逍遥游 95b869cbbd merge: integrate origin/main (TU split, #129 perf, module decoupling) into codex/framegraph-mt-render
Port the deferred FrameGraph integration onto main's split Vulkan backend:
- Graphics3D.cpp owns buildDeferredFrameGraphs / recordDeferredFrameGraph /
  recordShadowCascadePass / recordGBufferPassDraws (parallel JobSystem
  recording, one command pool per frame-slot per pass).
- begin3DFrame / beginSwapchainRenderPass / flushToSwapchain 2D-only path
  call recordDeferredFrameGraph() instead of the serial pending passes.
- Drop the superseded serial recordPendingShadowPasses/GBufferPass and the
  duplicate culling implementation (main's RenderSystem3D already carries
  the per-camera / per-cascade frustum culling).
- VKBuilder submodule -> 51514d9 (master; our spec-safe pool/lifecycle PR
  was merged upstream as sunxfancy/VKBuilder#2).
2026-08-21 12:48:49 +08:00
西风逍遥游 0ca17b9a57 feat(render): enforce spec-safe parallel recording via per-pass command pools and RecordCycle lifecycle 2026-08-21 09:35:25 +08:00
西风逍遥游 d786e18fa9 feat(animation): add 3D lattice scale-deformer (AnimLattice)
CPU trilinear lattice deformation for procedural 3D scale/squash-stretch
animation: per-control-point scale + offset, model/array binding, deformed
position/normal cache, script API (anim.newLattice + AnimLattice class) and
gfx.newMeshFromArrays / gfx.updateMeshVertices script wrappers so scripts can
upload deformed meshes per frame. Includes unit tests and the
examples/lattice-deform demo.
2026-08-21 01:08:35 +08:00
西风逍遥游 d4936d12dc docs(framegraph): record parallel-recording verdict (driver-level AMDVLK crash)
TSan (WSL) proves the JobSystem + executor + framegraph planning are
data-race-free; on Windows the parallel record path AVs inside
amdvlk64.dll from vkb::FrameGraph::record's recordOne on two workers, and
still crashes after device->waitIdle() — an AMDVLK concurrent-recording
defect, not a pending-CB reuse issue. Engine keeps serial recording; the
executor stays available for drivers/CI builds that support it.
2026-08-21 00:35:47 +08:00