From 29ffad901e08e4e6294caf8d6cebf4ebbec0fc8c Mon Sep 17 00:00:00 2001 From: mxgmn Date: Thu, 21 Jul 2022 22:43:30 +0300 Subject: [PATCH] code simplification, faster image io, better project file --- Helper.cs | 34 +++- LICENSE | 23 +++ LICENSE.md | 1 - Model.cs | 14 +- OverlappingModel.cs | 160 ++++++------------ Program.cs | 15 +- README.md | 5 +- SimpleTiledModel.cs | 106 +++++------- WaveFunctionCollapse.csproj | 17 +- samples.xml | 4 +- .../Castle/data.xml => tilesets/Castle.xml | 2 +- {samples => tilesets}/Castle/bridge.png | Bin {samples => tilesets}/Castle/ground.png | Bin {samples => tilesets}/Castle/river.png | Bin {samples => tilesets}/Castle/riverturn.png | Bin {samples => tilesets}/Castle/road.png | Bin {samples => tilesets}/Castle/roadturn.png | Bin {samples => tilesets}/Castle/t.png | Bin {samples => tilesets}/Castle/tower.png | Bin {samples => tilesets}/Castle/wall.png | Bin {samples => tilesets}/Castle/wallriver.png | Bin {samples => tilesets}/Castle/wallroad.png | Bin .../Circles/data.xml => tilesets/Circles.xml | 2 +- {samples => tilesets}/Circles/b.png | Bin {samples => tilesets}/Circles/b_half.png | Bin {samples => tilesets}/Circles/b_i.png | Bin {samples => tilesets}/Circles/b_quarter.png | Bin {samples => tilesets}/Circles/w.png | Bin {samples => tilesets}/Circles/w_half.png | Bin {samples => tilesets}/Circles/w_i.png | Bin {samples => tilesets}/Circles/w_quarter.png | Bin .../Circuit/data.xml => tilesets/Circuit.xml | 2 +- {samples => tilesets}/Circuit/bridge.png | Bin {samples => tilesets}/Circuit/component.png | Bin {samples => tilesets}/Circuit/connection.png | Bin {samples => tilesets}/Circuit/corner.png | Bin {samples => tilesets}/Circuit/dskew.png | Bin {samples => tilesets}/Circuit/skew.png | Bin {samples => tilesets}/Circuit/substrate.png | Bin {samples => tilesets}/Circuit/t.png | Bin {samples => tilesets}/Circuit/track.png | Bin {samples => tilesets}/Circuit/transition.png | Bin {samples => tilesets}/Circuit/turn.png | Bin {samples => tilesets}/Circuit/viad.png | Bin {samples => tilesets}/Circuit/vias.png | Bin {samples => tilesets}/Circuit/wire.png | Bin .../data.xml => tilesets/FloorPlan.xml | 2 +- {samples => tilesets}/FloorPlan/div.png | Bin {samples => tilesets}/FloorPlan/divt.png | Bin {samples => tilesets}/FloorPlan/divturn.png | Bin {samples => tilesets}/FloorPlan/door.png | Bin {samples => tilesets}/FloorPlan/empty.png | Bin {samples => tilesets}/FloorPlan/floor.png | Bin {samples => tilesets}/FloorPlan/glass.png | Bin {samples => tilesets}/FloorPlan/halfglass.png | Bin {samples => tilesets}/FloorPlan/in.png | Bin {samples => tilesets}/FloorPlan/out.png | Bin {samples => tilesets}/FloorPlan/stairs.png | Bin {samples => tilesets}/FloorPlan/table.png | Bin {samples => tilesets}/FloorPlan/vent.png | Bin {samples => tilesets}/FloorPlan/w.png | Bin {samples => tilesets}/FloorPlan/wall.png | Bin {samples => tilesets}/FloorPlan/walldiv.png | Bin {samples => tilesets}/FloorPlan/window.png | Bin samples/Knots/data.xml => tilesets/Knots.xml | 2 +- {samples => tilesets}/Knots/corner.png | Bin {samples => tilesets}/Knots/cross.png | Bin {samples => tilesets}/Knots/empty.png | Bin {samples => tilesets}/Knots/line.png | Bin {samples => tilesets}/Knots/t.png | Bin samples/Rooms/data.xml => tilesets/Rooms.xml | 2 +- {samples => tilesets}/Rooms/bend.png | Bin {samples => tilesets}/Rooms/corner.png | Bin {samples => tilesets}/Rooms/corridor.png | Bin {samples => tilesets}/Rooms/door.png | Bin {samples => tilesets}/Rooms/empty.png | Bin {samples => tilesets}/Rooms/side.png | Bin {samples => tilesets}/Rooms/t.png | Bin {samples => tilesets}/Rooms/turn.png | Bin {samples => tilesets}/Rooms/wall.png | Bin .../Summer/data.xml => tilesets/Summer.xml | 8 +- {samples => tilesets}/Summer/cliff 0.png | Bin {samples => tilesets}/Summer/cliff 1.png | Bin {samples => tilesets}/Summer/cliff 2.png | Bin {samples => tilesets}/Summer/cliff 3.png | Bin .../Summer/cliffcorner 0.png | Bin .../Summer/cliffcorner 1.png | Bin .../Summer/cliffcorner 2.png | Bin .../Summer/cliffcorner 3.png | Bin {samples => tilesets}/Summer/cliffturn 0.png | Bin {samples => tilesets}/Summer/cliffturn 1.png | Bin {samples => tilesets}/Summer/cliffturn 2.png | Bin {samples => tilesets}/Summer/cliffturn 3.png | Bin {samples => tilesets}/Summer/grass 0.png | Bin .../Summer/grasscorner 0.png | Bin .../Summer/grasscorner 1.png | Bin .../Summer/grasscorner 2.png | Bin .../Summer/grasscorner 3.png | Bin {samples => tilesets}/Summer/road 0.png | Bin {samples => tilesets}/Summer/road 1.png | Bin {samples => tilesets}/Summer/road 2.png | Bin {samples => tilesets}/Summer/road 3.png | Bin {samples => tilesets}/Summer/roadturn 0.png | Bin {samples => tilesets}/Summer/roadturn 1.png | Bin {samples => tilesets}/Summer/roadturn 2.png | Bin {samples => tilesets}/Summer/roadturn 3.png | Bin {samples => tilesets}/Summer/water_a 0.png | Bin {samples => tilesets}/Summer/water_b 0.png | Bin {samples => tilesets}/Summer/water_c 0.png | Bin .../Summer/watercorner 0.png | Bin .../Summer/watercorner 1.png | Bin .../Summer/watercorner 2.png | Bin .../Summer/watercorner 3.png | Bin {samples => tilesets}/Summer/waterside 0.png | Bin {samples => tilesets}/Summer/waterside 1.png | Bin {samples => tilesets}/Summer/waterside 2.png | Bin {samples => tilesets}/Summer/waterside 3.png | Bin {samples => tilesets}/Summer/waterturn 0.png | Bin {samples => tilesets}/Summer/waterturn 1.png | Bin {samples => tilesets}/Summer/waterturn 2.png | Bin {samples => tilesets}/Summer/waterturn 3.png | Bin 121 files changed, 186 insertions(+), 213 deletions(-) create mode 100644 LICENSE delete mode 100644 LICENSE.md rename samples/Castle/data.xml => tilesets/Castle.xml (99%) rename {samples => tilesets}/Castle/bridge.png (100%) rename {samples => tilesets}/Castle/ground.png (100%) rename {samples => tilesets}/Castle/river.png (100%) rename {samples => tilesets}/Castle/riverturn.png (100%) rename {samples => tilesets}/Castle/road.png (100%) rename {samples => tilesets}/Castle/roadturn.png (100%) rename {samples => tilesets}/Castle/t.png (100%) rename {samples => tilesets}/Castle/tower.png (100%) rename {samples => tilesets}/Castle/wall.png (100%) rename {samples => tilesets}/Castle/wallriver.png (100%) rename {samples => tilesets}/Castle/wallroad.png (100%) rename samples/Circles/data.xml => tilesets/Circles.xml (99%) rename {samples => tilesets}/Circles/b.png (100%) rename {samples => tilesets}/Circles/b_half.png (100%) rename {samples => tilesets}/Circles/b_i.png (100%) rename {samples => tilesets}/Circles/b_quarter.png (100%) rename {samples => tilesets}/Circles/w.png (100%) rename {samples => tilesets}/Circles/w_half.png (100%) rename {samples => tilesets}/Circles/w_i.png (100%) rename {samples => tilesets}/Circles/w_quarter.png (100%) rename samples/Circuit/data.xml => tilesets/Circuit.xml (99%) rename {samples => tilesets}/Circuit/bridge.png (100%) rename {samples => tilesets}/Circuit/component.png (100%) rename {samples => tilesets}/Circuit/connection.png (100%) rename {samples => tilesets}/Circuit/corner.png (100%) rename {samples => tilesets}/Circuit/dskew.png (100%) rename {samples => tilesets}/Circuit/skew.png (100%) rename {samples => tilesets}/Circuit/substrate.png (100%) rename {samples => tilesets}/Circuit/t.png (100%) rename {samples => tilesets}/Circuit/track.png (100%) rename {samples => tilesets}/Circuit/transition.png (100%) rename {samples => tilesets}/Circuit/turn.png (100%) rename {samples => tilesets}/Circuit/viad.png (100%) rename {samples => tilesets}/Circuit/vias.png (100%) rename {samples => tilesets}/Circuit/wire.png (100%) rename samples/FloorPlan/data.xml => tilesets/FloorPlan.xml (99%) rename {samples => tilesets}/FloorPlan/div.png (100%) rename {samples => tilesets}/FloorPlan/divt.png (100%) rename {samples => tilesets}/FloorPlan/divturn.png (100%) rename {samples => tilesets}/FloorPlan/door.png (100%) rename {samples => tilesets}/FloorPlan/empty.png (100%) rename {samples => tilesets}/FloorPlan/floor.png (100%) rename {samples => tilesets}/FloorPlan/glass.png (100%) rename {samples => tilesets}/FloorPlan/halfglass.png (100%) rename {samples => tilesets}/FloorPlan/in.png (100%) rename {samples => tilesets}/FloorPlan/out.png (100%) rename {samples => tilesets}/FloorPlan/stairs.png (100%) rename {samples => tilesets}/FloorPlan/table.png (100%) rename {samples => tilesets}/FloorPlan/vent.png (100%) rename {samples => tilesets}/FloorPlan/w.png (100%) rename {samples => tilesets}/FloorPlan/wall.png (100%) rename {samples => tilesets}/FloorPlan/walldiv.png (100%) rename {samples => tilesets}/FloorPlan/window.png (100%) rename samples/Knots/data.xml => tilesets/Knots.xml (99%) rename {samples => tilesets}/Knots/corner.png (100%) rename {samples => tilesets}/Knots/cross.png (100%) rename {samples => tilesets}/Knots/empty.png (100%) rename {samples => tilesets}/Knots/line.png (100%) rename {samples => tilesets}/Knots/t.png (100%) rename samples/Rooms/data.xml => tilesets/Rooms.xml (99%) rename {samples => tilesets}/Rooms/bend.png (100%) rename {samples => tilesets}/Rooms/corner.png (100%) rename {samples => tilesets}/Rooms/corridor.png (100%) rename {samples => tilesets}/Rooms/door.png (100%) rename {samples => tilesets}/Rooms/empty.png (100%) rename {samples => tilesets}/Rooms/side.png (100%) rename {samples => tilesets}/Rooms/t.png (100%) rename {samples => tilesets}/Rooms/turn.png (100%) rename {samples => tilesets}/Rooms/wall.png (100%) rename samples/Summer/data.xml => tilesets/Summer.xml (93%) rename {samples => tilesets}/Summer/cliff 0.png (100%) rename {samples => tilesets}/Summer/cliff 1.png (100%) rename {samples => tilesets}/Summer/cliff 2.png (100%) rename {samples => tilesets}/Summer/cliff 3.png (100%) rename {samples => tilesets}/Summer/cliffcorner 0.png (100%) rename {samples => tilesets}/Summer/cliffcorner 1.png (100%) rename {samples => tilesets}/Summer/cliffcorner 2.png (100%) rename {samples => tilesets}/Summer/cliffcorner 3.png (100%) rename {samples => tilesets}/Summer/cliffturn 0.png (100%) rename {samples => tilesets}/Summer/cliffturn 1.png (100%) rename {samples => tilesets}/Summer/cliffturn 2.png (100%) rename {samples => tilesets}/Summer/cliffturn 3.png (100%) rename {samples => tilesets}/Summer/grass 0.png (100%) rename {samples => tilesets}/Summer/grasscorner 0.png (100%) rename {samples => tilesets}/Summer/grasscorner 1.png (100%) rename {samples => tilesets}/Summer/grasscorner 2.png (100%) rename {samples => tilesets}/Summer/grasscorner 3.png (100%) rename {samples => tilesets}/Summer/road 0.png (100%) rename {samples => tilesets}/Summer/road 1.png (100%) rename {samples => tilesets}/Summer/road 2.png (100%) rename {samples => tilesets}/Summer/road 3.png (100%) rename {samples => tilesets}/Summer/roadturn 0.png (100%) rename {samples => tilesets}/Summer/roadturn 1.png (100%) rename {samples => tilesets}/Summer/roadturn 2.png (100%) rename {samples => tilesets}/Summer/roadturn 3.png (100%) rename {samples => tilesets}/Summer/water_a 0.png (100%) rename {samples => tilesets}/Summer/water_b 0.png (100%) rename {samples => tilesets}/Summer/water_c 0.png (100%) rename {samples => tilesets}/Summer/watercorner 0.png (100%) rename {samples => tilesets}/Summer/watercorner 1.png (100%) rename {samples => tilesets}/Summer/watercorner 2.png (100%) rename {samples => tilesets}/Summer/watercorner 3.png (100%) rename {samples => tilesets}/Summer/waterside 0.png (100%) rename {samples => tilesets}/Summer/waterside 1.png (100%) rename {samples => tilesets}/Summer/waterside 2.png (100%) rename {samples => tilesets}/Summer/waterside 3.png (100%) rename {samples => tilesets}/Summer/waterturn 0.png (100%) rename {samples => tilesets}/Summer/waterturn 1.png (100%) rename {samples => tilesets}/Summer/waterturn 2.png (100%) rename {samples => tilesets}/Summer/waterturn 3.png (100%) diff --git a/Helper.cs b/Helper.cs index 4cd1898..4069ef5 100644 --- a/Helper.cs +++ b/Helper.cs @@ -1,15 +1,11 @@ -/* -The MIT License(MIT) -Copyright(c) mxgmn 2016. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. -*/ +// Copyright (C) 2016 Maxim Gumin, The MIT License (MIT) using System.Linq; using System.Xml.Linq; using System.ComponentModel; using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; static class Helper { @@ -43,3 +39,27 @@ public static T Get(this XElement xelem, string attribute, T defaultT = defau public static IEnumerable Elements(this XElement xelement, params string[] names) => xelement.Elements().Where(e => names.Any(n => n == e.Name)); } + +static class BitmapHelper +{ + public static (int[] bitmap, int width, int height) LoadBitmap(string filename) + { + Bitmap bitmap = new(filename); + int width = bitmap.Width, height = bitmap.Height; + var bits = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); + int[] result = new int[bitmap.Width * bitmap.Height]; + System.Runtime.InteropServices.Marshal.Copy(bits.Scan0, result, 0, result.Length); + bitmap.UnlockBits(bits); + bitmap.Dispose(); + return (result, width, height); + } + + public static void SaveBitmap(int[] data, int width, int height, string filename) + { + Bitmap result = new(width, height); + var bits = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + System.Runtime.InteropServices.Marshal.Copy(data, 0, bits.Scan0, data.Length); + result.UnlockBits(bits); + result.Save(filename); + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..736e9e6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,23 @@ +MIT License + +Copyright (c) 2016 Maxim Gumin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Provided image samples and tiles are not part of WaveFunctionCollapse software. diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 6eb98f2..0000000 --- a/LICENSE.md +++ /dev/null @@ -1 +0,0 @@ -WaveFunctionCollapse software is mostly under the MIT license. Check individual source files for license text. Provided image samples are not part of WaveFunctionCollapse software. diff --git a/Model.cs b/Model.cs index 0e79236..84b85de 100644 --- a/Model.cs +++ b/Model.cs @@ -1,10 +1,4 @@ -/* -The MIT License(MIT) -Copyright(c) mxgmn 2016. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. -*/ +// Copyright (C) 2016 Maxim Gumin, The MIT License (MIT) using System; @@ -25,9 +19,9 @@ abstract class Model protected double[] weights; double[] weightLogWeights, distribution; - int[] sumsOfOnes; + protected int[] sumsOfOnes; double sumOfWeights, sumOfWeightLogWeights, startingEntropy; - double[] sumsOfWeights, sumsOfWeightLogWeights, entropies; + protected double[] sumsOfWeights, sumsOfWeightLogWeights, entropies; public enum Heuristic { Entropy, MRV, Scanline }; Heuristic heuristic; @@ -231,7 +225,7 @@ void Clear() } } - public abstract System.Drawing.Bitmap Graphics(); + public abstract void Save(string filename); protected static int[] dx = { -1, 0, 1, 0 }; protected static int[] dy = { 0, 1, 0, -1 }; diff --git a/OverlappingModel.cs b/OverlappingModel.cs index dd9f92a..05c452e 100644 --- a/OverlappingModel.cs +++ b/OverlappingModel.cs @@ -1,59 +1,38 @@ -/* -The MIT License(MIT) -Copyright(c) mxgmn 2016. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. -*/ +// Copyright (C) 2016 Maxim Gumin, The MIT License (MIT) using System; -using System.Drawing; -using System.Drawing.Imaging; using System.Collections.Generic; class OverlappingModel : Model { - byte[][] patterns; - List colors; + List patterns; + List colors; public OverlappingModel(string name, int N, int width, int height, bool periodicInput, bool periodic, int symmetry, bool ground, Heuristic heuristic) : base(width, height, N, periodic, heuristic) { - var bitmap = new Bitmap($"samples/{name}.png"); - int SX = bitmap.Width, SY = bitmap.Height; - byte[,] sample = new byte[SX, SY]; - colors = new List(); - - for (int y = 0; y < SY; y++) for (int x = 0; x < SX; x++) - { - Color color = bitmap.GetPixel(x, y); - - int i = 0; - foreach (var c in colors) - { - if (c == color) break; - i++; - } - - if (i == colors.Count) colors.Add(color); - sample[x, y] = (byte)i; - } - - int C = colors.Count; - long W = C.ToPower(N * N); + var (bitmap, SX, SY) = BitmapHelper.LoadBitmap($"samples/{name}.png"); + byte[] sample = new byte[bitmap.Length]; + colors = new List(); + for (int i = 0; i < sample.Length; i++) + { + int color = bitmap[i]; + int k = 0; + for (; k < colors.Count; k++) if (colors[k] == color) break; + if (k == colors.Count) colors.Add(color); + sample[i] = (byte)k; + } - byte[] pattern(Func f) + static byte[] pattern(Func f, int N) { byte[] result = new byte[N * N]; for (int y = 0; y < N; y++) for (int x = 0; x < N; x++) result[x + y * N] = f(x, y); return result; }; + static byte[] rotate(byte[] p, int N) => pattern((x, y) => p[N - 1 - y + x * N], N); + static byte[] reflect(byte[] p, int N) => pattern((x, y) => p[N - 1 - x + y * N], N); - byte[] patternFromSample(int x, int y) => pattern((dx, dy) => sample[(x + dx) % SX, (y + dy) % SY]); - byte[] rotate(byte[] p) => pattern((x, y) => p[N - 1 - y + x * N]); - byte[] reflect(byte[] p) => pattern((x, y) => p[N - 1 - x + y * N]); - - long index(byte[] p) + static long hash(byte[] p, int C) { long result = 0, power = 1; for (int i = 0; i < p.Length; i++) @@ -64,70 +43,45 @@ long index(byte[] p) return result; }; - byte[] patternFromIndex(long ind) - { - long residue = ind, power = W; - byte[] result = new byte[N * N]; - - for (int i = 0; i < result.Length; i++) - { - power /= C; - int count = 0; - - while (residue >= power) - { - residue -= power; - count++; - } - - result[i] = (byte)count; - } - - return result; - }; - - var weights = new Dictionary(); - var ordering = new List(); + patterns = new(); + Dictionary patternIndices = new(); + List weightList = new(); - for (int y = 0; y < (periodicInput ? SY : SY - N + 1); y++) for (int x = 0; x < (periodicInput ? SX : SX - N + 1); x++) + int C = colors.Count; + int xmax = periodicInput ? SX : SX - N + 1; + int ymax = periodicInput ? SY : SY - N + 1; + for (int y = 0; y < ymax; y++) for (int x = 0; x < xmax; x++) { byte[][] ps = new byte[8][]; - ps[0] = patternFromSample(x, y); - ps[1] = reflect(ps[0]); - ps[2] = rotate(ps[0]); - ps[3] = reflect(ps[2]); - ps[4] = rotate(ps[2]); - ps[5] = reflect(ps[4]); - ps[6] = rotate(ps[4]); - ps[7] = reflect(ps[6]); + ps[0] = pattern((dx, dy) => sample[(x + dx) % SX + (y + dy) % SY * SX], N); + ps[1] = reflect(ps[0], N); + ps[2] = rotate(ps[0], N); + ps[3] = reflect(ps[2], N); + ps[4] = rotate(ps[2], N); + ps[5] = reflect(ps[4], N); + ps[6] = rotate(ps[4], N); + ps[7] = reflect(ps[6], N); for (int k = 0; k < symmetry; k++) { - long ind = index(ps[k]); - if (weights.ContainsKey(ind)) weights[ind]++; + byte[] p = ps[k]; + long h = hash(p, C); + if (patternIndices.TryGetValue(h, out int index)) weightList[index] = weightList[index] + 1; else { - weights.Add(ind, 1); - ordering.Add(ind); + patternIndices.Add(h, weightList.Count); + weightList.Add(1.0); + patterns.Add(p); } } } - T = weights.Count; + weights = weightList.ToArray(); + T = weights.Length; this.ground = ground; - patterns = new byte[T][]; - base.weights = new double[T]; - int counter = 0; - foreach (long w in ordering) - { - patterns[counter] = patternFromIndex(w); - base.weights[counter] = weights[w]; - counter++; - } - - bool agrees(byte[] p1, byte[] p2, int dx, int dy) + static bool agrees(byte[] p1, byte[] p2, int dx, int dy, int N) { int xmin = dx < 0 ? 0 : dx, xmax = dx < 0 ? dx + N : N, ymin = dy < 0 ? 0 : dy, ymax = dy < 0 ? dy + N : N; for (int y = ymin; y < ymax; y++) for (int x = xmin; x < xmax; x++) if (p1[x + N * y] != p2[x - dx + N * (y - dy)]) return false; @@ -141,18 +95,16 @@ bool agrees(byte[] p1, byte[] p2, int dx, int dy) for (int t = 0; t < T; t++) { List list = new(); - for (int t2 = 0; t2 < T; t2++) if (agrees(patterns[t], patterns[t2], dx[d], dy[d])) list.Add(t2); + for (int t2 = 0; t2 < T; t2++) if (agrees(patterns[t], patterns[t2], dx[d], dy[d], N)) list.Add(t2); propagator[d][t] = new int[list.Count]; for (int c = 0; c < list.Count; c++) propagator[d][t][c] = list[c]; } } } - public override Bitmap Graphics() + public override void Save(string filename) { - Bitmap result = new(MX, MY); - int[] bitmapData = new int[result.Height * result.Width]; - + int[] bitmap = new int[MX * MY]; if (observed[0] >= 0) { for (int y = 0; y < MY; y++) @@ -161,8 +113,7 @@ public override Bitmap Graphics() for (int x = 0; x < MX; x++) { int dx = x < MX - N + 1 ? 0 : N - 1; - Color c = colors[patterns[observed[x - dx + (y - dy) * MX]][dx + dy * N]]; - bitmapData[x + y * MX] = unchecked((int)0xff000000 | (c.R << 16) | (c.G << 8) | c.B); + bitmap[x + y * MX] = colors[patterns[observed[x - dx + (y - dy) * MX]][dx + dy * N]]; } } } @@ -172,7 +123,6 @@ public override Bitmap Graphics() { int contributors = 0, r = 0, g = 0, b = 0; int x = i % MX, y = i / MX; - for (int dy = 0; dy < N; dy++) for (int dx = 0; dx < N; dx++) { int sx = x - dx; @@ -186,21 +136,15 @@ public override Bitmap Graphics() for (int t = 0; t < T; t++) if (wave[s][t]) { contributors++; - Color color = colors[patterns[t][dx + dy * N]]; - r += color.R; - g += color.G; - b += color.B; + int argb = colors[patterns[t][dx + dy * N]]; + r += (argb & 0xff0000) >> 16; + g += (argb & 0xff00) >> 8; + b += argb & 0xff; } } - - bitmapData[i] = unchecked((int)0xff000000 | ((r / contributors) << 16) | ((g / contributors) << 8) | b / contributors); + bitmap[i] = unchecked((int)0xff000000 | ((r / contributors) << 16) | ((g / contributors) << 8) | b / contributors); } } - - var bits = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - System.Runtime.InteropServices.Marshal.Copy(bitmapData, 0, bits.Scan0, bitmapData.Length); - result.UnlockBits(bits); - - return result; + BitmapHelper.SaveBitmap(bitmap, MX, MY, filename); } } diff --git a/Program.cs b/Program.cs index 1611763..282cb13 100644 --- a/Program.cs +++ b/Program.cs @@ -1,10 +1,4 @@ -/* -The MIT License(MIT) -Copyright(c) mxgmn 2016. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. -*/ +// Copyright (C) 2016 Maxim Gumin, The MIT License (MIT) using System; using System.Xml.Linq; @@ -15,6 +9,8 @@ static class Program static void Main() { Stopwatch sw = Stopwatch.StartNew(); + var folder = System.IO.Directory.CreateDirectory("output"); + foreach (var file in folder.GetFiles()) file.Delete(); Random random = new(); XDocument xdoc = XDocument.Load("samples.xml"); @@ -60,8 +56,9 @@ static void Main() if (success) { Console.WriteLine("DONE"); - model.Graphics().Save($"{name} {seed}.png"); - if (model is SimpleTiledModel stmodel && xelem.Get("textOutput", false)) System.IO.File.WriteAllText($"{name} {seed}.txt", stmodel.TextOutput()); + model.Save($"output/{name} {seed}.png"); + if (model is SimpleTiledModel stmodel && xelem.Get("textOutput", false)) + System.IO.File.WriteAllText($"output/{name} {seed}.txt", stmodel.TextOutput()); break; } else Console.WriteLine("CONTRADICTION"); diff --git a/README.md b/README.md index 8105d01..5d78733 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ WFC algorithm in higher dimensions works completely the same way as in dimension Higher resolution screenshots: [1](http://i.imgur.com/0bsjlBY.png), [2](http://i.imgur.com/GduN0Vr.png), [3](http://i.imgur.com/IEOsbIy.png). -Voxel models generated with WFC and other algorithms will be in a separate repo. +[MarkovJunior](https://github.com/mxgmn/MarkovJunior) repository contains an implementation of the 3d simple tiled model with many [tilesets](https://github.com/mxgmn/MarkovJunior/tree/main/resources/tilesets) and [examples](https://github.com/mxgmn/MarkovJunior/blob/main/images/top-1764.png). ## Constrained synthesis WFC algorithm supports constraints. Therefore, it can be easily combined with other generative algorithms or with manual creation. @@ -106,6 +106,8 @@ WFC is a console application that depends only on the standard library. Get [.NE ``` dotnet run --configuration Release WaveFunctionCollapse.csproj ``` +Generated results are put into the `output` folder. Edit `samples.xml` to change model parameters. + Alternatively, use build instructions from the community for various platforms from the [relevant issue](https://github.com/mxgmn/WaveFunctionCollapse/issues/3). Casey Marshall made a [pull request](https://github.com/mxgmn/WaveFunctionCollapse/pull/18) that makes using the program with the command line more convenient and includes snap packaging. ## Notable ports, forks and spinoffs @@ -118,7 +120,6 @@ Alternatively, use build instructions from the community for various platforms f * [Nick Nenov](https://github.com/NNNenov) made a [3d voxel tileset](https://twitter.com/NNNenov/status/789903180226301953) based on my Castle tileset. Nick uses text output option in the tiled model to reconstruct 3d models in Cinema 4D. * Sean Leffler implemented the [overlapping model in Rust](https://github.com/sdleffler/collapse). * rid5x is making an [OCaml version of WFC](https://twitter.com/rid5x/status/782442620459114496). -* I published a very basic [3d tiled model](https://bitbucket.org/mxgmn/basic3dwfc/overview) so people could make their own 3d tilesets without waiting for the full 3d repository. * I made an [interactive version](https://twitter.com/ExUtumno/status/798571284342837249) of the overlapping model, you can download the GUI executable from the [WFC itch.io page](https://exutumno.itch.io/wavefunctioncollapse). * [Brian Bucklew](https://github.com/unormal) built a level generation pipeline that applies WFC in multiple passes for the [Caves of Qud](http://store.steampowered.com/app/333640) game: [1](https://twitter.com/unormal/status/805987523596091392), [2](https://twitter.com/unormal/status/808566029387448320), [3](https://twitter.com/unormal/status/808523056259993601), [4](https://twitter.com/unormal/status/808523493994364928), [5](https://twitter.com/unormal/status/808519575264497666), [6](https://twitter.com/unormal/status/808519216185876480), [7](https://twitter.com/unormal/status/808795396508123136), [8](https://twitter.com/unormal/status/808860105093632001), [9](https://twitter.com/unormal/status/809637856432033792), [10](https://twitter.com/unormal/status/810239794433425408), [11](https://twitter.com/unormal/status/811034574973243393), [12](https://twitter.com/unormal/status/811720423419314176), [13](https://twitter.com/unormal/status/811034037259276290), [14](https://twitter.com/unormal/status/810971337309224960), [15](https://twitter.com/unormal/status/811405368777723909), [16](https://twitter.com/ptychomancer/status/812053801544757248), [17](https://twitter.com/unormal/status/812159308263788544), [18](https://twitter.com/unormal/status/812158749838340096), [19](https://twitter.com/unormal/status/814569437181476864), [20](https://twitter.com/unormal/status/814570383189876738), [21](https://twitter.com/unormal/status/819725864623603712), [22](https://twitter.com/unormal/status/984719207156862976). * [Danny Wynne](https://github.com/dannywynne) implemented a [3d tiled model](https://twitter.com/dwtw/status/810166761270243328). diff --git a/SimpleTiledModel.cs b/SimpleTiledModel.cs index 3b2efcd..247cf3c 100644 --- a/SimpleTiledModel.cs +++ b/SimpleTiledModel.cs @@ -1,21 +1,13 @@ -/* -The MIT License(MIT) -Copyright(c) mxgmn 2016. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. -*/ +// Copyright (C) 2016 Maxim Gumin, The MIT License (MIT) using System; using System.Linq; -using System.Drawing; using System.Xml.Linq; -using System.Drawing.Imaging; using System.Collections.Generic; class SimpleTiledModel : Model { - List tiles; + List tiles; List tilenames; int tilesize; bool blackBackground; @@ -23,9 +15,7 @@ class SimpleTiledModel : Model public SimpleTiledModel(string name, string subsetName, int width, int height, bool periodic, bool blackBackground, Heuristic heuristic) : base(width, height, 1, periodic, heuristic) { this.blackBackground = blackBackground; - - XElement xroot = XDocument.Load($"samples/{name}/data.xml").Root; - tilesize = xroot.Get("size", 16); + XElement xroot = XDocument.Load($"tilesets/{name}.xml").Root; bool unique = xroot.Get("unique", false); List subset = null; @@ -36,17 +26,16 @@ public SimpleTiledModel(string name, string subsetName, int width, int height, b else subset = xsubset.Elements("tile").Select(x => x.Get("name")).ToList(); } - Color[] tile(Func f) + static int[] tile(Func f, int size) { - Color[] result = new Color[tilesize * tilesize]; - for (int y = 0; y < tilesize; y++) for (int x = 0; x < tilesize; x++) result[x + y * tilesize] = f(x, y); + int[] result = new int[size * size]; + for (int y = 0; y < size; y++) for (int x = 0; x < size; x++) result[x + y * size] = f(x, y); return result; }; + static int[] rotate(int[] array, int size) => tile((x, y) => array[size - 1 - y + x * size], size); + static int[] reflect(int[] array, int size) => tile((x, y) => array[size - 1 - x + y * size], size); - Color[] rotate(Color[] array) => tile((x, y) => array[tilesize - 1 - y + x * tilesize]); - Color[] reflect(Color[] array) => tile((x, y) => array[tilesize - 1 - x + y * tilesize]); - - tiles = new List(); + tiles = new List(); tilenames = new List(); var weightList = new List(); @@ -125,21 +114,23 @@ Color[] tile(Func f) { for (int t = 0; t < cardinality; t++) { - Bitmap bitmap = new($"samples/{name}/{tilename} {t}.png"); - tiles.Add(tile((x, y) => bitmap.GetPixel(x, y))); + int[] bitmap; + (bitmap, tilesize, tilesize) = BitmapHelper.LoadBitmap($"tilesets/{name}/{tilename} {t}.png"); + tiles.Add(bitmap); tilenames.Add($"{tilename} {t}"); } } else { - Bitmap bitmap = new($"samples/{name}/{tilename}.png"); - tiles.Add(tile((x, y) => bitmap.GetPixel(x, y))); + int[] bitmap; + (bitmap, tilesize, tilesize) = BitmapHelper.LoadBitmap($"tilesets/{name}/{tilename}.png"); + tiles.Add(bitmap); tilenames.Add($"{tilename} 0"); for (int t = 1; t < cardinality; t++) { - if (t <= 3) tiles.Add(rotate(tiles[T + t - 1])); - if (t >= 4) tiles.Add(reflect(tiles[T + t - 4])); + if (t <= 3) tiles.Add(rotate(tiles[T + t - 1], tilesize)); + if (t >= 4) tiles.Add(reflect(tiles[T + t - 4], tilesize)); tilenames.Add($"{tilename} {t}"); } } @@ -207,58 +198,47 @@ Color[] tile(Func f) } } - public override Bitmap Graphics() + public override void Save(string filename) { - Bitmap result = new(MX * tilesize, MY * tilesize); - int[] bitmapData = new int[result.Height * result.Width]; - + int[] bitmapData = new int[MX * MY * tilesize * tilesize]; if (observed[0] >= 0) { for (int x = 0; x < MX; x++) for (int y = 0; y < MY; y++) { - Color[] tile = tiles[observed[x + y * MX]]; - for (int yt = 0; yt < tilesize; yt++) for (int xt = 0; xt < tilesize; xt++) - { - Color c = tile[xt + yt * tilesize]; - bitmapData[x * tilesize + xt + (y * tilesize + yt) * MX * tilesize] = - unchecked((int)0xff000000 | (c.R << 16) | (c.G << 8) | c.B); - } + int[] tile = tiles[observed[x + y * MX]]; + for (int dy = 0; dy < tilesize; dy++) for (int dx = 0; dx < tilesize; dx++) + bitmapData[x * tilesize + dx + (y * tilesize + dy) * MX * tilesize] = tile[dx + dy * tilesize]; } } else { - for (int x = 0; x < MX; x++) for (int y = 0; y < MY; y++) + for (int i = 0; i < wave.Length; i++) + { + int x = i % MX, y = i / MX; + if (blackBackground && sumsOfOnes[i] == T) + for (int yt = 0; yt < tilesize; yt++) for (int xt = 0; xt < tilesize; xt++) + bitmapData[x * tilesize + xt + (y * tilesize + yt) * MX * tilesize] = 255 << 24; + else { - bool[] a = wave[x + y * MX]; - int amount = (from b in a where b select 1).Sum(); - double lambda = 1.0 / (from t in Enumerable.Range(0, T) where a[t] select weights[t]).Sum(); - + bool[] w = wave[i]; + double normalization = 1.0 / sumsOfWeights[i]; for (int yt = 0; yt < tilesize; yt++) for (int xt = 0; xt < tilesize; xt++) { - if (blackBackground && amount == T) bitmapData[x * tilesize + xt + (y * tilesize + yt) * MX * tilesize] = unchecked((int)0xff000000); - else - { - double r = 0, g = 0, b = 0; - for (int t = 0; t < T; t++) if (a[t]) - { - Color c = tiles[t][xt + yt * tilesize]; - r += (double)c.R * weights[t] * lambda; - g += (double)c.G * weights[t] * lambda; - b += (double)c.B * weights[t] * lambda; - } - - bitmapData[x * tilesize + xt + (y * tilesize + yt) * MX * tilesize] = - unchecked((int)0xff000000 | ((int)r << 16) | ((int)g << 8) | (int)b); - } + int idi = x * tilesize + xt + (y * tilesize + yt) * MX * tilesize; + double r = 0, g = 0, b = 0; + for (int t = 0; t < T; t++) if (w[t]) + { + int argb = tiles[t][xt + yt * tilesize]; + r += ((argb & 0xff0000) >> 16) * weights[t] * normalization; + g += ((argb & 0xff00) >> 8) * weights[t] * normalization; + b += (argb & 0xff) * weights[t] * normalization; + } + bitmapData[idi] = unchecked((int)0xff000000 | ((int)r << 16) | ((int)g << 8) | (int)b); } } + } } - - var bits = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - System.Runtime.InteropServices.Marshal.Copy(bitmapData, 0, bits.Scan0, bitmapData.Length); - result.UnlockBits(bits); - - return result; + BitmapHelper.SaveBitmap(bitmapData, MX * tilesize, MY * tilesize, filename); } public string TextOutput() diff --git a/WaveFunctionCollapse.csproj b/WaveFunctionCollapse.csproj index c82a96e..82d6ca2 100644 --- a/WaveFunctionCollapse.csproj +++ b/WaveFunctionCollapse.csproj @@ -3,10 +3,25 @@ Exe net6.0 + false + false + true - + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/samples.xml b/samples.xml index 1a7b3ab..d5cd0b8 100644 --- a/samples.xml +++ b/samples.xml @@ -84,8 +84,8 @@ - - + + diff --git a/samples/Castle/data.xml b/tilesets/Castle.xml similarity index 99% rename from samples/Castle/data.xml rename to tilesets/Castle.xml index db20bdd..fc59933 100644 --- a/samples/Castle/data.xml +++ b/tilesets/Castle.xml @@ -1,4 +1,4 @@ - + diff --git a/samples/Castle/bridge.png b/tilesets/Castle/bridge.png similarity index 100% rename from samples/Castle/bridge.png rename to tilesets/Castle/bridge.png diff --git a/samples/Castle/ground.png b/tilesets/Castle/ground.png similarity index 100% rename from samples/Castle/ground.png rename to tilesets/Castle/ground.png diff --git a/samples/Castle/river.png b/tilesets/Castle/river.png similarity index 100% rename from samples/Castle/river.png rename to tilesets/Castle/river.png diff --git a/samples/Castle/riverturn.png b/tilesets/Castle/riverturn.png similarity index 100% rename from samples/Castle/riverturn.png rename to tilesets/Castle/riverturn.png diff --git a/samples/Castle/road.png b/tilesets/Castle/road.png similarity index 100% rename from samples/Castle/road.png rename to tilesets/Castle/road.png diff --git a/samples/Castle/roadturn.png b/tilesets/Castle/roadturn.png similarity index 100% rename from samples/Castle/roadturn.png rename to tilesets/Castle/roadturn.png diff --git a/samples/Castle/t.png b/tilesets/Castle/t.png similarity index 100% rename from samples/Castle/t.png rename to tilesets/Castle/t.png diff --git a/samples/Castle/tower.png b/tilesets/Castle/tower.png similarity index 100% rename from samples/Castle/tower.png rename to tilesets/Castle/tower.png diff --git a/samples/Castle/wall.png b/tilesets/Castle/wall.png similarity index 100% rename from samples/Castle/wall.png rename to tilesets/Castle/wall.png diff --git a/samples/Castle/wallriver.png b/tilesets/Castle/wallriver.png similarity index 100% rename from samples/Castle/wallriver.png rename to tilesets/Castle/wallriver.png diff --git a/samples/Castle/wallroad.png b/tilesets/Castle/wallroad.png similarity index 100% rename from samples/Castle/wallroad.png rename to tilesets/Castle/wallroad.png diff --git a/samples/Circles/data.xml b/tilesets/Circles.xml similarity index 99% rename from samples/Circles/data.xml rename to tilesets/Circles.xml index 6e7560b..6b0d5fd 100644 --- a/samples/Circles/data.xml +++ b/tilesets/Circles.xml @@ -1,4 +1,4 @@ - + diff --git a/samples/Circles/b.png b/tilesets/Circles/b.png similarity index 100% rename from samples/Circles/b.png rename to tilesets/Circles/b.png diff --git a/samples/Circles/b_half.png b/tilesets/Circles/b_half.png similarity index 100% rename from samples/Circles/b_half.png rename to tilesets/Circles/b_half.png diff --git a/samples/Circles/b_i.png b/tilesets/Circles/b_i.png similarity index 100% rename from samples/Circles/b_i.png rename to tilesets/Circles/b_i.png diff --git a/samples/Circles/b_quarter.png b/tilesets/Circles/b_quarter.png similarity index 100% rename from samples/Circles/b_quarter.png rename to tilesets/Circles/b_quarter.png diff --git a/samples/Circles/w.png b/tilesets/Circles/w.png similarity index 100% rename from samples/Circles/w.png rename to tilesets/Circles/w.png diff --git a/samples/Circles/w_half.png b/tilesets/Circles/w_half.png similarity index 100% rename from samples/Circles/w_half.png rename to tilesets/Circles/w_half.png diff --git a/samples/Circles/w_i.png b/tilesets/Circles/w_i.png similarity index 100% rename from samples/Circles/w_i.png rename to tilesets/Circles/w_i.png diff --git a/samples/Circles/w_quarter.png b/tilesets/Circles/w_quarter.png similarity index 100% rename from samples/Circles/w_quarter.png rename to tilesets/Circles/w_quarter.png diff --git a/samples/Circuit/data.xml b/tilesets/Circuit.xml similarity index 99% rename from samples/Circuit/data.xml rename to tilesets/Circuit.xml index 22f3644..27abb38 100644 --- a/samples/Circuit/data.xml +++ b/tilesets/Circuit.xml @@ -1,4 +1,4 @@ - + diff --git a/samples/Circuit/bridge.png b/tilesets/Circuit/bridge.png similarity index 100% rename from samples/Circuit/bridge.png rename to tilesets/Circuit/bridge.png diff --git a/samples/Circuit/component.png b/tilesets/Circuit/component.png similarity index 100% rename from samples/Circuit/component.png rename to tilesets/Circuit/component.png diff --git a/samples/Circuit/connection.png b/tilesets/Circuit/connection.png similarity index 100% rename from samples/Circuit/connection.png rename to tilesets/Circuit/connection.png diff --git a/samples/Circuit/corner.png b/tilesets/Circuit/corner.png similarity index 100% rename from samples/Circuit/corner.png rename to tilesets/Circuit/corner.png diff --git a/samples/Circuit/dskew.png b/tilesets/Circuit/dskew.png similarity index 100% rename from samples/Circuit/dskew.png rename to tilesets/Circuit/dskew.png diff --git a/samples/Circuit/skew.png b/tilesets/Circuit/skew.png similarity index 100% rename from samples/Circuit/skew.png rename to tilesets/Circuit/skew.png diff --git a/samples/Circuit/substrate.png b/tilesets/Circuit/substrate.png similarity index 100% rename from samples/Circuit/substrate.png rename to tilesets/Circuit/substrate.png diff --git a/samples/Circuit/t.png b/tilesets/Circuit/t.png similarity index 100% rename from samples/Circuit/t.png rename to tilesets/Circuit/t.png diff --git a/samples/Circuit/track.png b/tilesets/Circuit/track.png similarity index 100% rename from samples/Circuit/track.png rename to tilesets/Circuit/track.png diff --git a/samples/Circuit/transition.png b/tilesets/Circuit/transition.png similarity index 100% rename from samples/Circuit/transition.png rename to tilesets/Circuit/transition.png diff --git a/samples/Circuit/turn.png b/tilesets/Circuit/turn.png similarity index 100% rename from samples/Circuit/turn.png rename to tilesets/Circuit/turn.png diff --git a/samples/Circuit/viad.png b/tilesets/Circuit/viad.png similarity index 100% rename from samples/Circuit/viad.png rename to tilesets/Circuit/viad.png diff --git a/samples/Circuit/vias.png b/tilesets/Circuit/vias.png similarity index 100% rename from samples/Circuit/vias.png rename to tilesets/Circuit/vias.png diff --git a/samples/Circuit/wire.png b/tilesets/Circuit/wire.png similarity index 100% rename from samples/Circuit/wire.png rename to tilesets/Circuit/wire.png diff --git a/samples/FloorPlan/data.xml b/tilesets/FloorPlan.xml similarity index 99% rename from samples/FloorPlan/data.xml rename to tilesets/FloorPlan.xml index 38ef4f7..dc01738 100644 --- a/samples/FloorPlan/data.xml +++ b/tilesets/FloorPlan.xml @@ -1,4 +1,4 @@ - + diff --git a/samples/FloorPlan/div.png b/tilesets/FloorPlan/div.png similarity index 100% rename from samples/FloorPlan/div.png rename to tilesets/FloorPlan/div.png diff --git a/samples/FloorPlan/divt.png b/tilesets/FloorPlan/divt.png similarity index 100% rename from samples/FloorPlan/divt.png rename to tilesets/FloorPlan/divt.png diff --git a/samples/FloorPlan/divturn.png b/tilesets/FloorPlan/divturn.png similarity index 100% rename from samples/FloorPlan/divturn.png rename to tilesets/FloorPlan/divturn.png diff --git a/samples/FloorPlan/door.png b/tilesets/FloorPlan/door.png similarity index 100% rename from samples/FloorPlan/door.png rename to tilesets/FloorPlan/door.png diff --git a/samples/FloorPlan/empty.png b/tilesets/FloorPlan/empty.png similarity index 100% rename from samples/FloorPlan/empty.png rename to tilesets/FloorPlan/empty.png diff --git a/samples/FloorPlan/floor.png b/tilesets/FloorPlan/floor.png similarity index 100% rename from samples/FloorPlan/floor.png rename to tilesets/FloorPlan/floor.png diff --git a/samples/FloorPlan/glass.png b/tilesets/FloorPlan/glass.png similarity index 100% rename from samples/FloorPlan/glass.png rename to tilesets/FloorPlan/glass.png diff --git a/samples/FloorPlan/halfglass.png b/tilesets/FloorPlan/halfglass.png similarity index 100% rename from samples/FloorPlan/halfglass.png rename to tilesets/FloorPlan/halfglass.png diff --git a/samples/FloorPlan/in.png b/tilesets/FloorPlan/in.png similarity index 100% rename from samples/FloorPlan/in.png rename to tilesets/FloorPlan/in.png diff --git a/samples/FloorPlan/out.png b/tilesets/FloorPlan/out.png similarity index 100% rename from samples/FloorPlan/out.png rename to tilesets/FloorPlan/out.png diff --git a/samples/FloorPlan/stairs.png b/tilesets/FloorPlan/stairs.png similarity index 100% rename from samples/FloorPlan/stairs.png rename to tilesets/FloorPlan/stairs.png diff --git a/samples/FloorPlan/table.png b/tilesets/FloorPlan/table.png similarity index 100% rename from samples/FloorPlan/table.png rename to tilesets/FloorPlan/table.png diff --git a/samples/FloorPlan/vent.png b/tilesets/FloorPlan/vent.png similarity index 100% rename from samples/FloorPlan/vent.png rename to tilesets/FloorPlan/vent.png diff --git a/samples/FloorPlan/w.png b/tilesets/FloorPlan/w.png similarity index 100% rename from samples/FloorPlan/w.png rename to tilesets/FloorPlan/w.png diff --git a/samples/FloorPlan/wall.png b/tilesets/FloorPlan/wall.png similarity index 100% rename from samples/FloorPlan/wall.png rename to tilesets/FloorPlan/wall.png diff --git a/samples/FloorPlan/walldiv.png b/tilesets/FloorPlan/walldiv.png similarity index 100% rename from samples/FloorPlan/walldiv.png rename to tilesets/FloorPlan/walldiv.png diff --git a/samples/FloorPlan/window.png b/tilesets/FloorPlan/window.png similarity index 100% rename from samples/FloorPlan/window.png rename to tilesets/FloorPlan/window.png diff --git a/samples/Knots/data.xml b/tilesets/Knots.xml similarity index 99% rename from samples/Knots/data.xml rename to tilesets/Knots.xml index 9cd54d5..4533a84 100644 --- a/samples/Knots/data.xml +++ b/tilesets/Knots.xml @@ -1,4 +1,4 @@ - + diff --git a/samples/Knots/corner.png b/tilesets/Knots/corner.png similarity index 100% rename from samples/Knots/corner.png rename to tilesets/Knots/corner.png diff --git a/samples/Knots/cross.png b/tilesets/Knots/cross.png similarity index 100% rename from samples/Knots/cross.png rename to tilesets/Knots/cross.png diff --git a/samples/Knots/empty.png b/tilesets/Knots/empty.png similarity index 100% rename from samples/Knots/empty.png rename to tilesets/Knots/empty.png diff --git a/samples/Knots/line.png b/tilesets/Knots/line.png similarity index 100% rename from samples/Knots/line.png rename to tilesets/Knots/line.png diff --git a/samples/Knots/t.png b/tilesets/Knots/t.png similarity index 100% rename from samples/Knots/t.png rename to tilesets/Knots/t.png diff --git a/samples/Rooms/data.xml b/tilesets/Rooms.xml similarity index 99% rename from samples/Rooms/data.xml rename to tilesets/Rooms.xml index 989e045..94d9434 100644 --- a/samples/Rooms/data.xml +++ b/tilesets/Rooms.xml @@ -1,4 +1,4 @@ - + diff --git a/samples/Rooms/bend.png b/tilesets/Rooms/bend.png similarity index 100% rename from samples/Rooms/bend.png rename to tilesets/Rooms/bend.png diff --git a/samples/Rooms/corner.png b/tilesets/Rooms/corner.png similarity index 100% rename from samples/Rooms/corner.png rename to tilesets/Rooms/corner.png diff --git a/samples/Rooms/corridor.png b/tilesets/Rooms/corridor.png similarity index 100% rename from samples/Rooms/corridor.png rename to tilesets/Rooms/corridor.png diff --git a/samples/Rooms/door.png b/tilesets/Rooms/door.png similarity index 100% rename from samples/Rooms/door.png rename to tilesets/Rooms/door.png diff --git a/samples/Rooms/empty.png b/tilesets/Rooms/empty.png similarity index 100% rename from samples/Rooms/empty.png rename to tilesets/Rooms/empty.png diff --git a/samples/Rooms/side.png b/tilesets/Rooms/side.png similarity index 100% rename from samples/Rooms/side.png rename to tilesets/Rooms/side.png diff --git a/samples/Rooms/t.png b/tilesets/Rooms/t.png similarity index 100% rename from samples/Rooms/t.png rename to tilesets/Rooms/t.png diff --git a/samples/Rooms/turn.png b/tilesets/Rooms/turn.png similarity index 100% rename from samples/Rooms/turn.png rename to tilesets/Rooms/turn.png diff --git a/samples/Rooms/wall.png b/tilesets/Rooms/wall.png similarity index 100% rename from samples/Rooms/wall.png rename to tilesets/Rooms/wall.png diff --git a/samples/Summer/data.xml b/tilesets/Summer.xml similarity index 93% rename from samples/Summer/data.xml rename to tilesets/Summer.xml index 77a55fe..1362ac1 100644 --- a/samples/Summer/data.xml +++ b/tilesets/Summer.xml @@ -1,12 +1,12 @@ - + - - - + + + diff --git a/samples/Summer/cliff 0.png b/tilesets/Summer/cliff 0.png similarity index 100% rename from samples/Summer/cliff 0.png rename to tilesets/Summer/cliff 0.png diff --git a/samples/Summer/cliff 1.png b/tilesets/Summer/cliff 1.png similarity index 100% rename from samples/Summer/cliff 1.png rename to tilesets/Summer/cliff 1.png diff --git a/samples/Summer/cliff 2.png b/tilesets/Summer/cliff 2.png similarity index 100% rename from samples/Summer/cliff 2.png rename to tilesets/Summer/cliff 2.png diff --git a/samples/Summer/cliff 3.png b/tilesets/Summer/cliff 3.png similarity index 100% rename from samples/Summer/cliff 3.png rename to tilesets/Summer/cliff 3.png diff --git a/samples/Summer/cliffcorner 0.png b/tilesets/Summer/cliffcorner 0.png similarity index 100% rename from samples/Summer/cliffcorner 0.png rename to tilesets/Summer/cliffcorner 0.png diff --git a/samples/Summer/cliffcorner 1.png b/tilesets/Summer/cliffcorner 1.png similarity index 100% rename from samples/Summer/cliffcorner 1.png rename to tilesets/Summer/cliffcorner 1.png diff --git a/samples/Summer/cliffcorner 2.png b/tilesets/Summer/cliffcorner 2.png similarity index 100% rename from samples/Summer/cliffcorner 2.png rename to tilesets/Summer/cliffcorner 2.png diff --git a/samples/Summer/cliffcorner 3.png b/tilesets/Summer/cliffcorner 3.png similarity index 100% rename from samples/Summer/cliffcorner 3.png rename to tilesets/Summer/cliffcorner 3.png diff --git a/samples/Summer/cliffturn 0.png b/tilesets/Summer/cliffturn 0.png similarity index 100% rename from samples/Summer/cliffturn 0.png rename to tilesets/Summer/cliffturn 0.png diff --git a/samples/Summer/cliffturn 1.png b/tilesets/Summer/cliffturn 1.png similarity index 100% rename from samples/Summer/cliffturn 1.png rename to tilesets/Summer/cliffturn 1.png diff --git a/samples/Summer/cliffturn 2.png b/tilesets/Summer/cliffturn 2.png similarity index 100% rename from samples/Summer/cliffturn 2.png rename to tilesets/Summer/cliffturn 2.png diff --git a/samples/Summer/cliffturn 3.png b/tilesets/Summer/cliffturn 3.png similarity index 100% rename from samples/Summer/cliffturn 3.png rename to tilesets/Summer/cliffturn 3.png diff --git a/samples/Summer/grass 0.png b/tilesets/Summer/grass 0.png similarity index 100% rename from samples/Summer/grass 0.png rename to tilesets/Summer/grass 0.png diff --git a/samples/Summer/grasscorner 0.png b/tilesets/Summer/grasscorner 0.png similarity index 100% rename from samples/Summer/grasscorner 0.png rename to tilesets/Summer/grasscorner 0.png diff --git a/samples/Summer/grasscorner 1.png b/tilesets/Summer/grasscorner 1.png similarity index 100% rename from samples/Summer/grasscorner 1.png rename to tilesets/Summer/grasscorner 1.png diff --git a/samples/Summer/grasscorner 2.png b/tilesets/Summer/grasscorner 2.png similarity index 100% rename from samples/Summer/grasscorner 2.png rename to tilesets/Summer/grasscorner 2.png diff --git a/samples/Summer/grasscorner 3.png b/tilesets/Summer/grasscorner 3.png similarity index 100% rename from samples/Summer/grasscorner 3.png rename to tilesets/Summer/grasscorner 3.png diff --git a/samples/Summer/road 0.png b/tilesets/Summer/road 0.png similarity index 100% rename from samples/Summer/road 0.png rename to tilesets/Summer/road 0.png diff --git a/samples/Summer/road 1.png b/tilesets/Summer/road 1.png similarity index 100% rename from samples/Summer/road 1.png rename to tilesets/Summer/road 1.png diff --git a/samples/Summer/road 2.png b/tilesets/Summer/road 2.png similarity index 100% rename from samples/Summer/road 2.png rename to tilesets/Summer/road 2.png diff --git a/samples/Summer/road 3.png b/tilesets/Summer/road 3.png similarity index 100% rename from samples/Summer/road 3.png rename to tilesets/Summer/road 3.png diff --git a/samples/Summer/roadturn 0.png b/tilesets/Summer/roadturn 0.png similarity index 100% rename from samples/Summer/roadturn 0.png rename to tilesets/Summer/roadturn 0.png diff --git a/samples/Summer/roadturn 1.png b/tilesets/Summer/roadturn 1.png similarity index 100% rename from samples/Summer/roadturn 1.png rename to tilesets/Summer/roadturn 1.png diff --git a/samples/Summer/roadturn 2.png b/tilesets/Summer/roadturn 2.png similarity index 100% rename from samples/Summer/roadturn 2.png rename to tilesets/Summer/roadturn 2.png diff --git a/samples/Summer/roadturn 3.png b/tilesets/Summer/roadturn 3.png similarity index 100% rename from samples/Summer/roadturn 3.png rename to tilesets/Summer/roadturn 3.png diff --git a/samples/Summer/water_a 0.png b/tilesets/Summer/water_a 0.png similarity index 100% rename from samples/Summer/water_a 0.png rename to tilesets/Summer/water_a 0.png diff --git a/samples/Summer/water_b 0.png b/tilesets/Summer/water_b 0.png similarity index 100% rename from samples/Summer/water_b 0.png rename to tilesets/Summer/water_b 0.png diff --git a/samples/Summer/water_c 0.png b/tilesets/Summer/water_c 0.png similarity index 100% rename from samples/Summer/water_c 0.png rename to tilesets/Summer/water_c 0.png diff --git a/samples/Summer/watercorner 0.png b/tilesets/Summer/watercorner 0.png similarity index 100% rename from samples/Summer/watercorner 0.png rename to tilesets/Summer/watercorner 0.png diff --git a/samples/Summer/watercorner 1.png b/tilesets/Summer/watercorner 1.png similarity index 100% rename from samples/Summer/watercorner 1.png rename to tilesets/Summer/watercorner 1.png diff --git a/samples/Summer/watercorner 2.png b/tilesets/Summer/watercorner 2.png similarity index 100% rename from samples/Summer/watercorner 2.png rename to tilesets/Summer/watercorner 2.png diff --git a/samples/Summer/watercorner 3.png b/tilesets/Summer/watercorner 3.png similarity index 100% rename from samples/Summer/watercorner 3.png rename to tilesets/Summer/watercorner 3.png diff --git a/samples/Summer/waterside 0.png b/tilesets/Summer/waterside 0.png similarity index 100% rename from samples/Summer/waterside 0.png rename to tilesets/Summer/waterside 0.png diff --git a/samples/Summer/waterside 1.png b/tilesets/Summer/waterside 1.png similarity index 100% rename from samples/Summer/waterside 1.png rename to tilesets/Summer/waterside 1.png diff --git a/samples/Summer/waterside 2.png b/tilesets/Summer/waterside 2.png similarity index 100% rename from samples/Summer/waterside 2.png rename to tilesets/Summer/waterside 2.png diff --git a/samples/Summer/waterside 3.png b/tilesets/Summer/waterside 3.png similarity index 100% rename from samples/Summer/waterside 3.png rename to tilesets/Summer/waterside 3.png diff --git a/samples/Summer/waterturn 0.png b/tilesets/Summer/waterturn 0.png similarity index 100% rename from samples/Summer/waterturn 0.png rename to tilesets/Summer/waterturn 0.png diff --git a/samples/Summer/waterturn 1.png b/tilesets/Summer/waterturn 1.png similarity index 100% rename from samples/Summer/waterturn 1.png rename to tilesets/Summer/waterturn 1.png diff --git a/samples/Summer/waterturn 2.png b/tilesets/Summer/waterturn 2.png similarity index 100% rename from samples/Summer/waterturn 2.png rename to tilesets/Summer/waterturn 2.png diff --git a/samples/Summer/waterturn 3.png b/tilesets/Summer/waterturn 3.png similarity index 100% rename from samples/Summer/waterturn 3.png rename to tilesets/Summer/waterturn 3.png