Esempio n. 1
0
        public void TestRotationalAddAdjacencies()
        {
            var model = new AdjacentModel(DirectionSet.Cartesian2d);
            var tile1 = new Tile(1);
            var tile2 = new Tile(2);

            model.SetFrequency(tile1, 1);
            model.SetFrequency(tile2, 5);

            model.AddAdjacency(new[] { tile1 }, new[] { tile2 }, 1, 0, 0, new TileRotation(4, false));

            var patternModel = model.GetTileModelMapping(new GridTopology(10, 10, false)).PatternModel;

            Assert.AreEqual(1, patternModel.Frequencies[0]);
            Assert.AreEqual(5, patternModel.Frequencies[1]);

            CollectionAssert.AreEquivalent(new[] { 1 }, patternModel.Propagator[0][0]);
            CollectionAssert.AreEquivalent(new[] { 1 }, patternModel.Propagator[0][1]);
            CollectionAssert.AreEquivalent(new[] { 1 }, patternModel.Propagator[0][2]);
            CollectionAssert.AreEquivalent(new[] { 1 }, patternModel.Propagator[0][3]);
            CollectionAssert.AreEquivalent(new[] { 0 }, patternModel.Propagator[1][0]);
            CollectionAssert.AreEquivalent(new[] { 0 }, patternModel.Propagator[1][1]);
            CollectionAssert.AreEquivalent(new[] { 0 }, patternModel.Propagator[1][2]);
            CollectionAssert.AreEquivalent(new[] { 0 }, patternModel.Propagator[1][3]);
        }
Esempio n. 2
0
        public void TestSetFrequencyWithRotations()
        {
            var model = new AdjacentModel(DirectionSet.Cartesian2d);

            var tile1 = new Tile(1);
            var tile2 = new Tile(2);

            var builder = new TileRotationBuilder(4, true);

            builder.AddSymmetry(tile1, TileSymmetry.T);
            builder.SetTreatment(tile1, TileRotationTreatment.Generated);
            builder.SetTreatment(tile2, TileRotationTreatment.Generated);

            var rotations = builder.Build();

            model.SetFrequency(tile1, 1.0, rotations);
            model.SetFrequency(tile2, 1.0, rotations);

            var tileModelMapping = model.GetTileModelMapping(new GridTopology(10, 10, false));
            var patternModel     = tileModelMapping.PatternModel;

            double GetFrequency(Tile tile)
            {
                return(patternModel.Frequencies[tileModelMapping.TilesToPatternsByOffset[0][tile].First()]);
            }

            Assert.AreEqual(0.25, GetFrequency(tile1));
            Assert.AreEqual(0.25, GetFrequency(new Tile(new RotatedTile {
                Tile = tile1, Rotation = new Rotation(90)
            })));
            Assert.AreEqual(0.125, GetFrequency(tile2));
        }
Esempio n. 3
0
        public void TestSimpleAddAdjacencies()
        {
            var model = new AdjacentModel(Directions.Cartesian2d);
            var tile1 = new Tile(1);
            var tile2 = new Tile(2);

            model.SetFrequency(tile1, 1);
            model.SetFrequency(tile2, 5);
            model.AddAdjacency(tile1, tile2, 1, 0, 0);
            model.AddAdjacency(tile1, tile2, 0, 1, 0);
            model.AddAdjacency(tile2, tile1, 1, 0, 0);
            model.AddAdjacency(tile2, tile1, 0, 1, 0);

            var patternModel = model.GetPatternModel();

            Assert.AreEqual(1, patternModel.Frequencies[0]);
            Assert.AreEqual(5, patternModel.Frequencies[1]);

            CollectionAssert.AreEquivalent(new[] { 1 }, patternModel.Propagator[0][0]);
            CollectionAssert.AreEquivalent(new[] { 1 }, patternModel.Propagator[0][1]);
            CollectionAssert.AreEquivalent(new[] { 1 }, patternModel.Propagator[0][2]);
            CollectionAssert.AreEquivalent(new[] { 1 }, patternModel.Propagator[0][3]);
            CollectionAssert.AreEquivalent(new[] { 0 }, patternModel.Propagator[1][0]);
            CollectionAssert.AreEquivalent(new[] { 0 }, patternModel.Propagator[1][1]);
            CollectionAssert.AreEquivalent(new[] { 0 }, patternModel.Propagator[1][2]);
            CollectionAssert.AreEquivalent(new[] { 0 }, patternModel.Propagator[1][3]);
        }
