Skip to content

Commit e7e9fd5

Browse files
authored
renders rework (#230)
1 parent 2b4ffa5 commit e7e9fd5

File tree

202 files changed

+11407
-6458
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

202 files changed

+11407
-6458
lines changed

src/main/kotlin/com/lambda/graphics/buffer/vertex/attributes/VertexMode.kt renamed to src/main/java/com/lambda/graphics/outline/IEntityRenderState.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2025 Lambda
2+
* Copyright 2026 Lambda
33
*
44
* This program is free software: you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -15,12 +15,13 @@
1515
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1616
*/
1717

18-
package com.lambda.graphics.buffer.vertex.attributes
18+
package com.lambda.graphics.outline;
1919

20-
import org.lwjgl.opengl.GL11C.GL_LINES
21-
import org.lwjgl.opengl.GL11C.GL_TRIANGLES
20+
/**
21+
* Duck interface for EntityRenderState to store and retrieve entity ID.
22+
*/
23+
public interface IEntityRenderState {
24+
int lambda$getEntityId();
2225

23-
enum class VertexMode(val mode: Int) {
24-
Lines(GL_LINES),
25-
Triangles(GL_TRIANGLES)
26+
void lambda$setEntityId(int id);
2627
}

src/main/java/com/lambda/mixin/MinecraftClientMixin.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ void closeImGui(CallbackInfo ci) {
7474

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

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

126128
/**
127-
* Inject after the thread field is set so that {@link ThreadExecutor#getThread} is available
129+
* Inject after the thread field is set so that {@link ThreadExecutor#getThread}
130+
* is available
128131
*/
129132
@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")
130133
private void onStartup(CallbackInfo ci) {

src/main/java/com/lambda/mixin/entity/EntityMixin.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package com.lambda.mixin.entity;
1919

20+
import com.lambda.Lambda;
2021
import com.lambda.event.EventFlow;
2122
import com.lambda.event.events.EntityEvent;
2223
import com.lambda.event.events.PlayerEvent;
@@ -45,8 +46,7 @@
4546
@Mixin(Entity.class)
4647
public abstract class EntityMixin {
4748
@Shadow
48-
public void move(MovementType movementType, Vec3d movement) {
49-
}
49+
public void move(MovementType movementType, Vec3d movement) {}
5050

5151
@Shadow
5252
public abstract float getYaw();
@@ -151,11 +151,13 @@ private boolean modifyGetFlagGlowing(boolean original) {
151151

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

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

src/main/java/com/lambda/mixin/items/BarrierBlockMixin.java

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright 2026 Lambda
3+
*
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
*
9+
* This program is distributed in the hope that it will be useful,
10+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
* GNU General Public License for more details.
13+
*
14+
* You should have received a copy of the GNU General Public License
15+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16+
*/
17+
18+
package com.lambda.mixin.render;
19+
20+
import com.lambda.graphics.outline.OutlineManager;
21+
import com.lambda.graphics.outline.OutlineCapturingQueue;
22+
import com.lambda.graphics.outline.VertexCapture;
23+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
24+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
25+
import net.minecraft.client.render.block.entity.BlockEntityRenderManager;
26+
import net.minecraft.client.render.block.entity.BlockEntityRenderer;
27+
import net.minecraft.client.render.block.entity.state.BlockEntityRenderState;
28+
import net.minecraft.client.render.command.OrderedRenderCommandQueue;
29+
import net.minecraft.client.render.command.OrderedRenderCommandQueueImpl;
30+
import net.minecraft.client.render.state.CameraRenderState;
31+
import net.minecraft.client.util.math.MatrixStack;
32+
import net.minecraft.util.math.BlockPos;
33+
import org.spongepowered.asm.mixin.Mixin;
34+
import org.spongepowered.asm.mixin.injection.At;
35+
36+
@Mixin(BlockEntityRenderManager.class)
37+
public class BlockEntityRenderManagerMixin {
38+
@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+
BlockPos pos = renderState.pos;
41+
42+
if (pos != null && OutlineManager.shouldCapture(pos)) {
43+
VertexCapture.INSTANCE.beginCapture(pos);
44+
45+
OrderedRenderCommandQueueImpl wrappedQueue = new OutlineCapturingQueue((OrderedRenderCommandQueueImpl) queue, pos);
46+
original.call(renderer, renderState, matrices, wrappedQueue, cameraState);
47+
48+
VertexCapture.INSTANCE.endCapture();
49+
} else {
50+
original.call(renderer, renderState, matrices, queue, cameraState);
51+
}
52+
}
53+
}

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

Lines changed: 0 additions & 39 deletions
This file was deleted.

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

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,18 @@ public abstract class CameraMixin {
5555

5656
@Inject(method = "update", at = @At("TAIL"))
5757
private void onUpdate(World area, Entity focusedEntity, boolean thirdPerson, boolean inverseView, float tickProgress, CallbackInfo ci) {
58-
if (!Freecam.INSTANCE.isEnabled()) return;
59-
60-
Freecam.updateCam();
58+
if (Freecam.INSTANCE.isEnabled()) Freecam.updateCam();
6159
}
6260

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

9695
/**
9796
* Modifies the third person camera distance
97+
*
9898
* <pre>{@code
9999
* if (thirdPerson) {
100-
* if (inverseView) {
101-
* this.setRotation(this.yaw + 180.0F, -this.pitch);
102-
* }
100+
* if (inverseView) {
101+
* this.setRotation(this.yaw + 180.0F, -this.pitch);
102+
* }
103103
*
104-
* this.moveBy(-this.clipToSpace(4.0), 0.0, 0.0);
104+
* this.moveBy(-this.clipToSpace(4.0), 0.0, 0.0);
105105
* }
106106
* }</pre>
107107
*/
@@ -117,21 +117,35 @@ private float onDistanceUpdate(float distance) {
117117
/**
118118
* Modifies the arguments for setting the camera rotation.
119119
* Mixes into 4 arguments:
120-
* <p>Experimental Minecart Controller:</p>
120+
* <p>
121+
* Experimental Minecart Controller:
122+
* </p>
123+
*
121124
* <pre>
122125
* if (experimentalMinecartController.hasCurrentLerpSteps()) {
123-
* 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));
126+
* Vec3d vec3d = minecartEntity.getPassengerRidingPos(focusedEntity).subtract(minecartEntity.getPos())
127+
* .subtract(focusedEntity.getVehicleAttachmentPos(minecartEntity))
128+
* .add(new Vec3d(0.0, (double) MathHelper.lerp(tickProgress, this.lastCameraY, this.cameraY), 0.0));
124129
* this.setRotation(focusedEntity.getYaw(tickProgress), focusedEntity.getPitch(tickProgress));
125130
* this.setPos(experimentalMinecartController.getLerpedPosition(tickProgress).add(vec3d));
126131
* break label39;
127132
* }
128133
* </pre>
129-
* <p>Default Camera:</p>
134+
* <p>
135+
* Default Camera:
136+
* </p>
137+
*
130138
* <pre>
131139
* this.setRotation(focusedEntity.getYaw(tickProgress), focusedEntity.getPitch(tickProgress));
132-
* 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()));
140+
* this.setPos(MathHelper.lerp((double) tickProgress, focusedEntity.lastX, focusedEntity.getX()),
141+
* MathHelper.lerp((double) tickProgress, focusedEntity.lastY, focusedEntity.getY())
142+
* + (double) MathHelper.lerp(tickProgress, this.lastCameraY, this.cameraY),
143+
* MathHelper.lerp((double) tickProgress, focusedEntity.lastZ, focusedEntity.getZ()));
133144
* </pre>
134-
* <p>Third person camera:</p>
145+
* <p>
146+
* Third person camera:
147+
* </p>
148+
*
135149
* <pre>
136150
* if (thirdPerson) {
137151
* if (inverseView) {
@@ -140,9 +154,12 @@ private float onDistanceUpdate(float distance) {
140154
* // ...
141155
* }
142156
* </pre>
143-
* <p>When the player is focused on another Living Entity:</p>
157+
* <p>
158+
* When the player is focused on another Living Entity:
159+
* </p>
160+
*
144161
* <pre>
145-
* Direction direction = ((LivingEntity)focusedEntity).getSleepingDirection();
162+
* Direction direction = ((LivingEntity) focusedEntity).getSleepingDirection();
146163
* this.setRotation(direction != null ? direction.getPositiveHorizontalDegrees() - 180.0F : 0.0F, 0.0F);
147164
* this.moveBy(0.0F, 0.3F, 0.0F);
148165
* </pre>

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

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,6 @@
2929

3030
@Mixin(ChatHud.class)
3131
public class ChatHudMixin {
32-
/**
33-
* Draws emojis at the given chat position
34-
* <pre>{@code
35-
* context.getMatrices().translate(0.0F, 0.0F, 50.0F);
36-
* context.drawTextWithShadow(this.client.textRenderer, visible.content(), 0, y, 16777215 + (u << 24));
37-
* context.getMatrices().pop();
38-
* }</pre>
39-
*/
40-
// @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"))
41-
// int wrapRenderCall(DrawContext instance, TextRenderer textRenderer, OrderedText text, int x, int y, int color, Operation<Integer> original) {
42-
// return original.call(instance, textRenderer, LambdaMoji.INSTANCE.parse(text, x, y, color), 0, y, 16777215 + (color << 24));
43-
// }
44-
4532
@WrapMethod(method = "addMessage(Lnet/minecraft/text/Text;Lnet/minecraft/network/message/MessageSignatureData;Lnet/minecraft/client/gui/hud/MessageIndicator;)V")
4633
void wrapAddMessage(Text message, MessageSignatureData signatureData, MessageIndicator indicator, Operation<Void> original) {
4734
var event = new ChatEvent.Receive(message, signatureData, indicator);

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@
3333
import org.spongepowered.asm.mixin.Mixin;
3434
import org.spongepowered.asm.mixin.injection.At;
3535

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

49-
var entry = playerState.playerName != null ? networkHandler.getPlayerListEntry(playerState.playerName.getString()) : null;
46+
var entry = playerState.playerName != null
47+
? networkHandler.getPlayerListEntry(playerState.playerName.getString())
48+
: null;
5049
if (entry == null) return original;
5150

5251
var profile = entry.getProfile();

0 commit comments

Comments
 (0)