Exemplo n.º 1
0
        public ITerrain CreateTerrain(MapId id)
        {
            var terrain = new SimpleTerrain(id, LoadTile);

            terrain.FillTileProfile();
            return(terrain);
        }
Exemplo n.º 2
0
        public static void ExtractAndWriteAll()
        {
            foreach (MapId mapId in Enum.GetValues(typeof(MapId)))
            {
                var name = TileIdentifier.GetName(mapId);
                if (string.IsNullOrEmpty(name))
                {
                    Console.WriteLine(@"No ADT for map {0}.", mapId);
                    continue;
                }

                var terrain = new SimpleTerrain(mapId);

                for (var tileX = 0; tileX < 64; tileX++)
                {
                    for (var tileY = 0; tileY < 64; tileY++)
                    {
                        string       filePath;
                        MpqLibrarian mpqFinder;
                        if (!ADTReader.TryGetADTPath(mapId, tileX, tileY, out filePath, out mpqFinder))
                        {
                            continue;
                        }
                        // try to extract from MPQ
                        //var adt = ADTReader.ReadADT(terrain, tileX, tileY);
                        //Console.WriteLine(@"EXPORTING: Tile ({0}, {1}) in Map {2} ...", tileX, tileY, mapId);
                        //Console.WriteLine(@"Extraction will take a while, please have patience...");

                        try
                        {
                            var adt = WDT.LoadTile(mapId, tileX, tileY);
                            if (adt != null)
                            {
                                Console.WriteLine(@"Tile ({0}, {1}) in Map {2} has been imported...", tileX, tileY, mapId);
                                Console.WriteLine(@"Writing to file...");

                                // export to file
                                SimpleTileWriter.WriteADT(adt);

                                // try loading again
                                Console.WriteLine(@"Loading extracted tile and generating Navigation mesh...");
                                terrain.ForceLoadTile(tileX, tileY);

                                if (terrain.IsAvailable(tileX, tileY))
                                {
                                    Console.WriteLine(@"Done. Tile ({0}, {1}) in Map {2} has been loaded successfully.", tileX, tileY, mapId);
                                    continue;
                                }
                            }
                        }
                        catch (ArgumentException)
                        {
                        }

                        Console.WriteLine(@"Loading FAILED: Tile ({0}, {1}) in Map {2} could not be loaded", tileX, tileY, mapId);
                    }
                }
            }
        }
Exemplo n.º 3
0
        public static void ExtractAndWriteAll()
        {
            foreach (MapId mapId in Enum.GetValues(typeof(MapId)))
            {
                var name = TileIdentifier.GetName(mapId);
                if (string.IsNullOrEmpty(name))
                {
                    Console.WriteLine(@"No ADT for map {0}.", mapId);
                    continue;
                }

                var terrain = new SimpleTerrain(mapId);

                for (var tileX = 0; tileX < 64; tileX++)
                {
                    for (var tileY = 0; tileY < 64; tileY++)
                    {
                        string filePath;
                        MpqLibrarian mpqFinder;
                        if (!ADTReader.TryGetADTPath(mapId, tileX, tileY, out filePath, out mpqFinder))
                            continue;
                        // try to extract from MPQ
                        //var adt = ADTReader.ReadADT(terrain, tileX, tileY);
                        //Console.WriteLine(@"EXPORTING: Tile ({0}, {1}) in Map {2} ...", tileX, tileY, mapId);
                        //Console.WriteLine(@"Extraction will take a while, please have patience...");

                        try
                        {
                            var adt = WDT.LoadTile(mapId, tileX, tileY);
                            if (adt != null)
                            {
                                Console.WriteLine(@"Tile ({0}, {1}) in Map {2} has been imported...", tileX, tileY, mapId);
                                Console.WriteLine(@"Writing to file...");

                                // export to file
                                SimpleTileWriter.WriteADT(adt);

                                // try loading again
                                Console.WriteLine(@"Loading extracted tile and generating Navigation mesh...");
                                terrain.ForceLoadTile(tileX, tileY);

                                if (terrain.IsAvailable(tileX, tileY))
                                {
                                    Console.WriteLine(@"Done. Tile ({0}, {1}) in Map {2} has been loaded successfully.", tileX, tileY, mapId);
                                    continue;
                                }
                            }
                        }
                        catch (ArgumentException)
                        {
                        }

                        Console.WriteLine(@"Loading FAILED: Tile ({0}, {1}) in Map {2} could not be loaded", tileX, tileY, mapId);
                    }
                }
            }
        }
