whiteoutlib 0.1.3

Read and write Blizzard game assets from Rust: models (MDX, M2, M3), textures (BLP, DDS, PNG, JPEG, BMP, TGA, TIFF, GIF) and archives (CASC, MPQ).
Documentation

#include "../../../common/binary_writer.h"
#include "../binary_writer_visitor.h"

namespace whiteout {
namespace m2 {

using common::BinaryWriter;

void BinaryWriterVisitor::visit(const PHYSHeader& header) {
    writer.write(header.version);
}

void BinaryWriterVisitor::visit(const PHYTEntry& entry) {
    writer.write(entry.phyt);
}

void BinaryWriterVisitor::visit(const BODYEntry& entry) {
    writer.write(entry.type);
    writer.write(std::array<u8, 2>{0, 0});
    writer.write(entry.position);
    writer.write(entry.modelBoneIndex);
    writer.write(std::array<u8, 2>{0, 0});
    writer.write(entry.shapes_base);
    writer.write(entry.shapes_count);
}

void BinaryWriterVisitor::visit(const BDY2Entry& entry) {
    writer.write(entry.type);
    writer.write(std::array<u8, 2>{0, 0});
    writer.write(entry.position);
    writer.write(entry.modelBoneIndex);
    writer.write(std::array<u8, 2>{0, 0});
    writer.write(entry.shapes_base);
    writer.write(entry.shapes_count);
    writer.write(entry.massScale);
}

void BinaryWriterVisitor::visit(const BDY3Entry& entry) {
    writer.write(entry.type);
    writer.write(entry.boneIndex);
    writer.write(entry.position);
    writer.write(entry.shapeIndex);
    writer.write(std::array<u8, 2>{0, 0});
    writer.write(entry.shapesCount);
    writer.write(entry.mass);
    writer.write(entry.massScale);
    writer.write(entry.drag);
    writer.write(entry.angularDamping);
    writer.write(entry.linearDamping);
}

void BinaryWriterVisitor::visit(const BDY4Entry& entry) {
    writer.write(entry.type);
    writer.write(entry.boneIndex);
    writer.write(entry.position);
    writer.write(entry.shapeIndex);
    writer.write(std::array<u8, 2>{0, 0});
    writer.write(entry.shapesCount);
    writer.write(entry.mass);
    writer.write(entry.massScale);
    writer.write(entry.drag);
    writer.write(entry.angularDamping);
    writer.write(entry.linearDamping);
    writer.write(std::array<u8, 4>{0, 0, 0, 0});
}

void BinaryWriterVisitor::visit(const SHAPEntry& entry) {
    writer.write(entry.shapeType);
    writer.write(entry.shapeIndex);
    writer.write(std::array<u8, 4>{0, 0, 0, 0});
    writer.write(entry.friction);
    writer.write(entry.restitution);
    writer.write(entry.density);
}

void BinaryWriterVisitor::visit(const SHP2Entry& entry) {
    writer.write(entry.shapeType);
    writer.write(entry.shapeIndex);
    writer.write(std::array<u8, 4>{0, 0, 0, 0});
    writer.write(entry.friction);
    writer.write(entry.restitution);
    writer.write(entry.density);
    writer.write(entry.unk_14);
    writer.write(entry.unk_18);
    writer.write(entry.unk_1c);
    writer.write(entry.padding_1e);
}

void BinaryWriterVisitor::visit(const BOXSEntry& entry) {
    writer.write(entry.matrix.data);
    writer.write(entry.center);
}

void BinaryWriterVisitor::visit(const CAPSEntry& entry) {
    writer.write(entry.localPosition1);
    writer.write(entry.localPosition2);
    writer.write(entry.radius);
}

void BinaryWriterVisitor::visit(const SPHSEntry& entry) {
    writer.write(entry.localPosition);
    writer.write(entry.radius);
}

void BinaryWriterVisitor::visit(const PLYTNode& node) {
    writer.write(node.byte0);
    writer.write(node.byte1);
    writer.write(node.byte2);
    writer.write(node.byte3);
}

void BinaryWriterVisitor::visit(const PLYTData& data, const PLYTHeader& header) {

    for (const auto& vertex : data.vertices) {
        writer.write(vertex);
    }

    for (const auto& plane : data.facePlanes) {
        writer.write(plane);
    }

    for (const auto& node : data.nodes) {
        visit(node);
    }

    for (const auto& idx : data.faceIndices) {
        writer.write(idx);
    }
}

void BinaryWriterVisitor::visit(const PLYTEntry& entry) {
    const PLYTHeader& header = entry.header;
    writer.write(header.vertexCount);
    writer.write(std::array<u8, 4>{0, 0, 0, 0});
    writer.write(header.runtime_08_ptr);
    writer.write(header.faceCount);
    writer.write(std::array<u8, 4>{0, 0, 0, 0});
    writer.write(header.runtime_18_ptr);
    writer.write(header.runtime_20_ptr);
    writer.write(header.nodeCount);
    writer.write(std::array<u8, 4>{0, 0, 0, 0});
    writer.write(header.runtime_30_ptr);
    for (i32 i = 0; i < 6; ++i) {
        writer.write(header.bounds[i]);
    }

    visit(entry.data, header);
}

void BinaryWriterVisitor::visit(const JOINEntry& entry) {
    writer.write(entry.bodyAIdx);
    writer.write(entry.bodyBIdx);
    writer.write(std::array<u8, 4>{0, 0, 0, 0});
    writer.write(entry.jointType);
    writer.write(entry.jointId);
}

void BinaryWriterVisitor::visit(const Matrix3x4& matrix) {
    writer.write(matrix.data);
}

void BinaryWriterVisitor::visit(const WELJEntry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.angularFrequencyHz);
    writer.write(entry.angularDampingRatio);
}

void BinaryWriterVisitor::visit(const WLJ2Entry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.angularFrequencyHz);
    writer.write(entry.angularDampingRatio);
    writer.write(entry.linearFrequencyHz);
    writer.write(entry.linearDampingRatio);
}

