Skip to content

Commit 5b81007

Browse files
authored
Merge pull request #191 from shopware/fix/orientation-display-position
fix: change orientation display position to be compatible with webgu api.
2 parents 8f55c99 + 4c27088 commit 5b81007

3 files changed

Lines changed: 31 additions & 6 deletions

File tree

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,4 @@
5555
- Library builds must externalize `three` with a pattern that also matches subpaths like `three/webgpu`, `three/tsl`, and `three/examples/jsm/*`; externalizing only bare `three` bundles a second Three runtime into `build/` and triggers `THREE.WARNING: Multiple instances of Three.js being imported.` in consumers
5656
- State action migrations must use `AnimationSystem.fromTargets(...).play()` and `Toolbox.enableTool()`; lingering `animate()` or `useTool()` calls can still let `yarn build` exit 0 while `vite-plugin-dts` reports TS2339 API drift
5757
- When swapping canvases under WebGPU, `DIVEEnvironment.setRenderer()` must run before disposing the previous `WebGPURenderer`; disposing the old renderer first can crash `PMREMGenerator.dispose()` inside Three's `NodeManager.delete` with `usedTimes` access errors
58+
- `OrientationDisplay.tick()` should size its overlay viewport from `DIVERenderer.canvas.clientHeight` and restore the prior `webgpurenderer.autoClear` value; unit tests can fall back to the saved viewport height when the mock omits `canvas`

src/plugins/orientationdisplay/src/OrientationDisplay.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,18 @@ export class OrientationDisplay implements DIVETicker {
4646
public tick(): void {
4747
// save current background reference and set it to transparent
4848
const restoreBackground = this._scene.background ?? null;
49+
const restoreAutoClear = this._renderer.webgpurenderer.autoClear;
4950
this._scene.background = null;
5051

5152
// save current viewport and set it to desired size
5253
this._renderer.webgpurenderer.getViewport(this._restoreViewport);
54+
const canvasHeight =
55+
this._renderer.webgpurenderer.domElement?.clientHeight ??
56+
this._restoreViewport.w;
5357

5458
this._renderer.webgpurenderer.setViewport(
5559
0,
56-
this._renderer.webgpurenderer.domElement.clientHeight - 150,
60+
Math.max(0, canvasHeight - 150),
5761
150,
5862
150,
5963
);
@@ -70,7 +74,7 @@ export class OrientationDisplay implements DIVETicker {
7074

7175
// restore viewport and background
7276
this._renderer.webgpurenderer.setViewport(this._restoreViewport);
73-
this._renderer.webgpurenderer.autoClear = true;
77+
this._renderer.webgpurenderer.autoClear = restoreAutoClear;
7478
this._scene.background = restoreBackground;
7579
}
7680

src/plugins/orientationdisplay/src/__test__/OrientationDisplay.test.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,17 @@ const mockCamera = {
3535
matrix: new Matrix4(),
3636
} as unknown as DIVEPerspectiveCamera;
3737

38+
const mockCanvas = document.createElement('canvas');
39+
Object.defineProperty(mockCanvas, 'clientHeight', {
40+
value: 600,
41+
configurable: true,
42+
});
43+
3844
const mockRenderer = {
3945
render: vi.fn(),
46+
canvas: mockCanvas,
4047
webgpurenderer: {
41-
getViewport: vi.fn().mockReturnValue(new Vector4(0, 0, 800, 600)),
48+
getViewport: vi.fn((viewport: Vector4) => viewport.set(0, 0, 800, 600)),
4249
setViewport: vi.fn(),
4350
render: vi.fn(),
4451
autoClear: true,
@@ -108,7 +115,7 @@ describe('OrientationDisplay', () => {
108115
).toHaveBeenCalledWith(orientationDisplay['_restoreViewport']);
109116
expect(
110117
mockRenderer.webgpurenderer.setViewport,
111-
).toHaveBeenCalledWith(0, 0, 150, 150);
118+
).toHaveBeenCalledWith(0, 450, 150, 150);
112119
expect(mockRenderer.webgpurenderer.render).toHaveBeenCalledWith(
113120
mockScene,
114121
orientationDisplay['_orthographicCamera'],
@@ -140,10 +147,23 @@ describe('OrientationDisplay', () => {
140147
);
141148
});
142149

143-
it('should manage autoClear property correctly', () => {
150+
it('should restore the previous autoClear property', () => {
151+
mockRenderer.webgpurenderer.autoClear = false;
152+
153+
orientationDisplay.tick();
154+
155+
expect(mockRenderer.webgpurenderer.autoClear).toBe(false);
156+
});
157+
158+
it('should fall back to the stored viewport height when canvas height is unavailable', () => {
159+
mockRenderer.webgpurenderer.domElement =
160+
undefined as unknown as HTMLCanvasElement;
161+
144162
orientationDisplay.tick();
145163

146-
expect(mockRenderer.webgpurenderer.autoClear).toBe(true);
164+
expect(
165+
mockRenderer.webgpurenderer.setViewport,
166+
).toHaveBeenCalledWith(0, 450, 150, 150);
147167
});
148168
});
149169
});

0 commit comments

Comments
 (0)