Exemple #1
0
        public DemoPartition(DemoPartitionContext context)
        {
            if (context == null) throw new ArgumentNullException("context");

            this.context = context;

            settings = context.Settings;

            heightMap = new NoiseHeightMap(context.GraphicsDevice, settings.HeightMapWidth, settings.HeightMapHeight);
            heightMap.NoiseSource = context.Noise;

            normalMap = new NormalMap(context.GraphicsDevice, settings.HeightMapWidth, settings.HeightMapHeight);
            normalMap.HeightMap = heightMap;
            normalMap.Amplitude = settings.HeightScale;

            noiseRainMap = new NoiseRainMap(settings.HeightMapWidth, settings.HeightMapHeight);
            noiseRainMap.NoiseSource = rainNoise.Sample;
            noiseRainMap.RainAmount = 0.5f;

            uniformRainMap = new Map<float>(settings.HeightMapWidth, settings.HeightMapHeight);
            uniformRainMap.Fill(0.8f);

            terrainRainMap = new Map<float>(settings.HeightMapWidth, settings.HeightMapHeight);

            hydraulicErosion.HeightMap = heightMap;
            //hydraulicErosion.RainMap = noiseRainMap;
            //hydraulicErosion.RainMap = uniformRainMap;
            hydraulicErosion.RainMap = terrainRainMap;

            fastHydraulicErosion.HeightMap = heightMap;
            //fastHydraulicErosion.RainMap = noiseRainMap;
            //fastHydraulicErosion.RainMap = uniformRainMap;
            fastHydraulicErosion.RainMap = terrainRainMap;

            musgraveHydraulicErosion.HeightMap = heightMap;
            //musgraveHydraulicErosion.RainMap = noiseRainMap;
            //musgraveHydraulicErosion.RainMap = uniformRainMap;
            musgraveHydraulicErosion.RainMap = terrainRainMap;

            thermalErosion.HeightMap = heightMap;

            fastThermalErosion.HeightMap = heightMap;

            terrain = new CDLODTerrain(context.Settings);
            terrain.HeightMap = heightMap;
        }
        public DemoPartitionFactory(DemoPartitionContext context)
        {
            if (context == null) throw new ArgumentNullException("context");

            this.context = context;
        }
        protected override void LoadContent()
        {
            settings.LevelCount = levelCount;
            settings.LeafNodeSize = leafNodeSize;
            settings.PatchResolution = patchResolution;
            settings.MapScale = mapScale;
            settings.HeightScale = heightScale;
            settings.HeightMapWidth = heightMapWidth;
            settings.HeightMapHeight = heightMapHeight;

            var visibleRanges = new CDLODDefaultVisibleRanges(settings);
            visibleRanges.FinestNodeSize = finestNodeSize;
            visibleRanges.DetailBalance = detailBalance;
            visibleRanges.Initialize();

            #region Noise and fractal test

            classicPerlin.Seed = noiseSeed;
            classicPerlin.Reseed();
            perlin.Seed = noiseSeed;
            perlin.Reseed();
            simplex.Seed = noiseSeed;
            simplex.Reseed();

            //var noise = perlinNoise;
            var noise = perlin;
            //var noise = simplexNoise;
            //var noise = voronoi;

            perlinFractal.Source = noise.Sample;
            sumFractal.Source = noise.Sample;
            multifractal.Source = noise.Sample;
            heterofractal.Source = noise.Sample;
            hybridMultifractal.Source = noise.Sample;
            ridgedMultifractal.Source = noise.Sample;
            sinFractal.Source = noise.Sample;
            billow.Source = noise.Sample;

            #endregion

            #region Vorononi test

            voronoi.Seed = noiseSeed;
            voronoi.Frequency = 1;
            voronoi.VoronoiType = VoronoiType.First;
            voronoi.Metrics = Metrics.Squared;
            //voronoi.DistanceEnabled = true;

            #endregion

            #region Noise combination test

            var testBaseNoise = perlin;

            mountainTerrain.Source = testBaseNoise.Sample;
            baseFlatTerrain.Source = testBaseNoise.Sample;
            baseFlatTerrain.Frequency = 2.0f;
            flatTerrain.Source = baseFlatTerrain.Sample;
            flatTerrain.Scale = 0.525f;
            flatTerrain.Bias = -0.75f;
            terrainType.Source = testBaseNoise.Sample;
            terrainSelector.Controller = terrainType.Sample;
            terrainSelector.Source0 = (x, y, z) => { return mountainTerrain.Sample(x, y, z) * 1.25f - 1; };
            terrainSelector.Source1 = flatTerrain.Sample;
            terrainSelector.LowerBound = 0;
            terrainSelector.UpperBound = 1000;
            terrainSelector.EdgeFalloff = 0.125f;
            perturbTerrain.Source = terrainSelector.Sample;
            perturbTerrain.Frequency = 4;
            perturbTerrain.Power = 0.125f;
            finalTerrain.Source = perturbTerrain.Sample;
            finalTerrain.Bias = 0.8f;

            #endregion

            #region Recording

            recNoise.Seed = noiseSeed;
            recBaseTerrain.Source = recNoise.Sample;
            recBaseTerrain.OctaveCount = 7;
            recFinalTerrain.Source = recBaseTerrain.Sample;
            recFinalTerrain.Scale = 2.5f;

            #endregion

            SampleSourceDelegate finalNoiseSource = recFinalTerrain.Sample;

            partitionContext = new DemoPartitionContext(
                GraphicsDevice, Content, settings, visibleRanges,
                finalNoiseSource, noiseSampleX, noiseSampleY, noiseSampleWidth, noiseSampleHeight);
            partitionContext.TerrainRenderer.FogEnabled = true;
            partitionContext.TerrainRenderer.FogStart = fogStart;
            partitionContext.TerrainRenderer.FogEnd = fogEnd;
            partitionContext.TerrainRenderer.FogColor = fogColor;

            partitionFactory = new DemoPartitionFactory(partitionContext);

            var terrainScale = settings.TerrainScale;

            partitionManager = new PartitionManager(partitionFactory.Create, loadThreadCount,
                initialPartitionPoolCapacity, maxPartitionPoolCapacity);
            partitionManager.PartitionWidth = terrainScale.X;
            partitionManager.PartitionHeight = terrainScale.Z;
            partitionManager.ActivationRange = terrainScale.X * 4.0f;
            //partitionManager.ActivationRange = terrainScale.X * 2.0f;
            partitionManager.DeactivationRange = partitionManager.ActivationRange * 1.5f;
            partitionManager.EyePosition = view.Position;

            #region Debug

            spriteBatch = new SpriteBatch(GraphicsDevice);
            font = Content.Load<SpriteFont>("Fonts/Debug");
            fillTexture = Texture2DHelper.CreateFillTexture(GraphicsDevice);
            helpMessageFontSize = font.MeasureString(helpMessage);

            BuildInformationMessage();
            informationTextFontSize = font.MeasureString(stringBuilder);

            #endregion
        }