Skip to content

Commit c4b7afa

Browse files
author
DavidQ
committed
Reposition debug overlay panels to the bottom-right corner with vertical stacking to prevent interference with gameplay and HUD text.
PR: BUILD_PR_LEVEL_17_51_DEBUG_OVERLAY_POSITION_BOTTOM_RIGHT
1 parent 68c7a43 commit c4b7afa

22 files changed

Lines changed: 338 additions & 52 deletions

docs/dev/CODEX_COMMANDS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
MODEL: GPT-5.3-codex
22
REASONING: high
3-
COMMAND: Apply TAB-based debug overlay cycling to all samples from 1707 onward using shared debug infrastructure, ensuring only one overlay is visible at a time, preserving gameplay, and package to <project folder>/tmp/BUILD_PR_LEVEL_17_48_APPLY_TAB_DEBUG_TO_SAMPLES_1707_PLUS.zip
3+
COMMAND: Move debug overlay panels to bottom-right corner with vertical stacking and spacing, apply across shared debug system for samples 1701+, preserve existing behavior, and package to <project folder>/tmp/BUILD_PR_LEVEL_17_51_DEBUG_OVERLAY_POSITION_BOTTOM_RIGHT.zip

docs/dev/COMMIT_COMMENT.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
Standardize debug overlay behavior across samples 1707+ by introducing TAB-based cycling to prevent overlay stacking and improve usability.
1+
Reposition debug overlay panels to the bottom-right corner with vertical stacking to prevent interference with gameplay and HUD text.
22

3-
PR: BUILD_PR_LEVEL_17_48_APPLY_TAB_DEBUG_TO_SAMPLES_1707_PLUS
3+
PR: BUILD_PR_LEVEL_17_51_DEBUG_OVERLAY_POSITION_BOTTOM_RIGHT
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# BUILD
2+
3+
## Instructions for Codex
4+
5+
### Positioning
6+
- Anchor debug overlay container to:
7+
bottom: 10px
8+
right: 10px
9+
10+
### Layout
11+
- Stack panels vertically upward
12+
- Add spacing between panels
13+
14+
### Styling
15+
- Slight transparency (optional if already exists)
16+
- Ensure z-index remains above game but non-intrusive
17+
18+
### Scope
19+
- All debug panels (shared system)
20+
- Applies to samples 1701+
21+
22+
### Constraints
23+
- Do not change panel content
24+
- Do not break cycling logic
25+
- Use shared styling (no per-sample hacks)
26+
27+
### Validation
28+
- Panels render bottom-right
29+
- No overlap with core HUD text
30+
- Works across all samples
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# PLAN
2+
3+
## Problem
4+
Debug overlays obstruct gameplay and HUD text.
5+
6+
## Goal
7+
Relocate debug panels to bottom-right corner.
8+
9+
## Behavior
10+
- Panels stack upward from bottom-right
11+
- Maintain readability
12+
- Avoid overlap with gameplay HUD

