UNPKG

unreal.js

Version:

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

62 lines (61 loc) 3.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FStaticMeshVertexBuffer = void 0; const FStripDataFlags_1 = require("../../../objects/engine/FStripDataFlags"); const Versions_1 = require("../../../versions/Versions"); const Game_1 = require("../../../versions/Game"); const FStaticMeshUVItem_1 = require("./FStaticMeshUVItem"); const Exceptions_1 = require("../../../../exceptions/Exceptions"); class FStaticMeshVertexBuffer { constructor(Ar = null) { if (Ar != null) { this.stripFlags = new FStripDataFlags_1.FStripDataFlags(Ar, Versions_1.VER_UE4_STATIC_SKELETAL_MESH_SERIALIZATION_FIX); this.numTexCoords = Ar.readInt32(); this.stride = Ar.game < Game_1.Game.GAME_UE4(19) ? Ar.readInt32() : -1; this.numVertices = Ar.readInt32(); this.useFullPrecisionUVs = Ar.readBoolean(); this.useHighPrecisionTangentBasis = Ar.game >= Game_1.Game.GAME_UE4(12) ? Ar.readBoolean() : false; if (!this.stripFlags.isDataStrippedForServer) { if (Ar.game < Game_1.Game.GAME_UE4(19)) this.uv = Ar.readBulkArray(() => new FStaticMeshUVItem_1.FStaticMeshUVItem(Ar, this.useHighPrecisionTangentBasis, this.numTexCoords, this.useFullPrecisionUVs)); else { // Tangents: simulate TArray::BulkSerialize() let itemSize = Ar.readInt32(); let itemCount = Ar.readInt32(); if (itemCount != this.numVertices) throw new Exceptions_1.ParserException(`FStaticMeshVertexBuffer: item count (${itemCount}) != num vertices (${this.numVertices})`); let pos = Ar.pos; this.uv = new Array(this.numVertices); for (let i = 0; i < this.numVertices; ++i) this.uv[i] = FStaticMeshUVItem_1.FStaticMeshUVItem.from(FStaticMeshUVItem_1.FStaticMeshUVItem.serializeTangents(Ar, this.useHighPrecisionTangentBasis), []); if (Ar.pos - pos != itemCount * itemSize) throw new Exceptions_1.ParserException(`FStaticMeshVertexBuffer: read wrong amount of tangent bytes: ${Ar.pos - pos}, should be ${itemCount * itemSize}`); // Texture coordinates: simulate TArray::BulkSerialize() itemSize = Ar.readInt32(); itemCount = Ar.readInt32(); if (itemCount != this.numVertices * this.numTexCoords) throw new Exceptions_1.ParserException(`FStaticMeshVertexBuffer: item count (${itemCount}) != num vertices * num tex coords (${this.numVertices * this.numTexCoords})`); pos = Ar.pos; for (let i = 0; i < this.numVertices; ++i) this.uv[i].uv = FStaticMeshUVItem_1.FStaticMeshUVItem.serializeTexcoords(Ar, this.numTexCoords, this.useFullPrecisionUVs); if (Ar.pos - pos != itemCount * itemSize) throw new Exceptions_1.ParserException(`FStaticMeshVertexBuffer: read wrong amount of texcoord bytes: ${Ar.pos - pos}, should be ${itemCount * itemSize}`); } } else this.uv = []; } } static from(stripFlags, numTexCoords, stride, numVertices, useFullPrecisionUVs, useHighPrecisionTangentBasis, uv) { const buffer = new FStaticMeshVertexBuffer(); buffer.stripFlags = stripFlags; buffer.numTexCoords = numTexCoords; buffer.stride = stride; buffer.numVertices = numVertices; buffer.useFullPrecisionUVs = useFullPrecisionUVs; buffer.useHighPrecisionTangentBasis = useHighPrecisionTangentBasis; buffer.uv = uv; return buffer; } } exports.FStaticMeshVertexBuffer = FStaticMeshVertexBuffer;