Added opacity based mipping

This commit is contained in:
mcrcortex
2025-01-15 01:24:37 +10:00
parent 6539e69fb0
commit dbf1188b12
2 changed files with 50 additions and 15 deletions

View File

@@ -197,6 +197,13 @@ public class Mapper {
return this.block2stateEntry.computeIfAbsent(state, this::registerNewBlockState).id;
}
public int getBlockStateOpacity(long mappingId) {
return this.getBlockStateOpacity(getBlockId(mappingId));
}
public int getBlockStateOpacity(int blockId) {
return this.blockId2stateEntry.get(blockId).opacity;
}
//TODO: replace lambda with a class cached lambda ref (cause doing this:: still does a lambda allocation)
public int getIdForBiome(RegistryEntry<Biome> biome) {
@@ -279,9 +286,11 @@ public class Mapper {
public static final class StateEntry {
public final int id;
public final BlockState state;
public final int opacity;
public StateEntry(int id, BlockState state) {
this.id = id;
this.state = state;
this.opacity = state.getOpacity();
}
public byte[] serialize() {

View File

@@ -4,11 +4,23 @@ import static me.cortex.voxy.common.world.other.Mapper.withLight;
//Mipper for data
public class Mipper {
//TODO: compute the opacity of the block then mip w.r.t those blocks
// as distant horizons done
//TODO: also pass in the level its mipping from, cause at lower levels you want to preserve block details
// but at higher details you want more air
public static long mip(long I000, long I100, long I001, long I101,
long I010, long I110, long I011, long I111,
Mapper mapper) {
//TODO: do a stable sort on all the entires, w.r.t the opacity and maybe light as a secondary???
// then select the highest value
// UPDATE, dumbass, the highest value _is_ the max/min
int max = -1;
//TODO: mip with respect to all the variables, what that means is take whatever has the highest count and return that
//TODO: also average out the light level and set that as the new light level
//For now just take the most top corner
@@ -17,30 +29,43 @@ public class Mipper {
// you can see it from really really damn far away.
// it could be a heavily weighted average with a huge preference to the top most lighting value
if (!Mapper.isAir(I111)) {
return I111;
max = (mapper.getBlockStateOpacity(I111)<<4)|0b111;
}
if (!Mapper.isAir(I110)) {
return I110;
max = Math.max((mapper.getBlockStateOpacity(I110)<<4)|0b110, max);
}
if (!Mapper.isAir(I011)) {
return I011;
max = Math.max((mapper.getBlockStateOpacity(I011)<<4)|0b011, max);
}
if (!Mapper.isAir(I010)) {
return I010;
max = Math.max((mapper.getBlockStateOpacity(I010)<<4)|0b010, max);
}
if (!Mapper.isAir(I101)) {
return I101;
max = Math.max((mapper.getBlockStateOpacity(I101)<<4)|0b101, max);
}
if (!Mapper.isAir(I100)) {
return I100;
max = Math.max((mapper.getBlockStateOpacity(I100)<<4)|0b100, max);
}
if (!Mapper.isAir(I001)) {
return I001;
max = Math.max((mapper.getBlockStateOpacity(I001)<<4)|0b001, max);
}
if (!Mapper.isAir(I000)) {
return I000;
max = Math.max((mapper.getBlockStateOpacity(I000)<<4), max);
}
if (max != -1) {
return switch (max&0b111) {
case 0 -> I000;
case 1 -> I001;
case 2 -> I010;
case 3 -> I011;
case 4 -> I100;
case 5 -> I101;
case 6 -> I110;
case 7 -> I111;
default -> throw new IllegalStateException("Unexpected value: " + (max&0b111));
};
} else {
int blockLight = (Mapper.getLightId(I000) & 0xF0) + (Mapper.getLightId(I001) & 0xF0) + (Mapper.getLightId(I010) & 0xF0) + (Mapper.getLightId(I011) & 0xF0) +
(Mapper.getLightId(I100) & 0xF0) + (Mapper.getLightId(I101) & 0xF0) + (Mapper.getLightId(I110) & 0xF0) + (Mapper.getLightId(I111) & 0xF0);
int skyLight = (Mapper.getLightId(I000) & 0x0F) + (Mapper.getLightId(I001) & 0x0F) + (Mapper.getLightId(I010) & 0x0F) + (Mapper.getLightId(I011) & 0x0F) +
@@ -51,3 +76,4 @@ public class Mipper {
return withLight(I111, (blockLight << 4) | skyLight);
}
}
}