Skip to content

Commit f0c7a17

Browse files
committed
Fix Shader ESP and Chams
1 parent 6cd7b5b commit f0c7a17

11 files changed

Lines changed: 315 additions & 68 deletions

src/main/java/meteordevelopment/meteorclient/mixin/EntityMixin.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import meteordevelopment.meteorclient.systems.modules.world.HighwayBuilder;
2424
import meteordevelopment.meteorclient.utils.Utils;
2525
import meteordevelopment.meteorclient.utils.entity.fakeplayer.FakePlayerEntity;
26-
import meteordevelopment.meteorclient.utils.render.color.Color;
27-
import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders;
2826
import net.minecraft.block.Block;
2927
import net.minecraft.block.Blocks;
3028
import net.minecraft.client.render.Camera;
@@ -141,14 +139,6 @@ else if ((Object) this instanceof LivingEntity) {
141139
}
142140
}
143141

144-
@Inject(method = "getTeamColorValue", at = @At("HEAD"), cancellable = true)
145-
private void onGetTeamColorValue(CallbackInfoReturnable<Integer> info) {
146-
if (PostProcessShaders.rendering) {
147-
Color color = Modules.get().get(ESP.class).getColor((Entity) (Object) this);
148-
if (color != null) info.setReturnValue(color.getPacked());
149-
}
150-
}
151-
152142
@ModifyExpressionValue(method = "getVelocityMultiplier", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/BlockState;getBlock()Lnet/minecraft/block/Block;"))
153143
private Block modifyVelocityMultiplierBlock(Block original) {
154144
if ((Object) this != mc.player) return original;

src/main/java/meteordevelopment/meteorclient/mixin/EntityRendererMixin.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import meteordevelopment.meteorclient.systems.modules.render.NoRender;
1515
import meteordevelopment.meteorclient.utils.entity.EntityUtils;
1616
import meteordevelopment.meteorclient.utils.render.color.Color;
17-
import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders;
1817
import net.minecraft.client.render.Frustum;
1918
import net.minecraft.client.render.entity.EntityRenderer;
2019
import net.minecraft.client.render.entity.state.EntityRenderState;
@@ -38,7 +37,6 @@ public abstract class EntityRendererMixin<T extends Entity, S extends EntityRend
3837

3938
@Inject(method = "getDisplayName", at = @At("HEAD"), cancellable = true)
4039
private void onRenderLabel(T entity, CallbackInfoReturnable<Text> cir) {
41-
if (PostProcessShaders.rendering) cir.setReturnValue(null);
4240
if (Modules.get().get(NoRender.class).noNametags()) cir.setReturnValue(null);
4341
if (!(entity instanceof PlayerEntity player)) return;
4442
if (Modules.get().get(Nametags.class).playerNametags() && !(EntityUtils.getGameMode(player) == null && Modules.get().get(Nametags.class).excludeBots()))
@@ -78,11 +76,6 @@ private void onGetOutlineColor(T entity, S state, float tickProgress, CallbackIn
7876

7977
@Inject(method = "updateShadow(Lnet/minecraft/entity/Entity;Lnet/minecraft/client/render/entity/state/EntityRenderState;)V", at = @At("HEAD"), cancellable = true)
8078
private void updateShadow(Entity entity, EntityRenderState renderState, CallbackInfo ci) {
81-
if (PostProcessShaders.rendering) {
82-
ci.cancel();
83-
return;
84-
}
85-
8679
if (Modules.get().get(NoRender.class).noDeadEntities() &&
8780
entity instanceof LivingEntity &&
8881
renderState instanceof LivingEntityRenderState livingEntityRenderState &&
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
3+
* Copyright (c) Meteor Development.
4+
*/
5+
6+
package meteordevelopment.meteorclient.mixin;
7+
8+
import net.minecraft.client.render.VertexConsumerProvider;
9+
import net.minecraft.client.render.command.BatchingRenderCommandQueue;
10+
import net.minecraft.client.render.command.ShadowPiecesCommandRenderer;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
15+
16+
@Mixin(ShadowPiecesCommandRenderer.class)
17+
public abstract class ShadowPiecesCommandRendererMixin {
18+
@Inject(method = "render", at = @At("HEAD"), cancellable = true)
19+
private void meteor$onRender(BatchingRenderCommandQueue queue, VertexConsumerProvider.Immediate vertexConsumers, CallbackInfo info) {
20+
if (queue.getShadowPiecesCommands().isEmpty()) {
21+
info.cancel();
22+
}
23+
}
24+
}

src/main/java/meteordevelopment/meteorclient/mixin/WorldRendererMixin.java

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,33 @@
99
import com.mojang.blaze3d.buffers.GpuBufferSlice;
1010
import it.unimi.dsi.fastutil.Stack;
1111
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
12+
import meteordevelopment.meteorclient.mixininterface.IEntityRenderState;
1213
import meteordevelopment.meteorclient.mixininterface.IWorldRenderer;
1314
import meteordevelopment.meteorclient.systems.modules.Modules;
1415
import meteordevelopment.meteorclient.systems.modules.render.BlockSelection;
16+
import meteordevelopment.meteorclient.systems.modules.render.ESP;
1517
import meteordevelopment.meteorclient.systems.modules.render.Freecam;
1618
import meteordevelopment.meteorclient.systems.modules.render.NoRender;
19+
import meteordevelopment.meteorclient.utils.OutlineRenderCommandQueue;
20+
import meteordevelopment.meteorclient.utils.render.NoopImmediateVertexConsumerProvider;
21+
import meteordevelopment.meteorclient.utils.render.NoopOutlineVertexConsumerProvider;
22+
import meteordevelopment.meteorclient.utils.render.WrapperImmediateVertexConsumerProvider;
23+
import meteordevelopment.meteorclient.utils.render.color.Color;
24+
import meteordevelopment.meteorclient.utils.render.postprocess.EntityShader;
1725
import meteordevelopment.meteorclient.utils.render.postprocess.PostProcessShaders;
1826
import net.minecraft.client.gl.Framebuffer;
1927
import net.minecraft.client.render.*;
28+
import net.minecraft.client.render.command.OrderedRenderCommandQueue;
29+
import net.minecraft.client.render.command.RenderDispatcher;
30+
import net.minecraft.client.render.entity.EntityRenderManager;
2031
import net.minecraft.client.render.state.OutlineRenderState;
2132
import net.minecraft.client.render.state.WeatherRenderState;
2233
import net.minecraft.client.render.state.WorldBorderRenderState;
34+
import net.minecraft.client.render.state.WorldRenderState;
2335
import net.minecraft.client.util.Handle;
2436
import net.minecraft.client.util.ObjectAllocator;
2537
import net.minecraft.client.util.math.MatrixStack;
38+
import net.minecraft.entity.Entity;
2639
import net.minecraft.util.math.Vec3d;
2740
import org.joml.Matrix4f;
2841
import org.joml.Vector4f;
@@ -36,6 +49,10 @@
3649
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
3750
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
3851

52+
import java.util.function.Function;
53+
54+
import static meteordevelopment.meteorclient.MeteorClient.mc;
55+
3956
@Mixin(WorldRenderer.class)
4057
public abstract class WorldRendererMixin implements IWorldRenderer {
4158
@Inject(method = "checkEmpty", at = @At("HEAD"), cancellable = true)
@@ -87,31 +104,68 @@ private void onRenderHead(ObjectAllocator allocator,
87104
PostProcessShaders.beginRender();
88105
}
89106

90-
/*
91-
todo Entity rendering is batched in pushEntityRenders before they are all rendered at once by calling
92-
net.minecraft.client.render.entity.command.EntityRenderDispatcher.render
93-
Our renders need to be rewritten
107+
@Unique
108+
private final OutlineRenderCommandQueue outlineRenderCommandQueue = new OutlineRenderCommandQueue();
109+
110+
@Unique
111+
private VertexConsumerProvider provider;
94112

95-
@Inject(method = "renderEntity", at = @At("HEAD"))
96-
private void renderEntity(Entity entity, double cameraX, double cameraY, double cameraZ, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, CallbackInfo info) {
97-
draw(entity, cameraX, cameraY, cameraZ, tickDelta, vertexConsumers, matrices, PostProcessShaders.CHAMS, Color.WHITE);
98-
draw(entity, cameraX, cameraY, cameraZ, tickDelta, vertexConsumers, matrices, PostProcessShaders.ENTITY_OUTLINE, Modules.get().get(ESP.class).getColor(entity));
113+
@Unique
114+
private RenderDispatcher renderDispatcher;
115+
116+
@Inject(method = "pushEntityRenders", at = @At("TAIL"))
117+
private void onPushEntityRenders(MatrixStack matrices, WorldRenderState worldState, OrderedRenderCommandQueue queue, CallbackInfo info) {
118+
if (renderDispatcher == null) {
119+
renderDispatcher = new RenderDispatcher(
120+
outlineRenderCommandQueue,
121+
mc.getBlockRenderManager(),
122+
new WrapperImmediateVertexConsumerProvider(() -> provider),
123+
mc.getAtlasManager(),
124+
NoopOutlineVertexConsumerProvider.INSTANCE,
125+
NoopImmediateVertexConsumerProvider.INSTANCE,
126+
mc.textRenderer
127+
);
128+
}
129+
130+
draw(worldState, matrices, PostProcessShaders.CHAMS, entity -> Color.WHITE);
131+
draw(worldState, matrices, PostProcessShaders.ENTITY_OUTLINE, entity -> Modules.get().get(ESP.class).getColor(entity));
99132
}
100133

101134
@Unique
102-
private void draw(Entity entity, double cameraX, double cameraY, double cameraZ, float tickDelta, VertexConsumerProvider vertexConsumers, MatrixStack matrices, EntityShader shader, Color color) {
103-
if (shader.shouldDraw(entity) && !PostProcessShaders.isCustom(vertexConsumers) && color != null) {
104-
meteor$pushEntityOutlineFramebuffer(shader.framebuffer);
105-
PostProcessShaders.rendering = true;
135+
private void draw(WorldRenderState worldState, MatrixStack matrices, EntityShader shader, Function<Entity, Color> colorGetter) {
136+
var camera = worldState.cameraRenderState.pos;
137+
var empty = true;
138+
139+
for (var state : worldState.entityRenderStates) {
140+
if (!shader.shouldDraw(((IEntityRenderState) state).meteor$getEntity())) continue;
106141

107-
shader.vertexConsumerProvider.setColor(color.getPacked());
108-
renderEntity(entity, cameraX, cameraY, cameraZ, tickDelta, matrices, shader.vertexConsumerProvider);
142+
var color = colorGetter.apply(((IEntityRenderState) state).meteor$getEntity());
143+
if (color == null) continue;
144+
outlineRenderCommandQueue.setColor(color);
109145

110-
PostProcessShaders.rendering = false;
111-
meteor$popEntityOutlineFramebuffer();
146+
var renderer = entityRenderManager.getRenderer(state);
147+
var offset = renderer.getPositionOffset(state);
148+
149+
matrices.push();
150+
matrices.translate(state.x - camera.x + offset.x, state.y - camera.y + offset.y, state.z - camera.z + offset.z);
151+
renderer.render(state, matrices, outlineRenderCommandQueue, worldState.cameraRenderState);
152+
matrices.pop();
153+
154+
empty = false;
112155
}
156+
157+
if (empty)
158+
return;
159+
160+
meteor$pushEntityOutlineFramebuffer(shader.framebuffer);
161+
provider = shader.vertexConsumerProvider;
162+
163+
renderDispatcher.render();
164+
outlineRenderCommandQueue.onNextFrame();
165+
166+
provider = null;
167+
meteor$popEntityOutlineFramebuffer();
113168
}
114-
*/
115169

116170
@Inject(method = "method_62214", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/OutlineVertexConsumerProvider;draw()V"))
117171
private void onRender(CallbackInfo ci) {
@@ -132,6 +186,9 @@ private void onResized(int width, int height, CallbackInfo info) {
132186
@Final
133187
private DefaultFramebufferSet framebufferSet;
134188

189+
@Shadow
190+
@Final
191+
private EntityRenderManager entityRenderManager;
135192
@Unique
136193
private Stack<Framebuffer> framebufferStack;
137194

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/*
2+
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
3+
* Copyright (c) Meteor Development.
4+
*/
5+
6+
package meteordevelopment.meteorclient.utils;
7+
8+
import meteordevelopment.meteorclient.utils.render.color.Color;
9+
import net.minecraft.block.BlockState;
10+
import net.minecraft.client.font.TextRenderer;
11+
import net.minecraft.client.model.Model;
12+
import net.minecraft.client.model.ModelPart;
13+
import net.minecraft.client.render.RenderLayer;
14+
import net.minecraft.client.render.block.MovingBlockRenderState;
15+
import net.minecraft.client.render.command.ModelCommandRenderer;
16+
import net.minecraft.client.render.command.OrderedRenderCommandQueueImpl;
17+
import net.minecraft.client.render.entity.state.EntityHitboxAndView;
18+
import net.minecraft.client.render.entity.state.EntityRenderState;
19+
import net.minecraft.client.render.item.ItemRenderState;
20+
import net.minecraft.client.render.model.BakedQuad;
21+
import net.minecraft.client.render.model.BlockStateModel;
22+
import net.minecraft.client.render.state.CameraRenderState;
23+
import net.minecraft.client.texture.Sprite;
24+
import net.minecraft.client.util.math.MatrixStack;
25+
import net.minecraft.item.ItemDisplayContext;
26+
import net.minecraft.text.OrderedText;
27+
import net.minecraft.text.Text;
28+
import net.minecraft.util.math.Vec3d;
29+
import org.jetbrains.annotations.Nullable;
30+
import org.joml.Quaternionf;
31+
32+
import java.util.List;
33+
34+
public class OutlineRenderCommandQueue extends OrderedRenderCommandQueueImpl {
35+
private int color;
36+
37+
public void setColor(Color color) {
38+
this.color = color.getPacked();
39+
}
40+
41+
// OrderedRenderCommandQueueImpl
42+
43+
@Override
44+
public void submitDebugHitbox(MatrixStack matrices, EntityRenderState renderState, EntityHitboxAndView debugHitbox) {
45+
}
46+
47+
@Override
48+
public void submitShadowPieces(MatrixStack matrices, float shadowRadius, List<EntityRenderState.ShadowPiece> shadowPieces) {
49+
}
50+
51+
@Override
52+
public void submitLabel(MatrixStack matrices, @Nullable Vec3d nameLabelPos, int y, Text label, boolean notSneaking, int light, double squaredDistanceToCamera, CameraRenderState cameraState) {
53+
}
54+
55+
@Override
56+
public void submitText(MatrixStack matrices, float x, float y, OrderedText text, boolean dropShadow, TextRenderer.TextLayerType layerType, int light, int color, int backgroundColor, int outlineColor) {
57+
}
58+
59+
@Override
60+
public void submitFire(MatrixStack matrices, EntityRenderState renderState, Quaternionf rotation) {
61+
}
62+
63+
@Override
64+
public void submitLeash(MatrixStack matrices, EntityRenderState.LeashData leashData) {
65+
}
66+
67+
@Override
68+
public <S> void submitModel(Model<? super S> model, S state, MatrixStack matrices, RenderLayer renderLayer, int light, int overlay, int tintedColor, @Nullable Sprite sprite, int outlineColor, @Nullable ModelCommandRenderer.CrumblingOverlayCommand crumblingOverlay) {
69+
super.submitModel(model, state, matrices, renderLayer, light, overlay, color, sprite, 0, crumblingOverlay);
70+
}
71+
72+
@Override
73+
public void submitModelPart(ModelPart part, MatrixStack matrices, RenderLayer renderLayer, int light, int overlay, @Nullable Sprite sprite, boolean sheeted, boolean hasGlint, int tintedColor, ModelCommandRenderer.CrumblingOverlayCommand crumblingOverlay, int i) {
74+
super.submitModelPart(part, matrices, renderLayer, light, overlay, sprite, sheeted, hasGlint, color, crumblingOverlay, i);
75+
}
76+
77+
@Override
78+
public void submitBlock(MatrixStack matrices, BlockState state, int light, int overlay, int outlineColor) {
79+
}
80+
81+
@Override
82+
public void submitMovingBlock(MatrixStack matrices, MovingBlockRenderState state) {
83+
}
84+
85+
@Override
86+
public void submitBlockStateModel(MatrixStack matrices, RenderLayer renderLayer, BlockStateModel model, float r, float g, float b, int light, int overlay, int outlineColor) {
87+
r = Color.toRGBAR(color) / 255f;
88+
g = Color.toRGBAG(color) / 255f;
89+
b = Color.toRGBAB(color) / 255f;
90+
91+
super.submitBlockStateModel(matrices, renderLayer, model, r, g, b, light, overlay, 0);
92+
}
93+
94+
@Override
95+
public void submitItem(MatrixStack matrices, ItemDisplayContext displayContext, int light, int overlay, int outlineColors, int[] tintLayers, List<BakedQuad> quads, RenderLayer renderLayer, ItemRenderState.Glint glintType) {
96+
}
97+
98+
@Override
99+
public void submitCustom(MatrixStack matrices, RenderLayer renderLayer, Custom customRenderer) {
100+
}
101+
102+
@Override
103+
public void submitCustom(LayeredCustom customRenderer) {
104+
}
105+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* This file is part of the Meteor Client distribution (https://github.com/MeteorDevelopment/meteor-client).
3+
* Copyright (c) Meteor Development.
4+
*/
5+
6+
package meteordevelopment.meteorclient.utils.render;
7+
8+
import net.minecraft.client.render.RenderLayer;
9+
import net.minecraft.client.render.VertexConsumer;
10+
import net.minecraft.client.render.VertexConsumerProvider;
11+
import net.minecraft.client.util.BufferAllocator;
12+
13+
public class CustomOutlineVertexConsumerProvider implements VertexConsumerProvider {
14+
private final VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(new BufferAllocator(1536));
15+
16+
@Override
17+
public VertexConsumer getBuffer(RenderLayer layer) {
18+
if (layer.isOutline()) {
19+
return new CustomVertexConsumer(this.immediate.getBuffer(layer));
20+
}
21+
22+
var optional = layer.getAffectedOutline();
23+
if (optional.isPresent()) {
24+
return new CustomVertexConsumer(this.immediate.getBuffer(optional.get()));
25+
}
26+
27+
throw new IllegalStateException("Can't render an outline for this rendertype!");
28+
}
29+
30+
public void draw() {
31+
immediate.draw();
32+
}
33+
34+
private record CustomVertexConsumer(VertexConsumer consumer) implements VertexConsumer {
35+
@Override
36+
public VertexConsumer vertex(float x, float y, float z) {
37+
consumer.vertex(x, y, z);
38+
return this;
39+
}
40+
41+
@Override
42+
public VertexConsumer color(int red, int green, int blue, int alpha) {
43+
consumer.color(red, green, blue, alpha);
44+
return this;
45+
}
46+
47+
@Override
48+
public VertexConsumer texture(float u, float v) {
49+
consumer.texture(u, v);
50+
return this;
51+
}
52+
53+
@Override
54+
public VertexConsumer overlay(int u, int v) {
55+
return this;
56+
}
57+
58+
@Override
59+
public VertexConsumer light(int u, int v) {
60+
return this;
61+
}
62+
63+
@Override
64+
public VertexConsumer normal(float x, float y, float z) {
65+
return this;
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)