quake2ts 0.0.573 → 0.0.575

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/package.json +1 -1
  2. package/packages/client/dist/browser/index.global.js.map +1 -1
  3. package/packages/client/dist/cjs/index.cjs +2 -2
  4. package/packages/client/dist/cjs/index.cjs.map +1 -1
  5. package/packages/client/dist/esm/index.js +2 -2
  6. package/packages/client/dist/esm/index.js.map +1 -1
  7. package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
  8. package/packages/engine/dist/browser/index.global.js +16 -16
  9. package/packages/engine/dist/browser/index.global.js.map +1 -1
  10. package/packages/engine/dist/cjs/index.cjs +123 -14
  11. package/packages/engine/dist/cjs/index.cjs.map +1 -1
  12. package/packages/engine/dist/esm/index.js +122 -14
  13. package/packages/engine/dist/esm/index.js.map +1 -1
  14. package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
  15. package/packages/engine/dist/types/index.d.ts +1 -0
  16. package/packages/engine/dist/types/index.d.ts.map +1 -1
  17. package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
  18. package/packages/test-utils/dist/index.cjs +133 -0
  19. package/packages/test-utils/dist/index.cjs.map +1 -1
  20. package/packages/test-utils/dist/index.d.cts +84 -2
  21. package/packages/test-utils/dist/index.d.ts +84 -2
  22. package/packages/test-utils/dist/index.js +126 -0
  23. package/packages/test-utils/dist/index.js.map +1 -1
  24. package/packages/tools/dist/browser/index.global.js +2 -1
  25. package/packages/tools/dist/browser/index.global.js.map +1 -1
  26. package/packages/tools/dist/cjs/index.cjs +175 -2
  27. package/packages/tools/dist/cjs/index.cjs.map +1 -1
  28. package/packages/tools/dist/esm/index.js +170 -1
  29. package/packages/tools/dist/esm/index.js.map +1 -1
  30. package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
  31. package/packages/tools/dist/types/index.d.ts +1 -0
  32. package/packages/tools/dist/types/index.d.ts.map +1 -1
  33. package/packages/tools/dist/types/modelExport.d.ts +19 -0
  34. package/packages/tools/dist/types/modelExport.d.ts.map +1 -0
