Commit Graph
25 Commits
Author SHA1 Message Date
sunxfancy 2ef59e9091 test(graphics): planar reflection + optimize render-to-canvas readback
- graphics.water.render.planar (env-gated): render the scene from a mirror
  camera into an offscreen canvas via begin3DFrameToCanvas, then have the
  water plane sample it at screen UV. Confirms the mirror-camera capture
  (red box in the reflection canvas) and a coherent final frame (sky above,
  sky-reflecting water below).
- graphics.render3d.toCanvas: read the canvas once via newImageData instead of
  per-pixel getPixel (each getPixel did a waitIdle + full image copy + staging
  alloc, making the loop O(N) readbacks and looking like a hang).

The render-to-canvas path (already committed) is what makes this possible; the
offscreen render + subsequent present works once the readback is done once.
2026-08-16 16:05:34 +08:00
sunxfancy 166a956724 feat(graphics): render 3D scene into an offscreen Canvas (render-to-canvas)
Add begin3DFrameToCanvas / end3DFrameToCanvas on Graphics: open a 3D render
pass targeting an offscreen Canvas (color + D32 depth) at the canvas size,
using setMesh3DViewProj/View/CameraPos/Env as the camera. Rendered on a
dedicated command buffer and submitted directly to the graphics queue, so it
does not touch the swapchain / present flow. Enables render targets such as a
mirror-camera planar reflection (reflection captured, though compositing it
into a live scene is a follow-up).

Vulkan: offscreen3D render pass + mesh3d pipeline + pool/cb/fence, canvas
gets a depth attachment + color+depth framebuffer; currentPresentCb/frameToken
route to the offscreen cb during the pass. WebGPU: unsupported (throws).

Test: graphics.render3d.toCanvas renders a red box into a canvas and reads it
back to confirm the scene lands in the offscreen target.
2026-08-16 14:59:03 +08:00
sunxfancy 581193e622 test(graphics): drop planar-reflection demo (blocked by renderer limitation)
The engine's 3D path cannot render into a user Canvas (begin3DFrame refuses
while a Canvas is active), and 3D always targets the fixed-size scene-color
target, so a mirror-camera planar reflection into an offscreen texture is not
achievable without a renderer-level render-to-texture-with-custom-camera
feature. Remove the fragile demo that relied on double-rendering to screen +
scene-color capture (final present came out black). SSR (committed) and env
cubemap reflection remain the water reflection options.
2026-08-16 13:12:36 +08:00
sunxfancy badb0d945d feat(graphics): screen-space reflection pass + Water SSR integration
Add a screen-space reflection (SSR) fullscreen pass and hook it into the Water
shader as an optional, off-by-default reflection overlay.

- ScreenSpaceReflection: ray-marches the reflected ray over the lit scene color
  + hardware depth, reconstructing the world normal from depth (mirrors the
  SSGI pass). Outputs reflected color with A = hit validity into a canvas.
  Graphics::newScreenSpaceReflection() + script binding; quality knobs
  (strength/steps/stepLen/thickness/distance) and enabled toggle.
- Water::setScreenSpaceReflection(enabled, strength) + setViewport: the water
  shader samples the reflection texture (bound via the height slot, binding 6)
  at screen UV and blends it over the env-cubemap reflection. Off by default.
- New ssr.frag + compile script; vulkan SPIR-V regenerated.

