mat4 operator*(const mat4& value) const { mat4 right = value.transpose(); return mat4( vec4(m[0].dot(right.m[0]), m[0].dot(right.m[1]), m[0].dot(right.m[2]), m[0].dot(right.m[3])), vec4(m[1].dot(right.m[0]), m[1].dot(right.m[1]), m[1].dot(right.m[2]), m[1].dot(right.m[3])), vec4(m[2].dot(right.m[0]), m[2].dot(right.m[1]), m[2].dot(right.m[2]), m[2].dot(right.m[3])), vec4(m[3].dot(right.m[0]), m[3].dot(right.m[1]), m[3].dot(right.m[2]), m[3].dot(right.m[3])) ); }
vec4 operator*(const vec4 &v, const mat4 &a) { return a.transpose()*v; }
vec3 operator*(const vec3 &v, mat4 &a) { return a.transpose()*v; }