unreal.js
Version:
A pak reader for games like VALORANT & Fortnite written in Node.JS
142 lines (141 loc) • 8.52 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FStaticMeshLODResources = void 0;
const FStaticMeshSection_1 = require("./FStaticMeshSection");
const FPositionVertexBuffer_1 = require("./FPositionVertexBuffer");
const FColorVertexBuffer_1 = require("./FColorVertexBuffer");
const FRawStaticIndexBuffer_1 = require("./FRawStaticIndexBuffer");
const FStaticMeshVertexBuffer_1 = require("./FStaticMeshVertexBuffer");
const FStripDataFlags_1 = require("../../../objects/engine/FStripDataFlags");
const FWeightedRandomSampler_1 = require("../../../objects/engine/FWeightedRandomSampler");
const Game_1 = require("../../../versions/Game");
const Versions_1 = require("../../../versions/Versions");
const FByteBulkData_1 = require("../FByteBulkData");
const FByteArchive_1 = require("../../../reader/FByteArchive");
const FDistanceFieldVolumeData_1 = require("../../../objects/engine/FDistanceFieldVolumeData");
class FStaticMeshLODResources {
constructor(Ar) {
this.sections = null;
this.vertexBuffer = null;
this.positionVertexBuffer = null;
this.colorVertexBuffer = null;
this.indexBuffer = null;
this.reversedIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer();
this.depthOnlyIndexBuffer = null;
this.reversedDepthOnlyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer();
this.wireframeIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer();
this.adjacencyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer();
this.maxDeviation = null;
this.isLODCookedOut = false;
this.inlined = false;
const stripFlags = new FStripDataFlags_1.FStripDataFlags(Ar);
const sectionsNum = Ar.readInt32();
this.sections = new Array(sectionsNum);
for (let i = 0; i < sectionsNum; ++i)
this.sections[i] = new FStaticMeshSection_1.FStaticMeshSection(Ar);
this.maxDeviation = Ar.readFloat32();
if (!Ar.versions.get("StaticMesh.UseNewCookedFormat")) {
if (!stripFlags.isDataStrippedForServer && !stripFlags.isClassDataStripped(FStaticMeshLODResources.CDSF_MinLodData))
this.serializeBuffersLegacy(Ar, stripFlags);
return;
}
// UE4.23+
this.isLODCookedOut = Ar.readBoolean();
this.inlined = Ar.readBoolean();
if (!stripFlags.isDataStrippedForServer && !this.isLODCookedOut) {
if (this.inlined) {
this.serializeBuffers(Ar);
}
else {
const bulk = new FByteBulkData_1.FByteBulkData(Ar);
if (bulk.header.elementCount > 0) {
const tempAr = new FByteArchive_1.FByteArchive(bulk.data, Ar.versions);
tempAr.littleEndian = Ar.littleEndian;
this.serializeBuffers(tempAr);
}
// FStaticMeshLODResources::SerializeAvailabilityInfo()
Ar.readUInt32(); // DepthOnlyNumTriangles
Ar.readUInt32(); // PackedData
// ... SerializeMetaData() for all buffers
Ar.pos += 4 * 4 + 2 * 4 + 2 * 4 + 5 * (2 * 4);
// StaticMeshVertexBuffer = 2x int32, 2x bool
// PositionVertexBuffer = 2x int32
// ColorVertexBuffer = 2x int32
// IndexBuffer = int32 + bool
// ReversedIndexBuffer
// DepthOnlyIndexBuffer
// ReversedDepthOnlyIndexBuffer
// WireframeIndexBuffer
/* TODO if (FUE5ReleaseStreamObjectVersion.get(Ar) < FUE5ReleaseStreamObjectVersion.RemovingTessellation) {
Ar.pos += 2*4 // AdjacencyIndexBuffer */
}
}
// FStaticMeshBuffersSize
Ar.readUInt32(); // SerializedBuffersSize
Ar.readUInt32(); // DepthOnlyIBSize
Ar.readUInt32(); // ReversedIBsSize
}
get skipLod() {
return this.vertexBuffer == null
|| this.indexBuffer == null
|| this.positionVertexBuffer == null
|| this.colorVertexBuffer == null;
}
serializeBuffersLegacy(Ar, stripFlags) {
this.positionVertexBuffer = new FPositionVertexBuffer_1.FPositionVertexBuffer(Ar);
this.vertexBuffer = new FStaticMeshVertexBuffer_1.FStaticMeshVertexBuffer(Ar);
this.colorVertexBuffer = new FColorVertexBuffer_1.FColorVertexBuffer(Ar);
this.indexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
if (Ar.ver >= Versions_1.VER_UE4_SOUND_CONCURRENCY_PACKAGE && !stripFlags.isClassDataStripped(FStaticMeshLODResources.CDSF_ReversedIndexBuffer)) {
this.reversedIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
this.depthOnlyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
this.reversedDepthOnlyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
}
else {
// UE4.8 or older, or when has CDSF_ReversedIndexBuffer
this.depthOnlyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
}
if (Ar.ver >= Versions_1.VER_UE4_FTEXT_HISTORY && Ar.ver <= Versions_1.VER_UE4_RENAME_CROUCHMOVESCHARACTERDOWN) {
new FDistanceFieldVolumeData_1.FDistanceFieldVolumeData(Ar); // distanceFieldData
}
if (!stripFlags.isEditorDataStripped)
this.wireframeIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
if (!stripFlags.isClassDataStripped(FStaticMeshLODResources.CDSF_AdjancencyData))
this.adjacencyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
if (Ar.game >= Game_1.Game.GAME_UE4(16)) {
// AreaWeightedSectionSamplers
for (let i = 0; i < this.sections.length; ++i)
new FWeightedRandomSampler_1.FWeightedRandomSampler(Ar); // typealias FStaticMeshSectionAreaWeightedTriangleSampler = FWeightedRandomSampler
new FWeightedRandomSampler_1.FWeightedRandomSampler(Ar); // AreaWeightedSampler
}
}
serializeBuffers(Ar) {
const stripFlags = new FStripDataFlags_1.FStripDataFlags(Ar);
this.positionVertexBuffer = new FPositionVertexBuffer_1.FPositionVertexBuffer(Ar);
this.vertexBuffer = new FStaticMeshVertexBuffer_1.FStaticMeshVertexBuffer(Ar);
this.colorVertexBuffer = new FColorVertexBuffer_1.FColorVertexBuffer(Ar);
this.indexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
if (!stripFlags.isClassDataStripped(FStaticMeshLODResources.CDSF_ReversedIndexBuffer))
this.reversedIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
this.depthOnlyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
if (!stripFlags.isClassDataStripped(FStaticMeshLODResources.CDSF_ReversedIndexBuffer))
this.reversedDepthOnlyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
if (!stripFlags.isEditorDataStripped)
this.wireframeIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
if ( /*TODO FUE5ReleaseStreamObjectVersion.get(Ar) < FUE5ReleaseStreamObjectVersion.RemovingTessellation && */!stripFlags.isClassDataStripped(FStaticMeshLODResources.CDSF_AdjancencyData))
this.adjacencyIndexBuffer = new FRawStaticIndexBuffer_1.FRawStaticIndexBuffer(Ar);
// UE4.25+
if (Ar.versions.get("StaticMesh.HasRayTracingGeometry") && !stripFlags.isClassDataStripped(FStaticMeshLODResources.CDSF_RaytracingResources))
Ar.readBulkByteArray(); // Raw data
// AreaWeightedSectionSamplers
for (let i = 0; i < this.sections.length; ++i)
new FWeightedRandomSampler_1.FWeightedRandomSampler(Ar); // typealias FStaticMeshSectionAreaWeightedTriangleSampler = FWeightedRandomSampler
new FWeightedRandomSampler_1.FWeightedRandomSampler(Ar); // AreaWeightedSampler
}
}
exports.FStaticMeshLODResources = FStaticMeshLODResources;
FStaticMeshLODResources.CDSF_AdjancencyData = 1;
// UE4.20+
FStaticMeshLODResources.CDSF_MinLodData = 2;
FStaticMeshLODResources.CDSF_ReversedIndexBuffer = 4;
FStaticMeshLODResources.CDSF_RaytracingResources = 8;