Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
3e266b0
depth test / block outline start / immediate region esp where you upd…
beanbag44 Jan 12, 2026
5622e6e
Merge branch '1.21.11' into improvement/renders
beanbag44 Jan 12, 2026
ad88469
fix static and dynamic render events
beanbag44 Jan 12, 2026
0aec9f4
remove shape caching
beanbag44 Jan 13, 2026
1efc938
initial working standard and sdf text world rendering
beanbag44 Jan 15, 2026
05e3c61
remove per render region origin
beanbag44 Jan 15, 2026
9edbe8f
move font rendering into RenderBuilder and fix dashed lines.
beanbag44 Jan 17, 2026
88ef317
Merge branch '1.21.11' into improvement/renders
beanbag44 Jan 17, 2026
f4980a9
cleanup
beanbag44 Jan 17, 2026
1c16e88
screen rendering
beanbag44 Jan 18, 2026
811efe0
render dash animation through end caps and fix antialiasing on dash ends
beanbag44 Jan 18, 2026
8d8a49e
fix glow rendering under outline and store a map of text style to tex…
beanbag44 Jan 18, 2026
8f82a34
improved line anti-aliasing
beanbag44 Jan 19, 2026
0e9eff8
fix zoom not affecting tracers
beanbag44 Jan 19, 2026
f0bbefd
have tracers go off-screen when a target is behind the camera
beanbag44 Jan 20, 2026
900a5e2
tracer improvements
beanbag44 Jan 20, 2026
a6e6a6f
item screen rendering
beanbag44 Jan 20, 2026
69038ea
vertex attribute based text sdf info
beanbag44 Jan 20, 2026
7aee494
Merge branch '1.21.11' into improvement/renders
beanbag44 Jan 20, 2026
0bf9d34
custom depth buffer layer indexing for the performance of batched ren…
beanbag44 Jan 21, 2026
30af1c2
world line rendering improvements
beanbag44 Jan 21, 2026
fbb6c52
more tracer improvements
beanbag44 Jan 21, 2026
ea9aefc
nametags
beanbag44 Jan 22, 2026
8708ad3
nametags improvements
beanbag44 Jan 23, 2026
d3653b0
fix world lines not rotating to face the camera
beanbag44 Jan 23, 2026
f329011
Merge branch '1.21.11' into improvement/renders
beanbag44 Jan 24, 2026
e3ce66a
Merge branch '1.21.11' into improvement/renders
beanbag44 Jan 27, 2026
7ee3e58
merge bug
beanbag44 Jan 27, 2026
63f3765
Merge remote-tracking branch 'NeoLambda/improvement/renders' into imp…
beanbag44 Jan 28, 2026
f762d5f
threaded font atlas generation
beanbag44 Jan 28, 2026
f05599c
image rendering
beanbag44 Jan 31, 2026
954f7ef
text and line setting groups
beanbag44 Feb 1, 2026
6ab6944
gui item rendering
beanbag44 Feb 4, 2026
51cef3e
cleanup
beanbag44 Feb 4, 2026
07c5d7e
fix floating point imprecision for world gui items
beanbag44 Feb 4, 2026
9fdfefe
nametag improvements
beanbag44 Feb 5, 2026
d06cb17
more cleanup
beanbag44 Feb 6, 2026
4f3004a
fixed depth
beanbag44 Feb 6, 2026
03602ea
imports
beanbag44 Feb 6, 2026
851a951
get block colour from the blocks texture
beanbag44 Feb 6, 2026
8b6b601
line improvements
beanbag44 Feb 6, 2026
8178487
search improvements
beanbag44 Feb 7, 2026
d112dfb
outline renders
beanbag44 Feb 10, 2026
a909565
more outline stuff
beanbag44 Feb 13, 2026
90cf9cc
Merge branch '1.21.11' into improvement/renders
beanbag44 Feb 14, 2026
c912956
fix incorrect mixin params
beanbag44 Feb 14, 2026
9b59853
cleanup
beanbag44 Feb 14, 2026
c4a8a2e
more cleanup
beanbag44 Feb 15, 2026
b8333b0
big big cleanup
beanbag44 Feb 15, 2026
01d1b23
nametags background
beanbag44 Feb 16, 2026
ab8a8fe
esp and entity selection improvements
beanbag44 Feb 17, 2026
44f4907
missed new file
beanbag44 Feb 17, 2026
85cc9e3
outline improvements
beanbag44 Feb 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2025 Lambda
* Copyright 2026 Lambda
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
Expand All @@ -15,12 +15,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package com.lambda.graphics.buffer.vertex.attributes
package com.lambda.graphics.outline;

