Exemple #1
0
 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);
        }
Exemple #3
0
 private void _RemoveSector(CachedSector sector)
 {
     if (_sectors.Contains(sector))
       {
     _msHelper.WriteSector(sector.LBA, sector.SectorData);
     _sectors.Remove(sector);
       }
 }