#pragma once #include "gp_config.hpp" #include "gp/math/integer_math.hpp" #include "gp/math/q_math.hpp" #if !defined(NO_FP_MATH) # include "gp/math/fp_math.hpp" #endif namespace gp { template struct vec2_g { T x; T y; vec2_g( T _x, T _y ) : x{_x} , y{_y} {} vec2_g operator/(vec2_g rhs) { return { x / rhs.x, y / rhs.y }; } vec2_g operator+(vec2_g oth) { return {x+oth.x, y+oth.y}; } vec2_g normalize() { T ilen = fast_isqrt(x*x+y*y); return {x*ilen, y*ilen}; } }; template struct vec3_g { T x; T y; T z; vec3_g( T _x, T _y, T _z ) : x{_x} , y{_y} , z{_z} {} vec3_g(vec2_g left, T right) : x{left.x} , y{left.y} , z{right} {} vec3_g(T left, vec2_g right) : x{left} , y{right.x} , z{right.y} {} vec3_g operator/(vec3_g rhs) { return { x / rhs.x, y / rhs.y, z / rhs.z }; } vec3_g operator+(vec3_g oth) { return {x+oth.x, y+oth.y, z+oth.z}; } vec3_g normalize() { T ilen = fast_isqrt(x*x+y*y+z*z); return {x*ilen, y*ilen, z*ilen}; } }; template struct vec4_g { T x; T y; T z; T w; vec4_g( T _x, T _y, T _z, T _w ) : x{_x} , y{_y} , z{_z} , w{_w} {} vec4_g(T left, vec3_g<> right) : x{left} , y{right.x} , z{right.y} , w{right.z} {} vec4_g(vec3_g<> left, T right) : x{left.x} , y{left.y} , z{left.z} , w{right} {} vec4_g operator/(vec4_g rhs) { return { x / rhs.x, y / rhs.y, z / rhs.z, w / rhs.w }; } vec4_g operator+(vec4_g oth) { return {x+oth.x, y+oth.y, z+oth.z, w+oth.w}; } vec4_g normalize() { T ilen = fast_isqrt(x*x+y*y+z*z+w*w); return {x*ilen, y*ilen, z*ilen, w*ilen}; } }; template vec2_g operator*(vec2_g p, T v) { return {p.x*v, p.y*v}; } template vec3_g operator*(vec3_g p, T v) { return {p.x*v, p.y*v, p.z*v}; } template vec4_g operator*(vec4_g p, T v) { return {p.x*v, p.y*v, p.z*v, p.w*v}; } template vec2_g operator*(T v, vec2_g p) { return p*v; } template vec3_g operator*(T v, vec3_g p) { return p*v; } template vec4_g operator*(T v, vec4_g p) { return p*v; } }