private bool SetBlockFace(Tile3D.Block block, Vector3 normal, Tile3D.Face brush) { Undo.RecordObject(target, "SetBlockFaces"); for (int i = 0; i < Tile3D.Faces.Length; i++) { if (Vector3.Dot(normal, Tile3D.Faces[i]) > 0.8f) { if (!brush.Hidden) { if (brush != block.Faces[i]) { block.Faces[i] = brush; return(true); } } else if (!block.Faces[i].Hidden) { block.Faces[i].Hidden = true; return(true); } } } return(false); }
private bool FillBlockFace(Tile3D.Block block, Tile3D.Face face) { Vector3Int perp1, perp2; GetPerpendiculars(hover.Face, out perp1, out perp2); var active = new List <Tile3D.Block>(); var filled = new HashSet <Tile3D.Block>(); var directions = new Vector3Int[4] { perp1, perp1 * -1, perp2, perp2 * -1 }; var outwards = hover.Face.Int(); var changed = false; filled.Add(block); active.Add(block); SetBlockFace(block, hover.Face, brush); while (active.Count > 0) { var from = active[0]; active.RemoveAt(0); for (int i = 0; i < 4; i++) { var next = tiler.At(from.Tile + directions[i]); if (next != null && !filled.Contains(next) && tiler.At(from.Tile + directions[i] + outwards) == null && GetBlockFace(next, hover.Face).Tile == face.Tile) { filled.Add(next); active.Add(next); if (SetBlockFace(next, hover.Face, brush)) { changed = true; } } } } return(changed); }