unpak.js
Version:
Modern TypeScript library for reading Unreal Engine pak files and assets, inspired by CUE4Parse
133 lines • 6.92 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FDependsNode = exports.manageFlagSetWidth = exports.manageFlagWidth = exports.packageFlagSetWidth = exports.packageFlagWidth = void 0;
const FAssetIdentifier_1 = require("./FAssetIdentifier");
const bitset_1 = __importDefault(require("bitset"));
const ObjectRef_1 = require("../../../util/ObjectRef");
const FAssetRegistryVersion_1 = require("./FAssetRegistryVersion");
const Exceptions_1 = require("../../../exceptions/Exceptions");
exports.packageFlagWidth = 3;
exports.packageFlagSetWidth = 1 >> exports.packageFlagWidth;
exports.manageFlagWidth = 1;
exports.manageFlagSetWidth = 1 >> exports.manageFlagWidth;
class FDependsNode {
/** The name of the package/object this node represents */
identifier;
packageDependencies = null;
nameDependencies = null;
manageDependencies = null;
referencers = null;
packageFlags = null;
manageFlags = null;
serializeLoad(Ar, getNodeFromSerializeIndex) {
this.identifier = new FAssetIdentifier_1.FAssetIdentifier(Ar);
function readDependencies(outDependencies, outFlagBits = null, flagSetWidth) {
let inFlagBits = null;
const pointerDependencies = [];
const sortIndexes = [];
let numFlagBits = 0;
const inDepLen = Ar.readInt32();
const inDependencies = new Array(inDepLen);
for (let i = 0; i < inDepLen; ++i) {
inDependencies[i] = Ar.readInt32();
}
const numDependencies = inDependencies.length;
if (outFlagBits) {
numFlagBits = flagSetWidth * numDependencies;
const numFlagWords = Math.round(numFlagBits / 32);
inFlagBits = new bitset_1.default(Ar.read(numFlagWords));
}
for (const serializeIndex of inDependencies) {
const dependsNode = getNodeFromSerializeIndex(serializeIndex);
if (!dependsNode)
throw new Error("Invalid index of preallocatedDependsNodeDataBuffer");
pointerDependencies.push(dependsNode);
}
let i = 0;
while (i < numDependencies) {
sortIndexes.push(i);
++i;
}
outDependencies.element = new Array(numDependencies);
for (const sortIndex of sortIndexes) {
outDependencies.element?.push(pointerDependencies[sortIndex]);
}
if (outFlagBits) {
outFlagBits.element = new bitset_1.default(numFlagBits);
let writeIndex = 0;
while (writeIndex < numDependencies) {
const readIndex = sortIndexes[writeIndex];
const start = writeIndex * flagSetWidth;
let index = 0;
while (index < (start + flagSetWidth)) {
outFlagBits.element?.set(index, inFlagBits?.get(readIndex * flagSetWidth + index));
++index;
}
++writeIndex;
}
}
}
const packageDependenciesRef = ObjectRef_1.ObjectRef.ref(this.packageDependencies);
const packageFlagsRef = ObjectRef_1.ObjectRef.ref(this.packageFlags);
const nameDependenciesRef = ObjectRef_1.ObjectRef.ref(this.nameDependencies);
const manageDependenciesRef = ObjectRef_1.ObjectRef.ref(this.manageDependencies);
const manageFlagsRef = ObjectRef_1.ObjectRef.ref(this.manageFlags);
const referencersRef = ObjectRef_1.ObjectRef.ref(this.referencers);
readDependencies(packageDependenciesRef, packageFlagsRef, exports.packageFlagSetWidth);
readDependencies(nameDependenciesRef, null, 0);
readDependencies(manageDependenciesRef, manageFlagsRef, exports.manageFlagSetWidth);
readDependencies(referencersRef, null, 0);
this.packageDependencies = packageDependenciesRef.element;
this.packageFlags = packageFlagsRef.element;
this.nameDependencies = nameDependenciesRef.element;
this.manageDependencies = manageDependenciesRef.element;
this.manageFlags = manageFlagsRef.element;
this.referencers = referencersRef.element;
}
serializeLoadBeforeFlags(Ar, version, preallocatedDependsNodeDataBuffer, numDependsNodes) {
this.identifier = new FAssetIdentifier_1.FAssetIdentifier(Ar);
const numHard = Ar.readInt32();
const numSoft = Ar.readInt32();
const numName = Ar.readInt32();
const numSoftManage = Ar.readInt32();
const numHardManage = version.version >= FAssetRegistryVersion_1.Type.AddedHardManage ? Ar.readInt32() : 0;
const numReferencers = Ar.readInt32();
// Empty dependency arrays and reserve space
this.packageDependencies = new Array(numHard + numSoft);
this.nameDependencies = new Array(numName);
this.manageDependencies = new Array(numSoftManage + numHardManage);
this.referencers = new Array(numReferencers);
function serializeNodeArray(num, outNodes) {
let i = 0;
while (i < num) {
const index = Ar.readInt32();
if (index < 0 || index >= numDependsNodes) {
throw new Exceptions_1.ParserException("Invalid DependencyType index", Ar);
}
const dependsNode = preallocatedDependsNodeDataBuffer[index];
outNodes.element.splice(index, 0, dependsNode);
++i;
}
}
// Read the bits for each type, but don't write anything if serializing that type isn't allowed
const packageDependenciesRef = ObjectRef_1.ObjectRef.ref(this.packageDependencies);
const nameDependenciesRef = ObjectRef_1.ObjectRef.ref(this.nameDependencies);
const manageDependenciesRef = ObjectRef_1.ObjectRef.ref(this.manageDependencies);
const referencersRef = ObjectRef_1.ObjectRef.ref(this.referencers);
serializeNodeArray(numHard, packageDependenciesRef);
serializeNodeArray(numSoft, packageDependenciesRef);
serializeNodeArray(numName, nameDependenciesRef);
serializeNodeArray(numSoftManage, manageDependenciesRef);
serializeNodeArray(numHardManage, manageDependenciesRef);
serializeNodeArray(numReferencers, referencersRef);
this.packageDependencies = packageDependenciesRef.element;
this.nameDependencies = nameDependenciesRef.element;
this.manageDependencies = manageDependenciesRef.element;
this.referencers = referencersRef.element;
}
}
exports.FDependsNode = FDependsNode;
//# sourceMappingURL=FDependsNode.js.map