#version 120
mat3 isorot3 (mat4 iso) { return mat3(iso); }
vec3 isotrans3 (mat4 iso) { return iso[3].xyz; }
mat3 isorotinv3 (mat4 iso) { return transpose(isorot3(iso)); }
vec3 isotransinv3(mat4 iso) { return -isotrans3(iso); }
mat4 isorot4 (mat4 iso) { return mat4(isorot3 (iso)); }
mat4 isorotinv4 (mat4 iso) { return mat4(isorotinv3 (iso)); }
vec4 isotrans4 (mat4 iso) { return vec4(isotrans3 (iso), 0); }
vec4 isotransinv4(mat4 iso) { return vec4(isotransinv3(iso), 0); }
mat4 isoinv(mat4 iso)
{
// mat4 inv = isorotinv4(iso);
// inv[3] += inv * isotransinv4(iso);
mat3 rotinv = isorotinv3(iso);
mat4 inv = mat4(rotinv);
inv[3].xyz = rotinv * isotransinv3(iso);
return inv;
}
#ifdef GLSLRUN
void main()
{
float phi = 1;
mat4 iso = transpose(mat4(
+cos(phi), -sin(phi), 0, 1,
+sin(phi), +cos(phi), 0, 2,
0, 0, 1, 3,
0, 0, 0, 1
));
vec4 vec = vec4(4, 5, 6, 1);
cout
<< iso * vec << endl
<< isorot4(iso) * vec + isotrans4(iso) << endl
<< isorot3(iso) * vec3(vec) + isotrans3(iso) << endl;
cout
<< inverse(iso) << endl
<< isoinv (iso) << endl;
}
#endif // GLSLRUN