Exemplo n.º 4
0
        public static void CreateAndWriteAllMeshes()
        {
            GC.AddMemoryPressure(1 * 1024 * 1024 * 1024);
            foreach (MapId mapId in Enum.GetValues(typeof(MapId)))
            {
                var name = TileIdentifier.GetName(mapId);
                if (string.IsNullOrEmpty(name))
                {
                    Console.WriteLine(@"No ADT for map {0}.", mapId);
                    continue;
                }

                var terrain = new SimpleTerrain(mapId);

                for (var tileX = 0; tileX < 64; tileX++)
                {
                    for (var tileY = 0; tileY < 64; tileY++)
                    {
                        string       filePath;
                        MpqLibrarian mpqFinder;
                        if (!ADTReader.TryGetADTPath(mapId, tileX, tileY, out filePath, out mpqFinder))
                        {
                            continue;
                        }

                        try
                        {
                            var adt = WDT.LoadTile(mapId, tileX, tileY);
                            if (adt != null)
                            {
                                // try loading
                                Console.WriteLine(@"Loading extracted tile and generating Navigation mesh...");
                                terrain.ForceLoadTile(tileX, tileY);

                                if (terrain.IsAvailable(tileX, tileY))
                                {
                                    Console.WriteLine(@"Done. Tile ({0}, {1}) in Map {2} has been loaded successfully.", tileX, tileY, mapId);
                                    terrain.Tiles[tileX, tileY] = null;
                                    continue;
                                }
                            }
                        }
                        catch (ArgumentException)
                        {
                        }

                        Console.WriteLine(@"Extracting FAILED: Tile ({0}, {1}) in Map {2} could not be loaded", tileX, tileY, mapId);
                    }
                }
            }
            GC.RemoveMemoryPressure(1 * 1024 * 1024 * 1024);
        }
Exemplo n.º 5
0
        public static void CreateAndWriteAllMeshes()
        {
            GC.AddMemoryPressure(1*1024*1024*1024);
            foreach (MapId mapId in Enum.GetValues(typeof(MapId)))
            {
                var name = TileIdentifier.GetName(mapId);
                if (string.IsNullOrEmpty(name))
                {
                    Console.WriteLine(@"No ADT for map {0}.", mapId);
                    continue;
                }

                var terrain = new SimpleTerrain(mapId);

                for (var tileX = 0; tileX < 64; tileX++)
                {
                    for (var tileY = 0; tileY < 64; tileY++)
                    {
                        string filePath;
                        MpqLibrarian mpqFinder;
                        if (!ADTReader.TryGetADTPath(mapId, tileX, tileY, out filePath, out mpqFinder))
                            continue;

                        try
                        {
                            var adt = WDT.LoadTile(mapId, tileX, tileY);
                            if (adt != null)
                            {
                                // try loading
                                Console.WriteLine(@"Loading extracted tile and generating Navigation mesh...");
                                terrain.ForceLoadTile(tileX, tileY);

                                if (terrain.IsAvailable(tileX, tileY))
                                {
                                    Console.WriteLine(@"Done. Tile ({0}, {1}) in Map {2} has been loaded successfully.", tileX, tileY, mapId);
                                    terrain.Tiles[tileX, tileY] = null;
                                    continue;
                                }
                            }
                        }
                        catch (ArgumentException)
                        {
                        }

                        Console.WriteLine(@"Extracting FAILED: Tile ({0}, {1}) in Map {2} could not be loaded", tileX, tileY, mapId);
                    }
                }
            }
            GC.RemoveMemoryPressure(1*1024*1024*1024);
        }
