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.