//--------------------------------------------------------------------------------------
// Copyright (C) 2008 http://shift.delblanco.es
//--------------------------------------------------------------------------------------
// SHIFT Videogame is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by the
// Free Software Foundation, either version 3 of the License, or later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
//--------------------------------------------------------------------------------------
/// \file Menu.h
/// Clase para manejar la escena 3D del menú.
/// Fichero con la especificación de los atributos y funciones para la representación
/// de la escena 3D que se muestra durante el menú del juego
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __CMENU_H__
#define __CMENU_H__

//--------------------------------------------------------------------------------------
// Ficheros de cabecera
//--------------------------------------------------------------------------------------
#include "3DLight.h"
#include "3DMesh.h"
#include "3DObjArena.h"
#include "3DObjVehicle.h"
#include "Game.h"

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
/// Tipo de menú normal
#define     MENU_TYPE_MENU              1
/// Tipo de menú para seleccionar arena
#define     MENU_TYPE_SELECT_ARENA      2
/// Tipo de menú para seleccionar vehículo del jugador 1
#define     MENU_TYPE_SELECT_VEHICLE1   3
/// Tipo de menú para seleccionar vehículo del jugador 2
#define     MENU_TYPE_SELECT_VEHICLE2   4
/// Tipo de menú justo antes del juego
#define     MENU_TYPE_PREGAME           5
/// Tipo de menú para el modo juego
#define     MENU_TYPE_GAME              6
/// Tipo de menú para el modo pausa
#define     MENU_TYPE_PAUSE             7

/// Directorio dónde se deben buscar los ficheros descriptivos de las arenas del juego
#define     MENU_ARENAS_DIR             L".\\models\\arenas\\"
/// Directorio dónde se deben buscar los ficheros descriptivos de los vehículos del juego
#define     MENU_VEHICLES_DIR           L".\\models\\vehicles\\"
/// Extensión de los ficheros descriptivos de los modelos, tanto para arenas como para vehículos
#define     MENU_MODELS_EXTENSION       L".xml"

/// Periodo de tiempo para cambio de animación
#define     MENU_ANIM_SEG               7.0f

/// Tiempo de inicio de la cámara
#define     MENU_INI_CAMERA             2.0f

/// Velocidad de apagado de las luces
#define     MENU_LIGHTOFF_SPD           0.3f
/// Velocidad de encendido de las luces
#define     MENU_LIGHTON_SPD            0.3f

//--------------------------------------------------------------------------------------
/// Clase para manejar la escena 3D del menú.
//--------------------------------------------------------------------------------------
class CMenu
{

private:  // Campos miembro

    bool                 m_bInit;               ///< Flag que indica si el objeto está inicializado

    C3DLight             *m_pLight;             ///< Luz por defecto

    C3DObjArena	         *m_pScene;             ///< Escena del menú
    C3DObject	         *m_pLogo;              ///< Objeto con el logo del videojuego
    C3DObjArena	         *m_pArena;             ///< Arena seleccionada
    C3DObjVehicle	     *m_pVehicle1;          ///< Vehículo seleccionado para el jugador 1
    C3DObjVehicle	     *m_pVehicle2;          ///< Vehículo seleccionado para el jugador 2
    CGame                *m_pGame;              ///< Juego actual

    SDataGame             m_sDataGame;          ///< Información sobre el juego (tipo, jugadores y arena)

    float                 m_fTotalTime;         ///< Tiempo total transcurrido
    float                 m_fElapsedTime;       ///< Tiempo desde el último renderizado

    int                   m_iTipo;              ///< Tipo de menú mostrado
    int                   m_iEstadoAnim;        ///< Para las animaciones
    bool                  m_bLightIn;           ///< Flag que indica si la luz está apagada o encendida

    /// Para animar en el modo demo o pausa
    void AnimDemo(void);

public: // Métodos públicos

    /// Constructor
    CMenu(void);
    /// Destructor
    ~CMenu(void);

    /// Carga el menú ante un CreateDevice
    bool initialize();
    /// Renderiza el menú ante un FrameRender
    void render();
    /// Actualiza el menú ante un FrameMove
    void update();
    /// Restaura objetos ante un ResetDevice
    void restore();
    /// Libera objetos ante un LostDevice
    void free();
    /// Libera el menú ante un DestroyDevice
    void Release();

    /// Retorna la luz utilizada
    C3DLight      *getMLight(void)      {return m_pLight;}
    /// Retorna la arena actualmente seleccionada
    C3DObjArena   *getMArena(void)      {return m_pArena;}
    /// Retorna el vehículo del jugador 1 actualmente seleccionado
    C3DObjVehicle *getMVehicle1(void)   {return m_pVehicle1;}
    /// Retorna el vehículo del jugador 2 actualmente seleccionado
    C3DObjVehicle *getMVehicle2(void)   {return m_pVehicle2;}
    /// Retorna el juego actual
    CGame         *getMGame(void)       {return m_pGame;}

	/// Función observadora del tiempo total del menú
	float		  getTotalTime(void)    {return m_fTotalTime;}

    /// Para comenzar el juego
    bool setTypeMenu(int dTipo, LPCWSTR dStr = NULL, int dTipoGame = 0);
};

#endif