@aethervtt/shard-render 0.0.1

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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/assets.d.ts +104 -0
  4. package/dist/assets.js +213 -0
  5. package/dist/atmosphere-model.d.ts +96 -0
  6. package/dist/atmosphere-model.js +370 -0
  7. package/dist/atmosphere-nodes.d.ts +55 -0
  8. package/dist/atmosphere-nodes.js +780 -0
  9. package/dist/atmosphere-plugin.d.ts +5 -0
  10. package/dist/atmosphere-plugin.js +42 -0
  11. package/dist/atmosphere-shaders.d.ts +7 -0
  12. package/dist/atmosphere-shaders.js +595 -0
  13. package/dist/atmosphere-state.d.ts +72 -0
  14. package/dist/atmosphere-state.js +18 -0
  15. package/dist/atmosphere.d.ts +191 -0
  16. package/dist/atmosphere.js +950 -0
  17. package/dist/camera.d.ts +83 -0
  18. package/dist/camera.js +163 -0
  19. package/dist/clusters.d.ts +68 -0
  20. package/dist/clusters.js +288 -0
  21. package/dist/culling-shaders.d.ts +2 -0
  22. package/dist/culling-shaders.js +203 -0
  23. package/dist/culling.d.ts +84 -0
  24. package/dist/culling.js +498 -0
  25. package/dist/debug-shaders.d.ts +3 -0
  26. package/dist/debug-shaders.js +207 -0
  27. package/dist/debug-views.d.ts +60 -0
  28. package/dist/debug-views.js +197 -0
  29. package/dist/deferred-plugin.d.ts +5 -0
  30. package/dist/deferred-plugin.js +20 -0
  31. package/dist/deferred-shaders.d.ts +2 -0
  32. package/dist/deferred-shaders.js +151 -0
  33. package/dist/deferred.d.ts +22 -0
  34. package/dist/deferred.js +296 -0
  35. package/dist/deform.d.ts +80 -0
  36. package/dist/deform.js +213 -0
  37. package/dist/describe-plugin.d.ts +5 -0
  38. package/dist/describe-plugin.js +19 -0
  39. package/dist/display-nodes.d.ts +5 -0
  40. package/dist/display-nodes.js +189 -0
  41. package/dist/dynamic-resolution.d.ts +47 -0
  42. package/dist/dynamic-resolution.js +191 -0
  43. package/dist/environment-plugin.d.ts +6 -0
  44. package/dist/environment-plugin.js +44 -0
  45. package/dist/environment-shaders.d.ts +2 -0
  46. package/dist/environment-shaders.js +260 -0
  47. package/dist/environment-state.d.ts +71 -0
  48. package/dist/environment-state.js +144 -0
  49. package/dist/environment.d.ts +70 -0
  50. package/dist/environment.js +529 -0
  51. package/dist/forward.d.ts +123 -0
  52. package/dist/forward.js +1216 -0
  53. package/dist/fxaa.d.ts +2 -0
  54. package/dist/fxaa.js +65 -0
  55. package/dist/gizmo-font.d.ts +21 -0
  56. package/dist/gizmo-font.js +132 -0
  57. package/dist/gizmos-plugin.d.ts +5 -0
  58. package/dist/gizmos-plugin.js +34 -0
  59. package/dist/gizmos.d.ts +156 -0
  60. package/dist/gizmos.js +772 -0
  61. package/dist/gpu-assets.d.ts +114 -0
  62. package/dist/gpu-assets.js +494 -0
  63. package/dist/graph.d.ts +204 -0
  64. package/dist/graph.js +417 -0
  65. package/dist/index.d.ts +53 -0
  66. package/dist/index.js +540 -0
  67. package/dist/instances.d.ts +349 -0
  68. package/dist/instances.js +1335 -0
  69. package/dist/large-world.d.ts +13 -0
  70. package/dist/large-world.js +20 -0
  71. package/dist/lights.d.ts +160 -0
  72. package/dist/lights.js +468 -0
  73. package/dist/material-noise.d.ts +19 -0
  74. package/dist/material-noise.js +7 -0
  75. package/dist/material-pipelines.d.ts +46 -0
  76. package/dist/material-pipelines.js +166 -0
  77. package/dist/materials.d.ts +108 -0
  78. package/dist/materials.js +219 -0
  79. package/dist/noise.d.ts +76 -0
  80. package/dist/noise.js +286 -0
  81. package/dist/overlay-registry.d.ts +18 -0
  82. package/dist/overlay-registry.js +30 -0
  83. package/dist/overlays.d.ts +35 -0
  84. package/dist/overlays.js +344 -0
  85. package/dist/paths.d.ts +20 -0
  86. package/dist/paths.js +46 -0
  87. package/dist/picking-plugin.d.ts +2 -0
  88. package/dist/picking-plugin.js +20 -0
  89. package/dist/picking.d.ts +94 -0
  90. package/dist/picking.js +456 -0
  91. package/dist/pixel-perfect-plugin.d.ts +9 -0
  92. package/dist/pixel-perfect-plugin.js +135 -0
  93. package/dist/pixel-perfect.d.ts +27 -0
  94. package/dist/pixel-perfect.js +70 -0
  95. package/dist/plugin.d.ts +111 -0
  96. package/dist/plugin.js +182 -0
  97. package/dist/pool.d.ts +19 -0
  98. package/dist/pool.js +43 -0
  99. package/dist/post-common.d.ts +51 -0
  100. package/dist/post-common.js +148 -0
  101. package/dist/post-nodes.d.ts +39 -0
  102. package/dist/post-nodes.js +849 -0
  103. package/dist/post-plugin.d.ts +5 -0
  104. package/dist/post-plugin.js +26 -0
  105. package/dist/post-shaders.d.ts +8 -0
  106. package/dist/post-shaders.js +698 -0
  107. package/dist/post.d.ts +175 -0
  108. package/dist/post.js +453 -0
  109. package/dist/readback.d.ts +4 -0
  110. package/dist/readback.js +95 -0
  111. package/dist/render-scale.d.ts +53 -0
  112. package/dist/render-scale.js +63 -0
  113. package/dist/shaders.d.ts +122 -0
  114. package/dist/shaders.js +1168 -0
  115. package/dist/shadows.d.ts +119 -0
  116. package/dist/shadows.js +562 -0
  117. package/dist/skin-asset.d.ts +26 -0
  118. package/dist/skin-asset.js +25 -0
  119. package/dist/skinning-plugin.d.ts +5 -0
  120. package/dist/skinning-plugin.js +16 -0
  121. package/dist/skinning.d.ts +19 -0
  122. package/dist/skinning.js +343 -0
  123. package/dist/standard-fields.d.ts +67 -0
  124. package/dist/standard-fields.js +73 -0
  125. package/dist/standard.d.ts +7 -0
  126. package/dist/standard.js +37 -0
  127. package/dist/stats.d.ts +25 -0
  128. package/dist/stats.js +18 -0
  129. package/dist/target.d.ts +55 -0
  130. package/dist/target.js +70 -0
  131. package/dist/testing.d.ts +34 -0
  132. package/dist/testing.js +126 -0
  133. package/dist/timer.d.ts +28 -0
  134. package/dist/timer.js +136 -0
  135. package/dist/view.d.ts +117 -0
  136. package/dist/view.js +389 -0
  137. package/dist/visibility.d.ts +10 -0
  138. package/dist/visibility.js +84 -0
  139. package/package.json +49 -0
