Files
gamedev-the-steward/assets/storybook/README.md
T

4.5 KiB
Raw Blame History

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:

"$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,88410,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

"$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. The exporter uses Blender's glTF export API.