summaryrefslogtreecommitdiffstats
path: root/slideshow/source/engine/OGLTrans/generic/OGLTrans_MatrixStackImpl.cxx
blob: 90cb08253084e1bce312da81be51e49042cf96ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
template<typename T>
class MatrixStack
{
    public:
        typedef T matrix_type;

    private:
        std::vector<matrix_type> stack;

    public:
        MatrixStack(void)
        {
            stack.push_back(matrix_type::identity());
        }

        void clear(void)
        {
            stack.clear();
            stack.push_back(matrix_type::identity());
        }

        size_t size(void) const
        {
            return stack.size();
        }

        void push(void)
        {
            matrix_type tmp = stack.back(); //required in case the stack's storage gets reallocated
            stack.push_back(tmp);
        }

        bool pop(void)
        {
            if (size() > 1)
            {
                stack.pop_back();
                return true;
            }
            else
            {
                return false;
            }
        }

        void load(const matrix_type& matrix)
        {
            stack.back() = matrix;
        }

        void loadIdentity(void)
        {
            load(matrix_type::identity());
        }

        void loadTransposed(const matrix_type& matrix)
        {
            load(transpose(matrix));
        }

        void mult(const matrix_type& matrix)
        {
            load(stack.back() * matrix);
        }

        void multTransposed(const matrix_type& matrix)
        {
            load(stack.back() * transpose(matrix));
        }

        const matrix_type& get(void) const
        {
            return stack.back();
        }
};