#pragma once

#include "shared.hpp"
#include "vector.hpp"

namespace ace {
    template <typename T>
    class transform_matrix_base {
    public:
        transform_matrix_base & operator= (const transform_matrix_base& other) { _x = other.x(); _y = other.y(); _z = other.z(); _n = other.n();  return *this; }

        transform_matrix_base() {}
        transform_matrix_base(std::istream &stream_, uint32_t version = 68) : _x(stream_), _y(stream_), _z(stream_), _n(stream_) { }
        transform_matrix_base(ace::vector3<T> x_, ace::vector3<T> y_, ace::vector3<T> z_, ace::vector3<T> n_) : _x(x_), _y(y_), _z(z_), _n(n_) { }

        const ace::vector3<T> & x() const { return _x; }
        const ace::vector3<T> & y() const { return _y; }
        const ace::vector3<T> & z() const { return _z; }
        const ace::vector3<T> & n() const { return _n; }

        void x(const ace::vector3<T> val) { _x = val; }
        void y(const ace::vector3<T> val) { _y = val; }
        void z(const ace::vector3<T> val) { _z = val; }
        void n(const ace::vector3<T> val) { _n = val; }

    protected:
        ace::vector3<T> _x;
        ace::vector3<T> _y;
        ace::vector3<T> _z;
        ace::vector3<T> _n;
    };

    typedef transform_matrix_base<float> transform_matrix;
}