Skip to content

Commit

Permalink
Add javadoc for CacheableBERenderingPipeline
Browse files Browse the repository at this point in the history
  • Loading branch information
ZhuRuoLing committed Jan 1, 2025
1 parent a3e8536 commit b499eff
Show file tree
Hide file tree
Showing 9 changed files with 214 additions and 156 deletions.
2 changes: 1 addition & 1 deletion patches/net/minecraft/client/Minecraft.java.patch
Original file line number Diff line number Diff line change
Expand Up @@ -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_);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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_);
Expand Down
14 changes: 13 additions & 1 deletion src/main/java/net/neoforged/neoforge/client/ClientHooks.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
Expand All @@ -39,32 +41,27 @@ 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() {
return !bufferBuilders.isEmpty() && bufferBuilders.values().stream().noneMatch(it -> it.vertices > 0);
}

@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<RenderType, VertexBuffer> vertexBufferGetter,
Function<RenderType, ByteBufferBuilder> byteBufferSupplier,
Consumer<Runnable> runner
) {
Function<RenderType, VertexBuffer> vertexBufferGetter,
Function<RenderType, ByteBufferBuilder> byteBufferSupplier,
Consumer<Runnable> runner) {
for (RenderType renderType : bufferBuilders.keySet()) {
runner.accept(() -> {
BufferBuilder bufferBuilder = bufferBuilders.get(renderType);
Expand All @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -45,26 +49,42 @@ 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();
}
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);
Expand All @@ -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;
Expand All @@ -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;
}
Expand Down
Loading

0 comments on commit b499eff

Please sign in to comment.