ordenació per buckets
This commit is contained in:
@@ -718,20 +718,15 @@ 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]) {
|
||||||
});
|
|
||||||
|
|
||||||
// Renderizar en orden de profundidad (fondo → frente)
|
|
||||||
for (size_t idx : render_order) {
|
|
||||||
SDL_FRect pos = balls[idx]->getPosition();
|
SDL_FRect pos = balls[idx]->getPosition();
|
||||||
Color color = theme_manager_->getInterpolatedColor(idx); // Usar color interpolado (LERP)
|
Color color = theme_manager_->getInterpolatedColor(idx); // Usar color interpolado (LERP)
|
||||||
float brightness = balls[idx]->getDepthBrightness();
|
float brightness = balls[idx]->getDepthBrightness();
|
||||||
@@ -747,6 +742,8 @@ void Engine::render() {
|
|||||||
|
|
||||||
addSpriteToBatch(pos.x, pos.y, pos.w, pos.h, r_mod, g_mod, b_mod, depth_scale);
|
addSpriteToBatch(pos.x, pos.y, pos.w, pos.h, r_mod, g_mod, b_mod, depth_scale);
|
||||||
}
|
}
|
||||||
|
depth_buckets_[b].clear(); // netejar per al proper frame
|
||||||
|
}
|
||||||
} 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)
|
||||||
const auto& balls = scene_manager_->getBalls();
|
const auto& balls = scene_manager_->getBalls();
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user