summer-engine 1.5.0 → 2.2.0
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/{marketplace.json → .claude-plugin/marketplace.json} +3 -3
- package/.claude-plugin/plugin.json +52 -11
- package/.codex-plugin/plugin.json +69 -8
- package/.cursor-plugin/plugin.json +53 -12
- package/.factory-plugin/plugin.json +20 -0
- package/.opencode/INSTALL.md +75 -0
- package/.opencode/plugins/summer.js +9 -6
- package/AGENTS.md +51 -0
- package/CHANGELOG.md +31 -1
- package/CLAUDE.md +5 -0
- package/GEMINI.md +56 -0
- package/README.md +409 -80
- package/_persona/summer/SKILL.md +113 -0
- package/dist/bin/summer.js +0 -0
- package/dist/commands/assets.d.ts +2 -0
- package/dist/commands/assets.js +189 -0
- package/dist/commands/create.js +55 -17
- package/dist/commands/debug.d.ts +2 -0
- package/dist/commands/debug.js +127 -0
- package/dist/commands/install.js +2 -2
- package/dist/commands/list.js +24 -5
- package/dist/commands/project.d.ts +2 -0
- package/dist/commands/project.js +170 -0
- package/dist/commands/scene.d.ts +2 -0
- package/dist/commands/scene.js +290 -0
- package/dist/lib/banner.js +2 -2
- package/dist/lib/log-filters.d.ts +53 -0
- package/dist/lib/log-filters.js +130 -0
- package/dist/lib/plugin-manifests.test.d.ts +1 -0
- package/dist/lib/plugin-manifests.test.js +134 -0
- package/dist/lib/remote-templates.d.ts +25 -0
- package/dist/lib/remote-templates.js +86 -0
- package/dist/lib/skills-registry.d.ts +283 -3
- package/dist/lib/skills-registry.js +522 -2
- package/dist/lib/telemetry.d.ts +13 -0
- package/dist/lib/telemetry.js +63 -0
- package/dist/lib/with-engine.d.ts +14 -0
- package/dist/lib/with-engine.js +109 -0
- package/dist/mcp/tools/asset-tools.js +12 -13
- package/dist/mcp/tools/debug-tools.js +32 -9
- package/dist/mcp/tools/generate-tools.js +101 -0
- package/dist/mcp/tools/with-engine.js +4 -0
- package/gemini-extension.json +2 -2
- package/hooks/pre-commit-doctor.sh +0 -0
- package/hooks/run-hook.cmd +0 -0
- package/hooks/session-start.sh +0 -0
- package/package.json +11 -5
- package/skills/2d-assets/character-portrait/SKILL.md +196 -0
- package/skills/2d-assets/concept-art/SKILL.md +152 -0
- package/skills/2d-assets/pixel-art/SKILL.md +180 -0
- package/skills/2d-assets/skybox-panorama/SKILL.md +207 -0
- package/skills/2d-assets/sprite-sheet/SKILL.md +239 -0
- package/skills/2d-assets/tileable-texture/SKILL.md +205 -0
- package/skills/2d-assets/ui-graphics/SKILL.md +210 -0
- package/skills/3d-assets/character-model/SKILL.md +225 -0
- package/skills/3d-assets/environment-kit/SKILL.md +164 -0
- package/skills/3d-assets/organic-model/SKILL.md +192 -0
- package/skills/3d-assets/prop-model/SKILL.md +133 -0
- package/skills/3d-assets/vehicle-model/SKILL.md +202 -0
- package/skills/README.md +1 -1
- package/skills/_meta/skill-create/SKILL.md +1 -1
- package/skills/_meta/skill-improve/SKILL.md +1 -1
- package/skills/_meta/skill-test/SKILL.md +1 -1
- package/skills/_meta/using-summer/SKILL.md +130 -0
- package/skills/ai-and-npcs/design-npc/SKILL.md +3 -1
- package/skills/animation/animation-tree/SKILL.md +260 -0
- package/skills/animation/facial-and-lipsync/SKILL.md +282 -0
- package/skills/animation/generate-motion/SKILL.md +129 -0
- package/skills/animation/procedural-animation/SKILL.md +234 -0
- package/skills/animation/retarget/SKILL.md +172 -0
- package/skills/asset-pipeline/asset-strategy/SKILL.md +102 -212
- package/skills/audio/adaptive-music/SKILL.md +326 -0
- package/skills/audio/ambient-bed/SKILL.md +278 -0
- package/skills/audio/music-track/SKILL.md +268 -0
- package/skills/audio/sound-effect/SKILL.md +237 -0
- package/skills/audio/voice-line/SKILL.md +253 -0
- package/skills/catalog.yaml +266 -5
- package/skills/character-controllers/fps-controller/SKILL.md +1 -1
- package/skills/debugging/debug/SKILL.md +102 -82
- package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -1
- package/skills/scene-and-project/browse-templates/SKILL.md +105 -0
- package/skills/scene-and-project/make-game/SKILL.md +159 -346
- package/skills/scene-and-project/new-project/SKILL.md +106 -0
- package/skills/scene-and-project/scene-composition/SKILL.md +1 -1
- package/skills/scripting-patterns/gdscript-patterns/SKILL.md +1 -1
- package/skills/ui-and-ux/ui-basics/SKILL.md +1 -1
- package/skills/video/animated-loop/SKILL.md +200 -0
- package/skills/video/cinematic-cutscene/SKILL.md +204 -0
- package/skills/video/trailer-shot/SKILL.md +203 -0
- package/skills/visual-effects/_building-blocks/additive-billboard-particles.md +28 -0
- package/skills/visual-effects/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/skills/visual-effects/_building-blocks/trauma-shake-snippet.md +51 -0
- package/skills/visual-effects/{vfx → game-feel}/SKILL.md +1 -1
- package/skills/visual-effects/recipes/dissolve/SKILL.md +349 -0
- package/skills/visual-effects/recipes/fire/SKILL.md +387 -0
- package/skills/visual-effects/recipes/hit-spark/SKILL.md +330 -0
- package/skills/visual-effects/recipes/lightning/SKILL.md +372 -0
- package/skills/visual-effects/recipes/magic-glow/SKILL.md +377 -0
- package/skills/visual-effects/recipes/muzzle-flash/SKILL.md +326 -0
- package/skills/visual-effects/recipes/smoke/SKILL.md +381 -0
- package/skills/visual-effects/recipes/water-ripple/SKILL.md +340 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: concept-art
|
|
3
|
+
description: Use when the user is exploring art direction — wants 3-4 rough variants of a character, environment, or prop to pick a vibe before committing to a final asset. Generates a batch of evocative concept images, not finals. Trigger on "concept art", "art direction", "explore the look", "give me some variants", "what could this character look like", "mood board", "rough sketches".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: 2d-assets
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url
|
|
9
|
+
paths: ["assets/**", "art/**", "concepts/**"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# concept-art — Batch-of-Variants for Art Direction
|
|
13
|
+
|
|
14
|
+
This skill produces **3-4 rough concept images** of the same subject under different stylistic interpretations. The goal is not the final asset — the goal is to give the user something visual to react to so they can lock a direction. Variants are deliberately divergent (different palette, mood, framing, era) so the user has real choices, not four near-identical takes.
|
|
15
|
+
|
|
16
|
+
If the user wants ONE polished image (a dialogue portrait, a hero card), this is the wrong skill — route to `summer:2d-assets/character-portrait`. The `summer:asset-pipeline/asset-strategy` meta-router uses the disambiguation phrase **"Quick check — exploring the look (3-4 variants for art direction) or generating a final character portrait for dialogue UI?"** to send users to one of the two. If you arrived here without that question being asked, ask it before generating.
|
|
17
|
+
|
|
18
|
+
## When to use
|
|
19
|
+
|
|
20
|
+
- "I'm not sure what this character should look like — give me some options."
|
|
21
|
+
- "Show me 3-4 directions for the witch."
|
|
22
|
+
- "I want a mood board for the swamp level."
|
|
23
|
+
- Early-project art direction, before the GameSoul.md visual style is locked.
|
|
24
|
+
- The user describes a vibe ("dark fantasy", "Ghibli-esque", "Mobius") and wants to see it rendered.
|
|
25
|
+
|
|
26
|
+
## When NOT to use
|
|
27
|
+
|
|
28
|
+
- The user wants a single locked portrait for a dialogue UI → `summer:2d-assets/character-portrait`.
|
|
29
|
+
- The user wants pixel art specifically → `summer:2d-assets/pixel-art`.
|
|
30
|
+
- The user wants a UI icon or HUD element → `summer:2d-assets/ui-graphics`.
|
|
31
|
+
- The user wants a tileable wall/floor texture → `summer:2d-assets/tileable-texture`.
|
|
32
|
+
- The user wants an image-to-3D reference → `summer:asset-pipeline/asset-strategy` (the 3D pipeline has its own prompt suffix).
|
|
33
|
+
|
|
34
|
+
## Steps
|
|
35
|
+
|
|
36
|
+
### 1. Confirm exploration vs final
|
|
37
|
+
|
|
38
|
+
Before generating, ask once:
|
|
39
|
+
|
|
40
|
+
> Quick check — exploring the look (3-4 variants for art direction) or generating a final character portrait for dialogue UI?
|
|
41
|
+
|
|
42
|
+
If "final" → hand off to `summer:2d-assets/character-portrait`. If "explore" → continue.
|
|
43
|
+
|
|
44
|
+
### 2. Search for prior concepts
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
summer_search_assets(query="<subject> concept", filter={ kind: "image" })
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
If something already exists, ask if the user wants to riff on it (img2img via `referenceImageUrl`) or start fresh.
|
|
51
|
+
|
|
52
|
+
### 3. Pick a variant axis
|
|
53
|
+
|
|
54
|
+
Variants must differ on **one explicit axis**, not noise. Pick one:
|
|
55
|
+
|
|
56
|
+
| Axis | Use when |
|
|
57
|
+
|---|---|
|
|
58
|
+
| Palette / mood | "Should this feel grim or hopeful?" |
|
|
59
|
+
| Era / setting | "Medieval, sci-fi, modern, post-apoc?" |
|
|
60
|
+
| Stylization | "Painterly, anime, photoreal, Mobius line-art?" |
|
|
61
|
+
| Silhouette / proportions | Character design — slim/bulky/childlike/monstrous |
|
|
62
|
+
| Time of day / lighting | Environment — dawn/noon/dusk/night |
|
|
63
|
+
|
|
64
|
+
State the axis to the user before generating: "I'll vary on **stylization** — painterly, anime, line-art, photoreal. OK?"
|
|
65
|
+
|
|
66
|
+
### 4. Generate the batch
|
|
67
|
+
|
|
68
|
+
Issue 3-4 calls in parallel, one per variant. Use the same subject phrasing across all four; only the style-modifier changes.
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
summer_generate_image(
|
|
72
|
+
prompt="<subject>. <axis variant 1>. concept art, evocative, rough painterly, atmospheric lighting",
|
|
73
|
+
model="nano-banana-2",
|
|
74
|
+
style="none",
|
|
75
|
+
options={ image_size: "landscape_16_9" }
|
|
76
|
+
)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`style: "none"` is intentional — concept art doesn't want the default "realistic" or "cartoon" preset overriding the prompt's stylistic direction.
|
|
80
|
+
|
|
81
|
+
### 5. Present the batch
|
|
82
|
+
|
|
83
|
+
After all 4 return, show the user the thumbnails (link `thumbnailUrl` for each) and ask:
|
|
84
|
+
|
|
85
|
+
> Which direction lands? I can generate variants on the chosen one, or hand off to `character-portrait` for a final.
|
|
86
|
+
|
|
87
|
+
Do NOT import any of these as `res://` assets yet. Concept art is reference, not shipped art. Only import once the user picks a winner — then either it goes to `character-portrait` for a polished version or directly to `summer_import_from_url` if they want to use it as-is as a reference.
|
|
88
|
+
|
|
89
|
+
## Prompt patterns
|
|
90
|
+
|
|
91
|
+
The structure: **subject + axis variant + "concept art" + lighting/atmosphere**. Keep prompts under 30 words.
|
|
92
|
+
|
|
93
|
+
| Goal | Prompt that works | Why |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| Character — palette axis | `young witch with raven familiar. <warm autumn palette / cold blue moonlit palette / sickly green swamp palette / monochrome ash palette>. concept art, painterly, atmospheric` | Locked subject + four explicit palettes |
|
|
96
|
+
| Character — silhouette axis | `goblin warrior. <slim wiry / hulking brute / childlike imp / multi-limbed mutant>. concept art, full body, rough painterly` | Forces real shape variation |
|
|
97
|
+
| Environment — mood axis | `swamp village at dusk. <hopeful warm lanterns / oppressive fog / abandoned ruins / overgrown nature reclaim>. concept art, wide shot, atmospheric` | Mood drives composition |
|
|
98
|
+
| Environment — stylization axis | `mountain temple. <Studio Ghibli soft painterly / Mobius clean line-art / dark Berserk ink / Hayao detailed wash>. concept art, wide establishing shot` | Names real reference styles the model recognizes |
|
|
99
|
+
| Prop — era axis | `royal sword. <bronze age / medieval / ornate baroque / sci-fi energy>. concept art, three-quarter view, neutral background` | Era as the only varying dimension |
|
|
100
|
+
| Creature — physiology axis | `forest spirit. <deer-like elegant / fungal grotesque / jellyfish floating / branch-and-moss elemental>. concept art, atmospheric, painterly` | Forces real morphological divergence |
|
|
101
|
+
|
|
102
|
+
### Bad prompts (and why)
|
|
103
|
+
|
|
104
|
+
| Bad | Failure mode |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `cool fantasy character` | No subject, no axis. All 4 variants will look interchangeable. |
|
|
107
|
+
| `make 4 different witches` | Model doesn't render "4 of"; you must call 4 times. |
|
|
108
|
+
| `epic concept art masterpiece trending on artstation` | Adjective soup. Trending-on-artstation is a 2022 cliche; modern models render it as bland slop. |
|
|
109
|
+
| `same character but different` | "Different" is undefined. Pick an axis and name it. |
|
|
110
|
+
|
|
111
|
+
## Anti-patterns
|
|
112
|
+
|
|
113
|
+
- **Generating 4 near-identical variants** because you didn't pick a real axis. The user can't choose between four images that all look like the same painting.
|
|
114
|
+
- **Importing concept art as final assets.** These are exploration. The polished version comes from `character-portrait` after a direction is picked.
|
|
115
|
+
- **Using `style: "realistic"` or `style: "cartoon"`** — the preset fights the prompt's stylistic direction. Use `style: "none"` for concept art.
|
|
116
|
+
- **Skipping the disambiguation question.** If you don't ask, you'll get yelled at when you generate 4 portraits and the user wanted one polished bust.
|
|
117
|
+
- **Generating before the GameSoul.md is written.** If `.summer/GameSoul.md` exists, read it first — its visual-style section narrows the axis.
|
|
118
|
+
|
|
119
|
+
## Edge cases
|
|
120
|
+
|
|
121
|
+
- **User says "just one" after you propose 4.** That's a `character-portrait` job. Hand off.
|
|
122
|
+
- **User wants 8+ variants.** Generate 4 first; if the user wants more on the same axis, generate 4 more. Don't dump 8 at once — overload paralyzes choice.
|
|
123
|
+
- **Subject is a fully described scene, not an asset.** You're producing key art, not asset reference. Use `image_size: "landscape_16_9"` and bias toward atmospheric.
|
|
124
|
+
- **User wants the final to be 3D.** After they pick a direction, route to `summer:asset-pipeline/asset-strategy` — concept-art images are not 3D-ready references (they have backgrounds, scene context, dramatic lighting baked in). The 3D pipeline needs its own clean white-background reference.
|
|
125
|
+
|
|
126
|
+
## Fallback (no MCP)
|
|
127
|
+
|
|
128
|
+
Print the 4 prompts and the call for each:
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
summer_generate_image(prompt="<variant 1>", model="nano-banana-2", style="none", options={ image_size: "landscape_16_9" })
|
|
132
|
+
summer_generate_image(prompt="<variant 2>", ...)
|
|
133
|
+
...
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Tell the user to run via the Summer dashboard, then come back and `summer_import_from_url` the winning variant.
|
|
137
|
+
|
|
138
|
+
## Handoff
|
|
139
|
+
|
|
140
|
+
Once the user picks a direction:
|
|
141
|
+
|
|
142
|
+
- **Character / NPC final** → `summer:2d-assets/character-portrait` (use the picked variant as `referenceImageUrl`).
|
|
143
|
+
- **3D model from this concept** → `summer:asset-pipeline/asset-strategy` (regenerate a 3D-ready reference; concept art is not 3D-ready as-is).
|
|
144
|
+
- **Tileable texture from this mood** → `summer:2d-assets/tileable-texture`.
|
|
145
|
+
- **Pixel-art version** → `summer:2d-assets/pixel-art`.
|
|
146
|
+
- **Lock the visual direction** → write the choice into `.summer/GameSoul.md` under `## Visual style` so future asset skills inherit it.
|
|
147
|
+
|
|
148
|
+
## See also
|
|
149
|
+
|
|
150
|
+
- `summer:asset-pipeline/asset-strategy` — meta-router that delegates here vs other 2d-assets skills.
|
|
151
|
+
- `summer:2d-assets/character-portrait` — the polished single-image counterpart.
|
|
152
|
+
- `_shared/mcp-tools-reference.md` — `summer_generate_image` parameter schema.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pixel-art
|
|
3
|
+
description: Use when generating pixel-art assets — sprites, items, tiles, portraits in a pixel style at a specific resolution (32×32, 64×64, 128×128). Pixel-perfect grid, limited palette, retro feel. Trigger on "pixel art", "8-bit art", "16-bit sprite", "pixel sprite", "retro tileset", "pixel icon", "pixel portrait".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: 2d-assets
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url summer_set_resource_property
|
|
9
|
+
paths: ["assets/**", "art/pixel/**", "sprites/**"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# pixel-art — Pixel-Perfect Sprites and Tiles
|
|
13
|
+
|
|
14
|
+
This skill generates pixel-art assets — sprites, items, tiles, icons, portraits — at a target resolution (32×32, 64×64, 128×128, etc.). Pixel art has hard constraints (grid alignment, limited palette, no anti-aliased edges) that diffusion models violate by default. This skill encodes the prompt patterns and post-processing discipline that makes the output actually look like pixel art and not "blurry small image."
|
|
15
|
+
|
|
16
|
+
**Backing tool:** `summer_generate_image` with `style: "pixel"` and an explicit pixel-art prompt. Pass `options.image_size: "square_hd"` and have the agent enforce pixel-perfect by setting the project's default texture filter to Nearest (and downscaling to the target resolution post-gen). Output is upscaled by the model — you generally request a small generation (or downscale post-gen) to get crisp pixels.
|
|
17
|
+
|
|
18
|
+
## When to use
|
|
19
|
+
|
|
20
|
+
- "Generate a 32×32 sword icon for the inventory."
|
|
21
|
+
- "I need a pixel-art portrait of the merchant for the dialogue UI."
|
|
22
|
+
- "Make a 64×64 enemy sprite — a slime monster."
|
|
23
|
+
- "Generate a tileset for a grass / dirt / stone biome at 16×16 per tile."
|
|
24
|
+
- The game has a pixel-art aesthetic and the user wants assets in-style.
|
|
25
|
+
|
|
26
|
+
## When NOT to use
|
|
27
|
+
|
|
28
|
+
- The user wants a high-resolution painterly portrait → `summer:2d-assets/character-portrait`.
|
|
29
|
+
- The user wants animated frames (walk cycle, attack) → `summer:2d-assets/sprite-sheet` (pixel art is harder for sprite sheets — read that skill's caveats).
|
|
30
|
+
- The user wants a tileable seamless texture (not pixel art) → `summer:2d-assets/tileable-texture`.
|
|
31
|
+
- The game is 3D / non-pixel — verify the user actually wants pixel before generating.
|
|
32
|
+
|
|
33
|
+
## Steps
|
|
34
|
+
|
|
35
|
+
### 1. Lock the resolution and palette
|
|
36
|
+
|
|
37
|
+
Ask the user (or read `.summer/GameSoul.md`):
|
|
38
|
+
|
|
39
|
+
- **Resolution per asset:** 16×16, 32×32, 64×64, 128×128 are standard. Sprites usually 32 or 64; portraits 64 or 128; icons 16 or 32.
|
|
40
|
+
- **Palette:** named retro palette (NES 56-color, Game Boy 4-color green, PICO-8 16-color, Sweetie-16) OR custom hex list OR "no palette restriction."
|
|
41
|
+
- **Outline:** hard black outline, colored outline, or no outline?
|
|
42
|
+
|
|
43
|
+
Write to `.summer/pixel-anchor.md` so the rest of the cast/tileset stays consistent:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
## Pixel anchor
|
|
47
|
+
|
|
48
|
+
base resolution: 32x32 per sprite
|
|
49
|
+
palette: PICO-8 16-color
|
|
50
|
+
outline: hard 1px dark outline (NOT pure black — use the palette's darkest color)
|
|
51
|
+
shading: 3-tone (light, mid, shadow), no gradients, no AA
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 2. Search for existing assets
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
summer_search_assets(query="<subject> pixel", filter={ kind: "image" })
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 3. Build the prompt
|
|
61
|
+
|
|
62
|
+
Pattern:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
pixel art <subject>, <resolution>, <palette>, <outline rule>, <shading rule>, no anti-aliasing, no blur, sharp pixel edges, transparent background
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The model can't actually generate at 32×32 — it generates at 1024×1024 with pixel-art *style*. You then downscale to the target resolution post-import for crisp pixels.
|
|
69
|
+
|
|
70
|
+
### 4. Generate
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
summer_generate_image(
|
|
74
|
+
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, transparent background, front-facing",
|
|
75
|
+
model="nano-banana-2",
|
|
76
|
+
style="pixel",
|
|
77
|
+
options={
|
|
78
|
+
image_size: "square_hd",
|
|
79
|
+
negative_prompt: "blurry, smooth gradients, anti-aliasing, photorealistic, 3D render, soft edges"
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
`negative_prompt` is critical for pixel art — without it the model smuggles in soft edges and gradients.
|
|
85
|
+
|
|
86
|
+
### 5. Downscale to target resolution
|
|
87
|
+
|
|
88
|
+
The generated image is 1024×1024 pixel-style. To get true crisp pixels at 32×32:
|
|
89
|
+
|
|
90
|
+
- Import to the engine, then in the import dock set `Filter: Nearest` (no smoothing).
|
|
91
|
+
- For a true 32×32 atlas/icon, downscale in an external editor (Aseprite, GIMP "nearest neighbor") to 32×32 before importing. Aseprite's "Sprite > Sprite Size" with Nearest gives the cleanest result.
|
|
92
|
+
- In Godot, set `Project Settings → Rendering → Textures → Default Texture Filter: Nearest` if the entire game is pixel-art. This kills bilinear smoothing project-wide.
|
|
93
|
+
|
|
94
|
+
### 6. Import and wire
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
summer_import_from_url(url="<fileUrl>", path="res://sprites/slime.png")
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
For a `Sprite2D`:
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
summer_set_resource_property(
|
|
104
|
+
nodePath="/root/Game/Slime/Sprite2D",
|
|
105
|
+
resourceProperty="texture",
|
|
106
|
+
value="res://sprites/slime.png"
|
|
107
|
+
)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Confirm `Filter: Nearest` is set in the import dock OR project-wide.
|
|
111
|
+
|
|
112
|
+
## Prompt patterns
|
|
113
|
+
|
|
114
|
+
| Goal | Prompt that works | Why |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| Item icon (32×32) | `pixel art iron sword icon, 32x32, NES palette, hard outline, 3-tone shading, no AA, sharp edges, transparent background, three-quarter view` | Three-quarter view reads better than pure side at 32px |
|
|
117
|
+
| Character sprite (64×64) | `pixel art knight character sprite, 64x64, PICO-8 palette, hard 1px outline, 3-tone shading, front-facing idle pose, no AA, sharp edges, transparent background` | Specifying "idle pose" prevents action poses that don't tile into a sheet |
|
|
118
|
+
| Pixel portrait (128×128) | `pixel art portrait of a young witch, 128x128, custom muted fantasy palette, hard outline, 4-tone shading, bust framing, looking forward, no AA, no blur, transparent background` | Higher resolution allows 4-tone shading; 32px is too small for that |
|
|
119
|
+
| Tileset (16×16/tile) | `pixel art top-down tileset, grass-to-dirt transition, 16x16 per tile, 3x3 grid layout, NES palette, hard outline between tiles, 3-tone shading, no AA, sharp edges` | Tilesets render best in a labeled grid layout |
|
|
120
|
+
| Background object (64×64) | `pixel art mossy boulder, 64x64, fantasy palette, hard outline, 3-tone shading, no AA, transparent background, three-quarter view` | Background props benefit from three-quarter for depth |
|
|
121
|
+
| GB-style asset (Game Boy) | `pixel art skeleton enemy, 32x32, Game Boy 4-color green palette (#0f380f, #306230, #8bac0f, #9bbc0f), hard 1px outline, 2-tone shading, no AA` | Naming the 4 hex codes locks the palette |
|
|
122
|
+
|
|
123
|
+
### Bad prompts (and why)
|
|
124
|
+
|
|
125
|
+
| Bad | Failure mode |
|
|
126
|
+
|---|---|
|
|
127
|
+
| `8-bit sword` | "8-bit" is interpreted loosely. Returns a smooth render of a sword with vague pixel feel. Specify resolution + palette + "no AA" explicitly. |
|
|
128
|
+
| `pixel art knight, photorealistic` | Conflicting directives. Model averages and gives you neither. |
|
|
129
|
+
| `pixel art at 32x32` (no negative_prompt) | Model adds soft edges and gradient shading. Always add negative prompt for AA / blur / gradients. |
|
|
130
|
+
| `pixel sprite walk cycle` | Walk cycles need consistent frames — single-prompt sprite sheets fail. Route to `summer:2d-assets/sprite-sheet`. |
|
|
131
|
+
| `cute pixel art` | "Cute" without subject is undefined. Specify what. |
|
|
132
|
+
|
|
133
|
+
## Anti-patterns
|
|
134
|
+
|
|
135
|
+
- **Skipping the downscale.** The model returns a 1024×1024 pixel-style image. If you import that as a 1024 texture, the "pixels" are actually 32-pixel blocks of soft color. Downscale to true target resolution OR set `Filter: Nearest` so the up-rendering doesn't smooth.
|
|
136
|
+
- **No `Filter: Nearest`.** Default Godot texture filtering is bilinear. Pixel art bilinearly filtered looks like garbage. Set it on import or project-wide.
|
|
137
|
+
- **No negative prompt.** Without `blurry, anti-aliasing, gradients, soft edges` in the negative, ~50% of generations are off-style.
|
|
138
|
+
- **Inconsistent palette across the cast.** Pick a named palette (PICO-8, NES, custom hex list) and re-use across every asset in the project. Different palettes = the project doesn't read as one game.
|
|
139
|
+
- **Generating walk-cycle frames as one image.** Sprite sheets via single-prompt are unreliable. Route to `summer:2d-assets/sprite-sheet`.
|
|
140
|
+
|
|
141
|
+
## Edge cases
|
|
142
|
+
|
|
143
|
+
- **User wants animated pixel sprites.** Generate base sprite here, then per-frame variants via img2img with the base as `referenceImageUrl`. For more than 2-3 frames, route to `summer:2d-assets/sprite-sheet` (and read its caveats).
|
|
144
|
+
- **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.
|
|
145
|
+
- **User wants a high-res "pixel art" portrait that's not actually pixelated** (faux-pixel-aesthetic at full resolution). That's `summer:2d-assets/character-portrait` with a "pixel art aesthetic" prompt — not this skill.
|
|
146
|
+
- **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.
|
|
147
|
+
- **Tilesets need to tile cleanly.** Pixel-art tile-edge cleanliness from raw generation is poor. Generate the tile grid, then manually fix edge seams in Aseprite. The AI gets you 80% there.
|
|
148
|
+
|
|
149
|
+
## Fallback (no MCP)
|
|
150
|
+
|
|
151
|
+
Print the call:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
summer_generate_image(
|
|
155
|
+
prompt="<pixel art prompt with full anchor>",
|
|
156
|
+
model="nano-banana-2",
|
|
157
|
+
style="pixel",
|
|
158
|
+
options={ image_size: "square_hd", negative_prompt: "blurry, smooth gradients, anti-aliasing" }
|
|
159
|
+
)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Tell the user to run via the Summer dashboard, downscale in Aseprite/GIMP to true target resolution with nearest-neighbor, then `summer_import_from_url` (or drop into `res://sprites/`) and set `Filter: Nearest`.
|
|
163
|
+
|
|
164
|
+
If MCP is offline entirely: open Aseprite or Piskel and hand-author the asset. For pixel art at small resolutions, hand-authoring is often faster than fixing a generation.
|
|
165
|
+
|
|
166
|
+
## Handoff
|
|
167
|
+
|
|
168
|
+
After the asset is wired:
|
|
169
|
+
|
|
170
|
+
- **More assets in the same style** → re-invoke this skill, re-use the pixel anchor.
|
|
171
|
+
- **Animation frames for the sprite** → `summer:2d-assets/sprite-sheet` with the base sprite as anchor.
|
|
172
|
+
- **Pixel UI** → re-invoke with UI subjects (icons, button frames) at appropriate resolution.
|
|
173
|
+
- **Tilemap setup** → `summer:scene-composition` for `TileMap` / `TileMapLayer` wiring.
|
|
174
|
+
|
|
175
|
+
## See also
|
|
176
|
+
|
|
177
|
+
- `summer:2d-assets/sprite-sheet` — animated pixel frames.
|
|
178
|
+
- `summer:2d-assets/character-portrait` — high-res counterpart.
|
|
179
|
+
- `summer:asset-pipeline/asset-strategy` — meta-router.
|
|
180
|
+
- `_shared/mcp-tools-reference.md` — `summer_generate_image` schema.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: skybox-panorama
|
|
3
|
+
description: Use when generating a 360° panoramic sky image for use as a Sky resource (PanoramaSkyMaterial) in a 3D scene. Equirectangular projection, 2:1 aspect. Wires into WorldEnvironment.sky. Trigger on "skybox", "sky panorama", "360 background", "environment sky", "HDRI sky", "panoramic background", "panorama sky".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: 2d-assets
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url summer_set_resource_property summer_add_node summer_set_prop summer_inspect_node
|
|
9
|
+
paths: ["assets/**", "art/sky/**", "environments/**"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# skybox-panorama — 360° Sky for WorldEnvironment
|
|
13
|
+
|
|
14
|
+
This skill generates a single equirectangular panoramic image (2:1 aspect, e.g. 2048×1024 or 4096×2048) suitable for Godot's `PanoramaSkyMaterial`. Wires it into a `Sky` resource on a `WorldEnvironment` node so the sky is visible from every camera angle in your 3D scene.
|
|
15
|
+
|
|
16
|
+
The single biggest failure mode is **non-equirectangular output**. Diffusion models default to flat 2D scenes; if you don't explicitly demand "equirectangular projection," the result looks fine in a thumbnail but distorts brutally when wrapped onto a sphere — horizon bows, zenith pinches, the sun stretches into a smear. This skill encodes the prompt suffix and the import discipline that produces a usable sky on the first or second try.
|
|
17
|
+
|
|
18
|
+
## When to use
|
|
19
|
+
|
|
20
|
+
- "Generate a fantasy sky for the level."
|
|
21
|
+
- "I need a sci-fi nebula skybox."
|
|
22
|
+
- "Make a sunset panorama for the desert scene."
|
|
23
|
+
- "Stormy night sky for the haunted level."
|
|
24
|
+
- The 3D scene needs a visible sky (not just a flat color background).
|
|
25
|
+
|
|
26
|
+
## When NOT to use
|
|
27
|
+
|
|
28
|
+
- The user wants a 2D parallax background → that's a separate `Sprite2D` job, not a panorama.
|
|
29
|
+
- The user wants a HDRI for environment lighting (not just visual sky) → AI panoramas are LDR by default. For real IBL/HDR, use Polyhaven HDRIs (free CC0). Mention this to the user if lighting realism matters.
|
|
30
|
+
- The user wants a 3D-modeled sky-dome with geometry (clouds-as-meshes) → out of scope; use a `Sphere` mesh + custom shader.
|
|
31
|
+
- The scene is 2D → no sky needed.
|
|
32
|
+
|
|
33
|
+
## Steps
|
|
34
|
+
|
|
35
|
+
### 1. Search for an existing sky
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
summer_search_assets(query="<vibe> sky panorama", filter={ kind: "image" })
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Polyhaven (`polyhaven.com/hdris`) hosts hundreds of free CC0 HDRIs that beat AI generation for realism and provide IBL data. For realistic exterior scenes, prefer Polyhaven; for stylized / fantasy / sci-fi, AI generation wins.
|
|
42
|
+
|
|
43
|
+
### 2. Build the prompt — sky description + equirectangular suffix
|
|
44
|
+
|
|
45
|
+
Pattern:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
<sky description>, 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam at left and right edges, distortion-correct for sphere mapping, no foreground objects, no ground horizon line, sky and clouds and atmosphere only
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Load-bearing phrases:
|
|
52
|
+
|
|
53
|
+
- **`360 degree panoramic equirectangular projection`** — primes the model for the right format.
|
|
54
|
+
- **`seamless horizontal wrap, no visible seam at left and right edges`** — the left and right edges of the image meet when wrapped. If they don't match, you see a vertical seam in the sky.
|
|
55
|
+
- **`no foreground objects, no ground horizon line`** — skies show only sky. If you include a horizon, it warps weirdly when sphere-mapped and kills the illusion that the sky is at infinite distance.
|
|
56
|
+
- **`distortion-correct for sphere mapping`** — reminds the model that the top/bottom of the image map to the zenith/nadir.
|
|
57
|
+
|
|
58
|
+
### 3. Generate at 2:1 aspect
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
summer_generate_image(
|
|
62
|
+
prompt="dramatic fantasy sky, golden hour, large purple-orange clouds, distant mountains silhouetted at very bottom, soft god-rays, 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam, no foreground objects, sky only",
|
|
63
|
+
model="nano-banana-2",
|
|
64
|
+
style="realistic",
|
|
65
|
+
options={
|
|
66
|
+
aspectRatio: "2:1",
|
|
67
|
+
image_size: "landscape_16_9",
|
|
68
|
+
negative_prompt: "vertical seam, ground objects, horizon-level details, distorted, warped, characters, buildings"
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
`aspectRatio: "2:1"` is critical. Equirectangular MUST be 2:1 (width = 2× height). If the model returns 16:9 or 4:3, the wrap will be wrong.
|
|
74
|
+
|
|
75
|
+
### 4. Verify the seam and projection
|
|
76
|
+
|
|
77
|
+
Before wiring, inspect:
|
|
78
|
+
|
|
79
|
+
- **Left edge ↔ right edge:** mentally place them side-by-side. They should match continuously. If there's a cloud cut in half on the left and a different cloud on the right, regenerate with stronger emphasis on `seamless horizontal wrap`.
|
|
80
|
+
- **Top stretching:** the top 10% of the image stretches enormously when mapped to the zenith. If there are tight features (a sun, a cloud edge) high up, they'll smear. Generations with diffuse, soft top regions wrap better than crisp ones.
|
|
81
|
+
- **Bottom:** same applies to the nadir. Most skies don't show much bottom anyway since the camera sits below the horizon — but avoid generating tight features at the very bottom.
|
|
82
|
+
|
|
83
|
+
If the image fails seam check, regenerate. Some models support `seed` for variation while keeping prompt — bump the seed.
|
|
84
|
+
|
|
85
|
+
### 5. Import to project
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
summer_import_from_url(url="<fileUrl>", path="res://art/sky/fantasy_sunset.png")
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
In the import dock:
|
|
92
|
+
|
|
93
|
+
- `Repeat: Disabled` (panoramas don't tile — they wrap once via the material).
|
|
94
|
+
- `Filter: Linear with mipmaps` (smoother as the camera turns).
|
|
95
|
+
- `Mipmaps: Enabled`.
|
|
96
|
+
- `Compress: VRAM Compressed` for ship.
|
|
97
|
+
|
|
98
|
+
### 6. Wire into WorldEnvironment (3 lines)
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
summer_add_node(parentPath="/root/Game", type="WorldEnvironment", name="WorldEnvironment")
|
|
102
|
+
|
|
103
|
+
summer_set_resource_property(
|
|
104
|
+
nodePath="/root/Game/WorldEnvironment",
|
|
105
|
+
resourceProperty="environment:background_mode",
|
|
106
|
+
value=2 # BG_SKY
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
summer_set_resource_property(
|
|
110
|
+
nodePath="/root/Game/WorldEnvironment",
|
|
111
|
+
resourceProperty="environment:sky:sky_material",
|
|
112
|
+
value="<new PanoramaSkyMaterial with panorama: res://art/sky/fantasy_sunset.png>"
|
|
113
|
+
)
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Then, if the user wants the sky to also light the scene (image-based lighting):
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
summer_set_resource_property(
|
|
120
|
+
nodePath="/root/Game/WorldEnvironment",
|
|
121
|
+
resourceProperty="environment:ambient_light_source",
|
|
122
|
+
value=3 # AMBIENT_SOURCE_SKY
|
|
123
|
+
)
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Note: AI-generated panoramas are LDR (8-bit per channel). For physically-correct IBL with bright suns, the lighting is muted compared to true HDRI. Mention this to the user if they expect strong IBL.
|
|
127
|
+
|
|
128
|
+
### 7. Verify in scene
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
summer_inspect_node(path="/root/Game/WorldEnvironment")
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Then `summer_play` and look around. Sun in the right place? Seam invisible? Top/bottom okay?
|
|
135
|
+
|
|
136
|
+
## Prompt patterns
|
|
137
|
+
|
|
138
|
+
| Goal | Prompt that works | Why |
|
|
139
|
+
|---|---|---|
|
|
140
|
+
| Fantasy sunset | `dramatic fantasy sky at golden hour, large purple and orange clouds, soft god-rays, distant mountain silhouettes at very bottom only, 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam, no foreground, sky only` | Soft top, distant horizon = clean wrap |
|
|
141
|
+
| Sci-fi space nebula | `vast space nebula, deep blue and magenta gas clouds, scattered bright stars, distant galaxy disc, 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam, no foreground objects, no ground` | Space skies wrap easily; no horizon issues |
|
|
142
|
+
| Stormy night | `dark stormy night sky, heavy rolling clouds, distant lightning flashes, full moon partly obscured, 360 degree panoramic equirectangular, seamless wrap, no foreground` | Diffuse cloud structure tolerates wrapping well |
|
|
143
|
+
| Clear blue day | `bright clear blue sky with scattered cumulus clouds, midday sun upper left, 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam, no ground` | Tight sun feature warps; place sun off-center |
|
|
144
|
+
| Alien planet sky | `alien planet sky, two suns one large red one small white, swirling green-purple atmosphere, distant ringed planet at horizon, 360 panoramic equirectangular, seamless wrap, no foreground` | Multi-sun setups wrap if features stay diffuse |
|
|
145
|
+
| Underwater (caustic dome) | `underwater scene seen from below, sun rays piercing water surface, deep blue gradient downward to black, 360 panoramic equirectangular, seamless wrap` | Treat ocean surface as the "sky"; works for underwater levels |
|
|
146
|
+
| Stylized painterly sky | `Studio Ghibli painterly sky, soft cumulus clouds at sunset, warm pastel palette, 360 panoramic equirectangular, seamless wrap, no foreground` (style: "none") | Style preset would fight painterly |
|
|
147
|
+
|
|
148
|
+
### Bad prompts (and why)
|
|
149
|
+
|
|
150
|
+
| Bad | Failure mode |
|
|
151
|
+
|---|---|
|
|
152
|
+
| `beautiful sky` | No equirectangular suffix. Returns flat 16:9 photograph. Wrap looks broken. |
|
|
153
|
+
| `sky with mountains and trees and a castle` | Foreground objects. Horizon-level details warp catastrophically when sphere-mapped. |
|
|
154
|
+
| `360 sky` (without 2:1 aspect) | Aspect mismatch. Wrap is misaligned. |
|
|
155
|
+
| `panoramic sky in 4k` | "4k" implies 3840×2160 (16:9), not 2:1. Specify aspect. |
|
|
156
|
+
| `sky with the sun in the center top` | Sun at zenith stretches into a smear. Place sun off-axis. |
|
|
157
|
+
|
|
158
|
+
## Anti-patterns
|
|
159
|
+
|
|
160
|
+
- **Including foreground or horizon.** Mountains, trees, buildings at horizon level warp weirdly when sphere-mapped (the "swimming horizon" effect). Skies show ONLY sky. If the level needs distant mountains, model them as low-poly meshes in the scene, not in the sky texture.
|
|
161
|
+
- **Not specifying 2:1 aspect.** A 16:9 panorama wrapped equirectangular has obvious horizontal compression. Always `aspectRatio: "2:1"`.
|
|
162
|
+
- **Tight features at zenith/nadir.** Anything in the top or bottom 10% of the image gets pinched. Bias toward soft, diffuse features there.
|
|
163
|
+
- **Expecting HDR / IBL quality.** AI panoramas are 8-bit. If the user needs realistic environment lighting from the sky, point them at Polyhaven HDRIs (CC0). AI is for visual sky, not for lighting.
|
|
164
|
+
- **Forgetting `Repeat: Disabled` on import.** Panoramas wrap once via the material; if `Repeat` is on, you can get duplicate-tile artifacts at the seam.
|
|
165
|
+
- **Visible vertical seam on the wrap.** If left/right edges don't match, regenerate with seed bump or fix the seam in Photoshop/GIMP via the offset trick (offset by 50% horizontally → heal the new visible seam → offset back).
|
|
166
|
+
|
|
167
|
+
## Edge cases
|
|
168
|
+
|
|
169
|
+
- **Animated sky (clouds drift).** AI gives one frame. Animate via shader (UV scroll on the panorama texture) or layer two panoramas with `ProceduralSkyMaterial` for the base + a transparent cloud layer.
|
|
170
|
+
- **Day/night cycle.** Generate two panoramas (day + night). Cross-fade the `sky_material` via shader blend or by swapping `panorama` over a tween. Two LDR panoramas + a blend = serviceable cycle.
|
|
171
|
+
- **First-person VR.** AI panoramas at 2048×1024 are too low-res for VR (visible pixels). Generate at 4096×2048 if the model supports it; otherwise use Polyhaven HDRIs at 8K.
|
|
172
|
+
- **Indoor scene.** Skyboxes are wasted indoors — use `BG_COLOR` or a flat black background. Don't generate a sky for a windowless dungeon.
|
|
173
|
+
- **Visible vertical seam after generation.** Fix in Photoshop/GIMP: `Filter → Other → Offset` by 50% horizontally → the seam moves to the center → heal with content-aware fill or clone stamp → offset back to 0. Or regenerate with seed bump and `seamless horizontal wrap, no visible seam at left and right edges` repeated twice in the prompt.
|
|
174
|
+
|
|
175
|
+
## Fallback (no MCP)
|
|
176
|
+
|
|
177
|
+
Print the call:
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
summer_generate_image(
|
|
181
|
+
prompt="<sky> 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam, no foreground objects, sky only",
|
|
182
|
+
model="nano-banana-2",
|
|
183
|
+
style="realistic",
|
|
184
|
+
options={ aspectRatio: "2:1", negative_prompt: "vertical seam, foreground, distorted, warped, characters, buildings" }
|
|
185
|
+
)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
User runs via Summer dashboard, then `summer_import_from_url` to `res://art/sky/<name>.png`, sets `Repeat: Disabled`, and wires the WorldEnvironment manually.
|
|
189
|
+
|
|
190
|
+
If MCP is offline entirely: Polyhaven (`polyhaven.com/hdris`) has hundreds of free CC0 HDRIs ready to drop into `PanoramaSkyMaterial`. Often a better choice than AI for realistic exteriors anyway.
|
|
191
|
+
|
|
192
|
+
## Handoff
|
|
193
|
+
|
|
194
|
+
After the sky is wired:
|
|
195
|
+
|
|
196
|
+
- **Add atmospheric fog matching the sky's mood** → `summer:scene-composition` (fog is on the same Environment resource).
|
|
197
|
+
- **Add a directional `DirectionalLight3D` matching the sun position in the panorama** → `summer:3d-lighting` for sun + shadows.
|
|
198
|
+
- **Day/night cycle** → re-invoke this skill for the night sky, then write a small tween between the two `panorama` properties.
|
|
199
|
+
- **Tileable ground texture for the level floor** → `summer:2d-assets/tileable-texture`.
|
|
200
|
+
|
|
201
|
+
## See also
|
|
202
|
+
|
|
203
|
+
- `summer:3d-lighting` — sun, ambient, fog wired alongside the sky.
|
|
204
|
+
- `summer:2d-assets/tileable-texture` — ground/floor counterpart.
|
|
205
|
+
- `summer:scene-composition` — WorldEnvironment placement and configuration.
|
|
206
|
+
- `summer:asset-pipeline/asset-strategy` — meta-router.
|
|
207
|
+
- `_shared/mcp-tools-reference.md` — `summer_generate_image` schema.
|