@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.
- package/LICENSE +202 -0
- package/README.md +256 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/__tests__/errors.test-d.d.ts +2 -0
- package/dist/__tests__/errors.test-d.d.ts.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/debug-draw.d.ts +65 -0
- package/dist/debug-draw.d.ts.map +1 -0
- package/dist/errors.d.ts +65 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +835 -0
- package/dist/index.mjs.map +1 -0
- package/dist/shapes/aabb.d.ts +4 -0
- package/dist/shapes/aabb.d.ts.map +1 -0
- package/dist/shapes/arrow.d.ts +11 -0
- package/dist/shapes/arrow.d.ts.map +1 -0
- package/dist/shapes/axes.d.ts +18 -0
- package/dist/shapes/axes.d.ts.map +1 -0
- package/dist/shapes/frustum.d.ts +7 -0
- package/dist/shapes/frustum.d.ts.map +1 -0
- package/dist/shapes/line.d.ts +4 -0
- package/dist/shapes/line.d.ts.map +1 -0
- package/dist/shapes/sphere.d.ts +7 -0
- package/dist/shapes/sphere.d.ts.map +1 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +61 -0
- package/src/__tests__/errors.test-d.ts +89 -0
- package/src/constants.ts +13 -0
- package/src/debug-draw.ts +713 -0
- package/src/errors.ts +142 -0
- package/src/index.ts +14 -0
- package/src/shapes/aabb.ts +57 -0
- package/src/shapes/arrow.ts +75 -0
- package/src/shapes/axes.ts +60 -0
- package/src/shapes/frustum.ts +182 -0
- package/src/shapes/line.ts +14 -0
- package/src/shapes/sphere.ts +74 -0
- package/src/types.ts +176 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
|
|
2
|
+
Apache License
|
|
3
|
+
Version 2.0, January 2004
|
|
4
|
+
http://www.apache.org/licenses/
|
|
5
|
+
|
|
6
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
7
|
+
|
|
8
|
+
1. Definitions.
|
|
9
|
+
|
|
10
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
11
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
12
|
+
|
|
13
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
14
|
+
the copyright owner that is granting the License.
|
|
15
|
+
|
|
16
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
17
|
+
other entities that control, are controlled by, or are under common
|
|
18
|
+
control with that entity. For the purposes of this definition,
|
|
19
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
20
|
+
direction or management of such entity, whether by contract or
|
|
21
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
22
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
23
|
+
|
|
24
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
25
|
+
exercising permissions granted by this License.
|
|
26
|
+
|
|
27
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
28
|
+
including but not limited to software source code, documentation
|
|
29
|
+
source, and configuration files.
|
|
30
|
+
|
|
31
|
+
"Object" form shall mean any form resulting from mechanical
|
|
32
|
+
transformation or translation of a Source form, including but
|
|
33
|
+
not limited to compiled object code, generated documentation,
|
|
34
|
+
and conversions to other media types.
|
|
35
|
+
|
|
36
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
37
|
+
Object form, made available under the License, as indicated by a
|
|
38
|
+
copyright notice that is included in or attached to the work
|
|
39
|
+
(an example is provided in the Appendix below).
|
|
40
|
+
|
|
41
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
42
|
+
form, that is based on (or derived from) the Work and for which the
|
|
43
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
44
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
45
|
+
of this License, Derivative Works shall not include works that remain
|
|
46
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
47
|
+
the Work and Derivative Works thereof.
|
|
48
|
+
|
|
49
|
+
"Contribution" shall mean any work of authorship, including
|
|
50
|
+
the original version of the Work and any modifications or additions
|
|
51
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
52
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
53
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
54
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
55
|
+
means any form of electronic, verbal, or written communication sent
|
|
56
|
+
to the Licensor or its representatives, including but not limited to
|
|
57
|
+
communication on electronic mailing lists, source code control systems,
|
|
58
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
59
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
60
|
+
excluding communication that is conspicuously marked or otherwise
|
|
61
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
62
|
+
|
|
63
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
64
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
65
|
+
subsequently incorporated within the Work.
|
|
66
|
+
|
|
67
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
68
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
69
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
70
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
71
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
72
|
+
Work and such Derivative Works in Source or Object form.
|
|
73
|
+
|
|
74
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
75
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
76
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
77
|
+
(except as stated in this section) patent license to make, have made,
|
|
78
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
79
|
+
where such license applies only to those patent claims licensable
|
|
80
|
+
by such Contributor that are necessarily infringed by their
|
|
81
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
82
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
83
|
+
institute patent litigation against any entity (including a
|
|
84
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
85
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
86
|
+
or contributory patent infringement, then any patent licenses
|
|
87
|
+
granted to You under this License for that Work shall terminate
|
|
88
|
+
as of the date such litigation is filed.
|
|
89
|
+
|
|
90
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
91
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
92
|
+
modifications, and in Source or Object form, provided that You
|
|
93
|
+
meet the following conditions:
|
|
94
|
+
|
|
95
|
+
(a) You must give any other recipients of the Work or
|
|
96
|
+
Derivative Works a copy of this License; and
|
|
97
|
+
|
|
98
|
+
(b) You must cause any modified files to carry prominent notices
|
|
99
|
+
stating that You changed the files; and
|
|
100
|
+
|
|
101
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
102
|
+
that You distribute, all copyright, patent, trademark, and
|
|
103
|
+
attribution notices from the Source form of the Work,
|
|
104
|
+
excluding those notices that do not pertain to any part of
|
|
105
|
+
the Derivative Works; and
|
|
106
|
+
|
|
107
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
108
|
+
distribution, then any Derivative Works that You distribute must
|
|
109
|
+
include a readable copy of the attribution notices contained
|
|
110
|
+
within such NOTICE file, excluding those notices that do not
|
|
111
|
+
pertain to any part of the Derivative Works, in at least one
|
|
112
|
+
of the following places: within a NOTICE text file distributed
|
|
113
|
+
as part of the Derivative Works; within the Source form or
|
|
114
|
+
documentation, if provided along with the Derivative Works; or,
|
|
115
|
+
within a display generated by the Derivative Works, if and
|
|
116
|
+
wherever such third-party notices normally appear. The contents
|
|
117
|
+
of the NOTICE file are for informational purposes only and
|
|
118
|
+
do not modify the License. You may add Your own attribution
|
|
119
|
+
notices within Derivative Works that You distribute, alongside
|
|
120
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
121
|
+
that such additional attribution notices cannot be construed
|
|
122
|
+
as modifying the License.
|
|
123
|
+
|
|
124
|
+
You may add Your own copyright statement to Your modifications and
|
|
125
|
+
may provide additional or different license terms and conditions
|
|
126
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
127
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
128
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
129
|
+
the conditions stated in this License.
|
|
130
|
+
|
|
131
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
132
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
133
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
134
|
+
this License, without any additional terms or conditions.
|
|
135
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
136
|
+
the terms of any separate license agreement you may have executed
|
|
137
|
+
with Licensor regarding such Contributions.
|
|
138
|
+
|
|
139
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
140
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
141
|
+
except as required for reasonable and customary use in describing the
|
|
142
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
143
|
+
|
|
144
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
145
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
146
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
147
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
148
|
+
implied, including, without limitation, any warranties or conditions
|
|
149
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
150
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
151
|
+
appropriateness of using or redistributing the Work and assume any
|
|
152
|
+
risks associated with Your exercise of permissions under this License.
|
|
153
|
+
|
|
154
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
155
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
156
|
+
unless required by applicable law (such as deliberate and grossly
|
|
157
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
158
|
+
liable to You for damages, including any direct, indirect, special,
|
|
159
|
+
incidental, or consequential damages of any character arising as a
|
|
160
|
+
result of this License or out of the use or inability to use the
|
|
161
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
162
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
163
|
+
other commercial damages or losses), even if such Contributor
|
|
164
|
+
has been advised of the possibility of such damages.
|
|
165
|
+
|
|
166
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
167
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
168
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
169
|
+
or other liability obligations and/or rights consistent with this
|
|
170
|
+
License. However, in accepting such obligations, You may act only
|
|
171
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
172
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
173
|
+
defend, and hold each Contributor harmless for any liability
|
|
174
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
175
|
+
of your accepting any such warranty or additional liability.
|
|
176
|
+
|
|
177
|
+
END OF TERMS AND CONDITIONS
|
|
178
|
+
|
|
179
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
180
|
+
|
|
181
|
+
To apply the Apache License to your work, attach the following
|
|
182
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
183
|
+
replaced with your own identifying information. (Don't include
|
|
184
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
185
|
+
comment syntax for the file format. We also recommend that a
|
|
186
|
+
file or class name and description of purpose be included on the
|
|
187
|
+
same "printed page" as the copyright notice for easier
|
|
188
|
+
identification within third-party archives.
|
|
189
|
+
|
|
190
|
+
Copyright [yyyy] [name of copyright owner]
|
|
191
|
+
|
|
192
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
193
|
+
you may not use this file except in compliance with the License.
|
|
194
|
+
You may obtain a copy of the License at
|
|
195
|
+
|
|
196
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
197
|
+
|
|
198
|
+
Unless required by applicable law or agreed to in writing, software
|
|
199
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
200
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
201
|
+
See the License for the specific language governing permissions and
|
|
202
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
# @forgeax/engine-debug-draw
|
|
2
|
+
|
|
3
|
+
> Immediate-mode debug visualization layer: one-line `line()` / `sphere()` / `aabb()` / `frustum()` / `arrow()` / `axes()` per frame, auto GPU flush. Wireframe overlay rendered on top of your scene -- no ECS, no component registration, no shader manifest.
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@forgeax/engine-debug-draw)
|
|
6
|
+
[](https://nodejs.org/api/esm.html)
|
|
7
|
+
[]()
|
|
8
|
+
|
|
9
|
+
## 60-second quickstart
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { createDebugDraw } from '@forgeax/engine-debug-draw';
|
|
13
|
+
import { createShaderModule } from '@forgeax/engine-rhi-webgpu';
|
|
14
|
+
import { createApp } from '@forgeax/engine-app';
|
|
15
|
+
|
|
16
|
+
// ---- runtime path (zero-config auto-flush) ----
|
|
17
|
+
const app = await createApp({ canvas });
|
|
18
|
+
app.debugDraw.line([0, 0, 0], [1, 1, 1], [1, 0, 0, 1]); // red line
|
|
19
|
+
app.debugDraw.sphere([0, 0, 0], 1, [0, 1, 0, 1]); // green sphere
|
|
20
|
+
// app.debugDraw is auto-flushed at the end of every frame -- no manual flush needed
|
|
21
|
+
|
|
22
|
+
// ---- low path (hand-rolled RHI) ----
|
|
23
|
+
const r = await createDebugDraw({ device, queue, createShaderModule });
|
|
24
|
+
if (!r.ok) { /* handle r.error */ }
|
|
25
|
+
const dd = r.value;
|
|
26
|
+
dd.line([0, 0, 0], [1, 1, 1], [1, 0, 0, 1]);
|
|
27
|
+
dd.aabb([-1, -1, -1], [1, 1, 1], [0, 0, 1, 1]);
|
|
28
|
+
dd.frustum(cameraViewProj, [1, 1, 0, 1]);
|
|
29
|
+
dd.flush(encoder, swapChainView, cameraViewProj);
|
|
30
|
+
// dd.destroy(); // when done
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
All shapes are **line-list** wireframe (never filled). No persistent storage -- every frame you call shape APIs anew.
|
|
34
|
+
|
|
35
|
+
## Package positioning
|
|
36
|
+
|
|
37
|
+
`@forgeax/engine-debug-draw` sits at the **leaf-nodear-leaf layer**, alongside `@forgeax/engine-math`. Dependencies: `@forgeax/engine-rhi` + `@forgeax/engine-math` + `@forgeax/engine-types` only. It does **not** depend on `engine-ecs` / `engine-runtime` / `engine-render-graph` / `engine-shader`.
|
|
38
|
+
|
|
39
|
+
| Layer | Package | Depends on |
|
|
40
|
+
|:--|:--|:--|
|
|
41
|
+
| App | `engine-runtime` | debug-draw (thin wiring glue in `debug-draw-glue.ts`) |
|
|
42
|
+
| Convenience | **`engine-debug-draw`** | rhi + math + types |
|
|
43
|
+
| Leaf | `engine-math` | (none) |
|
|
44
|
+
| Leaf | `engine-rhi` | (none) |
|
|
45
|
+
| Leaf | `engine-types` | (none) |
|
|
46
|
+
|
|
47
|
+
Runtime auto-attach wiring lives in `packages/runtime/src/debug-draw-glue.ts` -- the debug-draw package itself stays dependency-free of the runtime graph/pipeline machinery.
|
|
48
|
+
|
|
49
|
+
## API reference
|
|
50
|
+
|
|
51
|
+
### `createDebugDraw(opts)` -- factory
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
export type CreateDebugDraw = (
|
|
55
|
+
opts: DebugDrawOptions,
|
|
56
|
+
) => Promise<Result<DebugDraw, DebugDrawError>>;
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
| Option | Type | Default | Purpose |
|
|
60
|
+
|:--|:--|:--|:--|
|
|
61
|
+
| `device` | `RhiDevice` | **required** | GPU device for buffer + pipeline creation |
|
|
62
|
+
| `queue` | `RhiQueue` | **required** | GPU queue for per-frame `writeBuffer` uploads |
|
|
63
|
+
| `createShaderModule` | `(device, desc) => Promise<Result<ShaderModule, RhiError>>` | **required** | Injected WGSL compiler (import from `@forgeax/engine-rhi-webgpu`) |
|
|
64
|
+
| `format` | `TextureFormat` | `'bgra8unorm'` | Swap-chain color target format |
|
|
65
|
+
| `depthFormat` | `TextureFormat` | `undefined` | Depth-stencil format; required when `depthMode === 'less-equal'` |
|
|
66
|
+
| `initialVertexCapacity` | `number` | `1024` | Initial GPU vertex buffer capacity (overridable; see [Capacity behavior](#capacity-behavior)) |
|
|
67
|
+
| `maxVertexCapacity` | `number` | `1_000_000` | Hard upper bound on vertices per flush (see [Capacity behavior](#capacity-behavior)) |
|
|
68
|
+
| `depthMode` | `'always' \| 'less-equal'` | `'always'` | Depth comparison for the overlay PSO (see [Depth mode](#depth-mode)) |
|
|
69
|
+
|
|
70
|
+
Returns `Promise<Result<DebugDraw, DebugDrawError>>` -- the factory is async because GPU shader module compilation must be awaited.
|
|
71
|
+
|
|
72
|
+
### `DebugDraw` -- instance
|
|
73
|
+
|
|
74
|
+
#### Shape API (all return `void`)
|
|
75
|
+
|
|
76
|
+
All vertex accumulation is immediate (no deferred queue, no ECS component). Color parameter accepts `ColorLike` -- a plain `[r, g, b, a?]` tuple, a `Float32Array`, or a branded `Color` from `@forgeax/engine-math`.
|
|
77
|
+
|
|
78
|
+
| Method | Vertices pushed | Notes |
|
|
79
|
+
|:--|:--|:--|
|
|
80
|
+
| `dd.line(a, b, color)` | 2 | Single line segment from `a` to `b` |
|
|
81
|
+
| `dd.sphere(center, radius, color, segments?)` | $3 \times 2 \times \text{segments}$ | Three orthogonal great-circle rings (XY / XZ / YZ planes); `segments` defaults to 16, yielding **96 vertices** |
|
|
82
|
+
| `dd.aabb(min, max, color)` | 24 | 12 edges (4 along each axis) |
|
|
83
|
+
| `dd.frustum(viewProj, color)` | 24 | Extracts 8 corner points from the view-projection matrix, draws 12 edges; near-singular VP triggers `console.warn` + no-op (no vertices pushed) |
|
|
84
|
+
| `dd.arrow(start, end, color, tipLength?)` | 10 | Body segment + 4-line arrowhead at `end`, oriented along the arrow direction (`quat.fromUnitVectors`). `tipLength` defaults to `\|end − start\| / 10`; a zero-length arrow emits only the 2-vertex body. Maps Bevy `gizmos.arrow` |
|
|
85
|
+
| `dd.axes(worldMat, length)` | 30 | A transform's local coordinate frame as three arrows — **X = red, Y = green, Z = blue** — originating at the world matrix's translation (col 3) and pointing `length` along its local X/Y/Z (columns 0/1/2, scale included). Maps Bevy `gizmos.axes` |
|
|
86
|
+
|
|
87
|
+
> [!IMPORTANT]
|
|
88
|
+
> All vertices are emitted as `line-list` topology. Wireframe spheres are not tessellated triangles -- they are three orthogonal circles made of line segments. This is a visual approximation, not a pixel-accurate sphere.
|
|
89
|
+
|
|
90
|
+
#### `dd.flush(encoder, view, viewProj)` -- GPU upload
|
|
91
|
+
|
|
92
|
+
```ts
|
|
93
|
+
flush(
|
|
94
|
+
encoder: RhiCommandEncoder,
|
|
95
|
+
view: TextureView,
|
|
96
|
+
viewProj: Mat4,
|
|
97
|
+
): Result<void, DebugDrawError>;
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
1. Writes CPU staging to GPU vertex buffer via `queue.writeBuffer` (no `mapAsync`, no staging buffer)
|
|
101
|
+
2. Uploads `viewProj` as uniform mat4x4 (64 bytes)
|
|
102
|
+
3. Calls `encoder.beginRenderPass({ colorAttachments: [{ view, loadOp: 'load' }] })` -- preserves existing scene content
|
|
103
|
+
4. Issues `draw(vertexCount)` with the pre-compiled line-list PSO
|
|
104
|
+
5. Resets CPU staging vertex count to 0 for the next frame
|
|
105
|
+
|
|
106
|
+
If staging is empty (no shape calls this frame), the flush returns `ok(undefined)` immediately and **skips the GPU pass entirely** -- no `beginRenderPass`, no draw calls, zero visual side effect.
|
|
107
|
+
|
|
108
|
+
`dd.encode(pass, viewProj)` is the graph-owned variant: it performs the same upload and draw but accepts an already-open `RhiRenderPassEncoder`. The caller owns attachments and `pass.end()`; runtime pipelines use this form so debug drawing cannot create a nested render-pass lifetime outside RenderGraph.
|
|
109
|
+
|
|
110
|
+
> [!NOTE]
|
|
111
|
+
> `viewProj` is required. Omitting it returns `Result.err({ code: 'viewProj-required', hint: 'Pass a viewProj Mat4 to flush(encoder, view, viewProj).' })`.
|
|
112
|
+
|
|
113
|
+
#### `dd.destroy()` -- lifecycle
|
|
114
|
+
|
|
115
|
+
Releases GPU vertex buffer, uniform buffer, pipeline, and bind group. After `destroy()`:
|
|
116
|
+
|
|
117
|
+
- Shape calls (`line` / `sphere` / `aabb` / `frustum`) become **no-ops** -- no vertices are pushed to staging
|
|
118
|
+
- A single `console.warn` is emitted on the first post-destroy shape call (de-duplicated across subsequent calls)
|
|
119
|
+
- `flush()` returns `Result.err({ code: 'flushed-after-destroy' })`
|
|
120
|
+
|
|
121
|
+
> **Runtime auto-attach path** (`app.debugDraw`): the runtime owns the lifecycle.
|
|
122
|
+
> Do **not** call `app.debugDraw.destroy()` yourself; `app.dispose()` releases it.
|
|
123
|
+
> The low path (`createDebugDraw(...)` directly) is the only path where you call
|
|
124
|
+
> `dd.destroy()` explicitly.
|
|
125
|
+
|
|
126
|
+
### Depth mode
|
|
127
|
+
|
|
128
|
+
| Mode | `depthWriteEnabled` | `depthCompare` | Visual effect |
|
|
129
|
+
|:--|:--|:--|:--|
|
|
130
|
+
| `'always'` (default) | `false` | `always` | Overlay always visible on top of scene geometry (editor-style gizmo) |
|
|
131
|
+
| `'less-equal'` | `false` | `'less-equal'` | Overlay respects scene depth -- lines behind opaque objects are occluded |
|
|
132
|
+
|
|
133
|
+
A single `DebugDraw` instance compiles exactly **one** PSO at construction time (determined by the `depthMode` option). To mix both modes in the same frame, create two separate instances:
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
const ddAlways = await createDebugDraw({ device, queue, createShaderModule, depthMode: 'always' });
|
|
137
|
+
const ddLEqual = await createDebugDraw({ device, queue, createShaderModule, depthMode: 'less-equal' });
|
|
138
|
+
// Draw with each, flush separately, combine to two PNGs
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
##### Depth attachment for `'less-equal'` (low path only)
|
|
142
|
+
|
|
143
|
+
`depthMode: 'less-equal'` requires a depth `TextureView` at flush time. The runtime
|
|
144
|
+
auto-attach path (`app.debugDraw`) receives this from the render-graph context
|
|
145
|
+
automatically; the **low path** (caller-driven `flush()`) must inject it via the
|
|
146
|
+
`@internal` `dd._setDepthView(view)` accessor before each frame's `flush()`. The
|
|
147
|
+
underscore + `@internal` JSDoc marks it as a package-internal escape hatch — it is
|
|
148
|
+
intended for `apps/hello/debug-draw/` and the runtime glue, not third-party callers.
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
// Low-path depth setup
|
|
152
|
+
const depthTex = device.createTexture({ ..., format: 'depth24plus', usage: RENDER_ATTACHMENT });
|
|
153
|
+
dd._setDepthView(depthTex.createView()); // before flush()
|
|
154
|
+
dd.flush(encoder, swapchainView, viewProj);
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Capacity behavior
|
|
158
|
+
|
|
159
|
+
The CPU staging buffer starts at `initialVertexCapacity` (default: **1024 vertices**, approx 16 KB at 16 B/vertex). When shape calls exceed this:
|
|
160
|
+
|
|
161
|
+
| Condition | Behavior |
|
|
162
|
+
|:--|:--|
|
|
163
|
+
| Staging count exceeds current capacity but under `maxVertexCapacity` | **Double-resize**: capacity grows to $2 \times n$ (capped at `maxVertexCapacity`); `console.warn` emitted with old and new capacities |
|
|
164
|
+
| Would exceed `maxVertexCapacity` (default: **1,000,000 vertices**, approx 16 MB) | **Truncation**: vertices up to the limit are flushed; excess is discarded; one bounded `console.warn` is emitted for that frame |
|
|
165
|
+
|
|
166
|
+
Resize warnings describe a resize event. A truncation warning is emitted at most once between
|
|
167
|
+
successful `flush()` calls; the warning state and CPU staging reset together after each successful
|
|
168
|
+
flush, so a small next frame is quiet and starts with no overflow geometry.
|
|
169
|
+
|
|
170
|
+
The `INITIAL_VERTEX_CAPACITY` / `MAX_VERTEX_CAPACITY` / `VERTEX_STRIDE_BYTES` constants are exported for unit-test consumption:
|
|
171
|
+
|
|
172
|
+
```ts
|
|
173
|
+
import { INITIAL_VERTEX_CAPACITY, MAX_VERTEX_CAPACITY, VERTEX_STRIDE_BYTES } from '@forgeax/engine-debug-draw';
|
|
174
|
+
// INITIAL_VERTEX_CAPACITY === 1024
|
|
175
|
+
// MAX_VERTEX_CAPACITY === 1_000_000
|
|
176
|
+
// VERTEX_STRIDE_BYTES === 16 (12 B position float32x3 + 4 B color unorm8x4)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Error codes
|
|
180
|
+
|
|
181
|
+
`DebugDrawErrorCode` is a **closed union**. Exhaustive `switch (err.code)` needs no default fallback. Each error carries `.code` / `.expected` / `.hint` / `.detail` (per [AGENTS.md](../AGENTS.md) Error model).
|
|
182
|
+
|
|
183
|
+
| `err.code` | When | `.hint` | `.detail` |
|
|
184
|
+
|:--|:--|:--|:--|
|
|
185
|
+
| `'pipeline-create-failed'` | `device.createRenderPipeline()` or shader compilation rejected | `Pipeline creation failed: ${rhiError}. Check WGSL syntax, vertex layout, and depth-stencil state.` | `{ code: 'pipeline-create-failed', rhiError: string }` |
|
|
186
|
+
| `'buffer-allocation-failed'` | `device.createBuffer()` for GPU VBO or uniform buffer failed | `Buffer allocation failed: ${rhiError}. Check available device memory and buffer usage flags.` | `{ code: 'buffer-allocation-failed', rhiError: string }` |
|
|
187
|
+
| `'flushed-after-destroy'` | `flush()` called on an already-destroyed instance | `DebugDraw was destroyed; create a new instance via createDebugDraw().` | `{ code: 'flushed-after-destroy' }` |
|
|
188
|
+
| `'viewProj-required'` | `flush()` called with `undefined` / `null` / missing `viewProj` | `Pass a viewProj Mat4 to flush(encoder, view, viewProj).` | `{ code: 'viewProj-required' }` |
|
|
189
|
+
|
|
190
|
+
`DebugDrawError` is a structured four-field object:
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
interface DebugDrawError {
|
|
194
|
+
readonly code: DebugDrawErrorCode;
|
|
195
|
+
readonly expected: string;
|
|
196
|
+
readonly hint: string;
|
|
197
|
+
readonly detail: DebugDrawErrorDetail;
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
The `.detail` field is a discriminated union narrowed by `.code` -- `switch (err.code)` gives TypeScript-narrowed access to the concrete detail shape without `as` casts.
|
|
202
|
+
|
|
203
|
+
## Distinction from `@forgeax/engine-rhi-debug`
|
|
204
|
+
|
|
205
|
+
These two packages share the word "debug" but address **orthogonal concerns**:
|
|
206
|
+
|
|
207
|
+
| | `@forgeax/engine-debug-draw` | `@forgeax/engine-rhi-debug` |
|
|
208
|
+
|:--|:--|:--|
|
|
209
|
+
| **Purpose** | Gameplay gizmo: visualize positions, colliders, camera frustums in real-time at runtime | GPU frame inspector: record every RHI call, replay deterministically, inspect draw-by-draw bindings and RT |
|
|
210
|
+
| **When active** | Always (opt-in per call site); tree-shaken when `app.debugDraw` is not imported | Only when `FORGEAX_ENGINE_RHI_DEBUG=1` is set in the environment |
|
|
211
|
+
| **User** | AI agent writing gameplay code / debugging physics / tuning camera | AI agent debugging GPU pipeline / shader miscompile / frame capture |
|
|
212
|
+
| **Output** | Wireframe lines drawn on the swap-chain (visible to the human eye) | Tape file (`.jsonl` + binary blob pool); RT PNGs written to disk |
|
|
213
|
+
| **Deps** | `rhi` + `math` + `types` | `rhi` + `types` + `rhi-webgpu` (proxy wrapping) |
|
|
214
|
+
| **ECS required** | No | No |
|
|
215
|
+
| **Render-graph** | No (package itself); runtime auto-attach lives in `engine-runtime` | No |
|
|
216
|
+
|
|
217
|
+
Think of `engine-debug-draw` as the **"`Debug.DrawLine`"** of forgeax, and `engine-rhi-debug` as the **"RenderDoc capture"** of forgeax. Both are essential debugging tools, but one draws on the screen and the other records what crossed the GPU API boundary.
|
|
218
|
+
|
|
219
|
+
## Design rationale
|
|
220
|
+
|
|
221
|
+
<details>
|
|
222
|
+
<summary>Why inline WGSL instead of ShaderRegistry?</summary>
|
|
223
|
+
|
|
224
|
+
Debug-draw shaders are a single, frozen vertex+fragment pair with a fixed vertex layout (`position: float32x3 + color: unorm8x4`). The `ShaderRegistry` / `MaterialShader` / naga_oil compose pipeline exists to handle variant explosion across PBR, custom BRDFs, and pipeline manifests -- none of which apply to a line-list debug overlay. Dependency on `engine-shader` would pull in the entire shader compilation infrastructure for a 20-line WGSL snippet. The custom WGSL lives inline in `debug-draw.ts` and compiles via direct `device.createShaderModule` + `device.createRenderPipeline` calls.
|
|
225
|
+
</details>
|
|
226
|
+
|
|
227
|
+
<details>
|
|
228
|
+
<summary>Why CPU staging + queue.writeBuffer instead of mapAsync?</summary>
|
|
229
|
+
|
|
230
|
+
`queue.writeBuffer` is a synchronous CPU-to-GPU copy that does not require a staging buffer or a fence. The debug-draw vertex count is small relative to scene geometry (typically hundreds of vertices, not millions), and the entire staging array fits in CPU memory trivially. `mapAsync` would add an async round-trip per frame, which is unnecessary overhead for an overlay that redraws from scratch every frame anyway.
|
|
231
|
+
</details>
|
|
232
|
+
|
|
233
|
+
<details>
|
|
234
|
+
<summary>Why no triangle-list fill?</summary>
|
|
235
|
+
|
|
236
|
+
v1 is exclusively line-list topology (OOS-1, OOS-10). All shapes decompose to line segments: `sphere` is 3 orthogonal great-circle rings, `aabb` is 12 edges, `frustum` is 12 edges. GPU line width is restricted to 1px on most platforms (OOS-5), so wireframe is inherently thin -- this is the expected visual for a debug overlay, not a rendering defect. Filled triangle-based spheres and boxes would require a second PSO and a different vertex layout, which is deferred to v2.
|
|
237
|
+
</details>
|
|
238
|
+
|
|
239
|
+
<details>
|
|
240
|
+
<summary>Why no depthBias parameter?</summary>
|
|
241
|
+
|
|
242
|
+
In `'always'` mode, depth is never tested -- bias is irrelevant. In `'less-equal'` mode, z-fighting between the line overlay and the underlying triangle mesh is possible but minor (line-list vs triangle-list are different topologies). A `depthBias` numeric parameter is deferred to a future feature (OOS-3). If you need it today, create two `DebugDraw` instances -- one for `always` (on-top annotations) and one for `less-equal` (depth-occluded lines).
|
|
243
|
+
</details>
|
|
244
|
+
|
|
245
|
+
## Edge cases
|
|
246
|
+
|
|
247
|
+
| Scenario | Behavior |
|
|
248
|
+
|:--|:--|
|
|
249
|
+
| Frame with zero shape calls | `flush()` returns `ok(undefined)` immediately; no `beginRenderPass`, no draw calls |
|
|
250
|
+
| `destroy()` then `line()` / `sphere()` / `aabb()` / `frustum()` | No-op (no vertices pushed); single `console.warn` on first post-destroy call |
|
|
251
|
+
| `destroy()` then `flush()` | `Result.err({ code: 'flushed-after-destroy' })` |
|
|
252
|
+
| `flush()` without `viewProj` | `Result.err({ code: 'viewProj-required' })` |
|
|
253
|
+
| Near-singular view-projection matrix on `frustum()` | `console.warn` + no-op for that frame (zero vertices pushed) |
|
|
254
|
+
| Exceeding `maxVertexCapacity` | Truncation warning; vertices up to the limit are flushed |
|
|
255
|
+
| Consecutive `flush()` calls with no shape in between | First flush resets staging to 0; second flush returns `ok(undefined)` immediately |
|
|
256
|
+
| Massive `segments` on `sphere()` (e.g., `segments=10000`) | Produces $3 \times 2 \times 10000 = 60000$ vertices; may trigger capacity resize but otherwise works correctly |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fileNames":["../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es5.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../node_modules/.pnpm/typescript@6.0.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../src/constants.ts","../../math/dist/types.d.ts","../../math/dist/circle2.d.ts","../../math/dist/box2.d.ts","../../math/dist/box3.d.ts","../../math/dist/color.d.ts","../../math/dist/easing.d.ts","../../math/dist/euler.d.ts","../../math/dist/f32-to-f16-bytes.d.ts","../../math/dist/frustum.d.ts","../../math/dist/mat3.d.ts","../../math/dist/mat4.d.ts","../../math/dist/noise.d.ts","../../math/dist/quat.d.ts","../../math/dist/ray.d.ts","../../math/dist/ray2.d.ts","../../math/dist/sphere.d.ts","../../math/dist/vec2.d.ts","../../math/dist/vec3.d.ts","../../math/dist/vec4.d.ts","../../math/dist/index.d.ts","../../types/dist/animation-target.d.ts","../../types/dist/asset-errors.d.ts","../../types/dist/result.d.ts","../../types/dist/asset-evidence.d.ts","../../types/dist/asset.d.ts","../../types/dist/asset-runtime.d.ts","../../types/dist/material/color-space.d.ts","../../types/dist/material/asset.d.ts","../../types/dist/vfx.d.ts","../../types/dist/handle.d.ts","../../types/dist/material/errors.d.ts","../../types/dist/material/resolve.d.ts","../../types/dist/material/index.d.ts","../../types/dist/asset-producer.d.ts","../../types/dist/catalog.d.ts","../../types/dist/runtime-scope.d.ts","../../types/dist/derive-paramschema.d.ts","../../types/dist/import.d.ts","../../types/dist/index.d.ts","../../rhi/dist/errors.d.ts","../../rhi/dist/queue-writes.d.ts","../../rhi/dist/index.d.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/types.ts","../src/debug-draw.ts","../src/index.ts","../../../node_modules/.pnpm/@vitest+pretty-format@4.1.5/node_modules/@vitest/pretty-format/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.5/node_modules/@vitest/utils/dist/display.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.5/node_modules/@vitest/utils/dist/types.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.5/node_modules/@vitest/utils/dist/helpers.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.5/node_modules/@vitest/utils/dist/timers.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.5/node_modules/@vitest/utils/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.5/node_modules/@vitest/utils/dist/types.d-BCElaP-c.d.ts","../../../node_modules/.pnpm/@vitest+utils@4.1.5/node_modules/@vitest/utils/dist/diff.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.5/node_modules/@vitest/runner/dist/tasks.d-Bh0IjN67.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.5/node_modules/@vitest/runner/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/traces.d.D2T_R8rx.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/types/hmrPayload.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/dist/node/chunks/moduleRunnerTransport.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/types/customEvent.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/types/hot.d.ts","../../../node_modules/.pnpm/vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7/node_modules/vite/dist/node/module-runner.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.5/node_modules/@vitest/snapshot/dist/environment.d-DOJxxZV9.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.5/node_modules/@vitest/snapshot/dist/rawSnapshot.d-D_X3-62x.d.ts","../../../node_modules/.pnpm/@vitest+snapshot@4.1.5/node_modules/@vitest/snapshot/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/config.d.A1h_Y6Jt.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/environment.d.CrsxCzP1.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/rpc.d.B_8sPU0w.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/worker.d.ZpHpO4yb.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/browser.d.BcoexmFG.d.ts","../../../node_modules/.pnpm/@vitest+spy@4.1.5/node_modules/@vitest/spy/optional-types.d.ts","../../../node_modules/.pnpm/@vitest+spy@4.1.5/node_modules/@vitest/spy/dist/index.d.ts","../../../node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.d.ts","../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../../../node_modules/.pnpm/@types+deep-eql@4.0.2/node_modules/@types/deep-eql/index.d.ts","../../../node_modules/.pnpm/assertion-error@2.0.1/node_modules/assertion-error/index.d.ts","../../../node_modules/.pnpm/@types+chai@5.2.3/node_modules/@types/chai/index.d.ts","../../../node_modules/.pnpm/@vitest+expect@4.1.5/node_modules/@vitest/expect/dist/index.d.ts","../../../node_modules/.pnpm/@vitest+runner@4.1.5/node_modules/@vitest/runner/dist/utils.d.ts","../../../node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/benchmark.d.DAaHLpsq.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/global.d.DVsSRdQ5.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/optional-runtime-types.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.5_vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7_/node_modules/@vitest/mocker/dist/types.d-BjI5eAwu.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.5_vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7_/node_modules/@vitest/mocker/dist/index.d-B41z0AuW.d.ts","../../../node_modules/.pnpm/@vitest+mocker@4.1.5_vite@8.0.10_@types+node@20.19.40_esbuild@0.27.7_jiti@1.21.7_/node_modules/@vitest/mocker/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/suite.d.udJtyAgw.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/chunks/evaluatedModules.d.BxJ5omdx.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/runners.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.d.ts","../../../node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.d.ts","../../../node_modules/.pnpm/vitest@4.1.5_@types+node@20.19.40_@vitest+browser-playwright@4.1.5_@vitest+coverage-v8@_93fb3f30d132ee2e785bbc9f718b2231/node_modules/vitest/dist/index.d.ts","../src/__tests__/errors.test-d.ts"],"fileIdsList":[[141,142],[114,120,138,139,140,143],[150],[150,151],[118,120,121],[118,120],[118],[113,118,129,130],[113,118,129],[137],[113,119],[113],[115],[113,114,115,116,117],[156,157],[156,157,158,159],[156,158],[156],[124],[124,125,126,127],[126],[122,145,146,148],[122,123,135,148],[113,120,122,123,131,148],[128],[113,122,123,131,144,147,148],[122,123,128,131,148],[122,145,146,147,148],[122,128,132,133,134,148],[113,118,120,122,123,128,131,132,133,134,135,136,138,144,145,146,147,148,149,152,153,154,155,160],[113,120,122,123,131,132,145,146,147,148,153],[103,161],[60,80,99,102,103,104,105,106,107,108,109,110],[99],[60,103,110,111],[80],[80,105],[80,99,102,103],[61,62],[61],[61,63],[61,64],[61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79],[61,62,63],[99,100,101],[82,83,85],[82,83,85,99],[84],[85,94],[82,94,95,96,99],[81,82,83,85,86,88,89,90,93,94,95,96,97,98],[86,87,99],[88],[87,88,91,92],[83,88,91],[94,95]],"fileInfos":[{"version":"bcd24271a113971ba9eb71ff8cb01bc6b0f872a85c23fdbe5d93065b375933cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f88bedbeb09c6f5a6645cb24c7c55f1aa22d19ae96c8e6959cbd8b85a707bc6","impliedFormat":1},{"version":"7fe93b39b810eadd916be8db880dd7f0f7012a5cc6ffb62de8f62a2117fa6f1f","impliedFormat":1},{"version":"bb0074cc08b84a2374af33d8bf044b80851ccc9e719a5e202eacf40db2c31600","impliedFormat":1},{"version":"1a7daebe4f45fb03d9ec53d60008fbf9ac45a697fdc89e4ce218bc94b94f94d6","impliedFormat":1},{"version":"f94b133a3cb14a288803be545ac2683e0d0ff6661bcd37e31aaaec54fc382aed","impliedFormat":1},{"version":"f59d0650799f8782fd74cf73c19223730c6d1b9198671b1c5b3a38e1188b5953","impliedFormat":1},{"version":"8a15b4607d9a499e2dbeed9ec0d3c0d7372c850b2d5f1fb259e8f6d41d468a84","impliedFormat":1},{"version":"26e0fe14baee4e127f4365d1ae0b276f400562e45e19e35fd2d4c296684715e6","impliedFormat":1},{"version":"d6b1eba8496bdd0eed6fc8a685768fe01b2da4a0388b5fe7df558290bffcf32f","affectsGlobalScope":true,"impliedFormat":1},{"version":"7f57fc4404ff020bc45b9c620aff2b40f700b95fe31164024c453a5e3c163c54","impliedFormat":1},{"version":"eadcffda2aa84802c73938e589b9e58248d74c59cb7fcbca6474e3435ac15504","affectsGlobalScope":true,"impliedFormat":1},{"version":"105ba8ff7ba746404fe1a2e189d1d3d2e0eb29a08c18dded791af02f29fb4711","affectsGlobalScope":true,"impliedFormat":1},{"version":"00343ca5b2e3d48fa5df1db6e32ea2a59afab09590274a6cccb1dbae82e60c7c","affectsGlobalScope":true,"impliedFormat":1},{"version":"ebd9f816d4002697cb2864bea1f0b70a103124e18a8cd9645eeccc09bdf80ab4","affectsGlobalScope":true,"impliedFormat":1},{"version":"2c1afac30a01772cd2a9a298a7ce7706b5892e447bb46bdbeef720f7b5da77ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"7b0225f483e4fa685625ebe43dd584bb7973bbd84e66a6ba7bbe175ee1048b4f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0a4b8ac6ce74679c1da2b3795296f5896e31c38e888469a8e0f99dc3305de60","affectsGlobalScope":true,"impliedFormat":1},{"version":"3084a7b5f569088e0146533a00830e206565de65cae2239509168b11434cd84f","affectsGlobalScope":true,"impliedFormat":1},{"version":"c5079c53f0f141a0698faa903e76cb41cd664e3efb01cc17a5c46ec2eb0bef42","affectsGlobalScope":true,"impliedFormat":1},{"version":"32cafbc484dea6b0ab62cf8473182bbcb23020d70845b406f80b7526f38ae862","affectsGlobalScope":true,"impliedFormat":1},{"version":"fca4cdcb6d6c5ef18a869003d02c9f0fd95df8cfaf6eb431cd3376bc034cad36","affectsGlobalScope":true,"impliedFormat":1},{"version":"b93ec88115de9a9dc1b602291b85baf825c85666bf25985cc5f698073892b467","affectsGlobalScope":true,"impliedFormat":1},{"version":"f5c06dcc3fe849fcb297c247865a161f995cc29de7aa823afdd75aaaddc1419b","affectsGlobalScope":true,"impliedFormat":1},{"version":"b77e16112127a4b169ef0b8c3a4d730edf459c5f25fe52d5e436a6919206c4d7","affectsGlobalScope":true,"impliedFormat":1},{"version":"fbffd9337146eff822c7c00acbb78b01ea7ea23987f6c961eba689349e744f8c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a995c0e49b721312f74fdfb89e4ba29bd9824c770bbb4021d74d2bf560e4c6bd","affectsGlobalScope":true,"impliedFormat":1},{"version":"c7b3542146734342e440a84b213384bfa188835537ddbda50d30766f0593aff9","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce6180fa19b1cccd07ee7f7dbb9a367ac19c0ed160573e4686425060b6df7f57","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f02e2476bccb9dbe21280d6090f0df17d2f66b74711489415a8aa4df73c9675","affectsGlobalScope":true,"impliedFormat":1},{"version":"45e3ab34c1c013c8ab2dc1ba4c80c780744b13b5676800ae2e3be27ae862c40c","affectsGlobalScope":true,"impliedFormat":1},{"version":"805c86f6cca8d7702a62a844856dbaa2a3fd2abef0536e65d48732441dde5b5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"e42e397f1a5a77994f0185fd1466520691456c772d06bf843e5084ceb879a0ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"f4c2b41f90c95b1c532ecc874bd3c111865793b23aebcc1c3cbbabcd5d76ffb0","affectsGlobalScope":true,"impliedFormat":1},{"version":"ab26191cfad5b66afa11b8bf935ef1cd88fabfcb28d30b2dfa6fad877d050332","affectsGlobalScope":true,"impliedFormat":1},{"version":"2088bc26531e38fb05eedac2951480db5309f6be3fa4a08d2221abb0f5b4200d","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb9d366c425fea79716a8fb3af0d78e6b22ebbab3bd64d25063b42dc9f531c1e","affectsGlobalScope":true,"impliedFormat":1},{"version":"500934a8089c26d57ebdb688fc9757389bb6207a3c8f0674d68efa900d2abb34","affectsGlobalScope":true,"impliedFormat":1},{"version":"689da16f46e647cef0d64b0def88910e818a5877ca5379ede156ca3afb780ac3","affectsGlobalScope":true,"impliedFormat":1},{"version":"bc21cc8b6fee4f4c2440d08035b7ea3c06b3511314c8bab6bef7a92de58a2593","affectsGlobalScope":true,"impliedFormat":1},{"version":"7ca53d13d2957003abb47922a71866ba7cb2068f8d154877c596d63c359fed25","affectsGlobalScope":true,"impliedFormat":1},{"version":"54725f8c4df3d900cb4dac84b64689ce29548da0b4e9b7c2de61d41c79293611","affectsGlobalScope":true,"impliedFormat":1},{"version":"e5594bc3076ac29e6c1ebda77939bc4c8833de72f654b6e376862c0473199323","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f3eb332c2d73e729f3364fcc0c2b375e72a121e8157d25a82d67a138c83a95c","affectsGlobalScope":true,"impliedFormat":1},{"version":"6f4427f9642ce8d500970e4e69d1397f64072ab73b97e476b4002a646ac743b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"48915f327cd1dea4d7bd358d9dc7732f58f9e1626a29cc0c05c8c692419d9bb7","affectsGlobalScope":true,"impliedFormat":1},{"version":"b7bf9377723203b5a6a4b920164df22d56a43f593269ba6ae1fdc97774b68855","affectsGlobalScope":true,"impliedFormat":1},{"version":"db9709688f82c9e5f65a119c64d835f906efe5f559d08b11642d56eb85b79357","affectsGlobalScope":true,"impliedFormat":1},{"version":"4b25b8c874acd1a4cf8444c3617e037d444d19080ac9f634b405583fd10ce1f7","affectsGlobalScope":true,"impliedFormat":1},{"version":"37be57d7c90cf1f8112ee2636a068d8fd181289f82b744160ec56a7dc158a9f5","affectsGlobalScope":true,"impliedFormat":1},{"version":"a917a49ac94cd26b754ab84e113369a75d1a47a710661d7cd25e961cc797065f","affectsGlobalScope":true,"impliedFormat":1},{"version":"6d3261badeb7843d157ef3e6f5d1427d0eeb0af0cf9df84a62cfd29fd47ac86e","affectsGlobalScope":true,"impliedFormat":1},{"version":"195daca651dde22f2167ac0d0a05e215308119a3100f5e6268e8317d05a92526","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b11e4285cd2bb164a4dc09248bdec69e9842517db4ca47c1ba913011e44ff2f","affectsGlobalScope":true,"impliedFormat":1},{"version":"0508571a52475e245b02bc50fa1394065a0a3d05277fbf5120c3784b85651799","affectsGlobalScope":true,"impliedFormat":1},{"version":"8f9af488f510c3015af3cc8c267a9e9d96c4dd38a1fdff0e11dc5a544711415b","affectsGlobalScope":true,"impliedFormat":1},{"version":"fc611fea8d30ea72c6bbfb599c9b4d393ce22e2f5bfef2172534781e7d138104","affectsGlobalScope":true,"impliedFormat":1},{"version":"1ce14b81c5cc821994aa8ec1d42b220dd41b27fcc06373bce3958af7421b77d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"b3a048b3e9302ef9a34ef4ebb9aecfb28b66abb3bce577206a79fee559c230da","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b0436f33af5ec1f590606bf9b95f7e8a517be0c811feb1b959f73f76ac94a4f","signature":"72df39a46542c36a902347763f9e89bde3a4652bfc612c5e1bb54e2e41286745"},"728cc7c21f319d38b1dafdbdf1258350b675055a3fb61ae1a7c34562c58b8557","d474818de812636654d86a3f0f6f3b8f6ae725b5487f344a5d3a32decd68311f","87cb945db71dbb2cceac65375b84cc0c55bfe70a749b11e55b59a40df53503f6","dcadfb7e3411bb19e717855d891658f3d71c065248d25f09e027e4a6cdfa0e9f","1c3f1fae8db7ce0bb537e509ceb0243892e68a3b6e66ab1245c15932be41d037","b3b63929f7475d02520bde84913450bf633e86f6a5d51fcc13e95376ec3483a6","11fbb66f203aa1855d34dbb3d835879a75924cae9f08eb16997318fed41f9078","56d65795b8f53c0f68d66369fc42fb8f79f669f868fc8eda2f634297c47b156f","a35dc82e5a7955568d2883e308e7a3e138961dd3b40956b22fccd415dd307e4a","a10051e664b2713d31f07db5fdd71d0854732e57429cbfa00ebb329e89a27981","3cb9e3f85ef9f989394133fe2e4ef4f39da5578fe583124fc0cbb00474b471e8","8bbc25b37d24570dffba7209cb9e427a63c7eeed18412af5e57c450a37d6c059","27d3d1f171d4b7b86bdf1c352f22319c0915b17cfd919deb070bef13510a33a2","40a12a4c54a6564f2c1547a10bcafc9210fce809dc57d2a7815c918972f48895","a8f81f646b1bd12b6b0758d1f97cc6d26646d5ac72d92362cb3b340271589e8f","05d6d9fbf9c8fbb9fa36b4e0ad91292e57f6a9233dc407875d0fb06cdfd59bda","d08b909fffadfa1dece31aa587aca1c34782cafd9294c5c8b66cbab2aa897719","a49e93ed1861aa2493d363f26ee826ab71c7105b20c85cf8bd26bbb4e0b32cd6","9aca2738b7400d1d8c2d009ec6cbbaf3204e6413219edc962cea5bb6ef50db10","f23fc64dfc9c3e5b718eca7f1fdb0640d5c1f5c8993a599e66ce73ab33502036","89fe170d9a59f81cd9a9d95de3278f108ff91491810b2529cc0ffb502a57b6c0","0b4928041c807c01b33b1fa028236df635c52f7acff5a40f2c2d0d677b53428b","5ad2e5b8b17893d0eb1f11a1b6e8c03b17344be03a6a72a624cd38ab05fe4d5c","6a1e553079e654a1771463e9eeb98ea4f7bb4b6417a5237d4fdf9b546d49647f","7f11be86b9ac5c2cd5127cd9d40ccc7694c58868a3157692a153d452fc171525","8b52dd8be86f44f871db89a6c1f77f7585688d53141ff55b6c5fac3eb67b1241","6e3488ee1183ea915eb43f08aebc5f75e30be25aef1f678d1965324bdd7506e1","59ca967d9cb92088499ce15a1c389e55a39bb2cb905844439565d9f7d8b1ed5d","a318d8734523d9e750681e7b8e685ef817d4049c5612451f4e849da8b2b572a9","99440a4820b8621d65822e29b01afd8a5938ea94ebea634fdd31d32d3e735629","080e7748d9754ccaea8debbc933552c7976c1ef588f9642a6f07e5a4d139d43b","51342c51a9090c0bc8bae60c5ec1a0f46d6d44db84392f12a8cd46e6d8a9f617","ae777307a0baeb9b5d7ba18e6a029a54eb0b612b1491591dcedb020cc8d36f97","464bedfb5186f124eacfc18488346e51dcf1318f5135e1cbb429f917065e5360","ba3e7709ee018a58cbde4f26ba611f89938725472766bcb325c1ed2ce41e9d6f","459b3765e622008ed590474ae6b61ab55107a7b9529a28d05087a6fef51d7248","ce15f7fa66eb0ff73351db6a626a397eb441aa3572707c2a156897c646b2911d","cc943379ee4a2e1023e8ad62c136d1367906e58e29559195e92cbcc1b296e803","bcf485b4f161e232c90d00f14ec27128227cf1cbdf60b93949b47a9365461a1d","8d6101c60d99ac57af23b947db35bedaa5580f2e7ae126c5b39841aa423cd242","cd253019e2f5488d5de2a1dbe4d1f5821b182135f66acc582d526f964ef6293f","5bb2ba05ee7656cd2c64c8bd9dd987d571dba2e7a18456a489e0b7253250cbfc",{"version":"ea42bbde3bb6846358facaaef862f2dbe631e660e89a04d049fbc6f9a92c3dad","signature":"574c4d5d4db678ee8d03ff57c27df25ccf6a09bfe3d2bd07bd99aef9efe9300e"},{"version":"639313a61a44c4a3fe702c9505e29717fe3275ad7f0796f8ca04aa1b69b50ec6","signature":"e798e4b85a8176af72ebf4de53373de730ad0ef610194cd12613d85ae6ef57cc"},{"version":"0d7ca2aaf26c6c55ef0cf2a25fe5992379d2695593b114eac6dfe77e2eb512d0","signature":"b94ef8d72ca3bdad91fc2622c40fbdf2a59a21e69c8863efec0db39b10d4672e"},{"version":"75ceed524a8eaedf05d2b9ea1caa8ed173393792d9ea4b138b7beb56cac3b060","signature":"5ac73528981a07e0f28476c1b1003874279d06a59e5c56a54946df8b4501c9ac"},{"version":"d44674572f1ac03d45c824270c5edac02b48549f773868d18419d91975af34b7","signature":"4346529327eca7088d5999fd384d33699e7428f869ba00190bc89dfd5372d241"},{"version":"6103c423e2e720d88143a86f582f3bc878fa1698d7a51d0e05dc4eb9aec270a1","signature":"b300e90901e77abe7b78d5c2dcdaf2e8ea8baad2c5ffa551d34b2b5792ba69fa"},{"version":"b6ed1fa5dc94d5ebb3de31d71a7ae0a3f5df976a7e30ba08b9b22e7e91fb569c","signature":"3f7818f5259bb7228e9b36c3bd030fe3b0160c286016615b041aa2a0c4d4d389"},{"version":"22f484785d906bd4e30f6eb922365004f520ec26574567f5c478653c65642162","signature":"9422da3a003cedd56094a660454ec3fcde83cb2f91a0d086e8468382599f72ee"},{"version":"1b46f76e64f2f35aa60f723ae2dfaa0a375334c0de3047f8bbb126b414ffb330","signature":"55caaaa4543006b80f6ae31176cbbe3606d9996b3097f2cee118ea8feb2c03c4"},{"version":"36e8750d50594c8f2362d73dc59772d940e6c08d2ccca862d7b64f0276b0c6bd","signature":"3dad512895718890f27b055f965245f5fde38adfb42e212c2f09c3201e3a8767"},{"version":"3a582c6e8906f5b094ccf0de6cc6f4f8a54b05a34f52517aba5c9c7f704f6b28","impliedFormat":99},{"version":"0528f6d21f7a02d4092895090d2dd86104bd5a3e79eced96d5a1a7dd90943d17","impliedFormat":99},{"version":"b5ce343886d23392be9c8280e9f24a87f1d7d3667f6672c2fe4aa61fa4ece7d4","impliedFormat":99},{"version":"72ce5b734c05da85c85a6f6dc05823b051d6aa41acaedeeb1d17c72f3b4efa72","impliedFormat":99},{"version":"b0857bb28fd5236ace84280f79a25093f919fd0eff13e47cc26ea03de60a7294","impliedFormat":99},{"version":"5e43e0824f10cd8c48e7a8c5c673638488925a12c31f0f9e0957965c290eb14c","impliedFormat":99},{"version":"ef13c73d6157a32933c612d476c1524dd674cf5b9a88571d7d6a0d147544d529","impliedFormat":99},{"version":"3b0a56d056d81a011e484b9c05d5e430711aaecd561a788bad1d0498aad782c7","impliedFormat":99},{"version":"9443967db823b66d1682be7fc66392be7c7924e10c3e54900f456341e94591a6","impliedFormat":99},{"version":"424f71d1fae96ac2e878af92345bb87bea1d29f757228fbc190133b305643f2c","impliedFormat":99},{"version":"61bb64660ee150f3ab618340e15cca0a81664801bede7c966ca0eca3a952fe63","impliedFormat":99},{"version":"3b89216a7e38a454985ad17bb2ff85792837dc812f2a89fa5f60ad0a2e216fa7","impliedFormat":99},{"version":"16fe60bb544cfedfd2b5bb2f7d0b3957be7978706d57d9f06edc9c0c8dbdba23","impliedFormat":99},{"version":"82179358c2d9d7347f1602dc9300039a2250e483137b38ebf31d4d2e5519c181","impliedFormat":99},{"version":"4e003c868b0d8f8ad200b96cbc653e18e513fa23e1c19c4fe3cc25d4394efc47","impliedFormat":99},{"version":"605450898939e8abce51e8085a41b60640278337a969c33cd6b169e7c4f9c3f2","impliedFormat":99},{"version":"42a12f2faa483c9b48195ed794d22698162274e755f6e07219c2351c4f08d732","impliedFormat":99},{"version":"ec0c42bb0f465e4993f2bc68a6ce9df9a2dcbc7b83e21748f82f1b69561938e3","impliedFormat":99},{"version":"f50ff37a9cbbe74475f426474d9827083c7c2c138a954d28f1690df338f69291","impliedFormat":99},{"version":"61fd6c17235d530c40f543dd7c40afab091d91c1ef890baeed30db6d82b04b28","impliedFormat":99},{"version":"bcbd3becd08b4515225880abea0dbfbbf0d1181ce3af8f18f72f61edbe4febfb","impliedFormat":99},{"version":"091767bc841f937654ed597d49e023ed59850355e746ae1a6f20ab31076ee1fb","impliedFormat":99},{"version":"19c6d6135af59693698d384050b45a8a049493500add442f58e4bd7c8a255ab6","impliedFormat":99},{"version":"6a0dba12d55314638a8c51108b20fe2f68f1364a619d098918bda91c22dec154","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"4ead13a482c539b77394b2a97e3b877b809eac596390371cea490286f53b996a","impliedFormat":99},{"version":"06db2f8ba1d1dfacf04529cb731081ab23f133f29c7608ebdfbcab356996827c","impliedFormat":99},{"version":"bdd14f07b4eca0b4b5203b85b8dbc4d084c749fa590bee5ea613e1641dcd3b29","impliedFormat":99},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"5c935b7fc4ddc1410ea1cd7cd4e35ed106a6e4920dd27a9480a40fd224359dc3","affectsGlobalScope":true,"impliedFormat":99},{"version":"ed9bb55ddcbebd5cb3eee991f57ff21438546ee40ee1c310281bd12a6c7cf65b","impliedFormat":99},{"version":"69bf2422313487956e4dacf049f30cb91b34968912058d244cb19e4baa24da97","impliedFormat":99},{"version":"6987dfb4b0c4e02112cc4e548e7a77b3d9ddfeffa8c8a2db13ceac361a4567d9","impliedFormat":99},{"version":"4ffba3c5848b4fe62ee59b754fd5f256ad9656a0db6d37b9a2a8cb40dfc7ac21","impliedFormat":99},{"version":"c76c02846ba7d40b9b3488f0e8d75d02cbdee2f0bc5fcd55dd3bd2e1457646ea","impliedFormat":99},{"version":"5e2ba3d18d78aebbde1f34bde356e41e9c76eeaeaeee56a37036596a9eff4211","impliedFormat":99},{"version":"8280ae8ccc0493b32d1742d585357ab9f0a508ea050af25a5a20d64010d0a5cf","impliedFormat":99},{"version":"7adfd9f9056ecd4ae6c65fde2a98654960c662714c73f048478959d04c09e144","impliedFormat":99},{"version":"32b35cf0dc3a1b1a7118b61c34ce2ad1a29695851679f9ec34e0776f2ece2a69","impliedFormat":99},{"version":"b413fbc6658fe2774f8bf9a15cf4c53e586fc38a2d5256b3b9647da242c14389","impliedFormat":99},{"version":"59e5e964b84fdb2378e9455e4e59405030e4ed2b4c6f891ce395f17796af3cbb","impliedFormat":99},{"version":"c30a41267fc04c6518b17e55dcb2b810f267af4314b0b6d7df1c33a76ce1b330","impliedFormat":1},{"version":"72422d0bac4076912385d0c10911b82e4694fc106e2d70added091f88f0824ba","impliedFormat":1},{"version":"da251b82c25bee1d93f9fd80c5a61d945da4f708ca21285541d7aff83ecb8200","impliedFormat":1},{"version":"64db14db2bf37ac089766fdb3c7e1160fabc10e9929bc2deeede7237e4419fc8","impliedFormat":1},{"version":"98b94085c9f78eba36d3d2314affe973e8994f99864b8708122750788825c771","impliedFormat":1},{"version":"90ba95a763101bb61b8a799731a2ed60b5016b8135c1a2d5186862d4b534d4a1","impliedFormat":99},{"version":"65959d0fae226419e710d132c492e9fc5c52af6e1e925b307ba476694896107c","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"}],"root":[60,[103,112],162],"options":{"composite":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":true,"exactOptionalPropertyTypes":true,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"noUncheckedIndexedAccess":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"strict":true,"target":9,"tsBuildInfoFile":"./.tsbuildinfo","useDefineForClassFields":true,"verbatimModuleSyntax":true},"referencedMap":[[143,1],[144,2],[151,3],[152,4],[122,5],[121,6],[145,5],[129,7],[131,8],[130,9],[138,10],[120,11],[114,12],[116,13],[118,14],[119,12],[158,15],[160,16],[159,17],[157,18],[125,19],[128,20],[126,19],[127,21],[147,22],[136,23],[132,24],[133,7],[154,25],[148,26],[134,27],[153,28],[135,29],[161,30],[155,31],[162,32],[111,33],[103,34],[112,35],[104,36],[105,36],[106,37],[107,36],[108,36],[109,36],[110,38],[63,39],[64,40],[62,41],[65,40],[67,40],[69,42],[80,43],[70,40],[71,40],[73,40],[74,42],[75,44],[76,42],[77,40],[78,40],[79,40],[100,34],[102,45],[84,46],[86,47],[85,48],[95,49],[97,34],[90,34],[98,50],[99,51],[88,52],[87,53],[93,54],[92,55],[96,56]],"latestChangedDtsFile":"./__tests__/errors.test-d.d.ts","version":"6.0.3"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test-d.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test-d.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Initial CPU staging vertex capacity before any resize. */
|
|
2
|
+
export declare const INITIAL_VERTEX_CAPACITY = 1024;
|
|
3
|
+
/** Hard upper bound on vertex count per flush; excess vertices are truncated with a warning. */
|
|
4
|
+
export declare const MAX_VERTEX_CAPACITY = 1000000;
|
|
5
|
+
/** Vertex stride in bytes: 12 B position (float32x3) + 4 B color (unorm8x4). */
|
|
6
|
+
export declare const VERTEX_STRIDE_BYTES = 16;
|
|
7
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAKA,6DAA6D;AAC7D,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,gGAAgG;AAChG,eAAO,MAAM,mBAAmB,UAAY,CAAC;AAE7C,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,KAAK,CAAC"}
|