From 871bdf49cec0516a4ac1b180b7bd74a2c964f53c Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 5 Oct 2025 20:15:46 +0200 Subject: [PATCH] =?UTF-8?q?Fix:=20Corregir=20interpolaci=C3=B3n=20LERP=20d?= =?UTF-8?q?e=20temas=20din=C3=A1micos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PROBLEMA: Las pelotas cambiaban bruscamente de color durante transiciones de temas dinámicos en lugar de tener transiciones suaves. CAUSAS IDENTIFICADAS: 1. getInterpolatedColor() interpolaba desde Ball::color_ (obsoleto) en lugar de usar el color del keyframe actual 2. updateDynamicTheme() actualizaba Ball::color_ incorrectamente al final de cada transición SOLUCIÓN: ✅ getInterpolatedColor(): - Ahora interpola desde current_kf.ball_colors[index] - Hasta target_kf.ball_colors[index] - Elimina dependencia de Ball::color_ almacenado ✅ updateDynamicTheme(): - Elimina setColor() redundante al completar transición - getInterpolatedColor() ya calcula color correcto cada frame - Cuando progress=1.0, devuelve exactamente color destino RESULTADO: - Transiciones LERP suaves de 0% a 100% sin saltos bruscos - Interpolación correcta entre keyframes actual y destino - Coherencia entre renderizado y lógica de animación ARCHIVOS MODIFICADOS: - source/engine.cpp (2 funciones corregidas) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- source/engine.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/source/engine.cpp b/source/engine.cpp index 456eba7..1eb4ea0 100644 --- a/source/engine.cpp +++ b/source/engine.cpp @@ -1569,8 +1569,7 @@ void Engine::updateDynamicTheme() { DynamicTheme& theme = dynamic_themes_[current_dynamic_theme_index_]; - // Obtener keyframe actual y destino - const DynamicThemeKeyframe& current_kf = theme.keyframes[current_keyframe_index_]; + // Obtener keyframe destino para calcular duración const DynamicThemeKeyframe& target_kf = theme.keyframes[target_keyframe_index_]; // Avanzar progreso de transición @@ -1592,11 +1591,9 @@ void Engine::updateDynamicTheme() { } } - // Actualizar colores de pelotas al keyframe actual - for (size_t i = 0; i < balls_.size(); i++) { - size_t color_index = i % current_kf.ball_colors.size(); - balls_[i]->setColor(current_kf.ball_colors[color_index]); - } + // NOTA: No se actualiza Ball::color_ aquí porque getInterpolatedColor() + // calcula el color directamente desde los keyframes cada frame. + // Cuando progress=1.0, getInterpolatedColor() devuelve exactamente el color destino. } } @@ -1659,9 +1656,10 @@ Color Engine::getInterpolatedColor(size_t ball_index) const { const DynamicThemeKeyframe& current_kf = theme.keyframes[current_keyframe_index_]; const DynamicThemeKeyframe& target_kf = theme.keyframes[target_keyframe_index_]; - Color current_color = balls_[ball_index]->getColor(); - size_t color_index = ball_index % target_kf.ball_colors.size(); - Color target_color = target_kf.ball_colors[color_index]; + // Obtener colores desde keyframes (NO desde Ball::color_) + size_t color_index = ball_index % current_kf.ball_colors.size(); + Color current_color = current_kf.ball_colors[color_index]; // Color del keyframe actual + Color target_color = target_kf.ball_colors[color_index]; // Color del keyframe destino // Interpolar RGB entre keyframes return {