@forgeax/engine-debug-draw 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +256 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/errors.test-d.d.ts +2 -0
  5. package/dist/__tests__/errors.test-d.d.ts.map +1 -0
  6. package/dist/constants.d.ts +7 -0
  7. package/dist/constants.d.ts.map +1 -0
  8. package/dist/debug-draw.d.ts +65 -0
  9. package/dist/debug-draw.d.ts.map +1 -0
  10. package/dist/errors.d.ts +65 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/index.d.ts +5 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.mjs +835 -0
  15. package/dist/index.mjs.map +1 -0
  16. package/dist/shapes/aabb.d.ts +4 -0
  17. package/dist/shapes/aabb.d.ts.map +1 -0
  18. package/dist/shapes/arrow.d.ts +11 -0
  19. package/dist/shapes/arrow.d.ts.map +1 -0
  20. package/dist/shapes/axes.d.ts +18 -0
  21. package/dist/shapes/axes.d.ts.map +1 -0
  22. package/dist/shapes/frustum.d.ts +7 -0
  23. package/dist/shapes/frustum.d.ts.map +1 -0
  24. package/dist/shapes/line.d.ts +4 -0
  25. package/dist/shapes/line.d.ts.map +1 -0
  26. package/dist/shapes/sphere.d.ts +7 -0
  27. package/dist/shapes/sphere.d.ts.map +1 -0
  28. package/dist/types.d.ts +136 -0
  29. package/dist/types.d.ts.map +1 -0
  30. package/package.json +61 -0
  31. package/src/__tests__/errors.test-d.ts +89 -0
  32. package/src/constants.ts +13 -0
  33. package/src/debug-draw.ts +713 -0
  34. package/src/errors.ts +142 -0
  35. package/src/index.ts +14 -0
  36. package/src/shapes/aabb.ts +57 -0
  37. package/src/shapes/arrow.ts +75 -0
  38. package/src/shapes/axes.ts +60 -0
  39. package/src/shapes/frustum.ts +182 -0
  40. package/src/shapes/line.ts +14 -0
  41. package/src/shapes/sphere.ts +74 -0
  42. package/src/types.ts +176 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/shapes/aabb.ts","../src/shapes/arrow.ts","../src/shapes/axes.ts","../src/shapes/frustum.ts","../src/shapes/line.ts","../src/shapes/sphere.ts","../src/debug-draw.ts"],"names":["a","at"],"mappings":"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","file":"index.mjs","sourcesContent":["// @forgeax/engine-debug-draw -- constants SSOT (feat-20260615-debug-draw M1 / w3)\n//\n// Three configurable tunables exported for unit-test consumption.\n// All values are per plan-strategy D-4 / D-7 / D-9.\n\n/** Initial CPU staging vertex capacity before any resize. */\nexport const INITIAL_VERTEX_CAPACITY = 1024;\n\n/** Hard upper bound on vertex count per flush; excess vertices are truncated with a warning. */\nexport const MAX_VERTEX_CAPACITY = 1_000_000;\n\n/** Vertex stride in bytes: 12 B position (float32x3) + 4 B color (unorm8x4). */\nexport const VERTEX_STRIDE_BYTES = 16;\n","// @forgeax/engine-debug-draw -- error model SSOT (feat-20260615-debug-draw M1 / w2)\n//\n// Closed union DebugDrawErrorCode, discriminated detail union,\n// and structured DebugDrawError carrying .code / .expected / .hint / .detail.\n//\n// Decision anchors:\n// - plan-strategy D-11: destroy-then-flush returns Result.err, shape calls no-op + warn once\n// - requirements sec 3.6: error code closed union 4 members\n// - AGENTS.md Error model: structured errors with .expected / .hint, never throw\n// - architecture-principles #5 Fail Fast: validate at entry, non-conforming data never flows downstream\n\nimport { err, type Result } from '@forgeax/engine-types';\n\n/** {@link pipeline-create-failed} payload: carries the RHI-level error detail. */\nexport interface PipelineCreateFailedDetail {\n readonly code: 'pipeline-create-failed';\n readonly rhiError: string;\n}\n\n/** {@link buffer-allocation-failed} payload: carries the RHI-level error detail. */\nexport interface BufferAllocationFailedDetail {\n readonly code: 'buffer-allocation-failed';\n readonly rhiError: string;\n}\n\n/** {@link flushed-after-destroy} payload: carries the instance identifier. */\nexport interface FlushedAfterDestroyDetail {\n readonly code: 'flushed-after-destroy';\n}\n\n/** {@link viewProj-required} payload: carries the missing parameter name. */\nexport interface ViewProjRequiredDetail {\n readonly code: 'viewProj-required';\n}\n\ninterface DebugDrawErrorDetailByCode {\n 'pipeline-create-failed': PipelineCreateFailedDetail;\n 'buffer-allocation-failed': BufferAllocationFailedDetail;\n 'flushed-after-destroy': FlushedAfterDestroyDetail;\n 'viewProj-required': ViewProjRequiredDetail;\n}\n\n/**\n * Closed {@link DebugDrawErrorCode} union.\n * Exhaustive `switch (err.code)` needs no default fallback.\n *\n * | code | trigger |\n * |:--|:--|\n * | `'pipeline-create-failed'` | `device.createRenderPipeline(...)` rejected or threw |\n * | `'buffer-allocation-failed'` | `device.createBuffer(...)` for GPU vbo allocation failed |\n * | `'flushed-after-destroy'` | `flush()` called on an already-destroyed DebugDraw instance |\n * | `'viewProj-required'` | `flush()` called with `undefined` or missing `viewProj` |\n */\nexport type DebugDrawErrorCode = keyof DebugDrawErrorDetailByCode;\n\n/**\n * Discriminated detail union for {@link DebugDrawError}, narrowed per\n * `DebugDrawError.code`. AI users obtain the concrete shape via\n * `switch (err.code)` without a fallback `as` cast.\n */\nexport type DebugDrawErrorDetail = DebugDrawErrorDetailByCode[DebugDrawErrorCode];\n\n/**\n * Structured debug-draw error -- four-field surface\n * (`.code` / `.expected` / `.hint` / `.detail`).\n *\n * AI users consume the structured triple by fields, not by parsing `.message`.\n */\ntype DebugDrawErrorVariant<C extends DebugDrawErrorCode> = {\n readonly code: C;\n readonly expected: string;\n readonly hint: string;\n readonly detail: DebugDrawErrorDetailByCode[C];\n};\n\nexport type DebugDrawError = {\n [C in DebugDrawErrorCode]: DebugDrawErrorVariant<C>;\n}[DebugDrawErrorCode];\n\nfunction makeError<C extends DebugDrawErrorCode>(\n code: C,\n expected: string,\n hint: string,\n detail: DebugDrawErrorDetailByCode[C],\n): DebugDrawErrorVariant<C> {\n const error = {\n code,\n expected,\n hint,\n detail,\n get message(): string {\n return `[${code}] ${hint}`;\n },\n };\n return error;\n}\n\n/** Result-returning helpers consuming engine-types `Result<T, E>` + `err()`. */\n\nexport function pipelineCreateFailed(rhiError: string): Result<never, DebugDrawError> {\n return err(\n makeError(\n 'pipeline-create-failed',\n 'PSO creation should succeed with valid WGSL + layout',\n `Pipeline creation failed: ${rhiError}. Check WGSL syntax, vertex layout, and depth-stencil state.`,\n { code: 'pipeline-create-failed', rhiError },\n ),\n );\n}\n\nexport function bufferAllocationFailed(rhiError: string): Result<never, DebugDrawError> {\n return err(\n makeError(\n 'buffer-allocation-failed',\n 'GPU vertex buffer allocation should succeed for the requested byte size',\n `Buffer allocation failed: ${rhiError}. Check available device memory and buffer usage flags.`,\n { code: 'buffer-allocation-failed', rhiError },\n ),\n );\n}\n\nexport function flushedAfterDestroy(): Result<never, DebugDrawError> {\n return err(\n makeError(\n 'flushed-after-destroy',\n 'DebugDraw instance is alive and not yet destroyed',\n 'DebugDraw was destroyed; create a new instance via createDebugDraw().',\n { code: 'flushed-after-destroy' },\n ),\n );\n}\n\nexport function viewProjRequired(): Result<never, DebugDrawError> {\n return err(\n makeError(\n 'viewProj-required',\n 'viewProj must be provided as a Mat4 for flush to transform vertices',\n 'Pass a viewProj Mat4 to flush(encoder, view, viewProj).',\n { code: 'viewProj-required' },\n ),\n );\n}\n","// @forgeax/engine-debug-draw -- aabb shape geometry (M3 / w20)\n//\n// Pure geometry decomposition: 12 edges (24 vertices) from 8 corners.\n// No staging / GPU concerns; consumed by DebugDraw class.\n\nimport type { Vec3 } from '@forgeax/engine-math';\n\nfunction a(v: { readonly [index: number]: number }, i: number): number {\n return v[i] as number;\n}\n\n/** 24 vertices forming a wireframe axis-aligned bounding box (12 edges). */\nexport function aabbVertices(min: Vec3, max: Vec3): [number, number, number][] {\n const mnx = a(min, 0);\n const mny = a(min, 1);\n const mnz = a(min, 2);\n const mxx = a(max, 0);\n const mxy = a(max, 1);\n const mxz = a(max, 2);\n\n // 8 corners: x in {mnx, mxx}, y in {mny, mxy}, z in {mnz, mxz}\n const c: [number, number, number][] = [\n [mnx, mny, mnz], // 0\n [mxx, mny, mnz], // 1\n [mnx, mxy, mnz], // 2\n [mxx, mxy, mnz], // 3\n [mnx, mny, mxz], // 4\n [mxx, mny, mxz], // 5\n [mnx, mxy, mxz], // 6\n [mxx, mxy, mxz], // 7\n ];\n\n // 12 edges\n const edges: [number, number][] = [\n [0, 1],\n [0, 2],\n [1, 3],\n [2, 3],\n [4, 5],\n [4, 6],\n [5, 7],\n [6, 7],\n [0, 4],\n [1, 5],\n [2, 6],\n [3, 7],\n ];\n\n const result: [number, number, number][] = [];\n for (const [ai, bi] of edges) {\n const ac = c[ai] as [number, number, number];\n const bc = c[bi] as [number, number, number];\n result.push([ac[0], ac[1], ac[2]]);\n result.push([bc[0], bc[1], bc[2]]);\n }\n return result;\n}\n","// @forgeax/engine-debug-draw -- arrow shape geometry (solo round 20260713-222551)\n//\n// Pure geometry decomposition: an arrow = 1 body segment (start->end) + 4 arrowhead\n// segments from `end` back toward 4 canonical tip vectors, rotated so local +X aligns\n// with the arrow's direction. Mirrors Bevy `bevy_gizmos::arrows` ArrowBuilder::drop.\n// No staging / GPU concerns; consumed by the DebugDraw class.\n\nimport type { Vec3Like } from '@forgeax/engine-math';\nimport { quat, vec3 } from '@forgeax/engine-math';\n\n// The 4 arrowhead tip directions in the arrow's local frame (arrow points toward +X),\n// matching Bevy's tips array. Normalized when scaled to tipLength.\nconst TIP_DIRS: ReadonlyArray<readonly [number, number, number]> = [\n [-1, 1, 0],\n [-1, 0, 1],\n [-1, -1, 0],\n [-1, 0, -1],\n];\n\n// Plain Vec3Like (not a branded Vec3) — `quat.fromUnitVectors` accepts Vec3Like, so no\n// cross-boundary brand cast is needed (brand-cast lint: casts live only in math factories).\nconst UNIT_X: Vec3Like = [1, 0, 0];\n\n/**\n * Line-segment vertices for an arrow from `start` to `end`.\n * Returns 10 vertices = 5 segments (1 body + 4 arrowhead), each a [x,y,z] pair\n * consumed pairwise by the line-list renderer.\n *\n * `tipLength` defaults to `|end - start| / 10` (Bevy's default arrowhead length).\n * A degenerate (zero-length) arrow emits only the body segment (no orientable head).\n */\nexport function arrowVertices(\n start: Vec3Like,\n end: Vec3Like,\n tipLength?: number,\n): [number, number, number][] {\n const sx = start[0] as number;\n const sy = start[1] as number;\n const sz = start[2] as number;\n const ex = end[0] as number;\n const ey = end[1] as number;\n const ez = end[2] as number;\n\n const verts: [number, number, number][] = [\n [sx, sy, sz],\n [ex, ey, ez],\n ];\n\n const dir = vec3.create();\n vec3.set(dir, ex - sx, ey - sy, ez - sz);\n const len = vec3.length(dir);\n if (len < 1e-6) return verts; // degenerate: no orientable head\n\n const headLen = tipLength ?? len / 10;\n vec3.normalize(dir, dir);\n\n // Rotate the local-frame tip vectors so +X faces the arrow direction.\n const rot = quat.fromUnitVectors(quat.create(), UNIT_X, dir);\n const tipLocal = vec3.create();\n const tipWorld = vec3.create();\n for (const [tx, ty, tz] of TIP_DIRS) {\n vec3.set(tipLocal, tx, ty, tz);\n vec3.normalize(tipLocal, tipLocal);\n vec3.scale(tipLocal, tipLocal, headLen);\n quat.transformVec3(tipWorld, rot, tipLocal);\n // Head segment: from the arrow tip (end) back out to the rotated tip vector.\n verts.push([ex, ey, ez]);\n verts.push([\n ex + (tipWorld[0] as number),\n ey + (tipWorld[1] as number),\n ez + (tipWorld[2] as number),\n ]);\n }\n return verts;\n}\n","// @forgeax/engine-debug-draw -- axes gizmo geometry (solo round 20260713-222551)\n//\n// Draws a transform's local coordinate frame as three arrows (X / Y / Z), matching\n// Bevy `gizmos.axes(transform, base_length)`. Each axis endpoint is\n// `translation + base_length * column_i` of the world matrix — i.e. Bevy's\n// `transform.transform_point(base_length * Vec3::AXIS)` (the world-space direction the\n// local axis points, scale included). Colors follow the universal convention:\n// X = red, Y = green, Z = blue. No staging / GPU concerns; consumed by the DebugDraw class.\n\nimport type { Mat4, Vec3Like } from '@forgeax/engine-math';\nimport { arrowVertices } from './arrow';\n\n/** X=red, Y=green, Z=blue RGBA (Bevy's axes convention). */\nexport const AXES_COLORS: readonly [\n readonly [number, number, number, number],\n readonly [number, number, number, number],\n readonly [number, number, number, number],\n] = [\n [1, 0, 0, 1],\n [0, 1, 0, 1],\n [0, 0, 1, 1],\n];\n\n/**\n * The three axis arrows for a world transform, as `{ vertices, color }` per axis\n * (X, Y, Z). The caller (DebugDraw.axes) pushes each with its color. `worldMat` is a\n * 16-float column-major mat4; the arrows originate at its translation (col 3) and point\n * `length` along its local X / Y / Z (columns 0 / 1 / 2, scale included, matching Bevy).\n */\nexport function axesArrowSets(\n worldMat: Mat4,\n length: number,\n): { vertices: [number, number, number][]; color: readonly [number, number, number, number] }[] {\n const m = worldMat as unknown as ArrayLike<number>;\n const ox = m[12] as number;\n const oy = m[13] as number;\n const oz = m[14] as number;\n // Plain Vec3Like tuples (not branded Vec3) — arrowVertices accepts Vec3Like, so no\n // cross-boundary brand cast is needed (brand-cast lint: casts live only in math factories).\n const origin: Vec3Like = [ox, oy, oz];\n\n // Columns 0/1/2 are the local X/Y/Z basis in world space (rotation * scale).\n const cols: ReadonlyArray<readonly [number, number, number]> = [\n [m[0] as number, m[1] as number, m[2] as number],\n [m[4] as number, m[5] as number, m[6] as number],\n [m[8] as number, m[9] as number, m[10] as number],\n ];\n\n const sets: {\n vertices: [number, number, number][];\n color: readonly [number, number, number, number];\n }[] = [];\n for (let i = 0; i < 3; i++) {\n const c = cols[i] as readonly [number, number, number];\n const color = AXES_COLORS[i] as readonly [number, number, number, number];\n const end: Vec3Like = [ox + c[0] * length, oy + c[1] * length, oz + c[2] * length];\n sets.push({ vertices: arrowVertices(origin, end), color });\n }\n return sets;\n}\n","// @forgeax/engine-debug-draw -- frustum shape geometry (M3 / w21)\n//\n// Pure geometry decomposition: invert viewProj matrix, transform 8 NDC\n// corners to world space, draw 12 edges (24 vertices).\n// Returns null when the viewProj is near-singular (determinant ~ 0).\n// No staging / GPU concerns; consumed by DebugDraw class.\n\nimport { type Mat4, mat4 } from '@forgeax/engine-math';\n\nfunction at(m: { readonly [index: number]: number }, i: number): number {\n return m[i] as number;\n}\n\n/**\n * Generate 24 vertices (12 edges) for a frustum wireframe from a view-projection matrix.\n * Returns null if the matrix is near-singular (|det| < 1e-10).\n */\nexport function frustumVertices(viewProj: Mat4): [number, number, number][] | null {\n const m = viewProj;\n\n // 4x4 determinant\n const det =\n at(m, 0) *\n (at(m, 5) * (at(m, 10) * at(m, 15) - at(m, 14) * at(m, 11)) -\n at(m, 9) * (at(m, 6) * at(m, 15) - at(m, 14) * at(m, 7)) +\n at(m, 13) * (at(m, 6) * at(m, 11) - at(m, 10) * at(m, 7))) -\n at(m, 4) *\n (at(m, 1) * (at(m, 10) * at(m, 15) - at(m, 14) * at(m, 11)) -\n at(m, 9) * (at(m, 2) * at(m, 15) - at(m, 14) * at(m, 3)) +\n at(m, 13) * (at(m, 2) * at(m, 11) - at(m, 10) * at(m, 3))) +\n at(m, 8) *\n (at(m, 1) * (at(m, 6) * at(m, 15) - at(m, 14) * at(m, 7)) -\n at(m, 5) * (at(m, 2) * at(m, 15) - at(m, 14) * at(m, 3)) +\n at(m, 13) * (at(m, 2) * at(m, 7) - at(m, 6) * at(m, 3))) -\n at(m, 12) *\n (at(m, 1) * (at(m, 6) * at(m, 11) - at(m, 10) * at(m, 7)) -\n at(m, 5) * (at(m, 2) * at(m, 11) - at(m, 10) * at(m, 3)) +\n at(m, 9) * (at(m, 2) * at(m, 7) - at(m, 6) * at(m, 3)));\n\n if (Math.abs(det) < 1e-10) {\n return null;\n }\n\n // 4x4 inverse via cofactor expansion\n const invDet = 1.0 / det;\n const inv = mat4.create();\n inv[0] =\n (at(m, 5) * (at(m, 10) * at(m, 15) - at(m, 14) * at(m, 11)) -\n at(m, 9) * (at(m, 6) * at(m, 15) - at(m, 14) * at(m, 7)) +\n at(m, 13) * (at(m, 6) * at(m, 11) - at(m, 10) * at(m, 7))) *\n invDet;\n inv[1] =\n -(\n at(m, 1) * (at(m, 10) * at(m, 15) - at(m, 14) * at(m, 11)) -\n at(m, 9) * (at(m, 2) * at(m, 15) - at(m, 14) * at(m, 3)) +\n at(m, 13) * (at(m, 2) * at(m, 11) - at(m, 10) * at(m, 3))\n ) * invDet;\n inv[2] =\n (at(m, 1) * (at(m, 6) * at(m, 15) - at(m, 14) * at(m, 7)) -\n at(m, 5) * (at(m, 2) * at(m, 15) - at(m, 14) * at(m, 3)) +\n at(m, 13) * (at(m, 2) * at(m, 7) - at(m, 6) * at(m, 3))) *\n invDet;\n inv[3] =\n -(\n at(m, 1) * (at(m, 6) * at(m, 11) - at(m, 10) * at(m, 7)) -\n at(m, 5) * (at(m, 2) * at(m, 11) - at(m, 10) * at(m, 3)) +\n at(m, 9) * (at(m, 2) * at(m, 7) - at(m, 6) * at(m, 3))\n ) * invDet;\n inv[4] =\n -(\n at(m, 4) * (at(m, 10) * at(m, 15) - at(m, 14) * at(m, 11)) -\n at(m, 8) * (at(m, 6) * at(m, 15) - at(m, 14) * at(m, 7)) +\n at(m, 12) * (at(m, 6) * at(m, 11) - at(m, 10) * at(m, 7))\n ) * invDet;\n inv[5] =\n (at(m, 0) * (at(m, 10) * at(m, 15) - at(m, 14) * at(m, 11)) -\n at(m, 8) * (at(m, 2) * at(m, 15) - at(m, 14) * at(m, 3)) +\n at(m, 12) * (at(m, 2) * at(m, 11) - at(m, 10) * at(m, 3))) *\n invDet;\n inv[6] =\n -(\n at(m, 0) * (at(m, 6) * at(m, 15) - at(m, 14) * at(m, 7)) -\n at(m, 4) * (at(m, 2) * at(m, 15) - at(m, 14) * at(m, 3)) +\n at(m, 12) * (at(m, 2) * at(m, 7) - at(m, 6) * at(m, 3))\n ) * invDet;\n inv[7] =\n (at(m, 0) * (at(m, 6) * at(m, 11) - at(m, 10) * at(m, 7)) -\n at(m, 4) * (at(m, 2) * at(m, 11) - at(m, 10) * at(m, 3)) +\n at(m, 8) * (at(m, 2) * at(m, 7) - at(m, 6) * at(m, 3))) *\n invDet;\n inv[8] =\n (at(m, 4) * (at(m, 9) * at(m, 15) - at(m, 13) * at(m, 11)) -\n at(m, 8) * (at(m, 5) * at(m, 15) - at(m, 13) * at(m, 7)) +\n at(m, 12) * (at(m, 5) * at(m, 11) - at(m, 9) * at(m, 7))) *\n invDet;\n inv[9] =\n -(\n at(m, 0) * (at(m, 9) * at(m, 15) - at(m, 13) * at(m, 11)) -\n at(m, 8) * (at(m, 1) * at(m, 15) - at(m, 13) * at(m, 3)) +\n at(m, 12) * (at(m, 1) * at(m, 11) - at(m, 9) * at(m, 3))\n ) * invDet;\n inv[10] =\n (at(m, 0) * (at(m, 5) * at(m, 15) - at(m, 13) * at(m, 7)) -\n at(m, 4) * (at(m, 1) * at(m, 15) - at(m, 13) * at(m, 3)) +\n at(m, 12) * (at(m, 1) * at(m, 7) - at(m, 5) * at(m, 3))) *\n invDet;\n inv[11] =\n -(\n at(m, 0) * (at(m, 5) * at(m, 11) - at(m, 9) * at(m, 7)) -\n at(m, 4) * (at(m, 1) * at(m, 11) - at(m, 9) * at(m, 3)) +\n at(m, 8) * (at(m, 1) * at(m, 7) - at(m, 5) * at(m, 3))\n ) * invDet;\n inv[12] =\n -(\n at(m, 4) * (at(m, 9) * at(m, 14) - at(m, 13) * at(m, 10)) -\n at(m, 8) * (at(m, 5) * at(m, 14) - at(m, 13) * at(m, 6)) +\n at(m, 12) * (at(m, 5) * at(m, 10) - at(m, 9) * at(m, 6))\n ) * invDet;\n inv[13] =\n (at(m, 0) * (at(m, 9) * at(m, 14) - at(m, 13) * at(m, 10)) -\n at(m, 8) * (at(m, 1) * at(m, 14) - at(m, 13) * at(m, 2)) +\n at(m, 12) * (at(m, 1) * at(m, 10) - at(m, 9) * at(m, 2))) *\n invDet;\n inv[14] =\n -(\n at(m, 0) * (at(m, 5) * at(m, 14) - at(m, 13) * at(m, 6)) -\n at(m, 4) * (at(m, 1) * at(m, 14) - at(m, 13) * at(m, 2)) +\n at(m, 12) * (at(m, 1) * at(m, 6) - at(m, 5) * at(m, 2))\n ) * invDet;\n inv[15] =\n (at(m, 0) * (at(m, 5) * at(m, 10) - at(m, 9) * at(m, 6)) -\n at(m, 4) * (at(m, 1) * at(m, 10) - at(m, 9) * at(m, 2)) +\n at(m, 8) * (at(m, 1) * at(m, 6) - at(m, 5) * at(m, 2))) *\n invDet;\n\n // 8 NDC corners: x,y in {-1,1}, z in [0,1] (WebGPU NDC, matches mat4.perspective).\n // Near plane = z=0, far plane = z=1.\n const ndc: [number, number, number, number][] = [\n [-1, -1, 0, 1],\n [1, -1, 0, 1],\n [-1, 1, 0, 1],\n [1, 1, 0, 1],\n [-1, -1, 1, 1],\n [1, -1, 1, 1],\n [-1, 1, 1, 1],\n [1, 1, 1, 1],\n ];\n\n const corners: [number, number, number][] = ndc.map(([nx, ny, nz, nw]) => {\n const cx = at(inv, 0) * nx + at(inv, 4) * ny + at(inv, 8) * nz + at(inv, 12) * nw;\n const cy = at(inv, 1) * nx + at(inv, 5) * ny + at(inv, 9) * nz + at(inv, 13) * nw;\n const cz = at(inv, 2) * nx + at(inv, 6) * ny + at(inv, 10) * nz + at(inv, 14) * nw;\n const cw = at(inv, 3) * nx + at(inv, 7) * ny + at(inv, 11) * nz + at(inv, 15) * nw;\n const iw = 1.0 / cw;\n return [cx * iw, cy * iw, cz * iw] as [number, number, number];\n });\n\n // 12 edges\n const edges: [number, number][] = [\n [0, 1],\n [0, 2],\n [1, 3],\n [2, 3],\n [4, 5],\n [4, 6],\n [5, 7],\n [6, 7],\n [0, 4],\n [1, 5],\n [2, 6],\n [3, 7],\n ];\n\n const result: [number, number, number][] = [];\n for (const [ai, bi] of edges) {\n const ac = corners[ai] as [number, number, number];\n const bc = corners[bi] as [number, number, number];\n result.push([ac[0], ac[1], ac[2]]);\n result.push([bc[0], bc[1], bc[2]]);\n }\n return result;\n}\n","// @forgeax/engine-debug-draw -- line shape geometry (M3 / w20)\n//\n// Pure geometry decomposition: 1 segment = 2 vertices.\n// No staging / GPU concerns; consumed by DebugDraw class.\n\nimport type { Vec3 } from '@forgeax/engine-math';\n\n/** 2 vertices forming a line segment from `a` to `b`. */\nexport function lineVertices(a: Vec3, b: Vec3): [number, number, number][] {\n return [\n [a[0] as number, a[1] as number, a[2] as number],\n [b[0] as number, b[1] as number, b[2] as number],\n ];\n}\n","// @forgeax/engine-debug-draw -- sphere shape geometry (M3 / w21)\n//\n// Pure geometry decomposition: 3 orthogonal great-circle rings\n// (XY, XZ, YZ planes). Each ring has `segments` segments producing\n// 2 vertices each. Default segments=16 gives 96 vertices (3 * 2 * 16).\n// No staging / GPU concerns; consumed by DebugDraw class.\n\nimport type { Vec3 } from '@forgeax/engine-math';\n\nfunction a(v: { readonly [index: number]: number }, i: number): number {\n return v[i] as number;\n}\n\n/**\n * Generate vertices for a wireframe sphere.\n * Returns 3 * 2 * segments vertices (pairs forming line segments).\n */\nexport function sphereVertices(\n center: Vec3,\n radius: number,\n segments: number,\n): [number, number, number][] {\n const cx = a(center, 0);\n const cy = a(center, 1);\n const cz = a(center, 2);\n const step = (2 * Math.PI) / segments;\n\n const result: [number, number, number][] = [];\n\n for (let plane = 0; plane < 3; plane++) {\n for (let i = 0; i < segments; i++) {\n const angle0 = i * step;\n const angle1 = (i + 1) % segments;\n\n let p0x: number;\n let p0y: number;\n let p0z: number;\n let p1x: number;\n let p1y: number;\n let p1z: number;\n\n if (plane === 0) {\n // XY plane\n p0x = cx + radius * Math.cos(angle0);\n p0y = cy + radius * Math.sin(angle0);\n p0z = cz;\n p1x = cx + radius * Math.cos(angle1);\n p1y = cy + radius * Math.sin(angle1);\n p1z = cz;\n } else if (plane === 1) {\n // XZ plane\n p0x = cx + radius * Math.cos(angle0);\n p0y = cy;\n p0z = cz + radius * Math.sin(angle0);\n p1x = cx + radius * Math.cos(angle1);\n p1y = cy;\n p1z = cz + radius * Math.sin(angle1);\n } else {\n // YZ plane\n p0x = cx;\n p0y = cy + radius * Math.cos(angle0);\n p0z = cz + radius * Math.sin(angle0);\n p1x = cx;\n p1y = cy + radius * Math.cos(angle1);\n p1z = cz + radius * Math.sin(angle1);\n }\n\n result.push([p0x, p0y, p0z]);\n result.push([p1x, p1y, p1z]);\n }\n }\n\n return result;\n}\n","// @forgeax/engine-debug-draw -- DebugDraw class implementation (feat-20260615-debug-draw M2)\n//\n// This file is the single SSOT for DebugDraw class, GPU resource lifecycle,\n// flush, and destroy semantics.\n//\n// Decision anchors:\n// - plan-strategy D-2: depthMode single-instance single-PSO\n// - plan-strategy D-3: inline WGSL, direct RHI (no ShaderRegistry)\n// - plan-strategy D-4: queue.writeBuffer overwrite + double-resize + hard-cap truncate\n// - plan-strategy D-9: vertex stride 16 B (12 B position + 4 B color)\n// - plan-strategy D-11: destroy-after-shape = no-op + single warn\n\nimport type { ColorLike, Mat4, Vec3 } from '@forgeax/engine-math';\nimport type {\n BindGroup,\n Buffer,\n RenderPipeline,\n RhiCommandEncoder,\n RhiDevice,\n RhiRenderPassEncoder,\n TextureView,\n} from '@forgeax/engine-rhi';\nimport type { Result } from '@forgeax/engine-types';\nimport { ok } from '@forgeax/engine-types';\nimport { INITIAL_VERTEX_CAPACITY, MAX_VERTEX_CAPACITY, VERTEX_STRIDE_BYTES } from './constants';\nimport type { DebugDrawError } from './errors';\nimport {\n bufferAllocationFailed,\n flushedAfterDestroy,\n pipelineCreateFailed,\n viewProjRequired,\n} from './errors';\nimport { aabbVertices } from './shapes/aabb';\nimport { arrowVertices } from './shapes/arrow';\nimport { axesArrowSets } from './shapes/axes';\nimport { frustumVertices } from './shapes/frustum';\nimport { lineVertices } from './shapes/line';\nimport { sphereVertices } from './shapes/sphere';\nimport type { DebugDraw as DebugDrawInterface, DebugDrawOptions } from './types';\n\n// ==========================================================================\n// Inline WGSL (plan-strategy D-3: no ShaderRegistry dependency)\n// ==========================================================================\n\nconst VERTEX_SHADER = /* wgsl */ `\nstruct VertexInput {\n @location(0) position: vec3<f32>,\n @location(1) color: vec4<f32>,\n}\n\nstruct VertexOutput {\n @builtin(position) position: vec4<f32>,\n @location(0) color: vec4<f32>,\n}\n\nstruct Uniforms {\n viewProj: mat4x4<f32>,\n}\n\n@group(0) @binding(0) var<uniform> uniforms: Uniforms;\n\n@vertex\nfn vs_main(in: VertexInput) -> VertexOutput {\n var out: VertexOutput;\n out.position = uniforms.viewProj * vec4<f32>(in.position, 1.0);\n out.color = in.color;\n return out;\n}\n`;\n\nconst FRAGMENT_SHADER = /* wgsl */ `\nstruct FragmentInput {\n @location(0) color: vec4<f32>,\n}\n\n@fragment\nfn fs_main(in: FragmentInput) -> @location(0) vec4<f32> {\n return in.color;\n}\n`;\n\n// ==========================================================================\n// Internal helpers\n// ==========================================================================\n\n/** Access Vec3/Mat4/ColorLike array element, narrow via `as number`. */\nfunction at(a: { readonly [index: number]: number }, i: number): number {\n return a[i] as number;\n}\n\nfunction normalizeCapacity(value: number, fallback: number): number {\n const finiteValue = Number.isFinite(value) ? Math.floor(value) : fallback;\n return Math.max(1, finiteValue);\n}\n\n// ==========================================================================\n// DebugDraw (w12 / w13 / w14)\n// ==========================================================================\n\nexport class DebugDraw implements DebugDrawInterface {\n private stagingArr: Float32Array;\n private stagingLen = 0;\n\n private lastFlushedVertexCount = 0;\n\n private capVal: number;\n\n private gpuVbo: Buffer | null = null;\n\n private gpuPipeline: RenderPipeline | null = null;\n\n private gpuUniformBuffer: Buffer | null = null;\n\n private gpuBindGroup: BindGroup | null = null;\n\n private maxCapVal: number;\n\n private readonly rhiDevice: RhiDevice;\n\n private isDestroyed = false;\n\n // Whether the destroy-after-shape warning has been emitted (plan-strategy D-11).\n // private (no underscore, no @internal) — purely class-internal state, not part of\n // package-internal API surface. Biome R-internal-A forbids `_x` on private fields;\n // lint:internal R-internal-C requires `_x` for `@internal`. Drop both markers since\n // there is no package-internal use for this field — accessing it from outside the\n // class is meaningless.\n private destroyedWarnedOnce = false;\n\n // Hard-cap diagnostics are per frame: flush() clears this flag with staging.\n private truncationWarned = false;\n\n /**\n * Depth texture view for less-equal depth mode.\n * Set via {@link _setDepthView} before flush() when depthMode is 'less-equal'.\n * The runtime auto-attach path receives depth from the render-graph context;\n * low-path callers (test harnesses, smoke runners) set this explicitly.\n */\n private depthView: TextureView | null = null;\n\n constructor(\n device: RhiDevice,\n pipeline: RenderPipeline,\n vbo: Buffer,\n uniformBuffer: Buffer,\n bindGroup: BindGroup,\n initialCapacity: number,\n maxCapacity: number,\n ) {\n const boundedMaxCapacity = normalizeCapacity(maxCapacity, MAX_VERTEX_CAPACITY);\n const boundedInitialCapacity = Math.min(\n normalizeCapacity(initialCapacity, INITIAL_VERTEX_CAPACITY),\n boundedMaxCapacity,\n );\n this.rhiDevice = device;\n this.gpuPipeline = pipeline;\n this.gpuVbo = vbo;\n this.gpuUniformBuffer = uniformBuffer;\n this.gpuBindGroup = bindGroup;\n this.capVal = boundedInitialCapacity;\n this.maxCapVal = boundedMaxCapacity;\n this.stagingArr = new Float32Array(boundedInitialCapacity * (VERTEX_STRIDE_BYTES / 4));\n }\n\n /** @internal CPU staging vertex count (exposed for unit tests). */\n get _stagingVertexCount(): number {\n return this.stagingLen;\n }\n\n hasPendingWork(): boolean {\n return !this.isDestroyed && this.stagingLen > 0;\n }\n\n /** @internal Vertex count passed to the most recent non-empty draw call. */\n get _lastFlushVertexCount(): number {\n return this.lastFlushedVertexCount;\n }\n\n /** @internal Current GPU vertex buffer capacity in vertex count. */\n get _capacity(): number {\n return this.capVal;\n }\n\n /** @internal Whether destroy() has been called. */\n get _destroyed(): boolean {\n return this.isDestroyed;\n }\n\n /**\n * @internal Set the depth texture view for less-equal depth mode.\n * Required before flush() when depthMode is 'less-equal'.\n * Used by test harnesses and smoke runners that don't have a scene\n * depth buffer; the runtime auto-attach path receives depth from\n * the render-graph context.\n */\n _setDepthView(view: TextureView): void {\n this.depthView = view;\n }\n\n /** @internal Read position of vertex at `index` in CPU staging (for unit tests). */\n _getVertexPosition(index: number): [number, number, number] {\n const idx = index * 4;\n return [\n this.stagingArr[idx + 0] as number,\n this.stagingArr[idx + 1] as number,\n this.stagingArr[idx + 2] as number,\n ];\n }\n\n /** @internal Read color of vertex at `index` as packed u32 (for unit tests). */\n _getVertexPackedColor(index: number): number {\n const byteOff = index * VERTEX_STRIDE_BYTES + 12;\n const bytes = new Uint8Array(this.stagingArr.buffer, byteOff, 4);\n return (\n ((bytes[3] as number) << 24) |\n ((bytes[2] as number) << 16) |\n ((bytes[1] as number) << 8) |\n (bytes[0] as number)\n );\n }\n\n private postDestroyWarnOnce(): void {\n if (!this.destroyedWarnedOnce) {\n this.destroyedWarnedOnce = true;\n console.warn(\n '[DebugDraw] Shape call after destroy() is a no-op. ' +\n 'Create a new instance via createDebugDraw().',\n );\n }\n }\n\n private pushVertex(\n px: number,\n py: number,\n pz: number,\n rc: number,\n gc: number,\n bc: number,\n ac: number,\n ): void {\n if (this.isDestroyed) {\n this.postDestroyWarnOnce();\n return;\n }\n\n // Truncation: silently drop vertices above max cap (warned once in ensureCapacity)\n if (this.stagingLen >= this.maxCapVal) return;\n\n const idx = this.stagingLen * 4; // 4 f32s per vertex (stride=16B)\n this.stagingArr[idx + 0] = px;\n this.stagingArr[idx + 1] = py;\n this.stagingArr[idx + 2] = pz;\n\n // Write RGBA as u8 bytes via Uint8Array view (Float32Array would\n // corrupt u32 bit-patterns via f32 conversion; the GPU reads raw bytes).\n const u8r = Math.round(Math.max(0, Math.min(1, rc)) * 255);\n const u8g = Math.round(Math.max(0, Math.min(1, gc)) * 255);\n const u8bc = Math.round(Math.max(0, Math.min(1, bc)) * 255);\n const u8a = Math.round(Math.max(0, Math.min(1, ac)) * 255);\n const byteOff = this.stagingLen * VERTEX_STRIDE_BYTES + 12;\n const colorView = new Uint8Array(this.stagingArr.buffer, byteOff, 4);\n colorView[0] = u8r;\n colorView[1] = u8g;\n colorView[2] = u8bc;\n colorView[3] = u8a;\n\n this.stagingLen++;\n }\n\n private warnTruncationOnce(): void {\n if (this.truncationWarned) return;\n this.truncationWarned = true;\n console.warn(\n `[DebugDraw] Vertex count would exceed MAX_VERTEX_CAPACITY=${this.maxCapVal}; ` +\n 'vertices beyond the limit are discarded.',\n );\n }\n\n private ensureCapacity(needed: number): void {\n if (this.isDestroyed) return;\n if (needed <= this.capVal) return;\n\n // Warn for hard-cap truncation once for this frame, before any vertex drops.\n if (needed > this.maxCapVal) {\n this.warnTruncationOnce();\n }\n\n // Double up to max cap\n let newCap = this.capVal;\n while (newCap < needed && newCap < this.maxCapVal) {\n newCap = Math.min(newCap * 2, this.maxCapVal);\n }\n\n if (newCap > this.capVal) {\n // Bug B fix (feat-20260626 m6-4): the GPU vertex buffer must grow with the\n // CPU staging, or flush() binds a buffer too small for the staged vertex\n // count and the backend rejects the draw (\"Vertex range requires a larger\n // buffer than the bound buffer size\"). This was latent until the overlay\n // pass actually flushed -- before the glue merge the pass was a no-op stub,\n // so the GPU vbo was never bound past its initial size. Reallocate at the\n // new size + destroy the old; on alloc failure keep the old cap (the draw\n // stays bounded + correct, just truncated) rather than growing the staging\n // past the GPU buffer.\n const newVbo = this.rhiDevice.createBuffer({\n size: newCap * VERTEX_STRIDE_BYTES,\n usage: 8 | 32, // COPY_DST | VERTEX (mirrors createDebugDraw factory)\n label: 'debug-draw-vbo',\n });\n if (!newVbo.ok) {\n console.warn(\n `[DebugDraw] GPU vertex buffer grow to ${newCap} failed (${newVbo.error.code}); ` +\n `keeping ${this.capVal} -- excess vertices are truncated this frame.`,\n );\n return;\n }\n console.warn(`[DebugDraw] Resizing vertex buffer from ${this.capVal} to ${newCap} vertices.`);\n if (this.gpuVbo !== null) this.rhiDevice.destroyBuffer(this.gpuVbo);\n this.gpuVbo = newVbo.value;\n this.capVal = newCap;\n const newStaging = new Float32Array(newCap * (VERTEX_STRIDE_BYTES / 4));\n newStaging.set(this.stagingArr.subarray(0, this.stagingLen * 4));\n this.stagingArr = newStaging;\n }\n }\n\n private colorToRGBA(color: ColorLike): [number, number, number, number] {\n if (Array.isArray(color)) {\n return [at(color, 0), at(color, 1), at(color, 2), (color as number[])[3] ?? 1];\n }\n // Float32Array (branded Color or plain)\n return [at(color, 0), at(color, 1), at(color, 2), color[3] ?? 1];\n }\n\n // -- Public shape API --\n\n line(a: Vec3, b: Vec3, color: ColorLike): void {\n if (this.isDestroyed) {\n this.postDestroyWarnOnce();\n return;\n }\n const [r, g, bc, alpha] = this.colorToRGBA(color);\n this.ensureCapacity(this.stagingLen + 2);\n for (const [x, y, z] of lineVertices(a, b)) {\n this.pushVertex(x, y, z, r, g, bc, alpha);\n }\n }\n\n aabb(min: Vec3, max: Vec3, color: ColorLike): void {\n if (this.isDestroyed) {\n this.postDestroyWarnOnce();\n return;\n }\n const [r, g, bc, alpha] = this.colorToRGBA(color);\n const verts = aabbVertices(min, max);\n this.ensureCapacity(this.stagingLen + verts.length);\n for (const [x, y, z] of verts) {\n this.pushVertex(x, y, z, r, g, bc, alpha);\n }\n }\n\n sphere(center: Vec3, radius: number, color: ColorLike, segments = 16): void {\n if (this.isDestroyed) {\n this.postDestroyWarnOnce();\n return;\n }\n const [r, g, bc, alpha] = this.colorToRGBA(color);\n const verts = sphereVertices(center, radius, segments);\n this.ensureCapacity(this.stagingLen + verts.length);\n for (const [x, y, z] of verts) {\n this.pushVertex(x, y, z, r, g, bc, alpha);\n }\n }\n\n frustum(viewProj: Mat4, color: ColorLike): void {\n if (this.isDestroyed) {\n this.postDestroyWarnOnce();\n return;\n }\n const verts = frustumVertices(viewProj);\n if (verts === null) {\n console.warn(\n '[DebugDraw] frustum() received a near-singular viewProj matrix; skipping this frame.',\n );\n return;\n }\n const [r, g, bc, alpha] = this.colorToRGBA(color);\n this.ensureCapacity(this.stagingLen + verts.length);\n for (const [x, y, z] of verts) {\n this.pushVertex(x, y, z, r, g, bc, alpha);\n }\n }\n\n arrow(start: Vec3, end: Vec3, color: ColorLike, tipLength?: number): void {\n if (this.isDestroyed) {\n this.postDestroyWarnOnce();\n return;\n }\n const [r, g, bc, alpha] = this.colorToRGBA(color);\n const verts = arrowVertices(start, end, tipLength);\n this.ensureCapacity(this.stagingLen + verts.length);\n for (const [x, y, z] of verts) {\n this.pushVertex(x, y, z, r, g, bc, alpha);\n }\n }\n\n axes(worldMat: Mat4, length: number): void {\n if (this.isDestroyed) {\n this.postDestroyWarnOnce();\n return;\n }\n // Three arrows (X=red, Y=green, Z=blue) along the transform's local axes; each\n // carries its own color, so they cannot share the single-color push path.\n for (const { vertices, color } of axesArrowSets(worldMat, length)) {\n const [r, g, bc, alpha] = this.colorToRGBA(color as unknown as ColorLike);\n this.ensureCapacity(this.stagingLen + vertices.length);\n for (const [x, y, z] of vertices) {\n this.pushVertex(x, y, z, r, g, bc, alpha);\n }\n }\n }\n\n // -- flush (w13) --\n\n flush(\n encoder: RhiCommandEncoder,\n view: TextureView,\n viewProj: Mat4,\n ): Result<void, DebugDrawError> {\n if (this.isDestroyed) return flushedAfterDestroy();\n if (viewProj === undefined || viewProj === null) return viewProjRequired();\n if (this.stagingLen === 0) {\n this.lastFlushedVertexCount = 0;\n return ok(undefined as void);\n }\n\n // Begin render pass with loadOp='load' to preserve scene content.\n // forgeax TextureView is an opaque RHI handle; the underlying WebGPU\n // GPURenderPassDescriptor expects raw GPUTextureView.\n // When depthMode is 'less-equal', a depthStencilAttachment is required\n // matching the PSO's depth format. The caller must provide depthView\n // for less-equal mode; without it, the render pass will fail validation.\n // biome-ignore lint/suspicious/noExplicitAny: opaque RHI descriptor (color + optional depth)\n const passDesc: Record<string, any> = {\n colorAttachments: [\n {\n // biome-ignore lint/suspicious/noExplicitAny: opaque RHI handle\n view: view as any,\n loadOp: 'load',\n storeOp: 'store',\n },\n ],\n };\n if (this.depthView !== null) {\n passDesc.depthStencilAttachment = {\n // biome-ignore lint/suspicious/noExplicitAny: opaque depth view\n view: this.depthView as any,\n depthLoadOp: 'load',\n depthStoreOp: 'store',\n };\n }\n // biome-ignore lint/suspicious/noExplicitAny: opaque RHI descriptor\n const pass = encoder.beginRenderPass(passDesc as any);\n\n const encoded = this.encode(pass, viewProj);\n pass.end();\n return encoded;\n }\n\n encode(pass: RhiRenderPassEncoder, viewProj: Mat4): Result<void, DebugDrawError> {\n if (this.isDestroyed) return flushedAfterDestroy();\n if (viewProj === undefined || viewProj === null) return viewProjRequired();\n if (this.stagingLen === 0) {\n this.lastFlushedVertexCount = 0;\n return ok(undefined as void);\n }\n\n const vertexCount = Math.min(this.stagingLen, this.maxCapVal);\n const vbo = this.gpuVbo as Buffer;\n const pipeline = this.gpuPipeline as RenderPipeline;\n const uniformBuf = this.gpuUniformBuffer as Buffer;\n const bindGroup = this.gpuBindGroup as BindGroup;\n const byteCount = vertexCount * VERTEX_STRIDE_BYTES;\n this.rhiDevice.queue.writeBuffer(\n vbo,\n 0,\n new Uint8Array(this.stagingArr.buffer, 0, byteCount),\n 0,\n byteCount,\n );\n const uniformData = new Float32Array(16);\n for (let i = 0; i < 16; i++) uniformData[i] = viewProj[i] as number;\n this.rhiDevice.queue.writeBuffer(uniformBuf, 0, new Uint8Array(uniformData.buffer), 0, 64);\n\n pass.setPipeline(pipeline);\n pass.setBindGroup(0, bindGroup);\n pass.setVertexBuffer(0, vbo);\n pass.draw(vertexCount);\n this.lastFlushedVertexCount = vertexCount;\n\n // Reset staging for next frame\n this.stagingLen = 0;\n this.truncationWarned = false;\n\n return ok(undefined as void);\n }\n\n // -- destroy (w14) --\n\n destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n if (this.gpuVbo) {\n this.rhiDevice.destroyBuffer(this.gpuVbo);\n this.gpuVbo = null;\n }\n if (this.gpuUniformBuffer) {\n this.rhiDevice.destroyBuffer(this.gpuUniformBuffer);\n this.gpuUniformBuffer = null;\n }\n // BindGroup / Pipeline: WebGPU spec destroys them when the JS reference is lost;\n // we null them to drop GPU resource references.\n this.gpuBindGroup = null;\n this.gpuPipeline = null;\n this.stagingArr = new Float32Array(0);\n this.stagingLen = 0;\n this.lastFlushedVertexCount = 0;\n }\n}\n\n// ==========================================================================\n// createDebugDraw factory (w12)\n// ==========================================================================\n\nexport async function createDebugDraw(\n opts: DebugDrawOptions,\n): Promise<Result<DebugDraw, DebugDrawError>> {\n const device = opts.device;\n const fmt: string = opts.format ?? 'bgra8unorm';\n const depthFormat = opts.depthFormat;\n const depthMode = opts.depthMode ?? 'always';\n const maxCap = normalizeCapacity(\n opts.maxVertexCapacity ?? MAX_VERTEX_CAPACITY,\n MAX_VERTEX_CAPACITY,\n );\n const initialCap = Math.min(\n normalizeCapacity(\n opts.initialVertexCapacity ?? INITIAL_VERTEX_CAPACITY,\n INITIAL_VERTEX_CAPACITY,\n ),\n maxCap,\n );\n\n // Allocate GPU vertex buffer\n // GPUBufferUsage.COPY_DST=8, VERTEX=32\n const vboByteSize = initialCap * VERTEX_STRIDE_BYTES;\n const vboResult = device.createBuffer({\n size: vboByteSize,\n usage: 8 | 32, // COPY_DST | VERTEX\n label: 'debug-draw-vbo',\n });\n if (!vboResult.ok) {\n return bufferAllocationFailed(\n `createBuffer(COPY_DST|VERTEX, ${vboByteSize}B): ${vboResult.error.code}`,\n );\n }\n const vbo = vboResult.value;\n\n // Allocate uniform buffer for viewProj (mat4x4<f32> = 64 bytes)\n // GPUBufferUsage.UNIFORM=64 (0x0040), COPY_DST=8 (0x0008)\n const uniformBufResult = device.createBuffer({\n size: 64,\n usage: 64 | 8, // UNIFORM | COPY_DST\n label: 'debug-draw-uniform',\n });\n if (!uniformBufResult.ok) {\n device.destroyBuffer(vbo);\n return bufferAllocationFailed(\n `createBuffer(UNIFORM|COPY_DST, 64B): ${uniformBufResult.error.code}`,\n );\n }\n const uniformBuf = uniformBufResult.value;\n\n // Compile WGSL shader modules via injected factory\n const vsResult = await opts.createShaderModule(device, {\n label: 'debug-draw-vs',\n code: VERTEX_SHADER,\n });\n if (!vsResult.ok) {\n device.destroyBuffer(vbo);\n return pipelineCreateFailed(`createShaderModule(vertex): ${vsResult.error.code}`);\n }\n const vsModule = vsResult.value;\n\n const fsResult = await opts.createShaderModule(device, {\n label: 'debug-draw-fs',\n code: FRAGMENT_SHADER,\n });\n if (!fsResult.ok) {\n device.destroyBuffer(vbo);\n return pipelineCreateFailed(`createShaderModule(fragment): ${fsResult.error.code}`);\n }\n const fsModule = fsResult.value;\n\n const bglResult = device.createBindGroupLayout({\n label: 'debug-draw-bind-group-layout',\n entries: [\n {\n binding: 0,\n visibility: 1,\n buffer: { type: 'uniform', minBindingSize: 64 },\n },\n ],\n });\n if (!bglResult.ok) {\n device.destroyBuffer(vbo);\n device.destroyBuffer(uniformBuf);\n return pipelineCreateFailed(`createBindGroupLayout: ${bglResult.error.code}`);\n }\n\n const pipelineLayoutResult = device.createPipelineLayout({\n label: 'debug-draw-pipeline-layout',\n bindGroupLayouts: [bglResult.value],\n });\n if (!pipelineLayoutResult.ok) {\n device.destroyBuffer(vbo);\n device.destroyBuffer(uniformBuf);\n return pipelineCreateFailed(`createPipelineLayout: ${pipelineLayoutResult.error.code}`);\n }\n\n // Build render pipeline descriptor.\n // For 'always' mode: no depthStencil — the overlay draws on top regardless of depth.\n // For 'less-equal' mode: depthStencil included so the overlay respects scene depth.\n const depthStencil: GPUDepthStencilState | undefined =\n depthMode === 'less-equal'\n ? {\n format: (depthFormat ?? 'depth24plus') as GPUTextureFormat,\n depthWriteEnabled: false,\n depthCompare: 'less-equal',\n }\n : undefined;\n\n const vertexBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: VERTEX_STRIDE_BYTES,\n stepMode: 'vertex',\n attributes: [\n {\n format: 'float32x3' as GPUVertexFormat,\n offset: 0,\n shaderLocation: 0,\n },\n {\n format: 'unorm8x4' as GPUVertexFormat,\n offset: 12,\n shaderLocation: 1,\n },\n ],\n },\n ];\n\n const pipelineDesc = {\n label: 'debug-draw-pso',\n layout: pipelineLayoutResult.value,\n vertex: {\n module: vsModule,\n entryPoint: 'vs_main',\n buffers: [...vertexBuffers],\n },\n primitive: {\n topology: 'line-list' as GPUPrimitiveTopology,\n },\n depthStencil,\n fragment: {\n module: fsModule,\n entryPoint: 'fs_main',\n targets: [{ format: fmt as GPUTextureFormat }],\n },\n };\n\n /* biome-ignore lint/suspicious/noExplicitAny: forgeax ShaderModule / TextureFormat\n are opaque RHI handles; underlying WebGPU descriptor expects raw GPU types. */\n const psoResult = device.createRenderPipeline(pipelineDesc as any);\n if (!psoResult.ok) {\n device.destroyBuffer(vbo);\n device.destroyBuffer(uniformBuf);\n return pipelineCreateFailed(`createRenderPipeline: ${psoResult.error.code}`);\n }\n const pipeline = psoResult.value;\n\n // Create the bind group from the same explicit RHI layout used by the pipeline.\n const bgResult = device.createBindGroup({\n layout: bglResult.value,\n entries: [\n {\n binding: 0,\n resource: {\n kind: 'buffer' as const,\n value: { buffer: uniformBuf, offset: 0, size: 64 },\n },\n },\n ],\n label: 'debug-draw-bindgroup',\n // biome-ignore lint/suspicious/noExplicitAny: forgeax opaque BGL -> createBindGroup descriptor\n } as any);\n if (!bgResult.ok) {\n device.destroyBuffer(vbo);\n device.destroyBuffer(uniformBuf);\n return pipelineCreateFailed(`createBindGroup: ${bgResult.error.code}`);\n }\n\n return ok(new DebugDraw(device, pipeline, vbo, uniformBuf, bgResult.value, initialCap, maxCap));\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { Vec3 } from '@forgeax/engine-math';
