This commit is contained in:
mcrcortex
2025-05-15 22:10:07 +10:00
parent 28ef19a1dc
commit 73f27b65b1
4 changed files with 30 additions and 8 deletions

View File

@@ -56,7 +56,7 @@ public class BakedBlockEntityModel {
entity.setWorld(MinecraftClient.getInstance().world);
if (renderer != null) {
try {
renderer.render(entity, 0.0f, new MatrixStack(), layer->map.computeIfAbsent(layer, rl -> new LayerConsumer(rl, new ReuseVertexConsumer())).consumer, 0, 0, new Vec3d(0,0,0));
renderer.render(entity, 0.0f, new MatrixStack(), layer->map.computeIfAbsent(layer, rl -> new LayerConsumer(rl, new ReuseVertexConsumer().setDefaultMeta(ModelTextureBakery.getMetaFromLayer(rl)))).consumer, 0, 0, new Vec3d(0,0,0));
} catch (Exception e) {
Logger.error("Unable to bake block entity: " + entity, e);
}

View File

@@ -42,15 +42,28 @@ public class ModelTextureBakery {
this.height = height;
}
public static int getMetaFromLayer(RenderLayer layer) {
boolean hasDiscard = layer == RenderLayer.getCutout() ||
layer == RenderLayer.getCutoutMipped() ||
layer == RenderLayer.getTripwire();
boolean isMipped = layer == RenderLayer.getCutoutMipped() ||
layer == RenderLayer.getSolid() ||
layer == RenderLayer.getTranslucent() ||
layer == RenderLayer.getTripwire();
int meta = hasDiscard?1:0;
meta |= isMipped?2:0;
return meta;
}
private void bakeBlockModel(BlockState state, RenderLayer layer) {
var model = MinecraftClient.getInstance()
.getBakedModelManager()
.getBlockModels()
.getModel(state);
boolean hasDiscard = layer == RenderLayer.getCutout() ||
layer == RenderLayer.getCutoutMipped() ||
layer == RenderLayer.getTripwire();
int meta = getMetaFromLayer(layer);
for (Direction direction : new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST, null}) {
for (var part : model.getParts(new LocalRandom(42L))) {
@@ -58,7 +71,6 @@ public class ModelTextureBakery {
for (var quad : quads) {
//TODO: add meta specifiying quad has a tint
int meta = hasDiscard?1:0;
this.vc.quad(quad, meta);
}
}
@@ -66,7 +78,8 @@ public class ModelTextureBakery {
}
private void bakeFluidState(BlockState state, int face) {
private void bakeFluidState(BlockState state, RenderLayer layer, int face) {
this.vc.setDefaultMeta(getMetaFromLayer(layer));//Set the meta while baking
MinecraftClient.getInstance().getBlockRenderManager().renderFluid(BlockPos.ORIGIN, new BlockRenderView() {
@Override
public float getBrightness(Direction direction, boolean shaded) {
@@ -131,6 +144,7 @@ public class ModelTextureBakery {
return 0;
}
}, this.vc, state, state.getFluidState());
this.vc.setDefaultMeta(0);//Reset default meta
}
private static boolean shouldReturnAirForFluid(BlockPos pos, int face) {
@@ -220,7 +234,7 @@ public class ModelTextureBakery {
var mat = new Matrix4f();
for (int i = 0; i < VIEWS.length; i++) {
this.vc.reset();
this.bakeFluidState(state, i);
this.bakeFluidState(state, layer, i);
if (this.vc.isEmpty()) continue;
BudgetBufferRenderer.setup(this.vc.getAddress(), this.vc.quadCount(), blockTextureId);

View File

@@ -12,15 +12,22 @@ public final class ReuseVertexConsumer implements VertexConsumer {
private MemoryBuffer buffer = new MemoryBuffer(8192);
private long ptr;
private int count;
private int defaultMeta;
public ReuseVertexConsumer() {
this.reset();
}
public ReuseVertexConsumer setDefaultMeta(int meta) {
this.defaultMeta = meta;
return this;
}
@Override
public ReuseVertexConsumer vertex(float x, float y, float z) {
this.ensureCanPut();
this.ptr += VERTEX_FORMAT_SIZE; this.count++; //Goto next vertex
this.meta(this.defaultMeta);
MemoryUtil.memPutFloat(this.ptr, x);
MemoryUtil.memPutFloat(this.ptr + 4, y);
MemoryUtil.memPutFloat(this.ptr + 8, z);
@@ -90,6 +97,7 @@ public final class ReuseVertexConsumer implements VertexConsumer {
}
public ReuseVertexConsumer reset() {
this.defaultMeta = 0;//RESET THE DEFAULT META
this.count = 0;
this.ptr = this.buffer.address - VERTEX_FORMAT_SIZE;//the thing is first time this gets incremented by FORMAT_STRIDE
return this;

View File

@@ -6,7 +6,7 @@ in vec2 texCoord;
out vec4 colour;
void main() {
colour = texture(tex, texCoord);
colour = texture(tex, texCoord, ((~metadata>>1)&1u)*-16.0f);
if (colour.a < 0.001f && ((metadata&1u)!=0)) {
discard;
}