summer-engine 3.3.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.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/CHANGELOG.md +36 -0
- package/README.md +2 -1
- package/assets/api-docs.json.gz +0 -0
- package/dist/cli/commands/install.d.ts +10 -0
- package/dist/cli/commands/install.js +55 -10
- package/dist/cli/commands/tool.d.ts +7 -0
- package/dist/cli/commands/tool.js +36 -1
- package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
- package/dist/core/capabilities/capture-gameplay.js +283 -0
- 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-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 +112 -36
- package/dist/core/capabilities/image-generation.d.ts +9 -0
- package/dist/core/capabilities/image-generation.js +19 -1
- package/dist/core/capabilities/publish-build.d.ts +14 -1
- package/dist/core/capabilities/publish-build.js +74 -22
- package/dist/core/capabilities/tool-dispatch.js +10 -0
- 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/hosted-mcp.d.ts +115 -0
- package/dist/core/hosted-mcp.js +164 -0
- package/dist/core/launch-posture.d.ts +3 -0
- package/dist/core/launch-posture.js +15 -2
- package/dist/mcp/hosted-mount.d.ts +13 -59
- package/dist/mcp/hosted-mount.js +24 -30
- package/dist/mcp/server.js +3 -2
- package/dist/mcp/tools/creator-tools.js +13 -3
- package/dist/mcp/tools/generate-tools.js +12 -2
- package/gemini-extension.json +3 -1
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +3 -2
- package/library/skills/README.md +6 -4
- package/library/skills/bounded-engine-runs/SKILL.md +96 -0
- package/library/skills/bounded-engine-runs/resource.yaml +29 -0
- 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 +2 -2
- package/library/skills/export-and-ship/SKILL.md +2 -0
- 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/web-compatibility-look/resource.yaml +1 -0
- package/library/tools/capture-gameplay/resource.yaml +73 -0
- package/library/tools/generate-image/resource.yaml +15 -1
- package/library/tools/publish-build/resource.yaml +1 -1
- 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 +125 -12
- 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 +6 -4
- package/registry/generated/skills-registry.json +28 -1
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
**Rule of thumb:** project reads/writes go through Summer; live hierarchy/inspector changes use scene tools; process-level work remains with the host.
|
|
19
19
|
|
|
20
|
-
## Tool surface (
|
|
20
|
+
## Tool surface (105 tools)
|
|
21
21
|
|
|
22
22
|
### Project files (4)
|
|
23
23
|
|
|
@@ -237,7 +237,7 @@ Preview. One fast, read-only call that walks every node of a 3D scene and lists
|
|
|
237
237
|
| `summer_get_project_context` | Project, scene, and `.summer` memory summary — call at start of session. Binds the session to the open project and surfaces a `capabilitySkewWarning` when the engine build and CLI have drifted; tools whose op the engine provably lacks return a structured `engine_lacks_op` result instead of running. Compact by default (a few KB: `sceneSummary`, scalar `health` with capability counts); `include:['scene_tree','capabilities','settings']` adds the heavy blocks, `omitted` says how. |
|
|
238
238
|
| `summer_get_agent_playbook` | Daily operating contract (observe-first loop, content routing, invariants, verification ritual) — call at start of session. Also served natively as the `summer_agent_playbook` MCP prompt. |
|
|
239
239
|
|
|
240
|
-
### Creator platform (
|
|
240
|
+
### Creator platform (7)
|
|
241
241
|
|
|
242
242
|
| Tool | Use |
|
|
243
243
|
|---|---|
|
|
@@ -247,6 +247,7 @@ Preview. One fast, read-only call that walks every node of a 3D scene and lists
|
|
|
247
247
|
| `summer_creator_publish` | **Deprecated** (use the two tools above). Compute the exact `.pck` digest and size, require user confirmation, then run versioned prepare → write-once upload → finalize. The server independently verifies `publish` scope, ownership, bytes, and review state. |
|
|
248
248
|
| `summer_creator_releases` | List real creator-owned releases from `summer.creator.v1`, with opaque cursor pagination. |
|
|
249
249
|
| `summer_creator_config` | Read or confirm updates to the shared non-secret `~/.summer/config.json`. It never accepts or returns tokens. |
|
|
250
|
+
| `summer_capture_gameplay` | Real gameplay frames without a running editor: starts the game (main scene or `scene`) in the engine's offscreen verify instance (`--summer-verify`, real renderer, window parked offscreen, no focus) at `resolution` (default `1920x1080`), waits `waitSeconds`, saves `frames` PNGs (HUD included) to `<project>/.summer/captures/<time>/`. Imports the project first when `.godot/` is missing. Returns each path with its real width and height; warns when the stretch settings render another size. For store screenshots. |
|
|
250
251
|
|
|
251
252
|
### Library search (2)
|
|
252
253
|
|
package/library/skills/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Summer skills
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> 118 skills, grouped by their primary domain. **Generated** by `npm run generate:registry` from each skill's `resource.yaml`; `--check` fails when this file and the library disagree. Do not edit by hand.
|
|
4
4
|
|
|
5
5
|
The folder is flat on purpose (`docs/design/DECISIONS.md`, D3): a skill usually belongs to several domains, so categories live in each skill's `facets.domains` and this index is rendered from them. The first domain listed is the primary one. `summer skills list --by-domain` prints the same grouping; `summer skills info <slug>` shows one skill.
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
|
|
|
10
10
|
|
|
11
11
|
- [2d](#2d) (10)
|
|
12
12
|
- [3d](#3d) (6)
|
|
13
|
-
- [agent-workflow](#agent-workflow) (
|
|
13
|
+
- [agent-workflow](#agent-workflow) (18)
|
|
14
14
|
- [ai](#ai) (2)
|
|
15
15
|
- [animation](#animation) (7)
|
|
16
16
|
- [assets](#assets) (3)
|
|
@@ -24,7 +24,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
|
|
|
24
24
|
- [multiplayer](#multiplayer) (16)
|
|
25
25
|
- [navigation](#navigation) (1)
|
|
26
26
|
- [performance](#performance) (1)
|
|
27
|
-
- [rendering](#rendering) (
|
|
27
|
+
- [rendering](#rendering) (6)
|
|
28
28
|
- [runtime](#runtime) (1)
|
|
29
29
|
- [scenes](#scenes) (12)
|
|
30
30
|
- [scripting](#scripting) (2)
|
|
@@ -62,6 +62,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
|
|
|
62
62
|
|
|
63
63
|
| skill | when to use | also |
|
|
64
64
|
|---|---|---|
|
|
65
|
+
| [*bounded-engine-runs*](./bounded-engine-runs/SKILL.md) ★ (preview) | Run Summer headless or offscreen safely from an agent: time limits, one engine per project, muted runs, import passes, tests that fail on crashes. | headless, verification |
|
|
65
66
|
| [brainstorming](./brainstorming/SKILL.md) ★ | Explore user intent, requirements, and design before implementation — must run before any creative work: features, components, mechanics, behavior. | game-design |
|
|
66
67
|
| [debugging-game-feel](./debugging-game-feel/SKILL.md) | Debug features that work but feel wrong — floaty jumps, mushy combat, sluggish camera — subjective bugs living in tuning, timing, and feedback layers. | gameplay |
|
|
67
68
|
| [diagnosing-perf-regressions](./diagnosing-perf-regressions/SKILL.md) | Find why frame rate, frame time, or load time got worse since a known-good state — regression hunting, not general performance tuning. | performance |
|
|
@@ -152,7 +153,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
|
|
|
152
153
|
| [*celeste-momentum-platforming*](./celeste-momentum-platforming/SKILL.md) (preview) | Celeste-style 2D precision platformer movement — momentum running, coyote time, variable jumps, dash, wall jump/slide, climb stamina, pixel corner correction. | character-controller, game-design |
|
|
153
154
|
| [*combat-basics*](./combat-basics/SKILL.md) (preview) | Damage in Summer Engine: hitbox and hurtbox Areas on opposing layers, a reusable Health component, damage signals, knockback, hit feedback, projectiles. | scripting, game-design |
|
|
154
155
|
| [design-mechanic](./design-mechanic/SKILL.md) ★ | Design one game mechanic in detail — input, response, feedback, failure modes, depth, tunables — outputs a design doc, node-graph sketch, GDScript stub. | game-design |
|
|
155
|
-
| [*in-game-purchases*](./in-game-purchases/SKILL.md) (preview) | Sell items for Sparks
|
|
156
|
+
| [*in-game-purchases*](./in-game-purchases/SKILL.md) (preview) | Sell items for Sparks in a game shop via the Summer purchase sheet: checkout, results, not enough Sparks, inventory unlocks, authority grants, store policy. | scripting, game-design |
|
|
156
157
|
| [*web-and-touch-input*](./web-and-touch-input/SKILL.md) ★ (preview) | Input for the browser and phones: the first-click rule for sound and mouse capture, focus, and touch buttons or a virtual stick on the same actions. | ui |
|
|
157
158
|
|
|
158
159
|
## level-design
|
|
@@ -201,6 +202,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
|
|
|
201
202
|
|---|---|---|
|
|
202
203
|
| [3d-lighting](./3d-lighting/SKILL.md) ★ | Set up 3D scene lighting — DirectionalLight3D vs Omni vs Spot, WorldEnvironment, sky, shadow tuning, ambient — per current Summer conventions. | lighting |
|
|
203
204
|
| [art-direction](./art-direction/SKILL.md) ★ | Define the game's visual style — references, palette, mood, lighting plan, post-processing, do/don't list — output as an art bible at .summer/art-bible.md. | lighting |
|
|
205
|
+
| [*compatibility-renderer-traps*](./compatibility-renderer-traps/SKILL.md) ★ (preview) | Make a Forward+ Summer game also look right on the Compatibility renderer: instance-uniform budget, black MultiMesh colors, sRGB vertex colors. | performance |
|
|
204
206
|
| [*psx-retro-rendering*](./psx-retro-rendering/SKILL.md) (preview) | Hardware-informed PlayStation 1 rendering in Godot 4 — low-res output, RGB5 and exact dither, affine textures, vertex snapping, blend modes, fog; limits named. | 3d |
|
|
205
207
|
| [*realtime-wet-surfaces*](./realtime-wet-surfaces/SKILL.md) (preview) | Real-time wetness on existing Godot 4 materials without losing their values — value-copying wet shader, geometry-driven wet mask, instance-uniform wet amount. | vfx |
|
|
206
208
|
| [*web-compatibility-look*](./web-compatibility-look/SKILL.md) ★ (preview) | Make a web or browser game look high-end in the Compatibility renderer (WebGL 2): what works, what to avoid, 2D and 3D recipes, web performance. | 2d, 3d |
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bounded-engine-runs
|
|
3
|
+
description: "Run Summer headless or offscreen safely from an agent: time limits, one engine per project, muted runs, import passes, tests that fail on crashes."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: workflow
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Edit Write Bash
|
|
9
|
+
paths: ["project.godot", "tests/**/*.gd", "tools/**/*.gd"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Bounded engine runs for agents
|
|
13
|
+
|
|
14
|
+
Agents verify games by running the engine many times: imports, tests, captures, multiplayer bots. Each run
|
|
15
|
+
that hangs, overlaps another, makes noise or hides an error costs time and trust. These rules come from a
|
|
16
|
+
day of several agents sharing one project on one Mac.
|
|
17
|
+
|
|
18
|
+
## 1. Every run is bounded, muted and alone
|
|
19
|
+
|
|
20
|
+
- **Bound it.** macOS has no `timeout`. Wrap runs so the engine itself gets killed:
|
|
21
|
+
```sh
|
|
22
|
+
perl -e 'alarm shift; exec @ARGV' 180 <summer> --headless --path . -s res://tests/run_tests.gd
|
|
23
|
+
```
|
|
24
|
+
`alarm` survives `exec`; exit code 142 means the limit hit.
|
|
25
|
+
- **One engine per project at a time.** Two engines writing the same `.godot/` import cache corrupt it or
|
|
26
|
+
freeze each other's captures. Serialize with a lock file held by the engine process:
|
|
27
|
+
```sh
|
|
28
|
+
perl -e 'use Fcntl qw(:flock); $^F=255; open(my $l,">>",shift) or die; flock($l,LOCK_EX); alarm shift; exec @ARGV' \
|
|
29
|
+
<project>/.engine.lock 180 <summer> ...
|
|
30
|
+
```
|
|
31
|
+
Put this in one wrapper script and make every agent use it.
|
|
32
|
+
- **Cap its memory.** A time limit does not stop a run from eating all memory first. One day of several agents
|
|
33
|
+
running builds, renders and a browser load of a large web export at once kernel-panicked the Mac
|
|
34
|
+
(compressor full, swap unable to grow). The wrapper should run the command as a child, sum the resident
|
|
35
|
+
memory of its whole process tree (browsers spawn GPU/renderer helpers), kill the tree past a cap (e.g.
|
|
36
|
+
3 GB), and also stop when system free memory falls low (`sysctl -n kern.memorystatus_level` < 15 on macOS),
|
|
37
|
+
because GPU memory on Apple Silicon is system memory but is not counted in RSS. Refuse to start when the
|
|
38
|
+
system is already short (< 35).
|
|
39
|
+
- **Mute it.** `--audio-driver Dummy`. Someone is working next to you.
|
|
40
|
+
- **Render only when you must, and offscreen.** `--headless` for logic (no pixels). For visual checks use
|
|
41
|
+
`--summer-offscreen` with a fixed `--resolution` and a capture script that saves PNGs and quits. Visible
|
|
42
|
+
windows only when a human asked to watch.
|
|
43
|
+
|
|
44
|
+
## 2. Imports and parse errors
|
|
45
|
+
|
|
46
|
+
- New `class_name` scripts are unknown to `-s` scripts until an import pass registers them:
|
|
47
|
+
`<summer> --headless --audio-driver Dummy --path . --import`.
|
|
48
|
+
- The first import may rewrite `project.godot` (reorder keys, add a `[summer]` section; one trial saw a
|
|
49
|
+
hand-written `[rendering]` section dropped). Check `git diff project.godot` after it, and pass renderer
|
|
50
|
+
choices on the command line (`--rendering-method ...`) when a run depends on them.
|
|
51
|
+
- One broken `class_name` script cascades into "Could not parse global class" and dozens of unrelated
|
|
52
|
+
"cannot infer type" errors. Get the real line with:
|
|
53
|
+
`<summer> --headless --path . --check-only -s res://path/to/file.gd`
|
|
54
|
+
- Compile every script before booting the game: a tiny `SceneTree` script that `load()`s each `.gd` under
|
|
55
|
+
a folder and reports `can_instantiate()` failures, exit code = failures.
|
|
56
|
+
|
|
57
|
+
## 3. Tests that can't lie
|
|
58
|
+
|
|
59
|
+
- A runtime script error inside a test does not fail it by default; the test just stops and counts as
|
|
60
|
+
passed. Register a logger and fail the test when its error count rises:
|
|
61
|
+
```gdscript
|
|
62
|
+
class ErrorCounter extends Logger:
|
|
63
|
+
var script_errors := 0
|
|
64
|
+
func _log_error(_f: String, file: String, _line: int, _c: String, _r: String, _n: bool, type: int, _bt: Array[ScriptBacktrace]) -> void:
|
|
65
|
+
if type == Logger.ERROR_TYPE_SCRIPT or file.ends_with(".gd"):
|
|
66
|
+
script_errors += 1
|
|
67
|
+
func _log_message(_m: String, _e: bool) -> void:
|
|
68
|
+
pass
|
|
69
|
+
# in the runner: OS.add_logger(counter); compare counter.script_errors before and after each test
|
|
70
|
+
```
|
|
71
|
+
- Exit 0 is not success. Always grep the log for `SCRIPT ERROR`, `Parse Error` and `ERROR:`, and print
|
|
72
|
+
one explicit success line (`TESTS passed=N failed=0`) you can check for.
|
|
73
|
+
|
|
74
|
+
## 4. Typed GDScript traps agents hit repeatedly
|
|
75
|
+
|
|
76
|
+
- `var x := dict["k"]` cannot infer a type (Dictionary values are Variant). Write `var x: int = dict["k"]`.
|
|
77
|
+
- A loop variable that shadows an outer variable is a parse error that takes the whole class down.
|
|
78
|
+
- Don't name a class after an engine class (`SummerSession`); the error only says it "hides a native class".
|
|
79
|
+
|
|
80
|
+
## 5. Web exports on a dev machine
|
|
81
|
+
|
|
82
|
+
- Check the `.pck` size before opening it in a browser; the browser holds all of it in memory. A project that
|
|
83
|
+
exports every imported asset of a large scene can pass 250 MB. Ship only what the game uses first.
|
|
84
|
+
- Load it in a browser only under the same memory-capped wrapper, one at a time, never next to other engine runs.
|
|
85
|
+
|
|
86
|
+
## 6. Captures you can trust
|
|
87
|
+
|
|
88
|
+
- Read every PNG you produce. If several files are identical (`md5 -r *.png`), the run froze; rerun alone.
|
|
89
|
+
- Keep evidence outside the project (logs, PNGs) so imports never pick it up. If it must live inside, put an
|
|
90
|
+
empty `.gdignore` file in that folder so the editor and imports skip it.
|
|
91
|
+
|
|
92
|
+
## See also
|
|
93
|
+
|
|
94
|
+
- `headless-scripting` (writing the SceneTree scripts these runs execute)
|
|
95
|
+
- `multiplayer-testing` (Local Play bot runs)
|
|
96
|
+
- `compatibility-renderer-traps` (dual-renderer captures)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
id: skill/bounded-engine-runs
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Run Summer headless or offscreen safely from an agent: time limits, one engine per project, muted runs, import passes, tests that fail on crashes."
|
|
5
|
+
use_when:
|
|
6
|
+
- running the engine from a shell or agent for tests, imports, captures or bots
|
|
7
|
+
- several agents or processes share one project
|
|
8
|
+
- a run hangs, a capture freezes, or errors cascade across unrelated scripts
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- build
|
|
12
|
+
domains:
|
|
13
|
+
- agent-workflow
|
|
14
|
+
- headless
|
|
15
|
+
- verification
|
|
16
|
+
modalities:
|
|
17
|
+
- project
|
|
18
|
+
- scripts
|
|
19
|
+
compatibility:
|
|
20
|
+
engine: ">=4.6"
|
|
21
|
+
related:
|
|
22
|
+
skills:
|
|
23
|
+
- skill/headless-scripting
|
|
24
|
+
- skill/multiplayer-testing
|
|
25
|
+
- skill/compatibility-renderer-traps
|
|
26
|
+
source: official
|
|
27
|
+
license: MIT
|
|
28
|
+
status: preview
|
|
29
|
+
recommended: true
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: compatibility-renderer-traps
|
|
3
|
+
description: "Make a Forward+ Summer game also look right on the Compatibility renderer: instance-uniform budget, black MultiMesh colors, sRGB vertex colors."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: rendering-and-lighting
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Edit Write summer_project_setting summer_get_script_errors
|
|
9
|
+
paths: ["**/*.gdshader", "**/*.gdshaderinc", "**/*.gd", "project.godot"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Forward+ and Compatibility without surprises
|
|
13
|
+
|
|
14
|
+
Games built on Forward+ can end up on the Compatibility renderer (OpenGL): phones where Metal/Vulkan is
|
|
15
|
+
unavailable, weak GPUs, or a project that picks it for battery. The failures are silent: no error, just
|
|
16
|
+
black fruit, pale colors, or objects that stop animating after the first few hundred. These are the traps
|
|
17
|
+
that cost real renders in a shipped-quality game, each with the fix and the reason.
|
|
18
|
+
|
|
19
|
+
## 1. Know which renderer you actually got
|
|
20
|
+
|
|
21
|
+
- Phones use `rendering/renderer/rendering_method.mobile`, which defaults to `mobile`, not Forward+.
|
|
22
|
+
Set it explicitly.
|
|
23
|
+
- A device can fall back to another renderer when it lacks a capability. Trust the renderer name printed
|
|
24
|
+
at startup (or `RenderingServer.get_current_rendering_method()`), not the project setting.
|
|
25
|
+
- Preview Compatibility on your computer:
|
|
26
|
+
`<summer> --path . --rendering-method gl_compatibility`.
|
|
27
|
+
|
|
28
|
+
## 2. The traps
|
|
29
|
+
|
|
30
|
+
| Symptom on Compatibility | Cause | Fix |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| Objects past roughly the 250th stop growing, lose color or read as default | GLES3 reserves 16 `instance uniform` slots per instance out of 4096, so only about 256 instances in the whole scene can use them. Beyond that, values silently read 0. | Don't use `instance uniform` for anything numerous. Put per-instance state in a one-instance MultiMesh's `INSTANCE_CUSTOM` (a vec4), or bake it into mesh vertex colors. |
|
|
33
|
+
| Fruit/flowers render solid black | GLES3 multiplies `COLOR` by the MultiMesh instance color, which is 0 when `use_colors` is off. | Enable `use_colors` and set every instance color to white, or don't read `COLOR` in that path. |
|
|
34
|
+
| Everything looks pastel on Forward+ (saturated on Compatibility) | Forward+ shades in linear space, Compatibility in sRGB. Colors you bake into vertex `COLOR` or hard-code into `ALBEDO` are usually sRGB. | Convert once, only where needed: `if (!OUTPUT_IS_SRGB) col = to_linear(col);` with the helper below (the shading language has no built-in `srgb_to_linear`). Or pass colors as `uniform vec3 c : source_color`, which converts for you. |
|
|
35
|
+
| Whole scene pale/lime on Compatibility while Forward+ looks right | Tonemap, glow and ambient respond differently. | Keep a Compatibility branch of your lighting profile (lower ambient and exposure) and check both. |
|
|
36
|
+
| Foliage glows white | Glow threshold too low for bright leaves. | Raise the glow HDR threshold (~1.5) and keep bloom near 0. |
|
|
37
|
+
|
|
38
|
+
Everything the player must see (ripe crop, enemy, pickup) must stay readable without glow, SSR,
|
|
39
|
+
volumetric fog or other Forward+-only effects: use shape, color and icons too.
|
|
40
|
+
|
|
41
|
+
The helper (standard sRGB curve):
|
|
42
|
+
|
|
43
|
+
```glsl
|
|
44
|
+
vec3 to_linear(vec3 c) {
|
|
45
|
+
return mix(pow((c + vec3(0.055)) * (1.0 / 1.055), vec3(2.4)), c * (1.0 / 12.92), lessThan(c, vec3(0.04045)));
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 3. Keep one shader path
|
|
50
|
+
|
|
51
|
+
Write shaders in plain spatial math: vertex-color ramps, simple rim terms, no custom `light()` unless
|
|
52
|
+
you test it on both renderers. One path for both renderers means one set of bugs and no drift.
|
|
53
|
+
|
|
54
|
+
## 4. Verify, don't assume
|
|
55
|
+
|
|
56
|
+
1. Render the same scene on Forward+ and `gl_compatibility` offscreen:
|
|
57
|
+
`<summer> --audio-driver Dummy --summer-offscreen --path . --resolution 1600x900 -s res://tools/capture.gd -- --out=<dir>`
|
|
58
|
+
(add `--rendering-method gl_compatibility` for the second run).
|
|
59
|
+
2. Read both images side by side, and include a stress shot with many instances (the 256 limit only shows
|
|
60
|
+
at scale).
|
|
61
|
+
3. Grep the log for `SCRIPT ERROR`, `SHADER ERROR` and `ERROR:`. A shader that fails to compile still lets
|
|
62
|
+
the capture exit 0 and draws the object untextured, so a missing grep hides the failure.
|
|
63
|
+
4. If later captures repeat the same frame, the offscreen run froze (it happens when another engine
|
|
64
|
+
renders at the same time). Check with `md5 -r *.png` and rerun alone.
|
|
65
|
+
|
|
66
|
+
## Common mistakes
|
|
67
|
+
|
|
68
|
+
- Checking only the project setting and calling it "Forward+ on phones".
|
|
69
|
+
- Using `instance uniform` for per-plant or per-tile state.
|
|
70
|
+
- Reading `COLOR` from a MultiMesh without instance colors.
|
|
71
|
+
- Testing Compatibility with ten objects when the game shows five hundred.
|
|
72
|
+
- Budgeting one run per fix: every look change needs two captures (one per renderer). Plan runs in pairs.
|
|
73
|
+
|
|
74
|
+
## See also
|
|
75
|
+
|
|
76
|
+
- `web-compatibility-look` (a finished look when the game only runs on Compatibility, as on the web)
|
|
77
|
+
- `3d-lighting` (lighting profiles)
|
|
78
|
+
- `bounded-engine-runs` (safe offscreen capture runs)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
id: skill/compatibility-renderer-traps
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Make a Forward+ Summer game also look right on the Compatibility renderer: instance-uniform budget, black MultiMesh colors, sRGB vertex colors."
|
|
5
|
+
use_when:
|
|
6
|
+
- a game must run on phones or weak GPUs that may use the Compatibility or Mobile renderer
|
|
7
|
+
- objects render black, pale or stop animating on one renderer but not another
|
|
8
|
+
- writing shaders for many instances (crops, foliage, tiles) that must work everywhere
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- build
|
|
12
|
+
domains:
|
|
13
|
+
- rendering
|
|
14
|
+
- performance
|
|
15
|
+
modalities:
|
|
16
|
+
- shaders
|
|
17
|
+
- scripts
|
|
18
|
+
compatibility:
|
|
19
|
+
engine: ">=4.6"
|
|
20
|
+
related:
|
|
21
|
+
skills:
|
|
22
|
+
- skill/web-compatibility-look
|
|
23
|
+
- skill/3d-lighting
|
|
24
|
+
- skill/bounded-engine-runs
|
|
25
|
+
source: official
|
|
26
|
+
license: MIT
|
|
27
|
+
status: preview
|
|
28
|
+
recommended: true
|
|
@@ -77,7 +77,7 @@ summer_generate_image(
|
|
|
77
77
|
|
|
78
78
|
`style: "none"` is intentional, but be precise about why: only `cartoon` and `anime` append anything to the prompt, `realistic` and `none` append nothing, and any other value is coerced to `none`. So the preset cannot override the prompt's stylistic direction — it just contributes nothing, which is what concept art wants. All four variants' divergence has to come from the prompt.
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
For a shape other than square, pass `aspectRatio` (`"16:9"`, `"9:16"`, ...) or `width` + `height`; the result reports the real width and height and the model that ran. Exploration images are thrown away, so square is usually fine.
|
|
81
81
|
|
|
82
82
|
### 5. Present the batch
|
|
83
83
|
|
|
@@ -121,7 +121,7 @@ The structure: **subject + axis variant + "concept art" + lighting/atmosphere**.
|
|
|
121
121
|
|
|
122
122
|
- **User says "just one" after you propose 4.** That's a `character-portrait` job. Hand off.
|
|
123
123
|
- **User wants 8+ variants.** Generate 4 first; if the user wants more on the same axis, generate 4 more. Don't dump 8 at once — overload paralyzes choice.
|
|
124
|
-
- **Subject is a fully described scene, not an asset.** You're producing key art, not asset reference.
|
|
124
|
+
- **Subject is a fully described scene, not an asset.** You're producing key art, not asset reference. Pass `aspectRatio: "16:9"` (or `width: 1920, height: 1080` for store key art) and bias toward atmospheric.
|
|
125
125
|
- **User wants the final to be 3D.** After they pick a direction, route to `asset-strategy` — concept-art images are not 3D-ready references (they have backgrounds, scene context, dramatic lighting baked in). The 3D pipeline needs its own clean white-background reference.
|
|
126
126
|
|
|
127
127
|
## Fallback (no MCP)
|
|
@@ -293,6 +293,8 @@ Per platform, point the user at the correct upload path:
|
|
|
293
293
|
|
|
294
294
|
- **summer.games:** `summer_export_game` writes the summer.games `.zip`; `summer_publish_build` uploads it to the game's store listing after the user confirms the exact game, file and version (needs `summer login --store`). If it answers `store_auth_refused`, the user uploads the `.zip` in Studio instead.
|
|
295
295
|
- Per platform, the store takes: iPhone, Android, macOS and Windows in the Summer apps = one summer.games bundle (`summer_export_game` `targets`, format `bundle`; no template, no signing; a game without a server targets `ios`/`android` only). Web = an HTML5 `.zip` on Summer's WebGPU Forward+ template (`targets:["web"]`; the project must render with Forward+ or Mobile). A macOS or Windows download for the store page = `targets:["macos"]` or `["windows"]` with format `download`. Download exports need the template: `summer_export_templates` `install` fetches it from Summer's CDN.
|
|
296
|
+
- Hosted games: if `summer_export_game` fails with "… is in the source graph's authority_engine domain, which the client pack leaves out", an authority root in `source-domains.json` holds a file the client loads (often the composition `.tres`). Narrow that root to the server-only files, or move the shared file under a `shared` path, then export again. Every exporter message is in the `multiplayer-publish` skill's export-errors.md; the folder rules are in `multiplayer-project`.
|
|
297
|
+
- Store page art: key art, covers and icons carry no text, logos or UI (the store page shows the title). Screenshots are real gameplay and may show the game's own HUD; add no captions, logos or overlays. Capture them with `summer_capture_gameplay` (offscreen, no editor needed; `resolution` `1920x1080`, or `1080x1920` for portrait; pass the gameplay `scene` when the main scene is a title menu), or `summer_screenshot` target `game` while the editor runs the game.
|
|
296
298
|
- **Steam:** `steamcmd` + Steam Pipe (`builder_app_xxx.vdf`). Set up depots first in Steamworks.
|
|
297
299
|
- **itch.io:** `butler push <path> <user>/<game>:<channel>` (e.g. `butler push build/win <user>/mygame:windows`).
|
|
298
300
|
- **Web (itch hosted):** zip + drop into itch upload UI as "playable in browser".
|