Keep a pixel frame worn through a shader alive while it is drawn
Changing a palette colour of pixel art flooded the console with Pixi warnings: "[BindGroup] a 'textureSource' was destroyed while still bound to a shader", and the same for its sampler. #293 had stopped this for a drawing, but a frame of pixel art is worn as a cut of the sheet. The cut has a source of its own, so the sheet looked unbound, was freed at once and took the cut with it under the shader. - The check whether a replaced picture is still in use gets its key too. TextureLibrary then asks the picture and every cut taken from it. - A sheet with a bound cut waits like a bound picture did since #293, and both go together once the shader has taken the new frame. Found on the way: - The project the report came from has a sprite wearing a frame of an eleven-frame pixel art through a shader asset. - A nine-sliced sprite wearing the frame showed no warning, even without the change. The first try of the e2e check used it. Tests: - Gate on melektaus-atx: 236 files, 3577 tests (+1) - e2e 48: 45 checks (+1, sum 1741). 48l-iii puts a shader on the object wearing the second frame, changes a palette colour three times and counts the warnings. - Counter-checks bite: without the cuts in the check the unit test fails, and 48l-iii counts 6 warnings for 3 changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c74b6b1cab
commit
3f57cf731d
5 files changed
+84
-6
No files matched your search
@@ -705,6 +705,37 @@ export async function pixelArt(t) {
|
||||
delete art.props.sliceScale;`);
|
||||
await settle();
|
||||
|
||||
// 48l-iii. The object wears the frame through a shader asset: its mesh names a cut of the sheet,
|
||||
// which has a source of its own. A palette colour changed under it freed the sheet at
|
||||
// once and the cut with it, and Pixi warned for the source and its sampler every time.
|
||||
await mutate(`
|
||||
Object.assign(__gm.state.activeScene.objects.find((o) => o.id === 'pa-object').overrides,
|
||||
{ shader: 'adjust-colors', saturation: 0 })`);
|
||||
await settle();
|
||||
await sleep(300);
|
||||
const boundLogFrom = t.consoleLog.length;
|
||||
const waiting = [];
|
||||
for (const color of [0x3050a0, 0x70b030, 0xff004d]) {
|
||||
await mutate(`
|
||||
const p = __gm.state.project;
|
||||
const art = p.assets.find((a) => a.id === ${JSON.stringify(id)});
|
||||
p.assets.find((a) => a.id === art.props.palette).colors[${RED - 1}] = ${color};`);
|
||||
await settle();
|
||||
await sleep(200);
|
||||
waiting.push((await json('__gm.picturesWaiting()')).length);
|
||||
}
|
||||
const boundWarnings = t.consoleLog.slice(boundLogFrom).filter((line) => line.includes('BindGroup'));
|
||||
check(
|
||||
'a palette colour changed under a frame worn through a shader warns of no destroyed texture',
|
||||
boundWarnings.length === 0 && waiting.every((n) => n === 0),
|
||||
JSON.stringify({ warnings: boundWarnings.length, waiting }),
|
||||
);
|
||||
await mutate(`
|
||||
const o = __gm.state.activeScene.objects.find((o) => o.id === 'pa-object');
|
||||
delete o.overrides.shader;
|
||||
delete o.overrides.saturation;`);
|
||||
await settle();
|
||||
|
||||
const textureRow = await json("__gm.inspectorField('Texture', true)");
|
||||
await click(textureRow.x, textureRow.y);
|
||||
await settle();
|
||||
|
||||
Reference in new issue
Block a user