Esempio n. 4
0
        public void TestSetFrequency()
        {
            var model = new AdjacentModel(DirectionSet.Cartesian2d);

            model.SetFrequency(new Tile(1), 0.5);
            model.SetFrequency(new Tile(2), 2.0);

            var patternModel = model.GetTileModelMapping(new GridTopology(10, 10, false)).PatternModel;

            Assert.AreEqual(0.5, patternModel.Frequencies[0]);
            Assert.AreEqual(2.0, patternModel.Frequencies[1]);
        }
        public void TestSetFrequency()
        {
            var model = new AdjacentModel(Directions.Cartesian2d);

            model.SetFrequency(new Tile(1), 0.5);
            model.SetFrequency(new Tile(2), 2.0);

            var patternModel = model.GetPatternModel();

            Assert.AreEqual(0.5, patternModel.Frequencies[0]);
            Assert.AreEqual(2.0, patternModel.Frequencies[1]);
        }
Esempio n. 6
0
        internal TesseraGeneratorHelper CreateTesseraGeneratorHelper(TesseraGenerateOptions options = null)
        {
            options = options ?? new TesseraGenerateOptions();
            var progress = options.progress;

            var seed = options.seed == 0 ? UnityEngine.Random.Range(int.MinValue, int.MaxValue) : options.seed;

            var xororng = new XoRoRNG(seed);

            Validate();

            TesseraGeneratorHelper.SetupModelFromTiles(tiles, out var allTiles, out var internalAdjacencies, out var tilesByFaceDir);

            var model = new AdjacentModel(DirectionSet.Cartesian3d);

            foreach (var(tile, frequency) in allTiles)
            {
                model.SetFrequency(tile, frequency);
            }

            foreach (var(tile1, tile2, d) in internalAdjacencies)
            {
                model.AddAdjacency(tile1, tile2, d);
            }

            // Generate adjacencies
            AddAdjacency(palette, model, Direction.XPlus, tilesByFaceDir[FaceDir.Right], tilesByFaceDir[FaceDir.Left]);
            AddAdjacency(palette, model, Direction.YPlus, tilesByFaceDir[FaceDir.Up], tilesByFaceDir[FaceDir.Down]);
            AddAdjacency(palette, model, Direction.ZPlus, tilesByFaceDir[FaceDir.Forward], tilesByFaceDir[FaceDir.Back]);

            var initialConstraints = searchInitialConstraints ? GetInitialConstraints() : this.initialConstraints;

            var constraints = GetTileConstraints(model);

            var actualSkyBox = skyBox == null ? null : new TesseraInitialConstraint
            {
                faceDetails = skyBox.faceDetails,
                offsets     = skyBox.offsets,
            };

            return(new TesseraGeneratorHelper(
                       palette,
                       model,
                       allTiles,
                       initialConstraints,
                       constraints,
                       tilesByFaceDir,
                       size,
                       backtrack,
                       actualSkyBox,
                       progress,
                       null,
                       xororng,
                       options.cancellationToken));
        }
