arx-convert
Version:
Converts various Arx Fatalis formats to JSON or YAML and back
72 lines • 2.63 kB
JavaScript
import { BinaryIO } from '../common/BinaryIO.js';
/**
* These are not bitwise flags, they cannot be combined
*
* @see https://github.com/arx/ArxLibertatis/blob/1.2.1/src/graphics/data/FTLFormat.h#L105
*/
export var ArxFaceType;
(function (ArxFaceType) {
ArxFaceType[ArxFaceType["Flat"] = 0] = "Flat";
ArxFaceType[ArxFaceType["Text"] = 1] = "Text";
ArxFaceType[ArxFaceType["DoubleSided"] = 2] = "DoubleSided";
})(ArxFaceType || (ArxFaceType = {}));
export class Face {
static readFrom(binary) {
const faceType = binary.readInt32();
binary.readUint32Array(3); // rgb - always [0, 0, 0]
const dataBlock1 = {
faceType,
vertexIdx: binary.readUint16Array(3),
textureIdx: binary.readInt16(),
u: binary.readFloat32Array(3),
v: binary.readFloat32Array(3),
};
binary.readInt16Array(3); // ou - ignored by Arx
binary.readInt16Array(3); // ov - ignored by Arx
const dataBlock2 = {
transval: binary.readFloat32(),
norm: binary.readVector3(),
};
binary.readVector3Array(3); // normals - ignored by Arx
binary.readFloat32(); // temp - ignored by Arx
return {
...dataBlock1,
...dataBlock2,
};
}
static accumulateFrom(face) {
const buffer = new ArrayBuffer(Face.sizeOf());
const binary = new BinaryIO(buffer);
binary.writeInt32(face.faceType);
binary.writeUint32Array([0, 0, 0]); // rgb
binary.writeUint16Array(face.vertexIdx);
binary.writeInt16(face.textureIdx);
binary.writeFloat32Array(face.u);
binary.writeFloat32Array(face.v);
binary.writeInt16Array([0, 0, 0]); // ou
binary.writeInt16Array([0, 0, 0]); // ov
binary.writeFloat32(face.transval ?? 0);
binary.writeVector3(face.norm);
binary.writeVector3Array([
// normals
{ x: 0, y: 0, z: 0 },
{ x: 0, y: 0, z: 0 },
{ x: 0, y: 0, z: 0 },
]);
binary.writeFloat32(0); // temp
return buffer;
}
static sizeOf() {
return (BinaryIO.sizeOfInt32() +
BinaryIO.sizeOfUint32Array(3) +
BinaryIO.sizeOfUint16Array(3) +
BinaryIO.sizeOfInt16() +
2 * BinaryIO.sizeOfFloat32Array(3) +
2 * BinaryIO.sizeOfInt16Array(3) +
BinaryIO.sizeOfFloat32() +
BinaryIO.sizeOfVector3() +
BinaryIO.sizeOfVector3Array(3) +
BinaryIO.sizeOfFloat32());
}
}
//# sourceMappingURL=Face.js.map