# Woodland storybook art Original Blender models for The Steward's warm, painted animation direction. The runtime cast is a fox traveler, rabbit gardener, bespectacled badger and otter in oversized coats, scarves, boots and satchels. These are original characters, not models of existing film characters. `art/storybook/` contains the editable Blender 5.1 sources. Its `.gdignore` keeps Blender out of Godot's runtime import dependency chain. This directory contains portable GLBs and the extracted grass mesh consumed by Terrain3D. ## Rebuild From the project root, with Blender and Godot 4.7 installed: ```sh "$BLENDER_BIN" --background --python tools/art/build_storybook_assets.py "$GODOT_BIN" --headless --editor --path "$PWD" --import "$GODOT_BIN" --headless --path "$PWD" --script tools/import_storybook_grass.gd ``` On macOS the binaries used for this pass were `/Applications/Blender.app/Contents/MacOS/Blender` and `/Applications/Godot.app/Contents/MacOS/Godot`. Headless CI should use the isolated profile configured by `tools/quality.sh`. ## Mesh and material contract - The seven-blade meadow tuft has **35 triangles**, one surface, rooted Y=0, and UV.y=0 at each root / 1 at each tip. Wind and actor bending run on the GPU. The material is opaque and double-sided, with no alpha cards, texture lookups, per-blade nodes, shadow casting, or outline pass. - Terrain3D owns the existing nine camera-local emitter cells: 10,404 tuft slots on High, 5,184 on Balanced, hidden and stopped on Low. Terrain masks and distance fading further reduce visible grass. Four scene-derived path clearings collapse blades around the walking strips. Changing density does not alter the terrain, navigation, resource state or collision. - Each animal has eight mesh surfaces, **7,884–10,050 triangles** total, and vertex colors. `mesh_budget.json` is emitted by the Blender generator. Vertex alpha is a clothing tint mask; the cel shader never writes ALPHA. - `AnimalAppearance` derives NPC species from stable ID modulo four; the player is a fox. It shares imported meshes, creates an isolated material per actor and tints clothing from the existing profession definition. `Body`, `Head`, `Hair`, four limbs and `Tail` preserve the visual controllers' animation slots. Shoulder/hip pivots support the existing velocity-driven gait. Ears, face details, boots and scarves are joined into those surfaces. - Inventory sacks, carried logs, profession tools, task glyphs, trust reactions, death and player sword cues remain controlled by their existing state paths. Animal species here is appearance only: no animal simulation classification, RNG calls, saved fields, migration or gameplay mechanics are introduced. ## Review captures ```sh "$GODOT_BIN" --path "$PWD" --script tools/capture_storybook.gd -- --cast "$GODOT_BIN" --path "$PWD" --script tools/capture_storybook.gd ``` These require a real renderer. The first writes `storybook_cast.png`; the second captures the running main scene at a controlled daytime presentation, then writes gameplay/valley PNGs and a small profile sample to `docs/baselines/`. It pauses simulation only in the capture process and does not save anything. The gameplay camera defaults remain unchanged. The matched environment camera can also be captured with `tools/capture_jajce_lookdev.gd -- --hide-debug-labels --output=res://docs/baselines/storybook_after.png`. Profile samples are local wall-frame latency at a static camera with six NPC visuals, including vsync. They are not isolated GPU timings or weak-PC proof. The full macOS quality gate passed on Godot 4.7, including all scenarios, Compatibility profile checks and 180 GUT tests / 2,258 assertions. Native Metal captures were visually reviewed. The character shader also rendered on Compatibility, whose color/tonemapping differs substantially from Metal; the approved color reference is `storybook_cast.png` (Metal). Native Metal shutdown reports one `ParticlesShaderRD` / material Shader RID retained at exit. The identical diagnostic was reproduced by importing and running untouched commit `6aae41d` in a separate temporary directory. The existing headless gate allowlist was not changed. Import/startup diagnostics and the baseline comparison are in ignored `logs/quality/storybook-*.log`. Shader interfaces follow the official [Godot 4.7 spatial shader contract](https://docs.godotengine.org/en/4.7/tutorials/shaders/shader_reference/spatial_shader.html). The exporter uses Blender's [glTF export API](https://docs.blender.org/api/main/bpy.ops.export_scene.html).