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