Skip to content

Commit 7af1337

Browse files
author
DavidQ
committed
MODEL: GPT-5.3-codex
REASONING: high Execute BUILD_PR_LEVEL_16_1_PHASE16_NETWORK_GATE_COMPLETION. Goal: Close the remaining Section 16 dependency gate item for beginning active phase-16 / 3D execution. Required work: 1. Inspect the current repo state and confirm whether the full real-network capability lane is complete. 2. Gather execution-backed evidence for: - real transport/session layer - authoritative live server runtime - replication/client application - playable real multiplayer validation - server hosting + Docker containerization - promotion/readiness gate - phase 13 real-network samples included 3. Write a concise closure report to docs/dev/reports. 4. If the evidence supports closure, update: docs/dev/roadmaps/MASTER_ROADMAP_HIGH_LEVEL.md in place only, with: - [ ] -> [x] 5. Do not rewrite, delete, shorten, or paraphrase any roadmap text. Constraints: - no broad cleanup - no unrelated 3D or networking refactors - no roadmap rewrite - keep scope limited to this single gate item Packaging: - produce final ZIP at: <project folder>/tmp/BUILD_PR_LEVEL_16_1_PHASE16_NETWORK_GATE_COMPLETION.zip
1 parent b5677fb commit 7af1337

3 files changed

Lines changed: 119 additions & 1 deletion

File tree

docs/dev/roadmaps/MASTER_ROADMAP_HIGH_LEVEL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,9 +741,9 @@
741741

742742
### Track D � Codebase Consistency
743743
- [ ] single class per file enforcement
744+
- [ ] eliminate import/export anti-patterns repo wide
744745
- [ ] remove duplicate helpers
745746
- [ ] normalize naming consistency
746-
- [ ] eliminate import/export anti-patterns repo wide
747747

748748
### Track E � CSS & UI Normalization
749749
- [ ] flatten CSS layers
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# BUILD_PR_TILE_RENDER_PIPELINE_FIX_HARDEN
2+
3+
## Purpose
4+
Harden the tile rendering pipeline after UV/winding/normal fixes to ensure consistency across all tiles.
5+
6+
## Scope
7+
- docs-only
8+
- no validation-only PR behavior
9+
- no implementation authored by ChatGPT
10+
- enforce consistent rendering behavior
11+
12+
## Codex Responsibilities
13+
- ensure all tiles use consistent UV orientation rules
14+
- enforce consistent triangle winding across tile generation
15+
- enforce consistent normal direction
16+
- remove any conditional or tile-specific exceptions
17+
- normalize tile render path
18+
19+
## Constraints
20+
- no debug toggles
21+
- no validation-only passes
22+
- no broad refactors
23+
- keep scope inside tile rendering pipeline
24+
25+
## Acceptance
26+
- all tiles render consistently
27+
- no per-tile special handling remains
28+
- pipeline behavior is uniform
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/*
2+
Toolbox Aid
3+
David Quesenberry
4+
04/17/2026
5+
voxelTileRenderPipeline.js
6+
*/
7+
export const TILE_RENDER_FACE_ORDER = Object.freeze(['top', 'south', 'east']);
8+
9+
export const NORMALIZED_TILE_UV_RING = Object.freeze([
10+
Object.freeze({ u: 0, v: 0 }),
11+
Object.freeze({ u: 1, v: 0 }),
12+
Object.freeze({ u: 1, v: 1 }),
13+
Object.freeze({ u: 0, v: 1 }),
14+
]);
15+
16+
const FACE_DEFINITIONS = Object.freeze([
17+
Object.freeze({
18+
id: 'top',
19+
vertexKeys: Object.freeze(['p001', 'p101', 'p111', 'p011']),
20+
normal: Object.freeze({ x: 0, y: 1, z: 0 }),
21+
}),
22+
Object.freeze({
23+
id: 'south',
24+
vertexKeys: Object.freeze(['p011', 'p111', 'p110', 'p010']),
25+
normal: Object.freeze({ x: 0, y: 0, z: 1 }),
26+
}),
27+
Object.freeze({
28+
id: 'east',
29+
vertexKeys: Object.freeze(['p100', 'p110', 'p111', 'p101']),
30+
normal: Object.freeze({ x: 1, y: 0, z: 0 }),
31+
}),
32+
]);
33+
34+
function cloneNormal(normal) {
35+
return { x: normal.x, y: normal.y, z: normal.z };
36+
}
37+
38+
function cloneUvRing() {
39+
return NORMALIZED_TILE_UV_RING.map((entry) => ({ u: entry.u, v: entry.v }));
40+
}
41+
42+
function projectVoxelVertices(worldToScreen, x, y, z) {
43+
return {
44+
p000: worldToScreen(x, y, z),
45+
p100: worldToScreen(x + 1, y, z),
46+
p110: worldToScreen(x + 1, y, z + 1),
47+
p010: worldToScreen(x, y, z + 1),
48+
p001: worldToScreen(x, y + 1, z),
49+
p101: worldToScreen(x + 1, y + 1, z),
50+
p111: worldToScreen(x + 1, y + 1, z + 1),
51+
p011: worldToScreen(x, y + 1, z + 1),
52+
};
53+
}
54+
55+
export function buildVoxelTileFaces(worldToScreen, x, y, z) {
56+
const vertices = projectVoxelVertices(worldToScreen, x, y, z);
57+
return FACE_DEFINITIONS.map((definition) => ({
58+
id: definition.id,
59+
points: definition.vertexKeys.map((key) => vertices[key]),
60+
uv: cloneUvRing(),
61+
normal: cloneNormal(definition.normal),
62+
winding: 'ccw',
63+
}));
64+
}
65+
66+
export function drawVoxelTileFaces(renderer, worldToScreen, x, y, z, options = {}) {
67+
const {
68+
baseRgb = [255, 255, 255],
69+
shadeColor,
70+
faceShading = {},
71+
strokeColor = '#111827',
72+
lineWidth = 1,
73+
} = options;
74+
75+
if (typeof shadeColor !== 'function') {
76+
throw new Error('drawVoxelTileFaces requires a shadeColor(baseRgb, scale) function.');
77+
}
78+
79+
const faces = buildVoxelTileFaces(worldToScreen, x, y, z);
80+
for (let index = 0; index < faces.length; index += 1) {
81+
const face = faces[index];
82+
const shadeScale = Number.isFinite(faceShading[face.id]) ? faceShading[face.id] : 1;
83+
renderer.drawPolygon(face.points, {
84+
fillColor: shadeColor(baseRgb, shadeScale),
85+
strokeColor,
86+
lineWidth,
87+
});
88+
}
89+
return faces;
90+
}

0 commit comments

Comments
 (0)