From d7c36e31f7fa2e9ce52ed7a0b533a1bc6aa82139 Mon Sep 17 00:00:00 2001 From: plum <40649341+plum-k@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:25:06 +0800 Subject: [PATCH] fix(sdk): keep dynamic path flowing when scene is static --- packages/sdk/lib/core/objects/Path.ts | 2 ++ packages/sdk/lib/core/viewer/Viewer.ts | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/packages/sdk/lib/core/objects/Path.ts b/packages/sdk/lib/core/objects/Path.ts index 87c6dea..3e1ee12 100644 --- a/packages/sdk/lib/core/objects/Path.ts +++ b/packages/sdk/lib/core/objects/Path.ts @@ -65,6 +65,8 @@ export default class Path extends THREE.Mesh { if (Path.flowSignalBound) return; Path.flowSignalBound = true; useAddSignal("sceneRendered", Path.handleFlowTick); + // 立即请求一帧渲染,防止场景静止时 sceneRendered 永远不触发导致流动停止 + (App.viewer as any)?.pluginRequestRender?.(true); } private static unbindFlowSignal() { diff --git a/packages/sdk/lib/core/viewer/Viewer.ts b/packages/sdk/lib/core/viewer/Viewer.ts index 7f2aa61..7f795d7 100644 --- a/packages/sdk/lib/core/viewer/Viewer.ts +++ b/packages/sdk/lib/core/viewer/Viewer.ts @@ -206,6 +206,12 @@ export default class Viewer extends THREE.EventDispatcher { //整个主场景的box3 public sceneBox3 = new THREE.Box3(); public package: Package; + private _pluginNeedsRender = false; + + /** 供插件/内部模块请求下一帧强制渲染,传 true 标记,animate() 检测后自动清除 */ + pluginRequestRender(value: boolean) { + this._pluginNeedsRender = value; + } constructor(options: IViewerSetting) { super(); @@ -1107,6 +1113,11 @@ export default class Viewer extends THREE.EventDispatcher { needRender = true; } + if (this._pluginNeedsRender) { + needRender = true; + this._pluginNeedsRender = false; + } + this.dispatchEvent({type: 'afterAnimation', delta: timeStamp, toBeRender: (_needRender:boolean = false) => { needRender = _needRender; }