public TileGeometry[] GetDual() { TileGeometry[] ret = new TileGeometry[vertices.Count]; for (int i = 0; i < vertices.Count; i++) { var face = new TileGeometry(GetDual(i)); DebugUtils.Assert(face.Vertices.Length == 5 || face.Vertices.Length == 6); face.Neighbours = GetNeighbors(i); ret[i] = face; } return(ret); }
void AddTile(TileGeometry tile, Color32 c, List<Vector3> vertices, List<int> triangles, List<Color32> colors) { int vertidx = vertices.Count; vertices.Add(tile.Center.Vector); vertices.AddRange(tile.Vertices.Select(x => (Vector3)(0.9*x.Vector + 0.1*tile.Center.Vector))); colors.AddRange(Enumerable.Range(0, tile.Vertices.Length + 1).Select(x => c)); for (int i = 0; i < tile.Vertices.Length; i++) { int j = (i + 1) % tile.Vertices.Length; triangles.Add(vertidx); triangles.Add(vertidx + i + 1); triangles.Add(vertidx + j + 1); } }
void AddTile(TileGeometry tile, Color32 c, List <Vector3> vertices, List <int> triangles, List <Color32> colors) { int vertidx = vertices.Count; vertices.Add(tile.Center.Vector); vertices.AddRange(tile.Vertices.Select(x => (Vector3)(0.9 * x.Vector + 0.1 * tile.Center.Vector))); colors.AddRange(Enumerable.Range(0, tile.Vertices.Length + 1).Select(x => c)); for (int i = 0; i < tile.Vertices.Length; i++) { int j = (i + 1) % tile.Vertices.Length; triangles.Add(vertidx); triangles.Add(vertidx + i + 1); triangles.Add(vertidx + j + 1); } }
public Planet(IPlanetData terrain, int seed) { Terrain = terrain; Biomes = Terrain.BiomeList; Seed = seed; var PRNG = new System.Random(seed); int icosphereLevel = 7; if (Tiles == null) { string cachepath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "/tiles.dat"; try { using (var stream = new FileStream(cachepath, FileMode.Open, FileAccess.Read, FileShare.Read)) { var reader = new BinaryReader(stream); var version = reader.ReadString(); if (version != System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()) { throw new Exception(string.Format("Wrong version in cache file: found {0}, expected {1}", version, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); } int level = reader.ReadInt32(); if (level != icosphereLevel) { throw new Exception(string.Format("Wrong tessellation level in cache file: found {0}, expected {1}", level, icosphereLevel)); } int n = reader.ReadInt32(); Tiles = new TileGeometry[n]; for (int i = 0; i < n; i++) { Tiles[i] = new TileGeometry(reader); } } } catch (Exception e) { Log("Cannot open geometry from cache: {0}", e.Message); var sphere = new Icosphere(icosphereLevel); Tiles = sphere.GetDual(); try { using (var stream = new FileStream(cachepath, FileMode.Create, FileAccess.Write)) { var writer = new BinaryWriter(stream); writer.Write(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); writer.Write(icosphereLevel); writer.Write(Tiles.Length); for (int i = 0; i < Tiles.Length; i++) { Tiles[i].Write(writer); } } } catch (Exception e2) { Log("Cannot write geometry to cache: {0}", e2.Message); } } } TileSeeds = new int[Tiles.Length]; for (int i = 0; i < Tiles.Length; i++) { TileSeeds[i] = PRNG.Next(); } data = new LRUCache <TileData>(idx => new TileData(this, idx), 200); }
public TileGeometry[] GetDual() { TileGeometry[] ret = new TileGeometry[vertices.Count]; for (int i = 0; i < vertices.Count; i++) { var face = new TileGeometry(GetDual(i)); DebugUtils.Assert(face.Vertices.Length == 5 || face.Vertices.Length == 6); face.Neighbours = GetNeighbors(i); ret[i] = face; } return ret; }
public Planet(IPlanetData terrain, int seed) { Terrain = terrain; Biomes = Terrain.BiomeList; Seed = seed; var PRNG = new System.Random(seed); int icosphereLevel = 7; if (Tiles == null) { string cachepath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "/tiles.dat"; try { using (var stream = new FileStream(cachepath, FileMode.Open, FileAccess.Read, FileShare.Read)) { var reader = new BinaryReader(stream); var version = reader.ReadString(); if (version != System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()) { throw new Exception(string.Format("Wrong version in cache file: found {0}, expected {1}", version, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version)); } int level = reader.ReadInt32(); if (level != icosphereLevel) { throw new Exception(string.Format("Wrong tessellation level in cache file: found {0}, expected {1}", level, icosphereLevel)); } int n = reader.ReadInt32(); Tiles = new TileGeometry[n]; for (int i = 0; i < n; i++) { Tiles[i] = new TileGeometry(reader); } } } catch (Exception e) { Log("Cannot open geometry from cache: {0}", e.Message); var sphere = new Icosphere(icosphereLevel); Tiles = sphere.GetDual(); try { using(var stream = new FileStream(cachepath, FileMode.Create, FileAccess.Write)) { var writer = new BinaryWriter(stream); writer.Write(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()); writer.Write(icosphereLevel); writer.Write(Tiles.Length); for(int i = 0; i < Tiles.Length; i++) { Tiles[i].Write(writer); } } } catch(Exception e2) { Log("Cannot write geometry to cache: {0}", e2.Message); } } } TileSeeds = new int[Tiles.Length]; for (int i = 0; i < Tiles.Length; i++) { TileSeeds[i] = PRNG.Next(); } data = new LRUCache<TileData>(idx => new TileData(this, idx), 200); }