public void Initialize()
        {
            GL.ClearColor(0.5f, 0.5f, 0.5f, 1f);
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
            GL.Enable(EnableCap.Multisample);

            geoShader.Initialize(VertexShaders.MVPTransformed, FragmentShaders.SolidColor);
            spriteShader.Initialize(VertexShaders.MVPTransformed, FragmentShaders.Textured);

            texture.Allocate();

            origin.Allocate();
            origin.SetData(PrimitiveType.Lines,
                           new Vertex[]
            {
                new Vertex(-10000, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0),
                new Vertex(10000, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0),
                new Vertex(0, -10000, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0),
                new Vertex(0, 10000, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0)
            },
                           new int[] { 0, 1, 2, 3 },
                           false
                           );

            quad.Allocate();
        }
        public void Render(KBuild build, KAnimBank bank, int frameNumber)
        {
            Matrix4 modelMat     = Matrix4.Identity;
            Matrix4 pivotMat     = Matrix4.Identity;
            Matrix4 transformMat = Matrix4.Identity;


            geoShader.Activate();
            // Draw Origin
            geoShader.SetUniform("Model", ref modelMat);
            origin.Draw();

            if (frameNumber < 0 || frameNumber >= bank.FrameCount)
            {
                frameNumber = 0;
            }

            KAnimFrame frame = bank.Frames[frameNumber];

            Matrix4 frameMat = Matrix4.CreateTranslation(frame.X, frame.Y, 0);

            spriteShader.Activate();
            texture.Bind();

            for (int i = frame.ElementCount - 1; i >= 0; i--)
            {
                KAnimElement element = frame.Elements[i];
                string       symbol  = build.GetSymbolName(element.SymbolHash);
                if (symbol == null)
                {
                    continue;
                }
                KFrame sprite = build.GetFrame(symbol, element.FrameNumber);
                if (sprite == null)
                {
                    continue;
                }

                pivotMat = Matrix4.CreateTranslation(sprite.PivotX, sprite.PivotY, 0);

                transformMat = new Matrix4(
                    element.M00, -element.M10, 0, 0,
                    element.M01, -element.M11, 0, 0,
                    0, 0, -1, 0,
                    element.M02, -element.M12, 0, 1
                    );

                modelMat = halfScaleMat * pivotMat * transformMat;

                spriteShader.SetUniform("Model", ref modelMat);

                MakeQuadVBO(sprite.PivotWidth, sprite.PivotHeight, element.Red, element.Green, element.Blue, element.Alpha, sprite.GetUVRectangle(), out Vertex[] vertices, out int[] elements);
                quad.SetData(OpenTK.Graphics.OpenGL.PrimitiveType.Triangles, vertices, elements);

                quad.Draw();
            }
        }