package/dist/fxaa.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ /** FXAA for cameras with `Antialiasing { mode: 'fxaa' }`. */
2
+ export declare const fxaaPlugin: import("@aethervtt/shard-runtime").Plugin;
package/dist/fxaa.js ADDED
@@ -0,0 +1,65 @@
1
+ import { definePlugin } from "@aethervtt/shard-runtime";
2
+ import { RenderPhase } from "./graph.js";
3
+ import { Graph, Shaders } from "./plugin.js";
4
+ import { hasEffect, PostEffect, PostFeatures } from "./post.js";
5
+ import { idOf, PostCache, sampler, tex } from "./post-common.js";
6
+ import { FXAA_SHADERS } from "./post-shaders.js";
7
+ import { registerShaders } from "./shaders.js";
8
+ function fxaaNode() {
9
+ const cache = new PostCache();
10
+ let layout;
11
+ let layoutGen = -1;
12
+ return {
13
+ kind: "render",
14
+ phase: RenderPhase.Display,
15
+ enabled: hasEffect(PostEffect.Fxaa),
16
+ reads: ["ldr"],
17
+ writes: ["display"],
18
+ color: [{ resource: "display", clear: { r: 0, g: 0, b: 0, a: 1 } }],
19
+ run: (ctx) => {
20
+ const gpu = ctx.gpu;
21
+ if (!layout || layoutGen !== gpu.generation) {
22
+ layoutGen = gpu.generation;
23
+ layout = gpu.layouts.bindGroupLayout({ label: "fxaa", entries: [tex(0), sampler(1)] });
24
+ }
25
+ const input = ctx.texture("ldr");
26
+ const format = ctx.texture("display").format;
27
+ const pipeline = cache.render(
28
+ ctx,
29
+ `fxaa/${format}`,
30
+ "shard::post::fxaa",
31
+ "fs",
32
+ [layout],
33
+ [{ format }],
34
+ {
35
+ SRGB_TARGET: format.endsWith("-srgb")
36
+ }
37
+ );
38
+ if (!pipeline) return;
39
+ const group = cache.group(gpu, `${ctx.view.name}/fxaa`, `${idOf(input)}`, layout, () => [
40
+ { binding: 0, resource: input.createView() },
41
+ { binding: 1, resource: cache.sampler(gpu) }
42
+ ]);
43
+ const pass = ctx.renderPass;
44
+ pass.setPipeline(pipeline);
45
+ pass.setBindGroup(0, group);
46
+ pass.draw(3);
47
+ }
48
+ };
49
+ }
50
+ const fxaaPlugin = definePlugin({
51
+ name: "render/fxaa",
52
+ dependencies: ["render/forward"],
53
+ build(app) {
54
+ app.world.initResource(PostFeatures).effects |= PostEffect.Fxaa;
55
+ },
56
+ ready(app) {
57
+ registerShaders(app.world.resource(Shaders), FXAA_SHADERS);
58
+ const graph = app.world.resource(Graph);
59
+ graph.declare({ name: "fxaa-in", format: "view" });
60
+ graph.addNode("post/fxaa", fxaaNode());
61
+ }
62
+ });
63
+ export {
64
+ fxaaPlugin
65
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The label font for gizmos: printable ASCII from Inter Regular at 13 px (SIL Open Font License
3
+ * 1.1, © The Inter Project Authors), rasterized into a 192×96 atlas of 12×16 cells, 16 per row,
4
+ * 4 bits of coverage per texel. Built in so labels work in every project and headless, with no font
5
+ * asset to load.
6
+ */
7
+ export declare const LABEL_FONT: {
8
+ readonly width: 192;
9
+ readonly height: 96;
10
+ readonly cellWidth: 12;
11
+ readonly cellHeight: 16;
12
+ readonly columns: 16;
13
+ /** Pixels from the cell top to the baseline. */
14
+ readonly baseline: 12;
15
+ /** Advance in pixels of each character from ' ' (32) to '~' (126). */
16
+ readonly advances: readonly [3.5, 3.5, 6, 8, 8.5, 13, 8.5, 4, 4.5, 4.5, 6.5, 8.5, 3.5, 6, 3.5, 4.5, 8, 5.5, 8, 8, 8.5, 8, 8, 7.5, 8, 8, 3.5, 4, 8.5, 8.5, 8.5, 6.5, 12.5, 9, 8.5, 9.5, 9.5, 8, 7.5, 9.5, 9.5, 3.5, 7.5, 8.5, 7.5, 11.5, 10, 10, 8.5, 10, 8.5, 8.5, 8.5, 9.5, 9, 13, 9, 9, 8, 4.5, 4.5, 4.5, 6, 6, 4, 7.5, 8, 7.5, 8, 7.5, 5, 8, 7.5, 3, 3, 7, 3, 11.5, 7.5, 8, 8, 8, 5, 7, 4.5, 7.5, 7.5, 10.5, 7, 7.5, 7, 5.5, 4.5, 5.5, 8.5];
17
+ };
18
+ /** The atlas as one byte of coverage per texel (r8unorm), unpacked on first use. */
19
+ export declare function labelAtlas(): Uint8Array;
20
+ /** Width in pixels of a label's text ('?' stands in for characters outside ASCII). */
21
+ export declare function labelWidth(text: string): number;
@@ -0,0 +1,132 @@
1
+ const LABEL_FONT = {
2
+ width: 192,
3
+ height: 96,
4
+ cellWidth: 12,
5
+ cellHeight: 16,
6
+ columns: 16,
7
+ /** Pixels from the cell top to the baseline. */
8
+ baseline: 12,
9
+ /** Advance in pixels of each character from ' ' (32) to '~' (126). */
10
+ advances: [
11
+ 3.5,
12
+ 3.5,
13
+ 6,
14
+ 8,
15
+ 8.5,
16
+ 13,
17
+ 8.5,
18
+ 4,
19
+ 4.5,
20
+ 4.5,
21
+ 6.5,
22
+ 8.5,
23
+ 3.5,
24
+ 6,
25
+ 3.5,
26
+ 4.5,
27
+ 8,
28
+ 5.5,
29
+ 8,
30
+ 8,
31
+ 8.5,
32
+ 8,
33
+ 8,
34
+ 7.5,
35
+ 8,
36
+ 8,
37
+ 3.5,
38
+ 4,
39
+ 8.5,
40
+ 8.5,
41
+ 8.5,
42
+ 6.5,
43
+ 12.5,
44
+ 9,
45
+ 8.5,
46
+ 9.5,
47
+ 9.5,
48
+ 8,
49
+ 7.5,
50
+ 9.5,
51
+ 9.5,
52
+ 3.5,
53
+ 7.5,
54
+ 8.5,
55
+ 7.5,
56
+ 11.5,
57
+ 10,
58
+ 10,
59
+ 8.5,
60
+ 10,
61
+ 8.5,
62
+ 8.5,
63
+ 8.5,
64
+ 9.5,
65
+ 9,
66
+ 13,
67
+ 9,
68
+ 9,
69
+ 8,
70
+ 4.5,
71
+ 4.5,
72
+ 4.5,
73
+ 6,
74
+ 6,
75
+ 4,
76
+ 7.5,
77
+ 8,
78
+ 7.5,
79
+ 8,
80
+ 7.5,
81
+ 5,
82
+ 8,
83
+ 7.5,
84
+ 3,
85
+ 3,
86
+ 7,
87
+ 3,
88
+ 11.5,
89
+ 7.5,
90
+ 8,
91
+ 8,
92
+ 8,
93
+ 5,
94
+ 7,
95
+ 4.5,
96
+ 7.5,
97
+ 7.5,
98
+ 10.5,
99
+ 7,
100
+ 7.5,
101
+ 7,
102
+ 5.5,
103
+ 4.5,
104
+ 5.5,
105
+ 8.5
106
+ ]
107
+ };
108
+ const PACKED = "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AAAAAAAAAb7ZtAAAAPXu0wAAAD3vsQAAAD3ujwAAAD3uwwAAAIsAAAAAABnafwAAAPQAiwAAAPQAAAAAAPQAAAAAAPQByAAAAPQAAAAAAPQA9AC4APQAiwAAAD3vsQAAAAAAAAAAAAIgAAAAAAATAAAAAAAhAAAAAAAwAAAAAAAiAAAAAAAAAAAAABAATwAAAAAAAAAAAAAAAAAAAPQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMlEyQAAAAAAAAAAAAAAAAAAKOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABm7gQAAAAAAAAAAAAAAAAAAOTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbAAAAAEsAAAAABPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAAAAAEsAAAAAAB4gAAAAAAAAAAAAAAAAAAAAAAAUAAAAAABBAAAAAAAiAAAAAAFBAAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtAAAAAAEsAAAAAAAtAAAAAAAAAAAAAAAAAAAAAAPbt0wAAAD7ejwAAAPj4AAAAAG++YAAAC/+wAAAAAPQAiwAAB8AAiwAABsAH8gPxAeQC8wAAB8AAiwAAAP//9AAAAAtAAAAAAEsAAAAAAAtAAAAAAAAAAAAAAAAAAAAAAPoAfQAAAOcAvwAAAPkAAAAAAPMDoAAAALQAAAAAAPQAiwAAAfIA1gAAAfIK1gegAF0bgAAAAfIA1gAAAAAJsAAAAAxAAAAAAEsAAAAAAAtQAAAAAAAAAAAAAAAAAAAAAPQAD0AABOAAXwAAAPQAAAAAAOggAAAAALQAAAAAAPQAiwAAAJgD4AAAAMYPaQtgAArMAAAAAJgD4AAAAABtEAAAAMoQAAAAAEsAAAAAAATIAAAAAG7UBmAAAAAAAAAAAPQADEAABLAATwAAAPQAAAAAADr9YAAAALQAAAAAAPQAiwAAAF0IkAAAAHlLLg8gAAT2AAAAAF0JkAAAAAPjAAAAAI4gAAAAAEsAAAAAAAjGAAAAANZOjkAAAAAAAAAAAPUADzAABOAAXwAAAPQAAAAAAAAF8gAAALQAAAAAAPQAiwAAAA0+MAAAAC6HDHwAAByNEAAAAA0+MAAAAB1wAAAAAAtAAAAAAEsAAAAAAAtAAAAAAEAChAAAAAAAAAAAAPsQjQAAANcBzwAAAPQAAAAAAtED8gAAALYAAAAAANgC2wAAAAi8AAAAAA3TCNgAAIsJoAAAAAjMAAAAAKoAAAAAAAtAAAAAAEsAAAAAAAtAAAAAAAAAAAAAAAAAAAAAAPju0wAAAD3ujwAAAPQAAAAAAI/OcAAAAG/QAAAAAD79mwAAAAL3AAAAAAjQBPMABOIB5QAAAAL3AAAABP//+AAAAAtQAAAAAEsAAAAAAAtAAAAAAAAAAAAAAAAAAAAAAPQTAAAAAAAwTwAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALxAAAAAAAAAAAAAAijAAAAAEsAAAAAAV8QAAAAAAAAAAAAAAAAAAAAAPQAAAAAAAAATwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEqQAAAAAAAAAAAAAAGYAAAAAEsAAAAAA7UAAAAAAAAAAAAAAAAAAAAAALMAAAAAAAAAOwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALgQAAAAAAAAAAAAAAAAAAAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
109
+ let atlas;
110
+ function labelAtlas() {
111
+ if (atlas) return atlas;
112
+ const bytes = Uint8Array.from(atob(PACKED), (c) => c.charCodeAt(0));
113
+ atlas = new Uint8Array(bytes.length * 2);
114
+ for (let i = 0; i < bytes.length; i++) {
115
+ atlas[i * 2] = (bytes[i] >> 4) * 17;
116
+ atlas[i * 2 + 1] = (bytes[i] & 15) * 17;
117
+ }
118
+ return atlas;
119
+ }
120
+ function labelWidth(text) {
121
+ let w = 0;
122
+ for (let i = 0; i < text.length; i++) {
123
+ const c = text.charCodeAt(i);
124
+ w += LABEL_FONT.advances[c >= 32 && c < 127 ? c - 32 : 31];
125
+ }
126
+ return w;
127
+ }
128
+ export {
129
+ LABEL_FONT,
130
+ labelAtlas,
131
+ labelWidth
132
+ };
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Debug drawing (spec 0027): the Gizmos lines, shapes, and labels gameplay draws each frame, and the
3
+ * overlays (`debug.overlays`) that other packages register. Picking is pickingPlugin.
4
+ */
5
+ export declare const gizmosPlugin: import("@aethervtt/shard-runtime").Plugin;
@@ -0,0 +1,34 @@
1
+ import { First, Last } from "@aethervtt/shard-core";
2
+ import { definePlugin } from "@aethervtt/shard-runtime";
3
+ import { OriginShift } from "@aethervtt/shard-transform";
4
+ import { GIZMO_SHADERS } from "./debug-shaders.js";
5
+ import { upload } from "./forward.js";
6
+ import { beginGizmos, GizmoGpuResource, Gizmos, gizmoNode, uploadGizmos } from "./gizmos.js";
7
+ import { DebugOverlays, drawOverlays, gridsOverlay } from "./overlays.js";
8
+ import { Graph, RenderSet, Shaders } from "./plugin.js";
9
+ import { registerShaders } from "./shaders.js";
10
+ const gizmosPlugin = definePlugin({
11
+ name: "render/gizmos",
12
+ dependencies: ["render/forward"],
13
+ provides: [GizmoGpuResource, Gizmos, DebugOverlays, gridsOverlay],
14
+ build(app) {
15
+ const w = app.world;
16
+ w.initResource(Gizmos);
17
+ w.initResource(DebugOverlays);
18
+ w.observe(OriginShift, ({ world, data }) => {
19
+ world.tryResource(Gizmos)?.shiftOrigin(data.offset[0], data.offset[1], data.offset[2]);
20
+ });
21
+ app.addSystems(
22
+ Last,
23
+ drawOverlays.inSet(RenderSet.Upload).after(upload),
24
+ uploadGizmos.inSet(RenderSet.Upload).after(drawOverlays)
25
+ ).addSystems(First, beginGizmos);
26
+ },
27
+ ready(app) {
28
+ registerShaders(app.world.resource(Shaders), GIZMO_SHADERS);
29
+ app.world.resource(Graph).addNode("gizmos", gizmoNode(app.world));
30
+ }
31
+ });
32
+ export {
33
+ gizmosPlugin
34
+ };
@@ -0,0 +1,156 @@
1
+ import { type World } from '@aethervtt/shard-core';
2
+ import { GpuBuffer } from '@aethervtt/shard-gpu';
3
+ import { type NodeDescriptor } from './graph.js';
4
+ /**
5
+ * Immediate-mode debug drawing. Any system calls `world.resource(Gizmos).line(…)` and the line
6
+ * shows for this frame (or for `duration` seconds). Calls append to typed arrays: nothing is
7
+ * allocated per call once the arrays have grown to the frame's count.
8
+ */
9
+ export interface GizmoOptions {
10
+ /** Seconds to keep drawing it (0: this frame only). */
11
+ duration?: number;
12
+ /** Hide behind geometry (drawn dimmed where occluded). Default true for shapes, false for labels. */
13
+ depthTest?: boolean;
14
+ /** Line width in pixels. Default 1.5. */
15
+ width?: number;
16
+ }
17
+ /** Line records: a (3), b (3), color (rgba8), meta (bit 0: no depth test, bits 8+: width × 8). */
18
+ export declare const GIZMO_LINE_FLOATS = 8;
19
+ /** Linear RGBA (0–1) to rgba8. */
20
+ export declare function packGizmoColor(c: ArrayLike<number>): number;
21
+ /** Lines and labels of one lifetime (this frame, or timed). */
22
+ declare class GizmoList {
23
+ lines: Float32Array<ArrayBuffer>;
24
+ lineBits: Uint32Array<ArrayBuffer>;
25
+ lineCount: number;
26
+ /** Timed lists: when each line stops drawing (Time.elapsed). */
27
+ lineExpiry: Float64Array<ArrayBuffer>;
28
+ labelPos: Float32Array<ArrayBuffer>;
29
+ labelColor: Uint32Array<ArrayBuffer>;
30
+ labelMeta: Uint32Array<ArrayBuffer>;
31
+ labelText: string[];
32
+ labelExpiry: Float64Array<ArrayBuffer>;
33
+ labelCount: number;
34
+ /** Appends a line; returns its index. */
35
+ line(ax: number, ay: number, az: number, bx: number, by: number, bz: number, color: number, meta: number): number;
36
+ label(x: number, y: number, z: number, text: string, color: number, meta: number, expiry: number): void;
37
+ /** Drops entries whose expiry has passed, keeping the order of the rest. */
38
+ expire(now: number): void;
39
+ clear(): void;
40
+ /** Adds an offset to every line end and label anchor (a floating-origin shift). */
41
+ shift(x: number, y: number, z: number): void;
42
+ }
43
+ export declare class GizmoStore {
44
+ /** Drawn this frame; cleared at the start of the next. */
45
+ readonly frame: GizmoList;
46
+ /** Drawn with a duration; kept until they expire. */
47
+ readonly timed: GizmoList;
48
+ /**
49
+ * Built-in overlays (overlays.ts), redrawn by their system each render. Their own list, so a
50
+ * render without a full frame (a capture of a paused game) doesn't draw them twice.
51
+ */
52
+ readonly overlay: GizmoList;
53
+ /** Where frame-lifetime drawings go: `frame`, or `overlay` while overlays draw. */
54
+ private current;
55
+ /** Routes drawings to the overlay list until `endOverlays`, clearing it first. */
56
+ beginOverlays(): void;
57
+ endOverlays(): void;
58
+ /** Time.elapsed at the start of this frame. */
59
+ now: number;
60
+ /** Every list, in draw order. */
61
+ readonly lists: readonly GizmoList[];
62
+ private lr;
63
+ private lg;
64
+ private lb;
65
+ private la;
66
+ private lp;
67
+ private pack;
68
+ private meta;
69
+ private list;
70
+ /** Timed lines from `first` on get their expiry. */
71
+ private expire;
72
+ /** A segment from a to b. Colors are linear RGBA from 0 to 1. */
73
+ line(a: ArrayLike<number>, b: ArrayLike<number>, color: ArrayLike<number>, options?: GizmoOptions): void;
74
+ /** A line with an arrowhead at `to`. */
75
+ arrow(from: ArrayLike<number>, to: ArrayLike<number>, color: ArrayLike<number>, options?: GizmoOptions): void;
76
+ /** A box: center, full size, rotation (quaternion, default none). */
77
+ box(center: ArrayLike<number>, size: ArrayLike<number>, rotation: ArrayLike<number> | null, color: ArrayLike<number>, options?: GizmoOptions): void;
78
+ /** A box from 8 corners in `corners` (bit 0: +x, bit 1: +y, bit 2: +z). */
79
+ private edges;
80
+ /**
81
+ * The edges of a box given as a local AABB (`[minX, minY, minZ, maxX, maxY, maxZ]`) through an
82
+ * affine transform (three rows of four, at `offset`): an oriented bounding box.
83
+ */
84
+ bounds(aabb: ArrayLike<number>, rows: ArrayLike<number>, offset: number, color: ArrayLike<number>, options?: GizmoOptions): void;
85
+ /** Three great circles. */
86
+ sphere(center: ArrayLike<number>, radius: number, color: ArrayLike<number>, options?: GizmoOptions): void;
87
+ /** A circle around axis 0 (x), 1 (y), or 2 (z). */
88
+ circle(center: ArrayLike<number>, radius: number, axis: number, color: ArrayLike<number>, options?: GizmoOptions): void;
89
+ /**
90
+ * A view frustum from its view-projection (reversed-Z). An infinite far plane draws at 20×
91
+ * the near distance.
92
+ */
93
+ frustum(viewProj: ArrayLike<number>, color: ArrayLike<number>, options?: GizmoOptions): void;
94
+ /** A square grid of `cells` × `cells` cells, `spacing` apart, facing `normal`. */
95
+ grid(center: ArrayLike<number>, normal: ArrayLike<number>, cells: number, spacing: number, color: ArrayLike<number>, options?: GizmoOptions): void;
96
+ /** Text just above a world position, facing the screen at a fixed pixel size, on a dark backing. */
97
+ label(position: ArrayLike<number>, text: string, color: ArrayLike<number>, options?: GizmoOptions): void;
98
+ /**
99
+ * The floating origin moved (spec 0040): retained (timed) drawings, and this frame's drawings made
100
+ * before the shift, move by `offset` so they stay put in the world. Overlays redraw each render.
101
+ */
102
+ shiftOrigin(x: number, y: number, z: number): void;
103
+ /** Lines and labels this frame, including timed ones still showing. */
104
+ get lineCount(): number;
105
+ get labelCount(): number;
106
+ /** What's drawn, as data (`debug.gizmos`): up to `limit` lines, and every label. */
107
+ describe(limit?: number): {
108
+ lineCount: number;
109
+ labelCount: number;
110
+ lines: {
111
+ from: number[];
112
+ to: number[];
113
+ color: number[];
114
+ depthTest: boolean;
115
+ width: number;
116
+ }[];
117
+ labels: {
118
+ position: number[];
119
+ text: string;
120
+ color: number[];
121
+ depthTest: boolean;
122
+ }[];
123
+ };
124
+ }
125
+ export declare const Gizmos: import("@aethervtt/shard-core").ResourceDef<GizmoStore>;
126
+ /** Clears last frame's gizmos and drops expired timed ones (First). */
127
+ export declare const beginGizmos: import("@aethervtt/shard-core").SystemDef<undefined>;
128
+ interface GizmoGpu {
129
+ generation: number;
130
+ lines: GpuBuffer;
131
+ glyphs: GpuBuffer;
132
+ atlas: GPUTexture;
133
+ layouts: {
134
+ view: GPUBindGroupLayout;
135
+ data: GPUBindGroupLayout;
136
+ };
137
+ pipelines: Map<string, GPURenderPipeline>;
138
+ groups: Map<string, {
139
+ key: string;
140
+ group: GPUBindGroup;
141
+ }>;
142
+ glyphData: Float32Array;
143
+ glyphBits: Uint32Array;
144
+ glyphCount: number;
145
+ }
146
+ export declare const GizmoGpuResource: import("@aethervtt/shard-core").ResourceDef<{
147
+ gpu: GizmoGpu | undefined;
148
+ }>;
149
+ /** Uploads this frame's lines and label glyphs (Last, after overlays draw). */
150
+ export declare const uploadGizmos: import("@aethervtt/shard-core").SystemDef<undefined>;
151
+ /**
152
+ * Gizmo lines, then labels, over the resolved HDR image: after transparent geometry, particles,
153
+ * and the resolve, before post-processing and the tonemap.
154
+ */
155
+ export declare function gizmoNode(world: World): NodeDescriptor;
156
+ export {};