2
+ /** 24 vertices forming a wireframe axis-aligned bounding box (12 edges). */
3
+ export declare function aabbVertices(min: Vec3, max: Vec3): [number, number, number][];
4
+ //# sourceMappingURL=aabb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aabb.d.ts","sourceRoot":"","sources":["../../src/shapes/aabb.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAMjD,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CA4C7E"}
@@ -0,0 +1,11 @@
1
+ import type { Vec3Like } from '@forgeax/engine-math';
2
+ /**
3
+ * Line-segment vertices for an arrow from `start` to `end`.
4
+ * Returns 10 vertices = 5 segments (1 body + 4 arrowhead), each a [x,y,z] pair
5
+ * consumed pairwise by the line-list renderer.
6
+ *
7
+ * `tipLength` defaults to `|end - start| / 10` (Bevy's default arrowhead length).
8
+ * A degenerate (zero-length) arrow emits only the body segment (no orientable head).
9
+ */
10
+ export declare function arrowVertices(start: Vec3Like, end: Vec3Like, tipLength?: number): [number, number, number][];
11
+ //# sourceMappingURL=arrow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow.d.ts","sourceRoot":"","sources":["../../src/shapes/arrow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAgBrD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,EACf,GAAG,EAAE,QAAQ,EACb,SAAS,CAAC,EAAE,MAAM,GACjB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAuC5B"}
@@ -0,0 +1,18 @@
1
+ import type { Mat4 } from '@forgeax/engine-math';
2
+ /** X=red, Y=green, Z=blue RGBA (Bevy's axes convention). */
3
+ export declare const AXES_COLORS: readonly [
4
+ readonly [number, number, number, number],
5
+ readonly [number, number, number, number],
6
+ readonly [number, number, number, number]
7
+ ];
8
+ /**
9
+ * The three axis arrows for a world transform, as `{ vertices, color }` per axis
10
+ * (X, Y, Z). The caller (DebugDraw.axes) pushes each with its color. `worldMat` is a
11
+ * 16-float column-major mat4; the arrows originate at its translation (col 3) and point
12
+ * `length` along its local X / Y / Z (columns 0 / 1 / 2, scale included, matching Bevy).
13
+ */
14
+ export declare function axesArrowSets(worldMat: Mat4, length: number): {
15
+ vertices: [number, number, number][];
16
+ color: readonly [number, number, number, number];
17
+ }[];
18
+ //# sourceMappingURL=axes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axes.d.ts","sourceRoot":"","sources":["../../src/shapes/axes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,sBAAsB,CAAC;AAG3D,4DAA4D;AAC5D,eAAO,MAAM,WAAW,EAAE,SAAS;IACjC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACzC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;IACzC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;CAK1C,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,IAAI,EACd,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAAE,CA2B9F"}
@@ -0,0 +1,7 @@
1
+ import { type Mat4 } from '@forgeax/engine-math';
2
+ /**
3
+ * Generate 24 vertices (12 edges) for a frustum wireframe from a view-projection matrix.
4
+ * Returns null if the matrix is near-singular (|det| < 1e-10).
5
+ */
6
+ export declare function frustumVertices(viewProj: Mat4): [number, number, number][] | null;
7
+ //# sourceMappingURL=frustum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frustum.d.ts","sourceRoot":"","sources":["../../src/shapes/frustum.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,IAAI,EAAQ,MAAM,sBAAsB,CAAC;AAMvD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,IAAI,CAoKjF"}
@@ -0,0 +1,4 @@
1
+ import type { Vec3 } from '@forgeax/engine-math';
2
+ /** 2 vertices forming a line segment from `a` to `b`. */
3
+ export declare function lineVertices(a: Vec3, b: Vec3): [number, number, number][];
4
+ //# sourceMappingURL=line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line.d.ts","sourceRoot":"","sources":["../../src/shapes/line.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAEjD,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAKzE"}
@@ -0,0 +1,7 @@
1
+ import type { Vec3 } from '@forgeax/engine-math';
2
+ /**
3
+ * Generate vertices for a wireframe sphere.
4
+ * Returns 3 * 2 * segments vertices (pairs forming line segments).
5
+ */
6
+ export declare function sphereVertices(center: Vec3, radius: number, segments: number): [number, number, number][];
7
+ //# sourceMappingURL=sphere.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sphere.d.ts","sourceRoot":"","sources":["../../src/shapes/sphere.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAMjD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAoD5B"}
@@ -0,0 +1,136 @@
1
+ import type { ColorLike, Mat4, Vec3 } from '@forgeax/engine-math';
2
+ import type { RhiCommandEncoder, RhiDevice, RhiError, RhiQueue, RhiRenderPassEncoder, ShaderModule, TextureFormat, TextureView } from '@forgeax/engine-rhi';
3
+ import type { Result } from '@forgeax/engine-types';
4
+ import type { DebugDrawError } from './errors';
5
+ /**
6
+ * Async shader-module factory matching `createShaderModule(device, desc)`.
7
+ * Injected so the debug-draw package stays dependency-free of rhi-webgpu.
8
+ */
9
+ export type CreateShaderModule = (device: RhiDevice, desc: {
10
+ readonly label?: string | undefined;
11
+ readonly code: string;
12
+ }) => Promise<Result<ShaderModule, RhiError>>;
13
+ /** Depth comparison mode for the single-PSO line-list overlay. */
14
+ export type DepthMode = 'always' | 'less-equal';
15
+ /** Configuration passed to {@link createDebugDraw}. */
16
+ export interface DebugDrawOptions {
17
+ /** RHI device for buffer + PSO creation. */
18
+ readonly device: RhiDevice;
19
+ /** RHI queue for `queue.writeBuffer` per-frame uploads. */
20
+ readonly queue: RhiQueue;
21
+ /**
22
+ * Async WGSL shader-module factory.
23
+ * Required; pass `createShaderModule` from `@forgeax/engine-rhi-webgpu`.
24
+ * This callback lives in options (not a package dependency) to keep the
25
+ * debug-draw package clean of concrete backend imports (plan-strategy D-1).
26
+ */
27
+ readonly createShaderModule: CreateShaderModule;
28
+ /**
29
+ * Swap-chain color target format.
30
+ * Defaults to `'bgra8unorm'` when omitted.
31
+ */
32
+ readonly format?: TextureFormat | undefined;
33
+ /**
34
+ * Depth-stencil attachment format.
35
+ * Required when `depthMode === 'less-equal'`.
36
+ */
37
+ readonly depthFormat?: TextureFormat | undefined;
38
+ /**
39
+ * Initial vertex buffer capacity in vertex count.
40
+ * Defaults to {@link INITIAL_VERTEX_CAPACITY} (1024).
41
+ */
42
+ readonly initialVertexCapacity?: number | undefined;
43
+ /**
44
+ * Hard upper bound on vertex count per flush.
45
+ * Defaults to {@link MAX_VERTEX_CAPACITY} (1_000_000). Excess vertices are
46
+ * discarded with one bounded warning per frame; a successful flush resets the
47
+ * diagnostic and staging for the next frame.
48
+ */
49
+ readonly maxVertexCapacity?: number | undefined;
50
+ /**
51
+ * Depth comparison mode for the overlay PSO.
52
+ * `'always'` draws on top of everything; `'less-equal'` respects scene depth.
53
+ * Defaults to `'always'`.
54
+ */
55
+ readonly depthMode?: DepthMode | undefined;
56
+ }
57
+ /**
58
+ * Immediate-mode debug-draw instance.
59
+ *
60
+ * Shape calls (line / sphere / aabb / frustum) append vertices to a CPU staging
61
+ * buffer. `flush(encoder, view, viewProj)` uploads staging to a GPU vertex buffer
62
+ * and issues a single `draw` call with line-list topology.
63
+ *
64
+ * After `destroy()`, shape calls are no-ops (with a single console.warn) and
65
+ * `flush()` returns `Result.err({ code: 'flushed-after-destroy' })`.
66
+ */
67
+ export interface DebugDraw {
68
+ /** Whether the current frame has staged vertices that need an overlay pass. */
69
+ hasPendingWork(): boolean;
70
+ /** Push a line segment from `a` to `b` with the given color. */
71
+ line(a: Vec3, b: Vec3, color: ColorLike): void;
72
+ /** Push a wireframe axis-aligned bounding box (12 edges = 24 vertices). */
73
+ aabb(min: Vec3, max: Vec3, color: ColorLike): void;
74
+ /**
75
+ * Push a wireframe sphere as 3 orthogonal great-circle rings.
76
+ * `segments` defaults to 16, producing 96 vertices (3 * 2 * 16).
77
+ */
78
+ sphere(center: Vec3, radius: number, color: ColorLike, segments?: number): void;
79
+ /**
80
+ * Push a wireframe frustum (12 edges = 24 vertices) derived from
81
+ * the given view-projection matrix.
82
+ */
83
+ frustum(viewProj: Mat4, color: ColorLike): void;
84
+ /**
85
+ * Push an arrow (body line + 4-line arrowhead = 10 vertices) from `start` to `end`.
86
+ * `tipLength` defaults to `|end - start| / 10` (Bevy's default). A zero-length arrow
87
+ * emits only the body segment. Maps Bevy `gizmos.arrow`.
88
+ */
89
+ arrow(start: Vec3, end: Vec3, color: ColorLike, tipLength?: number): void;
90
+ /**
91
+ * Push a transform's local coordinate frame as three colored arrows — X=red, Y=green,
92
+ * Z=blue — originating at the transform's translation and pointing `length` along its
93
+ * local X/Y/Z (the columns of the 16-float column-major `worldMat`, scale included).
94
+ * Maps Bevy `gizmos.axes(transform, length)`.
95
+ */
96
+ axes(worldMat: Mat4, length: number): void;
97
+ /**
98
+ * Upload CPU staging to GPU vertex buffer, issue a single draw call,
99
+ * and reset staging for the next frame.
100
+ *
101
+ * `viewProj` is required; omitting it returns
102
+ * `Result.err({ code: 'viewProj-required' })`.
103
+ */
104
+ flush(encoder: RhiCommandEncoder, view: TextureView, viewProj: Mat4): Result<void, DebugDrawError>;
105
+ /** Encode into a render pass whose attachments and lifetime are owned by the caller. */
106
+ encode(pass: RhiRenderPassEncoder, viewProj: Mat4): Result<void, DebugDrawError>;
107
+ /** Release GPU buffer + PSO. Subsequent shape calls are no-ops. */
108
+ destroy(): void;
109
+ }
110
+ /**
111
+ * Create an immediate-mode debug-draw instance.
112
+ *
113
+ * Async because GPU shader module compilation (createShaderModule)
114
+ * must be awaited. Returns Promise<Result<DebugDraw, DebugDrawError>>.
115
+ *
116
+ * @example Low-path usage
117
+ * ```ts
118
+ * const r = await createDebugDraw({ device, queue });
119
+ * if (!r.ok) { ... }
120
+ * const dd = r.value;
121
+ * dd.line(a, b, [1, 0, 0, 1]);
122
+ * dd.flush(encoder, swapChainView, cameraViewProj);
123
+ * ```
124
+ *
125
+ * @example With less-equal depth testing
126
+ * ```ts
127
+ * const dd = await createDebugDraw({
128
+ * device, queue,
129
+ * format: 'bgra8unorm',
130
+ * depthFormat: 'depth24plus',
131
+ * depthMode: 'less-equal',
132
+ * });
133
+ * ```
134
+ */
135
+ export type CreateDebugDraw = (opts: DebugDrawOptions) => Promise<Result<DebugDraw, DebugDrawError>>;
136
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@forgeax/engine-debug-draw",
3
+ "version": "0.1.2",
4
+ "private": false,
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "sideEffects": false,
8
+ "description": "Immediate-mode debug-draw convenience layer on top of RHI — line / sphere / aabb / frustum shape API with per-frame CPU staging and single-PSO line-list rendering.",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "main": "./dist/index.mjs",
17
+ "types": "./dist/index.d.ts",
18
+ "files": [
19
+ "dist",
20
+ "src",
21
+ "README.md",
22
+ "LICENSE"
23
+ ],
24
+ "dependencies": {
25
+ "@forgeax/engine-math": "0.1.2",
26
+ "@forgeax/engine-rhi": "0.1.2",
27
+ "@forgeax/engine-types": "0.1.2"
28
+ },
29
+ "devDependencies": {
30
+ "@webgpu/types": "^0.1.71"
31
+ },
32
+ "forgeax": {
33
+ "metrics": {
34
+ "bundle-size": {
35
+ "enabled": true,
36
+ "path": "dist/index.mjs",
37
+ "compression": "gzip"
38
+ },
39
+ "fps": {
40
+ "enabled": false,
41
+ "reason": "library package, no runtime canvas; fps reported by hello-debug-draw app"
42
+ },
43
+ "bench": {
44
+ "enabled": false,
45
+ "reason": "bench focus stays on @forgeax/engine-math; debug-draw correctness verified by unit tests"
46
+ },
47
+ "gate": {
48
+ "enabled": false,
49
+ "reason": "no package-level binary gate; smoke gate covered by hello-debug-draw app"
50
+ },
51
+ "spike-report": {
52
+ "enabled": false,
53
+ "reason": "not a spike package; spike artefacts archived in feat-20260615-debug-draw M4 baseline PNGs"
54
+ }
55
+ }
56
+ },
57
+ "scripts": {
58
+ "build": "tsup",
59
+ "test": "vitest run"
60
+ }
61
+ }
@@ -0,0 +1,89 @@
1
+ import { expectTypeOf } from 'vitest';
2
+ import type {
3
+ BufferAllocationFailedDetail,
4
+ DebugDrawError,
5
+ DebugDrawErrorCode,
6
+ DebugDrawErrorDetail,
7
+ FlushedAfterDestroyDetail,
8
+ PipelineCreateFailedDetail,
9
+ ViewProjRequiredDetail,
10
+ } from '../errors';
11
+
12
+ const pipelineCreateFailed: DebugDrawError = {
13
+ code: 'pipeline-create-failed',
14
+ expected: 'expected',
15
+ hint: 'hint',
16
+ detail: { code: 'pipeline-create-failed', rhiError: 'shader compile failed' },
17
+ };
18
+ const bufferAllocationFailed: DebugDrawError = {
19
+ code: 'buffer-allocation-failed',
20
+ expected: 'expected',
21
+ hint: 'hint',
22
+ detail: { code: 'buffer-allocation-failed', rhiError: 'out of memory' },
23
+ };
24
+ const flushedAfterDestroy: DebugDrawError = {
25
+ code: 'flushed-after-destroy',
26
+ expected: 'expected',
27
+ hint: 'hint',
28
+ detail: { code: 'flushed-after-destroy' },
29
+ };
30
+ const viewProjRequired: DebugDrawError = {
31
+ code: 'viewProj-required',
32
+ expected: 'expected',
33
+ hint: 'hint',
34
+ detail: { code: 'viewProj-required' },
35
+ };
36
+
37
+ // @ts-expect-error -- the detail code must stay correlated with the top-level code.
38
+ const mismatchedDetail: DebugDrawError = {
39
+ code: 'pipeline-create-failed',
40
+ expected: 'expected',
41
+ hint: 'hint',
42
+ detail: { code: 'buffer-allocation-failed', rhiError: 'wrong detail' },
43
+ };
44
+
45
+ void [
46
+ pipelineCreateFailed,
47
+ bufferAllocationFailed,
48
+ flushedAfterDestroy,
49
+ viewProjRequired,
50
+ mismatchedDetail,
51
+ ];
52
+
53
+ expectTypeOf<DebugDrawErrorCode>().toEqualTypeOf<
54
+ | 'pipeline-create-failed'
55
+ | 'buffer-allocation-failed'
56
+ | 'flushed-after-destroy'
57
+ | 'viewProj-required'
58
+ >();
59
+
60
+ expectTypeOf<DebugDrawErrorDetail>().toEqualTypeOf<
61
+ | PipelineCreateFailedDetail
62
+ | BufferAllocationFailedDetail
63
+ | FlushedAfterDestroyDetail
64
+ | ViewProjRequiredDetail
65
+ >();
66
+
67
+ function describeError(error: DebugDrawError): string {
68
+ switch (error.code) {
69
+ case 'pipeline-create-failed':
70
+ expectTypeOf(error.detail).toEqualTypeOf<PipelineCreateFailedDetail>();
71
+ expectTypeOf(error.detail.rhiError).toEqualTypeOf<string>();
72
+ return `pipeline:${error.detail.rhiError}`;
73
+ case 'buffer-allocation-failed':
74
+ expectTypeOf(error.detail).toEqualTypeOf<BufferAllocationFailedDetail>();
75
+ expectTypeOf(error.detail.rhiError).toEqualTypeOf<string>();
76
+ return `buffer:${error.detail.rhiError}`;
77
+ case 'flushed-after-destroy':
78
+ expectTypeOf(error.detail).toEqualTypeOf<FlushedAfterDestroyDetail>();
79
+ return error.detail.code;
80
+ case 'viewProj-required':
81
+ expectTypeOf(error.detail).toEqualTypeOf<ViewProjRequiredDetail>();
82
+ return error.detail.code;
83
+ }
84
+
85
+ const unreachable: never = error;
86
+ return unreachable;
87
+ }
88
+
89
+ expectTypeOf(describeError).returns.toEqualTypeOf<string>();
@@ -0,0 +1,13 @@
1
+ // @forgeax/engine-debug-draw -- constants SSOT (feat-20260615-debug-draw M1 / w3)
2
+ //
3
+ // Three configurable tunables exported for unit-test consumption.
4
+ // All values are per plan-strategy D-4 / D-7 / D-9.
5
+
6
+ /** Initial CPU staging vertex capacity before any resize. */
7
+ export const INITIAL_VERTEX_CAPACITY = 1024;
8
+
9
+ /** Hard upper bound on vertex count per flush; excess vertices are truncated with a warning. */
10
+ export const MAX_VERTEX_CAPACITY = 1_000_000;
11
+
12
+ /** Vertex stride in bytes: 12 B position (float32x3) + 4 B color (unorm8x4). */
13
+ export const VERTEX_STRIDE_BYTES = 16;