Note: SSR reflects only geometry that is on-screen. For a horizontal water plane
viewed from above the reflected geometry sits in the void below the plane (no
depth there), so SSR finds no hits there; it works for on-screen-reflective
surfaces (glossy floors/walls, grazing water). Env-cubemap reflection remains
the default; SSR is additive when enabled.
2026-08-16 12:59:59 +08:00
sunxfancy 1d62dade5b fix(graphics): water ripples use a soft damped wavelet, not a hard ring
The middle-drop ripples were a hard-edged expanding ring (band ~0.055, radius
growing to cover half the plane), which read as an ugly big circle and did not
look like water. Replace with an expanding damped wavelet: a smooth gaussian
envelope times a crest+trough cosine, fading as it grows. Tune scene amplitudes
lower (wave 0.30, ripple 0.55) for calmer, more natural water.
2026-08-15 23:41:43 +08:00
sunxfancy fcac5f49fc test(graphics): water scene with visible gradient skybox
Render a proper skybox: a huge sphere centered on the camera (raised far
plane so it isn't clipped) shaded purely by the env cubemap, so the sky is
clearly visible behind the water plane. Use a vertical-gradient cubemap
(pale horizon -> deep blue zenith) instead of a flat blue. The frame now
reads as bright sky (top) over a sky-reflecting water plane (bottom), with
no dark background.
2026-08-15 23:36:16 +08:00
sunxfancy 92af87697f test(graphics): water scene uses a single flat plane, not tiled cubes
Replace the tiled-cube grid with one flat water plane carrying the water
shader (createPlane). A water surface is a plane; the cube tiling was
unnecessary. Renders brighter and cleaner (mean luma ~90, still strong
ripple/Fresnel variation) and fills the frame without block-gap gaps.
2026-08-15 23:30:21 +08:00
sunxfancy 30588901cd feat(graphics): raise sky-reflection baseline; add tiled-block water demo
- Boost the water shader's sky-reflection blend baseline so the surface
  clearly reflects the sky even at non-grazing angles (better first impression).
- Add an env-gated render test (EVENGINE_WATER_RENDER_PNG) that tiles a grid of
  unit-cube meshes, each carrying the water shader, and saves a PNG so the water
  scene can be previewed. The rendered frame reads as blue sky-reflected water
  with visible ripple/block variation (grid std ~53, mean luma ~73).
2026-08-15 22:51:48 +08:00
sunxfancy 55334b7009 feat(graphics): dynamic water shader with sky reflection + ripples
Add a Water helper (graphics/Water.{h,cpp}) built on the custom Mesh3D
shader path that renders a plane as dynamic water:

- Sky reflection: Fresnel-weighted reflection of the environment cubemap,
  blurred more at grazing angles; LOD clamped to available mip levels so a
  non-mipmapped env cubemap stays safe.
- Edge ripples: animated shore waves strongest near the water boundary and
  fading inward.
- Middle ripples: occasional expanding ring drops near the centre, staggered
  by an interval, fading over time.
- Sun glint from the primary directional light + soft foam at the edge.

Push-constant params drive time, wave speed/amplitude/scale, ripple
amplitude/count/interval, edge falloff, water color, reflection tint/intensity
and sun intensity. Exposed via Graphics::newWater() and the Squirrel binding
(Water class). Water::draw() plus mesh+shader accessors let it be attached to a
Renderable3D for the scene graph.

Tests: params round-trip and a GPU render test proving the water renders,
changes over time (dynamic ripples), and differs between flat and rippled
configurations. Verified no regression on procgen + graphics render tests.
2026-08-15 22:35:16 +08:00
西风逍遥游 91940965cb Merge branch 'main' into codex/procgen-bush-generator 2026-08-15 22:02:19 +08:00
西风逍遥游 720cbf75f6 Merge pull request #68 from EVEngine/feature/procedural-textures-pbr
feat(procgen): expand procedural textures + PBR material generation
2026-08-15 22:01:40 +08:00
西风逍遥游 d1a3e07e8d Merge branch 'main' into codex/procgen-skyscraper 2026-08-15 22:01:11 +08:00
西风逍遥游 72252ad218 procgen: add procedural 3D small bush (mesh.bush)
Add a deterministic low-poly small-bush recipe to procgen. It clusters
squashed foliage ellipsoids under a dome silhouette, adds emergent woody
twigs and optional leaf cards, using a two-region atlas (bark/foliage)
consistent with mesh.tree.

- src/modules/procgen/algorithms/BushMesh.{h,cpp}: recipe implementation
- MarchingCubes.cpp: register mesh.bush in MeshRecipeRegistry
- test/procgen.cpp: reproducibility/styles, option validation, render dump
- examples/bush-generator/: interactive showcase + Kenney CC0 mini-forest
  derived atlas with attribution
- docs/dev/程序化生成模块设计.md: document mesh.bush

Verified: procgen suite 57/57 passing, render dump produces 900x700 PNG.
2026-08-15 20:54:30 +08:00
sunxfancy d253dc5ab1 feat(procgen): expand procedural textures + PBR material generation
Add 10 new albedo texture recipes (rock, wood, ripple, cloth, ornament,
spot, zebra, wall, cement, mud) alongside the existing soil/stone/marble/
water/sky_cloud, and introduce full metallic-roughness PBR generation.

A texture is now described by a single TextureRecipeDef (albedo ramp +
displacement field + PBR knobs), so both an albedo ImageData recipe
(tex.*) and a complete PBR set (pbr.*: albedo/normal/roughness/metallic/
height/ao) are derived from the same pixel-aligned height field, with
seamless tiling support.

Expose generatePbrMaterial + pbr recipe listing on the Procgen module and
script bindings. Add tests for expanded recipes, PBR reproducibility,
map ranges, and module/error paths.
2026-08-15 20:51:29 +08:00
西风逍遥游 69909204c9 test(procgen): cover linear structure mesh recipes
Assert registration, per-kind validity (indices/normals/finite positions),
reproducibility, uniform scaling, linear vertex growth with segments, and
seam alignment (unit spans exactly [0, segLength]) for all six recipes.
2026-08-15 17:58:19 +08:00
西风逍遥游 a36b5837de feat(procgen): add procedural 3D skyscraper generator
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
2026-08-15 17:51:17 +08:00
西风逍遥游 5460b79412 Merge branch 'main' into codex/random-rock-generator 2026-08-15 14:22:35 +08:00
西风逍遥游 01223e1149 Merge branch 'main' into codex/hex-grid-planet 2026-08-15 13:19:27 +08:00
西风逍遥游 a1e7fffe99 feat(procgen): add hex-grid planet generator 2026-08-15 13:11:27 +08:00
西风逍遥游 3f3f01298d feat(procgen): add procedural tree generator 2026-08-15 12:41:06 +08:00
西风逍遥游 c0b2b125e5 feat(procgen): add random low-poly rock generator 2026-08-15 12:35:08 +08:00
西风逍遥游andCursor Agent 14fbf353af test(procgen): expand WFC / Marching Cubes coverage + scenarios (#47)
* test(procgen): expand WFC and Marching Cubes coverage

Add adjacency checks, error paths, MeshBuild accessors, raw density
cases, all field recipes, isolevel variation, and module API failures.

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

* test(procgen): add dungeon delve and crystal cave scenarios

Two cross-module simulations:
- WFC dungeon → TileLayer palette → A*/FlowField spawn→stairs
- Marching Cubes terrain island + crystal spheres with mesh budgets
  (optional GPU upload soft-skips without Vulkan surface)

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

* test(procgen): expand WFC/MC unit coverage and three scenarios

Add dungeon adjacency/multi-seed WFC checks, MC resolution/torus/volume
stability cases, plus cave expedition (A*+FOV), overworld biome travel,
and loot prop bake scenarios. Branch synced with main.

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-13 11:28:55 +08:00
西风逍遥游andCursor Agent 30c98b286f feat(procgen): add Wave Function Collapse and Marching Cubes (#33)
- wfc.simple: tiled WFC with dungeon/cave/terrain presets → Grid2D
- mesh.marchingcubes: Lorensen/Cline MC over sphere/torus/noise/terrain fields
- MeshBuild CPU mesh + Procgen buildMesh/generateMesh bindings
- Graphics::newMeshFromArrays for GPU upload
- tests, example keys 6–8, docs

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-11 20:41:43 +08:00
西风逍遥游 b9e3730072 feat(tests): enhance graphics tests with new rendering previews
- Added new test cases for various graphics functionalities, including animation previews, particle effects, and inventory UI.
- Implemented rendering previews for Mixamo animations, Box2D physics, and procedural generation, allowing for real-time visualization during tests.
- Introduced helper functions for drawing graphics elements, improving the clarity and maintainability of test code.
- Enhanced existing tests to utilize the new graphics capabilities, ensuring comprehensive coverage of rendering features.
2026-08-11 02:57:47 +08:00
西风逍遥游andCursor Agent 6f290b2a1d feat(procgen): 程序化生成模块 Phase A/B(地图 + 贴图) (#5)
* docs(procgen): add procedural generation module design

Capture confirmed product direction (runtime map-first, textures
second, pixel/low-poly RPG) plus API sketch, algorithm registry,
configurable outputs, and Phase A checklist.

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

* docs(procgen): list procgen in module summary table

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

* feat(procgen): Phase A runtime map generation with DTL

Add eve.Procgen module: semantic Grid2D, algorithm registry, palettes,
and TileLayer/JSON outputs. Built-ins use Dungeon Template Library
(BSP, cellular cave, maze, perlin terrain) plus local drunkard walk.
Includes tests and examples/procgen demo.

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

* feat(procgen): Phase B runtime pixel texture recipes

Add seamless value-noise texture generation with banded color ramps
for soil/stone/marble/water/sky_cloud, ImageData/Texture/normal outputs,
and script bindings for gfx.newTexture / drawTexturedRect.

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

* fix(test): qualify eve::image::ImageData in procgen tests

Bare image:: failed to resolve under `using namespace eve::procgen`,
breaking unit_test builds on Linux/Windows/macOS CI.

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

* fix(procgen): link EVProcgen in tests and fix Apple Clang DTL build

unit_test was missing EVProcgen, causing undefined references on Linux/Windows.
Avoid the DTL umbrella header (broken Voronoi CRTP on Apple Clang) and provide
DrawJagged* compat shims that define the missing drawOperatorArray.
Verified locally: linux-debug build, unit_test link, and all 13 procgen ctests.

Co-authored-by: 西风逍遥游 <sunxfancy@gmail.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-09 08:47:27 +08:00