修正时间轴末帧,导出补阶跃与循环段边界关键帧

- 时间轴:末帧按时长实际覆盖的整数帧计算,修掉 Spine 时长小数舍入多出的一帧,B 端与回放自动停在最后一帧
- 导出:粒子死亡、骨骼池复用、拖尾假死复活处统一写 curve: stepped 硬切,避免死区插值出滑动轨迹
- 导出:循环持续在开始/循环/结束段边界(如 30f/110f)对所有动画通道补关键帧,便于在 Spine 中直接拆分
- 精简器支持阶跃段,阶跃区间内不再补出过渡关键帧
- 补充 test:spine-json 回归用例:骨骼池复用阶跃边界、循环段边界
This commit is contained in:
tianmo committed 2026-10-09 17:05:53 +08:00
1 parent f249c019bc
commit d6232c9d66
9 files changed
+290 -82

No files matched your search

+5 -2
View File
@@ -5,7 +5,7 @@ import { releaseSpineAsset, retainSpineAsset } from '../spine/spineAssetRegistry
import { cloneEditorValue } from '../editor/editorClone'
import { defaultSpineExportSettings, type SpineExportSettings } from '../export/spineExportSettings'
import { loopSegmentTiming } from '../core/loopSegmentTiming'
import { normalizePlaybackRange, resizePlaybackRange } from '../timeline/playbackRange'
import { lastFrameOfDuration, normalizePlaybackRange, resizePlaybackRange } from '../timeline/playbackRange'
export interface ParticleSystem {
id: number
@@ -519,8 +519,11 @@ export const useParticleStore = defineStore('particle', {
if (end > maxSec) maxSec = end
}
// totalFrames 表示快照数量;0 秒和末端点都可选,因此比末端帧编号多 1。
// 末帧编号按“时长覆盖到的最后一个整数帧”计算,不能直接用 ceil:
// Spine 的小数舍入会让 80 帧的时长变成 80.01 帧,从而凭空多出第 81 帧,
// 回放时表现为末帧之后多停一帧。
const previousFrames = this.timeline.totalFrames
const frames = Math.max(2, Math.ceil(maxSec * fps) + 1)
const frames = Math.max(2, lastFrameOfDuration(maxSec, fps) + 1)
this.timeline.totalFrames = frames
const range = resizePlaybackRange(
{ start: this.timeline.playbackStart, end: this.timeline.playbackEnd },