From a97fda7ef0c777ca96e7e2235680ae65f88fca6b Mon Sep 17 00:00:00 2001 From: themode Date: Fri, 24 Dec 2021 10:45:03 +0100 Subject: [PATCH] Force palette dimension to be a power of 2. Improve performance --- .../server/instance/palette/PaletteImpl.java | 4 +- src/test/java/instance/PaletteTest.java | 37 ++++++++++++------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java b/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java index 837b13559..47495e87e 100644 --- a/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java +++ b/src/main/java/net/minestom/server/instance/palette/PaletteImpl.java @@ -36,6 +36,9 @@ final class PaletteImpl implements Palette, Cloneable { private Int2IntOpenHashMap valueToPaletteMap; PaletteImpl(int dimension, int maxBitsPerEntry, int bitsPerEntry, int bitsIncrement) { + if (dimension < 1 || dimension % 2 != 0) + throw new IllegalArgumentException("Dimension must be positive and power of 2"); + this.dimension = dimension; this.size = dimension * dimension * dimension; this.maxBitsPerEntry = maxBitsPerEntry; @@ -218,7 +221,6 @@ final class PaletteImpl implements Palette, Cloneable { } int getSectionIndex(int x, int y, int z) { - y = Math.floorMod(y, dimension); return y << (dimension / 2) | z << (dimension / 4) | x; } diff --git a/src/test/java/instance/PaletteTest.java b/src/test/java/instance/PaletteTest.java index 3cbe4626d..4bcbc875a 100644 --- a/src/test/java/instance/PaletteTest.java +++ b/src/test/java/instance/PaletteTest.java @@ -1,27 +1,18 @@ package instance; import net.minestom.server.instance.palette.Palette; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.*; public class PaletteTest { - private List palettes = new ArrayList<>(); - - @BeforeEach - public void reset() { - for (int i = 4; i < 16; i++) { - palettes.add(Palette.newPalette(i, 5, 3, 1)); - } - } @Test - public void testPlacement() { + public void placement() { + var palettes = testPalettes(); for (Palette palette : palettes) { final int dimension = palette.dimension(); assertEquals(0, palette.get(0, 0, 0), "Default value should be 0"); @@ -55,7 +46,8 @@ public class PaletteTest { } @Test - public void testPlacementNeg() { + public void negPlacement() { + var palettes = testPalettes(); for (Palette palette : palettes) { assertThrows(IllegalArgumentException.class, () -> palette.set(-1, 0, 0, 64)); assertThrows(IllegalArgumentException.class, () -> palette.set(0, -1, 0, 64)); @@ -68,7 +60,7 @@ public class PaletteTest { } @Test - public void testResize() { + public void resize() { Palette palette = Palette.newPalette(16, 5, 2, 1); palette.set(0, 0, 0, 1); assertEquals(2, palette.bitsPerEntry()); @@ -84,4 +76,21 @@ public class PaletteTest { assertEquals(3, palette.get(0, 0, 2)); assertEquals(4, palette.get(0, 0, 3)); } + + @Test + public void dimension() { + assertThrows(Exception.class, () -> Palette.newPalette(0, 5, 3, 1)); + assertThrows(Exception.class, () -> Palette.newPalette(1, 5, 3, 1)); + assertDoesNotThrow(() -> Palette.newPalette(2, 5, 3, 1)); + assertThrows(Exception.class, () -> Palette.newPalette(3, 5, 3, 1)); + assertDoesNotThrow(() -> Palette.newPalette(4, 5, 3, 1)); + } + + private static List testPalettes() { + List palettes = new ArrayList<>(); + for (int i = 4; i < 16; i += 2) { + palettes.add(Palette.newPalette(i, 5, 3, 1)); + } + return palettes; + } }