From 17a6fd0339f37b5197d9387b3004d1d10771c37c Mon Sep 17 00:00:00 2001 From: MelekTaus Date: Fri, 25 Sep 2026 16:34:10 +0200 Subject: [PATCH] Move the shader test sprite off a name plate so CI passes again Every suite run since 50bddf6 failed the same 14 pixel checks in step 28. The test sprite sat right of the camera, where the Crate pair container from an earlier step has its symbol. Since 50bddf6 names stand on dark plates, and that plate reaches into the sprite's upper left corner. The thin grey name before let the sampled pixels through. The plate covers them. - The sprite now sits up left of the camera (-190, -105 instead of +180, +100), a spot no earlier step fills. - The guard that samples a 9x9 grid over the sprite stays. It named the plate as -0.4,-0.3:#1b2f57, the sprite blue under a 70 percent near-black plate. - The app is right: symbols and their names draw above objects. Tests: - Reproduced in the CI image with an empty data folder, GM_STEPS=1-28: the same 14 FAILs with the same colours as CI tasks 303 to 313. - Full CI job in the CI image after the move: ALL PASSED, 1385 checks, smokes 24 / 19 / 21, E2E EXIT 0, SMOKES EXIT 0. Co-Authored-By: Claude Opus 5.5 --- tools/e2e/28-shader.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/e2e/28-shader.mjs b/tools/e2e/28-shader.mjs index f629e991..34227be7 100644 --- a/tools/e2e/28-shader.mjs +++ b/tools/e2e/28-shader.mjs @@ -192,7 +192,7 @@ export async function shader(t) { project.assets.push(sprite); const scene = __gm.state.activeScene; const cam = scene.objects.find((o) => o.id === 'o3').position; - scene.objects.push({ id: 'oshade', assetId: 'shade-sprite', name: '', position: { x: cam.x + 180, y: cam.y + 100, z: 950 }, editorOffset: { x: 0, y: 0 }, overrides: {}, parentId: '', instanceEdits: {} }); + scene.objects.push({ id: 'oshade', assetId: 'shade-sprite', name: '', position: { x: cam.x - 190, y: cam.y - 105, z: 950 }, editorOffset: { x: 0, y: 0 }, overrides: {}, parentId: '', instanceEdits: {} }); __gm.state.select(null)`); await sleep(600); // The pixels are the scene view's; the tab is still the shader's. @@ -212,6 +212,8 @@ export async function shader(t) { // The step parks the sprite away from the camera for that reason: symbols draw above objects, and // by this point the earlier steps have left containers and colliders around the origin. Without // this guard their outlines show up as a wrong colour in whichever check happens to sample them. + // Since names stand on plates, a plate covers what a thin name let through: the sprite sat right + // of the camera once, where the Crate pair container's plate reaches into it, so it sits up left. const dirty = []; for (let fx = -0.4; fx <= 0.401; fx += 0.1) for (let fy = -0.4; fy <= 0.401; fy += 0.1) {