// shape_loader.cpp - Implementació del carregador con caché // © 2026 JailDesigner #include "core/graphics/shape_loader.hpp" #include #include "core/resources/resource_helper.hpp" namespace Graphics { // Inicialización de variables estàtiques std::unordered_map> ShapeLoader::cache_; std::string ShapeLoader::base_path_ = "data/shapes/"; auto ShapeLoader::load(const std::string& filename) -> std::shared_ptr { // Check cache first auto it = cache_.find(filename); if (it != cache_.end()) { std::cout << "[ShapeLoader] Cache hit: " << filename << '\n'; return it->second; // Cache hit } // Normalize path: "ship.shp" → "shapes/ship.shp" // "logo/letra_j.shp" → "shapes/logo/letra_j.shp" std::string normalized = filename; if (!normalized.starts_with("shapes/")) { // Doesn't start with "shapes/", so add it normalized = "shapes/" + normalized; } // Load from resource system std::vector data = Resource::Helper::loadFile(normalized); if (data.empty()) { std::cerr << "[ShapeLoader] Error: no s'ha pogut load " << normalized << '\n'; return nullptr; } // Convert bytes to string and parse std::string file_content(data.begin(), data.end()); auto shape = std::make_shared(); if (!shape->parseFile(file_content)) { std::cerr << "[ShapeLoader] Error: no s'ha pogut parsejar " << normalized << '\n'; return nullptr; } // Verify shape is valid if (!shape->isValid()) { std::cerr << "[ShapeLoader] Error: shape invàlida " << normalized << '\n'; return nullptr; } // Cache and return std::cout << "[ShapeLoader] Carregat: " << normalized << " (" << shape->getName() << ", " << shape->getNumPrimitives() << " primitives)" << '\n'; cache_[filename] = shape; return shape; } void ShapeLoader::clear_cache() { std::cout << "[ShapeLoader] Netejant caché (" << cache_.size() << " formes)" << '\n'; cache_.clear(); } auto ShapeLoader::get_cache_size() -> size_t { return cache_.size(); } auto ShapeLoader::resolvePath(const std::string& filename) -> std::string { // Si es un path absolut (comença con '/'), usar-lo directament if (!filename.empty() && filename[0] == '/') { return filename; } // Si ya conté el prefix base_path, usar-lo directament if (filename.starts_with(base_path_)) { return filename; } // Altrament, añadir base_path (ara suporta subdirectoris) return base_path_ + filename; } } // namespace Graphics