feat(art): add storybook meadow and woodland villagers

This commit is contained in:
Rijad Zuzo
2026-09-05 18:56:44 +02:00
parent 6aae41d36f
commit da3bed67a0
60 changed files with 1222 additions and 373 deletions
+19
View File
@@ -51,6 +51,25 @@ selection never forces unsupported volumetric fog on.
## Runtime hot paths already bounded
The woodland storybook art pass adds portable Blender animal meshes and an
opaque 35-triangle, seven-blade grass tuft. The existing camera-local grass
field and quality controls own its instance budget; four loaded path strips
provide disposable grass-clearance data after material isolation. Animal
appearance is derived from stable NPC IDs, shares mesh resources, and retains
profession tint, velocity-driven motion, inventory cues and death through the
existing presentation controllers. No saved state or navigation changes.
Characters and buildings use soft cel bands; tree crowns retain the shared
breeze with painted color patches. A static procedural cloud sky, cooler
ambient fill and warm sunlight follow the simulation day/night clock. The
cloud shader adds no volumetric pass, outline pass or screen-space postprocess.
See [the asset contract and rebuild commands](../assets/storybook/README.md).
`docs/baselines/storybook_*.png` records the native Metal review. The accompanying
`storybook_render_metrics.json` records a bounded local 1600×900 static-camera
sample on Apple M1 Max with six NPCs and High/Balanced/Low settings. Wall-frame
latency includes vsync and does not close the weak-PC evidence gap below.
- Player interaction and villager inspection probes are throttled/event-driven;
they no longer rebuild all candidate data every rendered frame.
- `LoadedResourceSpatialIndex` bounds finite-resource discovery.
Binary file not shown.

After

Width:  |  Height:  |  Size: 809 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 KiB

@@ -0,0 +1,34 @@
{
"renderer": "metal",
"resolution": "1600x900",
"samples": [
{
"active_npcs": 6,
"draw_calls": 702.0,
"frame_wall_p50_ms": 16.646,
"frame_wall_p95_ms": 16.903,
"objects": 1114.0,
"primitives": 684656.0,
"profile": "high"
},
{
"active_npcs": 6,
"draw_calls": 613.0,
"frame_wall_p50_ms": 16.665,
"frame_wall_p95_ms": 16.93,
"objects": 1031.0,
"primitives": 486192.0,
"profile": "balanced"
},
{
"active_npcs": 6,
"draw_calls": 592.0,
"frame_wall_p50_ms": 16.659,
"frame_wall_p95_ms": 16.989,
"objects": 999.0,
"primitives": 377596.0,
"profile": "low"
}
],
"workload": "Paused static valley; wall-frame latency includes vsync, not isolated GPU time"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB