中英双语

This commit is contained in:
tianmo committed 2026-10-22 18:13:43 +08:00
1 parent ea26af26ee
commit b98c0333e6
50 files changed
+4082 -2049

No files matched your search

+4 -3
View File
@@ -7,6 +7,7 @@ import { reduceBezierSamples, reduceNumericSamples, roundSpine, unwrapDegrees, t
import { buildWeightedTrailMesh } from './spineMeshBuilder'
import { loopPlaybackRange, loopSegmentTiming } from '../core/loopSegmentTiming'
import { collectSubEmitterIds } from '../core/subEmitterIds'
import { translate } from '../i18n'
type Track = { key: string; name: string; states: Array<ParticleState | null> }
type ExportInput = { systems: ParticleSystem[]; timeline: TimelineState; settings: SpineExportSettings }
@@ -241,7 +242,7 @@ function resourceAttachment(resource: ParticleImageResource, frameIndex: number,
const file = frame?.name || resource.textureName || `image_${resource.id}`
const texture = frame?.texture || resource.texture
const size = textureSize(texture)
if (!size.width || !size.height) warnings.push({ code: 'missing-image', message: `图片“${file}”缺失或尺寸不可读,已保留路径。` })
if (!size.width || !size.height) warnings.push({ code: 'missing-image', message: translate('errors.missingImageWarning', { file }) })
const width = size.width || 1, height = size.height || 1
return {
path: normalizePath(resource.textureFolder, file),
@@ -346,7 +347,7 @@ export function buildSpineJson(input: ExportInput): SpineExportResult {
? frameLength
: Math.min(frameLength, particleDurationFrames(system, sourceFps))
const frames = (system.frames || []).slice(0, sourceCount)
if (!frames.length) warnings.push({ code: 'empty-cache', message: `“${system.config.name}”没有可用帧缓存。` })
if (!frames.length) warnings.push({ code: 'empty-cache', message: translate('errors.emptyCacheWarning', { name: system.config.name }) })
const prefix = uniqueName(safeName(system.config.name, `system_${system.id}`), usedNames)
document.bones.push({ name: prefix, parent: 'root' })
const tracks = collectTracks(frames, settings.bonePool, usedNames, prefix)
@@ -400,7 +401,7 @@ export function buildSpineJson(input: ExportInput): SpineExportResult {
const indices = trailNames.map((name) => document.bones.findIndex((bone) => bone.name === name))
const path = normalizePath('', resource.textureName || `trail_${resource.id}`)
;(skin[slotName] ||= {})[`trail_${resource.id}`] = buildWeightedTrailMesh(system.config, resource, indices, path)
if (!resource.texture) warnings.push({ code: 'missing-image', message: `拖尾图片“${resource.textureName || resource.id}”缺失,已保留路径。` })
if (!resource.texture) warnings.push({ code: 'missing-image', message: translate('errors.missingTrailImageWarning', { file: resource.textureName || resource.id }) })
}
}
// Spine 按 slots 数组顺序绘制。保持每个粒子的拖尾在图片下方。