Example #1
0
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;
}