public SectorBlockBuffer(Entities.Sector s, BrickTypeEnum block)
        {
            var nsbb = this;

            BrickType = block;

            nsbb.IsDisposed = false;

            nsbb.VertexBufferArrays = new int[6];
            nsbb.VertexBufferCounts = new int[6];

            nsbb.TexBufferArrays = new int[6];
            nsbb.TexBufferCounts = new int[6];

            GL.GenBuffers(6, nsbb.VertexBufferArrays);
            GL.GenBuffers(6, nsbb.TexBufferArrays);

            for (int i = 0; i < 6; i++)
            {
                var sectorBlocks = s.GetSectorBlocksFromSector((byte) block);
                var faceBlocks = (from x in sectorBlocks where x.Faces.Contains((Entities.SectorBlockFaces)i) select x).ToList();

                var points = new List<double>();
                var coords = new List<double>();

                foreach (var fb in faceBlocks)
                    points.AddRange((from x in fb.GetVerticiesByFace( (Entities.SectorBlockFaces)i) select x).ToList());

                nsbb.VertexBufferCounts[i] = points.Count / 3;

                foreach (var fb in faceBlocks)
                    coords.AddRange((from x in SectorBlock.GetTexCoordsByFace((Entities.SectorBlockFaces)i) select x).ToList());

                nsbb.TexBufferCounts[i] = coords.Count / 2;

                GL.BindBuffer(BufferTarget.ArrayBuffer, nsbb.VertexBufferArrays[i]);

                GL.BufferData(BufferTarget.ArrayBuffer,
                    new IntPtr(sizeof(double) * nsbb.VertexBufferCounts[i] * 3),
                    points.ToArray(),
                    BufferUsageHint.StaticDraw);

                GL.BindBuffer(BufferTarget.ArrayBuffer, nsbb.TexBufferArrays[i]);

                GL.BufferData(BufferTarget.ArrayBuffer,
                    new IntPtr(sizeof(double) * nsbb.TexBufferCounts[i] * 2),
                    coords.ToArray(),
                    BufferUsageHint.StaticDraw);
            }
        }
        public void Draw(BrickTypeEnum brickType)
        {
            var cursor = this;

            for (int i = 0; i < 6; i++)
            {
                lock (cursor.VisibleSectors)
                {
                    foreach (var s in cursor.VisibleSectors)
                    {
                        if(s.Item2.BrickType == brickType)
                            s.Item2.DrawSectorBlockBuffer((Entities.SectorBlockFaces)i);
                    }
                }
            }
        }
        public void SetBlock(long x, long y, long z, BrickTypeEnum bt)
        {
            var sBase = GetSectorBase(x, y, z);

            lock (Sectors)
            {

                var sector = (from sx in Sectors
                              where
                                  sx.XOffset == sBase.Item1
                                  && sx.YOffset == sBase.Item2
                                  && sx.ZOffset == sBase.Item3
                              select sx).FirstOrDefault();

                if (sector == null)
                {
                    sector = new Sector(sBase.Item1,
                        sBase.Item2,
                        sBase.Item3);
                    Sectors.Add(sector);
                }

                var sOffset = GetSectorOffset(x, y, z);

                sector.SetSectorBlock(sOffset.Item1, sOffset.Item2, sOffset.Item3, (byte)bt);
            }
        }