public void Check(TilePropagator propagator) { var topology = propagator.Topology; foreach (var i in topology.Indicies) { topology.GetCoord(i, out var x, out var y, out var z); var x2 = topology.Width - 1 - x; foreach (var tile in propagator.TileModel.Tiles) { if (TileRotation.Rotate(tile, reflectX, out var tile2)) { if (propagator.IsBanned(x, y, z, tile) && !propagator.IsBanned(x2, y, z, tile2)) { propagator.Ban(x2, y, z, tile2); } } } } }
public void Check(TilePropagator propagator) { var topology = propagator.Topology; foreach (var i in changeTracker.GetChangedIndices()) { if (TryMapIndex(propagator, i, out var i2)) { topology.GetCoord(i, out var x, out var y, out var z); topology.GetCoord(i2, out var x2, out var y2, out var z2); foreach (var tile in propagator.TileModel.Tiles) { if (TryMapTile(tile, out var tile2)) { if (propagator.IsBanned(x, y, z, tile) && !propagator.IsBanned(x2, y, z, tile2)) { propagator.Ban(x2, y, z, tile2); } } } } } }
public Point GetRandomPoint(TilePropagator propagator) { var topology = propagator.Topology; var points = new List <Point>(); for (var z = 0; z < topology.Depth; z++) { for (var y = 0; y < topology.Height; y++) { for (var x = 0; x < topology.Width; x++) { if (topology.Mask != null) { var index = topology.GetIndex(x, y, z); if (!topology.Mask[index]) { continue; } } if (propagator.IsBanned(x, y, z, Tile)) { continue; } points.Add(new Point(x, y, z)); } } } // Choose a random point to select if (points.Count == 0) { throw new System.Exception($"No legal placement of {Tile}"); } var i = (int)(propagator.Random.NextDouble() * points.Count); return(points[i]); }