//--------------------------------------------------------------------------------------
// 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 3DPhyVehicle.h
/// Para manejar la física concreta de los vehículos.
/// Los vehículos tienen una física ligeramente diferente al resto de los objetos
//--------------------------------------------------------------------------------------
#pragma once
#ifndef __C3DPHYVEHICLE_H__
#define __C3DPHYVEHICLE_H__
class C3DObject;
class C3DObjVehicle;

//--------------------------------------------------------------------------------------
// Ficheros de cabecera
//--------------------------------------------------------------------------------------
#include "3DPhysics.h"

//--------------------------------------------------------------------------------------
// Constantes
//--------------------------------------------------------------------------------------
/// Coeficiente de rozamiento lineal para movimientos adicionales
#define     PHYVEHICLE_FRICTION_COEF			30

//--------------------------------------------------------------------------------------
/// Clase para manejar el sistema físico concreto de los vehículos.
//--------------------------------------------------------------------------------------
class C3DPhyVehicle : public C3DPhysics
{
friend C3DObjVehicle;

protected:  // Campos miembro

    C3DObjVehicle       *m_pVehicle;            ///< Vehículo asociado a esta física
    float               m_pAditionalLSpeed;		///< Magnitud de desplazamientos lineales adicionales
	D3DXVECTOR3			m_pAditionalLDirection;	///< Dirección de desplazamientos lineales adicionales

	/// Constructor privado, sólo se podrá crear desde una instancia 3DObject
    C3DPhyVehicle();
    /// Destructor
    ~C3DPhyVehicle();

public: // Métodos públicos

    /// Inicializa el sistema físico
    bool initialize(C3DObjVehicle *Vehicle);
    /// Aplica los parámetros físicos
    void update();

    /// Función observadora del vehículo asociado
    C3DObjVehicle *getVehicle(void)             {return m_pVehicle;}

    /// Toma la magnitud de desplazamientos lineales adicionales
    float getAditionalLSpeed (void)             {return m_pAditionalLSpeed;}
    /// Establece la magnitud de desplazamientos lineales adicionales
    void setAditionalLSpeed (float Val)         {m_pAditionalLSpeed = Val;}
    /// Añade a la magnitud de desplazamientos lineales adicionales
    void addAditionalLSpeed (float Val)         {m_pAditionalLSpeed = m_pAditionalLSpeed + Val;}

    /// Toma el vector normalizado de desplazamientos lineales adicionales
    D3DXVECTOR3 *getAditionalLDirection (void);

    /// Establece desplazamientos lineales adicionales para el vehículo
    void setAditionalL (D3DXVECTOR3 &Vec);

};

#endif
