local function mat_det(m) return m[13]*m[10]*m[7]*m[4]-m[9]*m[14]*m[7]*m[4]-m[13]*m[6]*m[11]*m[4]+m[5]*m[14]*m[11]*m[4]+m[9]*m[6]*m[15]*m[4]-m[5]*m[10]*m[15]*m[4]-m[13]*m[10]*m[3]*m[8]+m[9]*m[14]*m[3]*m[8]+m[13]*m[2]*m[11]*m[8]-m[1]*m[14]*m[11]*m[8]-m[9]*m[2]*m[15]*m[8]+m[1]*m[10]*m[15]*m[8]+m[13]*m[6]*m[3]*m[12]-m[5]*m[14]*m[3]*m[12]-m[13]*m[2]*m[7]*m[12]+m[1]*m[14]*m[7]*m[12]+m[5]*m[2]*m[15]*m[12]-m[1]*m[6]*m[15]*m[12]-m[9]*m[6]*m[3]*m[16]+m[5]*m[10]*m[3]*m[16]+m[9]*m[2]*m[7]*m[16]-m[1]*m[10]*m[7]*m[16]-m[5]*m[2]*m[11]*m[16]+m[1]*m[6]*m[11]*m[16] end local function mat_invert(m) local i,x = {},mat_det(m) assert(x ~= 0, "UNINVERTABLE MATRIX") x = 1 / x i[1]=(-m[14]*m[11]*m[8]+m[10]*m[15]*m[8]+m[14]*m[7]*m[12]-m[6]*m[15]*m[12]-m[10]*m[7]*m[16]+m[6]*m[11]*m[16])*x i[5]=(m[13]*m[11]*m[8]-m[9]*m[15]*m[8]-m[13]*m[7]*m[12]+m[5]*m[15]*m[12]+m[9]*m[7]*m[16]-m[5]*m[11]*m[16])*x i[9]=(-m[13]*m[10]*m[8]+m[9]*m[14]*m[8]+m[13]*m[6]*m[12]-m[5]*m[14]*m[12]-m[9]*m[6]*m[16]+m[5]*m[10]*m[16])*x i[13]=(m[13]*m[10]*m[7]-m[9]*m[14]*m[7]-m[13]*m[6]*m[11]+m[5]*m[14]*m[11]+m[9]*m[6]*m[15]-m[5]*m[10]*m[15])*x i[2]=(m[14]*m[11]*m[4]-m[10]*m[15]*m[4]-m[14]*m[3]*m[12]+m[2]*m[15]*m[12]+m[10]*m[3]*m[16]-m[2]*m[11]*m[16])*x i[6]=(-m[13]*m[11]*m[4]+m[9]*m[15]*m[4]+m[13]*m[3]*m[12]-m[1]*m[15]*m[12]-m[9]*m[3]*m[16]+m[1]*m[11]*m[16])*x i[10]=(m[13]*m[10]*m[4]-m[9]*m[14]*m[4]-m[13]*m[2]*m[12]+m[1]*m[14]*m[12]+m[9]*m[2]*m[16]-m[1]*m[10]*m[16])*x i[14]=(-m[13]*m[10]*m[3]+m[9]*m[14]*m[3]+m[13]*m[2]*m[11]-m[1]*m[14]*m[11]-m[9]*m[2]*m[15]+m[1]*m[10]*m[15])*x i[3]=(-m[14]*m[7]*m[4]+m[6]*m[15]*m[4]+m[14]*m[3]*m[8]-m[2]*m[15]*m[8]-m[6]*m[3]*m[16]+m[2]*m[7]*m[16])*x i[7]=(m[13]*m[7]*m[4]-m[5]*m[15]*m[4]-m[13]*m[3]*m[8]+m[1]*m[15]*m[8]+m[5]*m[3]*m[16]-m[1]*m[7]*m[16])*x i[11]=(-m[13]*m[6]*m[4]+m[5]*m[14]*m[4]+m[13]*m[2]*m[8]-m[1]*m[14]*m[8]-m[5]*m[2]*m[16]+m[1]*m[6]*m[16])*x i[15]=(m[13]*m[6]*m[3]-m[5]*m[14]*m[3]-m[13]*m[2]*m[7]+m[1]*m[14]*m[7]+m[5]*m[2]*m[15]-m[1]*m[6]*m[15])*x i[4]=(m[10]*m[7]*m[4]-m[6]*m[11]*m[4]-m[10]*m[3]*m[8]+m[2]*m[11]*m[8]+m[6]*m[3]*m[12]-m[2]*m[7]*m[12])*x i[8]=(-m[9]*m[7]*m[4]+m[5]*m[11]*m[4]+m[9]*m[3]*m[8]-m[1]*m[11]*m[8]-m[5]*m[3]*m[12]+m[1]*m[7]*m[12])*x i[12]=(m[9]*m[6]*m[4]-m[5]*m[10]*m[4]-m[9]*m[2]*m[8]+m[1]*m[10]*m[8]+m[5]*m[2]*m[12]-m[1]*m[6]*m[12])*x i[16]=(-m[9]*m[6]*m[3]+m[5]*m[10]*m[3]+m[9]*m[2]*m[7]-m[1]*m[10]*m[7]-m[5]*m[2]*m[11]+m[1]*m[6]*m[11])*x return i end local projection,noitcejorp function set_projection(...) projection = {...} noitcejorp = mat_invert(projection) end