#include "engine.h"
#include <algorithm>

namespace sleek
{
    namespace scene3d
    {
        engine::engine(device::Device *s, driver::driver *d) noexcept
            : screen(s), mom(d)
        {
            cm = new camera::Camera(screen);
            //setFog(100.f, 1000.f, 0.35f, texture::pixel(35,35,35,255));
        }

        engine::~engine() noexcept
        {
            clear();
            delete cm;
        }

        /* ***************************************** */

        Node *engine::addSceneNode(Node *t) noexcept
        {
            nd.push_back(t);
        }

        void engine::removeNode(Node *t) noexcept
        {
            for(auto i = nd.begin(); i != nd.end(); ++i)
            {
                if(*i == t)
                {
                    nd.erase(i);
                    break;
                }
            }
        }

        /* ***************************************** */

        void engine::clear() noexcept
        {
            while(nd.size())
                removeNode(getNode(0));
        }

        /* ***************************************** */

        void engine::render() noexcept
        {
            std::sort(nd.begin(), nd.end());
            cm->manage(screen->getCurrentEvent());
            cm->render();
            for(register u32 i = 0; i<nd.size(); ++i)
            {
                Node *tmp = nd[i];
                tmp->render();
            }
        }

        void engine::enableDebugDraw(bool a) noexcept
        {
            debug_draw = a;
        }

        bool engine::isDebugDraw() const noexcept
        {
            return debug_draw;
        }

        device::Device *engine::getDevice() const noexcept
        {
            return screen;
        }

        driver::driver *engine::getDrawManager() const noexcept
        {
            return mom;
        }

        camera::Camera *engine::getCamera() const noexcept
        {
            return cm;
        }
    }
}