Пример #1
0
        public void FirstNoiseTest()
        {
            XNAGame game = new XNAGame();
            PerlinNoiseGenerater noise;

            noise = new PerlinNoiseGenerater();
            float          factor           = 0.1f;
            float          scale            = 15f;
            List <Vector3> positions        = new List <Vector3>();
            int            width            = 500;
            int            height           = 500;
            float          verticesPerMeter = 0.5f;
            int            verticesX        = (int)(width * verticesPerMeter);
            int            verticesY        = (int)(height * verticesPerMeter);

            game.InitializeEvent +=
                delegate
            {
                noise.NumberOfOctaves = 2;
                noise.persistance     = 0.5f;

                for (int i = 0; i < verticesX; i++)
                {
                    for (int j = 0; j < verticesY; j++)
                    {
                        positions.Add(new Vector3(i / verticesPerMeter, noise.GetPerlineNoise(i * factor, j * factor) * scale, j / verticesPerMeter));
                    }
                }
            };

            game.DrawEvent +=
                delegate
            {
                for (int j = 0; j < verticesY - 1; j++)
                {
                    for (int i = 0; i < verticesX - 1; i++)
                    {
                        game.LineManager3D.AddLine(positions[i + j * verticesY], positions[i + j * verticesY + 1], Color.Blue);
                        game.LineManager3D.AddLine(positions[i + j * verticesY], positions[i + (j + 1) * verticesY], Color.Blue);
                        game.LineManager3D.AddLine(positions[i + j * verticesY + 1], positions[i + (j + 1) * verticesY], Color.Blue);
                    }
                }
            };
            game.Run();
        }
Пример #2
0
        public void NoiseTestRidgeMF()
        {
            XNAGame game = new XNAGame();
            PerlinNoiseGenerater noise;

            noise = new PerlinNoiseGenerater();
            float          factor           = 0.02f;
            float          scale            = 40f;
            List <Vector3> positions        = new List <Vector3>();
            List <Color>   colors           = new List <Color>();
            int            width            = 300;
            int            height           = 300;
            float          verticesPerMeter = 0.5f;
            int            verticesX        = (int)(width * verticesPerMeter);
            int            verticesY        = (int)(height * verticesPerMeter);
            SimpleTerrain  terrain;

            noise.NumberOfOctaves = 4;
            noise.persistance     = 0.5f;

            for (int i = 0; i < verticesX; i++)
            {
                for (int j = 0; j < verticesY; j++)
                {
                    positions.Add(new Vector3(i / verticesPerMeter, noise.RidgedMF((i * 0.2f) / verticesPerMeter, (j * 0.2f) / verticesPerMeter, 0.08f, 8, 4.0f, 0.3f, 1.2f) * scale, j / verticesPerMeter));
                    colors.Add(new Color((byte)(150 * noise.GetPerlineNoise(i, j)), (byte)(100 + 70 * noise.GetPerlineNoise(i + 1, j + 1)), (byte)(140 * noise.GetPerlineNoise(i, j + 2))));
                }
            }
            terrain = new SimpleTerrain(game, positions, colors, verticesX, verticesY);
            game.InitializeEvent +=
                delegate
            {
                terrain.CreateRenderData();
            };

            game.DrawEvent +=
                delegate
            {
                terrain.Render();
            };
            game.Run();
        }
