public ITerrain CreateTerrain(MapId id) { var terrain = new SimpleTerrain(id, LoadTile); terrain.FillTileProfile(); return(terrain); }
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); } } } }
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); } } } }
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); }
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); }
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(); }
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); }
// 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); }
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(); }
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); }
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; }
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(); }