/*=========================================================
objet disk
par Martin Robinson
c'est l'objet qui contient le monde
le monde est rond. et plat
donc c'est un disque
===========================================================
preprocesseur*/

#pragma once
#ifndef _DISK
#define _DISK

#include <assert.h>
#include <vector>

#include "shell.hpp"
#include "point.hpp"


/*=========================================================
classe
=========================================================*/

class disk{
    vector<shell> _collection,
                  _world;
    float _radius,                          //limite du monde
           _floor,                          //plancher
           _ceil;                           //plafond
public:
    disk();                                 //constructeur
    //mutateur
    void addShell(const shell&);           //ajouter un model a la collection
    void placeShell(int , const point&);  //placer une instance de model sur le plateau
    void set(int,const shell&);           //modifier un instance de model sur le plateau
    void setRadius(float);                 //modifier la taille du monde
    void setFloor(float);                  //reniveler le plancher
    void setCeil(float);                   //reniveler le plafond
    void scale(float);                     //aggrandire le monde
    //getteur
    const shell& get(int)const;            //obtenir une instance de model
    int size()const;                        //obtenir le nombre d'instance de model
    const shell& model(int)const;          //obtenir un model
    int numModel()const;                    //obtenir le nombre de model
    float getRadius()const;                 //obtenir les limites du mondes
    //getteur collision detection
    bool worldWillCollide(int,const point&)const;               //collision entre les pieces d'un meme monde
    bool willCollide(const shell& ,const point&)const;          //collision entre une pieces exterieurs et le monde
    bool gettingOutOfTheWorld(const shell& ,const point&)const; //detection qu'une pieces sort du monde
    bool gettingBelowTheFloor(const shell& ,const point&)const; //detection qu'une pieces traverse le planché
    bool gettingOverTheTop(const shell& ,const point&)const;    //detection qu'une pieces dépasse la hauteur maximale
};

#endif
