From da79782893cd9e27af77a037901601f93e9589d6 Mon Sep 17 00:00:00 2001 From: alpha Date: Thu, 22 Feb 2024 17:38:56 -0600 Subject: [PATCH] Add render sky event --- .../rendering/v1/WorldRenderEvents.java | 27 +++++++++++++++++++ .../client/rendering/WorldRendererMixin.java | 7 +++++ .../client/WorldRenderEventsTests.java | 9 +++++++ 3 files changed, 43 insertions(+) diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/WorldRenderEvents.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/WorldRenderEvents.java index 4bf58fc12f..c42382f59d 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/WorldRenderEvents.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/api/client/rendering/v1/WorldRenderEvents.java @@ -223,6 +223,28 @@ private WorldRenderEvents() { } } }); + /** + * Called when rendering the world's skybox. + * This happens right before terrain setup. + * + *

Use this for rendering custom sky boxes in existing dimensions, + * such as rendering more stars above a current y value. + * + *

Returning false will cancel rendering the skybox. This has no + * effect on other subscribers to this event - all subscribers will always be called. + */ + public static final Event RENDER_SKY = EventFactory.createArrayBacked(RenderSky.class, (context, fogCallback) -> true, callbacks -> (context, fogCallback) -> { + boolean shouldRender = true; + + for (final RenderSky callback : callbacks) { + if (!callback.renderSky(context, fogCallback)) { + shouldRender = false; + } + } + + return shouldRender; + }); + /** * Called after all framebuffer writes are complete but before all world * rendering is torn down. @@ -302,6 +324,11 @@ public interface AfterTranslucent { void afterTranslucent(WorldRenderContext context); } + @FunctionalInterface + public interface RenderSky { + boolean renderSky(WorldRenderContext context, Runnable fogCallback); + } + @FunctionalInterface public interface Last { void onLast(WorldRenderContext context); diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin.java index d8ab883863..ff770cb34c 100644 --- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin.java +++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/WorldRendererMixin.java @@ -212,4 +212,11 @@ private void renderSky(MatrixStack matrices, Matrix4f matrix4f, float tickDelta, } } } + + @Inject(method = "renderSky(Lnet/minecraft/client/util/math/MatrixStack;Lorg/joml/Matrix4f;FLnet/minecraft/client/render/Camera;ZLjava/lang/Runnable;)V", at = @At("HEAD"), cancellable = true) + private void onRenderSky(MatrixStack matrices, Matrix4f projectionMatrix, float tickDelta, Camera camera, boolean thickFog, Runnable fogCallback, CallbackInfo info) { + if (!WorldRenderEvents.RENDER_SKY.invoker().renderSky(context, fogCallback)) { + info.cancel(); + } + } } diff --git a/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/WorldRenderEventsTests.java b/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/WorldRenderEventsTests.java index 029649c870..e62e5bc6b6 100644 --- a/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/WorldRenderEventsTests.java +++ b/fabric-rendering-v1/src/testmodClient/java/net/fabricmc/fabric/test/rendering/client/WorldRenderEventsTests.java @@ -18,7 +18,9 @@ import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.render.OverlayTexture; +import net.minecraft.item.Items; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -48,9 +50,16 @@ private static boolean onBlockOutline(WorldRenderContext wrc, WorldRenderContext return true; } + private static boolean onRenderSky(WorldRenderContext wrc, Runnable fogCallback) { + ClientPlayerEntity player = MinecraftClient.getInstance().player; + + return !player.isHolding(Items.DEBUG_STICK) || !(player.getY() > 200); + } + // Renders a diamond block above diamond blocks when they are looked at. @Override public void onInitializeClient() { WorldRenderEvents.BLOCK_OUTLINE.register(WorldRenderEventsTests::onBlockOutline); + WorldRenderEvents.RENDER_SKY.register(WorldRenderEventsTests::onRenderSky); } }