UNPKG

unreal.js

Version:

A pak reader for games like VALORANT & Fortnite written in Node.JS

142 lines (141 loc) 8.52 kB
"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;