#include "LoaderSoundCurveIW4.h" #include "Game/IW4/IW4.h" #include "ObjLoading.h" #include "Parsing/Graph2D/Graph2DReader.h" #include "Pool/GlobalAssetPool.h" #include "Sound/SoundCurveCommon.h" #include #include #include #include using namespace IW4; namespace { class LoaderSoundCurve final : public AssetCreator { public: LoaderSoundCurve(MemoryManager& memory, ISearchPath& searchPath) : m_memory(memory), m_search_path(searchPath) { } AssetCreationResult CreateAsset(const std::string& assetName, AssetCreationContext& context) override { const auto fileName = sound_curve::GetFileNameForAssetName(assetName); const auto file = m_search_path.Open(fileName); if (!file.IsOpen()) return AssetCreationResult::NoAction(); const auto sndCurveData = graph2d::Read("sound curve", "SNDCURVE", *file.m_stream, fileName, assetName); if (!sndCurveData) return AssetCreationResult::Failure(); if (sndCurveData->knots.size() > std::extent_v) { std::cerr << std::format("Failed to load SndCurve \"{}\": Too many knots ({})\n", assetName, sndCurveData->knots.size()); return AssetCreationResult::Failure(); } auto* sndCurve = m_memory.Alloc(); sndCurve->filename = m_memory.Dup(assetName.c_str()); sndCurve->knotCount = static_cast(sndCurveData->knots.size()); for (auto i = 0u; i < std::extent_v; i++) { if (i < sndCurveData->knots.size()) { const auto& [x, y] = sndCurveData->knots[i]; sndCurve->knots[i][0] = static_cast(x); sndCurve->knots[i][1] = static_cast(y); } else { sndCurve->knots[i][0] = 0; sndCurve->knots[i][1] = 0; } } return AssetCreationResult::Success(context.AddAsset(assetName, sndCurve)); } private: MemoryManager& m_memory; ISearchPath& m_search_path; }; } // namespace namespace sound_curve { std::unique_ptr> CreateLoaderIW4(MemoryManager& memory, ISearchPath& searchPath) { return std::make_unique(memory, searchPath); } } // namespace sound_curve