static bool LoadElu(LoaderState& State, const char* name) { // HACK: Don't load shadowbox if (strstr(name, "shadowbox") != nullptr) return false; State.ObjectData.emplace_back(); auto& dest = State.ObjectData.back(); bool ReachedEnd = false; DEFER([&] { if (!ReachedEnd) State.ObjectData.pop_back(); }); MZFile File; auto success = TryForEachPath(State.Paths, name, [&](auto& Path) { return File.Open(Path.c_str(), RealSpace2::g_pFileSystem); }); if (!success) { MLog("LoadElu -- Failed to open elu file %s\n", name); return false; } EluHeader hdr; File.Read(hdr); dest.Meshes.reserve(hdr.meshCount); for (u32 i = 0; i < hdr.meshCount; ++i) { dest.Meshes.emplace_back(); auto& Mesh = dest.Meshes.back(); bool success{}; switch (hdr.Version) { case 0x5012: success = LoadMesh5012(File, Mesh); break; case 0x5013: success = LoadMesh5013(File, Mesh); break; default: DMLog("Unknown mesh version %X\n", hdr.Version); } if (!success) { MLog("Failed to load mesh index %d version %x for elu %s\n", i, hdr.Version, name); return false; } dest.VertexCount += Mesh.VertexCount; dest.IndexCount += Mesh.IndexCount; DMLog("%s mesh %s %d vert %d index\n", name, Mesh.Name.c_str(), Mesh.VertexCount, Mesh.IndexCount); for (size_t j{}; j < Mesh.DrawProps.size(); ++j) { auto& dp = Mesh.DrawProps[j]; DMLog("DrawProp %d: vb: %d, ib: %d, cnt: %d, mat: %d\n", j, dp.vertexBase, dp.indexBase, dp.count, dp.material); } } assert(File.Tell() == File.GetLength()); DMLog("%s -- Meshes.size() = %d\n", name, dest.Meshes.size()); dest.MaterialStart = State.Materials.size(); if (!loadMaterial(State, (std::string{ name } +".xml").c_str())) { MLog("Failed to load material for elu %s\n", name); return false; } dest.Name = name; State.EluMap[dest.Name] = State.ObjectData.size() - 1; ReachedEnd = true; return true; }