Files
vibe3_physics/source
Sergio Valor f93879b803 Refactor fase 2: Extraer SceneManager de Engine
Migra toda la lógica de gestión de bolas y física a SceneManager
siguiendo el principio de Single Responsibility (SRP).

## Archivos Nuevos

**source/scene/scene_manager.h:**
- Declaración de clase SceneManager
- Gestión de bolas (creación, destrucción, actualización)
- Control de gravedad direccional y estado
- Métodos de acceso: getBalls(), getBallsMutable(), getFirstBall()
- Constructor: SceneManager(screen_width, screen_height)

**source/scene/scene_manager.cpp:**
- Implementación de lógica de escena (~200 líneas)
- changeScenario(): Crea N bolas según escenario
- pushBallsAwayFromGravity(): Impulso direccional
- switchBallsGravity(), forceBallsGravityOn/Off()
- changeGravityDirection(): Cambio de dirección física
- updateBallTexture(): Actualiza textura y tamaño
- updateScreenSize(): Ajusta resolución de pantalla
- updateBallSizes(): Reescala pelotas desde centro

## Archivos Modificados

**source/engine.h:**
- Agregado: #include "scene/scene_manager.h"
- Agregado: std::unique_ptr<SceneManager> scene_manager_
- Removido: std::vector<std::unique_ptr<Ball>> balls_
- Removido: GravityDirection current_gravity_
- Removido: int scenario_
- Removidos métodos privados: initBalls(), switchBallsGravity(),
  enableBallsGravityIfDisabled(), forceBallsGravityOn/Off(),
  changeGravityDirection(), updateBallSizes()

**source/engine.cpp:**
- initialize(): Crea scene_manager_ con resolución
- update(): Delega a scene_manager_->update()
- render(): Usa scene_manager_->getBalls()
- changeScenario(): Delega a scene_manager_
- pushBallsAwayFromGravity(): Delega a scene_manager_
- handleGravityToggle(): Usa scene_manager_->switchBallsGravity()
- handleGravityDirectionChange(): Delega dirección
- switchTextureInternal(): Usa updateBallTexture()
- toggleShapeModeInternal(): Usa getBallsMutable()
- activateShapeInternal(): Usa forceBallsGravityOff()
- updateShape(): Usa getBallsMutable() para asignar targets
- Debug HUD: Usa getFirstBall() para info
- toggleRealFullscreen(): Usa updateScreenSize() + changeScenario()
- performDemoAction(): Delega gravedad y escenarios
- randomizeOnDemoStart(): Delega changeScenario()
- toggleGravityOnOff(): Usa forceBallsGravity*()
- enterLogoMode(): Usa getBallCount() y changeScenario()
- exitLogoMode(): Usa updateBallTexture()
- Removidos ~150 líneas de implementación movidas a SceneManager

**CMakeLists.txt:**
- Agregado source/scene/*.cpp a file(GLOB SOURCE_FILES ...)

## Resultado

- Engine.cpp reducido de 2341 → ~2150 líneas (-191 líneas)
- SceneManager: 202 líneas de lógica de física/escena
- Separación clara: Engine coordina, SceneManager ejecuta física
- 100% funcional: Compila sin errores ni warnings
- Preparado para Fase 3 (UIManager)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-10 11:59:32 +02:00
..