From 617a5f3a9f8bbc77487d08488ec2d3f4619ae7cc Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 9 Nov 2023 19:19:35 +0000 Subject: [PATCH] Implement proper underwater vision for seaponies --- .../client/render/WorldRenderDelegate.java | 11 ++++++++++ .../unicopia/entity/player/PlayerCamera.java | 11 ---------- .../mixin/client/MixinBackgroundRenderer.java | 20 +++++++++++++++++++ .../unicopia/mixin/client/MixinCamera.java | 8 -------- src/main/resources/unicopia.mixin.json | 1 + 5 files changed, 32 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBackgroundRenderer.java diff --git a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java index 78ca8e93..90a9fd4d 100644 --- a/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java +++ b/src/main/java/com/minelittlepony/unicopia/client/render/WorldRenderDelegate.java @@ -14,9 +14,11 @@ import com.minelittlepony.unicopia.entity.ItemImpl; import com.minelittlepony.unicopia.entity.Living; import com.minelittlepony.unicopia.entity.duck.LavaAffine; import com.minelittlepony.unicopia.entity.player.Pony; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.*; +import net.minecraft.client.render.BackgroundRenderer.FogType; import net.minecraft.client.render.VertexConsumerProvider.Immediate; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.entity.*; @@ -46,6 +48,15 @@ public class WorldRenderDelegate { return Optional.empty(); } + public void applyFog(Camera camera, FogType fogType, float viewDistance, boolean thickFog, float tickDelta) { + if (camera.getSubmersionType() == CameraSubmersionType.WATER) { + if (EquinePredicates.PLAYER_SEAPONY.test(MinecraftClient.getInstance().player)) { + RenderSystem.setShaderFogStart(RenderSystem.getShaderFogStart() - 30); + RenderSystem.setShaderFogEnd(RenderSystem.getShaderFogEnd() + 190); + } + } + } + public boolean beforeEntityRender(Entity entity, double x, double y, double z, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertices, int light) { diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java index 04b5bf22..11b71c2e 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerCamera.java @@ -3,11 +3,9 @@ package com.minelittlepony.unicopia.entity.player; import java.util.Optional; import com.minelittlepony.common.util.animation.MotionCompositor; -import com.minelittlepony.unicopia.Race; import com.minelittlepony.unicopia.ability.magic.SpellPredicate; import com.minelittlepony.unicopia.ability.magic.spell.AbstractDisguiseSpell; -import net.minecraft.client.render.CameraSubmersionType; import net.minecraft.util.math.Vec3d; public class PlayerCamera extends MotionCompositor { @@ -61,15 +59,6 @@ public class PlayerCamera extends MotionCompositor { .map(d -> distance * d); } - public Optional getSubmersionType(CameraSubmersionType original) { - if (player.getCompositeRace().includes(Race.SEAPONY)) { - if (original == CameraSubmersionType.WATER) { - return Optional.of(CameraSubmersionType.NONE); - } - } - return Optional.empty(); - } - public double calculateFieldOfView(double fov) { fov += player.getMagicalReserves().getExertion().get() / 5F; fov += getEnergyAddition(); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBackgroundRenderer.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBackgroundRenderer.java new file mode 100644 index 00000000..566236f5 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinBackgroundRenderer.java @@ -0,0 +1,20 @@ +package com.minelittlepony.unicopia.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.minelittlepony.unicopia.client.render.WorldRenderDelegate; + +import net.minecraft.client.render.BackgroundRenderer; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.BackgroundRenderer.FogType; + +@Mixin(BackgroundRenderer.class) +abstract class MixinBackgroundRenderer { + @Inject(method = "applyFog", at = @At("RETURN")) + private static void onApplyFog(Camera camera, FogType fogType, float viewDistance, boolean thickFog, float tickDelta, CallbackInfo info) { + WorldRenderDelegate.INSTANCE.applyFog(camera, fogType, viewDistance, thickFog, tickDelta); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java index 6444e002..81f9f5da 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinCamera.java @@ -8,7 +8,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.minelittlepony.unicopia.client.UnicopiaClient; import net.minecraft.client.render.Camera; -import net.minecraft.client.render.CameraSubmersionType; @Mixin(Camera.class) abstract class MixinCamera { @@ -34,11 +33,4 @@ abstract class MixinCamera { private void redirectCameraDistance(double initial, CallbackInfoReturnable info) { UnicopiaClient.getCamera().flatMap(c -> c.calculateDistance(info.getReturnValueD())).ifPresent(info::setReturnValue); } - - @Inject(method = "getSubmersionType", - at = @At("RETURN"), - cancellable = true) - public void getSubmersionType(CallbackInfoReturnable info) { - UnicopiaClient.getCamera().flatMap(c -> c.getSubmersionType(info.getReturnValue())).ifPresent(info::setReturnValue); - } } diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 045db477..b85f5823 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -59,6 +59,7 @@ "client": [ "client.MixinAnimalModel", "client.MixinArmorFeatureRenderer", + "client.MixinBackgroundRenderer", "client.MixinCamera", "client.MixinClientWorld", "client.MixinEntityRenderDispatcher",