Skip to content

Commit

Permalink
Add test for WorldRenderEvents.AFTER_TRANSLUCENT
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinthegreat1 committed Feb 2, 2024
1 parent 5ba91ea commit 41a9c38
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ public interface WorldRenderContext {
*/
WorldRenderer worldRenderer();

/**
* The matrix stack is only not null in {@link WorldRenderEvents#AFTER_ENTITIES} or later events.
*/
@Nullable
MatrixStack matrixStack();

float tickDelta();

long limitTime();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.VertexConsumerProvider;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.Entity;
import net.minecraft.util.math.BlockPos;
Expand All @@ -36,6 +37,7 @@

public final class WorldRenderContextImpl implements WorldRenderContext.BlockOutlineContext, WorldRenderContext {
private WorldRenderer worldRenderer;
private MatrixStack matrixStack;
private float tickDelta;
private long limitTime;
private boolean blockOutlines;
Expand Down Expand Up @@ -93,6 +95,10 @@ public void setFrustum(Frustum frustum) {
this.frustum = frustum;
}

public void setMatrixStack(MatrixStack matrixStack) {
this.matrixStack = matrixStack;
}

public void prepareBlockOutline(
Entity entity,
double cameraX,
Expand All @@ -114,6 +120,11 @@ public WorldRenderer worldRenderer() {
return worldRenderer;
}

@Override
public MatrixStack matrixStack() {
return matrixStack;
}

@Override
public float tickDelta() {
return tickDelta;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package net.fabricmc.fabric.mixin.client.rendering;

import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import org.joml.Matrix4f;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
Expand Down Expand Up @@ -84,6 +85,12 @@ private void afterTerrainSolid(CallbackInfo ci) {
WorldRenderEvents.BEFORE_ENTITIES.invoker().beforeEntities(context);
}

@ModifyExpressionValue(method = "render", at = @At(value = "NEW", target = "net/minecraft/client/util/math/MatrixStack"))
private MatrixStack setMatrixStack(MatrixStack matrixStack) {
context.setMatrixStack(matrixStack);
return matrixStack;
}

@Inject(method = "render", at = @At(value = "CONSTANT", args = "stringValue=blockentities", ordinal = 0))
private void afterEntities(CallbackInfo ci) {
WorldRenderEvents.AFTER_ENTITIES.invoker().afterEntities(context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,17 @@

package net.fabricmc.fabric.test.rendering.client;

import com.mojang.blaze3d.systems.RenderSystem;

import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.render.BufferBuilder;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.render.OverlayTexture;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexFormat;
import net.minecraft.client.render.VertexFormats;
import net.minecraft.client.render.WorldRenderer;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d;
Expand Down Expand Up @@ -50,9 +58,36 @@ private static boolean onBlockOutline(WorldRenderContext wrc, WorldRenderContext
return true;
}

// Renders a diamond block above diamond blocks when they are looked at.
/**
* Renders a translucent box at (0, 100, 0).
*/
private static void renderAfterTranslucent(WorldRenderContext context) {
MatrixStack matrices = context.matrixStack();
Vec3d camera = context.camera().getPos();
Tessellator tessellator = RenderSystem.renderThreadTesselator();
BufferBuilder buffer = tessellator.getBuffer();

matrices.push();
matrices.translate((float) -camera.x, (float) -camera.y, (float) -camera.z);

RenderSystem.setShader(GameRenderer::getPositionColorProgram);
RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();

buffer.begin(VertexFormat.DrawMode.TRIANGLE_STRIP, VertexFormats.POSITION_COLOR);
WorldRenderer.renderFilledBox(matrices, buffer, 0, 100, 0, 1, 101, 1, 0, 1, 0, 0.5f);
tessellator.draw();

matrices.pop();
RenderSystem.disableBlend();
}

@Override
public void onInitializeClient() {
// Renders a diamond block above diamond blocks when they are looked at.
WorldRenderEvents.BLOCK_OUTLINE.register(WorldRenderEventsTests::onBlockOutline);
// Renders a translucent box at (0, 100, 0)
WorldRenderEvents.AFTER_TRANSLUCENT.register(WorldRenderEventsTests::renderAfterTranslucent);
}
}

0 comments on commit 41a9c38

Please sign in to comment.