samples/phase-16/shared/threeDWireframe.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ David Quesenberry
44
04/15/2026
55
threeDWireframe.js
66
*/
7+
import { getNextBottomRightDebugPanelRect } from '/src/engine/debug/DebugOverlayLayout.js';
8+
79
const BOX_EDGES = [
810
[0, 1], [1, 2], [2, 3], [3, 0],
911
[4, 5], [5, 6], [6, 7], [7, 4],
@@ -260,7 +262,7 @@ export function drawDepthBackdrop(renderer, viewport, {
260262
}
261263
}
262264

263-
export function drawPhase16DebugOverlay(renderer, viewport, viewState, lines = []) {
265+
export function drawPhase16DebugOverlay(renderer, viewport, viewState, lines = [], { stack = null } = {}) {
264266
if (!viewState?.debugOverlayEnabled) {
265267
return;
266268
}
@@ -272,14 +274,17 @@ export function drawPhase16DebugOverlay(renderer, viewport, viewState, lines = [
272274
...lines,
273275
];
274276

275-
const x = viewport.x + 12;
276-
const y = viewport.y + 12;
277277
const width = Math.min(420, viewport.width - 24);
278278
const height = 30 + overlayLines.length * 18;
279-
renderer.drawRect(x, y, width, height, 'rgba(15, 23, 42, 0.84)');
280-
renderer.strokeRect(x, y, width, height, '#475569', 1);
279+
const defaultX = viewport.x + 12;
280+
const defaultY = viewport.y + 12;
281+
const rect = stack
282+
? getNextBottomRightDebugPanelRect(stack, width, height)
283+
: { x: defaultX, y: defaultY, width, height };
284+
renderer.drawRect(rect.x, rect.y, rect.width, rect.height, 'rgba(15, 23, 42, 0.84)');
285+
renderer.strokeRect(rect.x, rect.y, rect.width, rect.height, '#475569', 1);
281286
overlayLines.forEach((line, index) => {
282-
renderer.drawText(line, x + 10, y + 22 + index * 18, {
287+
renderer.drawText(line, rect.x + 10, rect.y + 22 + index * 18, {
283288
color: '#e2e8f0',
284289
font: '13px monospace',
285290
});

samples/phase-17/1701/RaycastDemoScene.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ RaycastDemoScene.js
66
*/
77
import { Scene } from '/src/engine/scene/index.js';
88
import { Theme, ThemeTokens } from '/src/engine/theme/index.js';
9-
import { drawFrame, drawPanel } from '/src/engine/debug/index.js';
9+
import { createBottomRightDebugPanelStack, drawFrame, drawStackedDebugPanel } from '/src/engine/debug/index.js';
1010

1111
const theme = new Theme(ThemeTokens);
1212

@@ -215,7 +215,8 @@ export default class DoomRaycastSpritesScene extends Scene {
215215
}
216216

217217
this.drawSprites(renderer, columnWidth);
218-
drawPanel(renderer, 620, 34, 300, 170, 'DOOM Runtime', [
218+
const debugStack = createBottomRightDebugPanelStack(renderer);
219+
drawStackedDebugPanel(renderer, debugStack, 300, 170, 'DOOM Runtime', [
219220
`Player: x=${this.player.x.toFixed(2)} y=${this.player.y.toFixed(2)}`,
220221
`Angle: ${this.player.angle.toFixed(2)} rad`,
221222
`Filled columns: ${this.lastFilledColumns}`,

samples/phase-17/1702/RaycastDemoScene.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ RaycastDemoScene.js
66
*/
77
import { Scene } from '/src/engine/scene/index.js';
88
import { Theme, ThemeTokens } from '/src/engine/theme/index.js';
9-
import { drawFrame, drawPanel } from '/src/engine/debug/index.js';
9+
import { createBottomRightDebugPanelStack, drawFrame, drawStackedDebugPanel } from '/src/engine/debug/index.js';
1010

1111
const theme = new Theme(ThemeTokens);
1212

@@ -166,7 +166,8 @@ export default class WolfGridRaycastScene extends Scene {
166166
}
167167

168168
this.drawMiniMap(renderer);
169-
drawPanel(renderer, 620, 34, 300, 170, 'Wolf Runtime', [
169+
const debugStack = createBottomRightDebugPanelStack(renderer);
170+
drawStackedDebugPanel(renderer, debugStack, 300, 170, 'Wolf Runtime', [
170171
`Player: x=${this.player.x.toFixed(2)} y=${this.player.y.toFixed(2)}`,
171172
`Angle: ${this.player.angle.toFixed(2)} rad`,
172173
`FOV: ${(this.fov * 180 / Math.PI).toFixed(0)} deg`,

samples/phase-17/1703/RaycastDemoScene.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ RaycastDemoScene.js
66
*/
77
import { Scene } from '/src/engine/scene/index.js';
88
import { Theme, ThemeTokens } from '/src/engine/theme/index.js';
9-
import { drawFrame, drawPanel } from '/src/engine/debug/index.js';
9+
import { createBottomRightDebugPanelStack, drawFrame, drawStackedDebugPanel } from '/src/engine/debug/index.js';
1010

1111
const theme = new Theme(ThemeTokens);
1212

@@ -171,7 +171,8 @@ export default class WolfOptimizedRaycastScene extends Scene {
171171
this.lastFilledColumns += 1;
172172
}
173173

174-
drawPanel(renderer, 620, 34, 300, 182, 'Wolf Runtime', [
174+
const debugStack = createBottomRightDebugPanelStack(renderer);
175+
drawStackedDebugPanel(renderer, debugStack, 300, 182, 'Wolf Runtime', [
175176
`Player: x=${this.player.x.toFixed(2)} y=${this.player.y.toFixed(2)}`,
176177
`Angle: ${this.player.angle.toFixed(2)} rad`,
177178
`Filled columns: ${this.lastFilledColumns}`,

samples/phase-17/1704/TextureMaterialDemoScene.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ TextureMaterialDemoScene.js
66
*/
77
import { Scene } from '/src/engine/scene/index.js';
88
import { Theme, ThemeTokens } from '/src/engine/theme/index.js';
9-
import { drawFrame, drawPanel } from '/src/engine/debug/index.js';
9+
import { createBottomRightDebugPanelStack, drawFrame, drawStackedDebugPanel } from '/src/engine/debug/index.js';
1010
import {
1111
applyPhase16CameraMode,
1212
createPhase16ViewState,
@@ -165,7 +165,8 @@ export default class TextureMaterialDemoScene extends Scene {
165165
this.drawTexturedSurface(renderer, sorted[i], cameraState, projectionViewport);
166166
}
167167

168-
drawPanel(renderer, 620, 34, 300, 188, 'Material Runtime', [
168+
const debugStack = createBottomRightDebugPanelStack(renderer);
169+
drawStackedDebugPanel(renderer, debugStack, 300, 188, 'Material Runtime', [
169170
`Textured surfaces: ${this.surfaces.length}`,
170171
`Image draws: ${this.lastImageDraws}`,
171172
`Light pulse: ${Math.sin(this.lightPulse).toFixed(2)}`,
@@ -177,6 +178,6 @@ export default class TextureMaterialDemoScene extends Scene {
177178
drawPhase16DebugOverlay(renderer, viewport, this.viewState, [
178179
'Each panel uses a distinct image texture source',
179180
'Tint overlay simulates lightweight material response',
180-
]);
181+
], { stack: debugStack });
181182
}
182183
}

samples/phase-17/1705/ImageSkinnedCharacterDemoScene.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ ImageSkinnedCharacterDemoScene.js
66
*/
77
import { Scene } from '/src/engine/scene/index.js';
88
import { Theme, ThemeTokens } from '/src/engine/theme/index.js';
9-
import { drawFrame, drawPanel } from '/src/engine/debug/index.js';
9+
import { createBottomRightDebugPanelStack, drawFrame, drawStackedDebugPanel } from '/src/engine/debug/index.js';
1010
import {
1111
applyPhase16CameraMode,
1212
createPhase16ViewState,
@@ -169,7 +169,8 @@ export default class ImageSkinnedCharacterDemoScene extends Scene {
169169
this.lastImageDraws = 0;
170170
this.drawCharacter(renderer, cameraState, projectionViewport);
171171

172-
drawPanel(renderer, 620, 34, 300, 188, 'Character Runtime', [
172+
const debugStack = createBottomRightDebugPanelStack(renderer);
173+
drawStackedDebugPanel(renderer, debugStack, 300, 188, 'Character Runtime', [
173174
`Frame index: ${this.currentFrameIndex}`,
174175
`Image draws: ${this.lastImageDraws}`,
175176
`Character x: ${this.character.x.toFixed(2)}`,
@@ -181,6 +182,6 @@ export default class ImageSkinnedCharacterDemoScene extends Scene {
181182
drawPhase16DebugOverlay(renderer, viewport, this.viewState, [
182183
'Sprite sheet frame advances with motion cycle',
183184
'Character remains image-backed across all frames',
184-
]);
185+
], { stack: debugStack });
185186
}
186187
}

0 commit comments

Comments
 (0)