修复pma 皮肤渲染

This commit is contained in:
tianmo committed 2026-09-10 19:09:43 +08:00
1 parent 02358b8d4c
commit 11b1c95d98
6 files changed
+105 -13

No files matched your search

+9 -3
View File
@@ -152,6 +152,7 @@ async function renderThumbnail({ skeletonPath, atlasPath, texturePaths, version,
const isBinary = /\.skel(\.bytes)?$/i.test(skeletonPath);
const dir = path.dirname(skeletonPath);
const atlasText = fs.readFileSync(atlasPath, 'utf8');
const premultipliedAlpha = utils.parseAtlasPma(atlasText) === true;
const spine = loadRuntime(runtimeDir);
const atlas = await buildTextureAtlas(spine, atlasText, dir, texturePaths);
@@ -162,6 +163,7 @@ async function renderThumbnail({ skeletonPath, atlasPath, texturePaths, version,
throw new Error('骨骼数据为空:' + name);
}
const skeleton = new spine.Skeleton(skeletonData);
utils.applySkin(skeleton, utils.preferredSkin(skeletonData));
// 计算所有动画的包围盒,取最合适的姿态用于缩略图。
// 默认使用 setup pose(编辑器内的标准站姿),保证缩略图稳定、接近编辑视图。
@@ -191,13 +193,17 @@ async function renderThumbnail({ skeletonPath, atlasPath, texturePaths, version,
ctx.translate(-cx, -cy);
let renderer = null;
if (runtimeDir === '3.4' || runtimeDir === '3.5') renderer = require('./spine-canvas-clipping.js').createRenderer(spine, ctx, runtimeDir);
else if (spine.canvas && spine.canvas.SkeletonRenderer) renderer = new spine.canvas.SkeletonRenderer(ctx);
else if (spine.SkeletonRenderer) renderer = new spine.SkeletonRenderer(ctx);
try { renderer = require('./spine-canvas-clipping.js').createRenderer(spine, ctx, runtimeDir); }
catch (e) {
if (spine.canvas && spine.canvas.SkeletonRenderer) renderer = new spine.canvas.SkeletonRenderer(ctx);
else if (spine.SkeletonRenderer) renderer = new spine.SkeletonRenderer(ctx);
}
if (renderer) {
// 使用三角渲染,正确处理 mesh 附件(如角色身体的网格)
if ('triangleRendering' in renderer) renderer.triangleRendering = true;
renderer.premultipliedAlpha = premultipliedAlpha;
renderer.draw(skeleton);
if (renderer.dispose) renderer.dispose();
}
ctx.restore();
}