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); } } }