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)); }));
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); }