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; }