//--------------------------------------------------------------------------------------
// 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
#define     MENU_TYPE_SELECT_VEHICLE    3
/// Tipo de menú justo antes del juego
#define     MENU_TYPE_PREGAME           4
/// Tipo de menú para el modo juego
#define     MENU_TYPE_GAME              5
/// Tipo de menú para el modo pausa
#define     MENU_TYPE_PAUSE             6

/// 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             0.5f

//--------------------------------------------------------------------------------------
/// 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_pVehicle;           ///< Vehículo seleccionado
    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 actualmente seleccionado
    C3DObjVehicle *getMVehicle(void)    {return m_pVehicle;}
    /// 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