3#include <BufferStream.h>
8 BufferStreamReadOnly stream{data, size};
10 if (stream.read(this->version); this->version != 7) {
20 if (stream.read<int32_t>() != mdl.
checksum) {
27 stream.skip<int32_t>();
29 const auto bodyPartCount = stream.read<int32_t>();
30 const auto bodyPartOffset = stream.read<int32_t>();
32 for (
int i = 0; i < bodyPartCount; i++) {
33 const auto bodyPartPos = bodyPartOffset + i * ((
sizeof(int32_t) * 2));
34 stream.seek_u(bodyPartPos);
36 auto& bodyPart = this->
bodyParts.emplace_back();
38 const auto modelCount = stream.read<int32_t>();
39 const auto modelOffset = stream.read<int32_t>();
41 for (
int j = 0; j < modelCount; j++) {
42 const auto modelPos = modelOffset + j * (
sizeof(int32_t) * 2);
43 stream.seek_u(bodyPartPos + modelPos);
45 auto& model = bodyPart.models.emplace_back();
47 const auto modelLODCount = stream.read<int32_t>();
48 const auto modelLODOffset = stream.read<int32_t>();
50 for (
int k = 0; k < modelLODCount; k++) {
51 const auto modelLODPos = modelLODOffset + k * (
sizeof(int32_t) * 2 +
sizeof(
float));
52 stream.seek_u(bodyPartPos + modelPos + modelLODPos);
54 auto& modelLOD = model.modelLODs.emplace_back();
56 const auto meshCount = stream.read<int32_t>();
57 const auto meshOffset = stream.read<int32_t>();
59 stream.read(modelLOD.switchDistance);
61 for (
int l = 0; l < meshCount; l++) {
62 const auto meshPos = meshOffset + l * (
sizeof(int32_t) * 2 +
sizeof(
Mesh::Flags));
63 stream.seek_u(bodyPartPos + modelPos + modelLODPos + meshPos);
65 auto& mesh = modelLOD.meshes.emplace_back();
67 const auto stripGroupCount = stream.read<int32_t>();
68 const auto stripGroupOffset = stream.read<int32_t>();
70 stream.read(mesh.flags);
72 for (
int m = 0; m < stripGroupCount; m++) {
73 int stripGroupNumInts = 6;
75 stripGroupNumInts += 2;
77 const auto stripGroupPos = stripGroupOffset + m * (
sizeof(int32_t) * stripGroupNumInts +
sizeof(
StripGroup::Flags));
78 stream.seek_u(bodyPartPos + modelPos + modelLODPos + meshPos + stripGroupPos);
80 auto& stripGroup = mesh.stripGroups.emplace_back();
82 const auto vertexCount = stream.read<int32_t>();
83 const auto vertexOffset = stream.read<int32_t>();
85 auto stripGroupCurrentPos = stream.tell();
86 stream.seek_u(bodyPartPos + modelPos + modelLODPos + meshPos + stripGroupPos + vertexOffset);
87 for (
int n = 0; n < vertexCount; n++) {
88 auto& [meshVertexID] = stripGroup.vertices.emplace_back();
91 stream.skip<uint8_t>(4);
93 stream.read(meshVertexID);
96 stream.skip<int8_t>(3);
98 stream.seek_u(stripGroupCurrentPos);
100 const auto indexCount = stream.read<int32_t>();
101 const auto indexOffset = stream.read<int32_t>();
103 stripGroupCurrentPos = stream.tell();
104 stream.seek_u(bodyPartPos + modelPos + modelLODPos + meshPos + stripGroupPos + indexOffset);
105 for (
int n = 0; n < indexCount; n++) {
106 auto& index = stripGroup.indices.emplace_back();
109 stream.seek_u(stripGroupCurrentPos);
111 const auto stripCount = stream.read<int32_t>();
112 const auto stripOffset = stream.read<int32_t>();
114 stream.read(stripGroup.flags);
118 stream.skip<int32_t>(2);
121 stream.seek_u(bodyPartPos + modelPos + modelLODPos + meshPos + stripGroupPos + stripOffset);
122 for (
int n = 0; n < stripCount; n++) {
123 auto& strip = stripGroup.strips.emplace_back();
125 const auto indicesCount = stream.read<int32_t>();
126 stream.read(strip.indicesOffset);
128 strip.indices = std::span(stripGroup.indices.begin() + strip.indicesOffset, indicesCount);
130 const auto verticesCount = stream.read<int32_t>();
131 stream.read(strip.verticesOffset);
133 strip.vertices = std::span(stripGroup.vertices.begin() + strip.verticesOffset, verticesCount);
136 .read(strip.boneCount)
140 stream.skip<int32_t>(2);
144 stream.skip<int32_t>(2);
std::vector< BodyPart > bodyParts
uint16_t maxBonesPerTriangle
int32_t maxBonesPerVertex
bool open(const std::byte *data, std::size_t size, const MDL::MDL &mdl)
uint16_t maxBonesPerStrip