#include "asset_io.h" #include #include "platform/PackBackend.h" #include #include #include using namespace godot; namespace mtgodot { namespace { bool pack_name(const String &path, std::string &name) { if (!path.begins_with(PACK_SCHEME)) { return false; } name = path.substr(String(PACK_SCHEME).length()).utf8().get_data(); return true; } } // namespace PackedByteArray read_file(const String &path) { if (path.is_empty()) { return PackedByteArray(); } std::string name; if (pack_name(path, name)) { std::vector bytes; PackedByteArray out; if (mtpack40250::read(name, bytes)) { out.resize((int64_t)bytes.size()); if (!bytes.empty()) { std::memcpy(out.ptrw(), bytes.data(), bytes.size()); } } return out; } // FileAccess::get_file_as_bytes handles res:// / user:// / absolute OS paths. return FileAccess::get_file_as_bytes(path); } bool file_exists(const String &path) { std::string name; if (pack_name(path, name)) { return mtpack40250::exists(name); } return !path.is_empty() && FileAccess::file_exists(path); } Image dds_from_file(const String &path) { PackedByteArray b = read_file(path); if (b.is_empty()) { return Image{}; } return load_dds(b.ptr(), (size_t)b.size()); } std::optional gr2_from_file(const String &path, gr2::LoadError *err) { PackedByteArray b = read_file(path); if (b.is_empty()) { if (err) { *err = {"open", std::string("cannot read ") + path.utf8().get_data()}; } return std::nullopt; } return gr2::File::load(b.ptr(), (size_t)b.size(), err); } } // namespace mtgodot