@@ -107,6 +107,7 @@ __export(index_exports, {
107
107
  SoundRegistry: () => SoundRegistry,
108
108
  SpriteLoader: () => SpriteLoader,
109
109
  SpriteParseError: () => SpriteParseError,
110
+ StreamingPakArchive: () => StreamingPakArchive,
110
111
  Texture2D: () => Texture2D,
111
112
  TextureCache: () => TextureCache,
112
113
  TextureCubeMap: () => TextureCubeMap,
@@ -2108,9 +2109,116 @@ function calculatePakChecksum(buffer) {
2108
2109
  return crc32(new Uint8Array(buffer));
2109
2110
  }
2110
2111
 
2111
- // src/assets/pakWriter.ts
2112
+ // src/assets/streamingPak.ts
2113
+ var PAK_MAGIC2 = "PACK";
2112
2114
  var HEADER_SIZE2 = 12;
2113
2115
  var DIRECTORY_ENTRY_SIZE2 = 64;
2116
+ function normalizePath2(path) {
2117
+ return path.replace(/\\/g, "/").replace(/^\/+/, "").toLowerCase();
2118
+ }
2119
+ var StreamingPakArchive = class {
2120
+ constructor(source) {
2121
+ this.source = source;
2122
+ this.entries = null;
2123
+ }
2124
+ /**
2125
+ * Read directory asynchronously.
2126
+ * Caches the result so subsequent calls are fast.
2127
+ */
2128
+ async readDirectory() {
2129
+ if (this.entries) {
2130
+ return Array.from(this.entries.values());
2131
+ }
2132
+ const headerBuffer = await this.readChunk(0, HEADER_SIZE2);
2133
+ const headerView = new DataView(headerBuffer);
2134
+ const magic = String.fromCharCode(
2135
+ headerView.getUint8(0),
2136
+ headerView.getUint8(1),
2137
+ headerView.getUint8(2),
2138
+ headerView.getUint8(3)
2139
+ );
2140
+ if (magic !== PAK_MAGIC2) {
2141
+ throw new PakParseError(`Invalid PAK header magic: ${magic}`);
2142
+ }
2143
+ const dirOffset = headerView.getInt32(4, true);
2144
+ const dirLength = headerView.getInt32(8, true);
2145
+ if (dirOffset < HEADER_SIZE2) {
2146
+ throw new PakParseError(`Invalid directory offset: ${dirOffset}`);
2147
+ }
2148
+ if (dirLength < 0 || dirLength % DIRECTORY_ENTRY_SIZE2 !== 0) {
2149
+ throw new PakParseError(`Invalid directory length: ${dirLength}`);
2150
+ }
2151
+ const dirBuffer = await this.readChunk(dirOffset, dirLength);
2152
+ const dirView = new DataView(dirBuffer);
2153
+ const entryCount = dirLength / DIRECTORY_ENTRY_SIZE2;
2154
+ const entries = /* @__PURE__ */ new Map();
2155
+ for (let i = 0; i < entryCount; i++) {
2156
+ const offset = i * DIRECTORY_ENTRY_SIZE2;
2157
+ const rawName = this.readCString(dirView, offset, 56);
2158
+ const normalized = normalizePath2(rawName);
2159
+ const fileOffset = dirView.getInt32(offset + 56, true);
2160
+ const fileLength = dirView.getInt32(offset + 60, true);
2161
+ if (fileOffset < 0 || fileLength < 0 || fileOffset + fileLength > this.source.size) {
2162
+ }
2163
+ if (normalized) {
2164
+ entries.set(normalized, { name: normalized, offset: fileOffset, length: fileLength });
2165
+ }
2166
+ }
2167
+ this.entries = entries;
2168
+ return Array.from(entries.values());
2169
+ }
2170
+ /**
2171
+ * Stream file contents on demand.
2172
+ * Returns a ReadableStream of Uint8Array.
2173
+ */
2174
+ async readFile(path) {
2175
+ const entry = await this.getEntry(path);
2176
+ if (!entry) {
2177
+ throw new PakParseError(`File not found in PAK: ${path}`);
2178
+ }
2179
+ const blob = this.source.slice(entry.offset, entry.offset + entry.length);
2180
+ return blob.stream();
2181
+ }
2182
+ /**
2183
+ * Get file as a Blob without loading entire file into memory.
2184
+ */
2185
+ async getFileBlob(path) {
2186
+ const entry = await this.getEntry(path);
2187
+ if (!entry) {
2188
+ throw new PakParseError(`File not found in PAK: ${path}`);
2189
+ }
2190
+ return this.source.slice(entry.offset, entry.offset + entry.length);
2191
+ }
2192
+ async getEntry(path) {
2193
+ if (!this.entries) {
2194
+ await this.readDirectory();
2195
+ }
2196
+ return this.entries.get(normalizePath2(path));
2197
+ }
2198
+ async readChunk(offset, length2) {
2199
+ const slice = this.source.slice(offset, offset + length2);
2200
+ if ("arrayBuffer" in slice) {
2201
+ return await slice.arrayBuffer();
2202
+ } else {
2203
+ return new Response(slice).arrayBuffer();
2204
+ }
2205
+ }
2206
+ readCString(view, offset, maxLength) {
2207
+ const codes = [];
2208
+ for (let i = 0; i < maxLength; i += 1) {
2209
+ const code = view.getUint8(offset + i);
2210
+ if (code === 0) {
2211
+ break;
2212
+ }
2213
+ codes.push(code);
2214
+ }
2215
+ return String.fromCharCode(...codes);
2216
+ }
2217
+ };
2218
+
2219
+ // src/assets/pakWriter.ts
2220
+ var HEADER_SIZE3 = 12;
2221
+ var DIRECTORY_ENTRY_SIZE3 = 64;
2114
2222
  var PakWriter = class _PakWriter {
2115
2223
  constructor() {
2116
2224
  this.entries = /* @__PURE__ */ new Map();
@@ -2143,18 +2251,18 @@ var PakWriter = class _PakWriter {
2143
2251
  for (const data of this.entries.values()) {
2144
2252
  fileDataSize += data.byteLength;
2145
2253
  }
2146
- const directorySize = this.entries.size * DIRECTORY_ENTRY_SIZE2;
2147
- const totalSize = HEADER_SIZE2 + fileDataSize + directorySize;
2254
+ const directorySize = this.entries.size * DIRECTORY_ENTRY_SIZE3;
2255
+ const totalSize = HEADER_SIZE3 + fileDataSize + directorySize;
2148
2256
  const buffer = new Uint8Array(totalSize);
2149
2257
  const view = new DataView(buffer.buffer);
2150
2258
  view.setUint8(0, "P".charCodeAt(0));
2151
2259
  view.setUint8(1, "A".charCodeAt(0));
2152
2260
  view.setUint8(2, "C".charCodeAt(0));
2153
2261
  view.setUint8(3, "K".charCodeAt(0));
2154
- const dirOffset = HEADER_SIZE2 + fileDataSize;
2262
+ const dirOffset = HEADER_SIZE3 + fileDataSize;
2155
2263
  view.setInt32(4, dirOffset, true);
2156
2264
  view.setInt32(8, directorySize, true);
2157
- let currentOffset = HEADER_SIZE2;
2265
+ let currentOffset = HEADER_SIZE3;
2158
2266
  const fileOffsets = /* @__PURE__ */ new Map();
2159
2267
  const sortedKeys = Array.from(this.entries.keys()).sort();
2160
2268
  for (const name of sortedKeys) {
@@ -2180,7 +2288,7 @@ var PakWriter = class _PakWriter {
2180
2288
  }
2181
2289
  view.setInt32(dirEntryOffset + 56, fileOffsets.get(name), true);
2182
2290
  view.setInt32(dirEntryOffset + 60, data.byteLength, true);
2183
- dirEntryOffset += DIRECTORY_ENTRY_SIZE2;
2291
+ dirEntryOffset += DIRECTORY_ENTRY_SIZE3;
2184
2292
  }
2185
2293
  return buffer;
2186
2294
  }
@@ -2812,7 +2920,7 @@ function wireFileInput(input, handler) {
2812
2920
  var BSP_MAGIC = "IBSP";
2813
2921
  var BSP_VERSION = 38;
2814
2922
  var HEADER_LUMPS = 19;
2815
- var HEADER_SIZE3 = 4 + 4 + HEADER_LUMPS * 8;
2923
+ var HEADER_SIZE4 = 4 + 4 + HEADER_LUMPS * 8;
2816
2924
  var BspParseError = class extends Error {
2817
2925
  };
2818
2926
  var BspLoader = class {
@@ -2827,7 +2935,7 @@ var BspLoader = class {
2827
2935
  }
2828
2936
  };
2829
2937
  function parseBsp(buffer) {
2830
- if (buffer.byteLength < HEADER_SIZE3) {
2938
+ if (buffer.byteLength < HEADER_SIZE4) {
2831
2939
  throw new BspParseError("BSP too small to contain header");
2832
2940
  }
2833
2941
  const view = new DataView(buffer);
@@ -3280,7 +3388,7 @@ function createFaceLightmap(face, lightMaps, info) {
3280
3388
  // src/assets/md2.ts
3281
3389
  var MD2_MAGIC = 844121161;
3282
3390
  var MD2_VERSION = 8;
3283
- var HEADER_SIZE4 = 17 * 4;
3391
+ var HEADER_SIZE5 = 17 * 4;
3284
3392
  var MD2_NORMALS = [
3285
3393
  { x: -0.525731, y: 0, z: 0.850651 },
3286
3394
  { x: -0.442863, y: 0.238856, z: 0.864188 },
@@ -3478,12 +3586,12 @@ function readCString2(view, offset, maxLength) {
3478
3586
  }
3479
3587
  function validateSection(buffer, offset, length2, label) {
3480
3588
  if (length2 === 0) return;
3481
- if (offset < HEADER_SIZE4 || offset + length2 > buffer.byteLength) {
3589
+ if (offset < HEADER_SIZE5 || offset + length2 > buffer.byteLength) {
3482
3590
  throw new Md2ParseError(`${label} section is out of bounds`);
3483
3591
  }
3484
3592
  }
3485
3593
  function parseHeader(buffer) {
3486
- if (buffer.byteLength < HEADER_SIZE4) {
3594
+ if (buffer.byteLength < HEADER_SIZE5) {
3487
3595
  throw new Md2ParseError("MD2 buffer too small to contain header");
3488
3596
  }
3489
3597
  const view = new DataView(buffer);
@@ -3920,7 +4028,7 @@ var Md3Loader = class {
3920
4028
  var IDSPRITEHEADER = 844317769;
3921
4029
  var SPRITE_VERSION = 2;
3922
4030
  var MAX_SKINNAME = 64;
3923
- var HEADER_SIZE5 = 12;
4031
+ var HEADER_SIZE6 = 12;
3924
4032
  var SpriteParseError = class extends Error {
3925
4033
  };
3926
4034
  function readCString3(view, offset, maxLength) {
@@ -3933,7 +4041,7 @@ function readCString3(view, offset, maxLength) {
3933
4041
  return String.fromCharCode(...chars);
3934
4042
  }
3935
4043
  function parseSprite(buffer) {
3936
- if (buffer.byteLength < HEADER_SIZE5) {
4044
+ if (buffer.byteLength < HEADER_SIZE6) {
3937
4045
  throw new SpriteParseError("Sprite buffer too small to contain header");
3938
4046
  }
3939
4047
  const view = new DataView(buffer);
@@ -3948,7 +4056,7 @@ function parseSprite(buffer) {
3948
4056
  }
3949
4057
  const frames = [];
3950
4058
  const frameSize = 16 + MAX_SKINNAME;
3951
- let offset = HEADER_SIZE5;
4059
+ let offset = HEADER_SIZE6;
3952
4060
  for (let i = 0; i < numFrames; i += 1) {
3953
4061
  if (offset + frameSize > buffer.byteLength) {
3954
4062
  throw new SpriteParseError("Sprite frame data exceeds buffer length");
@@ -18118,6 +18226,7 @@ function createEngine(imports) {
18118
18226
  SoundRegistry,
18119
18227
  SpriteLoader,
18120
18228
  SpriteParseError,
18229
+ StreamingPakArchive,
18121
18230
  Texture2D,
18122
18231
  TextureCache,
18123
18232
  TextureCubeMap,