@downdraft/engine 0.2.0 → 0.3.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 (138) hide show
  1. package/app/src/renderer/bootstrap.ts +0 -6
  2. package/app/src/renderer/feature-log.ts +1 -9
  3. package/app/src/renderer/mcp-harness.ts +8 -11
  4. package/app/src/renderer/standard-automation-tools.ts +8 -145
  5. package/core/src/index.ts +2 -2
  6. package/core/src/module/host.ts +3 -6
  7. package/core/src/module/index.ts +1 -1
  8. package/core/src/module/module.ts +4 -47
  9. package/core/src/physics/interface.ts +5 -0
  10. package/core/src/platform/render-surface.ts +13 -0
  11. package/core/src/platform/rpc.ts +4 -1
  12. package/core/src/render/canvas-resize-watcher.ts +1 -10
  13. package/core/src/render/game-renderer.ts +164 -79
  14. package/core/src/render/index.ts +0 -2
  15. package/core/src/render/input-manager.ts +7 -7
  16. package/core/src/render/renderer-module-host.ts +2 -4
  17. package/core/src/sab/grid-buffer.ts +55 -2
  18. package/core/src/sab/record-buffer.ts +48 -5
  19. package/core/src/sab/sim-channel.ts +181 -17
  20. package/core/src/sab/slot-buffer.ts +55 -1
  21. package/core/src/sab/types.ts +11 -0
  22. package/core/src/telemetry/gpu-resource-tracker.ts +24 -0
  23. package/core/src/ui-font-scale.ts +5 -38
  24. package/core/src/util/index.ts +1 -0
  25. package/core/src/util/session-timer.ts +23 -0
  26. package/core/src/worker/base-worker-host.ts +2 -1
  27. package/core/src/worker/buffer-sync.ts +20 -13
  28. package/core/src/worker/rpc.ts +119 -5
  29. package/core/src/worker/sim-worker-base.ts +5 -2
  30. package/core/src/worker/task-pool.ts +4 -0
  31. package/dist/.dd-manifest.json +893 -908
  32. package/dist/app/src/renderer/bootstrap.js +0 -4
  33. package/dist/app/src/renderer/feature-log.js +1 -10
  34. package/dist/app/src/renderer/mcp-harness.js +8 -11
  35. package/dist/app/src/renderer/standard-automation-tools.js +6 -138
  36. package/dist/core/src/index.js +2 -2
  37. package/dist/core/src/module/host.js +3 -6
  38. package/dist/core/src/platform/rpc.js +2 -1
  39. package/dist/core/src/render/canvas-resize-watcher.js +1 -10
  40. package/dist/core/src/render/game-renderer.js +166 -74
  41. package/dist/core/src/render/index.js +0 -1
  42. package/dist/core/src/render/input-manager.js +7 -7
  43. package/dist/core/src/render/renderer-module-host.js +2 -4
  44. package/dist/core/src/sab/grid-buffer.js +53 -1
  45. package/dist/core/src/sab/record-buffer.js +49 -5
  46. package/dist/core/src/sab/sim-channel.js +173 -17
  47. package/dist/core/src/sab/slot-buffer.js +54 -1
  48. package/dist/core/src/telemetry/gpu-resource-tracker.js +26 -0
  49. package/dist/core/src/ui-font-scale.js +5 -38
  50. package/dist/core/src/util/index.js +1 -0
  51. package/dist/core/src/util/session-timer.js +22 -0
  52. package/dist/core/src/worker/base-worker-host.js +2 -1
  53. package/dist/core/src/worker/buffer-sync.js +16 -9
  54. package/dist/core/src/worker/rpc.js +105 -8
  55. package/dist/core/src/worker/sim-worker-base.js +5 -2
  56. package/dist/core/src/worker/task-pool.js +5 -0
  57. package/dist/libraries/blitz-ui/src/native-module.js +8 -1
  58. package/dist/libraries/devtools/src/backend.js +35 -9
  59. package/dist/libraries/devtools/src/collectors.js +73 -22
  60. package/dist/libraries/devtools/src/native-providers.js +0 -2
  61. package/dist/libraries/entities/src/model-renderer.js +87 -27
  62. package/dist/libraries/entities/src/shaders/model.wgsl +13 -4
  63. package/dist/libraries/networking/src/index.js +1 -0
  64. package/dist/libraries/networking/src/ws-server.js +387 -0
  65. package/dist/libraries/physics-rapier/src/api.js +15 -0
  66. package/dist/libraries/physics-rapier/src/backend.js +15 -0
  67. package/dist/libraries/physics-rapier/src/rapier-backend.js +5 -0
  68. package/dist/libraries/postfx/src/post-process-stack.js +1 -3
  69. package/dist/libraries/sand/src/materials.js +2 -32
  70. package/dist/libraries/sand/src/sand-world.js +0 -3
  71. package/dist/modules/devtools/src/api.js +8 -23
  72. package/dist/modules/devtools/src/blitz/fonts.js +75 -0
  73. package/dist/modules/devtools/src/blitz/host.js +124 -30
  74. package/dist/modules/devtools/src/blitz/panels/console.js +19 -7
  75. package/dist/modules/devtools/src/blitz/panels/elements.js +217 -28
  76. package/dist/modules/devtools/src/blitz/panels/gpu.js +5 -2
  77. package/dist/modules/devtools/src/blitz/panels/performance.js +26 -12
  78. package/dist/modules/devtools/src/blitz/panels/snapshot.js +31 -8
  79. package/dist/modules/devtools/src/blitz/panels/types.js +2 -1
  80. package/dist/modules/devtools/src/blitz/theme.js +26 -4
  81. package/dist/modules/devtools/src/data-bridge.js +0 -11
  82. package/dist/modules/devtools/src/index.js +0 -6
  83. package/dist/modules/devtools/src/init.js +8 -42
  84. package/dist/modules/devtools/src/scene-inspector.js +1 -4
  85. package/dist/modules/devtools/src/worker-sync.js +3 -11
  86. package/dist/modules/html-ui/src/doc-backend.js +52 -3
  87. package/dist/modules/html-ui/src/host.js +6 -3
  88. package/dist/test/src/vision-test.js +1 -3
  89. package/libraries/blitz-ui/native/Cargo.toml +6 -0
  90. package/libraries/blitz-ui/native-osr/Cargo.toml +3 -1
  91. package/libraries/blitz-ui/src/native-module.ts +8 -1
  92. package/libraries/devtools/src/backend.ts +38 -12
  93. package/libraries/devtools/src/collectors.ts +75 -22
  94. package/libraries/devtools/src/native-providers.ts +0 -2
  95. package/libraries/entities/src/model-renderer.ts +88 -27
  96. package/libraries/entities/src/shaders/model.wgsl +13 -4
  97. package/libraries/networking/src/index.ts +4 -0
  98. package/libraries/networking/src/ws-server.ts +397 -0
  99. package/libraries/physics-rapier/src/api.ts +15 -0
  100. package/libraries/physics-rapier/src/backend.ts +15 -0
  101. package/libraries/physics-rapier/src/rapier-backend.ts +6 -0
  102. package/libraries/postfx/src/post-process-stack.ts +1 -2
  103. package/libraries/sand/src/materials.ts +2 -32
  104. package/libraries/sand/src/sand-world.ts +0 -4
  105. package/modules/devtools/README.md +1 -3
  106. package/modules/devtools/src/api.ts +10 -34
  107. package/modules/devtools/src/blitz/fonts.ts +78 -0
  108. package/modules/devtools/src/blitz/host.ts +107 -31
  109. package/modules/devtools/src/blitz/panels/console.ts +20 -8
  110. package/modules/devtools/src/blitz/panels/elements.ts +212 -31
  111. package/modules/devtools/src/blitz/panels/gpu.ts +4 -2
  112. package/modules/devtools/src/blitz/panels/performance.ts +24 -12
  113. package/modules/devtools/src/blitz/panels/snapshot.ts +30 -8
  114. package/modules/devtools/src/blitz/panels/types.ts +2 -1
  115. package/modules/devtools/src/blitz/theme.ts +26 -4
  116. package/modules/devtools/src/data-bridge.ts +0 -16
  117. package/modules/devtools/src/index.ts +1 -11
  118. package/modules/devtools/src/init.ts +8 -51
  119. package/modules/devtools/src/scene-inspector.ts +2 -6
  120. package/modules/devtools/src/types.ts +5 -90
  121. package/modules/devtools/src/worker-sync.ts +3 -13
  122. package/modules/html-ui/src/doc-backend.ts +67 -4
  123. package/modules/html-ui/src/host.ts +11 -3
  124. package/modules/html-ui/src/protocol.ts +1 -1
  125. package/package.json +4 -5
  126. package/test/src/vision-test.ts +2 -4
  127. package/core/src/render/sab-canvas-overlay.ts +0 -122
  128. package/dist/core/src/render/sab-canvas-overlay.js +0 -83
  129. package/dist/modules/devtools/src/debug-overlay.js +0 -181
  130. package/dist/modules/devtools/src/doctor-panel.js +0 -163
  131. package/dist/modules/devtools/src/label-overlay.js +0 -129
  132. package/dist/modules/devtools/src/material-stats-panel.js +0 -171
  133. package/dist/modules/devtools/src/sim-stats-panel.js +0 -250
  134. package/modules/devtools/src/debug-overlay.ts +0 -238
  135. package/modules/devtools/src/doctor-panel.ts +0 -182
  136. package/modules/devtools/src/label-overlay.ts +0 -154
  137. package/modules/devtools/src/material-stats-panel.ts +0 -188
  138. package/modules/devtools/src/sim-stats-panel.ts +0 -272
