diff --git a/patches/net/minecraft/client/Minecraft.java.patch b/patches/net/minecraft/client/Minecraft.java.patch index 2a2d363e4a..012ee51c40 100644 --- a/patches/net/minecraft/client/Minecraft.java.patch +++ b/patches/net/minecraft/client/Minecraft.java.patch @@ -356,7 +356,7 @@ } private void updateLevelInEngines(@Nullable ClientLevel p_91325_) { -+ net.neoforged.neoforge.client.cached.CacheableBERenderingPipeline.updateLevel(p_91325_); ++ net.neoforged.neoforge.client.ClientHooks.onUpdateLevel(p_91325_); this.levelRenderer.setLevel(p_91325_); this.particleEngine.setLevel(p_91325_); this.blockEntityRenderDispatcher.setLevel(p_91325_); diff --git a/patches/net/minecraft/client/renderer/LevelRenderer.java.patch b/patches/net/minecraft/client/renderer/LevelRenderer.java.patch index 4ece15fcfd..ac0fc32d1c 100644 --- a/patches/net/minecraft/client/renderer/LevelRenderer.java.patch +++ b/patches/net/minecraft/client/renderer/LevelRenderer.java.patch @@ -43,10 +43,10 @@ profilerfiller.popPush("terrain_setup"); this.setupRender(p_109604_, frustum, flag, this.minecraft.player.isSpectator()); profilerfiller.popPush("compile_sections"); -+ net.neoforged.neoforge.client.cached.CacheableBERenderingPipeline.getInstance().runTasks(); ++ net.neoforged.neoforge.client.ClientHooks.onCompileSectionsPre(); this.compileSections(p_109604_); profilerfiller.popPush("terrain"); -+ net.neoforged.neoforge.client.cached.CacheableBERenderingPipeline.getInstance().render(p_254120_, p_323920_); ++ net.neoforged.neoforge.client.ClientHooks.onRenderTerrainPre(p_254120_, p_323920_); this.renderSectionLayer(RenderType.solid(), d0, d1, d2, p_254120_, p_323920_); + this.minecraft.getModelManager().getAtlas(TextureAtlas.LOCATION_BLOCKS).setBlurMipmap(false, this.minecraft.options.mipmapLevels().get() > 0); // Neo: fix flickering leaves when mods mess up the blurMipmap settings this.renderSectionLayer(RenderType.cutoutMipped(), d0, d1, d2, p_254120_, p_323920_); diff --git a/src/main/java/net/neoforged/neoforge/client/ClientHooks.java b/src/main/java/net/neoforged/neoforge/client/ClientHooks.java index 0b088a25f5..a933b940e7 100644 --- a/src/main/java/net/neoforged/neoforge/client/ClientHooks.java +++ b/src/main/java/net/neoforged/neoforge/client/ClientHooks.java @@ -137,7 +137,7 @@ import net.neoforged.fml.ModLoader; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.asm.enumextension.ExtensionInfo; -import net.neoforged.neoforge.client.cached.CacheableBERenderingPipeline; +import net.neoforged.neoforge.client.block.CacheableBERenderingPipeline; import net.neoforged.neoforge.client.entity.animation.json.AnimationTypeManager; import net.neoforged.neoforge.client.event.AddSectionGeometryEvent; import net.neoforged.neoforge.client.event.CalculateDetachedCameraDistanceEvent; @@ -796,6 +796,18 @@ public static void onBlockEntityRemoved(BlockEntity blockEntity) { CacheableBERenderingPipeline.getInstance().blockRemoved(blockEntity); } + public static void onRenderTranslucentPre(Matrix4f frustumMatrix, Matrix4f projectionMatrix) { + CacheableBERenderingPipeline.getInstance().render(frustumMatrix, projectionMatrix); + } + + public static void onCompileSectionsPre() { + CacheableBERenderingPipeline.getInstance().runTasks(); + } + + public static void onUpdateLevel(ClientLevel level) { + CacheableBERenderingPipeline.updateLevel(level); + } + public static Font getTooltipFont(ItemStack stack, Font fallbackFont) { Font stackFont = IClientItemExtensions.of(stack).getFont(stack, IClientItemExtensions.FontContext.TOOLTIP); return stackFont == null ? fallbackFont : stackFont; diff --git a/src/main/java/net/neoforged/neoforge/client/FullyBufferedBufferSource.java b/src/main/java/net/neoforged/neoforge/client/FullyBufferedBufferSource.java index e44f9fa040..76319f02a9 100644 --- a/src/main/java/net/neoforged/neoforge/client/FullyBufferedBufferSource.java +++ b/src/main/java/net/neoforged/neoforge/client/FullyBufferedBufferSource.java @@ -1,3 +1,8 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + package net.neoforged.neoforge.client; import com.mojang.blaze3d.systems.RenderSystem; @@ -6,19 +11,16 @@ import com.mojang.blaze3d.vertex.MeshData; import com.mojang.blaze3d.vertex.VertexBuffer; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.datafixers.types.Func; import it.unimi.dsi.fastutil.objects.Reference2IntMap; import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import org.lwjgl.system.MemoryUtil; - -import javax.annotation.ParametersAreNonnullByDefault; import java.util.HashMap; import java.util.Map; import java.util.function.Consumer; import java.util.function.Function; +import javax.annotation.ParametersAreNonnullByDefault; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -39,9 +41,8 @@ private ByteBufferBuilder getByteBuffer(RenderType renderType) { @Override public VertexConsumer getBuffer(RenderType renderType) { return bufferBuilders.computeIfAbsent( - renderType, - it -> new BufferBuilder(getByteBuffer(it), it.mode, it.format) - ); + renderType, + it -> new BufferBuilder(getByteBuffer(it), it.mode, it.format)); } public boolean isEmpty() { @@ -49,22 +50,18 @@ public boolean isEmpty() { } @Override - public void endBatch(RenderType renderType) { - } + public void endBatch(RenderType renderType) {} @Override - public void endLastBatch() { - } + public void endLastBatch() {} @Override - public void endBatch() { - } + public void endBatch() {} public void upload( - Function vertexBufferGetter, - Function byteBufferSupplier, - Consumer runner - ) { + Function vertexBufferGetter, + Function byteBufferSupplier, + Consumer runner) { for (RenderType renderType : bufferBuilders.keySet()) { runner.accept(() -> { BufferBuilder bufferBuilder = bufferBuilders.get(renderType); @@ -76,13 +73,11 @@ public void upload( if (mesh != null) { if (renderType.sortOnUpload) { MeshData.SortState sortState = mesh.sortQuads( - byteBufferSupplier.apply(renderType), - RenderSystem.getVertexSorting() - ); + byteBufferSupplier.apply(renderType), + RenderSystem.getVertexSorting()); meshSorts.put( - renderType, - sortState - ); + renderType, + sortState); } VertexBuffer vertexBuffer = vertexBufferGetter.apply(renderType); vertexBuffer.bind(); diff --git a/src/main/java/net/neoforged/neoforge/client/cached/CacheableBERenderingPipeline.java b/src/main/java/net/neoforged/neoforge/client/block/CacheableBERenderingPipeline.java similarity index 68% rename from src/main/java/net/neoforged/neoforge/client/cached/CacheableBERenderingPipeline.java rename to src/main/java/net/neoforged/neoforge/client/block/CacheableBERenderingPipeline.java index 69e3202525..c1bf064da9 100644 --- a/src/main/java/net/neoforged/neoforge/client/cached/CacheableBERenderingPipeline.java +++ b/src/main/java/net/neoforged/neoforge/client/block/CacheableBERenderingPipeline.java @@ -1,5 +1,14 @@ -package net.neoforged.neoforge.client.cached; +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ +package net.neoforged.neoforge.client.block; + +import java.util.ArrayDeque; +import java.util.HashMap; +import java.util.Map; +import java.util.Queue; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -9,11 +18,6 @@ import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; -import java.util.ArrayDeque; -import java.util.HashMap; -import java.util.Map; -import java.util.Queue; - public class CacheableBERenderingPipeline { @Nullable private static CacheableBERenderingPipeline instance; @@ -45,6 +49,11 @@ public void runTasks() { } } + /** + * Updates the rendering pipeline instance with a new level context. + * + * @param level The new ClientLevel instance that the rendering pipeline should be updated to use. + */ public static void updateLevel(ClientLevel level) { if (instance != null) { instance.releaseBuffers(); @@ -52,19 +61,30 @@ public static void updateLevel(ClientLevel level) { instance = new CacheableBERenderingPipeline(level); } + /** + * Notifies the pipeline that a {@link BlockEntity} has been removed. + * This method will be automatically called when a {@link BlockEntity} has been removed. + * + * @param be The removed {@link BlockEntity} + */ public void blockRemoved(BlockEntity be) { IBlockEntityRendererExtension renderer = Minecraft.getInstance() - .getBlockEntityRenderDispatcher() - .getRenderer(be); + .getBlockEntityRenderDispatcher() + .getRenderer(be); if (renderer == null) return; ChunkPos chunkPos = new ChunkPos(be.getBlockPos()); getRenderRegion(chunkPos).blockRemoved(be); } + /** + * Notifies the pipeline that a {@link BlockEntity} has been updated and the cache should be rebuilt. + * + * @param be The updated {@link BlockEntity} + */ public void update(BlockEntity be) { BlockEntityRenderer renderer = Minecraft.getInstance() - .getBlockEntityRenderDispatcher() - .getRenderer(be); + .getBlockEntityRenderDispatcher() + .getRenderer(be); if (renderer == null) return; ChunkPos chunkPos = new ChunkPos(be.getBlockPos()); getRenderRegion(chunkPos).update(be); @@ -78,6 +98,9 @@ public void submitCompileTask(Runnable task) { pendingCompiles.add(task); } + /** + * Releases all buffers in use and mark current pipeline instance as invalid. + */ public void releaseBuffers() { regions.values().forEach(CachedRegion::releaseBuffers); valid = false; @@ -87,6 +110,13 @@ public void render(Matrix4f frustumMatrix, Matrix4f projectionMatrix) { regions.values().forEach(it -> it.render(frustumMatrix, projectionMatrix)); } + /** + * Retrieves the current instance of the CacheableBERenderingPipeline. + * + * @return The current instance of the CacheableBERenderingPipeline, + * or null if there has no {@link ClientLevel} in current {@link Minecraft} client. + */ + @Nullable public static CacheableBERenderingPipeline getInstance() { return instance; } diff --git a/src/main/java/net/neoforged/neoforge/client/cached/CachedRegion.java b/src/main/java/net/neoforged/neoforge/client/block/CachedRegion.java similarity index 75% rename from src/main/java/net/neoforged/neoforge/client/cached/CachedRegion.java rename to src/main/java/net/neoforged/neoforge/client/block/CachedRegion.java index 6c5acc730f..0ad3382d34 100644 --- a/src/main/java/net/neoforged/neoforge/client/cached/CachedRegion.java +++ b/src/main/java/net/neoforged/neoforge/client/block/CachedRegion.java @@ -1,4 +1,9 @@ -package net.neoforged.neoforge.client.cached; +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + +package net.neoforged.neoforge.client.block; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.shaders.Uniform; @@ -11,6 +16,14 @@ import com.mojang.blaze3d.vertex.VertexSorting; import it.unimi.dsi.fastutil.objects.Reference2IntMap; import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; @@ -27,13 +40,6 @@ import org.jetbrains.annotations.Nullable; import org.joml.Matrix4f; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - public class CachedRegion { private final ChunkPos chunkPos; private Map buffers = new HashMap<>(); @@ -53,6 +59,13 @@ public CachedRegion(ChunkPos chunkPos, CacheableBERenderingPipeline pipeline) { this.pipeline = pipeline; } + /** + * Updates the block entities collection and triggers a rebuild of the region. + *

+ * + * @see CacheableBERenderingPipeline#update(BlockEntity) + * @param be The block entity to update. + */ public void update(BlockEntity be) { if (lastRebuildTask != null) { lastRebuildTask.cancel(); @@ -67,6 +80,16 @@ public void update(BlockEntity be) { pipeline.submitCompileTask(new RebuildTask()); } + /** + * Handles the removal of a block entity from the system and initiates a cache rebuild. + *

+ * When a block entity is removed, this method is called to update the internal state of the system. + * It cancels any ongoing rebuild tasks, removes the specified block entity from the collection, + * cleans up any other removed block entities, and then submits a new rebuild task to the pipeline. + * + * @see CacheableBERenderingPipeline#blockRemoved(BlockEntity) + * @param be The block entity that has been removed. + */ public void blockRemoved(BlockEntity be) { if (lastRebuildTask != null) { lastRebuildTask.cancel(); @@ -99,10 +122,9 @@ private ByteBufferBuilder requestSortBuffer(RenderType renderType) { } private void renderInternal( - Matrix4f frustumMatrix, - Matrix4f projectionMatrix, - Collection renderTypes - ) { + Matrix4f frustumMatrix, + Matrix4f projectionMatrix, + Collection renderTypes) { if (isEmpty) return; RenderSystem.enableBlend(); Window window = Minecraft.getInstance().getWindow(); @@ -111,7 +133,9 @@ private void renderInternal( if (cameraPosition.distanceTo(new Vec3(chunkPos.x * 16, cameraPosition.y, chunkPos.z * 16)) > renderDistance) { return; } - for (RenderType renderType : renderTypes) { + List renderingOrders = new ArrayList<>(renderTypes); + renderingOrders.sort(Comparator.comparingInt(a -> (a.sortOnUpload ? 1 : 0))); + for (RenderType renderType : renderingOrders) { VertexBuffer vb = buffers.get(renderType); if (vb == null) continue; renderLayer(renderType, vb, frustumMatrix, projectionMatrix, cameraPosition, window); @@ -124,13 +148,12 @@ public void releaseBuffers() { } private void renderLayer( - RenderType renderType, - VertexBuffer vertexBuffer, - Matrix4f frustumMatrix, - Matrix4f projectionMatrix, - Vec3 cameraPosition, - Window window - ) { + RenderType renderType, + VertexBuffer vertexBuffer, + Matrix4f frustumMatrix, + Matrix4f projectionMatrix, + Vec3 cameraPosition, + Window window) { int indexCount = indexCountMap.getInt(renderType); if (indexCount <= 0) return; renderType.setupRenderState(); @@ -139,19 +162,17 @@ private void renderLayer( Uniform uniform = shader.CHUNK_OFFSET; if (uniform != null) { uniform.set( - (float) -cameraPosition.x, - (float) -cameraPosition.y, - (float) -cameraPosition.z - ); + (float) -cameraPosition.x, + (float) -cameraPosition.y, + (float) -cameraPosition.z); } vertexBuffer.bind(); if (renderType.sortOnUpload) { MeshData.SortState sortState = this.meshSortings.get(renderType); if (sortState != null) { ByteBufferBuilder.Result result = sortState.buildSortedIndexBuffer( - this.requestSortBuffer(renderType), - VertexSorting.byDistance(cameraPosition.toVector3f()) - ); + this.requestSortBuffer(renderType), + VertexSorting.byDistance(cameraPosition.toVector3f())); if (result != null) { vertexBuffer.uploadIndexBuffer(result); } @@ -181,8 +202,8 @@ public void run() { return; } BlockEntityRenderer renderer = Minecraft.getInstance() - .getBlockEntityRenderDispatcher() - .getRenderer(be); + .getBlockEntityRenderDispatcher() + .getRenderer(be); if (renderer == null) continue; Level level = be.getLevel(); int packedLight; @@ -194,26 +215,23 @@ public void run() { poseStack.pushPose(); BlockPos pos = be.getBlockPos(); poseStack.translate( - pos.getX(), - pos.getY(), - pos.getZ() - ); + pos.getX(), + pos.getY(), + pos.getZ()); renderer.renderCached( - be, - poseStack, - bufferSource, - partialTick, - packedLight, - OverlayTexture.NO_OVERLAY - ); + be, + poseStack, + bufferSource, + partialTick, + packedLight, + OverlayTexture.NO_OVERLAY); poseStack.popPose(); } CachedRegion.this.isEmpty = bufferSource.isEmpty(); bufferSource.upload( - CachedRegion.this::getBuffer, - CachedRegion.this::requestSortBuffer, - pipeline::submitUploadTask - ); + CachedRegion.this::getBuffer, + CachedRegion.this::requestSortBuffer, + pipeline::submitUploadTask); CachedRegion.this.meshSortings = bufferSource.getMeshSorts(); CachedRegion.this.indexCountMap = bufferSource.getIndexCountMap(); @@ -224,6 +242,4 @@ void cancel() { cancelled = true; } } - - } diff --git a/src/main/java/net/neoforged/neoforge/client/cached/package-info.java b/src/main/java/net/neoforged/neoforge/client/block/package-info.java similarity index 87% rename from src/main/java/net/neoforged/neoforge/client/cached/package-info.java rename to src/main/java/net/neoforged/neoforge/client/block/package-info.java index c27f3e1baa..6589ff44eb 100644 --- a/src/main/java/net/neoforged/neoforge/client/cached/package-info.java +++ b/src/main/java/net/neoforged/neoforge/client/block/package-info.java @@ -6,9 +6,8 @@ @FieldsAreNonnullByDefault @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -package net.neoforged.neoforge.client.cached; +package net.neoforged.neoforge.client.block; +import javax.annotation.ParametersAreNonnullByDefault; import net.minecraft.FieldsAreNonnullByDefault; import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/net/neoforged/neoforge/client/extensions/IBlockEntityRendererExtension.java b/src/main/java/net/neoforged/neoforge/client/extensions/IBlockEntityRendererExtension.java index bb2def6c7d..92daa6071c 100644 --- a/src/main/java/net/neoforged/neoforge/client/extensions/IBlockEntityRendererExtension.java +++ b/src/main/java/net/neoforged/neoforge/client/extensions/IBlockEntityRendererExtension.java @@ -24,12 +24,10 @@ default AABB getRenderBoundingBox(T blockEntity) { } default void renderCached( - T blockEntity, - PoseStack poseStack, - MultiBufferSource.BufferSource bufferSource, - float partialTick, - int packedLight, - int packedOverlay - ) { - } + T blockEntity, + PoseStack poseStack, + MultiBufferSource.BufferSource bufferSource, + float partialTick, + int packedLight, + int packedOverlay) {} } diff --git a/tests/src/main/java/net/neoforged/neoforge/debug/client/CachedBERTests.java b/tests/src/main/java/net/neoforged/neoforge/debug/client/CachedBERTests.java index e3d5e57272..8dcb4489f8 100644 --- a/tests/src/main/java/net/neoforged/neoforge/debug/client/CachedBERTests.java +++ b/tests/src/main/java/net/neoforged/neoforge/debug/client/CachedBERTests.java @@ -1,7 +1,13 @@ +/* + * Copyright (c) NeoForged and contributors + * SPDX-License-Identifier: LGPL-2.1-only + */ + package net.neoforged.neoforge.debug.client; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.serialization.MapCodec; +import java.util.function.Supplier; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -20,6 +26,7 @@ import net.minecraft.world.level.block.BaseEntityBlock; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -29,7 +36,7 @@ import net.minecraft.world.phys.BlockHitResult; import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; -import net.neoforged.neoforge.client.cached.CacheableBERenderingPipeline; +import net.neoforged.neoforge.client.block.CacheableBERenderingPipeline; import net.neoforged.neoforge.client.model.data.ModelData; import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredRegister; @@ -38,32 +45,25 @@ import net.neoforged.testframework.annotation.TestHolder; import org.jetbrains.annotations.Nullable; -import java.util.function.Supplier; - -@ForEachTest(side = Dist.CLIENT, groups = {"client.event", "event"}) +@ForEachTest(side = Dist.CLIENT, groups = { "client.event", "event" }) public class CachedBERTests { public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.Blocks.createBlocks("neotests_cached_ber"); - public static final DeferredRegister> BLOCK_ENTITY_TYPES = - DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, "neotests_cached_ber"); + public static final DeferredRegister> BLOCK_ENTITY_TYPES = DeferredRegister.create(Registries.BLOCK_ENTITY_TYPE, "neotests_cached_ber"); public static final DeferredBlock THE_BLOCK = BLOCKS.register( - "not_enough_vertexes", - () -> new TheBlock( - BlockBehaviour.Properties.of() - .noCollission() - .noOcclusion() - .lightLevel(state -> 15) - ) - ); + "not_enough_vertexes", + () -> new TheBlock( + BlockBehaviour.Properties.of() + .noCollission() + .noOcclusion() + .lightLevel(state -> 15))); public static final Supplier> THE_BE = BLOCK_ENTITY_TYPES.register( - "not_enough_vertexes", - () -> BlockEntityType.Builder.of( - TheBlockEntity::new, - THE_BLOCK.get() - ) - .build(null) - ); + "not_enough_vertexes", + () -> BlockEntityType.Builder.of( + TheBlockEntity::new, + THE_BLOCK.get()) + .build(null)); @TestHolder(description = "Register a block with cached BER which adds lots of vertexes") static void registerBlock(final DynamicTest test) { @@ -77,7 +77,6 @@ static private void clientSetup(final FMLClientSetupEvent event) { } public static class TheBlock extends BaseEntityBlock { - protected TheBlock(Properties p_49224_) { super(p_49224_); registerDefaultState(getStateDefinition().any().setValue(BlockStateProperties.ENABLED, false)); @@ -91,9 +90,8 @@ protected void createBlockStateDefinition(StateDefinition.Builder codec() { return Block.simpleCodec(TheBlock::new); @@ -119,54 +122,60 @@ protected MapCodec codec() { } public static class TheBlockEntity extends BlockEntity { - public TheBlockEntity(BlockPos p_155229_, BlockState p_155230_) { super(THE_BE.get(), p_155229_, p_155230_); } } public static class TheRenderer implements BlockEntityRenderer { - - public TheRenderer(BlockEntityRendererProvider.Context ctx) { - - } + public TheRenderer(BlockEntityRendererProvider.Context ctx) {} @Override public void render( - TheBlockEntity blockEntity, - float partialTick, - PoseStack poseStack, - MultiBufferSource bufferSource, - int packedLight, - int packedOverlay - ) { + TheBlockEntity blockEntity, + float partialTick, + PoseStack poseStack, + MultiBufferSource bufferSource, + int packedLight, + int packedOverlay) { Level level = blockEntity.getLevel(); BlockPos pos = blockEntity.getBlockPos(); if (level == null) return; BlockState blockState = level.getBlockState(pos); if (!blockState.is(THE_BLOCK.get())) return; if (blockState.getValue(BlockStateProperties.ENABLED)) return; - renderManyTorches(poseStack, bufferSource, packedLight, packedOverlay); - if (bufferSource instanceof MultiBufferSource.BufferSource buffer) { - buffer.endLastBatch(); - } + renderManyBlocks(poseStack, bufferSource, packedLight, packedOverlay); } - private void renderManyTorches(PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) { + private void renderManyBlocks(PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) { BlockRenderDispatcher dispatcher = Minecraft.getInstance().getBlockRenderer(); for (int dx = 0; dx < 32; dx++) { for (int dz = 0; dz < 32; dz++) { poseStack.pushPose(); - poseStack.translate(dx * 0.25, 1, dz * 0.25); + poseStack.translate(dx, 2, dz); + dispatcher.renderSingleBlock( + Blocks.TORCH.defaultBlockState(), + poseStack, + bufferSource, + packedLight, + packedOverlay, + ModelData.EMPTY, + RenderType.cutout()); + poseStack.popPose(); + } + } + for (int dx = 0; dx < 32; dx++) { + for (int dz = 0; dz < 32; dz++) { + poseStack.pushPose(); + poseStack.translate(dx, 1, dz); dispatcher.renderSingleBlock( - Blocks.TORCH.defaultBlockState(), - poseStack, - bufferSource, - packedLight, - packedOverlay, - ModelData.EMPTY, - RenderType.cutout() - ); + Blocks.BLACK_STAINED_GLASS.defaultBlockState(), + poseStack, + bufferSource, + packedLight, + packedOverlay, + ModelData.EMPTY, + RenderType.translucent()); poseStack.popPose(); } } @@ -174,20 +183,19 @@ private void renderManyTorches(PoseStack poseStack, MultiBufferSource bufferSour @Override public void renderCached( - TheBlockEntity blockEntity, - PoseStack poseStack, - MultiBufferSource.BufferSource bufferSource, - float partialTick, - int packedLight, - int packedOverlay - ) { + TheBlockEntity blockEntity, + PoseStack poseStack, + MultiBufferSource.BufferSource bufferSource, + float partialTick, + int packedLight, + int packedOverlay) { Level level = blockEntity.getLevel(); BlockPos pos = blockEntity.getBlockPos(); if (level == null) return; BlockState blockState = level.getBlockState(pos); if (!blockState.is(THE_BLOCK.get())) return; if (!blockState.getValue(BlockStateProperties.ENABLED)) return; - renderManyTorches(poseStack, bufferSource, packedLight, packedOverlay); + renderManyBlocks(poseStack, bufferSource, packedLight, packedOverlay); } } }