Fix biome dependency check to include embedded fluid state

This commit is contained in:
mcrcortex
2025-04-19 11:16:14 +10:00
parent 325983152a
commit d1322990b3

View File

@@ -10,6 +10,7 @@ import me.cortex.voxy.client.core.rendering.util.RawDownloadStream;
import me.cortex.voxy.client.core.rendering.util.UploadStream; import me.cortex.voxy.client.core.rendering.util.UploadStream;
import me.cortex.voxy.common.Logger; import me.cortex.voxy.common.Logger;
import me.cortex.voxy.common.world.other.Mapper; import me.cortex.voxy.common.world.other.Mapper;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.FluidBlock; import net.minecraft.block.FluidBlock;
import net.minecraft.block.entity.BlockEntity; import net.minecraft.block.entity.BlockEntity;
@@ -249,9 +250,6 @@ public class ModelFactory {
this.fluidStateLUT[modelId] = clientFluidStateId; this.fluidStateLUT[modelId] = clientFluidStateId;
} }
var colourProvider = MinecraftClient.getInstance().getBlockColors().providers.get(Registries.BLOCK.getRawId(blockState.getBlock()));
RenderLayer blockRenderLayer = null; RenderLayer blockRenderLayer = null;
if (blockState.getBlock() instanceof FluidBlock) { if (blockState.getBlock() instanceof FluidBlock) {
blockRenderLayer = RenderLayers.getFluidLayer(blockState.getFluidState()); blockRenderLayer = RenderLayers.getFluidLayer(blockState.getFluidState());
@@ -269,6 +267,7 @@ public class ModelFactory {
checkMode = TextureUtils.WRITE_CHECK_ALPHA; checkMode = TextureUtils.WRITE_CHECK_ALPHA;
} }
var colourProvider = getColourProvider(blockState.getBlock());
long uploadPtr = UploadStream.INSTANCE.upload(this.storage.modelBuffer, (long) modelId * MODEL_SIZE, MODEL_SIZE);; long uploadPtr = UploadStream.INSTANCE.upload(this.storage.modelBuffer, (long) modelId * MODEL_SIZE, MODEL_SIZE);;
@@ -276,9 +275,15 @@ public class ModelFactory {
//TODO: implement; //TODO: implement;
// TODO: if it has a constant colour instead... idk why (apparently for things like spruce leaves)?? but premultiply the texture data by the constant colour // TODO: if it has a constant colour instead... idk why (apparently for things like spruce leaves)?? but premultiply the texture data by the constant colour
boolean hasBiomeColourResolver = false; boolean isBiomeColourDependent = false;
if (colourProvider != null) { if (colourProvider != null) {
hasBiomeColourResolver = isBiomeDependentColour(colourProvider, blockState); isBiomeColourDependent = isBiomeDependentColour(colourProvider, blockState);
}
//If it contains fluid but isnt a fluid
if ((!isFluid) && (!blockState.getFluidState().isEmpty()) && clientFluidStateId != -1) {
//Or it with the fluid state biome dependency
isBiomeColourDependent |= ModelQueries.isBiomeColoured(this.getModelMetadataFromClientId(clientFluidStateId));
} }
@@ -323,7 +328,7 @@ public class ModelFactory {
//Each face gets 1 byte, with the top 2 bytes being for whatever //Each face gets 1 byte, with the top 2 bytes being for whatever
long metadata = 0; long metadata = 0;
metadata |= hasBiomeColourResolver?1:0; metadata |= isBiomeColourDependent?1:0;
metadata |= blockRenderLayer == RenderLayer.getTranslucent()?2:0; metadata |= blockRenderLayer == RenderLayer.getTranslucent()?2:0;
metadata |= needsDoubleSidedQuads?4:0; metadata |= needsDoubleSidedQuads?4:0;
metadata |= ((!isFluid) && !blockState.getFluidState().isEmpty())?8:0;//Has a fluid state accosiacted with it and is not itself a fluid metadata |= ((!isFluid) && !blockState.getFluidState().isEmpty())?8:0;//Has a fluid state accosiacted with it and is not itself a fluid
@@ -412,7 +417,7 @@ public class ModelFactory {
// todo: put in like the render layer type ig? along with colour resolver info // todo: put in like the render layer type ig? along with colour resolver info
int modelFlags = 0; int modelFlags = 0;
modelFlags |= colourProvider != null?1:0; modelFlags |= colourProvider != null?1:0;
modelFlags |= hasBiomeColourResolver?2:0;//Basicly whether to use the next int as a colour or as a base index/id into a colour buffer for biome dependent colours modelFlags |= isBiomeColourDependent?2:0;//Basicly whether to use the next int as a colour or as a base index/id into a colour buffer for biome dependent colours
modelFlags |= blockRenderLayer == RenderLayer.getTranslucent()?4:0;//Is translucent modelFlags |= blockRenderLayer == RenderLayer.getTranslucent()?4:0;//Is translucent
modelFlags |= blockRenderLayer == RenderLayer.getCutout()?0:8;//Use mipmaps modelFlags |= blockRenderLayer == RenderLayer.getCutout()?0:8;//Use mipmaps
@@ -422,7 +427,7 @@ public class ModelFactory {
//Temporary override to always be non biome specific //Temporary override to always be non biome specific
if (colourProvider == null) { if (colourProvider == null) {
MemoryUtil.memPutInt(uploadPtr + 4, -1);//Set the default to nothing so that its faster on the gpu MemoryUtil.memPutInt(uploadPtr + 4, -1);//Set the default to nothing so that its faster on the gpu
} else if (!hasBiomeColourResolver) { } else if (!isBiomeColourDependent) {
MemoryUtil.memPutInt(uploadPtr + 4, captureColourConstant(colourProvider, blockState, DEFAULT_BIOME)|0xFF000000); MemoryUtil.memPutInt(uploadPtr + 4, captureColourConstant(colourProvider, blockState, DEFAULT_BIOME)|0xFF000000);
} else if (!this.biomes.isEmpty()) { } else if (!this.biomes.isEmpty()) {
//Populate the list of biomes for the model state //Populate the list of biomes for the model state
@@ -491,6 +496,9 @@ public class ModelFactory {
} }
} }
private static BlockColorProvider getColourProvider(Block block) {
return MinecraftClient.getInstance().getBlockColors().providers.get(Registries.BLOCK.getRawId(block));
}
//TODO: add a method to detect biome dependent colours (can do by detecting if getColor is ever called) //TODO: add a method to detect biome dependent colours (can do by detecting if getColor is ever called)
// if it is, need to add it to a list and mark it as biome colour dependent or something then the shader // if it is, need to add it to a list and mark it as biome colour dependent or something then the shader