private void Awake()
 {
     if (ChunkRockGenerator.AssetPrefabs == null)
     {
         ChunkRockGenerator.LoadPrefabs();
     }
     this.GameController = GameController.GetSharedInstance();
     this.PlacedAssets   = new List <GameObject>();
     this.sampler        = new PoissonDiscSampler();
 }
        public void Generate()
        {
            //totally random distribution as Poisson doesnt look great.
            var points = FakeDistribution();

            for (var t = 0; t < points.Count; t++)
            {
                if (points[t] != null)
                {
                    //position to place at.
                    Vector3 pos = (Vector3)points[t];
                    if (ParentChunk.Terrain.terrainData.GetHeight((int)pos.x, (int)pos.z) > TerrainChunkSettings.SeaLevelGlobal)
                    {
                        //adjust rock specific height based on steepness to hide edges better
                        float normalizedX       = pos.x / ParentChunk.Terrain.terrainData.size.x;
                        float normalizedY       = pos.z / ParentChunk.Terrain.terrainData.size.z;
                        float slope             = ParentChunk.Terrain.terrainData.GetSteepness(normalizedX, normalizedY);
                        float slopeOffsetHeight = (slope > 25.0f ? 3.2f : 0.5f);

                        //choose random rock type
                        GameObject chosenRock = ChunkRockGenerator.ChooseRandomAsset();

                        //set the offset for placing in the chunks world position X, Z. uses terrain height for Y
                        Vector3 offsetPosition = new Vector3(
                            (ParentChunk.Position.X * ParentChunk.Terrain.terrainData.size.x),
                            ParentChunk.Terrain.terrainData.GetHeight((int)pos.x, (int)pos.z) - slopeOffsetHeight,
                            (ParentChunk.Position.Z * ParentChunk.Terrain.terrainData.size.z)
                            );

                        Vector3 spawnPosition = pos + offsetPosition;
                        //gives rock random rotation in the y-axis
                        Quaternion randomRotation = Quaternion.Euler(0, UnityEngine.Random.Range(0, 360), 0);
                        float      scaleModifer   = UnityEngine.Random.Range(0.1f, 0.5f);
                        Vector3    randomSize     = new Vector3(scaleModifer, scaleModifer, scaleModifer);
                        chosenRock.transform.localScale = randomSize;

                        GameObject spawnedAsset = Instantiate(chosenRock, spawnPosition, randomRotation);
                        //parent it under this component and track it
                        spawnedAsset.transform.parent = this.transform;
                        PlacedAssets.Add(spawnedAsset);
                        RemoveOverlappingAssets(spawnedAsset);
                    }
                }
            }
        }