Exemplo n.º 6
0
        public void Combined()
        {
            XNAGame game = new XNAGame();

            game.SpectaterCamera.FarClip = 10000;
            PerlinNoiseGenerater noise;
            PerlinNoiseGenerater colorNoise;

            noise      = new PerlinNoiseGenerater();
            colorNoise = new PerlinNoiseGenerater();
            float frequency = 0.5f;
            ///float factor = 0.02f;
            float          scale            = 100f;
            List <Vector3> positions        = new List <Vector3>();
            List <Color>   colors           = new List <Color>();
            int            width            = 5000;
            int            height           = 5000;
            float          verticesPerMeter = 0.1f;
            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++)
                {
                    //                                           combinedFractalBrowning (float x,float y,int octaves,float lacunarityFractal,float lacunarityRidge,float gainFractal,float gainRidge,float offset,float distribution )
                    float zValue = noise.CombinedFractalBrowningAndRidgedMF(i / verticesPerMeter, j / verticesPerMeter, 8, 4, 4, 0.3f, 0.2f, 1.2f, 0.8f) * scale;
                    positions.Add(new Vector3(i / verticesPerMeter, zValue, j / verticesPerMeter));
                    colors.Add(heightColoring(zValue, j + i * verticesX));
                    //colors.Add(new Color((byte)(150 * colorNoise.interpolatedNoise(i * frequency, j * frequency)), (byte)(100 + 70 * colorNoise.interpolatedNoise((i + 1) * frequency, (j + 1) * frequency)), (byte)(140 * colorNoise.interpolatedNoise(i * frequency, (j + 2) * frequency))));
                }
            }
            terrain = new SimpleTerrain(game, positions, colors, verticesX, verticesY);
            game.InitializeEvent +=
                delegate
            {
                terrain.CreateRenderData();
            };

            game.DrawEvent +=
                delegate
            {
                terrain.Render();
            };
            game.Run();
        }
Exemplo n.º 7
0
        public static TerrainTile LoadTile(SimpleTerrain terrain, int x, int y)
        {
            var tile = SimpleTileReader.ReadTile(terrain, x, y);

            if (tile != null)
            {
                // do not generate navmesh on the fly (use command instead)
                if (NavMeshBuilder.DoesNavMeshExist(terrain.MapId, x, y))
                {
                    tile.EnsureNavMeshLoaded();
                }
            }

            return(tile);
        }
Exemplo n.º 8
0
    // Use this for initialization
    IEnumerator Start()
    {
        inputMediator = new DungeonInputMediator();

        var generator = new SimpleTerrain();
        generator.Width = 20;
        generator.Height = 15;
        currentFloor = generator.Generate();

        yield return 0;

        //playerCharacter = PutObject<PlayerCharacter>(2, 2);
        //TerrainGraphicController.Instance.Reset(1, 1, currentFloor);
        graphicsParent.Terrain.Reset(new DungeonAxis(1, 1), currentFloor);
    }
Exemplo n.º 9
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();
        }
