#ifndef PHYSICS_LOW_LEVEL_DRIVER_HEADER
#define PHYSICS_LOW_LEVEL_DRIVER_HEADER

#include <math/matrix.h>
#include <math/vector.h>

#include <physics/low_level/common.h>
#include <physics/low_level/object.h>

namespace physics
{

namespace low_level
{

//forward declarations
class IMaterial;
class IScene;
class IShape;

///////////////////////////////////////////////////////////////////////////////////////////////////
///Драйвер физической системы
///////////////////////////////////////////////////////////////////////////////////////////////////
class IDriver : virtual public IObject
{
  public:
///////////////////////////////////////////////////////////////////////////////////////////////////
///Описание драйвера
///////////////////////////////////////////////////////////////////////////////////////////////////
    virtual const char* GetDescription () = 0;

///////////////////////////////////////////////////////////////////////////////////////////////////
///Создание сцены
///////////////////////////////////////////////////////////////////////////////////////////////////
    virtual IScene* CreateScene () = 0;

///////////////////////////////////////////////////////////////////////////////////////////////////
///Создание материала
///////////////////////////////////////////////////////////////////////////////////////////////////
    virtual IMaterial* CreateMaterial () = 0;

///////////////////////////////////////////////////////////////////////////////////////////////////
///Создание геометрических тел
///////////////////////////////////////////////////////////////////////////////////////////////////
    virtual IShape* CreateBoxShape          (const math::vec3f& half_dimensions) = 0;
    virtual IShape* CreateSphereShape       (float radius) = 0;
    virtual IShape* CreateCapsuleShape      (float radius, float height) = 0;
    virtual IShape* CreatePlaneShape        (const math::vec3f& normal, float d) = 0;
    virtual IShape* CreateConvexShape       (unsigned int vertices_count, const math::vec3f* vertices) = 0;
    virtual IShape* CreateTriangleMeshShape (unsigned int vertices_count, const math::vec3f* vertices, unsigned int triangles_count, unsigned int* triangles) = 0;
    virtual IShape* CreateCompoundShape     (unsigned int shapes_count, IShape** shapes, Transform* local_transforms) = 0;
};

///////////////////////////////////////////////////////////////////////////////////////////////////
///Менеджер драйверов физических систем
///////////////////////////////////////////////////////////////////////////////////////////////////
class DriverManager
{
  public:
///////////////////////////////////////////////////////////////////////////////////////////////////
///Регистрация систем
///////////////////////////////////////////////////////////////////////////////////////////////////
    static void RegisterDriver       (const char* name, IDriver* driver);
    static void UnregisterDriver     (const char* name);
    static void UnregisterAllDrivers ();

///////////////////////////////////////////////////////////////////////////////////////////////////
///Поиск системы по имени
///////////////////////////////////////////////////////////////////////////////////////////////////
    static IDriver* FindDriver (const char* name);
};

}

}

#endif
