summer-engine 2.0.0 → 2.3.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.
Files changed (62) hide show
  1. package/{marketplace.json → .claude-plugin/marketplace.json} +3 -3
  2. package/.claude-plugin/plugin.json +37 -4
  3. package/.codex-plugin/plugin.json +38 -5
  4. package/.cursor-plugin/plugin.json +37 -4
  5. package/.factory-plugin/plugin.json +20 -0
  6. package/.opencode/INSTALL.md +9 -3
  7. package/.opencode/plugins/summer.js +0 -2
  8. package/AGENTS.md +51 -0
  9. package/CLAUDE.md +5 -0
  10. package/GEMINI.md +56 -0
  11. package/README.md +211 -61
  12. package/_persona/summer/SKILL.md +113 -0
  13. package/dist/commands/install.js +2 -2
  14. package/dist/commands/setup.js +4 -0
  15. package/dist/commands/skills.js +115 -2
  16. package/dist/lib/agent-config.d.ts +2 -2
  17. package/dist/lib/agent-config.js +171 -5
  18. package/dist/lib/skills-registry.d.ts +290 -26
  19. package/dist/lib/skills-registry.js +503 -1
  20. package/dist/mcp/tools/generate-tools.js +101 -0
  21. package/gemini-extension.json +2 -2
  22. package/package.json +9 -3
  23. package/skills/2d-assets/character-portrait/SKILL.md +196 -0
  24. package/skills/2d-assets/concept-art/SKILL.md +152 -0
  25. package/skills/2d-assets/pixel-art/SKILL.md +180 -0
  26. package/skills/2d-assets/skybox-panorama/SKILL.md +207 -0
  27. package/skills/2d-assets/sprite-sheet/SKILL.md +239 -0
  28. package/skills/2d-assets/tileable-texture/SKILL.md +205 -0
  29. package/skills/2d-assets/ui-graphics/SKILL.md +210 -0
  30. package/skills/3d-assets/character-model/SKILL.md +225 -0
  31. package/skills/3d-assets/environment-kit/SKILL.md +164 -0
  32. package/skills/3d-assets/organic-model/SKILL.md +192 -0
  33. package/skills/3d-assets/prop-model/SKILL.md +133 -0
  34. package/skills/3d-assets/vehicle-model/SKILL.md +202 -0
  35. package/skills/ai-and-npcs/design-npc/SKILL.md +3 -1
  36. package/skills/animation/animation-tree/SKILL.md +260 -0
  37. package/skills/animation/facial-and-lipsync/SKILL.md +282 -0
  38. package/skills/animation/generate-motion/SKILL.md +129 -0
  39. package/skills/animation/procedural-animation/SKILL.md +234 -0
  40. package/skills/animation/retarget/SKILL.md +172 -0
  41. package/skills/asset-pipeline/asset-strategy/SKILL.md +102 -212
  42. package/skills/audio/adaptive-music/SKILL.md +326 -0
  43. package/skills/audio/ambient-bed/SKILL.md +278 -0
  44. package/skills/audio/music-track/SKILL.md +268 -0
  45. package/skills/audio/sound-effect/SKILL.md +237 -0
  46. package/skills/audio/voice-line/SKILL.md +253 -0
  47. package/skills/catalog.yaml +249 -3
  48. package/skills/video/animated-loop/SKILL.md +200 -0
  49. package/skills/video/cinematic-cutscene/SKILL.md +204 -0
  50. package/skills/video/trailer-shot/SKILL.md +203 -0
  51. package/skills/visual-effects/_building-blocks/additive-billboard-particles.md +28 -0
  52. package/skills/visual-effects/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
  53. package/skills/visual-effects/_building-blocks/trauma-shake-snippet.md +51 -0
  54. package/skills/visual-effects/{vfx → game-feel}/SKILL.md +1 -1
  55. package/skills/visual-effects/recipes/dissolve/SKILL.md +349 -0
  56. package/skills/visual-effects/recipes/fire/SKILL.md +387 -0
  57. package/skills/visual-effects/recipes/hit-spark/SKILL.md +330 -0
  58. package/skills/visual-effects/recipes/lightning/SKILL.md +372 -0
  59. package/skills/visual-effects/recipes/magic-glow/SKILL.md +377 -0
  60. package/skills/visual-effects/recipes/muzzle-flash/SKILL.md +326 -0
  61. package/skills/visual-effects/recipes/smoke/SKILL.md +381 -0
  62. package/skills/visual-effects/recipes/water-ripple/SKILL.md +340 -0
