#include "TextureCooker.h" #include #include #include #include #include #include #include bool TextureCooker::CookFileIfNeeded(const fs::path& source, const fs::path& output) const { if (!NeedsRebuild(source, output)) return false; float* rgba = nullptr; int width = 0; int height = 0; const char* error = nullptr; if (LoadEXR(&rgba, &width, &height, source.string().c_str(), &error) != TINYEXR_SUCCESS) { const std::string message = error ? error : "unknown error"; FreeEXRErrorMessage(error); throw std::runtime_error("TinyEXR failed to load '" + source.string() + "': " + message); } const std::unique_ptr pixels(rgba, &std::free); const std::size_t floatCount = static_cast(width) * static_cast(height) * 4; const TextureFile::Texture texture = TextureFile::FromRGBA32Float( static_cast(width), static_cast(height), std::span(pixels.get(), floatCount)); fs::create_directories(output.parent_path()); TextureFile::WriteToFile(texture, output); return true; } fs::path TextureCooker::MakeOutputPath(const fs::path& dstLikeSrc) { fs::path out = dstLikeSrc; out.replace_extension(dstLikeSrc.extension().string() + std::string(TextureFile::Extension)); return out; } bool TextureCooker::NeedsRebuild(const fs::path& source, const fs::path& output) { if (!fs::exists(output)) return true; if (fs::last_write_time(source) > fs::last_write_time(output)) return true; return TextureFile::ReadVersionFromFile(output) != TextureFile::Version; }