@@ -1,272 +0,0 @@
1
- // ============================================================================
2
- // createSimStatsPanelExtension — reusable DevTools "Sim" tab for any game
3
- // that implements ISimStatsProvider (exposed via __sceneInspector).
4
- //
5
- // Renders a stats grid (FPS, tick, frame, paused, speed + game-specific extra
6
- // rows) and control buttons (Pause/Resume, Step, Clear) + a speed slider.
7
- // The tab is gated by requiredMethods so it only appears for games that
8
- // implement the provider.
9
- // ============================================================================
10
-
11
- import type { IDevToolsPanelExtension, ISimStats } from "./types";
12
-
13
- export interface SimStatsPanelOptions {
14
- /** Tab label shown in the tab bar. Default: "Sim". */
15
- tabLabel?: string;
16
- /** Tab tooltip. Default: "Simulation stats & controls". */
17
- tabTooltip?: string;
18
- /** Order/priority for tab placement. Default: 50 (before game tabs at 100+). */
19
- order?: number;
20
- /**
21
- * Optional callback to append custom rows to the stats grid, given the
22
- * latest ISimStats snapshot. Returns an array of [label, value] pairs.
23
- * Values are stringified by the panel's debugGridHtml helper.
24
- */
25
- extraRows?: (stats: ISimStats) => [string, string][];
26
- }
27
-
28
- export function createSimStatsPanelExtension(opts: SimStatsPanelOptions = {}): IDevToolsPanelExtension {
29
- const tabLabel = opts.tabLabel ?? "Sim";
30
- const tabTooltip = opts.tabTooltip ?? "Simulation stats & controls";
31
- const order = opts.order ?? 50;
32
- const hasExtra = typeof opts.extraRows === "function";
33
- // The extraRows callback runs in the page context (renderer side), but the
34
- // panel script is sandboxed and can't see the TS closure. We serialize the
35
- // callback's source so it can be eval'd in-page alongside getSimStats().
36
- // If no extraRows is provided, the script skips the extra-rows section.
37
- const extraRowsSrc = hasExtra
38
- ? opts.extraRows!.toString()
39
- : "null";
40
-
41
- const html = `
42
- <div class="panel-header">
43
- <h3>Simulation</h3>
44
- <span id="sim-status-badge" class="perf-status">Waiting for data...</span>
45
- </div>
46
- <div id="sim-stats-panel">
47
- <div class="debug-section">
48
- <h4>Stats</h4>
49
- <div id="sim-stats-grid" class="debug-grid"></div>
50
- </div>
51
- <div class="debug-section">
52
- <h4>Controls</h4>
53
- <div class="world-control-row">
54
- <button id="btn-sim-pause" class="import-action-btn">Pause</button>
55
- <button id="btn-sim-step" class="import-action-btn" title="Advance one tick while paused">Step</button>
56
- <button id="btn-sim-clear" class="import-action-btn" title="Clear/reset the simulation">Clear</button>
57
- </div>
58
- <div class="world-control-row">
59
- <label>Speed <span id="sim-speed-display" style="color:#888;font-weight:normal">1.00x</span></label>
60
- <input type="range" id="sim-speed-slider" min="0" max="10" step="0.25" value="1" style="flex:1">
61
- <button id="btn-sim-speed-reset" class="import-action-btn">Reset</button>
62
- </div>
63
- </div>
64
- </div>
65
- `;
66
-
67
- const css = `
68
- #sim-stats-panel {
69
- flex: 1;
70
- overflow-y: auto;
71
- padding: 8px 12px;
72
- }
73
- #sim-stats-panel .debug-section {
74
- margin-bottom: 12px;
75
- }
76
- #sim-stats-panel .debug-section h4 {
77
- font-size: 12px;
78
- color: #569cd6;
79
- margin: 8px 0 4px 0;
80
- border-bottom: 1px solid #333;
81
- padding-bottom: 2px;
82
- }
83
- #sim-stats-panel .world-control-row {
84
- display: flex;
85
- align-items: center;
86
- flex-wrap: wrap;
87
- gap: 8px;
88
- padding: 4px 0;
89
- }
90
- #sim-stats-panel .world-control-row label {
91
- display: flex;
92
- align-items: center;
93
- gap: 4px;
94
- font-size: 11px;
95
- color: #d4d4d4;
96
- }
97
- #sim-stats-panel .world-control-row input[type="range"] {
98
- accent-color: #0e639c;
99
- cursor: pointer;
100
- }
101
- #sim-stats-panel .import-action-btn {
102
- background: #0e639c;
103
- color: #fff;
104
- border: 1px solid #0e639c;
105
- padding: 3px 10px;
106
- font-size: 11px;
107
- border-radius: 2px;
108
- cursor: pointer;
109
- }
110
- #sim-stats-panel .import-action-btn:hover {
111
- background: #1177bb;
112
- }
113
- #sim-stats-panel #btn-sim-clear {
114
- background: #5a1d1d;
115
- border-color: #5a1d1d;
116
- }
117
- #sim-stats-panel #btn-sim-clear:hover {
118
- background: #7a2828;
119
- }
120
- #sim-status-badge.paused {
121
- color: #e5c07b;
122
- }
123
- #sim-status-badge.running {
124
- color: #98c379;
125
- }
126
- `;
127
-
128
- // The script is sandbox-evaled with {document, console, panel} and uses
129
- // window.DevToolsPanel helpers (callInspector, evalInPage, escapeHtml,
130
- // fmtVal, debugGridHtml). It returns {onActivate, onRefresh, onDeactivate}.
131
- const script = `
132
- (function(DevToolsPanel) {
133
- var callInspector = DevToolsPanel.callInspector;
134
- var evalInPage = DevToolsPanel.evalInPage;
135
- var escapeHtml = DevToolsPanel.escapeHtml;
136
- var fmtVal = DevToolsPanel.fmtVal;
137
- var debugGridHtml = DevToolsPanel.debugGridHtml;
138
-
139
- // extraRowsFn is serialized from the game's SimStatsPanelOptions.extraRows
140
- // callback. It runs in the PAGE context (not the sandbox) so it can access
141
- // the full ISimStats object returned by __sceneInspector.getSimStats().
142
- var extraRowsFn = ${extraRowsSrc};
143
-
144
- function refreshSimStats() {
145
- var gridEl = document.getElementById("sim-stats-grid");
146
- var statusEl = document.getElementById("sim-status-badge");
147
- evalInPage(
148
- "window.__sceneInspector ? JSON.stringify(window.__sceneInspector.getSimStats()) : null",
149
- function (result, err) {
150
- if (err || !result) {
151
- if (gridEl) gridEl.innerHTML = '<div class="debug-label">Not available</div>';
152
- if (statusEl) { statusEl.textContent = "Not available"; statusEl.className = "perf-status"; }
153
- return;
154
- }
155
- try {
156
- var s = JSON.parse(result);
157
- if (!s) {
158
- if (gridEl) gridEl.innerHTML = '<div class="debug-label">Not available</div>';
159
- return;
160
- }
161
- var rows = [
162
- ["FPS", fmtVal(s.fps, 0)],
163
- ["Tick", s.tick],
164
- ["Frame", s.frame],
165
- ["Paused", s.paused ? "Yes" : "No"],
166
- ["Speed", fmtVal(s.speed, 2) + "x"],
167
- ];
168
- if (extraRowsFn && s.extra) {
169
- try {
170
- var extra = extraRowsFn(s);
171
- if (extra && extra.length) {
172
- for (var i = 0; i < extra.length; i++) {
173
- rows.push([extra[i][0], String(extra[i][1])]);
174
- }
175
- }
176
- } catch (e) {
177
- rows.push(["Extra error", escapeHtml(String(e))]);
178
- }
179
- }
180
- if (gridEl) gridEl.innerHTML = debugGridHtml(rows);
181
- if (statusEl) {
182
- statusEl.textContent = s.paused ? "Paused" : "Running";
183
- statusEl.className = "perf-status " + (s.paused ? "paused" : "running");
184
- }
185
- // Sync pause button label
186
- var pauseBtn = document.getElementById("btn-sim-pause");
187
- if (pauseBtn) pauseBtn.textContent = s.paused ? "Resume" : "Pause";
188
- // Sync speed slider/display (only if not focused — avoid clobbering user input)
189
- var slider = document.getElementById("sim-speed-slider");
190
- var display = document.getElementById("sim-speed-display");
191
- if (slider && document.activeElement !== slider) slider.value = s.speed;
192
- if (display) display.textContent = fmtVal(s.speed, 2) + "x";
193
- } catch (e) {
194
- if (gridEl) gridEl.innerHTML = '<div class="debug-label">Error: ' + escapeHtml(String(e)) + '</div>';
195
- }
196
- }
197
- );
198
- }
199
-
200
- function setupControls() {
201
- var pauseBtn = document.getElementById("btn-sim-pause");
202
- if (pauseBtn) {
203
- pauseBtn.addEventListener("click", function () {
204
- // Toggle based on current label to avoid race with refresh
205
- var isPaused = pauseBtn.textContent === "Resume";
206
- if (isPaused) {
207
- callInspector("resumeSim", null);
208
- } else {
209
- callInspector("pauseSim", null);
210
- }
211
- setTimeout(refreshSimStats, 50);
212
- });
213
- }
214
- var stepBtn = document.getElementById("btn-sim-step");
215
- if (stepBtn) {
216
- stepBtn.addEventListener("click", function () {
217
- callInspector("stepSim", null);
218
- setTimeout(refreshSimStats, 50);
219
- });
220
- }
221
- var clearBtn = document.getElementById("btn-sim-clear");
222
- if (clearBtn) {
223
- clearBtn.addEventListener("click", function () {
224
- callInspector("clearSim", null);
225
- setTimeout(refreshSimStats, 50);
226
- });
227
- }
228
- var slider = document.getElementById("sim-speed-slider");
229
- var display = document.getElementById("sim-speed-display");
230
- if (slider) {
231
- slider.addEventListener("input", function () {
232
- var speed = parseFloat(slider.value);
233
- if (display) display.textContent = speed.toFixed(2) + "x";
234
- });
235
- slider.addEventListener("change", function () {
236
- var speed = parseFloat(slider.value);
237
- callInspector("setSimSpeed", [speed]);
238
- });
239
- }
240
- var resetBtn = document.getElementById("btn-sim-speed-reset");
241
- if (resetBtn) {
242
- resetBtn.addEventListener("click", function () {
243
- if (slider) slider.value = 1;
244
- if (display) display.textContent = "1.00x";
245
- callInspector("setSimSpeed", [1]);
246
- });
247
- }
248
- }
249
-
250
- return {
251
- onActivate: function () {
252
- setupControls();
253
- // Initial refresh — onRefresh timer is started by the panel core
254
- refreshSimStats();
255
- },
256
- onRefresh: refreshSimStats,
257
- onDeactivate: function () {},
258
- };
259
- })
260
- `;
261
-
262
- return {
263
- id: "sim-stats",
264
- tabLabel,
265
- tabTooltip,
266
- order,
267
- requiredMethods: ["getSimStats", "pauseSim", "resumeSim"],
268
- html,
269
- css,
270
- script,
271
- };
272
- }