quake2ts 0.0.621 → 0.0.629
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/package.json +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/render/webgpu/resources.d.ts +107 -60
- package/packages/engine/dist/types/render/webgpu/resources.d.ts.map +1 -1
- package/packages/test-utils/dist/index.cjs +944 -115
- package/packages/test-utils/dist/index.cjs.map +1 -1
- package/packages/test-utils/dist/index.d.cts +214 -8
- package/packages/test-utils/dist/index.d.ts +214 -8
- package/packages/test-utils/dist/index.js +903 -114
- package/packages/test-utils/dist/index.js.map +1 -1
|
@@ -42,6 +42,7 @@ __export(index_exports, {
|
|
|
42
42
|
HandshakeStage: () => HandshakeStage,
|
|
43
43
|
InputInjector: () => InputInjector,
|
|
44
44
|
MockAudioBufferSourceNode: () => FakeBufferSource,
|
|
45
|
+
MockClientConfigStrings: () => MockClientConfigStrings,
|
|
45
46
|
MockNetDriver: () => MockNetDriver,
|
|
46
47
|
MockNetworkTransport: () => MockNetworkTransport,
|
|
47
48
|
MockPointerLock: () => MockPointerLock,
|
|
@@ -58,6 +59,7 @@ __export(index_exports, {
|
|
|
58
59
|
createBinaryWriterMock: () => createBinaryWriterMock,
|
|
59
60
|
createBounds: () => createBounds,
|
|
60
61
|
createCombatTestContext: () => createCombatTestContext,
|
|
62
|
+
createComputeTestSetup: () => createComputeTestSetup,
|
|
61
63
|
createConfigStringArrayMock: () => createConfigStringArrayMock,
|
|
62
64
|
createConfigStringMock: () => createConfigStringMock,
|
|
63
65
|
createControlledTimer: () => createControlledTimer,
|
|
@@ -68,33 +70,49 @@ __export(index_exports, {
|
|
|
68
70
|
createEntityFactory: () => createEntityFactory,
|
|
69
71
|
createEntityStateFactory: () => createEntityStateFactory,
|
|
70
72
|
createGameStateSnapshotFactory: () => createGameStateSnapshotFactory,
|
|
73
|
+
createHeadlessTestContext: () => createHeadlessTestContext,
|
|
71
74
|
createInputInjector: () => createInputInjector,
|
|
75
|
+
createInterpolationTestData: () => createInterpolationTestData,
|
|
72
76
|
createItemEntityFactory: () => createItemEntityFactory,
|
|
73
77
|
createMessageReaderMock: () => createMessageReaderMock,
|
|
74
78
|
createMessageWriterMock: () => createMessageWriterMock,
|
|
75
79
|
createMockAI: () => createMockAI,
|
|
76
80
|
createMockAmmoItem: () => createMockAmmoItem,
|
|
77
81
|
createMockArmorItem: () => createMockArmorItem,
|
|
82
|
+
createMockAssetManager: () => createMockAssetManager,
|
|
78
83
|
createMockAudioBuffer: () => createMockAudioBuffer,
|
|
79
84
|
createMockAudioContext: () => createMockAudioContext,
|
|
85
|
+
createMockBspMap: () => createMockBspMap,
|
|
80
86
|
createMockBspPipeline: () => createMockBspPipeline,
|
|
81
87
|
createMockBufferSource: () => createMockBufferSource,
|
|
82
88
|
createMockCamera: () => createMockCamera,
|
|
83
89
|
createMockCanvas: () => createMockCanvas,
|
|
84
90
|
createMockCanvasContext2D: () => createMockCanvasContext2D,
|
|
85
91
|
createMockChatMessage: () => createMockChatMessage,
|
|
92
|
+
createMockClientInfo: () => createMockClientInfo,
|
|
93
|
+
createMockClientState: () => createMockClientState,
|
|
86
94
|
createMockCollisionEntityIndex: () => createMockCollisionEntityIndex,
|
|
95
|
+
createMockCommand: () => createMockCommand,
|
|
96
|
+
createMockCommandEncoder: () => createMockCommandEncoder,
|
|
97
|
+
createMockComputePassEncoder: () => createMockComputePassEncoder,
|
|
98
|
+
createMockComputePipeline: () => createMockComputePipeline,
|
|
87
99
|
createMockConnection: () => createMockConnection,
|
|
100
|
+
createMockConnectionState: () => createMockConnectionState,
|
|
101
|
+
createMockConsole: () => createMockConsole,
|
|
102
|
+
createMockCvarRegistry: () => createMockCvarRegistry,
|
|
88
103
|
createMockDamageIndicator: () => createMockDamageIndicator,
|
|
89
104
|
createMockDamageInfo: () => createMockDamageInfo,
|
|
90
105
|
createMockDeltaFrame: () => createMockDeltaFrame,
|
|
106
|
+
createMockDownloadManager: () => createMockDownloadManager,
|
|
91
107
|
createMockEngine: () => createMockEngine,
|
|
92
108
|
createMockEntityState: () => createMockEntityState,
|
|
93
109
|
createMockFogData: () => createMockFogData,
|
|
110
|
+
createMockFrame: () => createMockFrame,
|
|
94
111
|
createMockFrameRenderer: () => createMockFrameRenderer,
|
|
95
112
|
createMockGPUAdapter: () => createMockGPUAdapter,
|
|
96
|
-
|
|
113
|
+
createMockGPUBuffer: () => createMockGPUBuffer,
|
|
97
114
|
createMockGPUDevice: () => createMockGPUDevice,
|
|
115
|
+
createMockGPUTexture: () => createMockGPUTexture,
|
|
98
116
|
createMockGame: () => createMockGame,
|
|
99
117
|
createMockGameExports: () => createMockGameExports,
|
|
100
118
|
createMockGameState: () => createMockGameState,
|
|
@@ -109,7 +127,9 @@ __export(index_exports, {
|
|
|
109
127
|
createMockKeyboardEvent: () => createMockKeyboardEvent,
|
|
110
128
|
createMockLocalStorage: () => createMockLocalStorage,
|
|
111
129
|
createMockMasterServer: () => createMockMasterServer,
|
|
130
|
+
createMockMd2Model: () => createMockMd2Model,
|
|
112
131
|
createMockMd2Pipeline: () => createMockMd2Pipeline,
|
|
132
|
+
createMockMd3Model: () => createMockMd3Model,
|
|
113
133
|
createMockMd3Pipeline: () => createMockMd3Pipeline,
|
|
114
134
|
createMockMonsterAI: () => createMockMonsterAI,
|
|
115
135
|
createMockMonsterMove: () => createMockMonsterMove,
|
|
@@ -121,12 +141,17 @@ __export(index_exports, {
|
|
|
121
141
|
createMockPerformance: () => createMockPerformance,
|
|
122
142
|
createMockPointerLock: () => createMockPointerLock,
|
|
123
143
|
createMockPowerupItem: () => createMockPowerupItem,
|
|
144
|
+
createMockPrecacheList: () => createMockPrecacheList,
|
|
145
|
+
createMockQueue: () => createMockQueue,
|
|
124
146
|
createMockRAF: () => createMockRAF,
|
|
125
147
|
createMockRConClient: () => createMockRConClient,
|
|
126
148
|
createMockRateLimiter: () => createMockRateLimiter,
|
|
127
149
|
createMockRefDef: () => createMockRefDef,
|
|
150
|
+
createMockRenderPassEncoder: () => createMockRenderPassEncoder,
|
|
151
|
+
createMockRenderPipeline: () => createMockRenderPipeline,
|
|
128
152
|
createMockRenderer: () => createMockRenderer,
|
|
129
153
|
createMockRenderingContext: () => createMockRenderingContext,
|
|
154
|
+
createMockSampler: () => createMockSampler,
|
|
130
155
|
createMockScoreboard: () => createMockScoreboard,
|
|
131
156
|
createMockServer: () => createMockServer,
|
|
132
157
|
createMockServerClient: () => createMockServerClient,
|
|
@@ -136,9 +161,12 @@ __export(index_exports, {
|
|
|
136
161
|
createMockServerState: () => createMockServerState,
|
|
137
162
|
createMockServerStatic: () => createMockServerStatic,
|
|
138
163
|
createMockSessionStorage: () => createMockSessionStorage,
|
|
164
|
+
createMockShaderModule: () => createMockShaderModule,
|
|
139
165
|
createMockSkyboxPipeline: () => createMockSkyboxPipeline,
|
|
140
166
|
createMockSnapshot: () => createMockSnapshot,
|
|
141
167
|
createMockSpritePipeline: () => createMockSpritePipeline,
|
|
168
|
+
createMockTexture: () => createMockTexture,
|
|
169
|
+
createMockTextureView: () => createMockTextureView,
|
|
142
170
|
createMockTransport: () => createMockTransport,
|
|
143
171
|
createMockUDPSocket: () => createMockUDPSocket,
|
|
144
172
|
createMockUserInfo: () => createMockUserInfo,
|
|
@@ -146,6 +174,7 @@ __export(index_exports, {
|
|
|
146
174
|
createMockWeapon: () => createMockWeapon,
|
|
147
175
|
createMockWeaponItem: () => createMockWeaponItem,
|
|
148
176
|
createMockWebGL2Context: () => createMockWebGL2Context,
|
|
177
|
+
createMockWebGPUContext: () => createMockWebGPUContext,
|
|
149
178
|
createMockWheelEvent: () => createMockWheelEvent,
|
|
150
179
|
createMonsterEntityFactory: () => createMonsterEntityFactory,
|
|
151
180
|
createMultiplayerTestScenario: () => createMultiplayerTestScenario,
|
|
@@ -156,7 +185,9 @@ __export(index_exports, {
|
|
|
156
185
|
createPlayerEntityFactory: () => createPlayerEntityFactory,
|
|
157
186
|
createPlayerStateFactory: () => createPlayerStateFactory,
|
|
158
187
|
createPlaywrightTestClient: () => createPlaywrightTestClient,
|
|
188
|
+
createPredictionTestScenario: () => createPredictionTestScenario,
|
|
159
189
|
createProjectileEntityFactory: () => createProjectileEntityFactory,
|
|
190
|
+
createRenderTestSetup: () => createRenderTestSetup,
|
|
160
191
|
createServerSnapshot: () => createServerSnapshot,
|
|
161
192
|
createSpawnTestContext: () => createSpawnTestContext,
|
|
162
193
|
createStorageTestScenario: () => createStorageTestScenario,
|
|
@@ -168,6 +199,7 @@ __export(index_exports, {
|
|
|
168
199
|
createVector3: () => createVector3,
|
|
169
200
|
createViewTestScenario: () => createViewTestScenario,
|
|
170
201
|
createVisualTestScenario: () => createVisualTestScenario,
|
|
202
|
+
initHeadlessWebGPU: () => initHeadlessWebGPU,
|
|
171
203
|
intersects: () => import_shared2.intersects,
|
|
172
204
|
ladderTrace: () => import_shared2.ladderTrace,
|
|
173
205
|
makeAxisBrush: () => makeAxisBrush,
|
|
@@ -180,6 +212,8 @@ __export(index_exports, {
|
|
|
180
212
|
measureSnapshotSize: () => measureSnapshotSize,
|
|
181
213
|
mockMonsterAttacks: () => mockMonsterAttacks,
|
|
182
214
|
randomVector3: () => randomVector3,
|
|
215
|
+
renderAndCapture: () => renderAndCapture,
|
|
216
|
+
runComputeAndReadback: () => runComputeAndReadback,
|
|
183
217
|
serializeUserInfo: () => serializeUserInfo,
|
|
184
218
|
setupBrowserEnvironment: () => setupBrowserEnvironment,
|
|
185
219
|
setupMockAudioContext: () => setupMockAudioContext,
|
|
@@ -187,6 +221,8 @@ __export(index_exports, {
|
|
|
187
221
|
setupWebGPUMocks: () => setupWebGPUMocks,
|
|
188
222
|
simulateBandwidthLimit: () => simulateBandwidthLimit,
|
|
189
223
|
simulateCameraMovement: () => simulateCameraMovement,
|
|
224
|
+
simulateClientPrediction: () => simulateClientPrediction,
|
|
225
|
+
simulateDownload: () => simulateDownload,
|
|
190
226
|
simulateFrames: () => simulateFrames,
|
|
191
227
|
simulateGravity: () => simulateGravity,
|
|
192
228
|
simulateHandshake: () => simulateHandshake,
|
|
@@ -207,7 +243,10 @@ __export(index_exports, {
|
|
|
207
243
|
teardownBrowserEnvironment: () => teardownBrowserEnvironment,
|
|
208
244
|
teardownMockAudioContext: () => teardownMockAudioContext,
|
|
209
245
|
teardownNodeEnvironment: () => teardownNodeEnvironment,
|
|
246
|
+
testComputeShader: () => testComputeShader,
|
|
247
|
+
testPipelineRendering: () => testPipelineRendering,
|
|
210
248
|
throttleBandwidth: () => throttleBandwidth,
|
|
249
|
+
verifySmoothing: () => verifySmoothing,
|
|
211
250
|
verifySnapshotConsistency: () => verifySnapshotConsistency,
|
|
212
251
|
waitForGameReady: () => waitForGameReady
|
|
213
252
|
});
|
|
@@ -2506,99 +2545,281 @@ function createMockImage(width = 100, height = 100, src = "") {
|
|
|
2506
2545
|
return img;
|
|
2507
2546
|
}
|
|
2508
2547
|
|
|
2509
|
-
//
|
|
2510
|
-
var
|
|
2511
|
-
|
|
2512
|
-
|
|
2513
|
-
|
|
2514
|
-
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2521
|
-
|
|
2522
|
-
|
|
2523
|
-
|
|
2548
|
+
// ../../node_modules/.pnpm/webgpu@0.3.8/node_modules/webgpu/index.js
|
|
2549
|
+
var import_node_path = require("path");
|
|
2550
|
+
var import_node_url = require("url");
|
|
2551
|
+
var import_module = require("module");
|
|
2552
|
+
var import_meta = {};
|
|
2553
|
+
var require2 = (0, import_module.createRequire)(import_meta.url);
|
|
2554
|
+
var isMac = process.platform === "darwin";
|
|
2555
|
+
var __dirname = (0, import_node_path.dirname)((0, import_node_url.fileURLToPath)(import_meta.url));
|
|
2556
|
+
var arch = isMac ? "universal" : process.arch;
|
|
2557
|
+
var dawnNodePath = (0, import_node_path.join)(__dirname, "dist", `${process.platform}-${arch}.dawn.node`);
|
|
2558
|
+
var { create, globals } = require2(dawnNodePath);
|
|
2559
|
+
|
|
2560
|
+
// src/setup/webgpu.ts
|
|
2561
|
+
async function initHeadlessWebGPU(options) {
|
|
2562
|
+
if (typeof process === "undefined" || process.release?.name !== "node") {
|
|
2563
|
+
throw new Error("initHeadlessWebGPU should only be called in a Node.js environment");
|
|
2564
|
+
}
|
|
2565
|
+
if (!globalThis.navigator) {
|
|
2566
|
+
globalThis.navigator = {};
|
|
2567
|
+
}
|
|
2568
|
+
if (!globalThis.navigator.gpu) {
|
|
2569
|
+
const gpu = create([]);
|
|
2570
|
+
try {
|
|
2571
|
+
Object.defineProperty(globalThis.navigator, "gpu", {
|
|
2572
|
+
value: gpu,
|
|
2573
|
+
writable: true,
|
|
2574
|
+
configurable: true
|
|
2575
|
+
});
|
|
2576
|
+
} catch (e) {
|
|
2577
|
+
console.warn("Could not define navigator.gpu, trying direct assignment");
|
|
2578
|
+
globalThis.navigator.gpu = gpu;
|
|
2579
|
+
}
|
|
2580
|
+
Object.assign(globalThis, globals);
|
|
2581
|
+
}
|
|
2582
|
+
const adapter = await navigator.gpu.requestAdapter({
|
|
2583
|
+
powerPreference: options?.powerPreference || "high-performance"
|
|
2584
|
+
});
|
|
2585
|
+
if (!adapter) {
|
|
2586
|
+
throw new Error("Failed to create WebGPU adapter");
|
|
2587
|
+
}
|
|
2588
|
+
const device = await adapter.requestDevice({
|
|
2589
|
+
requiredFeatures: options?.requiredFeatures || []
|
|
2590
|
+
});
|
|
2591
|
+
if (!device) {
|
|
2592
|
+
throw new Error("Failed to create WebGPU device");
|
|
2593
|
+
}
|
|
2524
2594
|
return {
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
-
|
|
2528
|
-
|
|
2529
|
-
lost: new Promise(() => {
|
|
2530
|
-
}),
|
|
2531
|
-
// Pending promise
|
|
2532
|
-
createShaderModule: import_vitest12.vi.fn(),
|
|
2533
|
-
createBindGroupLayout: import_vitest12.vi.fn(),
|
|
2534
|
-
createPipelineLayout: import_vitest12.vi.fn(),
|
|
2535
|
-
createRenderPipeline: import_vitest12.vi.fn(),
|
|
2536
|
-
createCommandEncoder: import_vitest12.vi.fn().mockReturnValue({
|
|
2537
|
-
copyTextureToBuffer: import_vitest12.vi.fn(),
|
|
2538
|
-
finish: import_vitest12.vi.fn()
|
|
2539
|
-
}),
|
|
2540
|
-
createBuffer: import_vitest12.vi.fn(),
|
|
2541
|
-
createTexture: import_vitest12.vi.fn().mockReturnValue({
|
|
2542
|
-
createView: import_vitest12.vi.fn()
|
|
2543
|
-
}),
|
|
2544
|
-
queue: {
|
|
2545
|
-
submit: import_vitest12.vi.fn(),
|
|
2546
|
-
writeBuffer: import_vitest12.vi.fn(),
|
|
2547
|
-
writeTexture: import_vitest12.vi.fn()
|
|
2595
|
+
adapter,
|
|
2596
|
+
device,
|
|
2597
|
+
cleanup: async () => {
|
|
2598
|
+
device.destroy();
|
|
2548
2599
|
}
|
|
2549
2600
|
};
|
|
2550
2601
|
}
|
|
2551
|
-
function
|
|
2602
|
+
async function createHeadlessTestContext() {
|
|
2603
|
+
const { adapter, device } = await initHeadlessWebGPU();
|
|
2552
2604
|
return {
|
|
2553
|
-
|
|
2554
|
-
|
|
2605
|
+
adapter,
|
|
2606
|
+
device,
|
|
2607
|
+
queue: device.queue
|
|
2555
2608
|
};
|
|
2556
2609
|
}
|
|
2610
|
+
|
|
2611
|
+
// src/engine/mocks/webgpu.ts
|
|
2612
|
+
var import_vitest12 = require("vitest");
|
|
2557
2613
|
function setupWebGPUMocks() {
|
|
2558
|
-
|
|
2614
|
+
Object.assign(globalThis, globals);
|
|
2559
2615
|
const mockGpu = {
|
|
2560
|
-
requestAdapter: import_vitest12.vi.fn()
|
|
2616
|
+
requestAdapter: import_vitest12.vi.fn(),
|
|
2561
2617
|
getPreferredCanvasFormat: import_vitest12.vi.fn().mockReturnValue("bgra8unorm")
|
|
2562
2618
|
};
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
});
|
|
2570
|
-
if (typeof GPUTextureUsage === "undefined") {
|
|
2571
|
-
global.GPUTextureUsage = {
|
|
2572
|
-
COPY_SRC: 1,
|
|
2573
|
-
COPY_DST: 2,
|
|
2574
|
-
TEXTURE_BINDING: 4,
|
|
2575
|
-
STORAGE_BINDING: 8,
|
|
2576
|
-
RENDER_ATTACHMENT: 16
|
|
2577
|
-
};
|
|
2578
|
-
}
|
|
2579
|
-
if (typeof GPUBufferUsage === "undefined") {
|
|
2580
|
-
global.GPUBufferUsage = {
|
|
2581
|
-
MAP_READ: 1,
|
|
2582
|
-
MAP_WRITE: 2,
|
|
2583
|
-
COPY_SRC: 4,
|
|
2584
|
-
COPY_DST: 8,
|
|
2585
|
-
INDEX: 16,
|
|
2586
|
-
VERTEX: 32,
|
|
2587
|
-
UNIFORM: 64,
|
|
2588
|
-
STORAGE: 128,
|
|
2589
|
-
INDIRECT: 256,
|
|
2590
|
-
QUERY_RESOLVE: 512
|
|
2591
|
-
};
|
|
2619
|
+
const mockAdapter = createMockGPUAdapter();
|
|
2620
|
+
const mockDevice = createMockGPUDevice();
|
|
2621
|
+
mockGpu.requestAdapter.mockResolvedValue(mockAdapter);
|
|
2622
|
+
mockAdapter.requestDevice.mockResolvedValue(mockDevice);
|
|
2623
|
+
if (!globalThis.navigator) {
|
|
2624
|
+
globalThis.navigator = {};
|
|
2592
2625
|
}
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2626
|
+
try {
|
|
2627
|
+
Object.defineProperty(globalThis.navigator, "gpu", {
|
|
2628
|
+
value: mockGpu,
|
|
2629
|
+
writable: true,
|
|
2630
|
+
configurable: true
|
|
2631
|
+
});
|
|
2632
|
+
} catch (e) {
|
|
2633
|
+
globalThis.navigator.gpu = mockGpu;
|
|
2598
2634
|
}
|
|
2599
2635
|
return {
|
|
2600
2636
|
mockGpu,
|
|
2601
|
-
mockAdapter
|
|
2637
|
+
mockAdapter,
|
|
2638
|
+
mockDevice
|
|
2639
|
+
};
|
|
2640
|
+
}
|
|
2641
|
+
function createMockGPUAdapter(options = {}) {
|
|
2642
|
+
return {
|
|
2643
|
+
features: /* @__PURE__ */ new Set(),
|
|
2644
|
+
limits: {},
|
|
2645
|
+
isFallbackAdapter: false,
|
|
2646
|
+
requestDevice: import_vitest12.vi.fn().mockResolvedValue(createMockGPUDevice()),
|
|
2647
|
+
requestAdapterInfo: import_vitest12.vi.fn().mockResolvedValue({}),
|
|
2648
|
+
...options
|
|
2649
|
+
};
|
|
2650
|
+
}
|
|
2651
|
+
function createMockGPUDevice(features = /* @__PURE__ */ new Set()) {
|
|
2652
|
+
const queue = createMockQueue();
|
|
2653
|
+
return {
|
|
2654
|
+
features,
|
|
2655
|
+
limits: {},
|
|
2656
|
+
queue,
|
|
2657
|
+
destroy: import_vitest12.vi.fn(),
|
|
2658
|
+
createBuffer: import_vitest12.vi.fn((descriptor) => createMockGPUBuffer(descriptor)),
|
|
2659
|
+
createTexture: import_vitest12.vi.fn((descriptor) => createMockGPUTexture(descriptor)),
|
|
2660
|
+
createSampler: import_vitest12.vi.fn(() => createMockSampler()),
|
|
2661
|
+
createBindGroupLayout: import_vitest12.vi.fn(() => ({ label: "mock-bind-group-layout" })),
|
|
2662
|
+
createPipelineLayout: import_vitest12.vi.fn(() => ({ label: "mock-pipeline-layout" })),
|
|
2663
|
+
createBindGroup: import_vitest12.vi.fn(() => ({ label: "mock-bind-group" })),
|
|
2664
|
+
createShaderModule: import_vitest12.vi.fn((descriptor) => createMockShaderModule(descriptor)),
|
|
2665
|
+
createComputePipeline: import_vitest12.vi.fn(() => createMockComputePipeline()),
|
|
2666
|
+
createRenderPipeline: import_vitest12.vi.fn(() => createMockRenderPipeline()),
|
|
2667
|
+
createComputePipelineAsync: import_vitest12.vi.fn().mockResolvedValue(createMockComputePipeline()),
|
|
2668
|
+
createRenderPipelineAsync: import_vitest12.vi.fn().mockResolvedValue(createMockRenderPipeline()),
|
|
2669
|
+
createCommandEncoder: import_vitest12.vi.fn(() => createMockCommandEncoder()),
|
|
2670
|
+
createQuerySet: import_vitest12.vi.fn(() => ({ label: "mock-query-set" })),
|
|
2671
|
+
pushErrorScope: import_vitest12.vi.fn(),
|
|
2672
|
+
popErrorScope: import_vitest12.vi.fn().mockResolvedValue(null),
|
|
2673
|
+
addEventListener: import_vitest12.vi.fn(),
|
|
2674
|
+
removeEventListener: import_vitest12.vi.fn(),
|
|
2675
|
+
dispatchEvent: import_vitest12.vi.fn(),
|
|
2676
|
+
onuncapturederror: null,
|
|
2677
|
+
label: "",
|
|
2678
|
+
lost: Promise.resolve({ reason: "destroyed", message: "Device lost" })
|
|
2679
|
+
};
|
|
2680
|
+
}
|
|
2681
|
+
function createMockQueue() {
|
|
2682
|
+
return {
|
|
2683
|
+
submit: import_vitest12.vi.fn(),
|
|
2684
|
+
onSubmittedWorkDone: import_vitest12.vi.fn().mockResolvedValue(void 0),
|
|
2685
|
+
writeBuffer: import_vitest12.vi.fn(),
|
|
2686
|
+
writeTexture: import_vitest12.vi.fn(),
|
|
2687
|
+
copyExternalImageToTexture: import_vitest12.vi.fn(),
|
|
2688
|
+
label: ""
|
|
2689
|
+
};
|
|
2690
|
+
}
|
|
2691
|
+
function createMockGPUBuffer(descriptor) {
|
|
2692
|
+
return {
|
|
2693
|
+
size: descriptor.size,
|
|
2694
|
+
usage: descriptor.usage,
|
|
2695
|
+
mapState: "unmapped",
|
|
2696
|
+
mapAsync: import_vitest12.vi.fn().mockResolvedValue(void 0),
|
|
2697
|
+
getMappedRange: import_vitest12.vi.fn(() => new ArrayBuffer(descriptor.size)),
|
|
2698
|
+
unmap: import_vitest12.vi.fn(),
|
|
2699
|
+
destroy: import_vitest12.vi.fn(),
|
|
2700
|
+
label: descriptor.label || ""
|
|
2701
|
+
};
|
|
2702
|
+
}
|
|
2703
|
+
function createMockGPUTexture(descriptor) {
|
|
2704
|
+
const size = descriptor.size;
|
|
2705
|
+
let width = 0;
|
|
2706
|
+
let height = 0;
|
|
2707
|
+
let depthOrArrayLayers = 1;
|
|
2708
|
+
if (Array.isArray(size) || size instanceof Float32Array || size instanceof Uint32Array) {
|
|
2709
|
+
const arr = Array.from(size);
|
|
2710
|
+
width = arr[0] || 0;
|
|
2711
|
+
height = arr[1] || 1;
|
|
2712
|
+
depthOrArrayLayers = arr[2] || 1;
|
|
2713
|
+
} else if (typeof size === "object") {
|
|
2714
|
+
const dict = size;
|
|
2715
|
+
width = dict.width;
|
|
2716
|
+
height = dict.height || 1;
|
|
2717
|
+
depthOrArrayLayers = dict.depthOrArrayLayers || 1;
|
|
2718
|
+
}
|
|
2719
|
+
return {
|
|
2720
|
+
width,
|
|
2721
|
+
height,
|
|
2722
|
+
depthOrArrayLayers,
|
|
2723
|
+
mipLevelCount: descriptor.mipLevelCount || 1,
|
|
2724
|
+
sampleCount: descriptor.sampleCount || 1,
|
|
2725
|
+
dimension: descriptor.dimension || "2d",
|
|
2726
|
+
format: descriptor.format,
|
|
2727
|
+
usage: descriptor.usage,
|
|
2728
|
+
createView: import_vitest12.vi.fn(() => createMockTextureView()),
|
|
2729
|
+
destroy: import_vitest12.vi.fn(),
|
|
2730
|
+
label: descriptor.label || ""
|
|
2731
|
+
};
|
|
2732
|
+
}
|
|
2733
|
+
function createMockTextureView() {
|
|
2734
|
+
return {
|
|
2735
|
+
label: ""
|
|
2736
|
+
};
|
|
2737
|
+
}
|
|
2738
|
+
function createMockSampler() {
|
|
2739
|
+
return {
|
|
2740
|
+
label: ""
|
|
2741
|
+
};
|
|
2742
|
+
}
|
|
2743
|
+
function createMockShaderModule(descriptor) {
|
|
2744
|
+
return {
|
|
2745
|
+
getCompilationInfo: import_vitest12.vi.fn().mockResolvedValue({ messages: [] }),
|
|
2746
|
+
label: descriptor.label || ""
|
|
2747
|
+
};
|
|
2748
|
+
}
|
|
2749
|
+
function createMockComputePipeline() {
|
|
2750
|
+
return {
|
|
2751
|
+
getBindGroupLayout: import_vitest12.vi.fn(() => ({ label: "mock-bind-group-layout" })),
|
|
2752
|
+
label: ""
|
|
2753
|
+
};
|
|
2754
|
+
}
|
|
2755
|
+
function createMockRenderPipeline() {
|
|
2756
|
+
return {
|
|
2757
|
+
getBindGroupLayout: import_vitest12.vi.fn(() => ({ label: "mock-bind-group-layout" })),
|
|
2758
|
+
label: ""
|
|
2759
|
+
};
|
|
2760
|
+
}
|
|
2761
|
+
function createMockCommandEncoder() {
|
|
2762
|
+
return {
|
|
2763
|
+
beginRenderPass: import_vitest12.vi.fn(() => createMockRenderPassEncoder()),
|
|
2764
|
+
beginComputePass: import_vitest12.vi.fn(() => createMockComputePassEncoder()),
|
|
2765
|
+
copyBufferToBuffer: import_vitest12.vi.fn(),
|
|
2766
|
+
copyBufferToTexture: import_vitest12.vi.fn(),
|
|
2767
|
+
copyTextureToBuffer: import_vitest12.vi.fn(),
|
|
2768
|
+
copyTextureToTexture: import_vitest12.vi.fn(),
|
|
2769
|
+
clearBuffer: import_vitest12.vi.fn(),
|
|
2770
|
+
writeTimestamp: import_vitest12.vi.fn(),
|
|
2771
|
+
resolveQuerySet: import_vitest12.vi.fn(),
|
|
2772
|
+
finish: import_vitest12.vi.fn(() => ({ label: "mock-command-buffer" })),
|
|
2773
|
+
pushDebugGroup: import_vitest12.vi.fn(),
|
|
2774
|
+
popDebugGroup: import_vitest12.vi.fn(),
|
|
2775
|
+
insertDebugMarker: import_vitest12.vi.fn(),
|
|
2776
|
+
label: ""
|
|
2777
|
+
};
|
|
2778
|
+
}
|
|
2779
|
+
function createMockRenderPassEncoder() {
|
|
2780
|
+
return {
|
|
2781
|
+
setPipeline: import_vitest12.vi.fn(),
|
|
2782
|
+
setIndexBuffer: import_vitest12.vi.fn(),
|
|
2783
|
+
setVertexBuffer: import_vitest12.vi.fn(),
|
|
2784
|
+
setBindGroup: import_vitest12.vi.fn(),
|
|
2785
|
+
setViewport: import_vitest12.vi.fn(),
|
|
2786
|
+
setScissorRect: import_vitest12.vi.fn(),
|
|
2787
|
+
setBlendConstant: import_vitest12.vi.fn(),
|
|
2788
|
+
setStencilReference: import_vitest12.vi.fn(),
|
|
2789
|
+
beginOcclusionQuery: import_vitest12.vi.fn(),
|
|
2790
|
+
endOcclusionQuery: import_vitest12.vi.fn(),
|
|
2791
|
+
executeBundles: import_vitest12.vi.fn(),
|
|
2792
|
+
draw: import_vitest12.vi.fn(),
|
|
2793
|
+
drawIndexed: import_vitest12.vi.fn(),
|
|
2794
|
+
drawIndirect: import_vitest12.vi.fn(),
|
|
2795
|
+
drawIndexedIndirect: import_vitest12.vi.fn(),
|
|
2796
|
+
end: import_vitest12.vi.fn(),
|
|
2797
|
+
pushDebugGroup: import_vitest12.vi.fn(),
|
|
2798
|
+
popDebugGroup: import_vitest12.vi.fn(),
|
|
2799
|
+
insertDebugMarker: import_vitest12.vi.fn(),
|
|
2800
|
+
label: ""
|
|
2801
|
+
};
|
|
2802
|
+
}
|
|
2803
|
+
function createMockComputePassEncoder() {
|
|
2804
|
+
return {
|
|
2805
|
+
setPipeline: import_vitest12.vi.fn(),
|
|
2806
|
+
setBindGroup: import_vitest12.vi.fn(),
|
|
2807
|
+
dispatchWorkgroups: import_vitest12.vi.fn(),
|
|
2808
|
+
dispatchWorkgroupsIndirect: import_vitest12.vi.fn(),
|
|
2809
|
+
end: import_vitest12.vi.fn(),
|
|
2810
|
+
pushDebugGroup: import_vitest12.vi.fn(),
|
|
2811
|
+
popDebugGroup: import_vitest12.vi.fn(),
|
|
2812
|
+
insertDebugMarker: import_vitest12.vi.fn(),
|
|
2813
|
+
label: ""
|
|
2814
|
+
};
|
|
2815
|
+
}
|
|
2816
|
+
function createMockWebGPUContext() {
|
|
2817
|
+
const adapter = createMockGPUAdapter();
|
|
2818
|
+
const device = createMockGPUDevice();
|
|
2819
|
+
return {
|
|
2820
|
+
adapter,
|
|
2821
|
+
device,
|
|
2822
|
+
queue: device.queue
|
|
2602
2823
|
};
|
|
2603
2824
|
}
|
|
2604
2825
|
|
|
@@ -3002,20 +3223,140 @@ function createMockSkyboxPipeline(overrides) {
|
|
|
3002
3223
|
};
|
|
3003
3224
|
}
|
|
3004
3225
|
|
|
3005
|
-
// src/engine/
|
|
3226
|
+
// src/engine/mocks/assets.ts
|
|
3006
3227
|
var import_vitest14 = require("vitest");
|
|
3228
|
+
function createMockAssetManager(overrides) {
|
|
3229
|
+
return {
|
|
3230
|
+
textures: {
|
|
3231
|
+
get: import_vitest14.vi.fn(),
|
|
3232
|
+
set: import_vitest14.vi.fn(),
|
|
3233
|
+
has: import_vitest14.vi.fn(),
|
|
3234
|
+
clear: import_vitest14.vi.fn(),
|
|
3235
|
+
memoryUsage: 0
|
|
3236
|
+
},
|
|
3237
|
+
audio: {
|
|
3238
|
+
load: import_vitest14.vi.fn(),
|
|
3239
|
+
get: import_vitest14.vi.fn(),
|
|
3240
|
+
clearAll: import_vitest14.vi.fn()
|
|
3241
|
+
},
|
|
3242
|
+
loadTexture: import_vitest14.vi.fn().mockResolvedValue({}),
|
|
3243
|
+
registerTexture: import_vitest14.vi.fn(),
|
|
3244
|
+
loadSound: import_vitest14.vi.fn().mockResolvedValue({}),
|
|
3245
|
+
loadMd2Model: import_vitest14.vi.fn().mockResolvedValue({}),
|
|
3246
|
+
getMd2Model: import_vitest14.vi.fn(),
|
|
3247
|
+
loadMd3Model: import_vitest14.vi.fn().mockResolvedValue({}),
|
|
3248
|
+
getMd3Model: import_vitest14.vi.fn(),
|
|
3249
|
+
loadSprite: import_vitest14.vi.fn().mockResolvedValue({}),
|
|
3250
|
+
loadMap: import_vitest14.vi.fn().mockResolvedValue({}),
|
|
3251
|
+
getMap: import_vitest14.vi.fn(),
|
|
3252
|
+
loadPalette: import_vitest14.vi.fn().mockResolvedValue(void 0),
|
|
3253
|
+
isAssetLoaded: import_vitest14.vi.fn().mockReturnValue(true),
|
|
3254
|
+
listFiles: import_vitest14.vi.fn().mockReturnValue([]),
|
|
3255
|
+
resetForLevelChange: import_vitest14.vi.fn(),
|
|
3256
|
+
getMemoryUsage: import_vitest14.vi.fn().mockReturnValue({ textures: 0, audio: 0 }),
|
|
3257
|
+
clearCache: import_vitest14.vi.fn(),
|
|
3258
|
+
preloadAssets: import_vitest14.vi.fn().mockResolvedValue(void 0),
|
|
3259
|
+
queueLoad: import_vitest14.vi.fn().mockImplementation((path2) => Promise.resolve({})),
|
|
3260
|
+
...overrides
|
|
3261
|
+
};
|
|
3262
|
+
}
|
|
3263
|
+
function createMockTexture(width = 1, height = 1, data) {
|
|
3264
|
+
return {
|
|
3265
|
+
width,
|
|
3266
|
+
height,
|
|
3267
|
+
data: data || new Uint8Array(width * height * 4).fill(255),
|
|
3268
|
+
format: 0,
|
|
3269
|
+
// RGBA
|
|
3270
|
+
name: "mock_texture",
|
|
3271
|
+
uploaded: false
|
|
3272
|
+
};
|
|
3273
|
+
}
|
|
3274
|
+
function createMockMd2Model(overrides) {
|
|
3275
|
+
return {
|
|
3276
|
+
header: {
|
|
3277
|
+
skinWidth: 0,
|
|
3278
|
+
skinHeight: 0,
|
|
3279
|
+
frameSize: 0,
|
|
3280
|
+
numSkins: 0,
|
|
3281
|
+
numVertices: 0,
|
|
3282
|
+
numSt: 0,
|
|
3283
|
+
numTriangles: 0,
|
|
3284
|
+
numGlCmds: 0,
|
|
3285
|
+
numFrames: 0,
|
|
3286
|
+
offsetSkins: 0,
|
|
3287
|
+
offsetSt: 0,
|
|
3288
|
+
offsetTriangles: 0,
|
|
3289
|
+
offsetFrames: 0,
|
|
3290
|
+
offsetGlCmds: 0,
|
|
3291
|
+
offsetEnd: 0
|
|
3292
|
+
},
|
|
3293
|
+
skins: [],
|
|
3294
|
+
texCoords: [],
|
|
3295
|
+
triangles: [],
|
|
3296
|
+
frames: [],
|
|
3297
|
+
glCommands: new Int32Array(0),
|
|
3298
|
+
...overrides
|
|
3299
|
+
};
|
|
3300
|
+
}
|
|
3301
|
+
function createMockMd3Model(overrides) {
|
|
3302
|
+
return {
|
|
3303
|
+
header: {
|
|
3304
|
+
ident: 0,
|
|
3305
|
+
version: 0,
|
|
3306
|
+
name: "",
|
|
3307
|
+
flags: 0,
|
|
3308
|
+
numFrames: 0,
|
|
3309
|
+
numTags: 0,
|
|
3310
|
+
numSurfaces: 0,
|
|
3311
|
+
numSkins: 0,
|
|
3312
|
+
offsetFrames: 0,
|
|
3313
|
+
offsetTags: 0,
|
|
3314
|
+
offsetSurfaces: 0,
|
|
3315
|
+
offsetEnd: 0
|
|
3316
|
+
},
|
|
3317
|
+
frames: [],
|
|
3318
|
+
tags: [],
|
|
3319
|
+
surfaces: [],
|
|
3320
|
+
...overrides
|
|
3321
|
+
};
|
|
3322
|
+
}
|
|
3323
|
+
function createMockBspMap(overrides) {
|
|
3324
|
+
return {
|
|
3325
|
+
version: 38,
|
|
3326
|
+
entities: [],
|
|
3327
|
+
planes: [],
|
|
3328
|
+
vertices: [],
|
|
3329
|
+
visibility: new Uint8Array(0),
|
|
3330
|
+
nodes: [],
|
|
3331
|
+
texInfo: [],
|
|
3332
|
+
faces: [],
|
|
3333
|
+
lightmaps: [],
|
|
3334
|
+
leafs: [],
|
|
3335
|
+
leafFaces: [],
|
|
3336
|
+
leafBrushes: [],
|
|
3337
|
+
edges: [],
|
|
3338
|
+
faceEdges: [],
|
|
3339
|
+
models: [],
|
|
3340
|
+
brushes: [],
|
|
3341
|
+
brushSides: [],
|
|
3342
|
+
...overrides
|
|
3343
|
+
};
|
|
3344
|
+
}
|
|
3345
|
+
|
|
3346
|
+
// src/engine/rendering.ts
|
|
3347
|
+
var import_vitest15 = require("vitest");
|
|
3007
3348
|
function createMockRenderingContext() {
|
|
3008
3349
|
const gl = createMockWebGL2Context();
|
|
3009
3350
|
const camera = {
|
|
3010
|
-
update:
|
|
3011
|
-
getViewMatrix:
|
|
3012
|
-
getProjectionMatrix:
|
|
3013
|
-
getViewProjectionMatrix:
|
|
3014
|
-
getPosition:
|
|
3015
|
-
getForward:
|
|
3016
|
-
getRight:
|
|
3017
|
-
getUp:
|
|
3018
|
-
extractFrustumPlanes:
|
|
3351
|
+
update: import_vitest15.vi.fn(),
|
|
3352
|
+
getViewMatrix: import_vitest15.vi.fn().mockReturnValue(new Float32Array(16)),
|
|
3353
|
+
getProjectionMatrix: import_vitest15.vi.fn().mockReturnValue(new Float32Array(16)),
|
|
3354
|
+
getViewProjectionMatrix: import_vitest15.vi.fn().mockReturnValue(new Float32Array(16)),
|
|
3355
|
+
getPosition: import_vitest15.vi.fn().mockReturnValue([0, 0, 0]),
|
|
3356
|
+
getForward: import_vitest15.vi.fn().mockReturnValue([0, 0, -1]),
|
|
3357
|
+
getRight: import_vitest15.vi.fn().mockReturnValue([1, 0, 0]),
|
|
3358
|
+
getUp: import_vitest15.vi.fn().mockReturnValue([0, 1, 0]),
|
|
3359
|
+
extractFrustumPlanes: import_vitest15.vi.fn(),
|
|
3019
3360
|
transform: {
|
|
3020
3361
|
origin: [0, 0, 0],
|
|
3021
3362
|
angles: [0, 0, 0],
|
|
@@ -3023,29 +3364,29 @@ function createMockRenderingContext() {
|
|
|
3023
3364
|
}
|
|
3024
3365
|
};
|
|
3025
3366
|
const md2 = {
|
|
3026
|
-
render:
|
|
3027
|
-
init:
|
|
3028
|
-
resize:
|
|
3367
|
+
render: import_vitest15.vi.fn(),
|
|
3368
|
+
init: import_vitest15.vi.fn(),
|
|
3369
|
+
resize: import_vitest15.vi.fn()
|
|
3029
3370
|
};
|
|
3030
3371
|
const bsp = {
|
|
3031
|
-
render:
|
|
3032
|
-
init:
|
|
3033
|
-
resize:
|
|
3372
|
+
render: import_vitest15.vi.fn(),
|
|
3373
|
+
init: import_vitest15.vi.fn(),
|
|
3374
|
+
resize: import_vitest15.vi.fn()
|
|
3034
3375
|
};
|
|
3035
3376
|
const sprite = {
|
|
3036
|
-
render:
|
|
3037
|
-
init:
|
|
3038
|
-
resize:
|
|
3377
|
+
render: import_vitest15.vi.fn(),
|
|
3378
|
+
init: import_vitest15.vi.fn(),
|
|
3379
|
+
resize: import_vitest15.vi.fn()
|
|
3039
3380
|
};
|
|
3040
3381
|
const poly = {
|
|
3041
|
-
render:
|
|
3042
|
-
init:
|
|
3043
|
-
resize:
|
|
3382
|
+
render: import_vitest15.vi.fn(),
|
|
3383
|
+
init: import_vitest15.vi.fn(),
|
|
3384
|
+
resize: import_vitest15.vi.fn()
|
|
3044
3385
|
};
|
|
3045
3386
|
const particle = {
|
|
3046
|
-
render:
|
|
3047
|
-
init:
|
|
3048
|
-
resize:
|
|
3387
|
+
render: import_vitest15.vi.fn(),
|
|
3388
|
+
init: import_vitest15.vi.fn(),
|
|
3389
|
+
resize: import_vitest15.vi.fn()
|
|
3049
3390
|
};
|
|
3050
3391
|
return {
|
|
3051
3392
|
gl,
|
|
@@ -3198,6 +3539,207 @@ function captureAudioEvents(context) {
|
|
|
3198
3539
|
return [];
|
|
3199
3540
|
}
|
|
3200
3541
|
|
|
3542
|
+
// src/engine/helpers/webgpu-rendering.ts
|
|
3543
|
+
async function createRenderTestSetup(width = 256, height = 256) {
|
|
3544
|
+
const setup = await initHeadlessWebGPU();
|
|
3545
|
+
const { device } = setup;
|
|
3546
|
+
const renderTarget = device.createTexture({
|
|
3547
|
+
size: { width, height, depthOrArrayLayers: 1 },
|
|
3548
|
+
format: "rgba8unorm",
|
|
3549
|
+
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC
|
|
3550
|
+
});
|
|
3551
|
+
const renderTargetView = renderTarget.createView();
|
|
3552
|
+
const commandEncoder = device.createCommandEncoder();
|
|
3553
|
+
const context = {
|
|
3554
|
+
adapter: setup.adapter,
|
|
3555
|
+
device: setup.device,
|
|
3556
|
+
queue: setup.device.queue
|
|
3557
|
+
};
|
|
3558
|
+
return {
|
|
3559
|
+
context,
|
|
3560
|
+
renderTarget,
|
|
3561
|
+
renderTargetView,
|
|
3562
|
+
commandEncoder,
|
|
3563
|
+
width,
|
|
3564
|
+
height,
|
|
3565
|
+
cleanup: async () => {
|
|
3566
|
+
renderTarget.destroy();
|
|
3567
|
+
await setup.cleanup();
|
|
3568
|
+
}
|
|
3569
|
+
};
|
|
3570
|
+
}
|
|
3571
|
+
async function renderAndCapture(setup, renderFn) {
|
|
3572
|
+
const { device, queue } = setup.context;
|
|
3573
|
+
const { renderTargetView, commandEncoder, width, height } = setup;
|
|
3574
|
+
const passEncoder = commandEncoder.beginRenderPass({
|
|
3575
|
+
colorAttachments: [
|
|
3576
|
+
{
|
|
3577
|
+
view: renderTargetView,
|
|
3578
|
+
clearValue: { r: 0, g: 0, b: 0, a: 0 },
|
|
3579
|
+
loadOp: "clear",
|
|
3580
|
+
storeOp: "store"
|
|
3581
|
+
}
|
|
3582
|
+
]
|
|
3583
|
+
});
|
|
3584
|
+
renderFn(passEncoder);
|
|
3585
|
+
passEncoder.end();
|
|
3586
|
+
const bytesPerPixel = 4;
|
|
3587
|
+
const unpaddedBytesPerRow = width * bytesPerPixel;
|
|
3588
|
+
const align = 256;
|
|
3589
|
+
const paddedBytesPerRow = Math.max(
|
|
3590
|
+
bytesPerPixel * width,
|
|
3591
|
+
Math.ceil(bytesPerPixel * width / align) * align
|
|
3592
|
+
);
|
|
3593
|
+
const bufferSize = paddedBytesPerRow * height;
|
|
3594
|
+
const readbackBuffer = device.createBuffer({
|
|
3595
|
+
size: bufferSize,
|
|
3596
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
|
|
3597
|
+
});
|
|
3598
|
+
commandEncoder.copyTextureToBuffer(
|
|
3599
|
+
{
|
|
3600
|
+
texture: setup.renderTarget
|
|
3601
|
+
},
|
|
3602
|
+
{
|
|
3603
|
+
buffer: readbackBuffer,
|
|
3604
|
+
bytesPerRow: paddedBytesPerRow
|
|
3605
|
+
},
|
|
3606
|
+
{
|
|
3607
|
+
width,
|
|
3608
|
+
height,
|
|
3609
|
+
depthOrArrayLayers: 1
|
|
3610
|
+
}
|
|
3611
|
+
);
|
|
3612
|
+
queue.submit([commandEncoder.finish()]);
|
|
3613
|
+
await readbackBuffer.mapAsync(GPUMapMode.READ);
|
|
3614
|
+
const arrayBuffer = readbackBuffer.getMappedRange();
|
|
3615
|
+
const output = new Uint8ClampedArray(width * height * 4);
|
|
3616
|
+
const srcBytes = new Uint8Array(arrayBuffer);
|
|
3617
|
+
for (let y = 0; y < height; y++) {
|
|
3618
|
+
const srcOffset = y * paddedBytesPerRow;
|
|
3619
|
+
const dstOffset = y * unpaddedBytesPerRow;
|
|
3620
|
+
output.set(srcBytes.subarray(srcOffset, srcOffset + unpaddedBytesPerRow), dstOffset);
|
|
3621
|
+
}
|
|
3622
|
+
readbackBuffer.unmap();
|
|
3623
|
+
readbackBuffer.destroy();
|
|
3624
|
+
return output;
|
|
3625
|
+
}
|
|
3626
|
+
async function createComputeTestSetup(outputSize) {
|
|
3627
|
+
const setup = await initHeadlessWebGPU();
|
|
3628
|
+
const { device } = setup;
|
|
3629
|
+
const outputBuffer = device.createBuffer({
|
|
3630
|
+
size: outputSize,
|
|
3631
|
+
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
|
|
3632
|
+
});
|
|
3633
|
+
const commandEncoder = device.createCommandEncoder();
|
|
3634
|
+
const context = {
|
|
3635
|
+
adapter: setup.adapter,
|
|
3636
|
+
device: setup.device,
|
|
3637
|
+
queue: setup.device.queue
|
|
3638
|
+
};
|
|
3639
|
+
return {
|
|
3640
|
+
context,
|
|
3641
|
+
outputBuffer,
|
|
3642
|
+
commandEncoder,
|
|
3643
|
+
outputSize,
|
|
3644
|
+
cleanup: async () => {
|
|
3645
|
+
outputBuffer.destroy();
|
|
3646
|
+
await setup.cleanup();
|
|
3647
|
+
}
|
|
3648
|
+
};
|
|
3649
|
+
}
|
|
3650
|
+
async function runComputeAndReadback(setup, computeFn) {
|
|
3651
|
+
const { device, queue } = setup.context;
|
|
3652
|
+
const { outputBuffer, commandEncoder, outputSize } = setup;
|
|
3653
|
+
const passEncoder = commandEncoder.beginComputePass();
|
|
3654
|
+
computeFn(passEncoder);
|
|
3655
|
+
passEncoder.end();
|
|
3656
|
+
const stagingBuffer = device.createBuffer({
|
|
3657
|
+
size: outputSize,
|
|
3658
|
+
usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
|
|
3659
|
+
});
|
|
3660
|
+
commandEncoder.copyBufferToBuffer(
|
|
3661
|
+
outputBuffer,
|
|
3662
|
+
0,
|
|
3663
|
+
stagingBuffer,
|
|
3664
|
+
0,
|
|
3665
|
+
outputSize
|
|
3666
|
+
);
|
|
3667
|
+
queue.submit([commandEncoder.finish()]);
|
|
3668
|
+
await stagingBuffer.mapAsync(GPUMapMode.READ);
|
|
3669
|
+
const mappedRange = stagingBuffer.getMappedRange();
|
|
3670
|
+
const result = mappedRange.slice(0);
|
|
3671
|
+
stagingBuffer.unmap();
|
|
3672
|
+
stagingBuffer.destroy();
|
|
3673
|
+
return result;
|
|
3674
|
+
}
|
|
3675
|
+
|
|
3676
|
+
// src/engine/helpers/pipeline-test-template.ts
|
|
3677
|
+
var import_vitest16 = require("vitest");
|
|
3678
|
+
async function testPipelineRendering(name, createPipeline, setupGeometry, expectedOutput) {
|
|
3679
|
+
const setup = await createRenderTestSetup(256, 256);
|
|
3680
|
+
try {
|
|
3681
|
+
const pipeline = createPipeline(setup.context.device);
|
|
3682
|
+
const geometry = setupGeometry(setup.context.device);
|
|
3683
|
+
const pixels = await renderAndCapture(setup, (pass) => {
|
|
3684
|
+
pass.setPipeline(pipeline);
|
|
3685
|
+
pass.setVertexBuffer(0, geometry.vertexBuffer);
|
|
3686
|
+
if (geometry.indexBuffer) {
|
|
3687
|
+
pass.setIndexBuffer(geometry.indexBuffer, "uint16");
|
|
3688
|
+
pass.drawIndexed(geometry.indexCount || 0);
|
|
3689
|
+
} else {
|
|
3690
|
+
pass.draw(geometry.vertexCount);
|
|
3691
|
+
}
|
|
3692
|
+
});
|
|
3693
|
+
if (expectedOutput) {
|
|
3694
|
+
(0, import_vitest16.expect)(pixels).toEqual(expectedOutput);
|
|
3695
|
+
} else {
|
|
3696
|
+
(0, import_vitest16.expect)(pixels.length).toBe(256 * 256 * 4);
|
|
3697
|
+
}
|
|
3698
|
+
} finally {
|
|
3699
|
+
await setup.cleanup();
|
|
3700
|
+
}
|
|
3701
|
+
}
|
|
3702
|
+
async function testComputeShader(name, createComputePipeline, inputData, expectedOutput) {
|
|
3703
|
+
const setup = await createComputeTestSetup(inputData.byteLength);
|
|
3704
|
+
const { device } = setup.context;
|
|
3705
|
+
try {
|
|
3706
|
+
const pipeline = createComputePipeline(device);
|
|
3707
|
+
const stagingBuffer = device.createBuffer({
|
|
3708
|
+
size: inputData.byteLength,
|
|
3709
|
+
usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE,
|
|
3710
|
+
mappedAtCreation: true
|
|
3711
|
+
});
|
|
3712
|
+
new Float32Array(stagingBuffer.getMappedRange()).set(inputData);
|
|
3713
|
+
stagingBuffer.unmap();
|
|
3714
|
+
const encoder = device.createCommandEncoder();
|
|
3715
|
+
encoder.copyBufferToBuffer(stagingBuffer, 0, setup.outputBuffer, 0, inputData.byteLength);
|
|
3716
|
+
device.queue.submit([encoder.finish()]);
|
|
3717
|
+
const bindGroup = device.createBindGroup({
|
|
3718
|
+
layout: pipeline.getBindGroupLayout(0),
|
|
3719
|
+
entries: [
|
|
3720
|
+
{
|
|
3721
|
+
binding: 0,
|
|
3722
|
+
resource: {
|
|
3723
|
+
buffer: setup.outputBuffer
|
|
3724
|
+
}
|
|
3725
|
+
}
|
|
3726
|
+
]
|
|
3727
|
+
});
|
|
3728
|
+
const resultBuffer = await runComputeAndReadback(setup, (pass) => {
|
|
3729
|
+
pass.setPipeline(pipeline);
|
|
3730
|
+
pass.setBindGroup(0, bindGroup);
|
|
3731
|
+
pass.dispatchWorkgroups(Math.ceil(inputData.length / 64));
|
|
3732
|
+
});
|
|
3733
|
+
if (expectedOutput) {
|
|
3734
|
+
const floatResult = new Float32Array(resultBuffer);
|
|
3735
|
+
(0, import_vitest16.expect)(floatResult).toEqual(expectedOutput);
|
|
3736
|
+
}
|
|
3737
|
+
stagingBuffer.destroy();
|
|
3738
|
+
} finally {
|
|
3739
|
+
await setup.cleanup();
|
|
3740
|
+
}
|
|
3741
|
+
}
|
|
3742
|
+
|
|
3201
3743
|
// ../../node_modules/.pnpm/gl-matrix@3.4.4/node_modules/gl-matrix/esm/common.js
|
|
3202
3744
|
var EPSILON = 1e-6;
|
|
3203
3745
|
var ARRAY_TYPE = typeof Float32Array !== "undefined" ? Float32Array : Array;
|
|
@@ -3218,7 +3760,7 @@ __export(vec3_exports, {
|
|
|
3218
3760
|
ceil: () => ceil,
|
|
3219
3761
|
clone: () => clone,
|
|
3220
3762
|
copy: () => copy,
|
|
3221
|
-
create: () =>
|
|
3763
|
+
create: () => create2,
|
|
3222
3764
|
cross: () => cross,
|
|
3223
3765
|
dist: () => dist,
|
|
3224
3766
|
distance: () => distance,
|
|
@@ -3262,7 +3804,7 @@ __export(vec3_exports, {
|
|
|
3262
3804
|
transformQuat: () => transformQuat,
|
|
3263
3805
|
zero: () => zero
|
|
3264
3806
|
});
|
|
3265
|
-
function
|
|
3807
|
+
function create2() {
|
|
3266
3808
|
var out = new ARRAY_TYPE(3);
|
|
3267
3809
|
if (ARRAY_TYPE != Float32Array) {
|
|
3268
3810
|
out[0] = 0;
|
|
@@ -3574,7 +4116,7 @@ var sqrDist = squaredDistance;
|
|
|
3574
4116
|
var len = length;
|
|
3575
4117
|
var sqrLen = squaredLength;
|
|
3576
4118
|
var forEach = (function() {
|
|
3577
|
-
var vec =
|
|
4119
|
+
var vec = create2();
|
|
3578
4120
|
return function(a, stride, offset, count, fn, arg) {
|
|
3579
4121
|
var i, l;
|
|
3580
4122
|
if (!stride) {
|
|
@@ -3697,7 +4239,7 @@ function simulateCameraMovement(camera, input, deltaTime) {
|
|
|
3697
4239
|
}
|
|
3698
4240
|
|
|
3699
4241
|
// src/client/helpers/hud.ts
|
|
3700
|
-
var
|
|
4242
|
+
var import_vitest17 = require("vitest");
|
|
3701
4243
|
function createMockHudState(overrides) {
|
|
3702
4244
|
const defaultPs = {
|
|
3703
4245
|
damageAlpha: 0,
|
|
@@ -3732,11 +4274,11 @@ function createMockHudState(overrides) {
|
|
|
3732
4274
|
batches: 10
|
|
3733
4275
|
};
|
|
3734
4276
|
const defaultMessages = {
|
|
3735
|
-
drawCenterPrint:
|
|
3736
|
-
drawNotifications:
|
|
3737
|
-
addCenterPrint:
|
|
3738
|
-
addNotification:
|
|
3739
|
-
clear:
|
|
4277
|
+
drawCenterPrint: import_vitest17.vi.fn(),
|
|
4278
|
+
drawNotifications: import_vitest17.vi.fn(),
|
|
4279
|
+
addCenterPrint: import_vitest17.vi.fn(),
|
|
4280
|
+
addNotification: import_vitest17.vi.fn(),
|
|
4281
|
+
clear: import_vitest17.vi.fn()
|
|
3740
4282
|
};
|
|
3741
4283
|
return {
|
|
3742
4284
|
ps: overrides?.ps ?? defaultPs,
|
|
@@ -3752,7 +4294,7 @@ function createMockHudState(overrides) {
|
|
|
3752
4294
|
function createMockScoreboard(players = []) {
|
|
3753
4295
|
return {
|
|
3754
4296
|
players,
|
|
3755
|
-
draw:
|
|
4297
|
+
draw: import_vitest17.vi.fn()
|
|
3756
4298
|
};
|
|
3757
4299
|
}
|
|
3758
4300
|
function createMockChatMessage(text, sender, timestamp = Date.now()) {
|
|
@@ -3850,6 +4392,254 @@ function createMockFogData(overrides = {}) {
|
|
|
3850
4392
|
};
|
|
3851
4393
|
}
|
|
3852
4394
|
|
|
4395
|
+
// src/client/mocks/download.ts
|
|
4396
|
+
var import_vitest18 = require("vitest");
|
|
4397
|
+
function createMockDownloadManager(overrides) {
|
|
4398
|
+
return {
|
|
4399
|
+
download: import_vitest18.vi.fn().mockResolvedValue(new ArrayBuffer(0)),
|
|
4400
|
+
cancel: import_vitest18.vi.fn(),
|
|
4401
|
+
getProgress: import_vitest18.vi.fn().mockReturnValue(0),
|
|
4402
|
+
...overrides
|
|
4403
|
+
};
|
|
4404
|
+
}
|
|
4405
|
+
function createMockPrecacheList(models = [], sounds = [], images = []) {
|
|
4406
|
+
return {
|
|
4407
|
+
models,
|
|
4408
|
+
sounds,
|
|
4409
|
+
images
|
|
4410
|
+
};
|
|
4411
|
+
}
|
|
4412
|
+
async function simulateDownload(url, progressCallback) {
|
|
4413
|
+
const steps = 10;
|
|
4414
|
+
for (let i = 0; i <= steps; i++) {
|
|
4415
|
+
if (progressCallback) {
|
|
4416
|
+
progressCallback(i / steps);
|
|
4417
|
+
}
|
|
4418
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
4419
|
+
}
|
|
4420
|
+
return new ArrayBuffer(1024);
|
|
4421
|
+
}
|
|
4422
|
+
|
|
4423
|
+
// src/client/mocks/state.ts
|
|
4424
|
+
var MAX_MODELS = 256;
|
|
4425
|
+
var MAX_SOUNDS = 256;
|
|
4426
|
+
var MAX_IMAGES = 256;
|
|
4427
|
+
var MockClientConfigStrings = class {
|
|
4428
|
+
constructor() {
|
|
4429
|
+
this.strings = /* @__PURE__ */ new Map();
|
|
4430
|
+
this.models = [];
|
|
4431
|
+
this.sounds = [];
|
|
4432
|
+
this.images = [];
|
|
4433
|
+
}
|
|
4434
|
+
set(index, value) {
|
|
4435
|
+
this.strings.set(index, value);
|
|
4436
|
+
if (index >= 32 /* Models */ && index < 32 /* Models */ + MAX_MODELS) {
|
|
4437
|
+
this.models[index - 32 /* Models */] = value;
|
|
4438
|
+
} else if (index >= 288 /* Sounds */ && index < 288 /* Sounds */ + MAX_SOUNDS) {
|
|
4439
|
+
this.sounds[index - 288 /* Sounds */] = value;
|
|
4440
|
+
} else if (index >= 544 /* Images */ && index < 544 /* Images */ + MAX_IMAGES) {
|
|
4441
|
+
this.images[index - 544 /* Images */] = value;
|
|
4442
|
+
}
|
|
4443
|
+
}
|
|
4444
|
+
get(index) {
|
|
4445
|
+
return this.strings.get(index);
|
|
4446
|
+
}
|
|
4447
|
+
getModelName(index) {
|
|
4448
|
+
return this.models[index];
|
|
4449
|
+
}
|
|
4450
|
+
getSoundName(index) {
|
|
4451
|
+
return this.sounds[index];
|
|
4452
|
+
}
|
|
4453
|
+
getImageName(index) {
|
|
4454
|
+
return this.images[index];
|
|
4455
|
+
}
|
|
4456
|
+
getPlayerName(playernum) {
|
|
4457
|
+
const info = this.strings.get(800 /* Players */ + playernum);
|
|
4458
|
+
if (!info) return void 0;
|
|
4459
|
+
const parts = info.split("\\");
|
|
4460
|
+
for (let i = 1; i < parts.length; i += 2) {
|
|
4461
|
+
if (parts[i] === "name") {
|
|
4462
|
+
return parts[i + 1];
|
|
4463
|
+
}
|
|
4464
|
+
}
|
|
4465
|
+
return void 0;
|
|
4466
|
+
}
|
|
4467
|
+
clear() {
|
|
4468
|
+
this.strings.clear();
|
|
4469
|
+
this.models.length = 0;
|
|
4470
|
+
this.sounds.length = 0;
|
|
4471
|
+
this.images.length = 0;
|
|
4472
|
+
}
|
|
4473
|
+
};
|
|
4474
|
+
var createMockClientState = (overrides) => {
|
|
4475
|
+
const configStrings = new MockClientConfigStrings();
|
|
4476
|
+
return {
|
|
4477
|
+
tickRate: 10,
|
|
4478
|
+
frameTimeMs: 100,
|
|
4479
|
+
serverFrame: 0,
|
|
4480
|
+
serverProtocol: 34,
|
|
4481
|
+
configStrings,
|
|
4482
|
+
playerNum: 0,
|
|
4483
|
+
serverTime: 0,
|
|
4484
|
+
parseEntities: 0,
|
|
4485
|
+
inAutoDemo: false,
|
|
4486
|
+
getClientName: (num) => `Player${num}`,
|
|
4487
|
+
getKeyBinding: (key) => "",
|
|
4488
|
+
...overrides
|
|
4489
|
+
};
|
|
4490
|
+
};
|
|
4491
|
+
var createMockFrame = (overrides) => ({
|
|
4492
|
+
serverFrame: 0,
|
|
4493
|
+
deltaFrame: -1,
|
|
4494
|
+
valid: true,
|
|
4495
|
+
entities: [],
|
|
4496
|
+
...overrides
|
|
4497
|
+
});
|
|
4498
|
+
var createMockClientInfo = (overrides) => ({
|
|
4499
|
+
name: "Player",
|
|
4500
|
+
skin: "male/grunt",
|
|
4501
|
+
model: "male",
|
|
4502
|
+
icon: "pics/icon.pcx",
|
|
4503
|
+
...overrides
|
|
4504
|
+
});
|
|
4505
|
+
var createMockConnectionState = (state = "connected") => ({
|
|
4506
|
+
state
|
|
4507
|
+
});
|
|
4508
|
+
|
|
4509
|
+
// src/client/mocks/console.ts
|
|
4510
|
+
var import_vitest19 = require("vitest");
|
|
4511
|
+
function createMockConsole(overrides) {
|
|
4512
|
+
const history = [];
|
|
4513
|
+
const errors = [];
|
|
4514
|
+
const commands = {};
|
|
4515
|
+
const cvars = {};
|
|
4516
|
+
return {
|
|
4517
|
+
print: import_vitest19.vi.fn((text) => {
|
|
4518
|
+
history.push(text);
|
|
4519
|
+
}),
|
|
4520
|
+
error: import_vitest19.vi.fn((text) => {
|
|
4521
|
+
errors.push(text);
|
|
4522
|
+
}),
|
|
4523
|
+
execute: import_vitest19.vi.fn((text) => {
|
|
4524
|
+
const parts = text.trim().split(/\s+/);
|
|
4525
|
+
const cmd = parts[0];
|
|
4526
|
+
const args = parts.slice(1);
|
|
4527
|
+
if (commands[cmd]) {
|
|
4528
|
+
commands[cmd](args);
|
|
4529
|
+
} else {
|
|
4530
|
+
history.push(`Unknown command "${cmd}"`);
|
|
4531
|
+
}
|
|
4532
|
+
}),
|
|
4533
|
+
addCommand: import_vitest19.vi.fn((name, handler) => {
|
|
4534
|
+
commands[name] = handler;
|
|
4535
|
+
}),
|
|
4536
|
+
getCvar: import_vitest19.vi.fn((name) => cvars[name]),
|
|
4537
|
+
setCvar: import_vitest19.vi.fn((name, value) => {
|
|
4538
|
+
cvars[name] = value;
|
|
4539
|
+
}),
|
|
4540
|
+
getHistory: () => history,
|
|
4541
|
+
clearHistory: () => {
|
|
4542
|
+
history.length = 0;
|
|
4543
|
+
errors.length = 0;
|
|
4544
|
+
},
|
|
4545
|
+
getErrors: () => errors,
|
|
4546
|
+
...overrides
|
|
4547
|
+
};
|
|
4548
|
+
}
|
|
4549
|
+
function createMockCommand(name, handler) {
|
|
4550
|
+
return { name, handler };
|
|
4551
|
+
}
|
|
4552
|
+
function createMockCvarRegistry(initialCvars) {
|
|
4553
|
+
return { ...initialCvars };
|
|
4554
|
+
}
|
|
4555
|
+
|
|
4556
|
+
// src/client/helpers/prediction.ts
|
|
4557
|
+
var createPredictionTestScenario = (lagMs = 100) => {
|
|
4558
|
+
const clientState = createMockClientState({
|
|
4559
|
+
playerNum: 0,
|
|
4560
|
+
serverTime: 1e3,
|
|
4561
|
+
getClientName: (num) => "TestPlayer"
|
|
4562
|
+
});
|
|
4563
|
+
const snapshots = [];
|
|
4564
|
+
for (let i = 0; i < 5; i++) {
|
|
4565
|
+
const frameEntities = [
|
|
4566
|
+
{
|
|
4567
|
+
number: 1,
|
|
4568
|
+
origin: { x: i * 10, y: 0, z: 0 },
|
|
4569
|
+
angles: { x: 0, y: 0, z: 0 },
|
|
4570
|
+
oldOrigin: { x: (i - 1) * 10, y: 0, z: 0 },
|
|
4571
|
+
modelIndex: 0,
|
|
4572
|
+
modelIndex2: 0,
|
|
4573
|
+
modelIndex3: 0,
|
|
4574
|
+
modelIndex4: 0,
|
|
4575
|
+
frame: 0,
|
|
4576
|
+
skinNum: 0,
|
|
4577
|
+
effects: 0,
|
|
4578
|
+
renderfx: 0,
|
|
4579
|
+
solid: 0,
|
|
4580
|
+
sound: 0,
|
|
4581
|
+
event: 0
|
|
4582
|
+
}
|
|
4583
|
+
];
|
|
4584
|
+
snapshots.push(frameEntities);
|
|
4585
|
+
}
|
|
4586
|
+
return {
|
|
4587
|
+
clientState,
|
|
4588
|
+
snapshots,
|
|
4589
|
+
lagMs
|
|
4590
|
+
};
|
|
4591
|
+
};
|
|
4592
|
+
var simulateClientPrediction = (state, input, deltaTime) => {
|
|
4593
|
+
return {
|
|
4594
|
+
...state,
|
|
4595
|
+
serverTime: state.serverTime + deltaTime * 1e3
|
|
4596
|
+
};
|
|
4597
|
+
};
|
|
4598
|
+
var createInterpolationTestData = (startState, endState, steps = 10) => {
|
|
4599
|
+
const result = [];
|
|
4600
|
+
for (let i = 0; i <= steps; i++) {
|
|
4601
|
+
const t = i / steps;
|
|
4602
|
+
const lerp2 = (a, b) => a + (b - a) * t;
|
|
4603
|
+
result.push({
|
|
4604
|
+
...startState,
|
|
4605
|
+
origin: {
|
|
4606
|
+
x: lerp2(startState.origin.x, endState.origin.x),
|
|
4607
|
+
y: lerp2(startState.origin.y, endState.origin.y),
|
|
4608
|
+
z: lerp2(startState.origin.z, endState.origin.z)
|
|
4609
|
+
},
|
|
4610
|
+
angles: {
|
|
4611
|
+
x: lerp2(startState.angles.x, endState.angles.x),
|
|
4612
|
+
y: lerp2(startState.angles.y, endState.angles.y),
|
|
4613
|
+
z: lerp2(startState.angles.z, endState.angles.z)
|
|
4614
|
+
}
|
|
4615
|
+
});
|
|
4616
|
+
}
|
|
4617
|
+
return result;
|
|
4618
|
+
};
|
|
4619
|
+
var verifySmoothing = (states) => {
|
|
4620
|
+
let maxError = 0;
|
|
4621
|
+
let totalError = 0;
|
|
4622
|
+
const jumps = [];
|
|
4623
|
+
for (let i = 1; i < states.length; i++) {
|
|
4624
|
+
const prev = states[i - 1].origin;
|
|
4625
|
+
const curr = states[i].origin;
|
|
4626
|
+
const dx = curr.x - prev.x;
|
|
4627
|
+
const dy = curr.y - prev.y;
|
|
4628
|
+
const dz = curr.z - prev.z;
|
|
4629
|
+
const dist2 = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
|
4630
|
+
if (dist2 > 50) {
|
|
4631
|
+
jumps.push(i);
|
|
4632
|
+
}
|
|
4633
|
+
totalError += dist2;
|
|
4634
|
+
}
|
|
4635
|
+
return {
|
|
4636
|
+
smooth: jumps.length === 0,
|
|
4637
|
+
maxError,
|
|
4638
|
+
averageError: totalError / (states.length - 1 || 1),
|
|
4639
|
+
jumps
|
|
4640
|
+
};
|
|
4641
|
+
};
|
|
4642
|
+
|
|
3853
4643
|
// src/e2e/playwright.ts
|
|
3854
4644
|
async function createPlaywrightTestClient(options = {}) {
|
|
3855
4645
|
let playwright;
|
|
@@ -4043,6 +4833,7 @@ function createVisualTestScenario(sceneName) {
|
|
|
4043
4833
|
HandshakeStage,
|
|
4044
4834
|
InputInjector,
|
|
4045
4835
|
MockAudioBufferSourceNode,
|
|
4836
|
+
MockClientConfigStrings,
|
|
4046
4837
|
MockNetDriver,
|
|
4047
4838
|
MockNetworkTransport,
|
|
4048
4839
|
MockPointerLock,
|
|
@@ -4059,6 +4850,7 @@ function createVisualTestScenario(sceneName) {
|
|
|
4059
4850
|
createBinaryWriterMock,
|
|
4060
4851
|
createBounds,
|
|
4061
4852
|
createCombatTestContext,
|
|
4853
|
+
createComputeTestSetup,
|
|
4062
4854
|
createConfigStringArrayMock,
|
|
4063
4855
|
createConfigStringMock,
|
|
4064
4856
|
createControlledTimer,
|
|
@@ -4069,33 +4861,49 @@ function createVisualTestScenario(sceneName) {
|
|
|
4069
4861
|
createEntityFactory,
|
|
4070
4862
|
createEntityStateFactory,
|
|
4071
4863
|
createGameStateSnapshotFactory,
|
|
4864
|
+
createHeadlessTestContext,
|
|
4072
4865
|
createInputInjector,
|
|
4866
|
+
createInterpolationTestData,
|
|
4073
4867
|
createItemEntityFactory,
|
|
4074
4868
|
createMessageReaderMock,
|
|
4075
4869
|
createMessageWriterMock,
|
|
4076
4870
|
createMockAI,
|
|
4077
4871
|
createMockAmmoItem,
|
|
4078
4872
|
createMockArmorItem,
|
|
4873
|
+
createMockAssetManager,
|
|
4079
4874
|
createMockAudioBuffer,
|
|
4080
4875
|
createMockAudioContext,
|
|
4876
|
+
createMockBspMap,
|
|
4081
4877
|
createMockBspPipeline,
|
|
4082
4878
|
createMockBufferSource,
|
|
4083
4879
|
createMockCamera,
|
|
4084
4880
|
createMockCanvas,
|
|
4085
4881
|
createMockCanvasContext2D,
|
|
4086
4882
|
createMockChatMessage,
|
|
4883
|
+
createMockClientInfo,
|
|
4884
|
+
createMockClientState,
|
|
4087
4885
|
createMockCollisionEntityIndex,
|
|
4886
|
+
createMockCommand,
|
|
4887
|
+
createMockCommandEncoder,
|
|
4888
|
+
createMockComputePassEncoder,
|
|
4889
|
+
createMockComputePipeline,
|
|
4088
4890
|
createMockConnection,
|
|
4891
|
+
createMockConnectionState,
|
|
4892
|
+
createMockConsole,
|
|
4893
|
+
createMockCvarRegistry,
|
|
4089
4894
|
createMockDamageIndicator,
|
|
4090
4895
|
createMockDamageInfo,
|
|
4091
4896
|
createMockDeltaFrame,
|
|
4897
|
+
createMockDownloadManager,
|
|
4092
4898
|
createMockEngine,
|
|
4093
4899
|
createMockEntityState,
|
|
4094
4900
|
createMockFogData,
|
|
4901
|
+
createMockFrame,
|
|
4095
4902
|
createMockFrameRenderer,
|
|
4096
4903
|
createMockGPUAdapter,
|
|
4097
|
-
|
|
4904
|
+
createMockGPUBuffer,
|
|
4098
4905
|
createMockGPUDevice,
|
|
4906
|
+
createMockGPUTexture,
|
|
4099
4907
|
createMockGame,
|
|
4100
4908
|
createMockGameExports,
|
|
4101
4909
|
createMockGameState,
|
|
@@ -4110,7 +4918,9 @@ function createVisualTestScenario(sceneName) {
|
|
|
4110
4918
|
createMockKeyboardEvent,
|
|
4111
4919
|
createMockLocalStorage,
|
|
4112
4920
|
createMockMasterServer,
|
|
4921
|
+
createMockMd2Model,
|
|
4113
4922
|
createMockMd2Pipeline,
|
|
4923
|
+
createMockMd3Model,
|
|
4114
4924
|
createMockMd3Pipeline,
|
|
4115
4925
|
createMockMonsterAI,
|
|
4116
4926
|
createMockMonsterMove,
|
|
@@ -4122,12 +4932,17 @@ function createVisualTestScenario(sceneName) {
|
|
|
4122
4932
|
createMockPerformance,
|
|
4123
4933
|
createMockPointerLock,
|
|
4124
4934
|
createMockPowerupItem,
|
|
4935
|
+
createMockPrecacheList,
|
|
4936
|
+
createMockQueue,
|
|
4125
4937
|
createMockRAF,
|
|
4126
4938
|
createMockRConClient,
|
|
4127
4939
|
createMockRateLimiter,
|
|
4128
4940
|
createMockRefDef,
|
|
4941
|
+
createMockRenderPassEncoder,
|
|
4942
|
+
createMockRenderPipeline,
|
|
4129
4943
|
createMockRenderer,
|
|
4130
4944
|
createMockRenderingContext,
|
|
4945
|
+
createMockSampler,
|
|
4131
4946
|
createMockScoreboard,
|
|
4132
4947
|
createMockServer,
|
|
4133
4948
|
createMockServerClient,
|
|
@@ -4137,9 +4952,12 @@ function createVisualTestScenario(sceneName) {
|
|
|
4137
4952
|
createMockServerState,
|
|
4138
4953
|
createMockServerStatic,
|
|
4139
4954
|
createMockSessionStorage,
|
|
4955
|
+
createMockShaderModule,
|
|
4140
4956
|
createMockSkyboxPipeline,
|
|
4141
4957
|
createMockSnapshot,
|
|
4142
4958
|
createMockSpritePipeline,
|
|
4959
|
+
createMockTexture,
|
|
4960
|
+
createMockTextureView,
|
|
4143
4961
|
createMockTransport,
|
|
4144
4962
|
createMockUDPSocket,
|
|
4145
4963
|
createMockUserInfo,
|
|
@@ -4147,6 +4965,7 @@ function createVisualTestScenario(sceneName) {
|
|
|
4147
4965
|
createMockWeapon,
|
|
4148
4966
|
createMockWeaponItem,
|
|
4149
4967
|
createMockWebGL2Context,
|
|
4968
|
+
createMockWebGPUContext,
|
|
4150
4969
|
createMockWheelEvent,
|
|
4151
4970
|
createMonsterEntityFactory,
|
|
4152
4971
|
createMultiplayerTestScenario,
|
|
@@ -4157,7 +4976,9 @@ function createVisualTestScenario(sceneName) {
|
|
|
4157
4976
|
createPlayerEntityFactory,
|
|
4158
4977
|
createPlayerStateFactory,
|
|
4159
4978
|
createPlaywrightTestClient,
|
|
4979
|
+
createPredictionTestScenario,
|
|
4160
4980
|
createProjectileEntityFactory,
|
|
4981
|
+
createRenderTestSetup,
|
|
4161
4982
|
createServerSnapshot,
|
|
4162
4983
|
createSpawnTestContext,
|
|
4163
4984
|
createStorageTestScenario,
|
|
@@ -4169,6 +4990,7 @@ function createVisualTestScenario(sceneName) {
|
|
|
4169
4990
|
createVector3,
|
|
4170
4991
|
createViewTestScenario,
|
|
4171
4992
|
createVisualTestScenario,
|
|
4993
|
+
initHeadlessWebGPU,
|
|
4172
4994
|
intersects,
|
|
4173
4995
|
ladderTrace,
|
|
4174
4996
|
makeAxisBrush,
|
|
@@ -4181,6 +5003,8 @@ function createVisualTestScenario(sceneName) {
|
|
|
4181
5003
|
measureSnapshotSize,
|
|
4182
5004
|
mockMonsterAttacks,
|
|
4183
5005
|
randomVector3,
|
|
5006
|
+
renderAndCapture,
|
|
5007
|
+
runComputeAndReadback,
|
|
4184
5008
|
serializeUserInfo,
|
|
4185
5009
|
setupBrowserEnvironment,
|
|
4186
5010
|
setupMockAudioContext,
|
|
@@ -4188,6 +5012,8 @@ function createVisualTestScenario(sceneName) {
|
|
|
4188
5012
|
setupWebGPUMocks,
|
|
4189
5013
|
simulateBandwidthLimit,
|
|
4190
5014
|
simulateCameraMovement,
|
|
5015
|
+
simulateClientPrediction,
|
|
5016
|
+
simulateDownload,
|
|
4191
5017
|
simulateFrames,
|
|
4192
5018
|
simulateGravity,
|
|
4193
5019
|
simulateHandshake,
|
|
@@ -4208,7 +5034,10 @@ function createVisualTestScenario(sceneName) {
|
|
|
4208
5034
|
teardownBrowserEnvironment,
|
|
4209
5035
|
teardownMockAudioContext,
|
|
4210
5036
|
teardownNodeEnvironment,
|
|
5037
|
+
testComputeShader,
|
|
5038
|
+
testPipelineRendering,
|
|
4211
5039
|
throttleBandwidth,
|
|
5040
|
+
verifySmoothing,
|
|
4212
5041
|
verifySnapshotConsistency,
|
|
4213
5042
|
waitForGameReady
|
|
4214
5043
|
});
|