unreal.js
Version:
A pak reader for games like VALORANT & Fortnite written in Node.JS
62 lines (61 loc) • 3.94 kB
JavaScript
;
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;