/**
	     * 从4*4矩阵设置数值
	     * 
	     * @param matrix
	     */
	    public void setValue(Matrix4 matrix)
	    {
		    if (matrix == null)
		    {
			    return;
		    }
		    for (int i = 0; i < data.Length; i++)
		    {
			    this.data[i] = matrix.data[i];
		    }
	    }
	    /**
	     * 4x4矩阵和本向量的乘积(结果会化成w=1)
	     * 
	     * @param m
	     *            矩阵
	     */
	    public void multiplyBy(Matrix4 m)
	    {
		    float wT = 1.0f / (m.data[Matrix4.M30] * x + m.data[Matrix4.M31] * y + m.data[Matrix4.M32] * z + m.data[Matrix4.M33]);
		    x = (m.data[Matrix4.M00] * x + m.data[Matrix4.M01] * y + m.data[Matrix4.M02] * z + m.data[Matrix4.M03]) * wT;
		    y = (m.data[Matrix4.M10] * x + m.data[Matrix4.M11] * y + m.data[Matrix4.M12] * z + m.data[Matrix4.M13]) * wT;
		    z = (m.data[Matrix4.M20] * x + m.data[Matrix4.M21] * y + m.data[Matrix4.M22] * z + m.data[Matrix4.M23]) * wT;
	    }
        public static void drawTextureImage(TextureImage textrueImage, RectangleF srcRect, RectangleF destRect, Matrix4 matrix,float alpha)
	    {
            alpha = MathUtil.limitNumber(alpha, 0, 1);
            //GLGraphics.setColor((uint)(0xFFFFFF | (((int)(alpha*255))<<24)));
            GL.Color4(1.0f, 1.0f, 1.0f, alpha);
            GL.PushMatrix();
            GL.Enable(EnableCap.Texture2D);
            GL.Enable(EnableCap.LineSmooth);

            //目标尺寸
            float _dw = destRect.Width;
            float _dh = destRect.Height;

            //贴图坐标
            float txW = textrueImage.TextureWidth;
            float txH = textrueImage.TextureHight;
            float ltX = srcRect.X / txW;
            float ltY = srcRect.Y / txH;
            float rbX = (srcRect.X + srcRect.Width) / txW;
            float rbY = (srcRect.Y + srcRect.Height) / txH;

            GL.BindTexture(TextureTarget.Texture2D, textrueImage._name);
            matrixDraw.identity();
            matrixDraw.preTranslate(destRect.X, destRect.Y);
            if (matrix != null)
            {
                matrix.multiply(matrixDraw, matrixDraw);
            }
            float[] data = matrixDraw.getValue();
            GL.MultMatrix(data);
            GL.Begin(BeginMode.Quads);
            GL.TexCoord2(ltX, ltY);
            GL.Vertex3(0, 0, 0);
            GL.TexCoord2(rbX, ltY);
            GL.Vertex3(_dw, 0, 0);
            GL.TexCoord2(rbX, rbY);
            GL.Vertex3(_dw, _dh, 0);
            GL.TexCoord2(ltX, rbY);
            GL.Vertex3(0, _dh, 0);
            GL.End();


            GL.Disable(EnableCap.Texture2D);
		    GL.PopMatrix();
	    }
 public Matrix4(Matrix4 t)
 {
     setData(t.data);
 }
	    /**
	     * 逆反矩阵,将结果赋值给指定结果
	     */
	    public bool inverse(Matrix4 res)
	    {
		    return inverse(this.getValue(), res.getValue());
	    }
	    /**
	     * 4x4矩阵转置(矩阵的行和列互换。)
	     */
	    public Matrix4 transpose()
	    {
		    Matrix4 m = new Matrix4();
		    for (int i = 0; i < 16; i++)
		    {
			    m.data[i] = data[TR[i]];
		    }
		    return m;
	    }
	    /**
	     * 两个4×4矩阵的乘积(当前矩阵左乘M,并将结果赋值给传入的矩阵。)
	     * 
	     * @param m
	     * @param res
	     */
	    public void multiply(Matrix4 m, Matrix4 res)
	    {
		    multiply(this.getValue(), m.getValue(), res.getValue());
	    }
	    /**
	     * 两个4×4矩阵的乘积,并将结果赋给当前矩阵(当前矩阵左乘M。)
	     * 
	     * @param m
	     */
	    public void multiply(Matrix4 m)
	    {
		    multiply(this.getValue(), m.getValue(), this.getValue());
	    }