/// <summary>
        /// multyply this matrix by the given <see cref="T:Orts.Formats.Msts.matrix"/>
        /// </summary>
        /// <param name="m"></param>
        /// <returns></returns>
        /// <remarks>Also sums the offset vector</remarks>
        public matrix Mul(matrix m)
        {
            matrix ret;

            if (isUnity())
            {
                ret = m;
            }
            else if (isUnity(m))
            {
                ret = mat;
            }
            else
            {
                ret = new matrix();
                for (int j = 0; j < 3; j++)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        ret[j, k] = 0;
                        for (int n = 0; n < 3; n++)
                        {
                            ret[j, k] += mat[j, n] * m[n, k];
                        }
                    }
                }
            }
            PointEx pe = new PointEx(new point(m.DX, m.DY, m.DZ));
            point   p  = pe.Sum(new point(mat.DX, mat.DY, mat.DZ));

            ret.DX = p.X;
            ret.DY = p.Y;
            ret.DZ = p.Z;
            return(ret);
        }
        /// <summary>
        /// Multiply the given <see cref="T:Orts.Formats.Msts.point"/> by this matrix
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        /// <remarks>Also sums the offset vector</remarks>
        public point Mul(point p)
        {
            point ret;

            if (isUnity())
            {
                ret = p;
            }
            else
            {
                ret = new point(p.X * mat.AX + p.Y * mat.BX + p.Z * mat.CX,
                                p.X * mat.AY + p.Y * mat.BY + p.Z * mat.CY,
                                p.X * mat.AZ + p.Y * mat.BZ + p.Z * mat.CZ);
            }
            PointEx pe = new PointEx(ret);

            return(pe.Sum(new point(mat.DX, mat.DY, mat.DZ)));
        }