#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<3, T> normalize(vec const& v) { return v / magnitude(v); } template inline constexpr vec<3, T> reflect(vec const& i, vec const& n) { return i - dot(n, i) * n * static_cast(2.0); }