public void Rebuild(GraphicsDevice gd, bool force = false) { switch (MeshType) { case MeshType.Smooth: Meshes = new List <HexMapMesh> { new HexMapMeshSmooth(gd, Hexes, Texture) }; break; case MeshType.Flat: if (force) { Meshes = new List <HexMapMesh>(); for (var xp = 0; xp < Width; xp += PatchSize) { for (var yp = 0; yp < Height; yp += PatchSize) { var patchHexes = new List <Hexagon>(); for (var x = xp; x < xp + PatchSize; x++) { for (var y = yp; y < yp + PatchSize; y++) { var hex = GetHex(x, y); if (hex != null) { patchHexes.Add(hex); } } } Meshes.Add(new HexMapMeshFlat(gd, patchHexes, Texture)); } } } else { foreach (var dirtyPatch in DirtyPatches) { var mesh = Meshes.FirstOrDefault(m => m.PatchID == dirtyPatch); if (mesh == null) { continue; } Meshes.Remove(mesh); Meshes.Add(new HexMapMeshFlat(gd, mesh.Hexes, Texture)); } } break; default: throw new ArgumentOutOfRangeException(); } DirtyPatches.Clear(); }
private void RaiseVertex(Vector3 vertex, int dy) { var comparer = new Vector3Comparer(); var affectedHexes = Hexes.Where(h => h.Geometry.Points.Values.Any(v => comparer.Equals(v, vertex))) .Select(h => new { hex = h, point = h.Geometry.Points.First(p => comparer.Equals(p.Value, vertex)).Key }).ToList(); if (!affectedHexes.All(h => h.hex.CanRaisePoint(h.point, dy))) { return; } foreach (var affectedHex in affectedHexes) { if (dy > 0) { affectedHex.hex.Raise(affectedHex.point); } else if (dy < 0) { affectedHex.hex.Lower(affectedHex.point); } else { return; } } affectedHexes.Select(h => h.hex.PatchID).Distinct().ToList().ForEach(i => DirtyPatches.Add(i)); }