This commit is contained in:
modmuss50 2022-04-27 20:48:57 +01:00
parent 50e8465e2e
commit 56447d9b95
30 changed files with 104 additions and 433 deletions
fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome
fabric-command-api-v1/src/main/java/net/fabricmc/fabric/mixin/command/client
fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync
fabric-renderer-indigo
fabric-rendering-fluids-v1/src
main/java/net/fabricmc/fabric
api/client/render/fluid/v1
impl/client/rendering/fluid
mixin/client/rendering/fluid
testmod/java/net/fabricmc/fabric/test/client/rendering/fluid
fabric-transfer-api-v1/src/testmod/java/net/fabricmc/fabric/test/transfer/ingame/client
gradle.properties
src/main/resources

View file

@ -33,7 +33,7 @@ import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.BiomeKeys;
import net.minecraft.world.biome.source.TheEndBiomeSource;
import net.minecraft.world.biome.source.util.MultiNoiseUtil;
import net.minecraft.world.gen.random.AtomicSimpleRandom;
import net.minecraft.util.math.random.AtomicSimpleRandom;
import net.minecraft.util.math.random.ChunkRandom;
/**

View file

@ -20,6 +20,7 @@ import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.class_7436;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientCommandSource;
import net.minecraft.client.network.ClientPlayerEntity;
@ -39,12 +40,12 @@ abstract class ClientCommandSourceMixin implements FabricClientCommandSource {
@Override
public void sendFeedback(Text message) {
client.inGameHud.addChatMessage(MessageType.SYSTEM, message, Util.NIL_UUID);
client.inGameHud.method_43592(MessageType.SYSTEM, message, new class_7436(Util.NIL_UUID, message));
}
@Override
public void sendError(Text message) {
client.inGameHud.addChatMessage(MessageType.SYSTEM, Text.literal("").append(message).formatted(Formatting.RED), Util.NIL_UUID);
client.inGameHud.method_43592(MessageType.SYSTEM, Text.literal("").append(message).formatted(Formatting.RED), new class_7436(Util.NIL_UUID, message));
}
@Override

View file

@ -61,7 +61,7 @@ public class MixinLevelStorageSession {
@Shadow
@Final
private LevelStorage.class_7411 directory;
private LevelStorage.LevelSave directory;
@Unique
private boolean fabric_readIdMapFile(File file) throws IOException, RemapException {

View file

@ -1,6 +1,10 @@
archivesBaseName = "fabric-renderer-indigo"
version = getSubprojectVersion(project)
loom {
accessWidenerPath = file("src/main/resources/fabric-renderer-indigo.accesswidener")
}
moduleDependencies(project, [
'fabric-api-base',
'fabric-renderer-api-v1'

View file

@ -1,32 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.impl.client.indigo.renderer.accessor;
import java.util.BitSet;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockRenderView;
public interface AccessAmbientOcclusionCalculator {
float[] fabric_colorMultiplier();
int[] fabric_brightness();
void fabric_apply(BlockRenderView blockRenderView, BlockState blockState, BlockPos pos, Direction face, float[] aoData, BitSet controlBits, boolean shade);
}

View file

@ -1,28 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.impl.client.indigo.renderer.accessor;
import java.util.BitSet;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockRenderView;
public interface AccessBlockModelRenderer {
void fabric_updateShape(BlockRenderView blockRenderView, BlockState blockState, BlockPos pos, int[] vertexData, Direction face, float[] aoData, BitSet controlBits);
}

View file

@ -1,23 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.impl.client.indigo.renderer.accessor;
import net.minecraft.client.render.BufferBuilder;
public interface AccessChunkRenderer {
void fabric_beginBufferBuilding(BufferBuilder bufferBuilder);
}

View file

@ -1,28 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.impl.client.indigo.renderer.accessor;
import net.minecraft.client.render.RenderLayer;
public interface AccessChunkRendererData {
/**
* Mark internal tracking set that buffer has content.
*
* @param renderLayer Layer with content.
*/
void fabric_markPopulated(RenderLayer renderLayer);
}

View file

@ -1,26 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.impl.client.indigo.renderer.accessor;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
public interface AccessItemRenderer {
void fabric_renderBakedItemModel(BakedModel model, ItemStack stack, int light, int overlay, MatrixStack matrixStack, VertexConsumer buffer);
}

View file

