// 4D vec4f operator+(const vec4f& v1, const vec4f &v2) { return vec4f(v1.peekx()+v2.peekx(), v1.peeky()+v2.peeky(), v1.peekz()+v2.peekz(), v1.peekw()+v2.peekw()); }
vec4f operator*(const vec4f& v1, const float& k){ return vec4f(v1.peekx()*k, v1.peeky()*k, v1.peekz()*k, v1.peekw()*k); }
void matmultvec4f(const float * matrix, const vec4f& v, vec4f& ssv) { ssv.x() = matrix[0] * v.peekx() + matrix[4] * v.peeky() + matrix[8] * v.peekz() + matrix[12] * v.peekw(); ssv.y() = matrix[1] * v.peekx() + matrix[5] * v.peeky() + matrix[9] * v.peekz() + matrix[13] * v.peekw(); ssv.z() = matrix[2] * v.peekx() + matrix[6] * v.peeky() + matrix[10] * v.peekz() + matrix[14] * v.peekw(); ssv.w() = matrix[3] * v.peekx() + matrix[7] * v.peeky() + matrix[11] * v.peekz() + matrix[15] * v.peekw(); }