Exploring more vectors
At some point later on in this book, you will need to utilize two- and four-component vectors as well. The two- and four-component vectors don't need any mathematical functions defined as they will be used exclusively as containers used to pass data to the GPU.
Unlike the three-component vector you have implemented, the two- and four-component vectors need to exist as both integer and floating point vectors. To avoid duplicating code, both structures will be implemented using a template:
- Create a new file,
vec2.h
, and add the definition of thevec2
struct. All thevec2
constructors are inline; there is no need for acpp
file. TheTVec2
struct is templated andtypedef
is used to declarevec2
andivec2
:template<typename T> struct TVec2 { union { struct { T x; T y; }; T v[2]; }; inline TVec2() : x(T(0)), y(T(0)) { } inline TVec2(T _x, T _y) : x(_x), y(_y) { } inline TVec2(T* fv) : x(fv[0]), y(fv[1]) { } }; typedef TVec2<float> vec2; typedef TVec2<int> ivec2;
- Similarly, create a
vec4.h
file, which will hold thevec4
structure:template<typename T> struct TVec4 { union { struct { T x; T y; T z; T w; }; T v[4]; }; inline TVec4<T>(): x((T)0),y((T)0),z((T)0),w((T)0){} inline TVec4<T>(T _x, T _y, T _z, T _w) : x(_x), y(_y), z(_z), w(_w) { } inline TVec4<T>(T* fv) : x(fv[0]), y(fv[ ]), z(fv[2]), w(fv[3]) { } }; typedef TVec4<float> vec4; typedef TVec4<int> ivec4; typedef TVec4<unsigned int> uivec4;
The declaration of the vec2
, ivec2
, vec4
, and ivec4
structs are all very similar to the declaration of the vec3
struct. All these structures can be accessed using component subscripts or as a pointer to a linear array of memory. They all have similar constructors, as well.