@ -30,20 +30,20 @@ import static net.minecraft.util.math.Direction.WEST;
import java.util.BitSet;
import java.util.function.ToIntFunction;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.minecraft.block.Block;
import net.minecraft.util.math.Vec3f;
import net.minecraft.client.render.block.BlockModelRenderer;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3f;
import net.minecraft.world.BlockRenderView;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.fabricmc.fabric.impl.client.indigo.Indigo;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessAmbientOcclusionCalculator;
import net.fabricmc.fabric.impl.client.indigo.renderer.aocalc.AoFace.WeightFunction;
import net.fabricmc.fabric.impl.client.indigo.renderer.mesh.EncodingFormat;
import net.fabricmc.fabric.impl.client.indigo.renderer.mesh.MutableQuadViewImpl;
@ -77,7 +77,7 @@ public class AoCalculator {
private static final Logger LOGGER = LoggerFactory.getLogger(AoCalculator.class);
private final AccessAmbientOcclusionCalculator vanillaCalc;
private final BlockModelRenderer.AmbientOcclusionCalculator vanillaCalc;
private final BlockPos.Mutable lightPos = new BlockPos.Mutable();
private final BlockPos.Mutable searchPos = new BlockPos.Mutable();
private final BlockRenderInfo blockInfo;
@ -101,7 +101,7 @@ public class AoCalculator {
this.blockInfo = blockInfo;
this.brightnessFunc = brightnessFunc;
this.aoFunc = aoFunc;
this.vanillaCalc = VanillaAoHelper.get();
this.vanillaCalc = new BlockModelRenderer.AmbientOcclusionCalculator();
for (int i = 0; i < 12; i++) {
faceData[i] = new AoFaceData();
@ -119,12 +119,7 @@ public class AoCalculator {
switch (config) {
case VANILLA:
// prevent NPE in error case of failed reflection for vanilla calculator access
if (vanillaCalc == null) {
calcFastVanilla(quad);
} else {
calcVanilla(quad);
}
calcVanilla(quad);
// no point in comparing vanilla with itself
shouldCompare = false;
@ -152,7 +147,7 @@ public class AoCalculator {
calcEnhanced(quad);
}
if (shouldCompare && vanillaCalc != null) {
if (shouldCompare) {
float[] vanillaAo = new float[4];
int[] vanillaLight = new int[4];
calcVanilla(quad, vanillaAo, vanillaLight);
@ -188,10 +183,10 @@ public class AoCalculator {
quad.toVanilla(0, vertexData, 0, false);
VanillaAoHelper.updateShape(blockInfo.blockView, blockInfo.blockState, blockInfo.blockPos, vertexData, face, vanillaAoData, vanillaAoControlBits);
vanillaCalc.fabric_apply(blockInfo.blockView, blockInfo.blockState, blockInfo.blockPos, quad.lightFace(), vanillaAoData, vanillaAoControlBits, quad.hasShade());
vanillaCalc.apply(blockInfo.blockView, blockInfo.blockState, blockInfo.blockPos, quad.lightFace(), vanillaAoData, vanillaAoControlBits, quad.hasShade());
System.arraycopy(vanillaCalc.fabric_colorMultiplier(), 0, aoDest, 0, 4);
System.arraycopy(vanillaCalc.fabric_brightness(), 0, lightDest, 0, 4);
System.arraycopy(vanillaCalc.brightness, 0, aoDest, 0, 4);
System.arraycopy(vanillaCalc.light, 0, lightDest, 0, 4);
}
private void calcFastVanilla(MutableQuadViewImpl quad) {

View file

@ -16,9 +16,7 @@
package net.fabricmc.fabric.impl.client.indigo.renderer.aocalc;
import java.lang.reflect.Constructor;
import java.util.BitSet;
import java.util.function.Supplier;
import net.minecraft.block.BlockState;
import net.minecraft.client.render.block.BlockModelRenderer;
@ -26,58 +24,16 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockRenderView;
import net.fabricmc.fabric.impl.client.indigo.Indigo;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessAmbientOcclusionCalculator;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessBlockModelRenderer;
import net.fabricmc.loader.api.FabricLoader;
public class VanillaAoHelper {
private static Supplier<AccessAmbientOcclusionCalculator> factory;
// Renderer method we call isn't declared as static, but uses no
// instance data and is called from multiple threads in vanilla also.
private static AccessBlockModelRenderer blockRenderer;
private static BlockModelRenderer blockRenderer;
public static void initialize(BlockModelRenderer instance) {
blockRenderer = (AccessBlockModelRenderer) instance;
final String target = FabricLoader.getInstance().getMappingResolver()
.mapClassName("intermediary", "net.minecraft.class_778$class_780");
for (Class<?> innerClass : BlockModelRenderer.class.getDeclaredClasses()) {
if (innerClass.getName().equals(target)) {
Constructor<?> constructor = innerClass.getDeclaredConstructors()[0];
constructor.setAccessible(true);
factory = new Supplier<AccessAmbientOcclusionCalculator>() {
@Override
public AccessAmbientOcclusionCalculator get() {
try {
return (AccessAmbientOcclusionCalculator) constructor.newInstance(instance);
} catch (Exception e) {
Indigo.LOGGER.warn("[Indigo] Exception accessing vanilla smooth lighter", e);
return null;
}
}
};
break;
}
}
if (factory != null && factory.get() == null) {
factory = null;
}
if (factory == null) {
Indigo.LOGGER.warn("[Indigo] Vanilla smooth lighter unavailable. Indigo lighter will be used even if not configured.");
}
}
public static AccessAmbientOcclusionCalculator get() {
return factory == null ? null : factory.get();
blockRenderer = instance;
}
public static void updateShape(BlockRenderView blockRenderView, BlockState blockState, BlockPos pos, int[] vertexData, Direction face, float[] aoData, BitSet controlBits) {
blockRenderer.fabric_updateShape(blockRenderView, blockState, pos, vertexData, face, aoData, controlBits);
blockRenderer.getQuadDimensions(blockRenderView, blockState, pos, vertexData, face, aoData, controlBits);
}
}

View file

@ -28,13 +28,10 @@ import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.render.chunk.BlockBufferBuilderStorage;
import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk;
import net.minecraft.client.render.chunk.ChunkBuilder.ChunkData;
import net.minecraft.client.render.chunk.ChunkRendererRegion;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockRenderView;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessChunkRenderer;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessChunkRendererData;
import net.fabricmc.fabric.impl.client.indigo.renderer.aocalc.AoLuminanceFix;
/**
@ -71,7 +68,7 @@ public class ChunkRenderInfo {
private final Long2FloatOpenHashMap aoLevelCache;
private final BlockPos.Mutable chunkOrigin = new BlockPos.Mutable();
AccessChunkRendererData chunkData;
BuiltChunk.RebuildTask.class_7435 chunkData;
BuiltChunk chunkRenderer;
BlockBufferBuilderStorage builders;
Set<RenderLayer> initializedLayers;
@ -86,10 +83,10 @@ public class ChunkRenderInfo {
aoLevelCache.defaultReturnValue(Float.MAX_VALUE);
}
void prepare(ChunkRendererRegion blockView, BuiltChunk chunkRenderer, ChunkData chunkData, BlockBufferBuilderStorage builders, Set<RenderLayer> initializedLayers) {
void prepare(ChunkRendererRegion blockView, BuiltChunk chunkRenderer, BuiltChunk.RebuildTask.class_7435 chunkData, BlockBufferBuilderStorage builders, Set<RenderLayer> initializedLayers) {
this.blockView = blockView;
this.chunkOrigin.set(chunkRenderer.getOrigin());
this.chunkData = (AccessChunkRendererData) chunkData;
this.chunkData = chunkData;
this.chunkRenderer = chunkRenderer;
this.builders = builders;
this.initializedLayers = initializedLayers;
@ -106,20 +103,19 @@ public class ChunkRenderInfo {
/** Lazily retrieves output buffer for given layer, initializing as needed. */
public BufferBuilder getInitializedBuffer(RenderLayer renderLayer) {
BufferBuilder result = buffers.get(renderLayer);
BufferBuilder builder = buffers.get(renderLayer);
if (result == null) {
BufferBuilder builder = builders.get(renderLayer);
result = builder;
chunkData.fabric_markPopulated(renderLayer);
buffers.put(renderLayer, result);
if (builder == null) {
builder = builders.get(renderLayer);
if (initializedLayers.add(renderLayer)) {
((AccessChunkRenderer) chunkRenderer).fabric_beginBufferBuilding(builder);
chunkRenderer.beginBufferBuilding(builder);
}
buffers.put(renderLayer, builder);
}
return result;
return builder;
}
/**

View file

@ -17,21 +17,20 @@
package net.fabricmc.fabric.impl.client.indigo.renderer.render;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessItemRenderer;
public class IndigoQuadHandler implements ItemRenderContext.VanillaQuadHandler {
private final AccessItemRenderer itemRenderer;
private final ItemRenderer itemRenderer;
public IndigoQuadHandler(AccessItemRenderer itemRenderer) {
public IndigoQuadHandler(ItemRenderer itemRenderer) {
this.itemRenderer = itemRenderer;
}
@Override
public void accept(BakedModel model, ItemStack stack, int color, int overlay, MatrixStack matrixStack, VertexConsumer buffer) {
itemRenderer.fabric_renderBakedItemModel(model, stack, color, overlay, matrixStack, buffer);
itemRenderer.renderBakedItemModel(model, stack, color, overlay, matrixStack, buffer);
}
}

View file

@ -23,7 +23,6 @@ import net.minecraft.block.BlockState;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.chunk.BlockBufferBuilderStorage;
import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk;
import net.minecraft.client.render.chunk.ChunkBuilder.ChunkData;
import net.minecraft.client.render.chunk.ChunkRendererRegion;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.util.math.MatrixStack;
@ -86,9 +85,9 @@ public class TerrainRenderContext extends AbstractRenderContext {
}
};
public void prepare(ChunkRendererRegion blockView, BuiltChunk chunkRenderer, ChunkData chunkData, BlockBufferBuilderStorage builders, Set<RenderLayer> initializedLayers) {
public void prepare(ChunkRendererRegion blockView, BuiltChunk chunkRenderer, BuiltChunk.RebuildTask.class_7435 renderData, BlockBufferBuilderStorage builders, Set<RenderLayer> initializedLayers) {
blockInfo.setBlockView(blockView);
chunkInfo.prepare(blockView, chunkRenderer, chunkData, builders, initializedLayers);
chunkInfo.prepare(blockView, chunkRenderer, renderData, builders, initializedLayers);
}
public void release() {

View file

@ -1,55 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.mixin.client.indigo.renderer;
import java.util.BitSet;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockRenderView;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessAmbientOcclusionCalculator;
@Mixin(targets = "net.minecraft.client.render.block.BlockModelRenderer$AmbientOcclusionCalculator")
public abstract class MixinAmbientOcclusionCalculator implements AccessAmbientOcclusionCalculator {
@Shadow
private float[] brightness;
@Shadow
private int[] light;
@Shadow
public abstract void apply(BlockRenderView blockRenderView, BlockState blockState, BlockPos pos, Direction face, float[] aoData, BitSet controlBits, boolean shade);
@Override
public float[] fabric_colorMultiplier() {
return brightness;
}
@Override
public int[] fabric_brightness() {
return light;
}
@Override
public void fabric_apply(BlockRenderView blockRenderView, BlockState blockState, BlockPos pos, Direction face, float[] aoData, BitSet controlBits, boolean shade) {
apply(blockRenderView, blockState, pos, face, aoData, controlBits, shade);
}
}

View file

@ -16,15 +16,11 @@
package net.fabricmc.fabric.mixin.client.indigo.renderer;
import java.util.BitSet;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.block.BlockState;
import net.minecraft.client.render.VertexConsumer;
@ -32,29 +28,25 @@ import net.minecraft.client.render.block.BlockModelRenderer;
import net.minecraft.client.render.model.BakedModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.BlockRenderView;
import net.minecraft.util.math.random.AbstractRandom;
import net.minecraft.world.BlockRenderView;
import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessBlockModelRenderer;
import net.fabricmc.fabric.impl.client.indigo.renderer.aocalc.VanillaAoHelper;
import net.fabricmc.fabric.impl.client.indigo.renderer.render.BlockRenderContext;
@Mixin(BlockModelRenderer.class)
public abstract class MixinBlockModelRenderer implements AccessBlockModelRenderer {
public abstract class MixinBlockModelRenderer {
@Unique
private final ThreadLocal<BlockRenderContext> fabric_contexts = ThreadLocal.withInitial(BlockRenderContext::new);
@Shadow
protected abstract void getQuadDimensions(BlockRenderView blockView, BlockState blockState, BlockPos blockPos, int[] vertexData, Direction face, float[] aoData, BitSet controlBits);
@Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/AbstractRandom;JI)Z", cancellable = true)
private void hookRender(BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, MatrixStack matrix, VertexConsumer buffer, boolean checkSides, AbstractRandom rand, long seed, int overlay, CallbackInfoReturnable<Boolean> ci) {
@Inject(at = @At("HEAD"), method = "render(Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/AbstractRandom;JI)V", cancellable = true)
private void hookRender(BlockRenderView blockView, BakedModel model, BlockState state, BlockPos pos, MatrixStack matrix, VertexConsumer buffer, boolean checkSides, AbstractRandom rand, long seed, int overlay, CallbackInfo ci) {
if (!((FabricBakedModel) model).isVanillaAdapter()) {
BlockRenderContext context = fabric_contexts.get();
// Note that we do not support face-culling here (so checkSides is ignored)
ci.setReturnValue(context.render(blockView, model, state, pos, matrix, buffer, rand, seed, overlay));
context.render(blockView, model, state, pos, matrix, buffer, rand, seed, overlay);
ci.cancel();
}
}
@ -62,9 +54,4 @@ public abstract class MixinBlockModelRenderer implements AccessBlockModelRendere
private void onInit(CallbackInfo ci) {
VanillaAoHelper.initialize((BlockModelRenderer) (Object) this);
}
@Override
public void fabric_updateShape(BlockRenderView blockView, BlockState blockState, BlockPos pos, int[] vertexData, Direction face, float[] aoData, BitSet controlBits) {
getQuadDimensions(blockView, blockState, pos, vertexData, face, aoData, controlBits);
}
}

View file

@ -18,6 +18,7 @@ package net.fabricmc.fabric.mixin.client.indigo.renderer;
import java.util.Set;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
@ -33,7 +34,6 @@ import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.block.BlockRenderManager;
import net.minecraft.client.render.chunk.BlockBufferBuilderStorage;
import net.minecraft.client.render.chunk.ChunkBuilder;
import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk;
import net.minecraft.client.render.chunk.ChunkOcclusionDataBuilder;
import net.minecraft.client.render.chunk.ChunkRendererRegion;
@ -65,18 +65,19 @@ import net.fabricmc.fabric.impl.client.indigo.renderer.render.TerrainRenderConte
* Renderer authors are responsible for creating the hooks they need.
* (Though they can use these as an example if they wish.)
*/
@Mixin(targets = "net.minecraft.client.render.chunk.ChunkBuilder$BuiltChunk$RebuildTask")
@Mixin(BuiltChunk.RebuildTask.class)
public abstract class MixinChunkRebuildTask {
@Final
@Shadow
protected BuiltChunk field_20839;
BuiltChunk field_20839;
@Inject(method = "Lnet/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk$RebuildTask;render(FFFLnet/minecraft/client/render/chunk/ChunkBuilder$ChunkData;Lnet/minecraft/client/render/chunk/BlockBufferBuilderStorage;)Ljava/util/Set;",
@Inject(method = "render",
at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/BlockPos;iterate(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/util/math/BlockPos;)Ljava/lang/Iterable;"),
locals = LocalCapture.CAPTURE_FAILHARD)
private void hookChunkBuild(float cameraX, float cameraY, float cameraZ,
ChunkBuilder.ChunkData renderData, BlockBufferBuilderStorage builder,
CallbackInfoReturnable<Set<BlockEntity>> ci,
int i, BlockPos blockPos, BlockPos blockPos2, ChunkOcclusionDataBuilder chunkOcclusionDataBuilder, Set set, ChunkRendererRegion region, MatrixStack matrixStack, Set<RenderLayer> initializedLayers/*, AbstractRandom abstractRandom, BlockRenderManager blockRenderManager*/) {
BlockBufferBuilderStorage builder,
CallbackInfoReturnable<BuiltChunk.RebuildTask.class_7435> ci,
BuiltChunk.RebuildTask.class_7435 renderData, int i, BlockPos blockPos, BlockPos blockPos2, ChunkOcclusionDataBuilder chunkOcclusionDataBuilder, ChunkRendererRegion region, MatrixStack matrixStack, Set<RenderLayer> initializedLayers, AbstractRandom abstractRandom, BlockRenderManager blockRenderManager) {
// hook just before iterating over the render chunk's chunks blocks, captures the used renderlayer set
// accessing this.region is unsafe due to potential async cancellation, the LV has to be used!
@ -101,26 +102,27 @@ public abstract class MixinChunkRebuildTask {
* Normally this does nothing but will allow mods to create rendering hooks that are
* driven off of render type. (Not recommended or encouraged, but also not prevented.)
*/
@Redirect(method = "Lnet/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk$RebuildTask;render(FFFLnet/minecraft/client/render/chunk/ChunkBuilder$ChunkData;Lnet/minecraft/client/render/chunk/BlockBufferBuilderStorage;)Ljava/util/Set;", require = 1, at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/render/block/BlockRenderManager;renderBlock(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/AbstractRandom;)Z"))
private boolean hookChunkBuildTesselate(BlockRenderManager renderManager, BlockState blockState, BlockPos blockPos, BlockRenderView blockView, MatrixStack matrix, VertexConsumer bufferBuilder, boolean checkSides, AbstractRandom random) {
@Redirect(method = "render", require = 1, at = @At(value = "INVOKE",
target = "Lnet/minecraft/client/render/block/BlockRenderManager;renderBlock(Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;ZLnet/minecraft/util/math/random/AbstractRandom;)V"))
private void hookChunkBuildTesselate(BlockRenderManager renderManager, BlockState blockState, BlockPos blockPos, BlockRenderView blockView, MatrixStack matrix, VertexConsumer bufferBuilder, boolean checkSides, AbstractRandom random) {
if (blockState.getRenderType() == BlockRenderType.MODEL) {
final BakedModel model = renderManager.getModel(blockState);
if (Indigo.ALWAYS_TESSELATE_INDIGO || !((FabricBakedModel) model).isVanillaAdapter()) {
Vec3d vec3d = blockState.getModelOffset(blockView, blockPos);
matrix.translate(vec3d.x, vec3d.y, vec3d.z);
return ((AccessChunkRendererRegion) blockView).fabric_getRenderer().tessellateBlock(blockState, blockPos, model, matrix);
((AccessChunkRendererRegion) blockView).fabric_getRenderer().tessellateBlock(blockState, blockPos, model, matrix);
return;
}
}
return renderManager.renderBlock(blockState, blockPos, blockView, matrix, bufferBuilder, checkSides, random);
renderManager.renderBlock(blockState, blockPos, blockView, matrix, bufferBuilder, checkSides, random);
}
/**
* Release all references. Probably not necessary but would be $#%! to debug if it is.
*/
@Inject(method = "Lnet/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk$RebuildTask;render(FFFLnet/minecraft/client/render/chunk/ChunkBuilder$ChunkData;Lnet/minecraft/client/render/chunk/BlockBufferBuilderStorage;)Ljava/util/Set;",
@Inject(method = "render",
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/BlockModelRenderer;disableBrightnessCache()V"))
private void hookRebuildChunkReturn(CallbackInfoReturnable<Set<BlockEntity>> ci) {
// hook after iterating over the render chunk's chunks blocks, must be called if and only if hookChunkBuild happened

View file

@ -1,38 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.mixin.client.indigo.renderer;
import java.util.Set;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.render.chunk.ChunkBuilder.ChunkData;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessChunkRendererData;
@Mixin(ChunkData.class)
public abstract class MixinChunkRenderData implements AccessChunkRendererData {
@Shadow
private Set<RenderLayer> nonEmptyLayers;
@Override
public void fabric_markPopulated(RenderLayer renderLayer) {
nonEmptyLayers.add(renderLayer);
}
}

View file

@ -1,39 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.mixin.client.indigo.renderer;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.chunk.ChunkBuilder.BuiltChunk;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessChunkRenderer;
@Mixin(BuiltChunk.class)
public abstract class MixinChunkRenderer implements AccessChunkRenderer {
@Shadow
abstract void beginBufferBuilding(BufferBuilder builder);
/**
* Access method for renderer.
*/
@Override
public void fabric_beginBufferBuilding(BufferBuilder builder) {
beginBufferBuilding(builder);
}
}

View file

@ -16,6 +16,7 @@
package net.fabricmc.fabric.mixin.client.indigo.renderer;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
@ -24,7 +25,6 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.color.item.ItemColors;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.item.ItemRenderer;
import net.minecraft.client.render.model.BakedModel;
@ -33,24 +33,21 @@ import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.ItemStack;
import net.fabricmc.fabric.api.renderer.v1.model.FabricBakedModel;
import net.fabricmc.fabric.impl.client.indigo.renderer.accessor.AccessItemRenderer;
import net.fabricmc.fabric.impl.client.indigo.renderer.render.IndigoQuadHandler;
import net.fabricmc.fabric.impl.client.indigo.renderer.render.ItemRenderContext;
import net.fabricmc.fabric.impl.client.indigo.renderer.render.ItemRenderContext.VanillaQuadHandler;
@Mixin(ItemRenderer.class)
public abstract class MixinItemRenderer implements AccessItemRenderer {
public abstract class MixinItemRenderer {
@Final
@Shadow
protected ItemColors colors;
private ItemColors colors;
@Unique
private final ThreadLocal<ItemRenderContext> fabric_contexts = ThreadLocal.withInitial(() -> new ItemRenderContext(colors));
@Unique
private final VanillaQuadHandler fabric_vanillaHandler = new IndigoQuadHandler(this);
@Shadow
protected abstract void renderBakedItemModel(BakedModel model, ItemStack stack, int light, int overlay, MatrixStack matrixStack, VertexConsumer buffer);
private final VanillaQuadHandler fabric_vanillaHandler = new IndigoQuadHandler((ItemRenderer) (Object) this);
@Inject(at = @At("HEAD"), method = "renderItem(Lnet/minecraft/item/ItemStack;Lnet/minecraft/client/render/model/json/ModelTransformation$Mode;ZLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;IILnet/minecraft/client/render/model/BakedModel;)V", cancellable = true)
public void hook_renderItem(ItemStack stack, ModelTransformation.Mode transformMode, boolean invert, MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int light, int overlay, BakedModel model, CallbackInfo ci) {
@ -59,9 +56,4 @@ public abstract class MixinItemRenderer implements AccessItemRenderer {
ci.cancel();
}
}
@Override
public void fabric_renderBakedItemModel(BakedModel model, ItemStack stack, int light, int overlay, MatrixStack matrixStack, VertexConsumer buffer) {
renderBakedItemModel(model, stack, light, overlay, matrixStack, buffer);
}
}

View file

@ -0,0 +1,14 @@
accessWidener v2 named
accessible class net/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk$RebuildTask
accessible class net/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk$RebuildTask$class_7435
accessible class net/minecraft/client/render/block/BlockModelRenderer$AmbientOcclusionCalculator
accessible field net/minecraft/client/render/block/BlockModelRenderer$AmbientOcclusionCalculator brightness [F
accessible field net/minecraft/client/render/block/BlockModelRenderer$AmbientOcclusionCalculator light [I
accessible method net/minecraft/client/render/block/BlockModelRenderer getQuadDimensions (Lnet/minecraft/world/BlockRenderView;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;[ILnet/minecraft/util/math/Direction;[FLjava/util/BitSet;)V
accessible method net/minecraft/client/render/chunk/ChunkBuilder$BuiltChunk beginBufferBuilding (Lnet/minecraft/client/render/BufferBuilder;)V
accessible method net/minecraft/client/render/item/ItemRenderer renderBakedItemModel (Lnet/minecraft/client/render/model/BakedModel;Lnet/minecraft/item/ItemStack;IILnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;)V

View file

@ -6,11 +6,8 @@
"mixins": [
],
"client": [
"MixinAmbientOcclusionCalculator",
"MixinBlockModelRenderer",
"MixinChunkRebuildTask",
"MixinChunkRenderData",
"MixinChunkRenderer",
"MixinChunkRendererRegion",
"MixinItemRenderer"
],

View file

@ -32,5 +32,6 @@
},
"custom": {
"fabric-api:module-lifecycle": "stable"
}
},
"accessWidener" : "fabric-renderer-indigo.accesswidener"
}

View file

@ -83,8 +83,8 @@ public interface FluidRenderHandler {
* @param fluidState The fluid state being rendered.
* @return Whether anything is tessellated.
*/
default boolean renderFluid(BlockPos pos, BlockRenderView world, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState) {
return ((FluidRenderHandlerRegistryImpl) FluidRenderHandlerRegistry.INSTANCE).renderFluid(pos, world, vertexConsumer, blockState, fluidState);
default void renderFluid(BlockPos pos, BlockRenderView world, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState) {
((FluidRenderHandlerRegistryImpl) FluidRenderHandlerRegistry.INSTANCE).renderFluid(pos, world, vertexConsumer, blockState, fluidState);
}
/**

View file

@ -120,7 +120,7 @@ public class FluidRenderHandlerRegistryImpl implements FluidRenderHandlerRegistr
}
}
public boolean renderFluid(BlockPos pos, BlockRenderView world, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState) {
return fluidRenderer.render(world, pos, vertexConsumer, blockState, fluidState);
public void renderFluid(BlockPos pos, BlockRenderView world, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState) {
fluidRenderer.render(world, pos, vertexConsumer, blockState, fluidState);
}
}

View file

@ -25,7 +25,6 @@ import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
@ -61,7 +60,7 @@ public class MixinFluidRenderer {
}
@Inject(at = @At("HEAD"), method = "render", cancellable = true)
public void tesselate(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState, CallbackInfoReturnable<Boolean> info) {
public void tesselate(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState, CallbackInfo info) {
if (!fabric_customRendering.get()) {
// Prevent recursively looking up custom fluid renderers when default behaviour is being invoked
try {
@ -81,7 +80,7 @@ public class MixinFluidRenderer {
}
@Unique
private void tessellateViaHandler(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState, CallbackInfoReturnable<Boolean> info) {
private void tessellateViaHandler(BlockRenderView view, BlockPos pos, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState, CallbackInfo info) {
FluidRendererHookContainer ctr = fabric_renderHandler.get();
FluidRenderHandler handler = ((FluidRenderHandlerRegistryImpl) FluidRenderHandlerRegistry.INSTANCE).getOverride(fluidState.getFluid());
@ -92,12 +91,13 @@ public class MixinFluidRenderer {
ctr.handler = handler;
if (handler != null) {
info.setReturnValue(handler.renderFluid(pos, view, vertexConsumer, blockState, fluidState));
handler.renderFluid(pos, view, vertexConsumer, blockState, fluidState);
info.cancel();
}
}
@Inject(at = @At("RETURN"), method = "render")
public void tesselateReturn(BlockRenderView world, BlockPos pos, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState, CallbackInfoReturnable<Boolean> cir) {
public void tesselateReturn(BlockRenderView world, BlockPos pos, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState, CallbackInfo ci) {
fabric_renderHandler.get().clear();
}

View file

@ -32,7 +32,7 @@ public class CustomizedFluidRenderer extends SimpleFluidRenderHandler {
}
@Override
public boolean renderFluid(BlockPos pos, BlockRenderView world, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState) {
public void renderFluid(BlockPos pos, BlockRenderView world, VertexConsumer vertexConsumer, BlockState blockState, FluidState fluidState) {
int light = getLight(world, pos);
float u1 = sprites[2].getFrameU(0);
float v1 = sprites[2].getFrameV(0);
@ -66,8 +66,6 @@ public class CustomizedFluidRenderer extends SimpleFluidRenderHandler {
vertex(vertexConsumer, x2, y1, z1, 1, 1, 1, u2, v1, light);
vertex(vertexConsumer, x2, y2, z1, 1, 1, 1, u2, v2, light);
vertex(vertexConsumer, x1, y2, z2, 1, 1, 1, u1, v2, light);
return true;
}
private void vertex(VertexConsumer vertexConsumer, double x, double y, double z, float red, float green, float blue, float u, float v, int light) {

View file

@ -105,8 +105,7 @@ public class FluidVariantRenderTest implements ClientModInitializer {
bufferBuilder.vertex(model, x1, y1, z).color(r, g, b, 1).texture(u1, v1).next();
bufferBuilder.vertex(model, x1, y0, z).color(r, g, b, 1).texture(u1, v0).next();
bufferBuilder.vertex(model, x0, y0, z).color(r, g, b, 1).texture(u0, v0).next();
bufferBuilder.end();
BufferRenderer.method_43433(bufferBuilder);
BufferRenderer.drawWithShader(bufferBuilder.end());
RenderSystem.enableDepthTest();
}

View file

@ -1,23 +1,23 @@
org.gradle.jvmargs=-Xmx2560M
version=0.51.2
minecraft_version=22w16b
yarn_version=+build.3
loader_version=0.14.0
version=0.51.3
minecraft_version=22w17a
yarn_version=+build.1
loader_version=0.14.3
prerelease=true
# Do not manually update, use the bumpversions task:
fabric-api-base-version=0.4.5
fabric-api-lookup-api-v1-version=1.6.1
fabric-biome-api-v1-version=9.0.4
fabric-biome-api-v1-version=9.0.5
fabric-blockrenderlayer-v1-version=1.1.13
fabric-command-api-v1-version=1.1.12
fabric-commands-v0-version=0.2.11
fabric-command-api-v1-version=1.1.13
fabric-commands-v0-version=0.2.12
fabric-containers-v0-version=0.1.22
fabric-content-registries-v0-version=3.0.9
fabric-crash-report-info-v1-version=0.1.11
fabric-data-generation-api-v1-version=3.0.2
fabric-data-generation-api-v1-version=3.0.3
fabric-dimensions-v1-version=2.1.20
fabric-entity-events-v1-version=1.4.11
fabric-events-interaction-v0-version=0.4.22
@ -36,12 +36,12 @@ fabric-networking-api-v1-version=1.0.22
fabric-networking-v0-version=0.3.9
fabric-object-builder-api-v1-version=3.1.2
fabric-particles-v1-version=1.0.2
fabric-registry-sync-v0-version=0.9.9
fabric-registry-sync-v0-version=0.9.10
fabric-renderer-api-v1-version=1.0.2
fabric-renderer-indigo-version=0.5.1
fabric-renderer-indigo-version=0.6.0
fabric-renderer-registries-v1-version=3.2.13
fabric-rendering-data-attachment-v1-version=0.3.8
fabric-rendering-fluids-v1-version=2.0.3
fabric-rendering-fluids-v1-version=3.0.0
fabric-rendering-v0-version=1.1.15
fabric-rendering-v1-version=1.10.9
fabric-resource-conditions-api-v1-version=2.0.3
@ -49,6 +49,6 @@ fabric-resource-loader-v0-version=0.4.24
fabric-screen-api-v1-version=1.0.17
fabric-screen-handler-api-v1-version=1.2.1
fabric-textures-v0-version=1.0.13
fabric-transfer-api-v1-version=1.6.1
fabric-transfer-api-v1-version=2.0.0
fabric-transitive-access-wideners-v1-version=1.0.2
fabric-convention-tags-v1-version=1.0.2

View file

@ -16,7 +16,7 @@
"FabricMC"
],
"depends": {
"fabricloader": ">=0.14.0",
"fabricloader": ">=0.14.3",
"java": ">=17",
"minecraft": "~1.19-alpha.22.11.a"
},