From d359379e38667d17b6752b36af7d617b468c898d Mon Sep 17 00:00:00 2001 From: Akirami <66513481+A-kirami@users.noreply.github.com> Date: Sun, 24 May 2026 13:55:41 +0800 Subject: [PATCH 1/2] fix: base preview set-effect on captured transform --- .../previewSetEffectTransform.ts | 27 ++++++++++++ .../util/syncWithEditor/previewSyncRuntime.ts | 43 +++++++++++-------- 2 files changed, 52 insertions(+), 18 deletions(-) create mode 100644 packages/webgal/src/Core/util/syncWithEditor/previewSetEffectTransform.ts diff --git a/packages/webgal/src/Core/util/syncWithEditor/previewSetEffectTransform.ts b/packages/webgal/src/Core/util/syncWithEditor/previewSetEffectTransform.ts new file mode 100644 index 000000000..a7ea60d92 --- /dev/null +++ b/packages/webgal/src/Core/util/syncWithEditor/previewSetEffectTransform.ts @@ -0,0 +1,27 @@ +import { baseTransform } from '../../Modules/stage/stageInterface'; +import type { ITransform } from '../../Modules/stage/stageInterface'; +import type { SetEffectPayload } from '../../../types/editorPreviewProtocol'; + +type SetEffectTransformInput = SetEffectPayload['transform']; + +export function mergeSetEffectPreviewTransform( + baseline: ITransform, + transform?: SetEffectTransformInput, +): ITransform { + return { + ...baseline, + ...(transform ?? {}), + position: { + ...baseline.position, + ...(transform?.position ?? {}), + }, + scale: { + ...baseline.scale, + ...(transform?.scale ?? {}), + }, + }; +} + +export function normalizeSetEffectPreviewBaseline(transform?: ITransform): ITransform { + return mergeSetEffectPreviewTransform(baseTransform, transform); +} diff --git a/packages/webgal/src/Core/util/syncWithEditor/previewSyncRuntime.ts b/packages/webgal/src/Core/util/syncWithEditor/previewSyncRuntime.ts index f371ea1be..9bd4de7bd 100644 --- a/packages/webgal/src/Core/util/syncWithEditor/previewSyncRuntime.ts +++ b/packages/webgal/src/Core/util/syncWithEditor/previewSyncRuntime.ts @@ -28,8 +28,11 @@ import { nextSentence } from '@/Core/controller/gamePlay/nextSentence'; import { resetStage } from '@/Core/controller/stage/resetStage'; import { logger } from '@/Core/util/logger'; import { stageStateManager } from '@/Core/Modules/stage/stageStateManager'; -import { baseTransform } from '@/Core/Modules/stage/stageInterface'; -import type { IStageState } from '@/Core/Modules/stage/stageInterface'; +import type { IStageState, ITransform } from '@/Core/Modules/stage/stageInterface'; +import { + mergeSetEffectPreviewTransform, + normalizeSetEffectPreviewBaseline, +} from './previewSetEffectTransform'; import { requestEmbeddedLaunchId } from './runtime/embeddedPreviewBootstrap'; import { createPreviewSyncTransport, @@ -74,6 +77,7 @@ export const startPreviewSyncRuntime = () => { let lastPublishedSceneName: string | null = null; let lastPublishedSentenceId: number | null = null; let lastPublishedStageState: StageStateSnapshot | null = null; + const setEffectBaselines = new Map(); const embeddedLaunchIdPromise = requestEmbeddedLaunchId(); let transport!: PreviewSyncTransport; @@ -87,6 +91,7 @@ export const startPreviewSyncRuntime = () => { lastPublishedSceneName = null; lastPublishedSentenceId = null; lastPublishedStageState = null; + setEffectBaselines.clear(); }; const buildStageStateSnapshot = (stageState: StageStateSnapshot): StageSnapshotUpdatedPayload['stageState'] => { @@ -162,10 +167,12 @@ export const startPreviewSyncRuntime = () => { }; const handleSyncScene = (payload: SyncScenePayload) => { + setEffectBaselines.clear(); executePreviewSyncSceneCommand(payload, emitFastPreviewTimeout); }; const handleRunSnippet = (payload: RunSnippetPayload) => { + setEffectBaselines.clear(); const scene = WebgalParser.parse(payload.snippet, 'temp.txt', 'temp.txt'); (scene.sentenceList as unknown as ISentence[]).forEach((sentence) => { runScript(sentence); @@ -197,6 +204,7 @@ export const startPreviewSyncRuntime = () => { }; const handleRunSceneContent = (payload: RunSceneContentPayload) => { + setEffectBaselines.clear(); resetStage(true); WebGAL.sceneManager.sceneData.currentScene = sceneParser(payload.sceneContent, 'temp', './temp.txt'); applyComponentVisibility({ @@ -222,23 +230,22 @@ export const startPreviewSyncRuntime = () => { setDebugTextReadMode(payload.isRead); }; - const handleSetEffect = (payload: SetEffectPayload) => { - const targetEffect = stageStateManager + const getSetEffectBaseline = (target: string) => { + const cachedBaseline = setEffectBaselines.get(target); + if (cachedBaseline) { + return cachedBaseline; + } + + const currentTransform = stageStateManager .getCalculationStageState() - .effects.find((effect) => effect.target === payload.target); - const targetTransform = targetEffect?.transform ? targetEffect.transform : baseTransform; - const newTransform = { - ...targetTransform, - ...(payload.transform ?? {}), - position: { - ...targetTransform.position, - ...(payload.transform?.position ?? {}), - }, - scale: { - ...targetTransform.scale, - ...(payload.transform?.scale ?? {}), - }, - }; + .effects.find((effect) => effect.target === target)?.transform; + const baseline = normalizeSetEffectPreviewBaseline(currentTransform); + setEffectBaselines.set(target, baseline); + return baseline; + }; + + const handleSetEffect = (payload: SetEffectPayload) => { + const newTransform = mergeSetEffectPreviewTransform(getSetEffectBaseline(payload.target), payload.transform); WebGAL.gameplay.pixiStage?.removeAnimationByTargetKey(payload.target); stageStateManager.updateEffectAndCommit({ target: payload.target, From ec8f12ca2bf053c10d1ee26708893858fe37374f Mon Sep 17 00:00:00 2001 From: Akirami <66513481+A-kirami@users.noreply.github.com> Date: Sun, 24 May 2026 15:04:55 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8C=96=E9=A2=84?= =?UTF-8?q?=E8=A7=88=20set-effect=20=E5=9F=BA=E7=BA=BF=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/syncWithEditor/previewSetEffectTransform.ts | 9 ++------- .../src/Core/util/syncWithEditor/previewSyncRuntime.ts | 10 ++++------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/packages/webgal/src/Core/util/syncWithEditor/previewSetEffectTransform.ts b/packages/webgal/src/Core/util/syncWithEditor/previewSetEffectTransform.ts index a7ea60d92..551fc7daf 100644 --- a/packages/webgal/src/Core/util/syncWithEditor/previewSetEffectTransform.ts +++ b/packages/webgal/src/Core/util/syncWithEditor/previewSetEffectTransform.ts @@ -1,6 +1,5 @@ -import { baseTransform } from '../../Modules/stage/stageInterface'; -import type { ITransform } from '../../Modules/stage/stageInterface'; -import type { SetEffectPayload } from '../../../types/editorPreviewProtocol'; +import type { ITransform } from '@/Core/Modules/stage/stageInterface'; +import type { SetEffectPayload } from '@/types/editorPreviewProtocol'; type SetEffectTransformInput = SetEffectPayload['transform']; @@ -21,7 +20,3 @@ export function mergeSetEffectPreviewTransform( }, }; } - -export function normalizeSetEffectPreviewBaseline(transform?: ITransform): ITransform { - return mergeSetEffectPreviewTransform(baseTransform, transform); -} diff --git a/packages/webgal/src/Core/util/syncWithEditor/previewSyncRuntime.ts b/packages/webgal/src/Core/util/syncWithEditor/previewSyncRuntime.ts index 51262fe0b..72e3d038a 100644 --- a/packages/webgal/src/Core/util/syncWithEditor/previewSyncRuntime.ts +++ b/packages/webgal/src/Core/util/syncWithEditor/previewSyncRuntime.ts @@ -28,11 +28,9 @@ import { nextSentence } from '@/Core/controller/gamePlay/nextSentence'; import { resetStage } from '@/Core/controller/stage/resetStage'; import { logger } from '@/Core/util/logger'; import { stageStateManager } from '@/Core/Modules/stage/stageStateManager'; +import { baseTransform } from '@/Core/Modules/stage/stageInterface'; import type { IStageState, ITransform } from '@/Core/Modules/stage/stageInterface'; -import { - mergeSetEffectPreviewTransform, - normalizeSetEffectPreviewBaseline, -} from './previewSetEffectTransform'; +import { mergeSetEffectPreviewTransform } from './previewSetEffectTransform'; import { requestEmbeddedLaunchId } from './runtime/embeddedPreviewBootstrap'; import { createPreviewSyncTransport, @@ -233,7 +231,7 @@ export const startPreviewSyncRuntime = () => { setDebugTextReadMode(payload.isRead); }; - const getSetEffectBaseline = (target: string) => { + const getSetEffectBaseline = (target: string): ITransform => { const cachedBaseline = setEffectBaselines.get(target); if (cachedBaseline) { return cachedBaseline; @@ -242,7 +240,7 @@ export const startPreviewSyncRuntime = () => { const currentTransform = stageStateManager .getCalculationStageState() .effects.find((effect) => effect.target === target)?.transform; - const baseline = normalizeSetEffectPreviewBaseline(currentTransform); + const baseline = mergeSetEffectPreviewTransform(baseTransform, currentTransform); setEffectBaselines.set(target, baseline); return baseline; };