ordenació per buckets

This commit is contained in:
2026-03-12 22:55:33 +01:00
parent 02fdcd4113
commit 6aa4a1227e
2 changed files with 23 additions and 22 deletions

View File

@@ -718,34 +718,31 @@ void Engine::render() {
// MODO FIGURA 3D: Ordenar por profundidad Z (Painter's Algorithm) // MODO FIGURA 3D: Ordenar por profundidad Z (Painter's Algorithm)
// Las pelotas con menor depth_brightness (más lejos/oscuras) se renderizan primero // Las pelotas con menor depth_brightness (más lejos/oscuras) se renderizan primero
// Crear vector de índices para ordenamiento // Bucket sort per profunditat Z (O(N) vs O(N log N))
std::vector<size_t> render_order;
render_order.reserve(balls.size());
for (size_t i = 0; i < balls.size(); i++) { for (size_t i = 0; i < balls.size(); i++) {
render_order.push_back(i); int b = static_cast<int>(balls[i]->getDepthBrightness() * (DEPTH_SORT_BUCKETS - 1));
depth_buckets_[std::clamp(b, 0, DEPTH_SORT_BUCKETS - 1)].push_back(i);
} }
// Ordenar índices por profundidad Z (menor primero = fondo primero) // Renderizar en orden de profundidad (bucket 0 = fons, bucket 255 = davant)
std::sort(render_order.begin(), render_order.end(), [&balls](size_t a, size_t b) { for (int b = 0; b < DEPTH_SORT_BUCKETS; b++) {
return balls[a]->getDepthBrightness() < balls[b]->getDepthBrightness(); for (size_t idx : depth_buckets_[b]) {
}); SDL_FRect pos = balls[idx]->getPosition();
Color color = theme_manager_->getInterpolatedColor(idx); // Usar color interpolado (LERP)
float brightness = balls[idx]->getDepthBrightness();
float depth_scale = balls[idx]->getDepthScale();
// Renderizar en orden de profundidad (fondo → frente) // Mapear brightness de 0-1 a rango MIN-MAX
for (size_t idx : render_order) { float brightness_factor = (ROTOBALL_MIN_BRIGHTNESS + brightness * (ROTOBALL_MAX_BRIGHTNESS - ROTOBALL_MIN_BRIGHTNESS)) / 255.0f;
SDL_FRect pos = balls[idx]->getPosition();
Color color = theme_manager_->getInterpolatedColor(idx); // Usar color interpolado (LERP)
float brightness = balls[idx]->getDepthBrightness();
float depth_scale = balls[idx]->getDepthScale();
// Mapear brightness de 0-1 a rango MIN-MAX // Aplicar factor de brillo al color
float brightness_factor = (ROTOBALL_MIN_BRIGHTNESS + brightness * (ROTOBALL_MAX_BRIGHTNESS - ROTOBALL_MIN_BRIGHTNESS)) / 255.0f; int r_mod = static_cast<int>(color.r * brightness_factor);
int g_mod = static_cast<int>(color.g * brightness_factor);
int b_mod = static_cast<int>(color.b * brightness_factor);
// Aplicar factor de brillo al color addSpriteToBatch(pos.x, pos.y, pos.w, pos.h, r_mod, g_mod, b_mod, depth_scale);
int r_mod = static_cast<int>(color.r * brightness_factor); }
int g_mod = static_cast<int>(color.g * brightness_factor); depth_buckets_[b].clear(); // netejar per al proper frame
int b_mod = static_cast<int>(color.b * brightness_factor);
addSpriteToBatch(pos.x, pos.y, pos.w, pos.h, r_mod, g_mod, b_mod, depth_scale);
} }
} else { } else {
// MODO PHYSICS: Renderizar en orden normal del vector (sin escala de profundidad) // MODO PHYSICS: Renderizar en orden normal del vector (sin escala de profundidad)

View File

@@ -223,6 +223,10 @@ class Engine {
std::vector<SDL_Vertex> batch_vertices_; std::vector<SDL_Vertex> batch_vertices_;
std::vector<int> batch_indices_; std::vector<int> batch_indices_;
// Bucket sort per z-ordering (SHAPE mode)
static constexpr int DEPTH_SORT_BUCKETS = 256;
std::array<std::vector<size_t>, DEPTH_SORT_BUCKETS> depth_buckets_;
// Configuración del sistema de texto (constantes configurables) // Configuración del sistema de texto (constantes configurables)
static constexpr const char* TEXT_FONT_PATH = "data/fonts/determination.ttf"; static constexpr const char* TEXT_FONT_PATH = "data/fonts/determination.ttf";
static constexpr int TEXT_BASE_SIZE = 24; // Tamaño base para 240p static constexpr int TEXT_BASE_SIZE = 24; // Tamaño base para 240p