@downdraft/engine 0.3.0 → 0.4.0-alpha.0
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/app/src/renderer/bootstrap.ts +0 -6
- package/app/src/renderer/feature-log.ts +1 -9
- package/app/src/renderer/mcp-harness.ts +8 -11
- package/app/src/renderer/standard-automation-tools.ts +8 -145
- package/core/src/module/host.ts +3 -6
- package/core/src/module/index.ts +1 -1
- package/core/src/module/module.ts +4 -47
- package/core/src/physics/interface.ts +5 -0
- package/core/src/platform/render-surface.ts +13 -0
- package/core/src/render/canvas-resize-watcher.ts +1 -10
- package/core/src/render/game-renderer.ts +40 -18
- package/core/src/render/index.ts +0 -2
- package/core/src/render/input-manager.ts +7 -7
- package/core/src/render/renderer-module-host.ts +2 -4
- package/core/src/ui-font-scale.ts +5 -38
- package/core/src/worker/rpc.ts +65 -0
- package/dist/.dd-manifest.json +859 -884
- package/dist/app/src/renderer/bootstrap.js +0 -4
- package/dist/app/src/renderer/feature-log.js +1 -10
- package/dist/app/src/renderer/mcp-harness.js +8 -11
- package/dist/app/src/renderer/standard-automation-tools.js +6 -138
- package/dist/core/src/module/host.js +3 -6
- package/dist/core/src/render/canvas-resize-watcher.js +1 -10
- package/dist/core/src/render/game-renderer.js +44 -18
- package/dist/core/src/render/index.js +0 -1
- package/dist/core/src/render/input-manager.js +7 -7
- package/dist/core/src/render/renderer-module-host.js +2 -4
- package/dist/core/src/ui-font-scale.js +5 -38
- package/dist/core/src/worker/rpc.js +59 -0
- package/dist/libraries/blitz-ui/src/native-module.js +8 -1
- package/dist/libraries/devtools/src/native-providers.js +0 -2
- package/dist/libraries/entities/src/model-renderer.js +87 -27
- package/dist/libraries/entities/src/shaders/model.wgsl +13 -4
- package/dist/libraries/networking/src/index.js +1 -0
- package/dist/libraries/networking/src/ws-server.js +387 -0
- package/dist/libraries/physics-rapier/src/api.js +15 -0
- package/dist/libraries/physics-rapier/src/backend.js +15 -0
- package/dist/libraries/physics-rapier/src/rapier-backend.js +5 -0
- package/dist/libraries/postfx/src/post-process-stack.js +1 -3
- package/dist/libraries/sand/src/materials.js +2 -32
- package/dist/libraries/sand/src/sand-world.js +0 -3
- package/dist/modules/devtools/src/api.js +8 -23
- package/dist/modules/devtools/src/data-bridge.js +0 -11
- package/dist/modules/devtools/src/index.js +0 -6
- package/dist/modules/devtools/src/init.js +8 -42
- package/dist/modules/devtools/src/scene-inspector.js +1 -4
- package/dist/modules/devtools/src/worker-sync.js +3 -11
- package/dist/test/src/vision-test.js +1 -3
- package/libraries/blitz-ui/src/native-module.ts +8 -1
- package/libraries/devtools/src/native-providers.ts +0 -2
- package/libraries/entities/src/model-renderer.ts +88 -27
- package/libraries/entities/src/shaders/model.wgsl +13 -4
- package/libraries/networking/src/index.ts +4 -0
- package/libraries/networking/src/ws-server.ts +397 -0
- package/libraries/physics-rapier/src/api.ts +15 -0
- package/libraries/physics-rapier/src/backend.ts +15 -0
- package/libraries/physics-rapier/src/rapier-backend.ts +6 -0
- package/libraries/postfx/src/post-process-stack.ts +1 -2
- package/libraries/sand/src/materials.ts +2 -32
- package/libraries/sand/src/sand-world.ts +0 -4
- package/modules/devtools/README.md +1 -3
- package/modules/devtools/src/api.ts +10 -34
- package/modules/devtools/src/data-bridge.ts +0 -16
- package/modules/devtools/src/index.ts +1 -11
- package/modules/devtools/src/init.ts +8 -51
- package/modules/devtools/src/scene-inspector.ts +2 -6
- package/modules/devtools/src/types.ts +5 -90
- package/modules/devtools/src/worker-sync.ts +3 -13
- package/package.json +4 -5
- package/test/src/vision-test.ts +2 -4
- package/core/src/render/sab-canvas-overlay.ts +0 -122
- package/dist/core/src/render/sab-canvas-overlay.js +0 -83
- package/dist/modules/devtools/src/debug-overlay.js +0 -181
- package/dist/modules/devtools/src/doctor-panel.js +0 -163
- package/dist/modules/devtools/src/label-overlay.js +0 -129
- package/dist/modules/devtools/src/material-stats-panel.js +0 -171
- package/dist/modules/devtools/src/sim-stats-panel.js +0 -250
- package/modules/devtools/src/debug-overlay.ts +0 -238
- package/modules/devtools/src/doctor-panel.ts +0 -182
- package/modules/devtools/src/label-overlay.ts +0 -154
- package/modules/devtools/src/material-stats-panel.ts +0 -188
- 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
|
-
}
|