public void Index2ShortestDistanceMethodenTest() { Index2 size = new Index2(20, 20); Index2 i1 = new Index2(5, 7); // Startwert Index2 i2 = new Index2(12, 13); // Destinations Index2 i3 = new Index2(7, 6); // Results Assert.AreEqual(i3.X, i1.ShortestDistanceX(i2.X, size.X)); Assert.AreEqual(i3.Y, i1.ShortestDistanceY(i2.Y, size.Y)); Assert.AreEqual(i3, i1.ShortestDistanceXY(i2, size)); }
private bool FillChunkRenderer() { Index2 destinationChunk = new Index2(player.ActorHost.Position.ChunkIndex); // Nur ausführen wenn der Spieler den Chunk gewechselt hat if (destinationChunk != currentChunk) { int mask = (int)Math.Pow(2, VIEWRANGE) - 1; int span = (int)Math.Pow(2, VIEWRANGE); int spanOver2 = span >> 1; for (int x = 0; x < span; x++) { for (int y = 0; y < span; y++) { Index2 local = new Index2(x - spanOver2, y - spanOver2) + destinationChunk; local.NormalizeXY(planet.Size); int virtualX = local.X & mask; int virtualY = local.Y & mask; int rendererIndex = virtualX + (virtualY << VIEWRANGE); for (int z = 0; z < planet.Size.Z; z++) { chunkRenderer[rendererIndex, z].SetChunk(_manager, local.X, local.Y, z); } } } currentChunk = destinationChunk; } #region Chunkrenderer updaten int shortestDistance = int.MaxValue; ChunkRenderer updatableRenderer = null; foreach (var renderer in chunkRenderer) { if (!renderer.NeedUpdate()) continue; Index2 absoluteIndex = new Index2(renderer.ChunkPosition.Value); Index2 relativeIndex = destinationChunk.ShortestDistanceXY( absoluteIndex, new Index2( planet.Size.X, planet.Size.Y)); int distance = relativeIndex.LengthSquared(); if (distance < shortestDistance) { updatableRenderer = renderer; shortestDistance = distance; } } if (updatableRenderer != null) updatableRenderer.RegenerateVertexBuffer(); #endregion return updatableRenderer != null; }