From 2804895e898cdcabdd1d4a1063fd9e73df98f8c0 Mon Sep 17 00:00:00 2001 From: VicKun Date: Wed, 3 Jun 2026 19:54:50 +0800 Subject: [PATCH] fix(scence): support scence can set negtive offset (#7013) --- .../__tests__/engine-scene-viewport.spec.ts | 20 +++++++++++++++++++ .../src/basics/transformer-config.ts | 1 + .../engine-render/src/scene.transformer.ts | 11 ++++++++++ 3 files changed, 32 insertions(+) diff --git a/packages/engine-render/src/__tests__/engine-scene-viewport.spec.ts b/packages/engine-render/src/__tests__/engine-scene-viewport.spec.ts index 611e3f7e95..3bd973e082 100644 --- a/packages/engine-render/src/__tests__/engine-scene-viewport.spec.ts +++ b/packages/engine-render/src/__tests__/engine-scene-viewport.spec.ts @@ -447,6 +447,26 @@ describe('engine scene viewport extra', () => { expect(moveBoundary.moveLeft).toBeLessThanOrEqual(0); expect(moveBoundary.moveTop).toBeLessThanOrEqual(0); + const freeMoveTransformer = new Transformer(sceneMock, { + moveBoundaryEnabled: false, + } as any); + const freeMoveBoundary = (freeMoveTransformer as any)._checkMoveBoundary( + { + left: 820, + top: -28, + width: 520, + height: 520, + }, + 0, + 40, + 0, + 0, + 1280, + 720 + ); + expect(freeMoveBoundary.moveLeft).toBe(0); + expect(freeMoveBoundary.moveTop).toBe(40); + (transformer as any)._startOffsetX = 10; (transformer as any)._startOffsetY = 10; expect((transformer as any)._moveBufferBlocker(11, 11)).toBe(true); diff --git a/packages/engine-render/src/basics/transformer-config.ts b/packages/engine-render/src/basics/transformer-config.ts index ae287bb6cc..3a92d36796 100644 --- a/packages/engine-render/src/basics/transformer-config.ts +++ b/packages/engine-render/src/basics/transformer-config.ts @@ -74,4 +74,5 @@ export interface ITransformerConfig { zeroLeft?: number; zeroTop?: number; + moveBoundaryEnabled?: boolean; } diff --git a/packages/engine-render/src/scene.transformer.ts b/packages/engine-render/src/scene.transformer.ts index 744da5c927..4cab96ae5d 100644 --- a/packages/engine-render/src/scene.transformer.ts +++ b/packages/engine-render/src/scene.transformer.ts @@ -206,6 +206,7 @@ export class Transformer extends Disposable implements ITransformerConfig { zeroLeft = 0; zeroTop = 0; + moveBoundaryEnabled = true; /** * leftTop centerTop rightTop @@ -400,6 +401,7 @@ export class Transformer extends Disposable implements ITransformerConfig { boundBoxFunc, useSingleNodeRotation, shouldOverdrawWholeArea, + moveBoundaryEnabled, } = this; if (objectTransformerConfig != null) { isCropper = objectTransformerConfig.isCropper ?? isCropper; @@ -447,6 +449,7 @@ export class Transformer extends Disposable implements ITransformerConfig { boundBoxFunc = objectTransformerConfig.boundBoxFunc ?? boundBoxFunc; useSingleNodeRotation = objectTransformerConfig.useSingleNodeRotation ?? useSingleNodeRotation; shouldOverdrawWholeArea = objectTransformerConfig.shouldOverdrawWholeArea ?? shouldOverdrawWholeArea; + moveBoundaryEnabled = objectTransformerConfig.moveBoundaryEnabled ?? moveBoundaryEnabled; } return { @@ -495,6 +498,7 @@ export class Transformer extends Disposable implements ITransformerConfig { boundBoxFunc, useSingleNodeRotation, shouldOverdrawWholeArea, + moveBoundaryEnabled, }; } @@ -652,6 +656,13 @@ export class Transformer extends Disposable implements ITransformerConfig { } private _checkMoveBoundary(moveObject: BaseObject, moveLeft: number, moveTop: number, ancestorLeft: number, ancestorTop: number, topSceneWidth: number, topSceneHeight: number) { + if (this._getConfig(moveObject).moveBoundaryEnabled === false) { + return { + moveLeft, + moveTop, + }; + } + const { left, top, width, height } = moveObject; let resultMoveLeft = moveLeft; let resultMoveTop = moveTop;