84 lines
4.5 KiB
Markdown
84 lines
4.5 KiB
Markdown
# 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).
|