Exemplo n.º 10
0
        public static TerrainTile ReadTile(SimpleTerrain terrain, int tileX, int tileY)
        {
            var filePath = SimpleTileWriter.GetFileName(terrain.MapId, tileX, tileY);

            if (!File.Exists(filePath))
            {
                return(null);
            }

            TerrainTile tile;

            using (var file = File.OpenRead(filePath))
                using (var reader = new BinaryReader(file))
                {
                    var fileType = reader.ReadString();
                    if (fileType != SimpleTileWriter.FileTypeId)
                    {
                        throw new InvalidDataException(string.Format("ADT file not in valid format: {0}", filePath));
                    }

                    var version = reader.ReadInt32();
                    if (version != SimpleTileWriter.Version)
                    {
                        // invalid version -> File is outdated
                        return(null);
                    }

                    tile = new TerrainTile(tileX, tileY, terrain);

                    terrain.m_IsWmoOnly  = reader.ReadBoolean();
                    tile.TerrainVertices = reader.ReadVector3Array();
                    tile.TerrainIndices  = reader.ReadInt32Array();


                    // Write liquid information
                    var hasLiquids = reader.ReadBoolean();

                    if (hasLiquids)
                    {
                        tile.LiquidChunks = new TerrainLiquidChunk[TerrainConstants.ChunksPerTileSide, TerrainConstants.ChunksPerTileSide];
                        for (var xc = 0; xc < TerrainConstants.ChunksPerTileSide; xc++)
                        {
                            for (var yc = 0; yc < TerrainConstants.ChunksPerTileSide; yc++)
                            {
                                var type = (LiquidType)reader.ReadInt32();
                                if (type != LiquidType.None)
                                {
                                    var chunk = tile.LiquidChunks[xc, yc] = new TerrainLiquidChunk();
                                    chunk.Type = type;

                                    // read heightmap
                                    chunk.OffsetX = reader.ReadByte();
                                    chunk.OffsetY = reader.ReadByte();
                                    chunk.Width   = reader.ReadByte();
                                    chunk.Height  = reader.ReadByte();

                                    chunk.Heights = new float[chunk.Width + 1, chunk.Height + 1];
                                    for (var x = 0; x <= chunk.Width; x++)
                                    {
                                        for (var y = 0; y <= chunk.Height; y++)
                                        {
                                            chunk.Heights[x, y] = reader.ReadSingle();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }


            return(tile);
        }
Exemplo n.º 11
0
        public static TerrainTile ReadTile(SimpleTerrain terrain, int tileX, int tileY)
        {
            var filePath = SimpleTileWriter.GetFileName(terrain.MapId, tileX, tileY);
            if (!File.Exists(filePath))
            {
                return null;
            }

            TerrainTile tile;

            using(var file = File.OpenRead(filePath))
            using(var reader = new BinaryReader(file))
            {
                var fileType = reader.ReadString();
                if (fileType != SimpleTileWriter.FileTypeId)
                {
                    throw new InvalidDataException(string.Format("ADT file not in valid format: {0}", filePath));
                }

                var version = reader.ReadInt32();
                if (version != SimpleTileWriter.Version)
                {
                    // invalid version -> File is outdated
                    return null;
                }

                tile = new TerrainTile(tileX, tileY, terrain);

                terrain.m_IsWmoOnly = reader.ReadBoolean();
                tile.TerrainVertices = reader.ReadVector3Array();
                tile.TerrainIndices = reader.ReadInt32Array();

                // Write liquid information
                var hasLiquids = reader.ReadBoolean();

                if (hasLiquids)
                {
                    tile.LiquidChunks = new TerrainLiquidChunk[TerrainConstants.ChunksPerTileSide,TerrainConstants.ChunksPerTileSide];
                    for (var xc = 0; xc < TerrainConstants.ChunksPerTileSide; xc++)
                    {
                        for (var yc = 0; yc < TerrainConstants.ChunksPerTileSide; yc++)
                        {
                            var type = (LiquidType) reader.ReadInt32();
                            if (type != LiquidType.None)
                            {
                                var chunk = tile.LiquidChunks[xc, yc] = new TerrainLiquidChunk();
                                chunk.Type = type;

                                // read heightmap
                                chunk.OffsetX = reader.ReadByte();
                                chunk.OffsetY = reader.ReadByte();
                                chunk.Width = reader.ReadByte();
                                chunk.Height = reader.ReadByte();

                                chunk.Heights = new float[chunk.Width + 1, chunk.Height + 1];
                                for (var x = 0; x <= chunk.Width; x++)
                                {
                                    for (var y = 0; y <= chunk.Height; y++)
                                    {
                                        chunk.Heights[x, y] = reader.ReadSingle();
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return tile;
        }
Exemplo n.º 12
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();
        }