From 97c0683f6ece84cb416dcecb8fa69ba68e7459f4 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sat, 18 Oct 2025 19:16:33 +0200 Subject: [PATCH] fix: Restaurar fade lineal del alpha + renombrar constante MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restaura fade lineal para el alpha de los logos, eliminando el easing que hacía la transición casi imperceptible. Renombra constante para mayor claridad sobre lo que controla. Problema identificado: - El alpha usaba easeInOutQuad, acelerando la transición en el medio - Con 2 segundos, el easing hacía que el logo pareciera aparecer/ desaparecer instantáneamente sin fade visible - El usuario reportó "el logo termina y desaparece directamente" Solución implementada: 1. **Fade lineal restaurado**: - FADE_IN: alpha aumenta linealmente 0→255 - FADE_OUT: alpha disminuye linealmente 255→0 - Progreso visible y constante durante toda la duración 2. **Constante renombrada**: - `APPLOGO_FADE_DURATION` → `APPLOGO_ANIMATION_DURATION` - Nombre más claro: controla duración de toda la animación - Actualizado valor a 2.0 segundos (configurable por usuario) 3. **Animaciones mantienen easing**: - Zoom, rotación, squash, etc. siguen usando sus easings - Solo el alpha es lineal para fade visible Confirmaciones: ✅ Sistema time-based: usa delta_time correctamente ✅ Blend mode configurado: SDL_BLENDMODE_BLEND en todas las texturas ✅ Alpha se aplica: SDL_SetTextureAlphaMod en renderizado Resultado con APPLOGO_ANIMATION_DURATION = 2.0s: - t=0.0s → Alpha=0 (invisible) - t=0.5s → Alpha=64 (25% visible) - t=1.0s → Alpha=127 (50% visible) - t=1.5s → Alpha=191 (75% visible) - t=2.0s → Alpha=255 (100% visible) Nota: El logo solo se muestra en modos DEMO/DEMO_LITE/LOGO, no en SANDBOX. Para probar: ./vibe3_physics --mode demo 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- source/app_logo.cpp | 24 ++++++++++-------------- source/defines.h | 12 ++++++------ 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/source/app_logo.cpp b/source/app_logo.cpp index 958c1ba..6ea21ba 100644 --- a/source/app_logo.cpp +++ b/source/app_logo.cpp @@ -222,8 +222,8 @@ void AppLogo::update(float delta_time, AppMode current_mode) { // Fade in: alpha de 0 a 255, con Logo 2 retrasado 0.25s { // Calcular progreso de cada logo (Logo 2 con retraso) - float fade_progress_logo1 = timer_ / APPLOGO_FADE_DURATION; - float fade_progress_logo2 = std::max(0.0f, (timer_ - APPLOGO_LOGO2_DELAY) / APPLOGO_FADE_DURATION); + float fade_progress_logo1 = timer_ / APPLOGO_ANIMATION_DURATION; + float fade_progress_logo2 = std::max(0.0f, (timer_ - APPLOGO_LOGO2_DELAY) / APPLOGO_ANIMATION_DURATION); // Verificar si fade in completado (cuando logo2 también termina) if (fade_progress_logo2 >= 1.0f) { @@ -242,11 +242,9 @@ void AppLogo::update(float delta_time, AppMode current_mode) { logo2_stretch_x_ = 1.0f; logo2_rotation_ = 0.0f; } else { - // Interpolar alpha con retraso + easing para suavidad - float eased_prog1 = easeInOutQuad(std::min(1.0f, fade_progress_logo1)); - float eased_prog2 = easeInOutQuad(std::min(1.0f, fade_progress_logo2)); - logo1_alpha_ = static_cast(eased_prog1 * 255.0f); - logo2_alpha_ = static_cast(eased_prog2 * 255.0f); + // Interpolar alpha con retraso de forma LINEAL (sin easing) + logo1_alpha_ = static_cast(std::min(1.0f, fade_progress_logo1) * 255.0f); + logo2_alpha_ = static_cast(std::min(1.0f, fade_progress_logo2) * 255.0f); // ================================================================ // Aplicar MISMA animación (current_animation_) a ambos logos @@ -342,8 +340,8 @@ void AppLogo::update(float delta_time, AppMode current_mode) { // Fade out: alpha de 255 a 0, con Logo 2 retrasado 0.25s (misma animación que entrada) { // Calcular progreso de cada logo (Logo 2 con retraso) - float fade_progress_logo1 = timer_ / APPLOGO_FADE_DURATION; - float fade_progress_logo2 = std::max(0.0f, (timer_ - APPLOGO_LOGO2_DELAY) / APPLOGO_FADE_DURATION); + float fade_progress_logo1 = timer_ / APPLOGO_ANIMATION_DURATION; + float fade_progress_logo2 = std::max(0.0f, (timer_ - APPLOGO_LOGO2_DELAY) / APPLOGO_ANIMATION_DURATION); // Verificar si fade out completado (cuando logo2 también termina) if (fade_progress_logo2 >= 1.0f) { @@ -362,11 +360,9 @@ void AppLogo::update(float delta_time, AppMode current_mode) { logo2_stretch_x_ = 1.0f; logo2_rotation_ = 0.0f; } else { - // Interpolar alpha con retraso + easing para suavidad (255 → 0) - float eased_prog1 = easeInOutQuad(std::min(1.0f, fade_progress_logo1)); - float eased_prog2 = easeInOutQuad(std::min(1.0f, fade_progress_logo2)); - logo1_alpha_ = static_cast((1.0f - eased_prog1) * 255.0f); - logo2_alpha_ = static_cast((1.0f - eased_prog2) * 255.0f); + // Interpolar alpha con retraso de forma LINEAL (255 → 0, sin easing) + logo1_alpha_ = static_cast((1.0f - std::min(1.0f, fade_progress_logo1)) * 255.0f); + logo2_alpha_ = static_cast((1.0f - std::min(1.0f, fade_progress_logo2)) * 255.0f); // ================================================================ // Aplicar MISMA animación (current_animation_) de forma invertida diff --git a/source/defines.h b/source/defines.h index a24a8fc..ebb8ac8 100644 --- a/source/defines.h +++ b/source/defines.h @@ -289,12 +289,12 @@ constexpr float LOGO_FLIP_TRIGGER_MAX = 0.80f; // 80% máximo de progres constexpr int LOGO_FLIP_WAIT_PROBABILITY = 50; // 50% probabilidad de elegir el camino "esperar flip" // Configuración de AppLogo (logo periódico en pantalla) -constexpr float APPLOGO_DISPLAY_INTERVAL = 5.0f; // Intervalo entre apariciones del logo (segundos) -constexpr float APPLOGO_DISPLAY_DURATION = 10.0f; // Duración de visibilidad del logo (segundos) -constexpr float APPLOGO_FADE_DURATION = 1.9f; // Duración del fade in/out (segundos) -constexpr float APPLOGO_HEIGHT_PERCENT = 0.4f; // Altura del logo = 40% de la altura de pantalla -constexpr float APPLOGO_PADDING_PERCENT = 0.1f; // Padding desde esquina inferior-derecha = 10% -constexpr float APPLOGO_LOGO2_DELAY = 0.25f; // Retraso de Logo 2 respecto a Logo 1 (segundos) +constexpr float APPLOGO_DISPLAY_INTERVAL = 5.0f; // Intervalo entre apariciones del logo (segundos) +constexpr float APPLOGO_DISPLAY_DURATION = 10.0f; // Duración de visibilidad del logo (segundos) +constexpr float APPLOGO_ANIMATION_DURATION = 2.0f; // Duración de animación entrada/salida (segundos) +constexpr float APPLOGO_HEIGHT_PERCENT = 0.4f; // Altura del logo = 40% de la altura de pantalla +constexpr float APPLOGO_PADDING_PERCENT = 0.1f; // Padding desde esquina inferior-derecha = 10% +constexpr float APPLOGO_LOGO2_DELAY = 0.25f; // Retraso de Logo 2 respecto a Logo 1 (segundos) // Configuración de Modo BOIDS (comportamiento de enjambre) // TIME-BASED CONVERSION (frame-based → time-based):