private void CreateIndexBuffer(int triangleCount) { int indexSize = sizeof(int); if (m_indexBuffer == null || m_indexBuffer.Description.Size < triangleCount * 3 * indexSize) { if (m_indexBuffer != null) { m_indexBuffer.Dispose(); } m_indexBuffer = new IndexBuffer(MyRender.GraphicsDevice, triangleCount * 3 * indexSize, Usage.WriteOnly, Pool.Default, false); } int indexOffset = 0; m_meshes.Clear(); foreach (var pair in m_materialGroups) { var mesh = new MyRenderGroup() { IndexStart = indexOffset, Material = pair.Key }; foreach (var meshInfo in pair.Value) { // Copy indices var compoundIb = m_indexBuffer.Lock(indexOffset * indexSize, meshInfo.Mesh.TriCount * 3 * indexSize, LockFlags.None); var format = meshInfo.Model.IndexBuffer.Description.Format; Debug.Assert(format == Format.Index16 || format == Format.Index32); int modelIndexSize = format == Format.Index16 ? sizeof(short) : sizeof(int); var modelIb = meshInfo.Model.IndexBuffer.Lock(meshInfo.Mesh.IndexStart * modelIndexSize, meshInfo.Mesh.TriCount * 3 * modelIndexSize, LockFlags.ReadOnly); while (modelIb.RemainingLength > 0) { if (format == Format.Index16) { int index = modelIb.Read <short>() + meshInfo.VertexOffset; compoundIb.Write(index); } else { int index = modelIb.Read <int>() + meshInfo.VertexOffset; compoundIb.Write(index); } } m_indexBuffer.Unlock(); meshInfo.Model.IndexBuffer.Unlock(); mesh.TriangleCount += meshInfo.Mesh.TriCount; indexOffset += meshInfo.Mesh.TriCount * 3; } m_meshes.Add(mesh); } }
private void CreateIndexBuffer(int triangleCount) { int indexSize = sizeof(int); if (m_indexBuffer == null || m_indexBuffer.Description.Size < triangleCount * 3 * indexSize) { if (m_indexBuffer != null) m_indexBuffer.Dispose(); m_indexBuffer = new IndexBuffer(MyRender.GraphicsDevice, triangleCount * 3 * indexSize, Usage.WriteOnly, Pool.Default, false); } int indexOffset = 0; m_meshes.Clear(); foreach (var pair in m_materialGroups) { var mesh = new MyRenderGroup() { IndexStart = indexOffset, Material = pair.Key }; foreach (var meshInfo in pair.Value) { // Copy indices var compoundIb = m_indexBuffer.Lock(indexOffset * indexSize, meshInfo.Mesh.TriCount * 3 * indexSize, LockFlags.None); var format = meshInfo.Model.IndexBuffer.Description.Format; Debug.Assert(format == Format.Index16 || format == Format.Index32); int modelIndexSize = format == Format.Index16 ? sizeof(short) : sizeof(int); var modelIb = meshInfo.Model.IndexBuffer.Lock(meshInfo.Mesh.IndexStart * modelIndexSize, meshInfo.Mesh.TriCount * 3 * modelIndexSize, LockFlags.ReadOnly); while (modelIb.RemainingLength > 0) { if (format == Format.Index16) { int index = modelIb.Read<short>() + meshInfo.VertexOffset; compoundIb.Write(index); } else { int index = modelIb.Read<int>() + meshInfo.VertexOffset; compoundIb.Write(index); } } m_indexBuffer.Unlock(); meshInfo.Model.IndexBuffer.Unlock(); mesh.TriangleCount += meshInfo.Mesh.TriCount; indexOffset += meshInfo.Mesh.TriCount * 3; } m_meshes.Add(mesh); } }