From 21bb8df68f3f7345d68e8034be63c4a8ebb0ad59 Mon Sep 17 00:00:00 2001 From: Davide Tantillo Date: Mon, 23 Mar 2026 11:34:43 +0100 Subject: [PATCH] [ts][pixi-v8] Prevent crash when slot object parents are not visible. See #3044. --- spine-ts/spine-pixi-v8/src/Spine.ts | 7 +++++-- spine-ts/spine-pixi-v8/src/SpinePipe.ts | 14 ++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/spine-ts/spine-pixi-v8/src/Spine.ts b/spine-ts/spine-pixi-v8/src/Spine.ts index 4be7acde5..88db1a839 100644 --- a/spine-ts/spine-pixi-v8/src/Spine.ts +++ b/spine-ts/spine-pixi-v8/src/Spine.ts @@ -802,7 +802,10 @@ export class Spine extends ViewContainer { const pose = slot.applied; const followAttachmentValue = slotAttachment.followAttachmentTimeline ? Boolean(pose.attachment) : true; - container.visible = this.skeleton.drawOrder.includes(slot) && followAttachmentValue; + const slotAlpha = this.skeleton.color.a * pose.color.a; + + container.visible = this.skeleton.drawOrder.includes(slot) && followAttachmentValue + && this.alpha > 0 && slotAlpha > 0; if (container.visible) { const applied = slot.bone.applied; @@ -816,7 +819,7 @@ export class Spine extends ViewContainer { matrix.ty = applied.worldY; container.setFromMatrix(matrix); - container.alpha = this.skeleton.color.a * pose.color.a; + container.alpha = slotAlpha; } } diff --git a/spine-ts/spine-pixi-v8/src/SpinePipe.ts b/spine-ts/spine-pixi-v8/src/SpinePipe.ts index 31c79da22..fd4fba0a7 100644 --- a/spine-ts/spine-pixi-v8/src/SpinePipe.ts +++ b/spine-ts/spine-pixi-v8/src/SpinePipe.ts @@ -90,6 +90,8 @@ export class SpinePipe implements RenderPipe { const drawOrder = spine.skeleton.drawOrder; const gpuSpine = this.gpuSpineData[spine.uid]; + if (!gpuSpine) return false; + for (let i = 0, n = drawOrder.length; i < n; i++) { const slot = drawOrder[i]; const attachment = slot.applied.attachment; @@ -185,12 +187,10 @@ export class SpinePipe implements RenderPipe { if (containerAttachment) { const container = containerAttachment.container; - if (!skipRender) { - container.includeInBuild = true; - // See https://github.com/pixijs/pixijs/blob/b4c050a791fe65e979e467c9cba2bda0c01a1c35/src/scene/container/utils/collectAllRenderables.ts#L28 - // biome-ignore lint/style/noNonNullAssertion: it was in pixi code - container.collectRenderables(instructionSet, this.renderer, null!); - } + container.includeInBuild = true; + // See https://github.com/pixijs/pixijs/blob/b4c050a791fe65e979e467c9cba2bda0c01a1c35/src/scene/container/utils/collectAllRenderables.ts#L28 + // biome-ignore lint/style/noNonNullAssertion: it was in pixi code + container.collectRenderables(instructionSet, this.renderer, null!); container.includeInBuild = false; } @@ -200,6 +200,8 @@ export class SpinePipe implements RenderPipe { updateRenderable (spine: Spine) { const gpuSpine = this.gpuSpineData[spine.uid]; + if (!gpuSpine) return; + spine._validateAndTransformAttachments(); spine.spineAttachmentsDirty = false;