Skip to content

Commit 9bd8bf7

Browse files
committed
fix block entity esp not showing when out of block entity render distance and culling
1 parent 701ad4a commit 9bd8bf7

File tree

6 files changed

+107
-31
lines changed

6 files changed

+107
-31
lines changed

src/main/java/com/lambda/mixin/render/BlockEntityRenderManagerMixin.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,23 @@
3030
import net.minecraft.client.render.state.CameraRenderState;
3131
import net.minecraft.client.util.math.MatrixStack;
3232
import net.minecraft.util.math.BlockPos;
33+
import net.minecraft.util.math.Vec3d;
3334
import org.spongepowered.asm.mixin.Mixin;
3435
import org.spongepowered.asm.mixin.injection.At;
3536

3637
@Mixin(BlockEntityRenderManager.class)
3738
public class BlockEntityRenderManagerMixin {
3839
@WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/block/entity/BlockEntityRenderer;render(Lnet/minecraft/client/render/block/entity/state/BlockEntityRenderState;Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/command/OrderedRenderCommandQueue;Lnet/minecraft/client/render/state/CameraRenderState;)V"))
39-
private <S extends BlockEntityRenderState> void wrapRenderQueue(BlockEntityRenderer<?, S> renderer, S renderState, MatrixStack matrices, OrderedRenderCommandQueue queue, CameraRenderState cameraState, Operation<Void> original) {
40+
private <S extends BlockEntityRenderState> void wrapRenderQueue(BlockEntityRenderer<?, S> renderer, S renderState,
41+
MatrixStack matrices, OrderedRenderCommandQueue queue, CameraRenderState cameraState,
42+
Operation<Void> original) {
4043
BlockPos pos = renderState.pos;
4144

42-
if (pos != null && OutlineManager.shouldCapture(pos)) {
45+
if (pos != null && OutlineManager.INSTANCE.shouldCapture(pos)) {
4346
VertexCapture.INSTANCE.beginCapture(pos);
4447

45-
OrderedRenderCommandQueueImpl wrappedQueue = new OutlineCapturingQueue((OrderedRenderCommandQueueImpl) queue, pos);
48+
boolean outlineOnly = !Vec3d.ofCenter(pos).isInRange(cameraState.pos, renderer.getRenderDistance());
49+
OrderedRenderCommandQueueImpl wrappedQueue = new OutlineCapturingQueue((OrderedRenderCommandQueueImpl) queue, pos, outlineOnly);
4650
original.call(renderer, renderState, matrices, wrappedQueue, cameraState);
4751

4852
VertexCapture.INSTANCE.endCapture();
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.lambda.mixin.render;
2+
3+
import com.lambda.graphics.outline.OutlineManager;
4+
import net.minecraft.block.entity.BlockEntity;
5+
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
6+
import net.minecraft.util.math.Vec3d;
7+
import org.spongepowered.asm.mixin.Mixin;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
11+
12+
@Mixin(BlockEntityRenderer.class)
13+
public interface BlockEntityRendererMixin<T extends BlockEntity> {
14+
15+
@Inject(method = "isInRenderDistance", at = @At("HEAD"), cancellable = true)
16+
default void forceOutlineRenderDistance(T blockEntity, Vec3d pos, CallbackInfoReturnable<Boolean> cir) {
17+
if (OutlineManager.INSTANCE.shouldCapture(blockEntity.getPos())) {
18+
cir.setReturnValue(true);
19+
}
20+
}
21+
}

src/main/java/com/lambda/mixin/render/WorldRendererMixin.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717

1818
package com.lambda.mixin.render;
1919

20+
import com.google.common.collect.Sets;
2021
import com.lambda.event.EventFlow;
2122
import com.lambda.event.events.RenderEvent;
2223
import com.lambda.graphics.RenderMain;
2324
import com.lambda.graphics.outline.OutlineManager;
2425
import com.lambda.module.modules.player.Freecam;
2526
import com.lambda.module.modules.render.CameraTweaks;
2627
import com.lambda.module.modules.render.NoRender;
28+
import net.minecraft.client.world.ClientWorld;
2729
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
2830
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
2931
import net.minecraft.client.render.*;
@@ -46,17 +48,32 @@
4648
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
4749
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
4850
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
51+
import net.minecraft.block.entity.BlockEntity;
52+
import net.minecraft.client.render.block.entity.BlockEntityRenderManager;
53+
import net.minecraft.client.render.block.entity.state.BlockEntityRenderState;
54+
import net.minecraft.util.math.BlockPos;
55+
import org.spongepowered.asm.mixin.Final;
56+
import org.spongepowered.asm.mixin.Shadow;
57+
import java.util.Set;
4958

5059
import java.util.Iterator;
5160

5261
@Mixin(WorldRenderer.class)
5362
public abstract class WorldRendererMixin {
63+
@Shadow
64+
@Final
65+
private BlockEntityRenderManager blockEntityRenderManager;
66+
@Shadow
67+
private ClientWorld world;
68+
5469
@Unique
5570
@Nullable
5671
private Entity lambda$currentEntity;
5772

5873
@Inject(method = "render", at = @At("HEAD"))
59-
private void onRender(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline, Camera camera, Matrix4f positionMatrix, Matrix4f basicProjectionMatrix, Matrix4f projectionMatrix, GpuBufferSlice fogBuffer, Vector4f fogColor, boolean renderSky, CallbackInfo ci) {
74+
private void onRender(ObjectAllocator allocator, RenderTickCounter tickCounter, boolean renderBlockOutline,
75+
Camera camera, Matrix4f positionMatrix, Matrix4f basicProjectionMatrix, Matrix4f projectionMatrix,
76+
GpuBufferSlice fogBuffer, Vector4f fogColor, boolean renderSky, CallbackInfo ci) {
6077
RenderMain.updateState(positionMatrix, basicProjectionMatrix, projectionMatrix);
6178
EventFlow.post(RenderEvent.PreRenderWorld.INSTANCE);
6279
}
@@ -77,7 +94,9 @@ private boolean renderSetupTerrainModifyArg(boolean spectator) {
7794
}
7895

7996
@Inject(method = "fillEntityRenderStates", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/EntityRenderManager;shouldRender(Lnet/minecraft/entity/Entity;Lnet/minecraft/client/render/Frustum;DDD)Z", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILHARD)
80-
private void injectFillEntityRenderStates(Camera camera, Frustum frustum, RenderTickCounter tickCounter, WorldRenderState renderStates, CallbackInfo ci, Vec3d vec3d, double d, double e, double f, TickManager tickManager, boolean bl, Iterator var14, Entity entity) {
97+
private void injectFillEntityRenderStates(Camera camera, Frustum frustum, RenderTickCounter tickCounter,
98+
WorldRenderState renderStates, CallbackInfo ci, Vec3d vec3d, double d, double e, double f,
99+
TickManager tickManager, boolean bl, Iterator var14, Entity entity) {
81100
this.lambda$currentEntity = entity;
82101
}
83102

@@ -100,4 +119,25 @@ boolean modHasBlindnessOrDarkness(boolean original) {
100119

101120
return original;
102121
}
122+
123+
@Inject(method = "fillBlockEntityRenderStates", at = @At("TAIL"))
124+
private void injectOutlineBlockEntities(Camera camera, float tickProgress, WorldRenderState renderStates, CallbackInfo ci) {
125+
if (!OutlineManager.INSTANCE.hasBlockOutlines()) return;
126+
127+
Set<BlockPos> xRayTargets = OutlineManager.INSTANCE.getXrayBlockStyles().keySet();
128+
Set<BlockPos> depthTargets = OutlineManager.INSTANCE.getDepthTestedBlockStyles().keySet();
129+
130+
for (BlockPos target : Sets.union(xRayTargets, depthTargets)) {
131+
if (!this.world.getChunkManager().isChunkLoaded(target.getX() >> 4, target.getZ() >> 4)) continue;
132+
boolean alreadyCollected = renderStates.blockEntityRenderStates.stream()
133+
.anyMatch(state -> state.pos.equals(target));
134+
if (alreadyCollected) continue;
135+
136+
BlockEntity blockEntity = this.world.getBlockEntity(target);
137+
if (blockEntity != null && !blockEntity.isRemoved()) {
138+
BlockEntityRenderState state = this.blockEntityRenderManager.getRenderState(blockEntity, tickProgress, null);
139+
if (state != null) renderStates.blockEntityRenderStates.add(state);
140+
}
141+
}
142+
}
103143
}

src/main/kotlin/com/lambda/config/groups/OutlineSettings.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class OutlineSettings(
4040

4141
val fill by c.setting("${prefix}Fill", true, "Fill the entity silhouette", visibility = visibility).group(*baseGroup).index()
4242

43-
val fillOpacitySetting by c.setting("${prefix}Fill Opacity", 40, 0..100, 1, "Opacity of the fill") { visibility() && fill }.group(*baseGroup).index()
43+
val fillOpacitySetting by c.setting("${prefix}Fill Opacity", 10, 0..100, 1, "Opacity of the fill") { visibility() && fill }.group(*baseGroup).index()
4444
val fillOpacity get() = fillOpacitySetting * 0.01f
4545

4646
fun toStyle(color: Color) = OutlineStyle(

src/main/kotlin/com/lambda/graphics/outline/OutlineCapturingQueue.kt

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,10 @@ import net.minecraft.text.Text
5353
import org.joml.Matrix4fStack
5454
import org.joml.Quaternionf
5555

56-
class OutlineCapturingQueue(
56+
class OutlineCapturingQueue @JvmOverloads constructor(
5757
private val delegate: OrderedRenderCommandQueueImpl,
58-
private val entityId: Any
58+
private val entityId: Any,
59+
private val outlineOnly: Boolean = false
5960
) : OrderedRenderCommandQueueImpl() {
6061
override fun clear() = delegate.clear()
6162
override fun onNextFrame() = delegate.onNextFrame()
@@ -102,30 +103,37 @@ class OutlineCapturingQueue(
102103
BlockModelRenderer.render(matrices.peek(), consumer, model, r, g, b, l, o)
103104
consumer.flush()
104105
}
105-
delegate.submitBlockStateModel(matrices, layer, model, r, g, b, l, o, oc)
106+
if (!outlineOnly) delegate.submitBlockStateModel(matrices, layer, model, r, g, b, l, o, oc)
106107
}
107108

108109
override fun getBatchingQueue(i: Int): BatchingRenderCommandQueue =
109-
OutlineCapturingBatchingQueue(delegate.getBatchingQueue(i), this)
110+
OutlineCapturingBatchingQueue(delegate.getBatchingQueue(i), this, outlineOnly)
110111

111112
private inner class OutlineCapturingBatchingQueue(
112113
private val batchedDelegate: BatchingRenderCommandQueue,
113-
parent: OrderedRenderCommandQueueImpl
114+
parent: OrderedRenderCommandQueueImpl,
115+
private val outlineOnly: Boolean
114116
) : BatchingRenderCommandQueue(parent) {
115-
override fun submitShadowPieces(matrices: MatrixStack, radius: Float, pieces: List<EntityRenderState.ShadowPiece>) =
116-
batchedDelegate.submitShadowPieces(matrices, radius, pieces)
117117

118-
override fun submitLabel(matrices: MatrixStack, pos: Vec3d?, y: Int, label: Text, ns: Boolean, l: Int, dist: Double, cam: CameraRenderState) =
119-
batchedDelegate.submitLabel(matrices, pos, y, label, ns, l, dist, cam)
118+
override fun submitShadowPieces(matrices: MatrixStack, radius: Float, pieces: List<EntityRenderState.ShadowPiece>) {
119+
if (!outlineOnly) batchedDelegate.submitShadowPieces(matrices, radius, pieces)
120+
}
121+
122+
override fun submitLabel(matrices: MatrixStack, pos: Vec3d?, y: Int, label: Text, ns: Boolean, l: Int, dist: Double, cam: CameraRenderState) {
123+
if (!outlineOnly) batchedDelegate.submitLabel(matrices, pos, y, label, ns, l, dist, cam)
124+
}
120125

121-
override fun submitText(matrices: MatrixStack, x: Float, y: Float, text: OrderedText, ds: Boolean, lt: TextRenderer.TextLayerType, l: Int, c: Int, bc: Int, oc: Int) =
122-
batchedDelegate.submitText(matrices, x, y, text, ds, lt, l, c, bc, oc)
126+
override fun submitText(matrices: MatrixStack, x: Float, y: Float, text: OrderedText, ds: Boolean, lt: TextRenderer.TextLayerType, l: Int, c: Int, bc: Int, oc: Int) {
127+
if (!outlineOnly) batchedDelegate.submitText(matrices, x, y, text, ds, lt, l, c, bc, oc)
128+
}
123129

124-
override fun submitFire(matrices: MatrixStack, state: EntityRenderState, rot: Quaternionf) =
125-
batchedDelegate.submitFire(matrices, state, rot)
130+
override fun submitFire(matrices: MatrixStack, state: EntityRenderState, rot: Quaternionf) {
131+
if (!outlineOnly) batchedDelegate.submitFire(matrices, state, rot)
132+
}
126133

127-
override fun submitLeash(matrices: MatrixStack, data: EntityRenderState.LeashData) =
128-
batchedDelegate.submitLeash(matrices, data)
134+
override fun submitLeash(matrices: MatrixStack, data: EntityRenderState.LeashData) {
135+
if (!outlineOnly) batchedDelegate.submitLeash(matrices, data)
136+
}
129137

130138
override fun submitCustom(matrices: MatrixStack, layer: RenderLayer, renderer: OrderedRenderCommandQueue.Custom) {
131139
if (layer.isOutline || layer.affectedOutline.isPresent) {
@@ -134,11 +142,12 @@ class OutlineCapturingQueue(
134142
renderer.render(matrices.peek(), baseConsumer)
135143
baseConsumer.flush()
136144
}
137-
batchedDelegate.submitCustom(matrices, layer, renderer)
145+
if (!outlineOnly) batchedDelegate.submitCustom(matrices, layer, renderer)
138146
}
139147

140-
override fun submitCustom(renderer: OrderedRenderCommandQueue.LayeredCustom) =
141-
batchedDelegate.submitCustom(renderer)
148+
override fun submitCustom(renderer: OrderedRenderCommandQueue.LayeredCustom) {
149+
if (!outlineOnly) batchedDelegate.submitCustom(renderer)
150+
}
142151

143152
override fun <S> submitModel(
144153
model: Model<in S>,
@@ -160,7 +169,7 @@ class OutlineCapturingQueue(
160169
model.render(matrices, consumer, light, overlay, tintedColor)
161170
baseConsumer.flush()
162171
}
163-
batchedDelegate.submitModel(model, state, matrices, renderLayer, light, overlay, tintedColor, sprite, outlineColor, crumblingOverlay)
172+
if (!outlineOnly) batchedDelegate.submitModel(model, state, matrices, renderLayer, light, overlay, tintedColor, sprite, outlineColor, crumblingOverlay)
164173
}
165174

166175
override fun submitModelPart(
@@ -183,7 +192,7 @@ class OutlineCapturingQueue(
183192
part.render(matrices, consumer, light, overlay, tintedColor)
184193
baseConsumer.flush()
185194
}
186-
batchedDelegate.submitModelPart(part, matrices, renderLayer, light, overlay, sprite, sheeted, hasGlint, tintedColor, crumblingOverlay, i)
195+
if (!outlineOnly) batchedDelegate.submitModelPart(part, matrices, renderLayer, light, overlay, sprite, sheeted, hasGlint, tintedColor, crumblingOverlay, i)
187196
}
188197

189198
override fun submitBlock(matrices: MatrixStack, state: BlockState, light: Int, overlay: Int, outlineColor: Int) {
@@ -193,7 +202,7 @@ class OutlineCapturingQueue(
193202
val consumer = CapturingConsumer(null)
194203
BlockModelRenderer.render(matrices.peek(), consumer, model, 1f, 1f, 1f, light, overlay)
195204
consumer.flush()
196-
batchedDelegate.submitBlock(matrices, state, light, overlay, outlineColor)
205+
if (!outlineOnly) batchedDelegate.submitBlock(matrices, state, light, overlay, outlineColor)
197206
}
198207

199208
override fun submitMovingBlock(matrices: MatrixStack, state: MovingBlockRenderState) {
@@ -203,11 +212,12 @@ class OutlineCapturingQueue(
203212
val consumer = CapturingConsumer(null)
204213
BlockModelRenderer.render(matrices.peek(), consumer, model, 1f, 1f, 1f, 0, 0)
205214
consumer.flush()
206-
batchedDelegate.submitMovingBlock(matrices, state)
215+
if (!outlineOnly) batchedDelegate.submitMovingBlock(matrices, state)
207216
}
208217

209-
override fun submitBlockStateModel(matrices: MatrixStack, layer: RenderLayer, model: BlockStateModel, r: Float, g: Float, b: Float, l: Int, o: Int, oc: Int) =
210-
batchedDelegate.submitBlockStateModel(matrices, layer, model, r, g, b, l, o, oc)
218+
override fun submitBlockStateModel(matrices: MatrixStack, layer: RenderLayer, model: BlockStateModel, r: Float, g: Float, b: Float, l: Int, o: Int, oc: Int) {
219+
if (!outlineOnly) batchedDelegate.submitBlockStateModel(matrices, layer, model, r, g, b, l, o, oc)
220+
}
211221

212222
override fun submitItem(
213223
matrices: MatrixStack,
@@ -242,7 +252,7 @@ class OutlineCapturingQueue(
242252
}
243253
}
244254
}
245-
batchedDelegate.submitItem(matrices, displayContext, light, overlay, outlineColors, tintLayers, quads, renderLayer, glintType)
255+
if (!outlineOnly) batchedDelegate.submitItem(matrices, displayContext, light, overlay, outlineColors, tintLayers, quads, renderLayer, glintType)
246256
}
247257

248258
override fun getShadowPiecesCommands(): List<ShadowPiecesCommand?>? = batchedDelegate.shadowPiecesCommands

src/main/resources/lambda.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"render.EntityRenderManagerMixin",
4646
"render.ItemFrameEntityRendererMixin",
4747
"render.EntityRenderStateMixin",
48+
"render.BlockEntityRendererMixin",
4849
"render.BlockEntityRenderManagerMixin",
4950
"render.FluidRendererMixin",
5051
"render.FogRendererMixin",

0 commit comments

Comments
 (0)