private void _RemoveSector(CachedSector sector) { if (_sectors.Contains(sector)) { _msHelper.WriteSector(sector.LBA, sector.SectorData); _sectors.Remove(sector); } }
private CachedSector GetCachedSector(Frame frame, Pair <int> sectorIndex) { CachedSector result; if (!SectorCache.TryGetValue(sectorIndex, out result)) { SectorCache.Add(sectorIndex, result = new CachedSector { SectorIndex = sectorIndex }); } if (result.FrameIndex == frame.Index) { return(result); } var sector = Environment.Obstructions[sectorIndex]; int lineCount = 0; foreach (var item in sector) { lineCount += item.Item.LineCount; } result.PrimitiveCount = lineCount * 2; result.VertexCount = lineCount * 4; result.IndexCount = lineCount * 6; if ((result.ObstructionVertexBuffer != null) && (result.ObstructionVertexBuffer.VertexCount < result.VertexCount)) { lock (Coordinator.CreateResourceLock) result.ObstructionVertexBuffer.Dispose(); result.ObstructionVertexBuffer = null; } if ((result.ObstructionIndexBuffer != null) && (result.ObstructionIndexBuffer.IndexCount < result.IndexCount)) { lock (Coordinator.CreateResourceLock) result.ObstructionIndexBuffer.Dispose(); result.ObstructionIndexBuffer = null; } if (result.ObstructionVertexBuffer == null) { lock (Coordinator.CreateResourceLock) result.ObstructionVertexBuffer = new DynamicVertexBuffer(frame.RenderManager.DeviceManager.Device, (new ShadowVertex().VertexDeclaration), result.VertexCount, BufferUsage.WriteOnly); } if (result.ObstructionIndexBuffer == null) { lock (Coordinator.CreateResourceLock) result.ObstructionIndexBuffer = new DynamicIndexBuffer(frame.RenderManager.DeviceManager.Device, IndexElementSize.SixteenBits, result.IndexCount, BufferUsage.WriteOnly); } using (var va = BufferPool <ShadowVertex> .Allocate(result.VertexCount)) using (var ia = BufferPool <short> .Allocate(result.IndexCount)) { var vb = va.Data; var ib = ia.Data; ArrayLineWriterInstance.SetOutput(vb, ib); foreach (var itemInfo in sector) { itemInfo.Item.GenerateLines(ArrayLineWriterInstance); } var linesWritten = ArrayLineWriterInstance.Finish(); if (linesWritten != lineCount) { throw new InvalidDataException("GenerateLines didn't generate enough lines based on LineCount"); } lock (Coordinator.UseResourceLock) { result.ObstructionVertexBuffer.SetData(vb, 0, result.VertexCount, SetDataOptions.Discard); result.ObstructionIndexBuffer.SetData(ib, 0, result.IndexCount, SetDataOptions.Discard); } } result.FrameIndex = frame.Index; return(result); }