渲染顺序功能

This commit is contained in:
tianmo committed 2026-10-22 11:16:50 +08:00
1 parent aabf4ff693
commit c041503004
22 files changed
+1904 -1291

No files matched your search

+73
View File
@@ -0,0 +1,73 @@
import { build } from 'esbuild'
const bundled = await build({
bundle: true,
entryPoints: ['src/views/stage/renderLayer.ts'],
format: 'esm',
platform: 'node',
write: false,
})
const { resolveRenderTarget } = await import(
`data:text/javascript;base64,${Buffer.from(bundled.outputFiles[0].text).toString('base64')}`
)
const spines = [{
id: 7,
enabled: true,
status: 'ready',
slots: [
{ name: 'slot_back', order: 0 },
{ name: 'slot_body', order: 1 },
{ name: 'slot_hand', order: 2 },
],
}]
const base = {
renderLayerMode: 'slot',
renderLayerSpineId: 7,
renderLayerSlotName: 'slot_hand',
renderLayerSlotPosition: 'above',
renderLayerFollowAttachment: true,
}
function expect(actual, expected, label) {
if (JSON.stringify(actual) !== JSON.stringify(expected)) {
throw new Error(`${label}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`)
}
}
expect(resolveRenderTarget(spines, { ...base, renderLayerMode: 'top' }), null, '最上层不应挂槽位')
expect(
resolveRenderTarget(spines, base),
{ spineId: 7, slotName: 'slot_hand', targetSlotName: 'slot_hand', followAttachment: true },
'图片之上应挂到目标插槽',
)
expect(
resolveRenderTarget(spines, { ...base, renderLayerSlotPosition: 'below' }),
{ spineId: 7, slotName: 'slot_body', targetSlotName: 'slot_hand', followAttachment: false },
'图片之下应挂到 drawOrder 前一个插槽',
)
expect(
resolveRenderTarget(spines, { ...base, renderLayerSlotPosition: 'below' }, ['slot_back', 'slot_hand', 'slot_body']),
{ spineId: 7, slotName: 'slot_back', targetSlotName: 'slot_hand', followAttachment: false },
'动画 drawOrder 变化时应按当前顺序取前一个插槽',
)
expect(
resolveRenderTarget(spines, { ...base, renderLayerSlotPosition: 'below' }, ['slot_hand', 'slot_body', 'slot_back']),
null,
'当前 drawOrder 中目标位于最底层时无法放在其下方',
)
expect(
resolveRenderTarget(spines, { ...base, renderLayerSlotName: 'slot_body', renderLayerSlotPosition: 'below' }, ['slot_hand', 'slot_body', 'slot_back']),
{ spineId: 7, slotName: 'slot_hand', targetSlotName: 'slot_body', followAttachment: false },
'当前 drawOrder 中应取紧邻的前一个插槽',
)
expect(
resolveRenderTarget(spines, { ...base, renderLayerSlotName: 'slot_back', renderLayerSlotPosition: 'below' }),
null,
'第一个插槽下方没有可用层级',
)
expect(resolveRenderTarget(spines, { ...base, renderLayerSlotName: 'missing' }), null, '插槽不存在时应回退')
expect(resolveRenderTarget([{ ...spines[0], enabled: false }], base), null, 'Spine 停用时应回退')
expect(resolveRenderTarget([{ ...spines[0], status: 'loading' }], base), null, 'Spine 未就绪时应回退')
console.log('渲染层级解析校验通过:最上层 / 插槽之上 / 插槽之下 / 动画 drawOrder / 失效回退')