@@ -0,0 +1,192 @@
1
+ ---
2
+ name: organic-model
3
+ description: Use when generating organic shapes — trees, rocks, mushrooms, coral, bushes, alien plants, vines, crystals, fruit, bones. The "easy mode" of 3D generation; AI artifacts read as natural irregularity. Trigger on "make a tree", "generate rocks", "I need foliage", "mushroom prop", "alien plants", "fill the scene with shrubs", "scatter some boulders".
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: 3d-assets
7
+ user-invocable: true
8
+ allowed-tools: Read Grep summer_search_assets summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree summer_save_scene
9
+ paths: ["assets/organic/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
10
+ ---
11
+
12
+ # Organic Model — Easy-Mode 3D Generation
13
+
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
+
16
+ This is the cheapest, fastest way to fill out a scene. Use it liberally — it's the recommended go-to when the user says "this scene feels empty". Each generation is ~$0.30–0.50, and the failure rate is the lowest of any 3D-asset family.
17
+
18
+ Backing tool: `summer_generate_3d`. Default `hunyuan` is great here, but `trellis` is faster and quality difference is mostly invisible on organic shapes — `trellis` is the recommended pick when generating many at once.
19
+
20
+ ## When to use
21
+
22
+ - "Make me a pine tree."
23
+ - "Generate five different rocks I can scatter."
24
+ - "I need glowing mushrooms for the cave."
25
+ - "Fill this forest scene with foliage."
26
+ - "Alien plants for the planet surface."
27
+ - "Coral for the underwater level."
28
+ - The user wants visual density without spending a lot of money or time.
29
+
30
+ ## When NOT to use
31
+
32
+ - Character (humanoid, even if "tree-person") → `summer:3d-assets/character-model` (rigging matters).
33
+ - Vehicle, weapon, hard-surface object → `summer:3d-assets/prop-model` or `summer:3d-assets/vehicle-model`.
34
+ - Tileable ground (grass field, sand) → `summer:asset-pipeline/asset-strategy` Pipeline 2 (textures, not meshes).
35
+ - Animated organic (Venus fly trap that opens, breathing pod) → generate static here, animate in-engine with bones or shape keys.
36
+ - A single hero-tree centerpiece (Yggdrasil, the One Tree) — generate via `summer:3d-assets/prop-model` with higher polycount and detail attention.
37
+
38
+ ## Polycount targets
39
+
40
+ Organic geometry tolerates aggressive polycount cuts because the silhouette is irregular — viewers can't spot poly-count drops the way they spot a low-poly cylinder.
41
+
42
+ | Use case | Tris | Pass via |
43
+ |---|---|---|
44
+ | Hero tree (mid-distance, prominent) | 4k–8k | `target_polycount: 6000` |
45
+ | Background tree (forest filler) | 1k–3k | `target_polycount: 2000` |
46
+ | Distant tree (use billboard imposter) | 200–500 | `target_polycount: 400` |
47
+ | Large rock / boulder | 800–2000 | `target_polycount: 1500` |
48
+ | Small organic (mushroom, fruit, crystal) | 300–1000 | `target_polycount: 600` |
49
+ | Vine / branch decoration | 200–500 | `target_polycount: 400` |
50
+
51
+ Generating a forest? Make 3 hero trees + 5 background trees + 3 rocks at low polycount, then scatter via `MultiMeshInstance3D` for hundreds of copies at near-zero rendering cost.
52
+
53
+ ## Steps
54
+
55
+ ### 1. Search before generating
56
+
57
+ ```
58
+ summer_search_assets(query="<organic type>", filter={ kind: "model" })
59
+ ```
60
+
61
+ ### 2. Build the prompt
62
+
63
+ Pattern: `<species> + <state/condition> + <key features> + isolated suffix`. Organic prompts are shorter than prop prompts — the model already knows what a tree looks like.
64
+
65
+ | Goal | Prompt that works |
66
+ |---|---|
67
+ | Pine tree | `A tall pine tree with dense green needles and a straight trunk, slight lean. Game asset, stylized low-poly game art, white background, isolated object.` |
68
+ | Oak tree | `A wide oak tree with sprawling branches and seasonal autumn leaves in orange and red. Game asset, stylized, white background, isolated object.` |
69
+ | Boulder | `A large mossy boulder, irregular weathered surface, patches of green moss on top. Game asset, stylized, white background, isolated object.` |
70
+ | Glowing mushroom | `A cluster of three bioluminescent mushrooms on a small mossy base, pale cyan glow, translucent caps. Game asset, stylized, white background, isolated object.` |
71
+ | Alien plant | `An alien spiral plant with tendril-like fronds, deep purple with glowing pink tips, growing from a bulbous base. Game asset, stylized, white background, isolated object.` |
72
+ | Coral cluster | `A branching coral cluster, bright orange and pink, sea-fan shapes, multiple branches. Game asset, stylized, white background, isolated object.` |
73
+ | Crystal | `A jagged amethyst crystal cluster growing from a stone base, deep purple with translucent facets. Game asset, stylized, white background, isolated object.` |
74
+ | Vine | `A hanging jungle vine with broad green leaves and small white flowers, ~2 meter length. Game asset, stylized, white background, isolated object.` |
75
+
76
+ Organic prompts that DON'T work:
77
+
78
+ | Bad prompt | Failure mode |
79
+ |---|---|
80
+ | `a tree` | Returns a generic tree, but inconsistent species across regenerations — the scene looks chaotic. Always specify species. |
81
+ | `a forest` | Returns one fused mesh of multiple trees → impossible to scatter. Generate one tree, scatter via MultiMeshInstance3D. |
82
+ | `realistic tree with photoreal bark` | Realistic = expensive polycount, ugly when stylized assets surround it. Match scene style. |
83
+ | `a tree on a hill` | The hill becomes geometry. Always say `isolated object`. |
84
+
85
+ ### 3. Confirm and call
86
+
87
+ > About to generate `pine_tree_01` via `trellis`, target ~2k tris. ~$0.30, ~30s. OK?
88
+
89
+ For batch generation, batch the confirmation:
90
+
91
+ > About to generate 3 trees + 3 rocks + 5 mushrooms (11 generations, ~$3.50, ~5 min). All low-poly via `trellis`. OK?
92
+
93
+ ```
94
+ summer_generate_3d(
95
+ prompt="A tall pine tree with dense green needles and a straight trunk, slight lean. Game asset, stylized low-poly game art, white background, isolated object.",
96
+ model="trellis",
97
+ options={ target_polycount: 2000 },
98
+ wait=true
99
+ )
100
+ summer_import_from_url(url="<fileUrl>", path="res://assets/organic/pine_tree_01.glb")
101
+ ```
102
+
103
+ ### 4. Generate variation, not duplication
104
+
105
+ If the user wants "five rocks", don't generate one rock and copy it five times in the scene — generate five subtly different prompts:
106
+
107
+ ```
108
+ "A medium boulder, mossy granite, rounded shape"
109
+ "A medium boulder, weathered limestone, sharp jagged edges"
110
+ "A medium boulder, dark basalt, flat-topped"
111
+ "A medium boulder, sandstone, layered horizontal striations"
112
+ "A medium boulder, mossy granite, tall narrow shape"
113
+ ```
114
+
115
+ Then scatter all five with random rotation. Five unique meshes + rotation = looks like 50 unique rocks.
116
+
117
+ ### 5. Wire into the scene
118
+
119
+ | Use case | Wiring | Notes |
120
+ |---|---|---|
121
+ | Single hero tree, mid-scene | `MeshInstance3D` under `Node3D` | One per scene; nothing fancy |
122
+ | Forest scatter (50+ trees) | `MultiMeshInstance3D` with one mesh ref | Single draw call for all instances |
123
+ | Foliage variety (3 species) | One `MultiMeshInstance3D` per species | Each species is one draw call |
124
+ | Distant trees | Billboard imposter (Sprite3D with a tree image) | Switch from mesh to billboard at ~50m via LOD |
125
+ | Rocks with collision | `StaticBody3D` parent + `CollisionShape3D` (ConcaveShape from mesh) | Only for rocks the player can walk into |
126
+ | Rocks without collision (background) | Just `MeshInstance3D` | Most distant rocks don't need it |
127
+
128
+ **Hero tree:**
129
+
130
+ ```
131
+ summer_add_node(parent="./World/Forest", type="MeshInstance3D", name="HeroOak")
132
+ summer_set_prop(path="./World/Forest/HeroOak", property="mesh", value="res://assets/organic/oak_tree.glb")
133
+ summer_save_scene
134
+ ```
135
+
136
+ **Forest scatter (MultiMesh):** create a `MultiMeshInstance3D`, assign a `MultiMesh` resource referencing the tree mesh, set `instance_count` to e.g. 100, and populate `set_instance_transform()` from a script with random positions + rotations. See `summer:scene-composition` for the scatter pattern.
137
+
138
+ ### 6. LOD and billboards
139
+
140
+ For dense forests, the cheapest fix beyond MultiMesh is the billboard imposter:
141
+
142
+ 1. Generate the tree mesh once at high polycount.
143
+ 2. Render it from one angle to a transparent PNG (Godot's `EditorScript` can capture a viewport).
144
+ 3. Use that PNG as a `Sprite3D` with `billboard = enabled`.
145
+ 4. Swap from `MeshInstance3D` to `Sprite3D` at ~50m camera distance via Godot's `VisibleOnScreenNotifier3D` or a custom LOD script.
146
+
147
+ For a 200-tree forest, ~10 close trees are real meshes, 190 are billboards. Frame budget saved: ~80%.
148
+
149
+ ## Anti-patterns
150
+
151
+ - **Generating "a forest" as one prompt.** Returns a single fused mesh — useless for placement. Always one species per generation, then scatter.
152
+ - **Regenerating the same species 5 times for variety.** Generate 5 *different* species/states/colors for true variety; identical regenerations don't differ enough.
153
+ - **High polycount on background organics.** A 30k-tri rock used 50 times in the background tanks the frame rate. Cap distant organics at 2k.
154
+ - **Ignoring MultiMeshInstance3D.** 100 individual MeshInstance3D nodes = 100 draw calls. 100 instances of one MultiMesh = 1 draw call. Same visual result.
155
+ - **Adding collision to every leaf and pebble.** Player only needs collision on things the body can hit. Skip it for distant scenery and small ground litter.
156
+ - **Using `meshy` (legacy).** No reason to — `trellis` is faster and `hunyuan` is higher quality.
157
+
158
+ ## Edge cases
159
+
160
+ - **Animated foliage (wind sway).** Generate static here, then add wind sway via a vertex shader on the material — `summer:vfx/shaders` (when available). No animation rig needed.
161
+ - **Underwater organics (kelp, anemones).** Same flow; expect Hunyuan to add a "ground attachment" base unless you say `floating, suspended in water`.
162
+ - **Branching meshes (vines, roots) come back too thick.** Specify `thin tendril, fine branches`, or accept and scale Y down in the editor.
163
+ - **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.
164
+ - **Crystal/glass organic.** Mesh comes back opaque. Generate the geometry, then assign a `StandardMaterial3D` with `transparency = ALPHA` and emissive in the editor.
165
+ - **Bones, skulls, dead trees.** All work great — organic forgives them more than props would. Add `weathered, sun-bleached` for desert / tundra feel.
166
+
167
+ ## Fallback (no MCP)
168
+
169
+ 1. Run prompts at the Summer dashboard or any 3D-gen web playground (Hunyuan, Trellis, Meshy).
170
+ 2. Download `.glb` files into `res://assets/organic/`.
171
+ 3. Build scatter scenes manually in Godot.
172
+
173
+ For totally free / offline alternatives: **Quaternius** (free stylized organics), **AmbientCG** (rocks + textures), **Sketchfab** free filter, **Polyhaven** (HDRIs + scans).
174
+
175
+ ## Handoff
176
+
177
+ After the organic models are scattered:
178
+
179
+ > Forest scatter ready: 3 species at `res://assets/organic/`, 100 instances each via MultiMeshInstance3D in `./World/Forest`. Next:
180
+ > - **Wind shader** (sway in breeze): `summer:vfx/shaders` when available, or hand-write a vertex displacement shader.
181
+ > - **Ground texture** (grass beneath the trees): `summer:asset-pipeline/asset-strategy` Pipeline 2 for tileable ground.
182
+ > - **Lighting / fog** (forest mood): `summer:3d-lighting` for ambient + directional sun + volumetric fog.
183
+ > - **Ambient audio** (forest birds, leaves): `summer:audio/ambient-bed`.
184
+ > - **Hero props** (a stump, a fallen log, a shrine): `summer:3d-assets/prop-model` for the hand-placed standouts.
185
+
186
+ ## See also
187
+
188
+ - `summer:3d-assets/prop-model` — for hand-placed standout pieces.
189
+ - `summer:3d-assets/environment-kit` — pair with this skill: kit pieces give the architecture, organic gives the natural softness.
190
+ - `summer:asset-pipeline/asset-strategy` — meta-router; ground textures and skyboxes go to Pipeline 2 / panoramic gen.
191
+ - `summer:scene-composition` — MultiMeshInstance3D scatter pattern.
192
+ - `_shared/mcp-tools-reference.md` — `summer_generate_3d` schema.
@@ -0,0 +1,133 @@
1
+ ---
2
+ name: prop-model
3
+ description: Use when generating a single static 3D prop — sword, barrel, chest, lantern, throne, statue, crate, key, potion, banner. One isolated object, no rigging, wired into the scene as a MeshInstance3D. Trigger on "make a sword", "generate a chest", "I need a barrel", "add a lantern model", "give me a treasure prop", "create a statue".
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: 3d-assets
7
+ user-invocable: true
8
+ allowed-tools: Read Grep summer_search_assets summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_get_scene_tree summer_save_scene
9
+ paths: ["assets/models/**", "**/*.tscn", "**/*.gd"]
10
+ ---
11
+
12
+ # Prop Model — Generate One Static 3D Prop and Wire It
13
+
14
+ One prop, one mesh, one MeshInstance3D. This is the bread-and-butter call of the 3D-asset family — most game-world objects are static props. The skill exists to keep two things tight: the **prompt shape** that produces a clean isolated mesh on the first try, and the **wire-in pattern** that gets the asset into the scene without leaving orphans in `res://assets/models/`.
15
+
16
+ The backing tool is `summer_generate_3d`. Default model is `hunyuan` (Hunyuan 3D v3.1 Pro — best quality). Use `trellis` when speed matters (Trellis 2 is ~2× faster, slightly lower fidelity). `meshy` is the legacy fallback — only pick it if the user asks by name.
17
+
18
+ ## When to use
19
+
20
+ - "Make me a treasure chest."
21
+ - "Generate a viking axe."
22
+ - "I need a wooden barrel for the cellar."
23
+ - "Create a sci-fi crate."
24
+ - Any single, static, non-character, non-modular object the player will see in 3D space.
25
+
26
+ ## When NOT to use
27
+
28
+ - Character / humanoid → `summer:3d-assets/character-model` (needs T-pose + rig pass).
29
+ - A set of matching pieces (walls, floors, doors, pillars) → `summer:3d-assets/environment-kit` (style-locked family).
30
+ - Trees, rocks, foliage → `summer:3d-assets/organic-model` (organic forgives AI artifacts; cheaper recipe).
31
+ - Cars, ships, mechs → `summer:3d-assets/vehicle-model` (hard-surface specifics).
32
+ - Walls / floors / repeating geometry → `summer:asset-pipeline/asset-strategy` Pipeline 2 (textures + CSG).
33
+ - "I just need a placeholder" → propose a primitive (`BoxMesh` / `CylinderMesh`) instead. Generation is metered.
34
+
35
+ ## Steps
36
+
37
+ ### 1. Search before generating
38
+
39
+ ```
40
+ summer_search_assets(query="<prop name>", filter={ kind: "model" })
41
+ ```
42
+
43
+ If a fitting model exists, propose reuse:
44
+
45
+ > Found `assets/models/treasure_chest_01.glb`. Reuse this, or generate fresh?
46
+
47
+ ### 2. Pick a polycount target
48
+
49
+ | Use case | Tris | Pass via |
50
+ |---|---|---|
51
+ | Hero prop (sword on hip, key item) | 3k–8k | `options: { target_polycount: 5000 }` |
52
+ | Background prop (crate, barrel, sack) | 200–800 | `options: { target_polycount: 600 }` |
53
+ | Mid-range interactive (chest, lantern) | 1k–3k | `options: { target_polycount: 2000 }` |
54
+ | Cinematic showcase (throne, statue) | 10k–30k | `options: { target_polycount: 20000 }` |
55
+
56
+ Default if you don't pass it: provider picks (~10k–30k). For most game-world props, that's overkill — pass a target.
57
+
58
+ ### 3. Build the prompt
59
+
60
+ Pattern: `<object> + <material> + <silhouette/details> + isolated-object suffix`.
61
+
62
+ | Goal | Prompt that works |
63
+ |---|---|
64
+ | Treasure chest | `A wooden treasure chest with iron bands and a heavy padlock, lid slightly ajar, gold coins spilling. Game asset, centered, stylized, white background, isolated object.` |
65
+ | Viking axe | `A two-handed viking battle axe, weathered iron head with rune etchings, leather-wrapped wooden haft. Game asset, centered, stylized, white background, isolated object.` |
66
+ | Lantern | `A medieval brass lantern with stained glass panels and a hooked handle, candle inside. Game asset, centered, stylized, white background, isolated object.` |
67
+ | Throne | `An ornate stone throne carved with serpent motifs, red velvet cushion, tall pointed back. Game asset, centered, stylized, white background, isolated object.` |
68
+ | Sci-fi crate | `A weathered sci-fi cargo crate, metal panels with yellow hazard stripes, recessed handles. Game asset, centered, stylized, white background, isolated object.` |
69
+ | Potion bottle | `A glass potion bottle with a cork stopper, glowing purple liquid inside, leather strap around the neck. Game asset, centered, stylized, white background, isolated object.` |
70
+
71
+ The `isolated object` and `white background` clauses are load-bearing — without them you get scene context (table, ground plane) baked into the mesh.
72
+
73
+ ### 4. Confirm and call
74
+
75
+ > About to generate `viking_axe` via `hunyuan`, target ~5k tris. ~$0.50, ~60s. OK?
76
+
77
+ ```
78
+ summer_generate_3d(
79
+ prompt="A two-handed viking battle axe, weathered iron head with rune etchings, leather-wrapped wooden haft. Game asset, centered, stylized, white background, isolated object.",
80
+ model="hunyuan",
81
+ options={ target_polycount: 5000 },
82
+ wait=true
83
+ )
84
+ ```
85
+
86
+ Returns `{ asset: { fileUrl }, ... }`.
87
+
88
+ ### 5. Import and wire
89
+
90
+ ```
91
+ summer_import_from_url(url="<fileUrl>", path="res://assets/models/viking_axe.glb")
92
+ summer_add_node(parent="./World/Props", type="MeshInstance3D", name="VikingAxe")
93
+ summer_set_prop(path="./World/Props/VikingAxe", property="mesh", value="res://assets/models/viking_axe.glb")
94
+ summer_save_scene
95
+ ```
96
+
97
+ For interactive props (chest the player opens, lantern the player picks up), wrap the MeshInstance3D in a `StaticBody3D` (or `RigidBody3D` for physics props) with a `CollisionShape3D` sibling — see `summer:scene-composition` for the parent-shape pattern.
98
+
99
+ ## Anti-patterns
100
+
101
+ - **Scene context in the prompt.** "A sword lying on a wooden table" → the table becomes geometry. Always say `isolated object`.
102
+ - **Multi-object prompts.** "A sword and a shield" → fused single mesh. Generate separately.
103
+ - **Skipping `target_polycount` for background props.** A 30k-tri barrel in the background tanks frame rate when the level has 50 of them.
104
+ - **Forgetting to import.** `fileUrl` from `summer_generate_3d` is a remote URL — you MUST `summer_import_from_url` before referencing it as `res://...`.
105
+ - **Generating before searching.** Reuse beats regenerate every time.
106
+ - **Picking `meshy` by default.** It's legacy. `hunyuan` is better; `trellis` is faster.
107
+
108
+ ## Edge cases
109
+
110
+ - **Transparent objects (glass, ice, gem).** AI 3D gen makes these opaque. Generate the mesh, then assign a `StandardMaterial3D` with `transparency = ALPHA` and a low `albedo_color.a` in the editor.
111
+ - **Long thin props (spear, staff, banner pole).** Hunyuan sometimes thickens the shaft. Trellis handles thin geometry better — try it as the second attempt.
112
+ - **Concave interior (open chest, hollow vase).** Specify "lid open" or "hollow inside" — Hunyuan defaults to closed solids.
113
+ - **Symmetrical prop comes back asymmetric.** Add `symmetric, mirrored` to the prompt and regenerate.
114
+
115
+ ## Fallback (no MCP)
116
+
117
+ The user can run the same prompt at the Summer dashboard (or directly via the Hunyuan / Trellis web UIs), download the `.glb`, drop it into `res://assets/models/`, and Godot's import dock will pick it up. Then add a MeshInstance3D manually in the Godot editor and assign the mesh.
118
+
119
+ ## Handoff
120
+
121
+ After the prop is wired:
122
+
123
+ > `viking_axe.glb` imported and placed at `./World/Props/VikingAxe`. Next:
124
+ > - For physics (player can knock it over), wrap in `RigidBody3D` + `CollisionShape3D` — see `summer:scene-composition`.
125
+ > - For pickup interaction, see `summer:design-mechanic` for the pickup pattern.
126
+ > - For matching props in the same style (chest → barrel → crate as a treasure-room kit), use `summer:3d-assets/environment-kit` with this prop as the style anchor.
127
+
128
+ ## See also
129
+
130
+ - `summer:asset-pipeline/asset-strategy` — the meta-router that decides between this skill and Pipeline 2 (textures).
131
+ - `summer:3d-assets/character-model` — for humanoids.
132
+ - `summer:3d-assets/environment-kit` — for style-locked sets.
133
+ - `_shared/mcp-tools-reference.md` — `summer_generate_3d` parameter schema.
@@ -0,0 +1,202 @@
1
+ ---
2
+ name: vehicle-model
3
+ description: Use when generating a hard-surface vehicle — car, motorcycle, spaceship, hover bike, boat, mech, tank, helicopter. Static mesh, optional secondary detail-texture pass, wired as Vehicle3D (player-driven) or MeshInstance3D (background). Trigger on "make a car", "spaceship model", "generate a mech", "I need a vehicle", "hover bike", "tank model", "racing car".
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: 3d-assets
7
+ user-invocable: true
8
+ allowed-tools: Read Grep summer_search_assets summer_generate_3d summer_generate_image summer_import_from_url summer_add_node summer_set_prop summer_inspect_node summer_inspect_resource summer_get_scene_tree summer_save_scene
9
+ paths: ["assets/vehicles/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
10
+ ---
11
+
12
+ # Vehicle Model — Hard-Surface 3D Generation
13
+
14
+ Vehicles are the hardest 3D-gen category. Hard surfaces (flat panels, sharp edges, symmetrical bodies) expose every flaw the AI mesher has — smoothing-group artifacts on flat panels, asymmetric headlights, melted door seams. This skill exists to push the success rate up by giving the model **multi-angle reference**, picking the right backend, and using a **secondary detail-texture pass** to recover crispness on the body panels.
15
+
16
+ Backing tool: `summer_generate_3d`. Default model is `hunyuan` (best general quality). For pure hard-surface (clean spaceship, F1 car), try `trellis` first — it tends to preserve panel edges better.
17
+
18
+ ## When to use
19
+
20
+ - "Make me a player car for a racing game."
21
+ - "Generate a sci-fi fighter spaceship."
22
+ - "I need a hover bike for the desert level."
23
+ - "Create a mech for the boss fight."
24
+ - "Background traffic — generate three civilian sedans."
25
+
26
+ ## When NOT to use
27
+
28
+ - Character driving the vehicle → that's `summer:3d-assets/character-model`. Generate them separately and parent the character to the vehicle's seat.
29
+ - Vehicle interior (cockpit, dashboard) as a first-person view → generate as a separate "interior" prop via `summer:3d-assets/prop-model` with first-person framing.
30
+ - A scenery vehicle that never moves and is far from camera (parked truck in the distance) → `summer:3d-assets/prop-model` is fine; vehicle-model's overhead isn't worth it.
31
+ - Procedural / customizable vehicles (modular ship parts) → use `summer:3d-assets/environment-kit` to generate a vehicle-parts kit instead.
32
+
33
+ ## Polycount targets
34
+
35
+ | Use case | Tris | Pass via |
36
+ |---|---|---|
37
+ | Player vehicle (close camera, lots of screen time) | 15k–30k | `target_polycount: 25000` |
38
+ | Hero showpiece (cinematic, garage view) | 30k–60k | `target_polycount: 50000` |
39
+ | Background traffic (mid-range, multiple onscreen) | 2k–5k | `target_polycount: 4000` |
40
+ | Distant flyby / parked scenery | 1k–2k | `target_polycount: 1500` |
41
+
42
+ Vehicles benefit more from polycount than props — flat panels need edge density to look right. Don't go below 2k for anything the camera will get close to.
43
+
44
+ ## Multi-angle reference — the single biggest quality lever
45
+
46
+ Vehicles are highly view-dependent. A front-only reference produces a mesh with great front detail and a melted rear. The fix: generate a **front + 3/4 side composite reference** before the 3D pass.
47
+
48
+ ```
49
+ summer_generate_image(
50
+ prompt="A sleek red sports car, front view AND 3/4 rear-side view side by side, two angles in one image, white background, studio lighting, clean references for 3D modeling, isolated, no scenery."
51
+ )
52
+ ```
53
+
54
+ Most image models will produce a two-view composite. Then feed it to image-to-3D:
55
+
56
+ ```
57
+ summer_generate_3d(
58
+ kind="image-to-3d",
59
+ imageUrl="<composite reference url>",
60
+ model="hunyuan",
61
+ options={ target_polycount: 25000 }
62
+ )
63
+ ```
64
+
65
+ If the user has reference images already (concept art, photos), prefer those — composite them into a single image first if they aren't already.
66
+
67
+ ## Steps
68
+
69
+ ### 1. Search before generating
70
+
71
+ ```
72
+ summer_search_assets(query="<vehicle type>", filter={ kind: "model" })
73
+ ```
74
+
75
+ ### 2. Pick model and polycount
76
+
77
+ For hard-edged vehicles (spaceships, F1, mechs), try `trellis` first — sharper panel edges. For organic-curved vehicles (muscle cars, motorcycles, classic boats), `hunyuan` handles the curves better.
78
+
79
+ ### 3. Build the prompt
80
+
81
+ Pattern: `<vehicle type> + <silhouette / era / style> + <materials> + <surface state> + isolated suffix`.
82
+
83
+ | Goal | Prompt that works |
84
+ |---|---|
85
+ | Player race car | `A sleek modern Formula 1 race car, aerodynamic carbon-fiber bodywork, large rear wing, exposed wheels, racing livery in red and white. Front and 3/4 side views. Game asset, stylized, clean white background, isolated vehicle.` |
86
+ | Sci-fi fighter | `A sleek single-seat sci-fi space fighter, swept-forward wings, twin engine nacelles, glass cockpit canopy, painted matte gray with cyan trim. Front and 3/4 side views. Game asset, stylized hard-surface, white background, isolated vehicle.` |
87
+ | Hover bike | `A rusted desert hover bike, exposed engine block, single seat, handlebars, no wheels (hover thrusters underneath), weathered orange paint. Front and 3/4 side views. Game asset, stylized, white background, isolated vehicle.` |
88
+ | Mech | `A 4 meter tall bipedal combat mech, blocky armored torso, articulated arms with rifle and missile pod, thick legs with hydraulic pistons, painted olive drab with hazard stripes. Front and 3/4 side views. Game asset, hard-surface stylized, white background, isolated vehicle.` |
89
+ | Background sedan | `A generic 90s civilian sedan, four doors, beige paint, slightly worn. Front and 3/4 side views. Game asset, low-detail stylized, white background, isolated vehicle.` |
90
+
91
+ The phrase `front and 3/4 side views` is what triggers the multi-angle composite reference internally.
92
+
93
+ ### 4. Confirm and call
94
+
95
+ > About to generate `red_race_car` via `hunyuan`, target ~25k tris, multi-angle ref. ~$0.60, ~90s. OK?
96
+
97
+ ```
98
+ summer_generate_3d(
99
+ prompt="A sleek modern Formula 1 race car, ...",
100
+ model="hunyuan",
101
+ options={ target_polycount: 25000 },
102
+ wait=true
103
+ )
104
+ summer_import_from_url(url="<fileUrl>", path="res://assets/vehicles/race_car.glb")
105
+ ```
106
+
107
+ ### 5. Inspect for hard-surface artifacts
108
+
109
+ ```
110
+ summer_inspect_resource(path="res://assets/vehicles/race_car.glb")
111
+ ```
112
+
113
+ Open the import preview. Look for:
114
+ - **Smoothing-group artifacts on flat panels** (visible as banding under light) → fix in step 6 with a detail texture, or re-import with `Generate Tangents = on` and a custom shader.
115
+ - **Asymmetric headlights / wheels** → regenerate with `symmetric, mirrored bilateral` added to the prompt.
116
+ - **Melted door seams / panel gaps** → run the detail-texture pass (step 6).
117
+
118
+ ### 6. Optional: secondary detail-texture pass
119
+
120
+ For hero vehicles, run a texture-only pass to recover panel-line crispness without re-meshing:
121
+
122
+ ```
123
+ summer_generate_3d(
124
+ kind="texture",
125
+ imageUrl="<original front-view reference>",
126
+ model="hunyuan",
127
+ options={ target_polycount: 25000 } // matched to existing mesh
128
+ )
129
+ ```
130
+
131
+ This re-textures the existing mesh with sharper detail — panel lines, decals, weathering. Cheaper than re-meshing. Apply via material override in the editor.
132
+
133
+ ### 7. Wire into the scene
134
+
135
+ | Use case | Parent type | Notes |
136
+ |---|---|---|
137
+ | Player-driven (car, bike, hover) | `VehicleBody3D` (Godot 4.5 wheeled) or `RigidBody3D` (free physics) | Add `VehicleWheel3D` children for wheeled vehicles |
138
+ | Player-driven (spaceship, mech) | `RigidBody3D` or `CharacterBody3D` | Custom thrust / walk code, see `summer:character-controllers` |
139
+ | Background scenery (parked, flyby) | `MeshInstance3D` under a `Node3D` | No physics, no collision needed for distant traffic |
140
+ | Background traffic (moving but not interactive) | `Node3D` + `AnimationPlayer` driving the position | Cheap, no physics overhead |
141
+
142
+ **Player car wiring:**
143
+
144
+ ```
145
+ summer_add_node(parent="./World", type="VehicleBody3D", name="RaceCar")
146
+ summer_add_node(parent="./World/RaceCar", type="MeshInstance3D", name="Body")
147
+ summer_set_prop(path="./World/RaceCar/Body", property="mesh", value="res://assets/vehicles/race_car.glb")
148
+ summer_add_node(parent="./World/RaceCar", type="CollisionShape3D", name="Collider")
149
+ # Add a BoxShape3D resource matched to the AABB
150
+ # Add VehicleWheel3D children at each wheel position
151
+ summer_save_scene
152
+ ```
153
+
154
+ **Background scenery wiring:**
155
+
156
+ ```
157
+ summer_add_node(parent="./World/Street", type="MeshInstance3D", name="ParkedSedan")
158
+ summer_set_prop(path="./World/Street/ParkedSedan", property="mesh", value="res://assets/vehicles/sedan.glb")
159
+ summer_save_scene
160
+ ```
161
+
162
+ ## Anti-patterns
163
+
164
+ - **Single-angle reference for a hero vehicle.** Front-only → melted rear. Always go multi-angle for anything the player gets close to.
165
+ - **Flat-shaded prompt for hard surfaces.** "Smooth shading", "rounded edges" → loses the panel-line crispness that defines vehicles. Prefer "hard-surface", "panel-lined", "crisp edges".
166
+ - **Skipping symmetry callouts.** Vehicles are bilaterally symmetric — without `symmetric, mirrored` you get one headlight bigger than the other 30% of the time.
167
+ - **Asking the mesh pass to invent decals / liveries.** It can't — the mesh has the silhouette but the decals get geometry-baked weirdly. Use the texture pass for liveries.
168
+ - **Wrapping a background sedan in VehicleBody3D.** Wastes physics for a parked car. Use MeshInstance3D under Node3D.
169
+ - **Picking `meshy` (legacy).** Worse hard-surface fidelity than hunyuan or trellis.
170
+
171
+ ## Edge cases
172
+
173
+ - **Tracked vehicle (tank).** AI mesh-gen handles the hull but the tracks come back as a fused ring. Generate the hull only, then add tracks as a separate `summer:3d-assets/prop-model` (or use a tiled texture on a torus). For animation, scroll the track texture's UV.
174
+ - **Articulated vehicle (mech with shoulders, hips, knees).** The mesh is one piece — joints aren't separated. For animated mechs, treat as a humanoid: generate as `summer:3d-assets/character-model` with the rig pass, then animate via `summer:animation/generate-motion` (custom backend, prompt as "mech walks heavily").
175
+ - **Vehicle with rotor (helicopter, drone).** Generate without rotor, then add the rotor as a separate `summer:3d-assets/prop-model` and parent it. Spin via code in `_process`.
176
+ - **Open-top vehicle (convertible, jeep).** Specify "open top, no roof" — defaults often add a roof.
177
+ - **The user wants the cockpit interior visible.** Generate exterior here, then a separate `summer:3d-assets/prop-model` for the interior, and switch meshes when the camera enters first-person view.
178
+
179
+ ## Fallback (no MCP)
180
+
181
+ 1. Generate the multi-angle reference at the Summer dashboard (or Midjourney / nano-banana web).
182
+ 2. Upload to Hunyuan or Trellis web playground → image-to-3D → download `.glb`.
183
+ 3. Drop into `res://assets/vehicles/`.
184
+ 4. Wire as VehicleBody3D / MeshInstance3D in the Godot editor manually.
185
+
186
+ ## Handoff
187
+
188
+ After the vehicle is wired:
189
+
190
+ > `race_car.glb` placed at `./World/RaceCar` as a VehicleBody3D. Next:
191
+ > - **Vehicle controls:** WASD steering / accel — see `summer:character-controllers` for the vehicle controller pattern (or write directly with `engine_force`, `steering`, and `brake` on VehicleBody3D).
192
+ > - **Driver character:** generate via `summer:3d-assets/character-model` and parent to the seat position.
193
+ > - **Engine sound + tire screech:** `summer:audio/sound-effect` for one-shots, `summer:audio/ambient-bed` for the engine loop.
194
+ > - **Particles:** exhaust smoke, dust trail, sparks on collision — `summer:vfx/particles` (when available) or built-in GPUParticles3D.
195
+
196
+ ## See also
197
+
198
+ - `summer:3d-assets/character-model` — for the driver/pilot.
199
+ - `summer:3d-assets/prop-model` — for separable parts (rotors, decals as decals, modular kit pieces).
200
+ - `summer:asset-pipeline/asset-strategy` — meta-router.
201
+ - `summer:character-controllers` — for player-driven vehicle input wiring.
202
+ - `_shared/mcp-tools-reference.md` — `summer_generate_3d` schema, including `kind: "texture"` for the secondary detail pass.
@@ -481,5 +481,7 @@ For a fully-rigged enemy with anim controller + loot drop:
481
481
  - `ai-and-npcs/navmesh-pathfinding/SKILL.md` — NavigationAgent3D for movement
482
482
  - `ai-and-npcs/llm-driven-dialogue/SKILL.md` — Summer's wedge for talking NPCs
483
483
  - `ai-and-npcs/boss-patterns/SKILL.md` — phase transitions, mechanics
484
- - `visual-effects/vfx/SKILL.md` — hit flash and death VFX recipes
484
+ - `visual-effects/recipes/hit-spark/SKILL.md` — hit flash recipe
485
+ - `visual-effects/recipes/dissolve/SKILL.md` — death dissolve recipe
486
+ - `visual-effects/game-feel/SKILL.md` — screen-feel discipline (camera shake, hit-stop)
485
487
  - `scripting-patterns/state-machine-patterns/SKILL.md` — generic FSM patterns