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