private unsafe List <RenderBatch> GetRenderBatches()
        {
            var collectionBatches =
                new List <RenderBatch>(sectionBuffers.SelectMany(x => x.Parts).Count());

            foreach (var sectionBuffer in sectionBuffers)
            {
                var mesh = sectionBuffer;

                foreach (var part in mesh.Parts)
                {
                    var batch = new RenderBatch
                    {
                        ElementStartIndex = part.StripStartIndex * sizeof(ushort),
                        ElementLength     = part.StripLength,
                        Shader            = new ShaderReference(
                            ShaderReference.ReferenceType.Halo2,
                            (int)RenderModel.Materials[part.Material].Shader.Ident),
                        PrimitiveType = PrimitiveType.TriangleStrip,
                        BatchObject   = mesh.TriangleBatch
                    };
                    var texcoordRange = RenderModel.CompressionInfo[0].ExtractTexcoordScaling();
                    batch.AssignUniform("TexcoordRangeUniform", texcoordRange);
                    batch.AssignUniform("WorldMatrixUniform", WorldMatrix);

                    if (InstanceBasisMatrices != null && InstanceBasisMatrices.Count > 0)
                    {
                        using (batch.BatchObject.Begin())
                        {
                            batch.BatchObject.BindBuffer(BufferTarget.ArrayBuffer,
                                                         batch.BatchObject.GetOrGenerateBuffer("instance data"));
                            batch.InstanceCount = InstanceBasisMatrices.Count;
                            batch.BatchObject.BufferVertexAttributeData(GetInstanceMatrices(), BufferUsageHint.StreamDraw);

                            var stride        = sizeof(Matrix4);
                            var sizeOfVector4 = sizeof(Vector4);
                            batch.BatchObject.VertexAttribArray(8, 4, VertexAttribPointerType.Float, false, stride,
                                                                sizeOfVector4 * 0);
                            batch.BatchObject.VertexAttribArray(9, 4, VertexAttribPointerType.Float, false, stride,
                                                                sizeOfVector4 * 1);
                            batch.BatchObject.VertexAttribArray(10, 4, VertexAttribPointerType.Float, false, stride,
                                                                sizeOfVector4 * 2);
                            batch.BatchObject.VertexAttribArray(11, 4, VertexAttribPointerType.Float, false, stride,
                                                                sizeOfVector4 * 3);

                            batch.BatchObject.VertexAttribDivisor(8, 1);
                            batch.BatchObject.VertexAttribDivisor(9, 1);
                            batch.BatchObject.VertexAttribDivisor(10, 1);
                            batch.BatchObject.VertexAttribDivisor(11, 1);
                        }
                    }
                    collectionBatches.Add(batch);
                }
            }
            return(collectionBatches);
        }
        private IEnumerable <RenderBatch> _RenderBatches( )
        {
            foreach (var sectionBuffer in sectionBuffers)
            {
                var mesh = sectionBuffer;

                foreach (var part in mesh.Parts)
                {
                    var texcoordRange = RenderModel.CompressionInfo[0].ExtractTexcoordScaling( );

                    var batch = new RenderBatch
                    {
                        ElementStartIndex = part.StripStartIndex * sizeof(ushort),
                        ElementLength     = part.StripLength
                    };

                    batch.AssignUniform("TexcoordRangeUniform", texcoordRange);
                    batch.AssignUniform("WorldMatrixUniform", WorldMatrix);
                    for (var i = 0; i < mesh.SectionBlock.SectionData[0].NodeMap.Length; ++i)
                    {
                        var inverseBindPoseMatrix =
                            Nodes.GetInverseBindPoseTransfrom(mesh.SectionBlock.SectionData[0].NodeMap[i].NodeIndex);
                        var poseMatrix =
                            Nodes.GetPoseTransfrom(mesh.SectionBlock.SectionData[0].NodeMap[i].NodeIndex);
                        var final = inverseBindPoseMatrix * poseMatrix;

                        batch.AssignUniform(string.Format("BoneMatrices[{0}]", i), final);
                    }

                    batch.Shader = new ShaderReference(
                        ShaderReference.ReferenceType.Halo2,
                        ( int )RenderModel.Materials[part.Material].Shader.Ident);
                    batch.PrimitiveType = PrimitiveType.TriangleStrip;
                    batch.BatchObject   = mesh.TriangleBatch;

                    yield return(batch);
                }
            }
        }