fix: Restaurar fade lineal del alpha + renombrar constante

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 <noreply@anthropic.com>
This commit is contained in:
2025-10-18 19:16:33 +02:00
parent c3d24cc07d
commit 97c0683f6e
2 changed files with 16 additions and 20 deletions

View File

@@ -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 // Fade in: alpha de 0 a 255, con Logo 2 retrasado 0.25s
{ {
// Calcular progreso de cada logo (Logo 2 con retraso) // Calcular progreso de cada logo (Logo 2 con retraso)
float fade_progress_logo1 = timer_ / APPLOGO_FADE_DURATION; float fade_progress_logo1 = timer_ / APPLOGO_ANIMATION_DURATION;
float fade_progress_logo2 = std::max(0.0f, (timer_ - APPLOGO_LOGO2_DELAY) / APPLOGO_FADE_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) // Verificar si fade in completado (cuando logo2 también termina)
if (fade_progress_logo2 >= 1.0f) { 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_stretch_x_ = 1.0f;
logo2_rotation_ = 0.0f; logo2_rotation_ = 0.0f;
} else { } else {
// Interpolar alpha con retraso + easing para suavidad // Interpolar alpha con retraso de forma LINEAL (sin easing)
float eased_prog1 = easeInOutQuad(std::min(1.0f, fade_progress_logo1)); logo1_alpha_ = static_cast<int>(std::min(1.0f, fade_progress_logo1) * 255.0f);
float eased_prog2 = easeInOutQuad(std::min(1.0f, fade_progress_logo2)); logo2_alpha_ = static_cast<int>(std::min(1.0f, fade_progress_logo2) * 255.0f);
logo1_alpha_ = static_cast<int>(eased_prog1 * 255.0f);
logo2_alpha_ = static_cast<int>(eased_prog2 * 255.0f);
// ================================================================ // ================================================================
// Aplicar MISMA animación (current_animation_) a ambos logos // 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) // 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) // Calcular progreso de cada logo (Logo 2 con retraso)
float fade_progress_logo1 = timer_ / APPLOGO_FADE_DURATION; float fade_progress_logo1 = timer_ / APPLOGO_ANIMATION_DURATION;
float fade_progress_logo2 = std::max(0.0f, (timer_ - APPLOGO_LOGO2_DELAY) / APPLOGO_FADE_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) // Verificar si fade out completado (cuando logo2 también termina)
if (fade_progress_logo2 >= 1.0f) { 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_stretch_x_ = 1.0f;
logo2_rotation_ = 0.0f; logo2_rotation_ = 0.0f;
} else { } else {
// Interpolar alpha con retraso + easing para suavidad (255 → 0) // Interpolar alpha con retraso de forma LINEAL (255 → 0, sin easing)
float eased_prog1 = easeInOutQuad(std::min(1.0f, fade_progress_logo1)); logo1_alpha_ = static_cast<int>((1.0f - std::min(1.0f, fade_progress_logo1)) * 255.0f);
float eased_prog2 = easeInOutQuad(std::min(1.0f, fade_progress_logo2)); logo2_alpha_ = static_cast<int>((1.0f - std::min(1.0f, fade_progress_logo2)) * 255.0f);
logo1_alpha_ = static_cast<int>((1.0f - eased_prog1) * 255.0f);
logo2_alpha_ = static_cast<int>((1.0f - eased_prog2) * 255.0f);
// ================================================================ // ================================================================
// Aplicar MISMA animación (current_animation_) de forma invertida // Aplicar MISMA animación (current_animation_) de forma invertida

View File

@@ -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" constexpr int LOGO_FLIP_WAIT_PROBABILITY = 50; // 50% probabilidad de elegir el camino "esperar flip"
// Configuración de AppLogo (logo periódico en pantalla) // 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_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_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_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_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_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_LOGO2_DELAY = 0.25f; // Retraso de Logo 2 respecto a Logo 1 (segundos)
// Configuración de Modo BOIDS (comportamiento de enjambre) // Configuración de Modo BOIDS (comportamiento de enjambre)
// TIME-BASED CONVERSION (frame-based → time-based): // TIME-BASED CONVERSION (frame-based → time-based):