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
|
@@ -11,7 +11,7 @@ paths: ["assets/models/**", "**/*.tscn", "**/*.gd"]
|
|
|
11
11
|
|
|
12
12
|
# Prop Model — Generate One Static 3D Prop and Wire It
|
|
13
13
|
|
|
14
|
-
One prop, one mesh, one MeshInstance3D.
|
|
14
|
+
One prop, one mesh, one MeshInstance3D. Most game-world objects are static props, so this is the most common 3D-asset call. The skill keeps 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
15
|
|
|
16
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
17
|
|
|
@@ -72,7 +72,7 @@ The `isolated object` and `white background` clauses are load-bearing — withou
|
|
|
72
72
|
|
|
73
73
|
### 4. Confirm and call
|
|
74
74
|
|
|
75
|
-
> About to generate `viking_axe` via `hunyuan`, target ~5k tris
|
|
75
|
+
> About to generate `viking_axe` via `hunyuan`, target ~5k tris, ~60s. This uses credits. OK?
|
|
76
76
|
|
|
77
77
|
```
|
|
78
78
|
summer_generate_3d(
|
|
@@ -127,8 +127,8 @@ the parent-shape pattern.
|
|
|
127
127
|
|
|
128
128
|
The user can run the same prompt in the Summer dashboard or a supported
|
|
129
129
|
provider UI, download the `.glb`, and drop it into `res://assets/models/`.
|
|
130
|
-
Summer Engine's Import dock will pick it up. Then
|
|
131
|
-
|
|
130
|
+
Summer Engine's Import dock will pick it up. Then instance the `.glb` scene in
|
|
131
|
+
the level (an imported `.glb` is a scene, not a `Mesh`).
|
|
132
132
|
|
|
133
133
|
## Handoff
|
|
134
134
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: psx-retro-rendering
|
|
3
|
-
description: "
|
|
3
|
+
description: "PlayStation 1 rendering in Summer Engine — low-res output, RGB5 and exact dither, affine textures, vertex snapping, blend modes, fog; limits named."
|
|
4
4
|
license: MIT
|
|
5
5
|
category: shaders
|
|
6
6
|
tags:
|
|
@@ -13,19 +13,19 @@ confidence: extracted
|
|
|
13
13
|
adaptation: translated
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
# PSX Retro Rendering in
|
|
16
|
+
# PSX Retro Rendering in Summer Engine
|
|
17
17
|
|
|
18
18
|
## Outcome
|
|
19
19
|
|
|
20
20
|
Recreate the visible behavior of the original PlayStation rendering pipeline while keeping three things distinct:
|
|
21
21
|
|
|
22
22
|
1. behavior the PS1 actually had;
|
|
23
|
-
2. the
|
|
23
|
+
2. the engine technique used to imitate it;
|
|
24
24
|
3. places where the imitation cannot reproduce the hardware exactly.
|
|
25
25
|
|
|
26
26
|
The characteristic result comes from several interacting constraints, not from a single fullscreen filter: a low-resolution framebuffer, 5-bit color, conditional polygon dithering, unfiltered affine textures, integer screen-coordinate vertices, CPU-style polygon ordering, vertex colors and lighting, fixed semi-transparency equations, and depth-cued fog.
|
|
27
27
|
|
|
28
|
-
The article author's MIT-licensed
|
|
28
|
+
The article author's MIT-licensed addon is useful implementation evidence:
|
|
29
29
|
|
|
30
30
|
- `https://github.com/wyvernbw/godot-psxlike`
|
|
31
31
|
- Treat it as a reference implementation, not as proof that every approximation is hardware-exact, compatible with the current Summer Engine build, or suitable for every scene.
|
|
@@ -40,7 +40,7 @@ Do not activate this skill for an ordinary low-resolution or pixel-art presentat
|
|
|
40
40
|
|
|
41
41
|
## Authenticity Boundary
|
|
42
42
|
|
|
43
|
-
| Visible behavior | Original hardware mechanism | Practical
|
|
43
|
+
| Visible behavior | Original hardware mechanism | Practical engine implementation | Accuracy boundary |
|
|
44
44
|
|---|---|---|---|
|
|
45
45
|
| Low resolution | 1 MB VRAM shared by framebuffers and textures | Render the root viewport at a PSX-era base size | Does not reproduce the VRAM budget |
|
|
46
46
|
| RGB5 color | GPU draws RGB555 plus one mask bit | Quantize fragment color to 31 levels per channel | Mask-bit write protection is normally omitted |
|
|
@@ -48,7 +48,7 @@ Do not activate this skill for an ordinary low-resolution or pixel-art presentat
|
|
|
48
48
|
| Texture warping | UVs are interpolated affinely | Cancel the GPU's perspective correction with clip `w` | Subdivision strongly changes the result |
|
|
49
49
|
| Vertex wobble | Integer screen coordinates and no subpixel rasterization | Quantize clip/NDC coordinates against the viewport | Do not use an arbitrary object-space grid |
|
|
50
50
|
| Polygon overlap | No hardware Z-buffer; the CPU submits depth-sorted primitives | Flat `DEPTH`, mesh subdivision, and an optional depth bias | Flat depth is only a proxy for draw ordering |
|
|
51
|
-
| Lighting | CPU/GTE-derived colors, Gouraud interpolation | Calculate light at vertices and carry it through `COLOR` |
|
|
51
|
+
| Lighting | CPU/GTE-derived colors, Gouraud interpolation | Calculate light at vertices and carry it through `COLOR` | The engine's ordinary per-pixel light pass is different |
|
|
52
52
|
| Semi-transparency | Four fixed framebuffer blend equations | Sample the screen texture in a transparent material | Transparent objects cannot reliably blend with each other |
|
|
53
53
|
| Fog | GTE depth cue and color operations | Quantized per-vertex factor plus modulation or a fragment blend | Authentic Silent Hill fog is a two-pass technique |
|
|
54
54
|
|
|
@@ -56,9 +56,9 @@ The PS1 GPU is fundamentally a 2D ordered polygon rasterizer. Avoid saying that
|
|
|
56
56
|
|
|
57
57
|
## Summer Engine Integration
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
`ShaderMaterial` supports shared shaders, material uniforms, and per-instance uniforms through `GeometryInstance3D.set_instance_shader_parameter()`. Prefer per-instance uniforms over duplicating materials when changing mesh-local PSX settings.
|
|
60
60
|
|
|
61
|
-
In Summer's material workflow, attach a `.tres` material override to the `MeshInstance3D`, not its parent `Node3D`, and save the scene after assignment. A custom PSX pipeline is an appropriate `ShaderMaterial` use because `StandardMaterial3D` cannot express affine interpolation, screen-coordinate snapping, or fixed framebuffer blend equations.
|
|
61
|
+
In Summer's material workflow, attach a `.tres` material override to the `MeshInstance3D`, not its parent `Node3D`, and save the scene after assignment. A custom PSX pipeline is an appropriate `ShaderMaterial` use because `StandardMaterial3D` cannot express affine interpolation, screen-coordinate snapping, or fixed framebuffer blend equations.
|
|
62
62
|
|
|
63
63
|
Use this project shape:
|
|
64
64
|
|
|
@@ -84,7 +84,7 @@ Assign the spatial shader material to meshes. A `WorldEnvironment` or camera env
|
|
|
84
84
|
|
|
85
85
|
Shared materials, texture arrays, instance uniforms, and Forward+ can improve batching opportunities. They do not guarantee that arbitrary meshes render in one draw call. Transparent and opaque rendering already require separate materials.
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
Check compatibility-sensitive names and shader behavior against the installed Summer Engine build.
|
|
88
88
|
|
|
89
89
|
## Agent Procedure
|
|
90
90
|
|
|
@@ -109,7 +109,7 @@ Disable MSAA, TAA, FXAA, texture filtering, and modern post-effects on the PSX p
|
|
|
109
109
|
|
|
110
110
|
### 2. Keep the Color Pipeline Explicit
|
|
111
111
|
|
|
112
|
-
RGB5 quantization and the PS1 dither operate on display-encoded RGB values, not on linear-light values.
|
|
112
|
+
RGB5 quantization and the PS1 dither operate on display-encoded RGB values, not on linear-light values. The Forward+ color conversions can otherwise change the palette and dither response.
|
|
113
113
|
|
|
114
114
|
Choose one coherent texture path:
|
|
115
115
|
|
|
@@ -159,7 +159,7 @@ vec3 psx_dither(vec3 color, vec2 fragcoord, bool eligible) {
|
|
|
159
159
|
}
|
|
160
160
|
```
|
|
161
161
|
|
|
162
|
-
On hardware, dithering was selectable per polygon and was available only to Gouraud-shaded or texture-modulated polygons. In a normal
|
|
162
|
+
On hardware, dithering was selectable per polygon and was available only to Gouraud-shaded or texture-modulated polygons. In a normal mesh shader, a per-mesh instance uniform is a practical compromise:
|
|
163
163
|
|
|
164
164
|
```glsl
|
|
165
165
|
bool dither_eligible = shading == SHADING_GOURAUD || use_modulation;
|
|
@@ -200,7 +200,7 @@ if (texturing == TEX_TEXTURED && all(equal(color, vec3(0.0)))) {
|
|
|
200
200
|
|
|
201
201
|
PS1 polygons can be flat- or Gouraud-shaded, textured or untextured, and raw-textured or texture-modulated. Preserve those as explicit modes.
|
|
202
202
|
|
|
203
|
-
True per-triangle flat colors are awkward in an ordinary
|
|
203
|
+
True per-triangle flat colors are awkward in an ordinary mesh shader. Practical choices are:
|
|
204
204
|
|
|
205
205
|
- use one `flat_color` instance uniform for a whole mesh;
|
|
206
206
|
- duplicate triangle vertices and bake the same color into all three;
|
|
@@ -258,7 +258,7 @@ Use the snapped value for `POSITION` and for the clip position carried to the fr
|
|
|
258
258
|
|
|
259
259
|
### 8. Treat Flat Depth as an Approximation
|
|
260
260
|
|
|
261
|
-
The original GPU drew polygons in submission order. A
|
|
261
|
+
The original GPU drew polygons in submission order. A spatial shader cannot reproduce the CPU ordering table, so the reference shader uses a non-interpolated depth value:
|
|
262
262
|
|
|
263
263
|
```glsl
|
|
264
264
|
varying flat float polygon_depth;
|
|
@@ -287,7 +287,7 @@ If exact ordering is a requirement, sort and submit appropriately partitioned ge
|
|
|
287
287
|
|
|
288
288
|
On original hardware, the CPU/GTE calculates vertex colors. Normals are not interpolated and lit per fragment. The GTE provides a basic three-light directional model; games can also implement their own point-light logic.
|
|
289
289
|
|
|
290
|
-
|
|
290
|
+
The normal `light()` path is per fragment. Enabling vertex lighting gets closer geometrically, but lighting can be applied after the custom fragment pipeline, which leaves gradients too smooth and bypasses the intended RGB5/dither response.
|
|
291
291
|
|
|
292
292
|
For a consistent result:
|
|
293
293
|
|
|
@@ -314,7 +314,7 @@ For existing framebuffer color `B` and incoming fragment color `F`, support:
|
|
|
314
314
|
| Subtract | `B - F` |
|
|
315
315
|
| Quarter add | `B + 0.25 * F` |
|
|
316
316
|
|
|
317
|
-
These are fixed blend modes, not ordinary source-alpha blending.
|
|
317
|
+
These are fixed blend modes, not ordinary source-alpha blending. Screen-texture access moves the material into the transparent pass. Keep common pipeline code in a `.gdshaderinc` file and provide separate opaque and transparent shaders.
|
|
318
318
|
|
|
319
319
|
Apply the selected blend before the final dither, RGB5 quantization, and linear conversion:
|
|
320
320
|
|
|
@@ -361,8 +361,8 @@ Preserve these relationships even if the implementation is reorganized:
|
|
|
361
361
|
- Affine UV compensation multiplies at the vertex and divides after interpolation.
|
|
362
362
|
- Vertex lighting and modulation happen before fragment dithering and quantization.
|
|
363
363
|
- Dithering uses fragment coordinates and precedes RGB5 quantization.
|
|
364
|
-
- RGB5 and dithering operate in sRGB; the final `ALBEDO` is converted to linear
|
|
365
|
-
- Flat depth is explicitly labeled as
|
|
364
|
+
- RGB5 and dithering operate in sRGB; the final `ALBEDO` is converted to linear.
|
|
365
|
+
- Flat depth is explicitly labeled as an approximation of ordered drawing.
|
|
366
366
|
- Opaque and transparent materials share code but remain separate render paths.
|
|
367
367
|
- Silent Hill-style single-pass fog is labeled as an approximation if geometry is not actually rendered twice.
|
|
368
368
|
|
|
@@ -390,7 +390,7 @@ Preserve these relationships even if the implementation is reorganized:
|
|
|
390
390
|
- **Textures explode on large surfaces:** subdivide geometry or reduce grazing camera angles; affine mapping is working but uncontrolled.
|
|
391
391
|
- **A floor covers nearby meshes:** this is a flat-depth proxy failure; subdivide first, then apply a small depth modifier.
|
|
392
392
|
- **Transparent objects do not blend with each other:** this is the screen-texture/transparent-pass limitation.
|
|
393
|
-
- **Lighting gradients look modern and smooth:**
|
|
393
|
+
- **Lighting gradients look modern and smooth:** the engine's per-fragment lighting is bypassing the custom vertex-color pipeline.
|
|
394
394
|
- **Colored modulation fog looks too bright:** modulation is not a conventional color lerp; choose black or use the labeled Silent Hill-style approximation.
|
|
395
395
|
- **Flat fog is excessively patterned:** use an RGB5-representable fog color, dither before quantizing, and quantize with `round()`.
|
|
396
396
|
- **Batching is worse than expected:** different meshes, materials, transparency paths, shader variants, or instance state can split batches; shared materials do not guarantee one draw call.
|
|
@@ -406,11 +406,11 @@ Verify the running client, not only shader compilation:
|
|
|
406
406
|
5. Rotate a large textured quad to expose affine warping, then subdivide it and confirm the distortion decreases.
|
|
407
407
|
6. Overlap intersecting triangles and verify the chosen flat-depth approximation and depth modifiers are understood.
|
|
408
408
|
7. Test raw texture mode, half-gray neutral modulation, and the pure-black transparency rule independently.
|
|
409
|
-
8. Compare a custom vertex-lit mesh against
|
|
409
|
+
8. Compare a custom vertex-lit mesh against the engine's per-pixel lighting and confirm the light gradient passes through dither and RGB5.
|
|
410
410
|
9. Exercise every transparency equation over known background colors, then separately demonstrate the overlapping-transparent limitation.
|
|
411
411
|
10. Test black modulation fog, colored modulation fog, and the Silent Hill-style approximation at the near and far planes.
|
|
412
412
|
11. Capture the same scene in Compatibility and Forward+ if both are supported; investigate color-space or feature differences rather than assuming parity.
|
|
413
413
|
|
|
414
414
|
## Confidence
|
|
415
415
|
|
|
416
|
-
`extracted` — Hardware mechanisms and the
|
|
416
|
+
`extracted` — Hardware mechanisms and the engine techniques are drawn from Calin P's hardware-informed article and MIT reference addon. The skill explicitly identifies modern approximations and known limitations. It has not been verified end to end inside Summer Engine. Test the visible client flow and renderer-specific behavior before calling a project verified.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
id: skill/psx-retro-rendering
|
|
2
2
|
kind: skill
|
|
3
3
|
version: 0.1.1
|
|
4
|
-
summary: "
|
|
4
|
+
summary: "PlayStation 1 rendering in Summer Engine — low-res output, RGB5 and exact dither, affine textures, vertex snapping, blend modes, fog; limits named."
|
|
5
5
|
use_when:
|
|
6
6
|
- "make my game render like a PlayStation 1 game, with texture warping, vertex wobble, and dithering"
|
|
7
7
|
- "add a PSX retro shader to the 3D scene"
|
|
@@ -10,7 +10,6 @@ use_when:
|
|
|
10
10
|
do_not_use_when:
|
|
11
11
|
- "an ordinary low-resolution or pixel-art presentation that does not need PS1-specific rendering behavior"
|
|
12
12
|
- "defining the overall visual style, palette, or mood — use art-direction first"
|
|
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
|
|
@@ -33,4 +32,4 @@ status: preview
|
|
|
33
32
|
recommended: false
|
|
34
33
|
lint_exceptions:
|
|
35
34
|
- url-allowlist
|
|
36
|
-
lint_exception_reason: "Source citation
|
|
35
|
+
lint_exception_reason: "Source citation: the body links the MIT-licensed godot-psxlike reference addon on GitHub (wyvernbw) that the extracted article names as its implementation evidence. Read-only provenance link; the skill never fetches or installs it."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: realtime-wet-surfaces
|
|
3
|
-
description: "Real-time wetness on existing
|
|
3
|
+
description: "Real-time wetness on existing materials without losing their values — value-copying wet shader, geometry-driven wet mask, instance-uniform wet amount."
|
|
4
4
|
license: MIT
|
|
5
5
|
category: shaders
|
|
6
6
|
tags:
|
|
@@ -12,11 +12,11 @@ tags:
|
|
|
12
12
|
confidence: extracted
|
|
13
13
|
---
|
|
14
14
|
|
|
15
|
-
# Real-Time Wet Surfaces (Value-Preserving Wet Materials
|
|
15
|
+
# Real-Time Wet Surfaces (Value-Preserving Wet Materials)
|
|
16
16
|
|
|
17
17
|
## Outcome
|
|
18
18
|
|
|
19
|
-
Implement a real-time wetness effect in
|
|
19
|
+
Implement a real-time wetness effect in Summer Engine that can be applied to existing materials **without losing their configured values** (albedo, metallic, roughness, textures). The wet mask is driven by geometry alone (upward-facing surfaces collect wetness first), with a global/per-instance wet amount that can be animated at runtime. This follows the source technique: a pre-configured shader swap that keeps the standard material's values, fed by a custom-function bridge.
|
|
20
20
|
|
|
21
21
|
## When to Use
|
|
22
22
|
|
|
@@ -28,17 +28,17 @@ Implement a real-time wetness effect in SummerEngine that can be applied to exis
|
|
|
28
28
|
|
|
29
29
|
The source technique's key idea is **separation of wetness from material authoring**: the wet logic is a self-contained graph/function that receives material values and injects a wet mask, so enabling wetness is a swap, not a rewrite.
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
How the source concepts map to Summer Engine:
|
|
32
32
|
|
|
33
|
-
|
|
|
33
|
+
| Source concept | Summer Engine equivalent |
|
|
34
34
|
|---|---|
|
|
35
|
-
| Standard
|
|
36
|
-
| Pre-configured
|
|
37
|
-
|
|
|
35
|
+
| Standard lit material with retained values | `StandardMaterial3D` values copied into a `ShaderMaterial` by a one-time converter |
|
|
36
|
+
| Pre-configured shader-graph swap | Shared wet-enabled `.gdshader`; swap the material once, keep all parameter values |
|
|
37
|
+
| Custom-function node carrying values into the graph | Shader uniforms + instance uniforms (`set_instance_shader_parameter`) or `RenderingServer` global shader parameters for scene-wide wet state |
|
|
38
38
|
| Wet mask from geometry shape alone | Fragment mask from world-space normal up-facing component (`world_normal.y`), optionally broken up by world-position noise |
|
|
39
39
|
| Planned heightmap flow | Sample a heightmap texture and offset the wet mask along its gradient (future extension; not evidenced in source) |
|
|
40
40
|
|
|
41
|
-
**
|
|
41
|
+
**Constraint:** the engine cannot inject custom nodes into a `StandardMaterial3D` at runtime. The equivalent of "swap in the pre-configured shader while keeping all values" is a **converter that copies `StandardMaterial3D` parameters into the wet shader** (below). The alternative — leaving `StandardMaterial3D` untouched and overlaying wetness via decals or post-processing — does not match the source's material-preserving architecture and is not recommended here.
|
|
42
42
|
|
|
43
43
|
## Scene / Node Shape
|
|
44
44
|
|
|
@@ -58,7 +58,7 @@ Scene
|
|
|
58
58
|
|
|
59
59
|
### 1. Write the shared wet-enabled spatial shader
|
|
60
60
|
|
|
61
|
-
Preserve the PBR parameters as uniforms and compute the wet mask from geometry.
|
|
61
|
+
Preserve the PBR parameters as uniforms and compute the wet mask from geometry. Fragment-stage `NORMAL` is **view-space**, so pass a world-space normal from the vertex stage — otherwise the "upward-facing" mask rotates with the camera.
|
|
62
62
|
|
|
63
63
|
```glsl
|
|
64
64
|
shader_type spatial;
|
|
@@ -108,7 +108,7 @@ Assumes near-uniform mesh scale; for heavily non-uniform scale, use the inverse-
|
|
|
108
108
|
|
|
109
109
|
### 2. Convert existing materials while preserving their values
|
|
110
110
|
|
|
111
|
-
This is the
|
|
111
|
+
This is the source's "swap in the pre-configured shader; all values retained" step. Run once (editor tool or import-time), not per frame.
|
|
112
112
|
|
|
113
113
|
```gdscript
|
|
114
114
|
@tool
|
|
@@ -150,7 +150,7 @@ Use `Area3D` rain zones to toggle `raining` for objects inside them. For scene-w
|
|
|
150
150
|
|
|
151
151
|
### 4. Planned extension: heightmap-guided flow
|
|
152
152
|
|
|
153
|
-
The source author states heightmap support so wetness flows along map bumps is **planned, not shipped**.
|
|
153
|
+
The source author states heightmap support so wetness flows along map bumps is **planned, not shipped**. To implement it: sample a heightmap texture in the fragment stage and bias the wet mask along its gradient (e.g., offset `world_pos.xz` lookups downhill using the height texture derivatives) so streaks follow surface relief. Do not treat this as part of the evidenced technique.
|
|
154
154
|
|
|
155
155
|
## Tunables
|
|
156
156
|
|
|
@@ -166,7 +166,7 @@ The source author states heightmap support so wetness flows along map bumps is *
|
|
|
166
166
|
## Failure Modes & Gotchas
|
|
167
167
|
|
|
168
168
|
- **View-space normal mistake:** using fragment `NORMAL` directly makes the up-facing mask rotate with the camera. Always pass world normal from `vertex()` via a varying.
|
|
169
|
-
- **Expecting in-place injection:**
|
|
169
|
+
- **Expecting in-place injection:** the engine cannot add wet logic to a live `StandardMaterial3D`. The value-preserving step is the one-time conversion, not runtime patching.
|
|
170
170
|
- **Duplicate shaders per material:** keep ONE shared `.gdshader`; per-material differences live in uniforms, per-object state in instance uniforms. Otherwise you pay shader compilation and draw-call overhead.
|
|
171
171
|
- **Over-darkening:** on already-dark albedos, clamp the darkened result or lower `darkening`.
|
|
172
172
|
- **Transparent/unshaded materials:** out of scope; this skill targets opaque PBR surfaces.
|
|
@@ -182,8 +182,8 @@ The source author states heightmap support so wetness flows along map bumps is *
|
|
|
182
182
|
|
|
183
183
|
## Confidence
|
|
184
184
|
|
|
185
|
-
`extracted` — the
|
|
185
|
+
`extracted` — the architecture (material-preserving wet swap, custom-function value bridge, geometry-only mask, planned heightmap flow) comes from a public post that showed the technique in another engine; no code was published. The mapping, shader, and scripts here are engineering guidance consistent with that post, **not** source-extracted implementation and **not** verified inside Summer Engine.
|
|
186
186
|
|
|
187
187
|
## Evidence
|
|
188
188
|
|
|
189
|
-
-
|
|
189
|
+
- A public X post describing the technique (demo video only, no code).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
id: skill/realtime-wet-surfaces
|
|
2
2
|
kind: skill
|
|
3
3
|
version: 0.1.1
|
|
4
|
-
summary: "Real-time wetness on existing
|
|
4
|
+
summary: "Real-time wetness on existing materials without losing their values — value-copying wet shader, geometry-driven wet mask, instance-uniform wet amount."
|
|
5
5
|
use_when:
|
|
6
6
|
- "make surfaces look wet when it rains and dry off afterwards"
|
|
7
7
|
- "add rain wetness to the level without redoing every material"
|
|
@@ -9,7 +9,6 @@ use_when:
|
|
|
9
9
|
- "wet cave, shoreline, or post-rain look on existing PBR materials"
|
|
10
10
|
do_not_use_when:
|
|
11
11
|
- "transparent or unshaded materials, water bodies, or puddle simulation — this targets opaque PBR surfaces"
|
|
12
|
-
- "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"
|
|
13
12
|
facets:
|
|
14
13
|
lifecycle:
|
|
15
14
|
- build
|
|
@@ -15,15 +15,14 @@ paths: ["project.godot", "export_presets.cfg"]
|
|
|
15
15
|
|
|
16
16
|
Remote Deploy runs the game on an actual target device — a phone, tablet, or another machine — instead of inside the editor. It exports a **debug** build, installs and launches it on the device, and connects the running game back to the editor's debugger so the Output panel, errors, breakpoints, and profiler all work exactly like a local run.
|
|
17
17
|
|
|
18
|
-
**Core principle:** Remote Deploy is "Play, but on the hardware." Same debug loop, real device.
|
|
19
|
-
|
|
20
18
|
**Capability gate comes first:** before adding a Runnable preset or telling the
|
|
21
|
-
user to pick a device,
|
|
22
|
-
the platform toolchain.
|
|
23
|
-
template
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
user to pick a device, check the installed Summer Engine's export templates and
|
|
20
|
+
the platform toolchain. Remote Deploy exports a debug build, so it needs the
|
|
21
|
+
debug template for that platform. `summer_export_templates` with
|
|
22
|
+
`action: "list"` shows what is installed and published; `action: "install"`
|
|
23
|
+
with `includeDebug: true` adds missing ones. Android and iOS also need their SDK
|
|
24
|
+
toolchain and signing. Never recommend or attempt a Remote Deploy target that
|
|
25
|
+
has not passed this check.
|
|
27
26
|
|
|
28
27
|
It is **not** the same as two neighbours:
|
|
29
28
|
|
|
@@ -31,7 +30,7 @@ It is **not** the same as two neighbours:
|
|
|
31
30
|
|---|---|---|
|
|
32
31
|
| **Play** (▶) | Runs in the editor (embedded or windowed) | Fast iteration on the dev machine |
|
|
33
32
|
| **Remote Deploy** | Debug build → installs + runs on a device, remote-debugged | Testing real input/perf/screen on hardware |
|
|
34
|
-
| **export
|
|
33
|
+
| **Release export** (`export-and-ship`) | Supported local release builds | Preparing an artifact for a separate user-controlled distribution workflow |
|
|
35
34
|
|
|
36
35
|
If the user wants a release build for Steam / itch / the App Store, that is `export-and-ship`, not this.
|
|
37
36
|
|
|
@@ -39,22 +38,22 @@ If the user wants a release build for Steam / itch / the App Store, that is `exp
|
|
|
39
38
|
|
|
40
39
|
- **Agent-layout topnav:** the button with the remote-play icon, immediately right of the **Play/Stop** button and the **`▾`** run-options dropdown. Hover tooltip reads **"Remote Deploy"**.
|
|
41
40
|
- Clicking it opens a **dropdown of detected targets**, grouped by platform (e.g. an `Android` header with each connected device under it). Picking a target deploys and runs there.
|
|
42
|
-
- It is **disabled (greyed out)** with the tooltip **"No Remote Deploy export presets configured."** until the prerequisites below are met. A greyed button is the
|
|
41
|
+
- It is **disabled (greyed out)** with the tooltip **"No Remote Deploy export presets configured."** until the prerequisites below are met. A greyed button is the most common question; it almost always means "no runnable preset or no device detected," not a bug.
|
|
43
42
|
|
|
44
43
|
## Step 1 — prove the requested target is available
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
requested platform toolchain. Report one of:
|
|
45
|
+
Run `summer_export_templates` with `action: "list"`, then check the requested
|
|
46
|
+
platform toolchain. Report one of:
|
|
49
47
|
|
|
50
|
-
- `available`: matching template and toolchain are present;
|
|
48
|
+
- `available`: the matching debug template and toolchain are present;
|
|
51
49
|
- `blocked`: name the missing template, toolchain, signing, or device
|
|
52
50
|
prerequisite;
|
|
53
51
|
- `impossible on this build`: Web on the stock Mono build.
|
|
54
52
|
|
|
55
|
-
Stop on `
|
|
56
|
-
|
|
57
|
-
as if that made the target
|
|
53
|
+
Stop on `impossible`. On `blocked`, install the missing template (`summer_export_templates`
|
|
54
|
+
`action: "install"`, `includeDebug: true`) after the user agrees, or route the
|
|
55
|
+
user to the toolchain setup. Do not add a preset as if that made the target
|
|
56
|
+
runnable.
|
|
58
57
|
|
|
59
58
|
## Step 2 — prerequisites for a proven target
|
|
60
59
|
|
|
@@ -66,7 +65,7 @@ The button auto-enables the moment a runnable preset **and** at least one detect
|
|
|
66
65
|
| A **runnable export preset** for that proven platform | Project → Export → add the proven preset → toggle **Runnable** on | A preset that exists but isn't marked Runnable does **not** count. |
|
|
67
66
|
| A **detected target** | For example, an authorized Android device or a connected, trusted iOS device | The button enables only when at least one target is reported for a runnable platform. |
|
|
68
67
|
|
|
69
|
-
**
|
|
68
|
+
**Note:** the button does **not** pre-check that templates/toolchain are installed. Enable state is gated only on *runnable preset + detected target*. If templates or the toolchain are missing, the deploy **fails at run time** and the errors appear in a result dialog. So:
|
|
70
69
|
|
|
71
70
|
> **Runnable preset + a detected device make the button appear/enable. Installed export templates make the deploy actually succeed.**
|
|
72
71
|
|
|
@@ -108,9 +107,9 @@ export environment.
|
|
|
108
107
|
|
|
109
108
|
When a user says "deploy to my phone" / "run this on device" and the button is greyed:
|
|
110
109
|
|
|
111
|
-
1. **Prove target capability first** —
|
|
112
|
-
|
|
113
|
-
either is absent; Web is impossible on the stock Mono build.
|
|
110
|
+
1. **Prove target capability first** — check the matching debug template
|
|
111
|
+
(`summer_export_templates`) and the platform toolchain. Stop or route
|
|
112
|
+
externally if either is absent; Web is impossible on the stock Mono build.
|
|
114
113
|
2. **Check the build is healthy** — a project with script errors won't export.
|
|
115
114
|
- `summer_get_script_errors` and `summer_get_diagnostics` clean? If not, fix those before anything else.
|
|
116
115
|
- `summer_get_console` for "import failed" noise.
|
|
@@ -15,19 +15,17 @@ paths: ["**/*.tscn", "**/*.tres"]
|
|
|
15
15
|
|
|
16
16
|
Summer ships **no** `summer_retarget_motion` tool, and no other MCP tool that
|
|
17
17
|
re-projects an existing animation asset onto a second rig. Verify it yourself:
|
|
18
|
-
`summer tool --list` prints every registered tool and there is no retarget entry. Never call one
|
|
19
|
-
unknown tool names outright
|
|
20
|
-
is worse than saying nothing.
|
|
18
|
+
`summer tool --list` prints every registered tool and there is no retarget entry. Never call one: the MCP server rejects
|
|
19
|
+
unknown tool names outright.
|
|
21
20
|
|
|
22
21
|
Two real paths exist. Pick by whether the target rig is Meshy-rigged.
|
|
23
22
|
|
|
24
23
|
| Situation | Path |
|
|
25
24
|
|---|---|
|
|
26
|
-
| Target is Meshy-rigged and the clip name is on the curated list | Re-run `summer_generate_motion` against the target's `rigAssetId`. Same clip,
|
|
25
|
+
| Target is Meshy-rigged and the clip name is on the curated list | Re-run `summer_generate_motion` against the target's `rigAssetId`. Same clip, ~30s, uses credits. |
|
|
27
26
|
| Target is not Meshy-rigged, or the clip is hand-authored / Mixamo / bought | In-engine retargeting: `BoneMap` + `SkeletonProfileHumanoid` + `RetargetModifier3D`. No credits, no network, but you configure the bone mapping. |
|
|
28
27
|
|
|
29
|
-
The rest of this skill covers both.
|
|
30
|
-
retarget API that does not exist; the honest math is below.
|
|
28
|
+
The rest of this skill covers both.
|
|
31
29
|
|
|
32
30
|
## When to use this skill
|
|
33
31
|
|
|
@@ -65,15 +63,15 @@ summer_search_assets(query: "<target character>", assetType: "3d_model", source:
|
|
|
65
63
|
```
|
|
66
64
|
|
|
67
65
|
Confirm a `rigAssetId` is present. If it is null the model was never rigged —
|
|
68
|
-
stop and propose `summer_generate_3d({ kind: "image-to-3d", imageUrl: "...",
|
|
66
|
+
stop and propose `summer_generate_3d({ kind: "image-to-3d", imageUrl: "...", rig: true })`
|
|
69
67
|
first, or route to `asset-strategy`.
|
|
70
68
|
|
|
71
69
|
### 3. Confirm with user before spending
|
|
72
70
|
|
|
73
|
-
Regeneration is a real generation per clip per character. Say the total.
|
|
71
|
+
Regeneration is a real generation per clip per character, and each one uses credits. Say the total count.
|
|
74
72
|
|
|
75
|
-
> I'm about to generate 12 clips (idle, walk, run, attack, ...) on `orc_rigged
|
|
76
|
-
>
|
|
73
|
+
> I'm about to generate 12 clips (idle, walk, run, attack, ...) on `orc_rigged`.
|
|
74
|
+
> That is 12 generations, a few minutes total. OK?
|
|
77
75
|
|
|
78
76
|
### 4. Loop the generation calls
|
|
79
77
|
|
|
@@ -107,9 +105,8 @@ summer_set_resource_property(
|
|
|
107
105
|
|
|
108
106
|
## Path B — in-engine retargeting (non-Meshy rigs, bought or hand-authored clips)
|
|
109
107
|
|
|
110
|
-
The current Summer Engine build ships
|
|
111
|
-
does not wrap. Verified
|
|
112
|
-
instantiable on the shipped binary: `BoneMap`, `SkeletonProfileHumanoid`
|
|
108
|
+
The current Summer Engine build ships a retargeting stack that the MCP layer
|
|
109
|
+
does not wrap. Verified instantiable on the shipped binary: `BoneMap`, `SkeletonProfileHumanoid`
|
|
113
110
|
(56 bones), `RetargetModifier3D`.
|
|
114
111
|
|
|
115
112
|
The shape:
|
|
@@ -129,23 +126,23 @@ skeleton, once.
|
|
|
129
126
|
|
|
130
127
|
## Confirmation gates
|
|
131
128
|
|
|
132
|
-
- **Before any generation call:** show the full clip list and
|
|
129
|
+
- **Before any generation call:** show the full clip list and the number of generations.
|
|
133
130
|
- **After the first clip:** preview the result. If it looks wrong, stop the loop
|
|
134
131
|
and re-evaluate (proportions, T-pose, missing bones).
|
|
135
132
|
- **Before saving the scene:** confirm the AnimationPlayer additions you're about to write.
|
|
136
133
|
|
|
137
134
|
## Reference card
|
|
138
135
|
|
|
139
|
-
###
|
|
136
|
+
### Decision rule
|
|
140
137
|
|
|
141
|
-
|
|
142
|
-
|
|
138
|
+
The real decision is generating per character versus spending the time on a
|
|
139
|
+
`BoneMap`.
|
|
143
140
|
|
|
144
141
|
| Scenario | Regenerate (Path A) | In-engine BoneMap (Path B) |
|
|
145
142
|
|---|---|---|
|
|
146
|
-
| 1 character, 12 clips |
|
|
147
|
-
| 5 characters, same 12 clips |
|
|
148
|
-
| 30 NPCs sharing one skeleton |
|
|
143
|
+
| 1 character, 12 clips | 12 generations | n/a — nothing to share yet |
|
|
144
|
+
| 5 characters, same 12 clips | 60 generations | No credits, plus ~1 bone-map pass per distinct skeleton |
|
|
145
|
+
| 30 NPCs sharing one skeleton | 360 generations | No credits — same rig, so the clips already play on all of them |
|
|
149
146
|
|
|
150
147
|
Note the case that makes most of this moot: **NPCs that share one rig share one
|
|
151
148
|
animation library already.** If the user's 30 enemies are 30 instances of the
|
|
@@ -177,7 +174,6 @@ same rigged `.glb`, nothing needs retargeting — instance the scene.
|
|
|
177
174
|
## Anti-patterns
|
|
178
175
|
|
|
179
176
|
- Calling a `summer_retarget_motion` / `summer_retarget_*` tool. None exists.
|
|
180
|
-
- Quoting a retarget price. There is no retarget SKU to price.
|
|
181
177
|
- Passing an asset ID to `summer_inspect_resource`. That tool takes a `res://`
|
|
182
178
|
**path** to a resource in the project, not a cloud asset ID. Use
|
|
183
179
|
`summer_get_asset(assetId: ...)` for asset metadata.
|
|
@@ -191,7 +187,7 @@ same rigged `.glb`, nothing needs retargeting — instance the scene.
|
|
|
191
187
|
to re-author per character.
|
|
192
188
|
- **Target rig is a different Meshy skeleton generation.** Symptom: bone-count
|
|
193
189
|
mismatch even though both are Meshy. Re-rig the target with a fresh
|
|
194
|
-
`summer_generate_3d({ kind: "image-to-3d",
|
|
190
|
+
`summer_generate_3d({ kind: "image-to-3d", rig: true })` call.
|
|
195
191
|
- **The clip the user wants is not on the curated list.** Path A cannot produce
|
|
196
192
|
it. Either hand-author it, or import a Mixamo clip and take Path B.
|
|
197
193
|
|
|
@@ -201,7 +197,7 @@ Path B is the fallback and does not need MCP at all. In Summer Engine: select
|
|
|
201
197
|
the source `.glb` in the FileSystem dock, open the Import tab, create/assign a
|
|
202
198
|
`BoneMap` with a `SkeletonProfileHumanoid` profile, re-import. On the target
|
|
203
199
|
character add a `RetargetModifier3D` under `Skeleton3D` with the same profile.
|
|
204
|
-
|
|
200
|
+
The upstream engine docs cover this under "Retargeting 3D Skeletons".
|
|
205
201
|
|
|
206
202
|
## Handoff
|
|
207
203
|
|
|
@@ -7,7 +7,7 @@ description: "Run Summer Engine on a Linux box with no display — install it, l
|
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Summer Engine runs
|
|
10
|
+
Summer Engine runs on a Linux machine with no display and no human. Everything in this skill was measured in a real cloud container: headless engine boots, MCP tools answer, and renders work under xvfb + llvmpipe.
|
|
11
11
|
|
|
12
12
|
Three facts carry the whole setup:
|
|
13
13
|
|
|
@@ -21,14 +21,14 @@ Three facts carry the whole setup:
|
|
|
21
21
|
|
|
22
22
|
| Priority | Source | When |
|
|
23
23
|
|---|---|---|
|
|
24
|
-
| 1 | `SUMMER_ENGINE_BINARY=<abs path>` | The container already carries a prebuilt engine binary
|
|
24
|
+
| 1 | `SUMMER_ENGINE_BINARY=<abs path>` | The container already carries a prebuilt engine binary. Registers that binary — no download. |
|
|
25
25
|
| 2 | `SUMMER_ENGINE_URL=<url>` | Download any artifact URL: `.tar.gz`, `.zip`, or a raw executable. |
|
|
26
26
|
| 3 | (default) | The newest published Linux release artifact (`Summer-linux-x86_64-<tag>.tar.gz`). |
|
|
27
27
|
|
|
28
28
|
All three register the binary at `~/.summer/engine/summer-linux-x86_64`, which is where `summer run` and `summer doctor` look. `SUMMER_ENGINE_BINARY` is also honored directly at lookup time, so setting the env var alone (without ever running `summer install`) is enough for `summer doctor` to report the engine as installed.
|
|
29
29
|
|
|
30
30
|
```bash
|
|
31
|
-
# Container with a prebuilt binary
|
|
31
|
+
# Container with a prebuilt binary:
|
|
32
32
|
export SUMMER_ENGINE_BINARY=/abs/path/to/engine-binary
|
|
33
33
|
summer install # registers it; summer doctor now shows Engine: ok
|
|
34
34
|
```
|
|
@@ -68,7 +68,7 @@ apt-get install -y xvfb libgl1-mesa-dri # names vary by distro
|
|
|
68
68
|
xvfb-run -a <engine-binary> --path <project-dir> --rendering-driver opengl3 ...
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
Limitations:
|
|
72
72
|
|
|
73
73
|
- **No Vulkan in most containers** → Forward+/Mobile renderers are unavailable; you get software GL (Compatibility). Colors and composition are trustworthy; GPU-specific effects, performance numbers, and driver-dependent output are not.
|
|
74
74
|
- Software rendering is slow. Budget seconds per frame, not milliseconds, and never quote FPS measured this way.
|
|
@@ -100,4 +100,4 @@ Treat it as a secret: env-inject it from the runner's secret store, never bake i
|
|
|
100
100
|
**Related skills:**
|
|
101
101
|
- `headless-scripting` — the headless invocation contract, exit-code traps, and what scripts unlock.
|
|
102
102
|
- `playtesting-a-feature` — the verify instance and probes (run them under xvfb in the cloud).
|
|
103
|
-
- `verification-before-completion` — judging work by artifacts, which matters
|
|
103
|
+
- `verification-before-completion` — judging work by artifacts, which matters more when nobody can see a screen.
|
|
@@ -113,7 +113,7 @@ screenshot alone.
|
|
|
113
113
|
|
|
114
114
|
1. **Wrong parent path:** `./NonExistent` fails. Ensure the parent exists before adding children.
|
|
115
115
|
2. **Unnamed scene:** Saving without a path fails if the scene was never saved. Use `path` for new scenes.
|
|
116
|
-
3. **Duplicate names:**
|
|
116
|
+
3. **Duplicate names:** the engine auto-renames (Node, Node2, etc.). Use descriptive unique names.
|
|
117
117
|
4. **Mixing 2D and 3D:** Don't put Node2D under Node3D or vice versa in the same hierarchy.
|
|
118
118
|
|
|
119
119
|
## Fallback
|
|
@@ -121,7 +121,7 @@ screenshot alone.
|
|
|
121
121
|
MCP is the preferred path, not a requirement. Hand-written `.tscn` text loads and
|
|
122
122
|
instantiates fine — including `[ext_resource]` lines with **no `uid=` field**,
|
|
123
123
|
which the engine resolves by path (verified by loading such a scene on the
|
|
124
|
-
shipped 4.6.1 build). Format version 3 is current
|
|
124
|
+
shipped 4.6.1 build). Format version 3 is current.
|
|
125
125
|
|
|
126
126
|
What actually goes wrong when you hand-write scenes is mundane and checkable:
|
|
127
127
|
a `SubResource("id")` with no matching `[sub_resource id="id"]` block, a
|
|
@@ -146,7 +146,7 @@ Rule when copying a scene as a template:
|
|
|
146
146
|
|
|
147
147
|
## Trap — Third-person camera collision when foliage shouldn't block
|
|
148
148
|
|
|
149
|
-
|
|
149
|
+
`SpringArm3D` shortens the camera boom when it raycasts into geometry on the configured `collision_mask`. If your trees, bushes, or grass have collision so the player physically bumps them, on the same layer the SpringArm queries, the camera shortens for foliage too. Players see the camera awkwardly snap forward whenever they walk near a tree.
|
|
150
150
|
|
|
151
151
|
The pattern that works:
|
|
152
152
|
|
|
@@ -156,9 +156,9 @@ The pattern that works:
|
|
|
156
156
|
- Player `CharacterBody3D`: `collision_mask = 259` (which is 1 + 2 + 256, Entities + Level + Foliage).
|
|
157
157
|
3. SpringArm uses a mask that catches solid level geometry but excludes foliage.
|
|
158
158
|
- SpringArm: `collision_mask = 3` (which is 1 + 2, Entities + Level only).
|
|
159
|
-
4. For the visual fade the user expects when the camera is "behind" a tree, add the foliage mesh to
|
|
159
|
+
4. For the visual fade the user expects when the camera is "behind" a tree, use a camera-occlusion fade instead of collision: if the project has one, add the foliage mesh to its group (for example `camera_fade`) so it ghosts the mesh when it crosses the camera-to-player segment.
|
|
160
160
|
|
|
161
|
-
Why per-layer split: there's no clean way to exclude a single body type from `SpringArm3D`'s collision check via `add_excluded_object` for dynamically-spawned foliage. You'd have to register every tree at spawn time and re-register on level change. Layer
|
|
161
|
+
Why per-layer split: there's no clean way to exclude a single body type from `SpringArm3D`'s collision check via `add_excluded_object` for dynamically-spawned foliage. You'd have to register every tree at spawn time and re-register on level change. Layer filtering needs no upkeep.
|
|
162
162
|
|
|
163
163
|
Don't skip the player mask update. If you only move foliage to layer 9 without adding it to the player's mask, the player walks straight through trees.
|
|
164
164
|
|