import org.lwjgl.opengl.GL11C.GL_LINES
import org.lwjgl.opengl.GL11C.GL_TRIANGLES
/**
* Duck interface for EntityRenderState to store and retrieve entity ID.
*/
public interface IEntityRenderState {
int lambda$getEntityId();

enum class VertexMode(val mode: Int) {
Lines(GL_LINES),
Triangles(GL_TRIANGLES)
void lambda$setEntityId(int id);
}
38 changes: 38 additions & 0 deletions src/main/java/com/lambda/graphics/outline/IWorldRenderer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* Copyright 2026 Lambda
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

package com.lambda.graphics.outline;

import net.minecraft.client.gl.Framebuffer;

/**
* Mixin interface for WorldRenderer to support custom framebuffer swapping.
* Used by the outline rendering system to redirect entity rendering to custom
* framebuffers.
*/
public interface IWorldRenderer {
/**
* Push the current entity outline framebuffer onto a stack and replace it with
* the given framebuffer.
*/
void lambda$pushEntityOutlineFramebuffer(Framebuffer framebuffer);

/**
* Pop the previous entity outline framebuffer from the stack and restore it.
*/
void lambda$popEntityOutlineFramebuffer();
}
23 changes: 16 additions & 7 deletions src/main/java/com/lambda/mixin/MinecraftClientMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ void closeImGui(CallbackInfo ci) {

@WrapMethod(method = "render")
void onLoopTick(boolean tick, Operation<Void> original) {
com.lambda.graphics.RenderMain.preRender();
EventFlow.post(TickEvent.Render.Pre.INSTANCE);
original.call(tick);
EventFlow.post(TickEvent.Render.Post.INSTANCE);
Expand Down Expand Up @@ -120,11 +121,13 @@ void onSound(SoundManager instance, boolean paused, Operation<Void> original) {

@Inject(at = @At(value = "INVOKE", target = "Lorg/slf4j/Logger;info(Ljava/lang/String;)V", shift = At.Shift.AFTER, remap = false), method = "stop")
private void onShutdown(CallbackInfo ci) {
com.lambda.graphics.outline.OutlineRenderer.INSTANCE.cleanup();
EventFlow.post(new ClientEvent.Shutdown());
}

/**
* Inject after the thread field is set so that {@link ThreadExecutor#getThread} is available
* Inject after the thread field is set so that {@link ThreadExecutor#getThread}
* is available
*/
@Inject(at = @At(value = "FIELD", target = "Lnet/minecraft/client/MinecraftClient;thread:Ljava/lang/Thread;", shift = At.Shift.AFTER, ordinal = 0, opcode = Opcodes.PUTFIELD), method = "run")
private void onStartup(CallbackInfo ci) {
Expand All @@ -133,15 +136,17 @@ private void onStartup(CallbackInfo ci) {

@Inject(method = "setScreen", at = @At("HEAD"))
private void onScreenOpen(@Nullable Screen screen, CallbackInfo ci) {
if (screen == null) return;
if (screen == null)
return;
if (screen instanceof ScreenHandlerProvider<?> handledScreen) {
EventFlow.post(new InventoryEvent.Open(handledScreen.getScreenHandler()));
}
}

@Inject(method = "setScreen", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/Screen;removed()V", shift = At.Shift.AFTER))
private void onScreenRemove(@Nullable Screen screen, CallbackInfo ci) {
if (currentScreen == null) return;
if (currentScreen == null)
return;
if (currentScreen instanceof ScreenHandlerProvider<?> handledScreen) {
EventFlow.post(new InventoryEvent.Close(handledScreen.getScreenHandler()));
}
Expand All @@ -162,19 +167,22 @@ private void redirectUnPressAll(Operation<Void> original) {

@WrapWithCondition(method = "doAttack()Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;swingHand(Lnet/minecraft/util/Hand;)V"))
private boolean redirectHandSwing(ClientPlayerEntity instance, Hand hand) {
if (this.crosshairTarget == null) return false;
if (this.crosshairTarget == null)
return false;
return this.crosshairTarget.getType() != HitResult.Type.BLOCK || PacketMine.INSTANCE.isDisabled();
}

@ModifyExpressionValue(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerInteractionManager;isBreakingBlock()Z"))
boolean redirectMultiActon(boolean original) {
if (Interact.INSTANCE.isEnabled() && Interact.getMultiAction()) return false;
if (Interact.INSTANCE.isEnabled() && Interact.getMultiAction())
return false;
return original;
}

@Inject(method = "doItemUse", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;isRiding()Z"))
void injectFastPlace(CallbackInfo ci) {
if (!Interact.INSTANCE.isEnabled()) return;
if (!Interact.INSTANCE.isEnabled())
return;

itemUseCooldown = Interact.getPlaceDelay();
}
Expand Down Expand Up @@ -203,7 +211,8 @@ float getTargetMillisPerTick(float millis, Operation<Float> original) {

@Inject(method = "updateWindowTitle", at = @At("HEAD"), cancellable = true)
void updateWindowTitle(CallbackInfo ci) {
if (!ClickGuiLayout.getSetLambdaWindowTitle()) return;
if (!ClickGuiLayout.getSetLambdaWindowTitle())
return;
WindowUtils.setLambdaTitle();
ci.cancel();
}
Expand Down
3 changes: 3 additions & 0 deletions src/main/java/com/lambda/mixin/entity/EntityMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package com.lambda.mixin.entity;

import com.lambda.Lambda;
import com.lambda.event.EventFlow;
import com.lambda.event.events.EntityEvent;
import com.lambda.event.events.PlayerEvent;
Expand Down Expand Up @@ -151,11 +152,13 @@ private boolean modifyGetFlagGlowing(boolean original) {

@WrapWithCondition(method = "changeLookDirection", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;setYaw(F)V"))
private boolean wrapSetYaw(Entity instance, float yaw) {
if ((Object) this != getMc().player) return true;
return RotationManager.getLockYaw() == null;
}

@WrapWithCondition(method = "changeLookDirection", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;setPitch(F)V"))
private boolean wrapSetPitch(Entity instance, float yaw) {
if ((Object) this != Lambda.getMc().player) return true;
return RotationManager.getLockPitch() == null;
}

Expand Down
42 changes: 0 additions & 42 deletions src/main/java/com/lambda/mixin/items/BarrierBlockMixin.java

This file was deleted.

39 changes: 0 additions & 39 deletions src/main/java/com/lambda/mixin/render/BlockRenderManagerMixin.java

This file was deleted.

53 changes: 35 additions & 18 deletions src/main/java/com/lambda/mixin/render/CameraMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,19 +55,18 @@ public abstract class CameraMixin {

@Inject(method = "update", at = @At("TAIL"))
private void onUpdate(World area, Entity focusedEntity, boolean thirdPerson, boolean inverseView, float tickProgress, CallbackInfo ci) {
if (!Freecam.INSTANCE.isEnabled()) return;

Freecam.updateCam();
if (Freecam.INSTANCE.isEnabled()) Freecam.updateCam();
}

/**
* Sets the lock rotation to the active rotation
*
* <pre>{@code
* this.setPos(
* MathHelper.lerp((double)tickDelta, focusedEntity.prevX, focusedEntity.getX()),
* MathHelper.lerp((double)tickDelta, focusedEntity.prevY, focusedEntity.getY()) + (double)MathHelper.lerp(tickDelta, this.lastCameraY, this.cameraY),
* MathHelper.lerp((double)tickDelta, focusedEntity.prevZ, focusedEntity.getZ())
* );
* MathHelper.lerp((double) tickDelta, focusedEntity.prevX, focusedEntity.getX()),
* MathHelper.lerp((double) tickDelta, focusedEntity.prevY, focusedEntity.getY())
* + (double) MathHelper.lerp(tickDelta, this.lastCameraY, this.cameraY),
* MathHelper.lerp((double) tickDelta, focusedEntity.prevZ, focusedEntity.getZ()));
* }</pre>
*/
@Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;setPos(DDD)V", shift = At.Shift.AFTER))
Expand Down Expand Up @@ -95,13 +94,14 @@ private void onClipToSpace(float distance, CallbackInfoReturnable<Float> cir) {

/**
* Modifies the third person camera distance
*
* <pre>{@code
* if (thirdPerson) {
* if (inverseView) {
* this.setRotation(this.yaw + 180.0F, -this.pitch);
* }
* if (inverseView) {
* this.setRotation(this.yaw + 180.0F, -this.pitch);
* }
*
* this.moveBy(-this.clipToSpace(4.0), 0.0, 0.0);
* this.moveBy(-this.clipToSpace(4.0), 0.0, 0.0);
* }
* }</pre>
*/
Expand All @@ -117,21 +117,35 @@ private float onDistanceUpdate(float distance) {
/**
* Modifies the arguments for setting the camera rotation.
* Mixes into 4 arguments:
* <p>Experimental Minecart Controller:</p>
* <p>
* Experimental Minecart Controller:
* </p>
*
* <pre>
* if (experimentalMinecartController.hasCurrentLerpSteps()) {
* Vec3d vec3d = minecartEntity.getPassengerRidingPos(focusedEntity).subtract(minecartEntity.getPos()).subtract(focusedEntity.getVehicleAttachmentPos(minecartEntity)).add(new Vec3d(0.0, (double)MathHelper.lerp(tickProgress, this.lastCameraY, this.cameraY), 0.0));
* Vec3d vec3d = minecartEntity.getPassengerRidingPos(focusedEntity).subtract(minecartEntity.getPos())
* .subtract(focusedEntity.getVehicleAttachmentPos(minecartEntity))
* .add(new Vec3d(0.0, (double) MathHelper.lerp(tickProgress, this.lastCameraY, this.cameraY), 0.0));
* this.setRotation(focusedEntity.getYaw(tickProgress), focusedEntity.getPitch(tickProgress));
* this.setPos(experimentalMinecartController.getLerpedPosition(tickProgress).add(vec3d));
* break label39;
* }
* </pre>
* <p>Default Camera:</p>
* <p>
* Default Camera:
* </p>
*
* <pre>
* this.setRotation(focusedEntity.getYaw(tickProgress), focusedEntity.getPitch(tickProgress));
* this.setPos(MathHelper.lerp((double)tickProgress, focusedEntity.lastX, focusedEntity.getX()), MathHelper.lerp((double)tickProgress, focusedEntity.lastY, focusedEntity.getY()) + (double)MathHelper.lerp(tickProgress, this.lastCameraY, this.cameraY), MathHelper.lerp((double)tickProgress, focusedEntity.lastZ, focusedEntity.getZ()));
* this.setPos(MathHelper.lerp((double) tickProgress, focusedEntity.lastX, focusedEntity.getX()),
* MathHelper.lerp((double) tickProgress, focusedEntity.lastY, focusedEntity.getY())
* + (double) MathHelper.lerp(tickProgress, this.lastCameraY, this.cameraY),
* MathHelper.lerp((double) tickProgress, focusedEntity.lastZ, focusedEntity.getZ()));
* </pre>
* <p>Third person camera:</p>
* <p>
* Third person camera:
* </p>
*
* <pre>
* if (thirdPerson) {
* if (inverseView) {
Expand All @@ -140,9 +154,12 @@ private float onDistanceUpdate(float distance) {
* // ...
* }
* </pre>
* <p>When the player is focused on another Living Entity:</p>
* <p>
* When the player is focused on another Living Entity:
* </p>
*
* <pre>
* Direction direction = ((LivingEntity)focusedEntity).getSleepingDirection();
* Direction direction = ((LivingEntity) focusedEntity).getSleepingDirection();
* this.setRotation(direction != null ? direction.getPositiveHorizontalDegrees() - 180.0F : 0.0F, 0.0F);
* this.moveBy(0.0F, 0.3F, 0.0F);
* </pre>
Expand Down
12 changes: 0 additions & 12 deletions src/main/java/com/lambda/mixin/render/ChatHudMixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,6 @@

@Mixin(ChatHud.class)
public class ChatHudMixin {
/**
* Draws emojis at the given chat position
* <pre>{@code
* context.getMatrices().translate(0.0F, 0.0F, 50.0F);
* context.drawTextWithShadow(this.client.textRenderer, visible.content(), 0, y, 16777215 + (u << 24));
* context.getMatrices().pop();
* }</pre>
*/
// @WrapOperation(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawTextWithShadow(Lnet/minecraft/client/font/TextRenderer;Lnet/minecraft/text/OrderedText;III)I"))
// int wrapRenderCall(DrawContext instance, TextRenderer textRenderer, OrderedText text, int x, int y, int color, Operation<Integer> original) {
// return original.call(instance, textRenderer, LambdaMoji.INSTANCE.parse(text, x, y, color), 0, y, 16777215 + (color << 24));
// }

@WrapMethod(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V")
void wrapAddMessage(Text message, MessageSignatureData signatureData, MessageIndicator indicator, Operation<Void> original) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,6 @@
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;

/**
* Mixin to override elytra textures with Lambda capes and disable elytra rendering.
*/
@Mixin(ElytraFeatureRenderer.class)
public class ElytraFeatureRendererMixin {
@ModifyReturnValue(method = "getTexture", at = @At("RETURN"))
Expand All @@ -46,7 +43,9 @@ private static Identifier injectElytra(Identifier original, BipedEntityRenderSta
var networkHandler = Lambda.getMc().getNetworkHandler();
if (networkHandler == null) return original;

var entry = playerState.playerName != null ? networkHandler.getPlayerListEntry(playerState.playerName.getString()) : null;
var entry = playerState.playerName != null
? networkHandler.getPlayerListEntry(playerState.playerName.getString())
: null;
if (entry == null) return original;

var profile = entry.getProfile();
Expand Down
Loading