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.
- package/package.json +1 -1
- package/packages/client/dist/browser/index.global.js.map +1 -1
- package/packages/client/dist/cjs/index.cjs +2 -2
- package/packages/client/dist/cjs/index.cjs.map +1 -1
- package/packages/client/dist/esm/index.js +2 -2
- package/packages/client/dist/esm/index.js.map +1 -1
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/browser/index.global.js +16 -16
- package/packages/engine/dist/browser/index.global.js.map +1 -1
- package/packages/engine/dist/cjs/index.cjs +123 -14
- package/packages/engine/dist/cjs/index.cjs.map +1 -1
- package/packages/engine/dist/esm/index.js +122 -14
- package/packages/engine/dist/esm/index.js.map +1 -1
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/engine/dist/types/index.d.ts +1 -0
- package/packages/engine/dist/types/index.d.ts.map +1 -1
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/test-utils/dist/index.cjs +133 -0
- package/packages/test-utils/dist/index.cjs.map +1 -1
- package/packages/test-utils/dist/index.d.cts +84 -2
- package/packages/test-utils/dist/index.d.ts +84 -2
- package/packages/test-utils/dist/index.js +126 -0
- package/packages/test-utils/dist/index.js.map +1 -1
- package/packages/tools/dist/browser/index.global.js +2 -1
- package/packages/tools/dist/browser/index.global.js.map +1 -1
- package/packages/tools/dist/cjs/index.cjs +175 -2
- package/packages/tools/dist/cjs/index.cjs.map +1 -1
- package/packages/tools/dist/esm/index.js +170 -1
- package/packages/tools/dist/esm/index.js.map +1 -1
- package/packages/tools/dist/tsconfig.tsbuildinfo +1 -1
- package/packages/tools/dist/types/index.d.ts +1 -0
- package/packages/tools/dist/types/index.d.ts.map +1 -1
- package/packages/tools/dist/types/modelExport.d.ts +19 -0
- 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/
|
|
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 *
|
|
2147
|
-
const totalSize =
|
|
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 =
|
|
2262
|
+
const dirOffset = HEADER_SIZE3 + fileDataSize;
|
|
2155
2263
|
view.setInt32(4, dirOffset, true);
|
|
2156
2264
|
view.setInt32(8, directorySize, true);
|
|
2157
|
-
let currentOffset =
|
|
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 +=
|
|
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
|
|
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 <
|
|
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
|
|
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 <
|
|
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 <
|
|
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
|
|
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 <
|
|
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 =
|
|
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,
|