Fix: Corregir interpolación LERP de temas dinámicos

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 <noreply@anthropic.com>
This commit is contained in:
2025-10-05 20:15:46 +02:00
parent 9a6cfdaaeb
commit 871bdf49ce

View File

@@ -1569,8 +1569,7 @@ void Engine::updateDynamicTheme() {
DynamicTheme& theme = dynamic_themes_[current_dynamic_theme_index_]; DynamicTheme& theme = dynamic_themes_[current_dynamic_theme_index_];
// Obtener keyframe actual y destino // Obtener keyframe destino para calcular duración
const DynamicThemeKeyframe& current_kf = theme.keyframes[current_keyframe_index_];
const DynamicThemeKeyframe& target_kf = theme.keyframes[target_keyframe_index_]; const DynamicThemeKeyframe& target_kf = theme.keyframes[target_keyframe_index_];
// Avanzar progreso de transición // Avanzar progreso de transición
@@ -1592,11 +1591,9 @@ void Engine::updateDynamicTheme() {
} }
} }
// Actualizar colores de pelotas al keyframe actual // NOTA: No se actualiza Ball::color_ aquí porque getInterpolatedColor()
for (size_t i = 0; i < balls_.size(); i++) { // calcula el color directamente desde los keyframes cada frame.
size_t color_index = i % current_kf.ball_colors.size(); // Cuando progress=1.0, getInterpolatedColor() devuelve exactamente el color destino.
balls_[i]->setColor(current_kf.ball_colors[color_index]);
}
} }
} }
@@ -1659,9 +1656,10 @@ Color Engine::getInterpolatedColor(size_t ball_index) const {
const DynamicThemeKeyframe& current_kf = theme.keyframes[current_keyframe_index_]; const DynamicThemeKeyframe& current_kf = theme.keyframes[current_keyframe_index_];
const DynamicThemeKeyframe& target_kf = theme.keyframes[target_keyframe_index_]; const DynamicThemeKeyframe& target_kf = theme.keyframes[target_keyframe_index_];
Color current_color = balls_[ball_index]->getColor(); // Obtener colores desde keyframes (NO desde Ball::color_)
size_t color_index = ball_index % target_kf.ball_colors.size(); size_t color_index = ball_index % current_kf.ball_colors.size();
Color target_color = target_kf.ball_colors[color_index]; 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 // Interpolar RGB entre keyframes
return { return {