mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-29 15:07:36 +02:00
Force palette dimension to be a power of 2. Improve performance
This commit is contained in:
parent
8ae02109b9
commit
a97fda7ef0
@ -36,6 +36,9 @@ final class PaletteImpl implements Palette, Cloneable {
|
|||||||
private Int2IntOpenHashMap valueToPaletteMap;
|
private Int2IntOpenHashMap valueToPaletteMap;
|
||||||
|
|
||||||
PaletteImpl(int dimension, int maxBitsPerEntry, int bitsPerEntry, int bitsIncrement) {
|
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.dimension = dimension;
|
||||||
this.size = dimension * dimension * dimension;
|
this.size = dimension * dimension * dimension;
|
||||||
this.maxBitsPerEntry = maxBitsPerEntry;
|
this.maxBitsPerEntry = maxBitsPerEntry;
|
||||||
@ -218,7 +221,6 @@ final class PaletteImpl implements Palette, Cloneable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int getSectionIndex(int x, int y, int z) {
|
int getSectionIndex(int x, int y, int z) {
|
||||||
y = Math.floorMod(y, dimension);
|
|
||||||
return y << (dimension / 2) | z << (dimension / 4) | x;
|
return y << (dimension / 2) | z << (dimension / 4) | x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,27 +1,18 @@
|
|||||||
package instance;
|
package instance;
|
||||||
|
|
||||||
import net.minestom.server.instance.palette.Palette;
|
import net.minestom.server.instance.palette.Palette;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
||||||
|
|
||||||
public class PaletteTest {
|
public class PaletteTest {
|
||||||
private List<Palette> palettes = new ArrayList<>();
|
|
||||||
|
|
||||||
@BeforeEach
|
|
||||||
public void reset() {
|
|
||||||
for (int i = 4; i < 16; i++) {
|
|
||||||
palettes.add(Palette.newPalette(i, 5, 3, 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPlacement() {
|
public void placement() {
|
||||||
|
var palettes = testPalettes();
|
||||||
for (Palette palette : palettes) {
|
for (Palette palette : palettes) {
|
||||||
final int dimension = palette.dimension();
|
final int dimension = palette.dimension();
|
||||||
assertEquals(0, palette.get(0, 0, 0), "Default value should be 0");
|
assertEquals(0, palette.get(0, 0, 0), "Default value should be 0");
|
||||||
@ -55,7 +46,8 @@ public class PaletteTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPlacementNeg() {
|
public void negPlacement() {
|
||||||
|
var palettes = testPalettes();
|
||||||
for (Palette palette : palettes) {
|
for (Palette palette : palettes) {
|
||||||
assertThrows(IllegalArgumentException.class, () -> palette.set(-1, 0, 0, 64));
|
assertThrows(IllegalArgumentException.class, () -> palette.set(-1, 0, 0, 64));
|
||||||
assertThrows(IllegalArgumentException.class, () -> palette.set(0, -1, 0, 64));
|
assertThrows(IllegalArgumentException.class, () -> palette.set(0, -1, 0, 64));
|
||||||
@ -68,7 +60,7 @@ public class PaletteTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testResize() {
|
public void resize() {
|
||||||
Palette palette = Palette.newPalette(16, 5, 2, 1);
|
Palette palette = Palette.newPalette(16, 5, 2, 1);
|
||||||
palette.set(0, 0, 0, 1);
|
palette.set(0, 0, 0, 1);
|
||||||
assertEquals(2, palette.bitsPerEntry());
|
assertEquals(2, palette.bitsPerEntry());
|
||||||
@ -84,4 +76,21 @@ public class PaletteTest {
|
|||||||
assertEquals(3, palette.get(0, 0, 2));
|
assertEquals(3, palette.get(0, 0, 2));
|
||||||
assertEquals(4, palette.get(0, 0, 3));
|
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<Palette> testPalettes() {
|
||||||
|
List<Palette> palettes = new ArrayList<>();
|
||||||
|
for (int i = 4; i < 16; i += 2) {
|
||||||
|
palettes.add(Palette.newPalette(i, 5, 3, 1));
|
||||||
|
}
|
||||||
|
return palettes;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user