Пример #3
0
        public Array2D <float> GenerateBottomIslandHeightmap(int size)
        {
            PerlinNoiseGenerater noise;

            noise = new PerlinNoiseGenerater();
            float          factor          = 0.1f;
            float          scale           = 10f;
            List <Vector3> positions       = new List <Vector3>();
            List <Color>   colors          = new List <Color>();
            List <Vector3> positionsIsland = new List <Vector3>();
            List <Color>   colorsIsland    = new List <Color>();
            List <Vector3> positionsFinal  = new List <Vector3>();
            List <Color>   colorsFinal     = new List <Color>();
            int            width           = size;
            int            height          = size;
            float          lengthFactor    = 0.2f;
            SimpleTerrain  terrain;
            SimpleTerrain  terrainIsland;
            SimpleTerrain  terrainFinal;

            ProceduralHeigthGenerater gen = new ProceduralHeigthGenerater(8, 0.7f);
            float heigestFBM   = 0;
            float heigestRidge = 0;

            float lowestIsland = 0;
            var   heights      = new Array2D <float>(new Point2(width, height));

            float[,] heightDataRidge  = new float[width, height];
            float[,] heightDataFBM    = new float[width, height];
            float[,] heightDataIsland = new float[width, height];
            float[,] heightDataFinal  = new float[width, height];


            var r = random;

            var octaves = new[]
            {
                //new Vector4(1/2f, 0.5f, (float)r.NextDouble(), (float)r.NextDouble()),
                //new Vector4(1/5f, 2, (float)r.NextDouble(), (float)r.NextDouble()),
                //new Vector4(1/10f, 5f, (float)r.NextDouble(), (float)r.NextDouble()),
                //new Vector4(1f, 1f, (float)r.NextDouble(), (float)r.NextDouble()),
                new Vector4(1 / 2f, 1f, (float)r.NextDouble(), (float)r.NextDouble()),
                new Vector4(1 / 5f, 4, (float)r.NextDouble(), (float)r.NextDouble()),
                new Vector4(1 / 10f, 10f, (float)r.NextDouble(), (float)r.NextDouble()),
            };


            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    noise.NumberOfOctaves = 1;

                    //heights[new Point2(i, j)] += noise.RidgedMF(i * lengthFactor, j * lengthFactor, 0.15f, 8, 2f, 0.7f, 0.8f);//noise.CombinedFractalBrowningAndRidgedMF(i * lengthFactor, j * lengthFactor, 8, 4,5f, 0.5f, 2f, 0.8f, 1f);


                    foreach (var v in octaves)
                    {
                        float   frequency = v.X;
                        float   oScale    = v.Y;
                        Vector2 offset    = new Vector2(v.Z, v.W) * 1000;

                        heights[new Point2(i, j)] += noise.GetPerlineNoise((i + offset.X) * frequency, (j + offset.Y) * frequency) * oScale;
                    }

                    heightDataFBM[i, j]    = noise.GetFractalBrowningNoise(i * lengthFactor, j * lengthFactor, 8, 1.2f, 1.9f, 1.2f);
                    heightDataIsland[i, j] = gen.IslandFactor(i * lengthFactor, j * lengthFactor, new Vector2(width * lengthFactor * 0.5f, height * lengthFactor * 0.5f), width * lengthFactor * 0.42f, width * lengthFactor * 0.4f);//noise.CombinedFractalBrowningAndRidgedMF(i, j, 8, 4, 4, 0.9f, 0.5f, 1.2f, 0.8f)*0.1f+gen.IslandFactor(i, j, new Vector2(width * 0.45f, height * 0.5f),0,width*0.22f)*0.9f  ;

                    if (heigestFBM < heightDataFBM[i, j])
                    {
                        heigestFBM = heightDataFBM[i, j];
                    }
                    if (heigestRidge < heightDataRidge[i, j])
                    {
                        heigestRidge = heightDataRidge[i, j];
                    }

                    if (lowestIsland > heightDataIsland[i, j])
                    {
                        lowestIsland = heightDataIsland[i, j];
                    }
                }
            }


            return(heights);
        }
