void ConnectRooms(IntGrid2 room1, IntGrid2 room2, int z) { var v = room2.Center - room1.Center; bool horiz = Math.Abs(v.X) < Math.Abs(v.Y); CreateCorridor(room1.Center, room2.Center, z, horiz); }
void InvalidateXYPlane(int z) { //Console.WriteLine("invalidate z plane {0}", z); var rect = new IntGrid2(0, 0, this.Size.Width, this.Size.Height); foreach (var _p in rect.Range()) { var p = new IntVector3(_p.X, _p.Y, z); InvalidateChunk(p); } }
void InvalidateXZPlane(int y) { //Console.WriteLine("invalidate y plane {0}", y); var rect = new IntGrid2(0, 0, this.Size.Width, this.Size.Depth); foreach (var _p in rect.Range()) { var p = new IntVector3(_p.X, y, _p.Y); InvalidateChunk(p); } }
void InvalidateYZPlane(int x) { //Console.WriteLine("invalidate x plane {0}", x); var rect = new IntGrid2(0, 0, this.Size.Height, this.Size.Depth); foreach (var _p in rect.Range()) { var p = new IntVector3(x, _p.X, _p.Y); InvalidateChunk(p); } }
void CreateDungeonLevel(BSPTree bsp, int z) { var root = new IntGrid2(0, 0, m_size.Width, m_size.Height); CreateNodes(bsp, root, 0); var td = TileData.EmptyTileData; int leafs = MyMath.Pow2(bsp.Depth - 1); var rooms = new List <IntGrid2>(); // Shrink the full sized leaf nodes for rooms for (int l = 0; l < leafs; ++l) { int i = bsp.Length - l - 1; var n = bsp[i]; var grid = n.Grid; var xm = GetRandomDouble(0.2, 0.5); var ym = GetRandomDouble(0.2, 0.5); int columns = (int)((grid.Columns - 1) * xm); int rows = (int)((grid.Rows - 1) * ym); int x = m_random.Next(grid.Columns - columns) + grid.X; int y = m_random.Next(grid.Rows - rows) + grid.Y; n.Grid = new IntGrid2(x, y, columns, rows); bsp[i] = n; rooms.Add(n.Grid); } m_rooms[z] = rooms.ToArray(); for (int l = 0; l < leafs; ++l) { int i = bsp.Length - l - 1; var grid = bsp[i].Grid; foreach (var p2 in grid.Range()) { var p = new IntVector3(p2, z); SetTileData(p, td); } } Connect(bsp, 0, true, z); }
public static void Calculate(IntVector2 viewerLocation, int visionRange, Grid2D<bool> visibilityMap, IntSize2 mapSize, Func<IntVector2, bool> blockerDelegate) { visibilityMap.Clear(); if (blockerDelegate(viewerLocation) == true) return; var g = new IntGrid2(new IntVector2(), mapSize); g = g.Offset(-viewerLocation.X, -viewerLocation.Y); var vr = new IntVector2(visionRange, visionRange); g = g.Intersect(new IntGrid2(vr, -vr)); int visionRangeSquared = (visionRange + 1) * (visionRange + 1); // +1 to get a bit bigger view area foreach (var dst in g.Range()) { if (dst.X * dst.X + dst.Y * dst.Y > visionRangeSquared) continue; bool vis = FindLos(viewerLocation, dst, blockerDelegate); visibilityMap[dst] = vis; } }
void CreateNodes(BSPTree bsp, IntGrid2 grid, int i) { int middle; bool horiz; if (grid.Columns <= 4 && grid.Rows <= 4) { Debugger.Break(); throw new Exception(); } else if (grid.Columns <= 4) { horiz = true; } else if (grid.Rows <= 4) { horiz = false; } else { horiz = grid.Columns < grid.Rows; } double m = GetRandomDouble(0.4, 0.6); if (horiz) middle = (int)(grid.Rows * m); else middle = (int)(grid.Columns * m); bsp[i] = new BSPNode(grid, horiz); if (bsp.IsLeaf(i)) return; int left = bsp.GetLeft(i); int right = bsp.GetRight(i); if (horiz) { // up var g1 = new IntGrid2(grid.X, grid.Y, grid.Columns, middle); CreateNodes(bsp, g1, left); // down var g2 = new IntGrid2(grid.X, grid.Y + middle + 1, grid.Columns, grid.Rows - middle - 1); CreateNodes(bsp, g2, right); } else { // left var g1 = new IntGrid2(grid.X, grid.Y, middle, grid.Rows); CreateNodes(bsp, g1, left); // right var g2 = new IntGrid2(grid.X + middle + 1, grid.Y, grid.Columns - middle - 1, grid.Rows); CreateNodes(bsp, g2, right); } }
void CreateDungeonLevel(BSPTree bsp, int z) { var root = new IntGrid2(0, 0, m_size.Width, m_size.Height); CreateNodes(bsp, root, 0); var td = TileData.EmptyTileData; int leafs = MyMath.Pow2(bsp.Depth - 1); var rooms = new List<IntGrid2>(); // Shrink the full sized leaf nodes for rooms for (int l = 0; l < leafs; ++l) { int i = bsp.Length - l - 1; var n = bsp[i]; var grid = n.Grid; var xm = GetRandomDouble(0.2, 0.5); var ym = GetRandomDouble(0.2, 0.5); int columns = (int)((grid.Columns - 1) * xm); int rows = (int)((grid.Rows - 1) * ym); int x = m_random.Next(grid.Columns - columns) + grid.X; int y = m_random.Next(grid.Rows - rows) + grid.Y; n.Grid = new IntGrid2(x, y, columns, rows); bsp[i] = n; rooms.Add(n.Grid); } m_rooms[z] = rooms.ToArray(); for (int l = 0; l < leafs; ++l) { int i = bsp.Length - l - 1; var grid = bsp[i].Grid; foreach (var p2 in grid.Range()) { var p = new IntVector3(p2, z); SetTileData(p, td); } } Connect(bsp, 0, true, z); }
void UpdateSelectionRect() { if (!this.Selection.IsSelectionValid) { m_selectionRect.Visibility = Visibility.Hidden; return; } if (this.Selection.SelectionBox.Z1 > m_mapControl.Z || this.Selection.SelectionBox.Z2 < m_mapControl.Z) { m_selectionRect.Visibility = Visibility.Hidden; return; } var ir = new IntGrid2(this.Selection.SelectionStart.ToIntPoint(), this.Selection.SelectionEnd.ToIntPoint()); var r = m_mapControl.MapRectToScreenPointRect(ir); Canvas.SetLeft(m_selectionRect, r.Left); Canvas.SetTop(m_selectionRect, r.Top); m_selectionRect.Width = r.Width; m_selectionRect.Height = r.Height; m_selectionRect.Visibility = Visibility.Visible; }
public Rect MapRectToScreenPointRect(IntGrid2 ir) { Rect r = new Rect(MapTileToScreenPoint(new Point(ir.X1 - 0.5, ir.Y1 - 0.5)), new Size(ir.Columns * this.TileSize, ir.Rows * this.TileSize)); return r; }
public BSPNode(IntGrid2 grid, bool horiz) { this.Grid = grid; this.Horiz = horiz; }
void CreateNodes(BSPTree bsp, IntGrid2 grid, int i) { int middle; bool horiz; if (grid.Columns <= 4 && grid.Rows <= 4) { Debugger.Break(); throw new Exception(); } else if (grid.Columns <= 4) { horiz = true; } else if (grid.Rows <= 4) { horiz = false; } else { horiz = grid.Columns < grid.Rows; } double m = GetRandomDouble(0.4, 0.6); if (horiz) { middle = (int)(grid.Rows * m); } else { middle = (int)(grid.Columns * m); } bsp[i] = new BSPNode(grid, horiz); if (bsp.IsLeaf(i)) { return; } int left = bsp.GetLeft(i); int right = bsp.GetRight(i); if (horiz) { // up var g1 = new IntGrid2(grid.X, grid.Y, grid.Columns, middle); CreateNodes(bsp, g1, left); // down var g2 = new IntGrid2(grid.X, grid.Y + middle + 1, grid.Columns, grid.Rows - middle - 1); CreateNodes(bsp, g2, right); } else { // left var g1 = new IntGrid2(grid.X, grid.Y, middle, grid.Rows); CreateNodes(bsp, g1, left); // right var g2 = new IntGrid2(grid.X + middle + 1, grid.Y, grid.Columns - middle - 1, grid.Rows); CreateNodes(bsp, g2, right); } }
void CreateDungeonLevel(BSPTree bsp, int z) { var root = new IntGrid2(0, 0, m_size.Width, m_size.Height); CreateNodes(bsp, root, 0); var td = new TileData(); td.TerrainID = TerrainID.NaturalFloor; td.TerrainMaterialID = MaterialID.Granite; td.InteriorID = InteriorID.Empty; td.InteriorMaterialID = MaterialID.Undefined; int leafs = MyMath.Pow2(bsp.Depth - 1); var rooms = new List<IntGrid2>(); // Shrink the full sized leaf nodes for rooms for (int l = 0; l < leafs; ++l) { int i = bsp.Length - l - 1; var n = bsp[i]; var grid = n.Grid; var xm = GetRandomDouble(0.2, 0.5); var ym = GetRandomDouble(0.2, 0.5); int columns = (int)((grid.Columns - 1) * xm); int rows = (int)((grid.Rows - 1) * ym); int x = m_random.Next(grid.Columns - columns) + grid.X; int y = m_random.Next(grid.Rows - rows) + grid.Y; n.Grid = new IntGrid2(x, y, columns, rows); bsp[i] = n; rooms.Add(n.Grid); } m_rooms[z] = rooms.ToArray(); for (int l = 0; l < leafs; ++l) { int i = bsp.Length - l - 1; var grid = bsp[i].Grid; foreach (var p2 in grid.Range()) { var p = new IntPoint3(p2, z); var _td = GetTileData(p); if (_td.TerrainID == td.TerrainID) Debugger.Break(); SetTileData(p, td); } } Connect(bsp, 0, true, z); }