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.
@@ -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
- createMockGPUCanvasContext: () => createMockGPUCanvasContext,
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
- // src/engine/mocks/webgpu.ts
2510
- var import_vitest12 = require("vitest");
2511
- function createMockGPUAdapter() {
2512
- return {
2513
- features: /* @__PURE__ */ new Set(),
2514
- limits: {
2515
- maxTextureDimension2D: 8192,
2516
- maxBindGroups: 4,
2517
- maxUniformBufferBindingSize: 65536,
2518
- maxStorageBufferBindingSize: 134217728
2519
- },
2520
- requestDevice: import_vitest12.vi.fn().mockResolvedValue(createMockGPUDevice())
2521
- };
2522
- }
2523
- function createMockGPUDevice() {
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
- features: /* @__PURE__ */ new Set(),
2526
- limits: {
2527
- maxTextureDimension2D: 8192
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 createMockGPUCanvasContext() {
2602
+ async function createHeadlessTestContext() {
2603
+ const { adapter, device } = await initHeadlessWebGPU();
2552
2604
  return {
2553
- configure: import_vitest12.vi.fn(),
2554
- getCurrentTexture: import_vitest12.vi.fn()
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
- const mockAdapter = createMockGPUAdapter();
2614
+ Object.assign(globalThis, globals);
2559
2615
  const mockGpu = {
2560
- requestAdapter: import_vitest12.vi.fn().mockResolvedValue(mockAdapter),
2616
+ requestAdapter: import_vitest12.vi.fn(),
2561
2617
  getPreferredCanvasFormat: import_vitest12.vi.fn().mockReturnValue("bgra8unorm")
2562
2618
  };
2563
- Object.defineProperty(global, "navigator", {
2564
- value: {
2565
- ...global.navigator,
2566
- gpu: mockGpu
2567
- },
2568
- writable: true
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
- if (typeof GPUMapMode === "undefined") {
2594
- global.GPUMapMode = {
2595
- READ: 1,
2596
- WRITE: 2
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/rendering.ts
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: import_vitest14.vi.fn(),
3011
- getViewMatrix: import_vitest14.vi.fn().mockReturnValue(new Float32Array(16)),
3012
- getProjectionMatrix: import_vitest14.vi.fn().mockReturnValue(new Float32Array(16)),
3013
- getViewProjectionMatrix: import_vitest14.vi.fn().mockReturnValue(new Float32Array(16)),
3014
- getPosition: import_vitest14.vi.fn().mockReturnValue([0, 0, 0]),
3015
- getForward: import_vitest14.vi.fn().mockReturnValue([0, 0, -1]),
3016
- getRight: import_vitest14.vi.fn().mockReturnValue([1, 0, 0]),
3017
- getUp: import_vitest14.vi.fn().mockReturnValue([0, 1, 0]),
3018
- extractFrustumPlanes: import_vitest14.vi.fn(),
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: import_vitest14.vi.fn(),
3027
- init: import_vitest14.vi.fn(),
3028
- resize: import_vitest14.vi.fn()
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: import_vitest14.vi.fn(),
3032
- init: import_vitest14.vi.fn(),
3033
- resize: import_vitest14.vi.fn()
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: import_vitest14.vi.fn(),
3037
- init: import_vitest14.vi.fn(),
3038
- resize: import_vitest14.vi.fn()
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: import_vitest14.vi.fn(),
3042
- init: import_vitest14.vi.fn(),
3043
- resize: import_vitest14.vi.fn()
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: import_vitest14.vi.fn(),
3047
- init: import_vitest14.vi.fn(),
3048
- resize: import_vitest14.vi.fn()
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: () => 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 create() {
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 = create();
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 import_vitest15 = require("vitest");
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: import_vitest15.vi.fn(),
3736
- drawNotifications: import_vitest15.vi.fn(),
3737
- addCenterPrint: import_vitest15.vi.fn(),
3738
- addNotification: import_vitest15.vi.fn(),
3739
- clear: import_vitest15.vi.fn()
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: import_vitest15.vi.fn()
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
- createMockGPUCanvasContext,
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
  });