vec4.h revision 1d4d8f94e2989b7c8667602304df9059d2701653
1bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio/*
2bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Copyright 2013 The Android Open Source Project
3bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio *
4bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Licensed under the Apache License, Version 2.0 (the "License");
5bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * you may not use this file except in compliance with the License.
6bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * You may obtain a copy of the License at
7bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio *
8bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio *      http://www.apache.org/licenses/LICENSE-2.0
9bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio *
10bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * Unless required by applicable law or agreed to in writing, software
11bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * distributed under the License is distributed on an "AS IS" BASIS,
12bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * See the License for the specific language governing permissions and
14bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio * limitations under the License.
15bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio */
16bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
17bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio#ifndef UI_VEC4_H
18bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio#define UI_VEC4_H
190ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
200ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette#include <stdint.h>
210ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette#include <sys/types.h>
22bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
23bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio#include <ui/vec3.h>
240ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
250ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverettenamespace android {
2650eb025c2fea7e364e0be951ce8ba6ca605f901aAlan Viverette// -------------------------------------------------------------------------------------
27bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio
28bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Megliotemplate <typename T>
29bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglioclass tvec4 :   public TVecProductOperators<tvec4, T>,
30bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio                public TVecAddOperators<tvec4, T>,
310ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette                public TVecUnaryOperators<tvec4, T>,
320ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette                public TVecComparisonOperators<tvec4, T>,
33bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio                public TVecFunctions<tvec4, T>
34bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio{
35bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Megliopublic:
360ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    enum no_init { NO_INIT };
370ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    typedef T value_type;
380ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    typedef T& reference;
39bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    typedef T const& const_reference;
400ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    typedef size_t size_type;
410ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
420ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    union {
43bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        struct { T x, y, z, w; };
440ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette        struct { T s, t, p, q; };
45bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        struct { T r, g, b, a; };
460ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette        Impersonator< tvec2<T> > xy;
470ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette        Impersonator< tvec2<T> > st;
48bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        Impersonator< tvec2<T> > rg;
490ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette        Impersonator< tvec3<T> > xyz;
50e763c9bd6ed0ca46daafc21fc4313ebcad4bcafaAlan Viverette        Impersonator< tvec3<T> > stp;
510ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette        Impersonator< tvec3<T> > rgb;
520ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    };
530ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
54bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    enum { SIZE = 4 };
550ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    inline static size_type size() { return SIZE; }
560ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
570ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    // array access
58bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    inline T const& operator [] (size_t i) const { return (&x)[i]; }
590ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    inline T&       operator [] (size_t i)       { return (&x)[i]; }
600ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
610ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    // -----------------------------------------------------------------------
6250eb025c2fea7e364e0be951ce8ba6ca605f901aAlan Viverette    // we don't provide copy-ctor and operator= on purpose
630ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    // because we want the compiler generated versions
640ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
654612740ddc76b3518dc6d189d5f8b5b7f60e9d64Alan Viverette    // constructors
660ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
670ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    // leaves object uninitialized. use with caution.
68bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    explicit tvec4(no_init) { }
690ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
700ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    // default constructor
71bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    tvec4() : x(0), y(0), z(0), w(0) { }
720ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
730ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    // handles implicit conversion to a tvec4. must not be explicit.
74bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio    template<typename A>
750ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    tvec4(A v) : x(v), y(v), z(v), w(v) { }
760ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
770ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    template<typename A, typename B, typename C, typename D>
780ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    tvec4(A x, B y, C z, D w) : x(x), y(y), z(z), w(w) { }
790ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
800ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    template<typename A, typename B, typename C>
810ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    tvec4(const tvec2<A>& v, B z, C w) : x(v.x), y(v.y), z(z), w(w) { }
820ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
830ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    template<typename A, typename B>
840ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    tvec4(const tvec3<A>& v, B w) : x(v.x), y(v.y), z(v.z), w(w) { }
850ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
860ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    template<typename A>
870ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    explicit tvec4(const tvec4<A>& v) : x(v.x), y(v.y), z(v.z), w(v.w) { }
880ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
890ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    template<typename A>
900ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    tvec4(const Impersonator< tvec4<A> >& v)
9160b674e07bf7346a673abd4a5f40bddeca16e7ffAlan Viverette        : x(((const tvec4<A>&)v).x),
9260b674e07bf7346a673abd4a5f40bddeca16e7ffAlan Viverette          y(((const tvec4<A>&)v).y),
930ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette          z(((const tvec4<A>&)v).z),
940ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette          w(((const tvec4<A>&)v).w) { }
950ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
960ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    template<typename A, typename B>
9750eb025c2fea7e364e0be951ce8ba6ca605f901aAlan Viverette    tvec4(const Impersonator< tvec3<A> >& v, B w)
98bd9152f6ee156ee473f05f6f05f238605996fca4Fabrice Di Meglio        : x(((const tvec3<A>&)v).x),
99e763c9bd6ed0ca46daafc21fc4313ebcad4bcafaAlan Viverette          y(((const tvec3<A>&)v).y),
1000ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette          z(((const tvec3<A>&)v).z),
1010ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette          w(w) { }
1020ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
1030ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    template<typename A, typename B, typename C>
1040ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette    tvec4(const Impersonator< tvec2<A> >& v, B z, C w)
1050ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette        : x(((const tvec2<A>&)v).x),
1060ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette          y(((const tvec2<A>&)v).y),
1070ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette          z(z),
1080ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette          w(w) { }
1090ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette};
1100ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
1110ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette// ----------------------------------------------------------------------------------------
1120ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
1130ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverettetypedef tvec4<float> vec4;
1140ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
1150ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette// ----------------------------------------------------------------------------------------
1160ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette}; // namespace android
1170ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette
118e763c9bd6ed0ca46daafc21fc4313ebcad4bcafaAlan Viverette#endif /* UI_VEC4_H */
1190ef59ac0e57e9b99d174d4a53f7d9639357743acAlan Viverette