gitignore no ha deixat versionar cap fitxer de core
afegida gestió de ratolí
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
// shape_loader.cpp - Implementació del carregador amb caché
|
||||
// © 2025 Port a C++20 amb SDL3
|
||||
|
||||
#include "core/graphics/shape_loader.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace Graphics {
|
||||
|
||||
// Inicialització de variables estàtiques
|
||||
std::unordered_map<std::string, std::shared_ptr<Shape>> ShapeLoader::cache_;
|
||||
std::string ShapeLoader::base_path_ = "data/shapes/";
|
||||
|
||||
std::shared_ptr<Shape> ShapeLoader::load(const std::string& filename) {
|
||||
// Check cache first
|
||||
auto it = cache_.find(filename);
|
||||
if (it != cache_.end()) {
|
||||
std::cout << "[ShapeLoader] Cache hit: " << filename << std::endl;
|
||||
return it->second; // Cache hit
|
||||
}
|
||||
|
||||
// Resolve full path
|
||||
std::string fullpath = resolve_path(filename);
|
||||
|
||||
// Create and load shape
|
||||
auto shape = std::make_shared<Shape>();
|
||||
if (!shape->carregar(fullpath)) {
|
||||
std::cerr << "[ShapeLoader] Error: no s'ha pogut carregar " << filename
|
||||
<< std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Verify shape is valid
|
||||
if (!shape->es_valida()) {
|
||||
std::cerr << "[ShapeLoader] Error: forma invàlida " << filename
|
||||
<< std::endl;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Cache and return
|
||||
std::cout << "[ShapeLoader] Carregat: " << filename << " ("
|
||||
<< shape->get_nom() << ", " << shape->get_num_primitives()
|
||||
<< " primitives)" << std::endl;
|
||||
|
||||
cache_[filename] = shape;
|
||||
return shape;
|
||||
}
|
||||
|
||||
void ShapeLoader::clear_cache() {
|
||||
std::cout << "[ShapeLoader] Netejant caché (" << cache_.size() << " formes)"
|
||||
<< std::endl;
|
||||
cache_.clear();
|
||||
}
|
||||
|
||||
size_t ShapeLoader::get_cache_size() { return cache_.size(); }
|
||||
|
||||
std::string ShapeLoader::resolve_path(const std::string& filename) {
|
||||
// Si és un path absolut (comença amb '/'), usar-lo directament
|
||||
if (!filename.empty() && filename[0] == '/') {
|
||||
return filename;
|
||||
}
|
||||
|
||||
// Si ja conté el prefix base_path, usar-lo directament
|
||||
if (filename.find(base_path_) == 0) {
|
||||
return filename;
|
||||
}
|
||||
|
||||
// Altrament, afegir base_path (ara suporta subdirectoris)
|
||||
return base_path_ + filename;
|
||||
}
|
||||
|
||||
} // namespace Graphics
|
||||
Reference in New Issue
Block a user