protected PoissonDiskSampling CreatePointGenerator()
    {
        PoissonDiskSampling pointGenerator = _controller.gameObject.AddComponent <PoissonDiskSampling>();

        _controller.pointGenerator = pointGenerator;
        return(pointGenerator);
    }
示例#2
0
        /** Pass in the constructor from the poisson-disk-sampling module */
        public MeshBuilder addPoisson(float spacing, Rander.RandFloat rng)
        {
            var generator = new PoissonDiskSampling(new int[] { 1000, 1000 }, spacing, 0, 0, rng);

            foreach (var p in this.points)
            {
                generator.addPoint(new Float[] { p[0], p[1] });
            }
            this.points = generator.fill();
            return(this);
        }
        /// <summary>
        /// Generates a foreground layer of objects at the start of each scenario iteration
        /// </summary>
        protected override void OnIterationStart()
        {
            var seed             = SamplerState.NextRandomState();
            var placementSamples = PoissonDiskSampling.GenerateSamples(
                placementArea.x, placementArea.y, separationDistance, seed);
            var offset = new Vector3(placementArea.x, placementArea.y, 0f) * -0.5f;

            foreach (var sample in placementSamples)
            {
                var instance = m_GameObjectOneWayCache.GetOrInstantiate(prefabs.Sample());
                instance.transform.position = new Vector3(sample.x, sample.y, depth) + offset;
            }
            placementSamples.Dispose();
        }
示例#4
0
    public void GenerateObjects(float[,] heightMap, MapGenerator mapGenerator)
    {
        prng = new System.Random(mapGenerator.seed);
        this.mapGenerator = mapGenerator;
        int chunkCount = mapGenerator.mapSizeX * mapGenerator.mapSizeY;

        LOD = MapGenerator.LOD;

        int width  = heightMap.GetLength(0);
        int height = heightMap.GetLength(1);
        Dictionary <int, List <Vector2> > objectsMap = new Dictionary <int, List <Vector2> >();

        for (int i = 0; i < objects.Count; i++)
        {
            objectsMap.Add(i, PoissonDiskSampling.GeneratePoints(mapGenerator.seed, width, height, LOD, chunkCount, objects[i].spawnRadius, objects[i].spawnIterationCount));
            SpawnObjects(objectsMap[i], objects[i], heightMap);
        }
    }
    void PlaceLayerTwoObjects()
    {
        if (m_LayerTwoSpawnedObjects == null)
        {
            m_LayerTwoSpawnedObjects = new List <GameObject>();
        }

        var seed             = scenario.GenerateRandomSeed();
        var placementSamples = PoissonDiskSampling.GenerateSamples(
            layerTwoPlacementArea.x, layerTwoPlacementArea.y, layerTwoSeparationDistance.Sample(), seed);
        var offset = new Vector3(layerTwoPlacementArea.x, layerTwoPlacementArea.y, 0) * -0.5f;
        var parent = scenario.transform;

        foreach (var sample in placementSamples)
        {
            var instance = Object.Instantiate(layerTwoPrefabs.Sample(), parent);
            instance.transform.position = new Vector3(sample.x, sample.y, layerTwoDepth + layerTwoDepthDisplacement.Sample()) + offset;
            m_LayerTwoSpawnedObjects.Add(instance);
        }
        placementSamples.Dispose();
    }
    /// <summary>
    /// Generates a foreground layer of objects at the start of each scenario iteration
    /// </summary>
    protected override void OnIterationStart()
    {
        if (m_SpawnedObjects == null)
        {
            m_SpawnedObjects = new List <GameObject>();
        }

        var seed             = scenario.GenerateRandomSeed();
        var placementSamples = PoissonDiskSampling.GenerateSamples(
            placementArea.x, placementArea.y, separationDistance.Sample(), seed);
        var offset = new Vector3(placementArea.x, placementArea.y, 0f) * -0.5f;
        var parent = scenario.transform;

        foreach (var sample in placementSamples)
        {
            var instance = UnityEngine.Object.Instantiate(prefabs.Sample(), parent);
            instance.transform.position = new Vector3(sample.x, sample.y, depth) + offset;
            m_SpawnedObjects.Add(instance);
        }
        placementSamples.Dispose();
    }
        void PlaceObjects()
        {
            m_SpawnedCount = 0;

            var seed             = SamplerState.NextRandomState();
            var placementSamples = PoissonDiskSampling.GenerateSamples(
                placementArea.x, placementArea.y, separationDistance.Sample(), seed);
            var offset = new Vector3(placementArea.x, placementArea.y, 0) * -0.5f;

            foreach (var sample in placementSamples)
            {
                var instance = m_GameObjectOneWayCache.GetOrInstantiate(prefabs.Sample());
                instance.transform.position = new Vector3(sample.x, sample.y, depth) + offset;
                m_SpawnedObjects.Add(instance);

                if (++m_SpawnedCount == maxObjectCount)
                {
                    break;
                }
            }
            placementSamples.Dispose();
        }
示例#8
0
        public PointsData(int seed, int width, int height, float mountainSpacing, float spacing)
        {
            var shape        = new int[] { width, height };
            var poissonPeaks = new PoissonDiskSampling(shape, mountainSpacing, 0, 0, Rander.makeRandFloat(seed)).fill();

            var generator = new PoissonDiskSampling(shape, spacing, 0, 0, Rander.makeRandFloat(seed));

            foreach (var p in poissonPeaks)
            {
                generator.addPoint(p);
            }
            var mesh      = generator.fill();
            var tmpPoints = new int[mesh.Count];
            var indexs    = new int[mesh.Count];

            for (int i = 0; i < indexs.Length; ++i)
            {
                var p = mesh[i];
                tmpPoints[i] = ((int)p[0]) << 16 | (int)p[1];
                indexs[i]    = i;
            }
            Array.Sort(tmpPoints, indexs);

            points = new UInt16[tmpPoints.Length][];
            peaks  = new UInt16[poissonPeaks.Count];

            int count = 0;

            for (int i = 0; i < indexs.Length; ++i)
            {
                var p = tmpPoints[i];
                points[i] = new UInt16[] { (UInt16)((p >> 16) & 0xffff), (UInt16)(p & 0xffff) };
                if (indexs[i] < peaks.Length)
                {
                    peaks[count++] = (UInt16)i;
                }
            }
        }
示例#9
0
 void OnValidate()
 {
     points = PoissonDiskSampling.GeneratePoints(radius, regionSize, rejectionSamples);
 }