#include "../compile.h"
#include "../define.h"
#include "context.h"
#include "material.h"

namespace sleek
{
    namespace driver
    {
        material::material() noexcept : psize(1)
        {
            scale = math::vector3df(1);

            fac = rfc_off;
            ant = ral_off;
            mode = rmd_polygon;
            mat = rmt_solid;
            shd = rsd_smooth;

            for(u16 i = 0; i<reserved_texture; ++i)
                Texture.push_back(0);

            effect = 0;
        }

        material::~material() noexcept
        {
        }

        void material::setMode(const render_mode i) noexcept
        {
            mode = i;
        }

        void material::setShader(std::shared_ptr<identifier> i) noexcept
        {
            effect = i;
        }

        void material::setPointSize(const f32 i) noexcept
        {
            psize = i;
        }

        void material::setShadeModel(const u32 i) noexcept
        {
            shd = i;
        }

        void material::setFaceCulling(const u32 i) noexcept
        {
            fac = i;
        }

        void material::setMaterialRender(const u32 i) noexcept
        {
            mat = i;
        }

        void material::setAntialiasing(const u32 i) noexcept
        {
            ant = i;
        }

        void material::setScale(const math::vector3df &i) noexcept
        {
            scale = i;
        }

        void material::setTexture(const u32 i, identifier *t) noexcept
        {
            if(i<= reserved_texture)
                Texture[i] = t;
        }

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

        identifier* material::getTexture(u32 i) const noexcept
        {
            return Texture[i];
        }

        math::vector3df material::getScale() const noexcept
        {
            return scale;
        }

        u32 material::getMaterialRender() const noexcept
        {
            return mat;
        }

        u32 material::getAntialiasing() const noexcept
        {
            return ant;
        }

        u32 material::getFaceCulling() const noexcept
        {
            return fac;
        }

        u32 material::getShadeModel() const noexcept
        {
            return shd;
        }

        f32 material::getPointSize() const noexcept
        {
            return psize;
        }

        std::shared_ptr<identifier> material::getShader() const noexcept
        {
            return effect;
        }

        render_mode material::getMode() const noexcept
        {
            return mode;
        }
    }
}