#pragma once template struct vec; template inline constexpr T magnitude(vec const& v) { return sqrt(dot(v, v)); } template inline constexpr T magnitude_squared(vec const& v) { return dot(v, v); } template inline constexpr vec normalize(vec const& v) { T d = 1.0f / magnitude(v); return v * d; } template inline constexpr vec<3, T> reflect(vec const& i, vec const& n) { return i - dot(n, i) * n * static_cast(2.0); }