#include "CMetroidModelInstance.hpp" #include "Graphics/CCubeSurface.hpp" #include "Streams/IOStreams.hpp" namespace metaforce { CMetroidModelInstance::CMetroidModelInstance(std::span modelHeader, const u8* materialData, std::span positions, std::span normals, std::span colors, std::span texCoords, std::span packedTexCoords, std::vector&& surfaces) : x4c_materialData(materialData), x50_surfaces(std::move(surfaces)) { { CMemoryInStream stream{modelHeader.data(), static_cast(modelHeader.size_bytes())}; x0_visorFlags = stream.ReadUint32(); x4_worldXf = stream.Get(); x34_worldAABB = stream.Get(); } { u32 numVertices = positions.size_bytes() / 12; x60_positions.reserve(numVertices); CMemoryInStream stream{positions.data(), static_cast(positions.size_bytes())}; for (u32 i = 0; i < numVertices; ++i) { x60_positions.push_back(stream.Get>()); } } { // Always short normals in MREA u32 numNormals = normals.size_bytes() / 6; x64_normals.reserve(numNormals); CMemoryInStream stream{normals.data(), static_cast(normals.size_bytes())}; for (u32 i = 0; i < numNormals; ++i) { x64_normals.push_back(stream.Get>()); } } { u32 numColors = colors.size_bytes() / 4; x68_colors.reserve(numColors); CMemoryInStream stream{colors.data(), static_cast(colors.size_bytes())}; for (u32 i = 0; i < numColors; ++i) { x68_colors.push_back(stream.ReadUint32()); } } { u32 numTexCoords = texCoords.size_bytes() / 8; x6c_texCoords.reserve(numTexCoords); CMemoryInStream stream{texCoords.data(), static_cast(texCoords.size_bytes())}; for (u32 i = 0; i < numTexCoords; ++i) { x6c_texCoords.push_back(stream.Get>()); } } { u32 numPackedTexCoords = packedTexCoords.size_bytes() / 4; x70_packedTexCoords.reserve(numPackedTexCoords); CMemoryInStream stream{packedTexCoords.data(), static_cast(packedTexCoords.size_bytes())}; for (u32 i = 0; i < numPackedTexCoords; ++i) { x70_packedTexCoords.push_back(stream.Get>()); } } } } // namespace metaforce