summer-engine 3.3.0 → 3.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +4 -2
- package/.codex-plugin/plugin.json +5 -3
- package/.cursor-plugin/plugin.json +4 -2
- package/.factory-plugin/plugin.json +4 -2
- package/.opencode/INSTALL.md +8 -8
- package/.opencode/plugins/summer.js +2 -2
- package/AGENTS.md +7 -7
- package/CHANGELOG.md +50 -0
- package/GEMINI.md +1 -1
- package/NOTICE +1 -1
- package/README.md +32 -35
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/run.sh +2 -2
- package/assets/navigation/web-routes.json +1 -1
- package/commands/gameskill.md +2 -2
- package/commands/summer.md +25 -25
- package/dist/cli/commands/install.d.ts +10 -0
- package/dist/cli/commands/install.js +55 -10
- package/dist/cli/commands/open.d.ts +1 -1
- package/dist/cli/commands/run.d.ts +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/skills.js +2 -2
- package/dist/cli/commands/tool.d.ts +7 -0
- package/dist/cli/commands/tool.js +36 -1
- package/dist/core/api-client.d.ts +5 -6
- package/dist/core/api-client.js +12 -15
- package/dist/core/auth.js +2 -2
- package/dist/core/capabilities/asset-import.d.ts +0 -1
- package/dist/core/capabilities/camera-view.d.ts +1 -1
- package/dist/core/capabilities/camera-view.js +2 -2
- package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
- package/dist/core/capabilities/capture-gameplay.js +283 -0
- package/dist/core/capabilities/connect-signal.d.ts +1 -2
- package/dist/core/capabilities/connect-signal.js +1 -2
- package/dist/core/capabilities/console-read.d.ts +2 -2
- package/dist/core/capabilities/console-read.js +2 -2
- package/dist/core/capabilities/creator.js +1 -1
- package/dist/core/capabilities/doctor.d.ts +9 -1
- package/dist/core/capabilities/doctor.js +47 -4
- package/dist/core/capabilities/engine-receipt.d.ts +5 -7
- package/dist/core/capabilities/engine-receipt.js +7 -9
- package/dist/core/capabilities/engine-run.d.ts +4 -0
- package/dist/core/capabilities/engine-run.js +33 -5
- package/dist/core/capabilities/export-engine-version.d.ts +15 -0
- package/dist/core/capabilities/export-engine-version.js +24 -0
- package/dist/core/capabilities/export-game.d.ts +9 -1
- package/dist/core/capabilities/export-game.js +115 -39
- package/dist/core/capabilities/export-presets.d.ts +1 -1
- package/dist/core/capabilities/export-presets.js +1 -1
- package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
- package/dist/core/capabilities/fabricate-mesh.js +2 -3
- package/dist/core/capabilities/frame-quality.d.ts +4 -4
- package/dist/core/capabilities/frame-quality.js +4 -4
- package/dist/core/capabilities/grep.d.ts +1 -1
- package/dist/core/capabilities/grep.js +1 -1
- package/dist/core/capabilities/image-generation.d.ts +9 -0
- package/dist/core/capabilities/image-generation.js +19 -1
- package/dist/core/capabilities/navigation/open.d.ts +1 -1
- package/dist/core/capabilities/navigation/open.js +1 -1
- package/dist/core/capabilities/navigation/render-product-map.js +1 -1
- package/dist/core/capabilities/navigation/targets.js +2 -2
- package/dist/core/capabilities/placement-batch.d.ts +1 -1
- package/dist/core/capabilities/placement-batch.js +2 -2
- package/dist/core/capabilities/play-determinism.d.ts +1 -1
- package/dist/core/capabilities/play-determinism.js +1 -1
- package/dist/core/capabilities/publish-build.d.ts +15 -2
- package/dist/core/capabilities/publish-build.js +78 -28
- package/dist/core/capabilities/publish-download.d.ts +1 -2
- package/dist/core/capabilities/publish-download.js +2 -3
- package/dist/core/capabilities/replace-node.d.ts +1 -3
- package/dist/core/capabilities/replace-node.js +1 -3
- package/dist/core/capabilities/runtime-control.d.ts +5 -7
- package/dist/core/capabilities/runtime-control.js +7 -9
- package/dist/core/capabilities/scene-batch.d.ts +1 -1
- package/dist/core/capabilities/scene-batch.js +1 -1
- package/dist/core/capabilities/scene-kind.js +1 -1
- package/dist/core/capabilities/scene-readback.d.ts +3 -4
- package/dist/core/capabilities/scene-readback.js +3 -4
- package/dist/core/capabilities/scene-script.d.ts +2 -2
- package/dist/core/capabilities/scene-script.js +2 -2
- package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
- package/dist/core/capabilities/seeing/shot-store.js +1 -1
- package/dist/core/capabilities/summer-bundle.d.ts +2 -3
- package/dist/core/capabilities/summer-bundle.js +2 -3
- package/dist/core/capabilities/surface-snap.d.ts +1 -1
- package/dist/core/capabilities/surface-snap.js +1 -1
- package/dist/core/capabilities/tool-dispatch.js +11 -1
- package/dist/core/capabilities/ui-control.d.ts +1 -2
- package/dist/core/capabilities/ui-control.js +1 -2
- package/dist/core/capabilities/world-snapshot.d.ts +1 -1
- package/dist/core/capabilities/world-snapshot.js +1 -1
- package/dist/core/capability-skew.d.ts +2 -3
- package/dist/core/capability-skew.js +4 -5
- package/dist/core/config.js +2 -2
- package/dist/core/engine-install.d.ts +16 -0
- package/dist/core/engine-install.js +32 -2
- package/dist/core/feedback/client.js +1 -1
- package/dist/core/hosted-mcp.d.ts +115 -0
- package/dist/core/hosted-mcp.js +164 -0
- package/dist/core/launch-posture.d.ts +6 -3
- package/dist/core/launch-posture.js +18 -5
- package/dist/core/library-read.js +1 -2
- package/dist/core/templates.d.ts +1 -2
- package/dist/core/templates.js +1 -2
- package/dist/mcp/hosted-mount.d.ts +13 -59
- package/dist/mcp/hosted-mount.js +24 -30
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +5 -4
- package/dist/mcp/tools/creator-tools.js +14 -4
- package/dist/mcp/tools/debug-tools.js +1 -1
- package/dist/mcp/tools/generate-tools.js +19 -9
- package/dist/mcp/tools/navigation-tools.d.ts +1 -1
- package/dist/mcp/tools/navigation-tools.js +1 -1
- package/dist/mcp/tools/spatial-tools.js +1 -1
- package/dist/mcp/tools/visual-tools.js +2 -2
- package/dist/mcp/tools/with-engine.d.ts +1 -2
- package/dist/mcp/tools/with-engine.js +1 -2
- package/gemini-extension.json +3 -1
- package/hooks/session-start.sh +2 -2
- package/integrations/README.md +70 -76
- package/integrations/claude/README.md +0 -3
- package/integrations/codex/README.md +1 -2
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/cursor/README.md +1 -2
- package/integrations/factory/README.md +15 -11
- package/integrations/mistral-vibe/README.md +1 -1
- package/integrations/opencode/README.md +1 -1
- package/integrations/roo-code/README.md +1 -1
- package/integrations/rovo-dev/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/windsurf/README.md +3 -3
- package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
- package/library/references/gd-style/gd-style.md +4 -6
- package/library/references/godot-version/godot-version.md +3 -3
- package/library/references/headless-routing/headless-routing.md +2 -2
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
- package/library/references/product-map/product-map.md +1 -1
- package/library/references/public-surface-language/public-surface-language.md +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +4 -4
- package/library/skills/README.md +11 -9
- package/library/skills/adaptive-music/SKILL.md +7 -7
- package/library/skills/ai-characters-in-games/SKILL.md +1 -1
- package/library/skills/ambient-bed/SKILL.md +12 -14
- package/library/skills/animated-loop/SKILL.md +42 -42
- package/library/skills/animation-tree/SKILL.md +6 -6
- package/library/skills/art-direction/SKILL.md +8 -11
- package/library/skills/asset-strategy/SKILL.md +3 -3
- package/library/skills/audio-direction/SKILL.md +8 -10
- package/library/skills/auto-fire-targeting/SKILL.md +4 -3
- package/library/skills/bounded-engine-runs/SKILL.md +95 -0
- package/library/skills/bounded-engine-runs/resource.yaml +29 -0
- package/library/skills/brainstorm-game/SKILL.md +5 -5
- package/library/skills/brainstorming/SKILL.md +9 -15
- package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +2 -2
- package/library/skills/character-model/SKILL.md +15 -26
- package/library/skills/character-movement/SKILL.md +1 -1
- package/library/skills/character-movement/references/movement-3d.md +1 -1
- package/library/skills/character-portrait/SKILL.md +4 -4
- package/library/skills/cinematic-cutscene/SKILL.md +38 -38
- package/library/skills/combat-basics/SKILL.md +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
- package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
- package/library/skills/concept-art/SKILL.md +4 -4
- package/library/skills/create-asset-sheet/SKILL.md +12 -31
- package/library/skills/debug/SKILL.md +5 -4
- package/library/skills/debugging-game-feel/SKILL.md +1 -4
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +5 -5
- package/library/skills/design-mechanic/SKILL.md +6 -6
- package/library/skills/design-npc/SKILL.md +8 -15
- package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
- package/library/skills/environment-kit/SKILL.md +5 -5
- package/library/skills/export-and-ship/SKILL.md +25 -24
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +5 -5
- package/library/skills/fps-controller/SKILL.md +17 -16
- package/library/skills/fps-controller/resource.yaml +0 -2
- package/library/skills/game-feel/SKILL.md +6 -7
- package/library/skills/gameskill/SKILL.md +3 -3
- package/library/skills/gdscript-patterns/SKILL.md +3 -3
- package/library/skills/generate-motion/SKILL.md +5 -22
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
- package/library/skills/headless-scripting/SKILL.md +8 -8
- package/library/skills/headless-scripting/resource.yaml +1 -0
- package/library/skills/in-game-purchases/SKILL.md +123 -118
- package/library/skills/in-game-purchases/resource.yaml +2 -2
- package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
- package/library/skills/investigating-bugs/SKILL.md +3 -11
- package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
- package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
- package/library/skills/make-game/SKILL.md +3 -5
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/multiplayer-project/SKILL.md +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +4 -4
- package/library/skills/music-track/SKILL.md +40 -38
- package/library/skills/new-project/SKILL.md +4 -6
- package/library/skills/organic-model/SKILL.md +9 -9
- package/library/skills/pixel-art/SKILL.md +6 -6
- package/library/skills/play/SKILL.md +3 -4
- package/library/skills/playtesting-a-feature/SKILL.md +4 -6
- package/library/skills/procedural-animation/SKILL.md +10 -11
- package/library/skills/prop-model/SKILL.md +4 -4
- package/library/skills/psx-retro-rendering/SKILL.md +20 -20
- package/library/skills/psx-retro-rendering/resource.yaml +2 -3
- package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
- package/library/skills/remote-deploy/SKILL.md +20 -21
- package/library/skills/retarget/SKILL.md +19 -23
- package/library/skills/running-in-the-cloud/SKILL.md +5 -5
- package/library/skills/scene-composition/SKILL.md +5 -5
- package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
- package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
- package/library/skills/scene-scripting/SKILL.md +3 -3
- package/library/skills/scene-to-level/SKILL.md +28 -31
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +9 -9
- package/library/skills/skill-test/SKILL.md +10 -10
- package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
- package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
- package/library/skills/skybox-panorama/SKILL.md +8 -9
- package/library/skills/sound-effect/SKILL.md +19 -19
- package/library/skills/spatial-placement/SKILL.md +2 -2
- package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
- package/library/skills/sprite-sheet/SKILL.md +10 -10
- package/library/skills/summer-analytics/SKILL.md +3 -3
- package/library/skills/summer-friends/SKILL.md +10 -10
- package/library/skills/summer-leaderboards/SKILL.md +6 -6
- package/library/skills/summer-match-results/SKILL.md +13 -13
- package/library/skills/summer-matchmaking/SKILL.md +11 -11
- package/library/skills/summer-parties/SKILL.md +9 -9
- package/library/skills/summer-player-data/SKILL.md +12 -12
- package/library/skills/summer-store/SKILL.md +6 -6
- package/library/skills/summer-world-chat/SKILL.md +9 -9
- package/library/skills/summer-world-saves/SKILL.md +7 -7
- package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +36 -36
- package/library/skills/tune-performance/SKILL.md +13 -13
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +7 -7
- package/library/skills/use-widget-asset/SKILL.md +7 -7
- package/library/skills/using-summer/SKILL.md +5 -7
- package/library/skills/vehicle-model/SKILL.md +6 -7
- package/library/skills/vehicle-model/resource.yaml +2 -2
- package/library/skills/verification-before-completion/SKILL.md +5 -6
- package/library/skills/vfx-dissolve/SKILL.md +4 -4
- package/library/skills/vfx-fire/SKILL.md +6 -6
- package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-hit-spark/SKILL.md +4 -4
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/SKILL.md +5 -5
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-magic-glow/SKILL.md +4 -4
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-smoke/SKILL.md +5 -5
- package/library/skills/vfx-water-ripple/SKILL.md +2 -2
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/voice-line/SKILL.md +9 -9
- package/library/skills/web-compatibility-look/resource.yaml +1 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
- package/library/skills/writing-plans/SKILL.md +4 -4
- package/library/skills/writing-skills/SKILL.md +8 -8
- package/library/tools/capture-gameplay/resource.yaml +73 -0
- package/library/tools/creator-publish/resource.yaml +4 -4
- package/library/tools/creator-releases/resource.yaml +5 -5
- package/library/tools/generate-image/resource.yaml +15 -1
- package/library/tools/publish-build/resource.yaml +6 -2
- package/package.json +1 -1
- package/registry/generated/aliases.json +1 -0
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +3 -1
- package/registry/generated/index.json +248 -135
- package/registry/generated/marketplace.claude.json +2 -2
- package/registry/generated/plugin.claude.json +4 -2
- package/registry/generated/plugin.codex.json +5 -3
- package/registry/generated/plugin.cursor.json +4 -2
- package/registry/generated/plugin.factory.json +4 -2
- package/registry/generated/skills-index.md +11 -9
- package/registry/generated/skills-registry.json +33 -6
- package/registry/schemas/domains.json +1 -1
|
@@ -13,13 +13,13 @@ tags:
|
|
|
13
13
|
confidence: extracted
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
# Single-Image → Editable Scene Reconstruction (Lumera-style) in
|
|
16
|
+
# Single-Image → Editable Scene Reconstruction (Lumera-style) in Summer Engine
|
|
17
17
|
|
|
18
18
|
## Outcome
|
|
19
19
|
|
|
20
|
-
Turn one reference image into an **editable, engine-native scene** in
|
|
20
|
+
Turn one reference image into an **editable, engine-native scene** in Summer Engine: individual `MeshInstance3D` objects with transforms, countable parametric light nodes, and an HDR environment probe — not a fused point cloud, Gaussian splat, or baked texture. This adapts the Lumera pipeline (arXiv:2607.20889, Tsinghua AIRSUN lab), which was built on another engine, to Summer Engine.
|
|
21
21
|
|
|
22
|
-
**
|
|
22
|
+
**Caveat:** Lumera has no public code, and the paper lists engine-portable extraction as future work. This skill documents the architecture and the parts an agent can build in Summer Engine today (assembly, scene representation, refinement loop, evaluation), and flags the parts that require external model components (VLM box/light parsers, per-object mesh generator, HDR estimator).
|
|
23
23
|
|
|
24
24
|
## When to Use
|
|
25
25
|
|
|
@@ -44,11 +44,11 @@ Lumera's stages (from paper abstract + appendices):
|
|
|
44
44
|
3. **Per-object mesh reconstruction** — a mesh per parsed box.
|
|
45
45
|
4. **HDR environment estimation** — environment probe (IntrinsicHDR partially compensates for SkyLight/unseen near-camera lights).
|
|
46
46
|
5. **Bounded agentic refinement loop** — dual-agent (geometry stage, then light stage) edits + verifies against the reference image.
|
|
47
|
-
6. **Assembly** — emit engine-native scene (
|
|
47
|
+
6. **Assembly** — emit an engine-native scene (`.tscn` in Summer Engine).
|
|
48
48
|
|
|
49
|
-
Dataset backing it: Lumera-2K, 2,513
|
|
49
|
+
Dataset backing it: Lumera-2K, 2,513 game-engine projects → 3.73M components, 63M object instances, 102.6K parametric lights, 95.1K camera views.
|
|
50
50
|
|
|
51
|
-
## Scene / Node Shape (
|
|
51
|
+
## Scene / Node Shape (Summer Engine target)
|
|
52
52
|
|
|
53
53
|
The assembly stage should emit this node tree so output stays inspectable/editable:
|
|
54
54
|
|
|
@@ -65,10 +65,10 @@ ReconstructedScene (Node3D)
|
|
|
65
65
|
├── OmniLight3D / SpotLight3D / DirectionalLight3D × M
|
|
66
66
|
│ # position/rotation from (x,y,z); color from (r,g,b);
|
|
67
67
|
│ # light_energy from I (mind log-scale calibration, see Tunables)
|
|
68
|
-
└── (
|
|
68
|
+
└── (the sky-light equivalent is carried by WorldEnvironment)
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
Keep objects and lights as **separate siblings under named containers
|
|
71
|
+
Keep objects and lights as **separate siblings under named containers**. That separation is what makes the scene editable rather than just looking 3D.
|
|
72
72
|
|
|
73
73
|
## Implementation Steps
|
|
74
74
|
|
|
@@ -97,15 +97,15 @@ Add a **repair layer** on ingest: drop/fix invalid labels, non-positive sizes, d
|
|
|
97
97
|
|
|
98
98
|
### 2. Box + light parsing (external VLM components)
|
|
99
99
|
|
|
100
|
-
Lumera-Box/Lumera-Light are VLMs SFT'd on Lumera-2K; there is no public checkpoint. Options: use a hosted VLM prompted to emit the JSON tuples above, or fine-tune an open VLM on your own engine-exported scenes (
|
|
100
|
+
Lumera-Box/Lumera-Light are VLMs SFT'd on Lumera-2K; there is no public checkpoint. Options: use a hosted VLM prompted to emit the JSON tuples above, or fine-tune an open VLM on your own engine-exported scenes (`.tscn` scenes are text and easy to export; this is the "build Lumera-2K for your engine" step the paper identifies as missing for other engines).
|
|
101
101
|
|
|
102
102
|
### 3. Per-object mesh generation + HDR environment estimation
|
|
103
103
|
|
|
104
|
-
Also external model components in Lumera (per-object mesh reconstruction; IntrinsicHDR-style environment estimation). For a
|
|
104
|
+
Also external model components in Lumera (per-object mesh reconstruction; IntrinsicHDR-style environment estimation). For a Summer Engine blockout you can substitute: box mesh (`BoxMesh` sized to the parsed box) per object and a generated/estimated panorama `Sky`. Swap in real reconstructed meshes later without changing the schema.
|
|
105
105
|
|
|
106
106
|
### 4. Assembly: write a `.tscn`
|
|
107
107
|
|
|
108
|
-
Deterministic GDScript/tool script: instantiate the node shape above from the repaired records.
|
|
108
|
+
Deterministic GDScript/tool script: instantiate the node shape above from the repaired records. A `.tscn` is text, so generating it directly keeps the output diffable and versionable. Save with `PackedScene.pack()` / `ResourceSaver.save()` from an editor tool.
|
|
109
109
|
|
|
110
110
|
### 5. Bounded dual-agent refinement loop
|
|
111
111
|
|
|
@@ -148,17 +148,17 @@ Reproduce the paper's metrics on held-out scenes so improvements are measurable:
|
|
|
148
148
|
- **Per-light localization is weak** (F1 0.209 @ 0.5 m) while scene-level light *count* recall is strong (0.998). Frame the output as "right number of lights, roughly right places."
|
|
149
149
|
- **SkyLight / near-camera lights whose source is off-screen** are not supervised; the environment probe (IntrinsicHDR) only partially compensates.
|
|
150
150
|
- **Large outdoor scenes drift geometrically** (~17 m Chamfer-L2); consider joint camera+geometry calibration if you need metric outdoor consistency.
|
|
151
|
-
- **Engine conventions don't transfer for free
|
|
151
|
+
- **Engine conventions don't transfer for free.** The dataset's light conventions come from another engine; Summer Engine's light units and probes differ, so recalibrate intensity and validate the representation on Summer-native scenes.
|
|
152
152
|
|
|
153
153
|
## Verification
|
|
154
154
|
|
|
155
|
-
Not
|
|
155
|
+
Not yet verified in Summer Engine. To validate an implementation:
|
|
156
156
|
|
|
157
157
|
1. Assemble a scene from a test image; confirm the `.tscn` contains separate, selectable `MeshInstance3D`s and light nodes (editability check).
|
|
158
158
|
2. Move/replace one mesh and re-tune one light in the editor without breaking the scene.
|
|
159
|
-
3. Run the evaluation harness (§6) against a held-out set of known
|
|
159
|
+
3. Run the evaluation harness (§6) against a held-out set of known scenes and compare to the reference numbers above.
|
|
160
160
|
4. Confirm the refinement loop terminates within `T_g`/`T_l` and the history window never exceeds the VLM context budget.
|
|
161
161
|
|
|
162
162
|
## Confidence
|
|
163
163
|
|
|
164
|
-
`extracted` — Architecture, metrics, refinement-loop design, and limitations are drawn directly from the arXiv paper (abstract, intro, appendices H.7–I as retrieved; middle method sections were truncated and are not documented here) and the author's announcement post. The
|
|
164
|
+
`extracted` — Architecture, metrics, refinement-loop design, and limitations are drawn directly from the arXiv paper (abstract, intro, appendices H.7–I as retrieved; middle method sections were truncated and are not documented here) and the author's announcement post. The Summer Engine node mapping and GDScript schema are adaptations, not from the sources; no public Lumera code exists to reference.
|
|
@@ -10,7 +10,6 @@ use_when:
|
|
|
10
10
|
do_not_use_when:
|
|
11
11
|
- "you only need a visual backdrop (a splat or depth-mesh bake is cheaper), large unbounded outdoor scenes, or exact light positions and intensities"
|
|
12
12
|
- "Lumera itself has no public code; the VLM box/light parsers, per-object mesh generator, and HDR estimator are external components you must supply"
|
|
13
|
-
- "intake from the gamedev-knowledge pipeline (source-cited, pipeline-validated, not yet exercised in-engine by the Summer team) — verify results in the engine as you would any technique"
|
|
14
13
|
facets:
|
|
15
14
|
lifecycle:
|
|
16
15
|
- build
|
|
@@ -40,9 +40,9 @@ Distilled blueprints for common genres live in this skill's `references/` folder
|
|
|
40
40
|
| Third-person action / 3D platformer | `references/3d-third-person.md` | `references/3d-third-person-systems.md` | Node3D / CharacterBody3D / SpringArm3D |
|
|
41
41
|
| First-person horror | `references/3d-horror.md` | `references/3d-horror-systems.md` | Node3D / CharacterBody3D / Camera3D on Head |
|
|
42
42
|
|
|
43
|
-
No playbook (racing, sandbox, sim): build fresh through the phases below. The playbooks lean on these system skills — load one when its mechanic comes up: `character-movement`, `camera-rigs`, `combat-basics`, `save-load`, `ui-basics`, `
|
|
43
|
+
No playbook (racing, sandbox, sim): build fresh through the phases below. The playbooks lean on these system skills — load one when its mechanic comes up: `character-movement`, `camera-rigs`, `combat-basics`, `save-load`, `ui-basics`, `multiplayer-project`.
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
These rules from the playbooks apply to every genre:
|
|
46
46
|
|
|
47
47
|
- **2D scales to the viewport.** Set `display/window/stretch/mode = canvas_items` and `stretch/aspect = expand`; UI uses Control anchors; code-positioned nodes compute from `get_viewport_rect().size`. Never hardcode 1920x1080.
|
|
48
48
|
- **Playable slice, not tech demo.** Name the core loop in one sentence; every input gets feedback (tween, sound, particle, flash, shake); progression is visible; a restart exists. The bar is "feels good for 30 seconds".
|
|
@@ -198,7 +198,7 @@ Repeat until every mechanic in the plan is implemented OR the user calls cut.
|
|
|
198
198
|
Skill: art-direction
|
|
199
199
|
```
|
|
200
200
|
|
|
201
|
-
That writes `.summer/art-bible.md` if it doesn't exist, then guides the lighting / material / palette pass. Use `3d-lighting` for the actual scene work.
|
|
201
|
+
That writes `.summer/art-bible.md` if it doesn't exist, then guides the lighting / material / palette pass. Use `3d-lighting` for the actual scene work. For the web, check the target first. A summer.games web build (`summer_export_game` with `targets:["web"]`) runs on Summer's WebGPU template, which needs the Forward+ or Mobile renderer. A WebGL 2 target runs the Compatibility renderer only: follow `web-compatibility-look` there, avoid Forward+-only features (SDFGI, SSAO, SSR, volumetric fog), and keep `rendering/renderer/rendering_method` on `gl_compatibility`.
|
|
202
202
|
|
|
203
203
|
```
|
|
204
204
|
Skill: audio-direction
|
|
@@ -277,8 +277,6 @@ By the end of a successful run, the user has:
|
|
|
277
277
|
- `summer_get_diagnostics` returns clean
|
|
278
278
|
- `summer_play` runs end-to-end and the win condition is reachable
|
|
279
279
|
|
|
280
|
-
That's a real game. Not a half-finished prototype.
|
|
281
|
-
|
|
282
280
|
## Closing line
|
|
283
281
|
|
|
284
282
|
When all phases are done:
|
|
@@ -56,7 +56,7 @@ separate Area under the player masking only the Enemies layer.
|
|
|
56
56
|
|
|
57
57
|
## Building the level with a TileMap
|
|
58
58
|
|
|
59
|
-
Use a `TileMapLayer`
|
|
59
|
+
Use a `TileMapLayer` for the solid world. Create a `TileSet`, paint
|
|
60
60
|
the collision polygon on the solid tiles, put the layer on the World collision
|
|
61
61
|
layer. The player collides with it for free - no per-tile StaticBody.
|
|
62
62
|
|
|
@@ -476,7 +476,7 @@ Import once so new scripts register, then start two players.
|
|
|
476
476
|
With the Summer MCP tools:
|
|
477
477
|
|
|
478
478
|
```
|
|
479
|
-
summer_project_setting
|
|
479
|
+
summer_project_setting key="summer/local_play/players" value=2
|
|
480
480
|
summer_play
|
|
481
481
|
summer_get_diagnostics
|
|
482
482
|
summer_stop
|
|
@@ -26,7 +26,7 @@ Pick whichever the session has.
|
|
|
26
26
|
**Summer MCP tools** (they set project settings, then play):
|
|
27
27
|
|
|
28
28
|
```
|
|
29
|
-
summer_project_setting
|
|
29
|
+
summer_project_setting key="summer/local_play/players" value=2
|
|
30
30
|
summer_play
|
|
31
31
|
summer_get_diagnostics
|
|
32
32
|
summer_stop
|
|
@@ -59,9 +59,9 @@ Loopback has no latency, so it hides every timing bug. Always run once with
|
|
|
59
59
|
these settings; they apply to every client:
|
|
60
60
|
|
|
61
61
|
```
|
|
62
|
-
summer_project_setting
|
|
63
|
-
summer_project_setting
|
|
64
|
-
summer_project_setting
|
|
62
|
+
summer_project_setting key="summer/local_play/network/round_trip_msec" value=100
|
|
63
|
+
summer_project_setting key="summer/local_play/network/jitter_msec" value=10
|
|
64
|
+
summer_project_setting key="summer/local_play/network/loss_percent" value=1
|
|
65
65
|
```
|
|
66
66
|
|
|
67
67
|
Or put them in `project.godot` while testing:
|
|
@@ -13,7 +13,7 @@ paths: ["audio/music/**", "scripts/**", "**/*.tscn"]
|
|
|
13
13
|
|
|
14
14
|
## Overview
|
|
15
15
|
|
|
16
|
-
ElevenLabs Music renders a track from a prompt. Summer clamps the requested length to **3–600 seconds** before sending it, so anything outside that range is silently pulled to the nearest bound.
|
|
16
|
+
ElevenLabs Music renders a track from a prompt. Summer clamps the requested length to **3–600 seconds** before sending it, so anything outside that range is silently pulled to the nearest bound. Quality depends on prompt specificity: tempo (BPM), key, instrumentation, mood, structural cue. "Epic orchestral" returns generic stock music. "85 BPM, D minor, solo cello and detuned upright piano, sparse, melancholic, no drums, 4/4" returns a usable score for a melancholic exploration scene.
|
|
17
17
|
|
|
18
18
|
This skill produces one track aligned with the audio bible's music style and dynamic music plan, then wires it as an `AudioStreamPlayer` on the `Music` bus with a marked loop point if it's a loop, or as a linear cinematic stream if it's a one-shot.
|
|
19
19
|
|
|
@@ -25,9 +25,9 @@ This skill produces one track aligned with the audio bible's music style and dyn
|
|
|
25
25
|
|
|
26
26
|
## When NOT to use
|
|
27
27
|
|
|
28
|
-
- Short stings / event punctuation (<5s) → use `
|
|
29
|
-
- Adaptive layered stems with state-driven crossfades → `
|
|
30
|
-
- Ambient bed with no melody → `
|
|
28
|
+
- Short stings / event punctuation (<5s) → use `sound-effect` with class `Stinger`.
|
|
29
|
+
- Adaptive layered stems with state-driven crossfades → `adaptive-music`.
|
|
30
|
+
- Ambient bed with no melody → `ambient-bed`.
|
|
31
31
|
|
|
32
32
|
## Steps
|
|
33
33
|
|
|
@@ -116,7 +116,7 @@ Prompts that DON'T work (and why):
|
|
|
116
116
|
|
|
117
117
|
For loops: generate **≥30s, prefer 45–60s**. Shorter loops are recognized as repetition within 90s of play and become annoying. The bible's "no state stays >90s without variation" rule means even a 60s loop should contain internal variation (instrument swap on alternating cycles).
|
|
118
118
|
|
|
119
|
-
For linear: generate **≥60s for cutscenes, up to 300s for endings**.
|
|
119
|
+
For linear: generate **≥60s for cutscenes, up to 300s for endings**. Ask for one rendered piece rather than splicing; the model handles long arcs.
|
|
120
120
|
|
|
121
121
|
### 6. Confirm and call
|
|
122
122
|
|
|
@@ -124,7 +124,7 @@ Show the prompt:
|
|
|
124
124
|
|
|
125
125
|
> Prompt:
|
|
126
126
|
> `85 BPM, D minor, 4/4, solo cello and detuned upright piano, sparse, melancholic exploration loop, no drums, gentle reverb, 60s loop`
|
|
127
|
-
> Duration 60s.
|
|
127
|
+
> Duration 60s. This uses credits. Generate?
|
|
128
128
|
|
|
129
129
|
The `music` capability reads the description from **`prompt`**, not `text` — the mirror image of `sound_effects`. Passing `text` here is a 400 `prompt_required`.
|
|
130
130
|
|
|
@@ -155,9 +155,9 @@ loop = true
|
|
|
155
155
|
loop_offset = 0.0
|
|
156
156
|
```
|
|
157
157
|
|
|
158
|
-
If the start has a fade-in but the body is loopable, set `loop_offset = 4.0` (4 seconds of intro skipped on loop, plays full track first time). `bpm` + `beat_count` + `bar_beats` are what you set if you want beat-synced transitions later — see `
|
|
158
|
+
If the start has a fade-in but the body is loopable, set `loop_offset = 4.0` (4 seconds of intro skipped on loop, plays full track first time). `bpm` + `beat_count` + `bar_beats` are what you set if you want beat-synced transitions later — see `adaptive-music`.
|
|
159
159
|
|
|
160
|
-
For seamless looping, the cleaner option is to ask the model to generate a cell (one bar / one phrase) and concatenate; or generate at 60s and trust the model's structural cue. Crossfade looping in code is the practical fallback (
|
|
160
|
+
For seamless looping, the cleaner option is to ask the model to generate a cell (one bar / one phrase) and concatenate; or generate at 60s and trust the model's structural cue. Crossfade looping in code is the practical fallback (step 9).
|
|
161
161
|
|
|
162
162
|
### 8. Wire it as `AudioStreamPlayer` on the `Music` bus
|
|
163
163
|
|
|
@@ -175,40 +175,42 @@ Music is `AudioStreamPlayer` (not 2D / 3D) — non-positional. The bible's `Musi
|
|
|
175
175
|
|
|
176
176
|
### 9. Crossfade-loop pattern (no marked loop point)
|
|
177
177
|
|
|
178
|
-
If the loop click bothers the user,
|
|
178
|
+
If the loop click bothers the user, crossfade two players. Set `loop = false` in the import file first, so each player stops at the end.
|
|
179
179
|
|
|
180
180
|
```gdscript
|
|
181
181
|
# scripts/audio/MusicLoopCrossfade.gd
|
|
182
182
|
extends Node
|
|
183
183
|
@export var stream: AudioStream
|
|
184
|
-
@export var fade
|
|
185
|
-
var
|
|
186
|
-
var
|
|
187
|
-
var
|
|
184
|
+
@export var fade := 1.0
|
|
185
|
+
@export var volume_db := -8.0
|
|
186
|
+
var _players: Array[AudioStreamPlayer] = []
|
|
187
|
+
var _current := 0
|
|
188
188
|
|
|
189
189
|
func _ready() -> void:
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
190
|
+
for i in 2:
|
|
191
|
+
var p := AudioStreamPlayer.new()
|
|
192
|
+
p.stream = stream
|
|
193
|
+
p.bus = "Music"
|
|
194
|
+
p.volume_db = volume_db
|
|
195
|
+
add_child(p)
|
|
196
|
+
_players.append(p)
|
|
197
|
+
_players[0].play()
|
|
198
|
+
|
|
199
|
+
func _process(_delta: float) -> void:
|
|
200
|
+
var a := _players[_current]
|
|
201
|
+
if not a.playing or a.get_playback_position() < stream.get_length() - fade:
|
|
202
|
+
return
|
|
203
|
+
_current = 1 - _current
|
|
204
|
+
var b := _players[_current]
|
|
205
|
+
b.volume_db = -80.0
|
|
206
|
+
b.play()
|
|
207
|
+
var t := create_tween().set_parallel()
|
|
208
|
+
t.tween_property(a, "volume_db", -80.0, fade)
|
|
209
|
+
t.tween_property(b, "volume_db", volume_db, fade)
|
|
210
|
+
t.chain().tween_callback(a.stop)
|
|
209
211
|
```
|
|
210
212
|
|
|
211
|
-
The next
|
|
213
|
+
The next player starts `fade` seconds before the current one ends and the two cross over, so the seam is never heard.
|
|
212
214
|
|
|
213
215
|
## Reference card — prompts by slot
|
|
214
216
|
|
|
@@ -249,7 +251,7 @@ Cutscene (cinematic): varies tempo, D minor, 4/4, solo piano opens,
|
|
|
249
251
|
|
|
250
252
|
## Edge cases
|
|
251
253
|
|
|
252
|
-
- **Clip is 50s but you wanted 60s.** Either regenerate
|
|
254
|
+
- **Clip is 50s but you wanted 60s.** Either regenerate or extend by overlap-crossfading the last 5s onto the start in an audio editor.
|
|
253
255
|
- **Loop click on every cycle.** Use the crossfade pattern in step 9.
|
|
254
256
|
- **Clip is too long.** Trim the tail in the import dock with `loop_offset`, or in an audio editor.
|
|
255
257
|
- **Track sounds nothing like the references.** Re-read the bible; the prompt may be missing the anchor instrument. Add it explicitly.
|
|
@@ -268,7 +270,7 @@ Print the prompt and instruct the user to run via the Summer dashboard, then `su
|
|
|
268
270
|
|
|
269
271
|
## See also
|
|
270
272
|
|
|
271
|
-
- `audio
|
|
272
|
-
- `
|
|
273
|
-
- `
|
|
274
|
-
- `
|
|
273
|
+
- `audio-direction` — defines style, tempo, key, model
|
|
274
|
+
- `adaptive-music` — wiring stems to game state
|
|
275
|
+
- `sound-effect` — short stings
|
|
276
|
+
- `ambient-bed` — non-melodic location bed
|
|
@@ -11,7 +11,7 @@ paths: ["**/project.godot"]
|
|
|
11
11
|
|
|
12
12
|
# /new-project — Scaffold a fresh empty project
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Use this when the user wants a blank project instead of a template.
|
|
15
15
|
|
|
16
16
|
## When to use this skill
|
|
17
17
|
|
|
@@ -42,7 +42,7 @@ Default: `my-game`. If they say "anything is fine" or similar, use `my-game` and
|
|
|
42
42
|
Two built-in options:
|
|
43
43
|
|
|
44
44
|
- `empty` — root `Node3D` only. Pure blank canvas. Best for: experimentation, when the user knows exactly what they want to build.
|
|
45
|
-
- `3d-basic` — root `Node3D` with `Camera3D`, `DirectionalLight3D`, a floor `MeshInstance3D`, and a `WorldEnvironment`. Best for: first-time users
|
|
45
|
+
- `3d-basic` — root `Node3D` with `Camera3D`, `DirectionalLight3D`, a floor `MeshInstance3D`, and a `WorldEnvironment`. Best for: first-time users who want something they can press Play on.
|
|
46
46
|
|
|
47
47
|
If you're not sure which fits, ask:
|
|
48
48
|
|
|
@@ -62,7 +62,7 @@ or
|
|
|
62
62
|
summer create 3d-basic my-game
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
The command writes `project.godot` and the chosen `main.tscn`.
|
|
65
|
+
The command writes `project.godot` and the chosen `main.tscn`. It makes no network call.
|
|
66
66
|
|
|
67
67
|
### 4. Open it
|
|
68
68
|
|
|
@@ -96,11 +96,9 @@ Ask: "Project is open. What do you want to build?"
|
|
|
96
96
|
## Edge cases
|
|
97
97
|
|
|
98
98
|
- **Engine not running** → that's fine. `summer create` doesn't need the engine. After scaffolding, `summer run <name>` will start it.
|
|
99
|
-
- **User wants 2D but `empty` is the only 2D-friendly built-in** → use `empty`, then
|
|
99
|
+
- **User wants 2D but `empty` is the only 2D-friendly built-in** → use `empty`, then set up a 2D scene root via `summer_replace_node` (Node3D → Node2D). Mention this — don't surprise the user.
|
|
100
100
|
- **Directory exists** → the CLI errors out. Ask for a different name; don't try to overwrite.
|
|
101
101
|
|
|
102
102
|
## Closing
|
|
103
103
|
|
|
104
104
|
End with: "Project `<name>` is created and open. What do you want to build first?"
|
|
105
|
-
|
|
106
|
-
That's the handoff to whatever skill comes next.
|
|
@@ -13,9 +13,9 @@ paths: ["assets/organic/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
|
|
|
13
13
|
|
|
14
14
|
Organic shapes (trees, rocks, mushrooms, coral, alien flora, crystals, vines, bones) are **the most forgiving category for AI 3D generation**. Lumps look natural. Asymmetry looks natural. Smoothing-group artifacts read as bark texture. The "melted" look that ruins vehicles and characters is fine on a mossy boulder.
|
|
15
15
|
|
|
16
|
-
This is the cheapest, fastest way to fill out a scene
|
|
16
|
+
This is the cheapest, fastest way to fill out a scene, and the first choice when the user says "this scene feels empty". The failure rate is the lowest of any 3D-asset family.
|
|
17
17
|
|
|
18
|
-
Backing tool: `summer_generate_3d`. Default `hunyuan`
|
|
18
|
+
Backing tool: `summer_generate_3d`. Default `hunyuan` works well here, but `trellis` is faster and the quality difference is hard to see on organic shapes. Pick `trellis` when generating many at once.
|
|
19
19
|
|
|
20
20
|
## When to use
|
|
21
21
|
|
|
@@ -25,7 +25,7 @@ Backing tool: `summer_generate_3d`. Default `hunyuan` is great here, but `trelli
|
|
|
25
25
|
- "Fill this forest scene with foliage."
|
|
26
26
|
- "Alien plants for the planet surface."
|
|
27
27
|
- "Coral for the underwater level."
|
|
28
|
-
- The user wants visual density
|
|
28
|
+
- The user wants visual density quickly and cheaply.
|
|
29
29
|
|
|
30
30
|
## When NOT to use
|
|
31
31
|
|
|
@@ -84,11 +84,11 @@ Organic prompts that DON'T work:
|
|
|
84
84
|
|
|
85
85
|
### 3. Confirm and call
|
|
86
86
|
|
|
87
|
-
> About to generate `pine_tree_01` via `trellis`, target ~2k tris
|
|
87
|
+
> About to generate `pine_tree_01` via `trellis`, target ~2k tris, ~30s. This uses credits. OK?
|
|
88
88
|
|
|
89
89
|
For batch generation, batch the confirmation:
|
|
90
90
|
|
|
91
|
-
> About to generate 3 trees + 3 rocks + 5 mushrooms (11 generations,
|
|
91
|
+
> About to generate 3 trees + 3 rocks + 5 mushrooms (11 generations, ~5 min). All low-poly via `trellis`. OK?
|
|
92
92
|
|
|
93
93
|
```
|
|
94
94
|
summer_generate_3d(
|
|
@@ -144,11 +144,11 @@ Every scene-mutating tool takes an explicit `scenePath`; node paths are relative
|
|
|
144
144
|
For dense forests, the cheapest fix beyond MultiMesh is the billboard imposter:
|
|
145
145
|
|
|
146
146
|
1. Generate the tree mesh once at high polycount.
|
|
147
|
-
2. Render it from one angle to a transparent PNG (
|
|
147
|
+
2. Render it from one angle to a transparent PNG (an `EditorScript` can capture a viewport).
|
|
148
148
|
3. Use that PNG as a `Sprite3D` with `billboard = enabled`.
|
|
149
|
-
4. Swap from `MeshInstance3D` to `Sprite3D` at ~50m camera distance
|
|
149
|
+
4. Swap from `MeshInstance3D` to `Sprite3D` at ~50m camera distance with `visibility_range_end` on the mesh and `visibility_range_begin` on the sprite (both on `GeometryInstance3D`), or a custom LOD script.
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
In a 200-tree forest, only the ~10 closest trees need to be real meshes; the other 190 can be billboards.
|
|
152
152
|
|
|
153
153
|
## Anti-patterns
|
|
154
154
|
|
|
@@ -166,7 +166,7 @@ For a 200-tree forest, ~10 close trees are real meshes, 190 are billboards. Fram
|
|
|
166
166
|
- **Branching meshes (vines, roots) come back too thick.** Specify `thin tendril, fine branches`, or accept and scale Y down in the editor.
|
|
167
167
|
- **Snow / ice / frozen variant.** Add `covered in snow, frosted, ice crystals` to the prompt — works well on trees and rocks. For temperature variants of the same scene, generate the variant rather than retexturing.
|
|
168
168
|
- **Crystal/glass organic.** Mesh comes back opaque. Generate the geometry, then assign a `StandardMaterial3D` with `transparency = ALPHA` and emissive in the editor.
|
|
169
|
-
- **Bones, skulls, dead trees.** All work
|
|
169
|
+
- **Bones, skulls, dead trees.** All work; organic forgives them more than props would. Add `weathered, sun-bleached` for desert / tundra feel.
|
|
170
170
|
|
|
171
171
|
## Fallback (no MCP)
|
|
172
172
|
|
|
@@ -11,13 +11,13 @@ paths: ["assets/**", "art/pixel/**", "sprites/**"]
|
|
|
11
11
|
|
|
12
12
|
# pixel-art — Pixel-Perfect Sprites and Tiles
|
|
13
13
|
|
|
14
|
-
This skill generates pixel-art
|
|
14
|
+
This skill generates pixel-art sprites, items, tiles, icons and portraits at a target resolution (32×32, 64×64, 128×128). Pixel art has hard constraints (grid alignment, limited palette, no anti-aliased edges) that diffusion models break by default. The prompt patterns and post-processing below make the output read as pixel art instead of a blurry small image.
|
|
15
15
|
|
|
16
16
|
**Backing tool:** `summer_generate_image` with an explicit pixel-art prompt.
|
|
17
17
|
|
|
18
18
|
Two things about that tool you have to know before writing a call, because both silently do nothing:
|
|
19
19
|
|
|
20
|
-
- **There is no `"pixel"` style preset.** `style` accepts exactly `realistic`, `cartoon`, `anime`, `none`; anything else is coerced to `none`. Only `cartoon` and `anime` do anything at all (they append a short suffix); `realistic` and `none` append nothing. So `style: "pixel"` is identical to `style: "none"` — the pixel look has to come entirely from the prompt. Use `style: "none"
|
|
20
|
+
- **There is no `"pixel"` style preset.** `style` accepts exactly `realistic`, `cartoon`, `anime`, `none`; anything else is coerced to `none`. Only `cartoon` and `anime` do anything at all (they append a short suffix); `realistic` and `none` append nothing. So `style: "pixel"` is identical to `style: "none"` — the pixel look has to come entirely from the prompt. Use `style: "none"`.
|
|
21
21
|
- **`options` is not a general passthrough.** The MCP tool forwards `options` to the server, which only recognizes Nano Banana provider keys: `seed`, `outputFormat`, `safetyTolerance`, `syncMode`, `systemPrompt`, `limitGenerations`, `thinkingLevel`. `image_size` and `negative_prompt` are not among them and are dropped without an error. There is no size or aspect-ratio argument on this tool at all — MCP images come back at the server's 1:1 default. Put framing and exclusions in the prompt text instead.
|
|
22
22
|
|
|
23
23
|
Pixel-perfect output is enforced in Summer Engine with Nearest texture filtering
|
|
@@ -82,14 +82,14 @@ summer_generate_image(
|
|
|
82
82
|
prompt="pixel art slime monster, 32x32 sprite, PICO-8 palette, hard 1px outline in palette's darkest color, 3-tone shading, no anti-aliasing, no blur, sharp pixel edges, front-facing. Not blurry, no smooth gradients, no soft edges, not photorealistic, no 3D render.",
|
|
83
83
|
model="nano-banana-2",
|
|
84
84
|
style="none",
|
|
85
|
-
|
|
85
|
+
removeBackground=true
|
|
86
86
|
)
|
|
87
87
|
```
|
|
88
88
|
|
|
89
89
|
Two deliberate choices there:
|
|
90
90
|
|
|
91
91
|
- **The negations live in the prompt.** There is no `negative_prompt` argument — putting one in `options` is dropped silently. Diffusion models honor in-prompt negations less reliably than a real negative-prompt field, so state them as plain sentences at the end and expect to regenerate more often than you would on a provider UI that exposes the field.
|
|
92
|
-
- **`
|
|
92
|
+
- **`removeBackground: true` is a top-level argument**, not an `options` key. It runs a background-removal pass after generation and returns a PNG with true alpha. Prefer it over asking for "transparent background" in the prompt, which makes models paint a literal checkerboard.
|
|
93
93
|
|
|
94
94
|
### 5. Downscale to target resolution
|
|
95
95
|
|
|
@@ -158,7 +158,7 @@ Confirm `Filter: Nearest` is set in the import dock OR project-wide.
|
|
|
158
158
|
- **User wants the entire game in pixel art.** Set `Project Settings → Rendering → Textures → Default Texture Filter: Nearest` once. Saves you from re-setting it on every import.
|
|
159
159
|
- **User wants a high-res "pixel art" portrait that's not actually pixelated** (faux-pixel-aesthetic at full resolution). That's `character-portrait` with a "pixel art aesthetic" prompt — not this skill.
|
|
160
160
|
- **User specifies a palette like "Sweetie-16" or "Endesga-32" and the model ignores it.** Name the hex codes explicitly. Palette names alone are unreliable below the top 5-10 famous ones.
|
|
161
|
-
- **Tilesets need to tile cleanly.** Pixel-art tile-edge cleanliness from raw generation is poor. Generate the tile grid, then
|
|
161
|
+
- **Tilesets need to tile cleanly.** Pixel-art tile-edge cleanliness from raw generation is poor. Generate the tile grid, then fix edge seams by hand in Aseprite.
|
|
162
162
|
|
|
163
163
|
## Fallback (no MCP)
|
|
164
164
|
|
|
@@ -169,7 +169,7 @@ summer_generate_image(
|
|
|
169
169
|
prompt="<pixel art prompt with full anchor>. Not blurry, no smooth gradients, no anti-aliasing.",
|
|
170
170
|
model="nano-banana-2",
|
|
171
171
|
style="none",
|
|
172
|
-
|
|
172
|
+
removeBackground=true
|
|
173
173
|
)
|
|
174
174
|
```
|
|
175
175
|
|
|
@@ -104,11 +104,10 @@ Leave the game running. The user wants to play it. Stop only on explicit ask.
|
|
|
104
104
|
|
|
105
105
|
This skill mutates engine state (clearing console, starting play). It's a read-side workflow with one safe write (`summer_play`). No "May I" needed — this is what the user asked for. Do confirm before stopping a running game.
|
|
106
106
|
|
|
107
|
-
##
|
|
107
|
+
## Requirements
|
|
108
108
|
|
|
109
|
-
|
|
110
|
-
technical `project.godot` file.
|
|
109
|
+
Any Summer project with a main scene set in `project.godot`.
|
|
111
110
|
|
|
112
111
|
## See also
|
|
113
112
|
|
|
114
|
-
- `
|
|
113
|
+
- `debug` — what to do when /play surfaces an error
|
|
@@ -31,7 +31,7 @@ NO "FEATURE SHIPPED" CLAIM WITHOUT A PLAYED WALKTHROUGH
|
|
|
31
31
|
|
|
32
32
|
If you have not, in this session, driven the feature and read back what happened, you cannot claim it works.
|
|
33
33
|
|
|
34
|
-
**You walk the feature. Not the user.** A `RunVerification` probe presses your game's real inputs, reads state back across frames, and saves real rendered frames. Handing the walkthrough to the user is a last resort for things a probe
|
|
34
|
+
**You walk the feature. Not the user.** A `RunVerification` probe presses your game's real inputs, reads state back across frames, and saves real rendered frames. Handing the walkthrough to the user is a last resort for things a probe cannot judge — see [What only a human can answer](#what-only-a-human-can-answer) — not the default.
|
|
35
35
|
|
|
36
36
|
On an engine build with the runtime-control ops (`summer_game_probe`, `summer_game_input`, `summer_game_control`, `summer_runtime_*`), drive the LIVE game instead of a hidden probe: deterministic launch, frame-stamped probe before and after every action, exact frame steps. That doctrine is the `agent-playtesting` skill; this skill's probe loop below is the path when those tools answer `engine_lacks_op`.
|
|
37
37
|
|
|
@@ -130,13 +130,13 @@ If anything is non-zero or unexpected, the feature is not done. Go to `debug`.
|
|
|
130
130
|
|
|
131
131
|
### What only a human can answer
|
|
132
132
|
|
|
133
|
-
A probe reports facts. It cannot hold an opinion. Ask the user only when the question is
|
|
133
|
+
A probe reports facts. It cannot hold an opinion. Ask the user only when the question is experiential:
|
|
134
134
|
|
|
135
135
|
- **Does it feel right?** Floaty jumps, sluggish input, mushy hit feedback — see `debugging-game-feel`.
|
|
136
136
|
- **Does it look good?** Composition, colour, readability. A probe can prove a light exists and prove the frame is not black; it cannot tell you the scene is ugly.
|
|
137
137
|
- **Is this fun?** Not a measurable property.
|
|
138
138
|
|
|
139
|
-
"I cannot simulate input" is not on that list
|
|
139
|
+
"I cannot simulate input" is not on that list: `RunVerification` presses real inputs. If you catch yourself asking the user to press a key, write the probe instead.
|
|
140
140
|
|
|
141
141
|
### 4. Probe the edges
|
|
142
142
|
|
|
@@ -210,7 +210,7 @@ Don't ask reflexively. A saved frame sequence answers most "did it visually work
|
|
|
210
210
|
| "It would take too long to play" | Playtest takes 60 seconds. Shipping a broken feature costs hours. |
|
|
211
211
|
| "The unit test passes" | Unit tests cover code paths, not gameplay sequences. |
|
|
212
212
|
| "I already played it in a previous session" | State changed. Verify in this session. |
|
|
213
|
-
| "I'll let the user catch any issues" |
|
|
213
|
+
| "I'll let the user catch any issues" | Catching them is your job. Ship working features. |
|
|
214
214
|
| Skipping `summer_clear_console` before `summer_play` | You will chase last session's errors. |
|
|
215
215
|
| Sleeping a fixed delay after `summer_play` | Boot time varies. Wait for `play.started` with `summer_wait_for_event`, or confirm with `summer_is_running`. |
|
|
216
216
|
| Skipping `summer_get_console` because diagnostics looked fine | Silent warnings and signal misfires hide there. |
|
|
@@ -254,8 +254,6 @@ So if `summer_play` returns "Summer Engine is not running":
|
|
|
254
254
|
|
|
255
255
|
## The Bottom Line
|
|
256
256
|
|
|
257
|
-
A game feature is a promise to the player. Verifying it means seeing the promise kept on screen, not seeing the code that would, in theory, keep it.
|
|
258
|
-
|
|
259
257
|
Press play. Walk the path. Probe the edges. Read the diagnostics. Then claim done.
|
|
260
258
|
|
|
261
259
|
**Related skills:**
|
|
@@ -11,9 +11,9 @@ paths: ["**/*.gd", "**/*.tscn", "**/*.tres"]
|
|
|
11
11
|
|
|
12
12
|
# Procedural Animation — Bones Driven by Code
|
|
13
13
|
|
|
14
|
-
Generated clips
|
|
14
|
+
Generated clips cover most of a character's motion. The rest — the eye contact when an NPC speaks, feet that plant on slopes, hands that wrap a sword grip, the lean into a sprint, the recoil from a hit on the left shoulder — is procedural. In Summer Engine this is done via the `SkeletonModifier3D` family attached to the `Skeleton3D`, plus additive blend layers on the `AnimationTree`. None of it is generative; this skill is a set of recipes.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Limit: Summer Engine's current IK is good enough for look-at, foot-snap,
|
|
17
17
|
and simple two-bone arm/leg chains. It is not a full-body IK system with weight
|
|
18
18
|
redistribution. For combat-grappling or contact-heavy interactions, hand-author
|
|
19
19
|
the contact frame and accept some clipping.
|
|
@@ -40,7 +40,7 @@ Almost every procedural request maps to one of these three. Pick the right one b
|
|
|
40
40
|
|
|
41
41
|
### Pattern A — SkeletonModifier3D (post-clip bone overrides)
|
|
42
42
|
|
|
43
|
-
Attached as a child of `Skeleton3D`. Runs after the AnimationTree writes the pose, modifies specific bones in-place. Includes `LookAtModifier3D
|
|
43
|
+
Attached as a child of `Skeleton3D`. Runs after the AnimationTree writes the pose, modifies specific bones in-place. Includes `LookAtModifier3D` and `SkeletonIK3D`. Cheap, deterministic, no animation graph dependency.
|
|
44
44
|
|
|
45
45
|
### Pattern B — Additive AnimationNodeAdd2 layer in the tree
|
|
46
46
|
|
|
@@ -54,7 +54,7 @@ The skeleton hands off to physics on death. Bones become `PhysicalBone3D` rigid
|
|
|
54
54
|
|
|
55
55
|
### A1 — Head look-at the player
|
|
56
56
|
|
|
57
|
-
The
|
|
57
|
+
The most common NPC liveliness fix.
|
|
58
58
|
|
|
59
59
|
**ctx lane (animation-tier engines):** one `summer_run_script` call creates the owned modifier and sets the props — prefer it over the 10-call CRUD chain below:
|
|
60
60
|
|
|
@@ -109,7 +109,7 @@ func _process(_delta: float) -> void:
|
|
|
109
109
|
head_look.influence = clamp(1.0 - (dist - 6.0) / 2.0, 0.0, 1.0) # fade out 6→8m
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
`use_angle_limitation` is the
|
|
112
|
+
`use_angle_limitation` is the key setting, and it defaults to **false** — a stock `LookAtModifier3D` does not clamp at all, so the head can rotate 180° and the model looks possessed. Turn it on and set `primary_limit_angle` to ~80° (1.4 rad), which matches a human's neck-only range; for a "whole-body turn" use it with the spine chain (next recipe). `primary_limit_angle` defaults to 2π, i.e. unlimited.
|
|
113
113
|
|
|
114
114
|
### A2 — Spine + head chain (look-at with body turn)
|
|
115
115
|
|
|
@@ -118,8 +118,7 @@ Multiple `LookAtModifier3D` nodes on the same chain — one for `Spine1` (`prima
|
|
|
118
118
|
### A3 — Foot IK (slopes & uneven terrain)
|
|
119
119
|
|
|
120
120
|
The clip has the foot at Y=0; on a slope the ground is at Y=0.15. Without IK,
|
|
121
|
-
the foot floats. `SkeletonIK3D`
|
|
122
|
-
current Summer technical base; prefer the newer chain modifier for production:
|
|
121
|
+
the foot floats. Use `SkeletonIK3D` on each two-bone leg chain:
|
|
123
122
|
|
|
124
123
|
```gdscript
|
|
125
124
|
@onready var skel: Skeleton3D = $Skeleton3D
|
|
@@ -149,7 +148,7 @@ func _solve_foot(ik: SkeletonIK3D, bone_name: String) -> void:
|
|
|
149
148
|
ik.stop()
|
|
150
149
|
```
|
|
151
150
|
|
|
152
|
-
The 0.5m up-offset on the ray prevents self-occlusion. The "only lift, never drop" rule
|
|
151
|
+
The 0.5m up-offset on the ray prevents self-occlusion. The "only lift, never drop" rule matters: letting IK push feet into the ground breaks knee bends.
|
|
153
152
|
|
|
154
153
|
Limits: this works for stairs and gentle slopes. On 45°+ slopes, use a pelvis lowering pass first (drop the root by `min(left_offset, right_offset)`) so the body squats and the legs don't over-extend.
|
|
155
154
|
|
|
@@ -168,7 +167,7 @@ In the AnimationTree, wrap Locomotion in an `AnimationNodeAdd2`:
|
|
|
168
167
|
add: AnimationNodeAnimation # an additive clip — must be authored as delta
|
|
169
168
|
```
|
|
170
169
|
|
|
171
|
-
Drive `parameters/Locomotion/Add/blend_amount` (0..1) from script. Use cases: turn-lean (lean amount = clamp(turn_rate, -1, 1)), aim offset (lean while aiming up/down), breathing-while-idle. The
|
|
170
|
+
Drive `parameters/Locomotion/Add/blend_amount` (0..1) from script. Use cases: turn-lean (lean amount = clamp(turn_rate, -1, 1)), aim offset (lean while aiming up/down), breathing-while-idle. The lean clip must be authored as a delta from the base pose, or the pose is applied twice.
|
|
172
171
|
|
|
173
172
|
## Pattern C — Ragdoll on death
|
|
174
173
|
|
|
@@ -220,7 +219,7 @@ You need PhysicalBone3D children matching every major bone (set up once via the
|
|
|
220
219
|
- **LookAt rotates wildly / no clamp at all.** `use_angle_limitation` is false by default and `primary_limit_angle` defaults to 2π. Set both. ~80° (1.4 rad) for a head-only modifier; ~25° (0.4 rad) for a single spine bone.
|
|
221
220
|
- **IK pops on the first frame.** Solver hasn't been initialized. Call `ik.start()` after the AnimationTree's first tick, not in `_ready()` — the bone pose is identity until the tree runs.
|
|
222
221
|
- **Foot IK pushes the body up on stairs but the camera doesn't follow.** Camera is parented to the root, not the head. Either parent the camera to a chest bone via `BoneAttachment3D`, or accept that the camera doesn't bob with foot IK.
|
|
223
|
-
- **Additive layer doubles the clip.** The "additive" clip wasn't authored as a delta
|
|
222
|
+
- **Additive layer doubles the clip.** The "additive" clip wasn't authored as a delta from the base pose. Re-author it as a delta.
|
|
224
223
|
- **Ragdoll just collapses, no spread.** Missing per-bone impulse + missing collision shapes on hands/feet PhysicalBone3D children. Auto-generate via Skeleton3D inspector → "Create Physical Skeleton" with the "Add collisions" option.
|
|
225
224
|
- **Modifiers run before the AnimationTree, not after.** Modifier order is set by tree-position in the scene. SkeletonModifier3D nodes must be CHILDREN of Skeleton3D and appear AFTER any nodes that drive the pose. AnimationTree itself doesn't sit under Skeleton3D — it sits at the character root and writes into Skeleton3D's pose every frame.
|
|
226
225
|
- **Look-at influence flickers at fade boundary.** Use `lerp(current_influence, target, 5 * delta)` instead of an instant assignment. Avoids the sub-pixel oscillation when the player walks the threshold.
|
|
@@ -233,7 +232,7 @@ You need PhysicalBone3D children matching every major bone (set up once via the
|
|
|
233
232
|
|
|
234
233
|
## Anti-patterns
|
|
235
234
|
|
|
236
|
-
- Writing `skel.set_bone_pose_position(...)` in `_process`. Bypasses the AnimationTree, fights it next frame, results in jitter. Use modifiers instead
|
|
235
|
+
- Writing `skel.set_bone_pose_position(...)` in `_process`. Bypasses the AnimationTree, fights it next frame, results in jitter. Use modifiers instead; they run after the tree. (Edit-time STILL poses — a corpse, a statue — are the exception: no tree is running, so `ctx.bone_pose(skel, bone, {position/rotation/scale})` on animation-tier engines, or `set_bone_pose_*` in a one-off `summer_run_script`, is exactly right. See `character-animation-wiring`.)
|
|
237
236
|
- Putting IK targets in worldspace and forgetting they don't follow the character. Parent IK targets under the character root or bone — IK target is in the modifier's local space.
|
|
238
237
|
- Procedural look-at without a fade-out at distance. Distant NPCs all snap to player every frame, looks like a hivemind.
|
|
239
238
|
- Foot IK on flying / floating characters. Disable when `is_on_floor() == false`.
|