void BinaryWriterVisitor::visit(const WLJ3Entry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.angularFrequencyHz);
    writer.write(entry.angularDampingRatio);
    writer.write(entry.linearFrequencyHz);
    writer.write(entry.linearDampingRatio);
    writer.write(entry.unk70);
}

void BinaryWriterVisitor::visit(const SPHJEntry& entry) {
    writer.write(entry.anchorA);
    writer.write(entry.anchorB);
    writer.write(entry.frictionTorque);
}

void BinaryWriterVisitor::visit(const SHOJEntry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.lowerTwistAngle);
    writer.write(entry.upperTwistAngle);
    writer.write(entry.coneAngle);
    writer.write(entry.maxMotorTorque);
    writer.write(entry.motorMode);
}

void BinaryWriterVisitor::visit(const SHJ2Entry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.lowerTwistAngle);
    writer.write(entry.upperTwistAngle);
    writer.write(entry.coneAngle);
    writer.write(entry.maxMotorTorque);
    writer.write(entry.motorMode);
    writer.write(entry.motorFrequencyHz);
    writer.write(entry.motorDampingRatio);
}

void BinaryWriterVisitor::visit(const PRSJEntry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.lowerLimit);
    writer.write(entry.upperLimit);
    writer.write(entry.unk_68);
    writer.write(entry.maxMotorForce);
    writer.write(entry.unk_70);
    writer.write(entry.motorMode);
}

void BinaryWriterVisitor::visit(const PRS2Entry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.lowerLimit);
    writer.write(entry.upperLimit);
    writer.write(entry.unk_68);
    writer.write(entry.maxMotorForce);
    writer.write(entry.unk_70);
    writer.write(entry.motorMode);
    writer.write(entry.motorFrequencyHz);
    writer.write(entry.motorDampingRatio);
}

void BinaryWriterVisitor::visit(const REVJEntry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.lowerAngle);
    writer.write(entry.upperAngle);
    writer.write(entry.maxMotorTorque);
    writer.write(entry.motorMode);
}

void BinaryWriterVisitor::visit(const REV2Entry& entry) {
    visit(entry.frameA);
    visit(entry.frameB);
    writer.write(entry.lowerAngle);
    writer.write(entry.upperAngle);
    writer.write(entry.maxMotorTorque);
    writer.write(entry.motorMode);
    writer.write(entry.motorFrequencyHz);
    writer.write(entry.motorDampingRatio);
}

void BinaryWriterVisitor::visit(const DSTJEntry& entry) {
    writer.write(entry.localAnchorA);
    writer.write(entry.localAnchorB);
    writer.write(entry.some_distance_factor);
}

void BinaryWriterVisitor::visit(const PHYVEntry& entry) {
    for (i32 i = 0; i < 6; ++i) {
        writer.write(entry.unk[i]);
    }
}

} // namespace m2
} // namespace whiteout