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:
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user