feat: add model / texture cooking

This commit is contained in:
2026-10-13 00:28:34 +02:00
parent 38230f5092
commit 0273340e3b
6 changed files with 249 additions and 21 deletions
+57
View File
@@ -0,0 +1,57 @@
#include "TextureCooker.h"
#include <cstdlib>
#include <memory>
#include <span>
#include <stdexcept>
#include <string>
#include <tinyexr.h>
#include <destrum/Assets/TextureFile.h>
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<float, decltype(&std::free)> pixels(rgba, &std::free);
const std::size_t floatCount = static_cast<std::size_t>(width) * static_cast<std::size_t>(height) * 4;
const TextureFile::Texture texture = TextureFile::FromRGBA32Float(
static_cast<std::uint32_t>(width),
static_cast<std::uint32_t>(height),
std::span<const float>(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;
}