#include "camera.hpp"


camera::camera()
{
    _a = _b = _c = 0;
}

//initialisation de la camera avec les float
camera::camera(float a = 0, float b = 0, float c = 0)
{
    _a = a;
    _b = b;
    _c = c;
}

//initialisation de la camera avec sont radius
camera::camera(float a = 0, float b = 0, float c = 0, float r = 0)
{
    _a = a;
    _b = b;
    _c = c;
    _r = r;
}

///////////////////////////////////////////Methodes Prives//////////////////////////////////////////////////////
//Effectue un mouvement de camera sur les axes principaux
void camera::_moveShell(shell &s)
{
    s.add(point(_x,_y,_z));
}

//Deplace la camera en fonction d'un autre point
void camera::_moveShell(shell &s, point p)
{
    s.add(p);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//rotation avec angle sur les X
void camera::turnX(float angle)
{
    _a = angle;
}

//rotation avec angle sur les Y
void camera::turnY(float angle)
{
    _b = angle;
}

//rotation avec angle sur les Z
void camera::turnZ(float angle)
{
    _c = angle;
}

//rotation globale
void camera::rot(shell &s)
{
    s.rotX(_a);
    s.rotY(_b);
    s.rotZ(_c);
}

//Deplacement sur les X
void camera::moveX(float X)
{
    _x = X;
}

//Deplacement sur les Y
void camera::moveY(float Y)
{
    _y = Y;
}

//Deplacement sur les Z
void camera::moveZ(float Z)
{
    _z = Z;
}

//Deplace la camera en fonction d'un autre point
void camera::moveTo(const point &p)
{
    setX(p.getX());
    setY(p.getY());
    setZ(p.getZ());
}

//Set le radius (champs de vision de la camera)
void camera::setRadius(float R)
{
    _r = R;
}

//Dessine une shape a l'ecrans
void camera::addShell(const shell &s)
{
    point p = *this;
    _temp = s;
    _moveShell(_temp);                                //fait les rotations sur la shape par rapport a la camera
    rot(_temp);

    if(_temp.getCenter().magSQ()>_r*_r)     //creer un "Range" de vue, evite d'afficher les objets qui sont trop loin
        return;

    for(int i=0;i<_temp.numLine();i++)         //pour chques point de la shape
    {
        point p1 = _temp.getLinePointA(i),     //determine les deux point a stacker
              p2 = _temp.getLinePointB(i);
        color c = _temp.getLineColor(i);                      //determine la coouleur de la ligne

        if(p1.getZ() > 0.1 && p2.getZ() > 0.1)
        {
            p1 = p1.deuxdee(800,1);
            p2 = p2.deuxdee(800,1);
            draw bob(p1.getX(),                                     //"Monte la ligne"
                     p1.getY(),
                     p2.getX(),
                     p2.getY(),
                     c.r, c.g, c.b);

            _stkLigne.push(bob);                                   //et stack toute les lignes
        }
    }
}

const camera::draw& camera::currentLine()
{
    return _stkLigne.top();
}

void camera::unmountBuffer()
{
    _stkLigne.pop();
}

bool camera::bufferEmpty()
{
    return _stkLigne.empty();
}