Пример #4
0
        public static void generateTerrain(int chunksX, int chunksY)
        {
            PerlinNoiseGenerater noise;

            noise = new PerlinNoiseGenerater();
            float          factor                  = 0.1f;
            float          scale                   = 1f;
            List <Vector3> positions               = new List <Vector3>();
            List <Vector3> positionsbase           = new List <Vector3>();
            List <Vector3> positionsbaseDifference = new List <Vector3>();

            List <Color> colors     = new List <Color>();
            List <Color> colorsbase = new List <Color>();

            int           width  = chunksX * 16;
            int           height = chunksY * 16;
            SimpleTerrain terrain;
            SimpleTerrain terrainbase;
            SimpleTerrain terrainbaseDiffernce;


            ProceduralHeigthGenerater gen = new ProceduralHeigthGenerater(8, 0.7f);

            float[,] heightData         = new float[width, height];
            float[,] heightDataErrosion = new float[width, height];
            //float[,] heightDataErrosionDiffernce = new float[width, height];



            for (int i = 0; i < (int)(width); i++)
            {
                for (int j = 0; j < height; j++)
                {
                    heightData[i, j] = (noise.GetPerlineNoise(i, j, 8, 0.1f, 0.8f, 0.8f) * 0.8f + noise.GetPerlineNoise(noise.Perturb(i, j, 0.1f, 30).X, noise.Perturb(i, j, 0.1f, 30).Y, 4, 0.2f, 0.5f, 0.5f) * 0.25f) * 70;
                }
            }
            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    positionsbase.Add(new Vector3(i, heightData[i, j], j));
                    colorsbase.Add(Color.White);
                }
            }
            //heightDataErrosionDiffernce = heightData
            heightDataErrosion = gen.GenerateHydrolicErrosion(heightData, 50 * width * height, width, height);

            for (int i = 0; i < width; i++)
            {
                for (int j = 0; j < height; j++)
                {
                    positions.Add(new Vector3(i, heightDataErrosion[i, j], j));
                    colors.Add(new Color(new Microsoft.Xna.Framework.Vector3(positions[i * width + j].Y - positionsbase[i * width + j].Y, 50, 50)));
                    //positionsbaseDifference.Add(new Vector3(i, positions[i * width + j].Y - positionsbase[i * width + j].Y, j));(
                }
            }


            for (int x = 0; x < chunksX; x++)
            {
                for (int y = 0; y < chunksY; y++)
                {
                    var terr = new VoxelTerrainChunk();
                    terr.Size = new Point3(16, 64, 16);
                    //terr.Size = new Point3(5, 5, 5);
                    terr.WorldPosition = Vector3.Modulate(terr.Size.ToVector3() * terr.NodeSize, new Vector3(x, 0, y));
                    terr.Create();

                    TW.Data.GetSingleton <Datastore>().Persist(terr);

                    for (int tx = 0; tx < terr.Size.X; tx++)
                    {
                        for (int ty = 0; ty < terr.Size.Y / 2; ty++)
                        {
                            for (int tz = 0; tz < terr.Size.Z; tz++)
                            {
                                var heightMapX = tx + (int)terr.WorldPosition.X;
                                var heightMapZ = tz + (int)terr.WorldPosition.Z;
                                if (heightMapX >= width || heightMapZ >= height)
                                {
                                    continue;
                                }
                                if (ty < heightDataErrosion[heightMapX, heightMapZ] / 2f)
                                {
                                    terr.GetVoxelInternal(new Point3(tx, ty, tz)).Filled = true;
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #5
0
        public void NoiseTestSimpleTerrain()
        {
            XNAGame game = new XNAGame();
            PerlinNoiseGenerater noise;

            noise = new PerlinNoiseGenerater();
            float          factor           = 0.1f;
            float          scale            = 10f;
            List <Vector3> positions        = new List <Vector3>();
            List <Color>   colors           = new List <Color>();
            int            width            = 100;
            int            height           = 100;
            float          verticesPerMeter = 1;
            int            verticesX        = (int)(width * verticesPerMeter);
            int            verticesY        = (int)(height * verticesPerMeter);
            SimpleTerrain  terrain;

            noise.NumberOfOctaves = 8;
            noise.persistance     = 0.2f;

            for (int i = 0; i < verticesX; i++)
            {
                for (int j = 0; j < verticesY; j++)
                {
                    positions.Add(new Vector3(i / verticesPerMeter, noise.interpolatedNoise((i / verticesPerMeter) * 0.1f, (j / verticesPerMeter) * 0.2f) * scale, j / verticesPerMeter));
                    colors.Add(new Color((byte)(150 * noise.GetPerlineNoise(i, j)), (byte)(100 + 70 * noise.GetPerlineNoise(i + 1, j + 1)), (byte)(140 * noise.GetPerlineNoise(i, j + 2))));
                }
            }
            terrain = new SimpleTerrain(game, positions, colors, verticesX, verticesY);
            game.InitializeEvent +=
                delegate
            {
                terrain.CreateRenderData();
            };
            bool changed = false;

            game.UpdateEvent +=
                delegate
            {
                if (game.Keyboard.IsKeyPressed(Microsoft.Xna.Framework.Input.Keys.O))
                {
                    noise.NumberOfOctaves++;
                    changed = true;
                }
                if (game.Keyboard.IsKeyPressed(Microsoft.Xna.Framework.Input.Keys.P))
                {
                    noise.persistance *= 0.1f;
                    changed            = true;
                }
                if (game.Keyboard.IsKeyPressed(Microsoft.Xna.Framework.Input.Keys.F))
                {
                    factor *= 0.1f;
                    changed = true;
                }
                if (changed)
                {
                    for (int i = 0; i < verticesX; i++)
                    {
                        for (int j = 0; j < verticesY; j++)
                        {
                            positions.Add(new Vector3(i / verticesPerMeter, noise.GetPerlineNoise((i / verticesPerMeter) * factor, (j / verticesPerMeter) * factor) * scale, j / verticesPerMeter));
                            colors.Add(new Color((byte)(150 * noise.GetPerlineNoise(i, j)), (byte)(100 + 70 * noise.GetPerlineNoise(i + 1, j + 1)), (byte)(140 * noise.GetPerlineNoise(i, j + 2))));
                        }
                    }
                    terrain = new SimpleTerrain(game, positions, colors, verticesX, verticesY);
                    terrain.CreateRenderData();
                    changed = false;
                }
            };
            game.DrawEvent +=
                delegate
            {
                terrain.Render();
            };
            game.Run();
        }