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
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
pub mod converter;
pub mod finalizer;
pub mod types;

#[macro_export]
macro_rules! vec2 {
    ($($e: expr),+) => {
        {
            use $crate::macros::types;
            use $crate::macros::converter::Converter;
            use $crate::macros::finalizer::Finalizer;

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e);
            )+
            let f: $crate::vector::V2<_> = e.finalize();
            f
        }
    }
}

#[macro_export]
macro_rules! vec3 { ($($e: expr), +) => {
        {
            use $crate::macros::types;
            use $crate::macros::converter::Converter;
            use $crate::macros::finalizer::Finalizer;

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e);
            )+
            let f: $crate::vector::V3<_> = e.finalize();
            f
        }
    }
}

#[macro_export]
macro_rules! vec4 {
    ($($e: expr), +) => {
        {
            use $crate::macros::types; use $crate::macros::converter::Converter;
            use $crate::macros::finalizer::Finalizer;

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e);
            )+
            let f: $crate::vector::V4<_> = e.finalize();
            f
        }
    }
}

#[macro_export]
macro_rules! mat2 {
    ($e: expr) => {
        $crate::matrix::M2([[$e; 2]; 2])
    };
    ($e1: expr, $e2: expr, $e3: expr, $e4: expr) => {
        $crate::matrix::M2([[$e1, $e2], [$e3, $e4]])
    };
    ($($e1: expr),+; $($e2: expr),+) => {
        {
            use $crate::macros::types;
            use $crate::macros::converter::Converter;
            use $crate::macros::finalizer::Finalizer;
            use $crate::matrix::{self, FromVectors};

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e1);
            )+
            let v1: $crate::vector::V2<_> = e.finalize();

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e2);
            )+
            let v2: $crate::vector::V2<_> = e.finalize();

            matrix::M2::from_rows((v1, v2))
        }
    };
}

#[macro_export]
macro_rules! mat3 {
    ($e: expr) => {
        $crate::matrix::M3([[$e; 3]; 3])
    };
    ($e1: expr, $e2: expr, $e3: expr, $e4: expr, $e5: expr, $e6: expr, $e7: expr, $e8: expr, $e9: expr) => {
        $crate::matrix::M3([[$e1, $e2, $e3], [$e4, $e5, $e6], [$e7, $e8, $e9]])
    };
    ($($e1: expr),+; $($e2: expr),+; $($e3: expr),+) => {
        {
            use $crate::macros::types;
            use $crate::macros::converter::Converter;
            use $crate::macros::finalizer::Finalizer;
            use $crate::matrix::{self, FromVectors};

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e1);
            )+
            let v1: $crate::vector::V3<_> = e.finalize();

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e2);
            )+
            let v2: $crate::vector::V3<_> = e.finalize();

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e3);
            )+
            let v3: $crate::vector::V3<_> = e.finalize();

            matrix::M3::from_rows((v1, v2, v3))
        }
    };
}

#[macro_export]
macro_rules! mat4 {
    ($e: expr) => {
        $crate::matrix::M4([[$e; 4]; 4])
    };
    ($e1: expr, $e2: expr, $e3: expr, $e4: expr, $e5: expr, $e6: expr, $e7: expr, $e8: expr, $e9: expr, $e10: expr, $e11: expr, $e12: expr, $e13: expr, $e14: expr, $e15: expr, $e16: expr) => {
        $crate::matrix::M4([[$e1, $e2, $e3, $e4], [$e5, $e6, $e7, $e8], [$e9, $e10, $e11, $e12], [$e13, $e14, $e15, $e16]])
    };
    ($($e1: expr),+; $($e2: expr),+; $($e3: expr),+; $($e4: expr),+) => {
        {
            use $crate::macros::types;
            use $crate::macros::converter::Converter;
            use $crate::macros::finalizer::Finalizer;
            use $crate::matrix::{self, FromVectors};

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e1);
            )+
            let v1: $crate::vector::V4<_> = e.finalize();

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e2);
            )+
            let v2: $crate::vector::V4<_> = e.finalize();

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e3);
            )+
            let v3: $crate::vector::V4<_> = e.finalize();

            let e = types::EmptyConverter;
            $(
                let e = e.convert($e4);
            )+
            let v4: $crate::vector::V4<_> = e.finalize();

            matrix::M4::from_rows((v1, v2, v3, v4))
        }
    };
}