Esempio n. 7
0
        public void MirrorSetup()
        {
            var trb = new TileRotationBuilder(4, true, TileRotationTreatment.Missing);

            var tile1 = new Tile(1);
            var tile2 = new Tile(2);
            var tile3 = new Tile(3);
            var tile4 = new Tile(4);
            var tile5 = new Tile(5);

            var tiles = new[] { tile1, tile2, tile3, tile4 };

            var reflectX = new Rotation(0, true);

            trb.Add(tile1, reflectX, tile2);
            trb.Add(tile3, reflectX, tile3);
            trb.Add(tile5, reflectX, tile5);

            var model = new AdjacentModel(DirectionSet.Cartesian2d);

            model.AddAdjacency(tiles, tiles, Direction.XPlus);
            model.AddAdjacency(new[] { tile5 }, tiles, Direction.XPlus);
            model.AddAdjacency(new[] { tile5 }, tiles, Direction.XMinus);
            model.AddAdjacency(tiles, tiles, Direction.YPlus);


            model.SetUniformFrequency();
            model.SetFrequency(tile5, 0.0);

            var tr = trb.Build();

            var constraints = new[] { new MirrorXConstraint {
                                          TileRotation = tr
                                      } };


            // NB: It's important that width is an odd number
            var topology = new GridTopology(31, 31, false);

            var options = new TilePropagatorOptions
            {
                Constraints = constraints,
            };

            propagator7 = new TilePropagator(model, topology, options);
        }
        public void TestMirrorConstraint()
        {
            var trb = new TileRotationBuilder(4, true, TileRotationTreatment.Missing);

            var tile1 = new Tile(1);
            var tile2 = new Tile(2);
            var tile3 = new Tile(3);
            var tile4 = new Tile(4);
            var tile5 = new Tile(5);

            var tiles = new[] { tile1, tile2, tile3, tile4 };

            var reflectX = new Rotation(0, true);

            trb.Add(tile1, reflectX, tile2);
            trb.Add(tile3, reflectX, tile3);
            trb.Add(tile5, reflectX, tile5);

            var model = new AdjacentModel(DirectionSet.Cartesian2d);

            model.AddAdjacency(tiles, tiles, Direction.XPlus);
            model.AddAdjacency(new[] { tile5 }, tiles, Direction.XPlus);
            model.AddAdjacency(new[] { tile5 }, tiles, Direction.XMinus);

            model.SetUniformFrequency();
            model.SetFrequency(tile5, 0.0);

            var tr = trb.Build();

            var constraints = new[] { new MirrorXConstraint {
                                          TileRotation = tr
                                      } };

            // tile1 reflects to tile 2
            {
                var t2 = new GridTopology(2, 1, false);
                var p2 = new TilePropagator(model, t2, constraints: constraints);
                p2.Select(0, 0, 0, tile1);
                var status = p2.Run();
                Assert.AreEqual(Resolution.Decided, status);
                Assert.AreEqual(tile2, p2.ToArray().Get(1, 0));
            }

            // tile3 reflects to tile3
            {
                var t2 = new GridTopology(2, 1, false);
                var p2 = new TilePropagator(model, t2, constraints: constraints);
                p2.Select(0, 0, 0, tile3);
                var status = p2.Run();
                Assert.AreEqual(Resolution.Decided, status);
                Assert.AreEqual(tile3, p2.ToArray().Get(1, 0));
            }

            // tile3 only tile that can go in a central space
            // (tile5 can go, but has zero frequency)
            // So tile3 should be selected reliably
            {
                var t2     = new GridTopology(3, 1, false);
                var p2     = new TilePropagator(model, t2, constraints: constraints);
                var status = p2.Run();
                Assert.AreEqual(Resolution.Decided, status);
                Assert.AreEqual(tile3, p2.ToArray().Get(1, 0));
            }

            // tile5 can be reflected, but cannot
            // be placed adjacent to it's own reflection
            {
                var t2 = new GridTopology(2, 1, false);
                var p2 = new TilePropagator(model, t2, constraints: constraints);
                p2.Select(0, 0, 0, tile5);
                var status = p2.Run();
                Assert.AreEqual(Resolution.Contradiction, status);
            }

            {
                var t2 = new GridTopology(4, 1, false);
                var p2 = new TilePropagator(model, t2, constraints: constraints);
                p2.Select(0, 0, 0, tile5);
                var status = p2.Run();
                Assert.AreEqual(Resolution.Decided, status);
            }
        }