Palette container support custom data

This commit is contained in:
cyberpwn 2021-09-22 06:26:57 -04:00
parent f21306a19d
commit 81e0376102
2 changed files with 37 additions and 56 deletions

View File

@ -18,8 +18,10 @@
package com.volmit.iris.util.data.palette; package com.volmit.iris.util.data.palette;
import com.volmit.iris.util.nbt.tag.CompoundTag;
import com.volmit.iris.util.nbt.tag.ListTag; import com.volmit.iris.util.nbt.tag.ListTag;
import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
public interface Palette<T> { public interface Palette<T> {
@ -31,5 +33,7 @@ public interface Palette<T> {
int getSize(); int getSize();
void read(ListTag paramListTag); void read(List<T> fromList);
void write(List<T> toList);
} }

View File

@ -18,42 +18,23 @@
package com.volmit.iris.util.data.palette; package com.volmit.iris.util.data.palette;
import com.volmit.iris.util.nbt.tag.CompoundTag;
import com.volmit.iris.util.nbt.tag.ListTag;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
@SuppressWarnings("DuplicatedCode")
public class PalettedContainer<T> implements PaletteResize<T> { public class PalettedContainer<T> implements PaletteResize<T> {
public static final int GLOBAL_PALETTE_BITS = 9; public static final int GLOBAL_PALETTE_BITS = 9;
public static final int MIN_PALETTE_SIZE = 4; public static final int MIN_PALETTE_SIZE = 4;
private static final int SIZE = 4096; private static final int SIZE = 4096;
private final Palette<T> globalPalette;
private final PaletteResize<T> dummyPaletteResize = (var0, var1) -> 0; private final PaletteResize<T> dummyPaletteResize = (var0, var1) -> 0;
private final IdMapper<T> registry;
private final Function<CompoundTag, T> reader;
private final Function<T, CompoundTag> writer;
private final T defaultValue;
protected BitStorage storage; protected BitStorage storage;
private Palette<T> palette; private Palette<T> palette;
private int bits; private int bits;
public PalettedContainer(Palette<T> var0, IdMapper<T> var1, Function<CompoundTag, T> var2, Function<T, CompoundTag> var3, T var4) { public PalettedContainer() {
this.globalPalette = var0;
this.registry = var1;
this.reader = var2;
this.writer = var3;
this.defaultValue = var4;
setBits(4); setBits(4);
} }
private static int getIndex(int var0, int var1, int var2) { private static int getIndex(int var0, int var1, int var2) {
@ -62,18 +43,18 @@ public class PalettedContainer<T> implements PaletteResize<T> {
private void setBits(int var0) { private void setBits(int var0) {
if (var0 == this.bits) if (var0 == this.bits)
{
return; return;
}
this.bits = var0; this.bits = var0;
if (this.bits <= 4) { if (this.bits <= 4) {
this.bits = 4; this.bits = 4;
this.palette = new LinearPalette<>(this.registry, this.bits, this, this.reader); this.palette = new LinearPalette<>(this.bits, this);
} else if (this.bits < 9) {
this.palette = new HashMapPalette<>(this.registry, this.bits, this, this.reader, this.writer);
} else { } else {
this.palette = this.globalPalette; this.palette = new HashMapPalette<>(this.bits, this);
this.bits = Mth.ceillog2(this.registry.size());
} }
this.palette.idFor(this.defaultValue);
this.palette.idFor(null);
this.storage = new BitStorage(this.bits, 4096); this.storage = new BitStorage(this.bits, 4096);
} }
@ -100,8 +81,7 @@ public class PalettedContainer<T> implements PaletteResize<T> {
private T getAndSet(int var0, T var1) { private T getAndSet(int var0, T var1) {
int var2 = this.palette.idFor(var1); int var2 = this.palette.idFor(var1);
int var3 = this.storage.getAndSet(var0, var2); int var3 = this.storage.getAndSet(var0, var2);
T var4 = this.palette.valueFor(var3); return this.palette.valueFor(var3);
return (var4 == null) ? this.defaultValue : var4;
} }
public void set(int var0, int var1, int var2, T var3) { public void set(int var0, int var1, int var2, T var3) {
@ -118,35 +98,33 @@ public class PalettedContainer<T> implements PaletteResize<T> {
} }
protected T get(int var0) { protected T get(int var0) {
T var1 = this.palette.valueFor(this.storage.get(var0)); return this.palette.valueFor(this.storage.get(var0));
return (var1 == null) ? this.defaultValue : var1;
} }
public void read(ListTag var0, long[] var1) { public void read(List<T> palette, long[] data) {
int var2 = Math.max(4, Mth.ceillog2(var0.size())); int var2 = Math.max(4, Mth.ceillog2(palette.size()));
if (var2 != this.bits) if (var2 != this.bits)
{
setBits(var2); setBits(var2);
this.palette.read(var0); }
int var3 = var1.length * 64 / 4096;
if (this.palette == this.globalPalette) { this.palette.read(palette);
Palette<T> var4 = new HashMapPalette<>(this.registry, var2, this.dummyPaletteResize, this.reader, this.writer); int var3 = data.length * 64 / 4096;
var4.read(var0); if (var3 == this.bits) {
BitStorage var5 = new BitStorage(var2, 4096, var1); System.arraycopy(data, 0, this.storage.getRaw(), 0, data.length);
for (int var6 = 0; var6 < 4096; var6++)
this.storage.set(var6, this.globalPalette.idFor(var4.valueFor(var5.get(var6))));
} else if (var3 == this.bits) {
System.arraycopy(var1, 0, this.storage.getRaw(), 0, var1.length);
} else { } else {
BitStorage var4 = new BitStorage(var3, 4096, var1); BitStorage var4 = new BitStorage(var3, 4096, data);
for (int var5 = 0; var5 < 4096; var5++) for (int var5 = 0; var5 < 4096; var5++)
{
this.storage.set(var5, var4.get(var5)); this.storage.set(var5, var4.get(var5));
} }
} }
}
public void write(CompoundTag var0, String var1, String var2) { public long[] write(List<T> toList) {
HashMapPalette<T> var3 = new HashMapPalette<>(this.registry, this.bits, this.dummyPaletteResize, this.reader, this.writer); HashMapPalette<T> var3 = new HashMapPalette<>(this.bits, this.dummyPaletteResize);
T var4 = this.defaultValue; T var4 = null;
int var5 = var3.idFor(this.defaultValue); int var5 = 0;
int[] var6 = new int[4096]; int[] var6 = new int[4096];
for (int i = 0; i < 4096; i++) { for (int i = 0; i < 4096; i++) {
T t = get(i); T t = get(i);
@ -156,15 +134,14 @@ public class PalettedContainer<T> implements PaletteResize<T> {
} }
var6[i] = var5; var6[i] = var5;
} }
ListTag<CompoundTag> paletteList = (ListTag<CompoundTag>) ListTag.createUnchecked(CompoundTag.class);
var3.write(paletteList); var3.write(toList);
var0.put(var1, paletteList); int var8 = Math.max(4, Mth.ceillog2(toList.size()));
int var8 = Math.max(4, Mth.ceillog2(paletteList.size()));
BitStorage var9 = new BitStorage(var8, 4096); BitStorage var9 = new BitStorage(var8, 4096);
for (int var10 = 0; var10 < var6.length; var10++) { for (int var10 = 0; var10 < var6.length; var10++) {
var9.set(var10, var6[var10]); var9.set(var10, var6[var10]);
} }
var0.putLongArray(var2, var9.getRaw()); return var9.getRaw();
} }
public boolean maybeHas(Predicate<T> var0) { public boolean maybeHas(Predicate<T> var0) {