Пример #1
0
    SampleSet CreateNewSampleSet()
    {
        SampleRegion caves = new SampleRegion
                             (
            Config.Instance.terrain.cave.id,
            NoiseConfig.caveMethod,
            Config.SampleRate,
            new Vector3(1, 1, 1)
                             );
        SampleRegion patterns = new SampleRegion
                                (
            Config.Instance.terrain.pattern.id,
            NoiseConfig.patternMethod,
            Config.SampleRate,
            new Vector3(1, 1, 1)
                                );
        SampleRegion stripes;

        if (!Flags.Get(NoiseFlags.FlipStripes))
        {
            stripes = new SampleRegion
                      (
                Config.Instance.terrain.stripe.id,
                NoiseConfig.stripeMethod,
                Mathf.CeilToInt(Config.SampleRate / 2f),
                new Vector3(1f / Config.Instance.terrain.stretch, Config.Instance.terrain.squish, 1f / Config.Instance.terrain.stretch)
                      );
        }
        else
        {
            stripes = new SampleRegion
                      (
                Config.Instance.terrain.stripe.id,
                NoiseConfig.stripeMethod,
                Mathf.CeilToInt(Config.SampleRate / 2f),
                new Vector3(Config.Instance.terrain.squish, 1f / Config.Instance.terrain.stretch, Config.Instance.terrain.squish)
                      );
        }

        Dictionary <string, SampleRegion> sampleDict = new Dictionary <string, SampleRegion>()
        {
            { "caves", caves },
            { "patterns", patterns },
            { "stripes", stripes }
        };

        SampleSet sampleSet = new SampleSet(sampleDict);

        // Still need to set region
        return(sampleSet);
    }
Пример #2
0
    IEnumerator GetSamplesAsync(SampleRegion i)
    {
        NoiseOptions options = NoiseConfig.options[i.options];
        NoiseOptions drift   = new NoiseOptions();

        if (options.driftMapId != -1)
        {
            drift = NoiseConfig.options[options.driftMapId];
        }

        int h_rate = 2;

        if (Config.Interpolation == InterpolationLevel.Off)
        {
            h_rate = 1;
        }
        int sampleX = (i.region.sizeX / (i.sampleRate * h_rate)) + 1;
        int sampleY = (i.region.sizeY / i.sampleRate) + 1;
        int sampleZ = (i.region.sizeZ / (i.sampleRate * h_rate)) + 1;

        if (i.samples == null || i.samples.Length != sampleX * sampleY * sampleZ)
        {
            i.samples = new float[sampleX, sampleY, sampleZ];
        }

        for (int z = 0; z < sampleZ; z++)
        {
            for (int x = 0; x < sampleX; x++)
            {
                Vector2 location = new Vector2
                                   (
                    (x * i.sampleRate + (i.region.min.x / 2f)) * i.zoom.x,
                    (z * i.sampleRate + (i.region.min.z / 2f)) * i.zoom.z
                                   );

                float driftMap = 0f;
                if (options.driftMapId != -1)
                {
                    driftMap = NoiseGenerator.Sum
                               (
                        NoiseConfig.driftMapMethod,
                        location,
                        drift.frequency.value,
                        drift.octaves,
                        drift.lacunarity,
                        drift.persistance
                               );
                }

                for (int y = 0; y < sampleY; y++)
                {
                    // x and z are calculated above
                    Vector3 position = new Vector3
                                       (
                        location.x,
                        (y * i.sampleRate + i.region.min.y) * i.zoom.y,
                        location.y
                                       );

                    // with drift
                    i.samples[x, y, z] = NoiseGenerator.Sum(
                        i.method,
                        position,
                        options.drift != 0f
                                                        ? Mathf.Lerp(
                            options.frequency.value,
                            driftMap > 0f
                                                                        ? options.frequency.max * options.driftScale
                                                                        : options.frequency.min,
                            Mathf.Abs(driftMap))
                                                        : options.frequency.value,
                        options.octaves,
                        options.lacunarity,
                        options.persistance
                        );
                }
            }
        }

        i.sampled = true;

        yield return(null);
    }
Пример #3
0
    IEnumerator MapExpand(SampleRegion i)
    {
        // Wait for the sampling coroutine to complete.
        for (;;)
        {
            if (!i.sampled)
            {
                yield return(null);
            }
            else
            {
                break;
            }
        }

        Stopwatch stopwatch = new Stopwatch();

        stopwatch.Start();

        NoiseOptions options = NoiseConfig.options[i.options];

        if (i.interpolates == null)
        {
            i.interpolates = new int[
                (i.region.sizeX / i.sampleRate) * i.sampleRate,
                (i.region.sizeY / i.sampleRate) * i.sampleRate,
                (i.region.sizeZ / i.sampleRate) * i.sampleRate
                             ];
        }

        int sampleX = i.region.sizeX / (i.sampleRate * 2) + 1;
        int sampleY = i.region.sizeY / i.sampleRate + 1;
        int sampleZ = i.region.sizeZ / (i.sampleRate * 2) + 1;

        for (int z = 0; z < sampleZ - 1; z++)
        {
            for (int y = 0; y < sampleY - 1; y++)
            {
                for (int x = 0; x < sampleX - 1; x++)
                {
                    float v000 = i.samples[x, y, z];
                    float v100 = i.samples[x + 1, y, z];
                    float v010 = i.samples[x, y + 1, z];
                    float v110 = i.samples[x + 1, y + 1, z];
                    float v001 = i.samples[x, y, z + 1];
                    float v101 = i.samples[x + 1, y, z + 1];
                    float v011 = i.samples[x, y + 1, z + 1];
                    float v111 = i.samples[x + 1, y + 1, z + 1];

                    for (int zi = 0; zi < i.sampleRate * 2; ++zi)
                    {
                        for (int yi = 0; yi < i.sampleRate; ++yi)
                        {
                            for (int xi = 0; xi < i.sampleRate * 2; ++xi)
                            {
                                float tx = (float)xi / (i.sampleRate * 2);
                                float ty = (float)yi / i.sampleRate;
                                float tz = (float)zi / (i.sampleRate * 2);

                                i.interpolates[x * (i.sampleRate * 2) + xi, y *i.sampleRate + yi, z *(i.sampleRate * 2) + zi]
                                    = Mathf.FloorToInt(((
                                                            GameUtils.TriLerp(v000, v100, v010, v110, v001, v101, v011, v111, tx, ty, tz)
                                                            + 1f) * (options.scale / 2f)));

                                if (stopwatch.ElapsedTicks > Config.CoroutineTiming)
                                {
                                    yield return(null);

                                    stopwatch.Reset();
                                    stopwatch.Start();
                                }
                            }
                        }
                    }
                }
            }
        }

        i.complete = true;

        yield return(null);
    }