Exemple #1
0
        public void TestRandomVsPoissonVisually()
        {
            Vector2 region = new Vector2(400, 400);
            var     radius = 20;

            List <Vector2> poissonPoints = PoissonDiscSampler.GeneratePoints(radius, region, 30);

            foreach (var point in poissonPoints)
            {
                Assert.IsTrue(point.X >= 0 && point.X < region.X, $"Point {point.X} not in X region 0,{region.X}");
                Assert.IsTrue(point.Y >= 0 && point.Y < region.Y, $"Point {point.Y} not in Y region 0,{region.Y}");
            }

            List <Vector2> randomPoints = RandomSampler.GeneratePoints(poissonPoints.Count, region);

            {   //draw poission samples
                ImageDrawing imageDrawing = new ImageDrawing((int)region.X, (int)region.Y);
                imageDrawing.Clear(Color.Transparent);
                imageDrawing.FillCircles(poissonPoints, radius, Color.Black);
                imageDrawing.SaveImage("comp_2_poisson_disc.png");
            }

            {   // draw random samples
                ImageDrawing imageDrawing = new ImageDrawing((int)region.X, (int)region.Y);
                imageDrawing.Clear(Color.Transparent);
                imageDrawing.FillCircles(randomPoints, radius, Color.Black);
                imageDrawing.SaveImage("comp_1_random.png");
            }

            Console.WriteLine($"Generated {poissonPoints.Count} points.");
        }
        public void IslandPipelineTest()
        {
            Pipeline pipeline = PipelineUtility.CreateEmptyPipelineUsingGraph("World Graph");

            Vector2 worldRegion   = new Vector2(2000, 2000);
            float   islandSize    = 300;
            float   voronoiRadius = islandSize * 0.15f;
            string  zoneLayerName = "ZoneLayer";

            pipeline.AddStep(new PoissonLocationsAsEntitiesPipelineStep(islandSize, new(islandSize / 2, islandSize / 2),
                                                                        worldRegion - new Vector2(islandSize, islandSize), null, 60));
            pipeline.AddStep(SetupIslandVisualizationStep(worldRegion, islandSize));
            pipeline.AddStep(new IslandTypeAssignment(worldRegion / 2));
            pipeline.AddStep(SetupIslandTypeVisualizationStep(worldRegion, islandSize));
            pipeline.AddStep(new IteratorPipelineStep <Entity>(
                                 graph => graph.Entities,
                                 node =>
            {
                var(centerX, centerY) = ComponentUtility.GetPosition2DFromComponent(node);
                Vector2 islandMin     = new(centerX - islandSize / 2, centerY - islandSize / 2);
                Vector2 islandMax     = new(centerX + islandSize / 2, centerY + islandSize / 2);
                return(new VoronoiPipelineStep(
                           () => PoissonDiscSampler.GeneratePoints(voronoiRadius, new(islandSize, islandSize), islandMin),
                           zoneLayerName, islandMin, islandMax, node));
            }));
Exemple #3
0
        public void TestPoissonVisually()
        {
            Vector2 region = new Vector2(400, 400);
            var     radius = 80;

            List <Vector2> points = PoissonDiscSampler.GeneratePoints(radius, region, 30);

            foreach (var point in points)
            {
                Assert.IsTrue(point.X >= 0 && point.X < region.X, $"Point {point.X} not in X region 0,{region.X}");
                Assert.IsTrue(point.Y >= 0 && point.Y < region.Y, $"Point {point.Y} not in Y region 0,{region.Y}");
            }

            ImageDrawing imageDrawing = new ImageDrawing((int)region.X, (int)region.Y);

            imageDrawing.Clear(Color.Gray);
            imageDrawing.FillCircles(points, radius, Color.DarkRed);
            imageDrawing.SaveImage("poisson_disc_tmp.png");
        }
    public void Generate()
    {
        sampler.Radius = Random.Range(8, 81);
        var points = sampler.GeneratePoints((int)ParentChunk.Terrain.terrainData.size.x);

        for (var t = 0; t < points.Count; t++)
        {
            if (points[t] != null)
            {
                Vector3 pos = (Vector3)points[t];

                //sinking into terrain to hide seams
                float newY = ParentChunk.Terrain.terrainData.GetHeight((int)pos.x, (int)pos.z) - 0.08f;
                if (newY > TerrainChunkSettings.SeaLevelGlobal && sparseMask.GetValue(pos.x, 0, pos.z) < 0.15f)
                {
                    //set the offset
                    Vector3 offsetPosition = new Vector3(
                        (ParentChunk.Position.X * ParentChunk.Terrain.terrainData.size.x),
                        newY,
                        (ParentChunk.Position.Z * ParentChunk.Terrain.terrainData.size.z)
                        );

                    //random horizontal rotation
                    Quaternion randomRotation = Quaternion.Euler(0, UnityEngine.Random.Range(0, 360), 0);

                    //set random scale/size adjustments
                    float   scaleModifier = UnityEngine.Random.Range(-0.3f, 0.3f);
                    Vector3 randomScale   = new Vector3(scaleModifier, scaleModifier, scaleModifier);
                    var     spawnPosition = pos + offsetPosition;

                    GameObject asset        = ChooseRandomAsset();
                    GameObject spawnedAsset = Instantiate(asset, spawnPosition, randomRotation);
                    spawnedAsset.name = "Tree (Valid)";
                    spawnedAsset.transform.localScale = spawnedAsset.transform.localScale + randomScale;
                    spawnedAsset.transform.parent     = this.transform;
                    PlacedAssets.Add(spawnedAsset);
                    RemoveOverlappingAssets(spawnedAsset);
                }
            }
        }
    }
        public Graph ExecuteStep(Graph graph)
        {
            List <Vector2> points = PoissonDiscSampler.GeneratePoints(_radius, _sampleRegionSize, _offset, _rejectionThreshold);

            foreach (var point in points)
            {
                Entity entity = new(_cellNameSupplier.Invoke(point.X, point.Y), graph);
                ComponentUtility.AddPosition2D(entity, point.X, point.Y);

                if (_parent != null)
                {
                    _parent.AddChild(entity);
                }
                else
                {
                    graph.Entities.Add(entity);
                }
            }

            return(graph);
        }