diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java index abbc2c534..d350116a6 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java @@ -102,6 +102,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper //==================// //region + @Override public synchronized void markRendered() { this.lastRenderTime = System.currentTimeMillis(); } @@ -155,6 +156,9 @@ public class ClientLevelWrapper implements IClientLevelWrapper { LOGGER.debug("Unloading level " + wrapper.getDhIdentifier() + " due to inactivity"); ClientApi.INSTANCE.clientLevelUnloadEvent(wrapper); + if (wrapper.isDhLevelLoaded()) { + wrapper.onUnload(); + } } } } diff --git a/coreSubProjects b/coreSubProjects index 3d13ba764..7fe0c9b0e 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 3d13ba7645e4e28e41b7b0f3c4ca9918ef6737c5 +Subproject commit 7fe0c9b0e8ef680af5e5dda9f51a7efcca81bfaf diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java index 6020877fd..91c0e4903 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricMain.java @@ -116,7 +116,7 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new); this.tryCreateModCompatAccessor("bclib", IBCLibAccessor.class, BCLibAccessor::new); this.tryCreateModCompatAccessor("c2me", IC2meAccessor.class, C2meAccessor::new); - this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessor::new); + this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessorFabric::new); #if MC_VER >= MC_1_19_4 // 1.19.4 is the lowest version Iris supports DH this.tryCreateModCompatAccessor("iris", IIrisAccessor.class, IrisAccessor::new); diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java index 0b8a15c28..48f5312ee 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java @@ -27,7 +27,6 @@ import com.mojang.math.Matrix4f; import org.lwjgl.opengl.GL32; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; #elif MC_VER < MC_1_21_6 -import com.seibel.distanthorizons.core.util.math.Mat4f; import net.minecraft.client.renderer.RenderType; import com.mojang.blaze3d.vertex.PoseStack; import org.joml.Matrix4f; @@ -75,10 +74,7 @@ import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapp import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; -import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; -import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IImmersivePortalsAccessor; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; @@ -173,25 +169,6 @@ public class MixinLevelRenderer ClientApi.RENDER_STATE.partialTickTime = MinecraftRenderWrapper.INSTANCE.getPartialTickTime(); ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); - if (ClientApi.RENDER_STATE.clientLevelWrapper instanceof ClientLevelWrapper) - { - ClientLevelWrapper wrapper = (ClientLevelWrapper) ClientApi.RENDER_STATE.clientLevelWrapper; - - // Apply Immersive Portals compatibility only when IP is detected - if (ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class) != null) - { - if (!wrapper.isDhLevelLoaded()) - { - LOGGER.debug("IP detected - On-demand loading level " + wrapper.getDhIdentifier() + " during rendering"); - ClientApi.INSTANCE.clientLevelLoadEvent(wrapper); - } - } - - wrapper.markRendered(); - } - - - #if MC_VER < MC_1_21_6 if (renderType.equals(RenderType.translucent())) { diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/ImmersivePortalsAccessorFabric.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/ImmersivePortalsAccessorFabric.java new file mode 100644 index 000000000..a586cbbb6 --- /dev/null +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/ImmersivePortalsAccessorFabric.java @@ -0,0 +1,47 @@ +package com.seibel.distanthorizons.fabric.wrappers.modAccessor; + +import com.google.common.base.Suppliers; +import com.mojang.blaze3d.systems.RenderSystem; +import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ImmersivePortalsAbstractAccessor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +import java.util.function.Supplier; + +public class ImmersivePortalsAccessorFabric extends ImmersivePortalsAbstractAccessor +{ + @Override + protected Object getClientLevel() + { + return Minecraft.getInstance().level; + } + @Override + protected Class getLevelClass() + { + return Level.class; + } + @Override + protected Iterable getEntitiesForRendering() + { + return Minecraft.getInstance().level.entitiesForRendering(); + } + @Override + protected Supplier getFrustumSupplier() + { + return Suppliers.memoize(() -> { + Frustum frustum = new Frustum( + ClientApi.RENDER_STATE.mcModelViewMatrix.createJomlMatrix(), + RenderSystem.getProjectionMatrix() + ); + + Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); + frustum.prepare(cameraPos.x, cameraPos.y, cameraPos.z); + + return frustum; + }); + } + +} diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java index 3eabd4063..befae53a9 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java @@ -134,29 +134,6 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel, true); ClientApi.INSTANCE.clientLevelLoadEvent(clientLevelWrapper); } - @SubscribeEvent - #if MC_VER < MC_1_19_2 - public void clientLevelUnloadEvent(WorldEvent.Unload event) - #else - public void clientLevelUnloadEvent(LevelEvent.Unload event) - #endif - { - LOGGER.info("level unload"); - - #if MC_VER < MC_1_19_2 - LevelAccessor level = event.getWorld(); - #else - LevelAccessor level = event.getLevel(); - #endif - if (!(level instanceof ClientLevel)) - { - return; - } - - ClientLevel clientLevel = (ClientLevel) level; - IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel); - ClientApi.INSTANCE.clientLevelUnloadEvent(clientLevelWrapper); - } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java index 301eb9e56..cf4b40df8 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeMain.java @@ -27,6 +27,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSende import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.*; import com.seibel.distanthorizons.coreapi.ModInfo; +import com.seibel.distanthorizons.forge.wrappers.modAccessor.ImmersivePortalsAccessorForge; import com.seibel.distanthorizons.forge.wrappers.modAccessor.ModChecker; import com.seibel.distanthorizons.forge.wrappers.modAccessor.OptifineAccessor; import com.seibel.distanthorizons.forge.wrappers.modAccessor.OculusAccessor; @@ -102,7 +103,7 @@ public class ForgeMain extends AbstractModInitializer { this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new); this.tryCreateModCompatAccessor("oculus", IIrisAccessor.class, OculusAccessor::new); - this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessor::new); + this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessorForge::new); #if MC_VER < MC_1_17_1 ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/wrappers/modAccessor/ImmersivePortalsAccessorForge.java b/forge/src/main/java/com/seibel/distanthorizons/forge/wrappers/modAccessor/ImmersivePortalsAccessorForge.java new file mode 100644 index 000000000..b7bf1599e --- /dev/null +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/wrappers/modAccessor/ImmersivePortalsAccessorForge.java @@ -0,0 +1,47 @@ +package com.seibel.distanthorizons.forge.wrappers.modAccessor; + +import com.google.common.base.Suppliers; +import com.mojang.blaze3d.systems.RenderSystem; +import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ImmersivePortalsAbstractAccessor; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.culling.Frustum; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +import java.util.function.Supplier; + +public class ImmersivePortalsAccessorForge extends ImmersivePortalsAbstractAccessor +{ + @Override + protected Object getClientLevel() + { + return Minecraft.getInstance().level; + } + @Override + protected Class getLevelClass() + { + return Level.class; + } + @Override + protected Iterable getEntitiesForRendering() + { + return Minecraft.getInstance().level.entitiesForRendering(); + } + @Override + protected Supplier getFrustumSupplier() + { + return Suppliers.memoize(() -> { + Frustum frustum = new Frustum( + ClientApi.RENDER_STATE.mcModelViewMatrix.createJomlMatrix(), + RenderSystem.getProjectionMatrix() + ); + + Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); + frustum.prepare(cameraPos.x, cameraPos.y, cameraPos.z); + + return frustum; + }); + } + +} diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java index e0598fa8c..eccf4b393 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java @@ -94,21 +94,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel, true); ClientApi.INSTANCE.clientLevelLoadEvent(clientLevelWrapper); } - @SubscribeEvent - public void clientLevelUnloadEvent(LevelEvent.Unload event) - { - LOGGER.info("level unload"); - - LevelAccessor level = event.getLevel(); - if (!(level instanceof ClientLevel)) - { - return; - } - - ClientLevel clientLevel = (ClientLevel) level; - IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel); - ClientApi.INSTANCE.clientLevelUnloadEvent(clientLevelWrapper); - } @@ -241,21 +226,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy // handled via the same mixin as fabric for consistency #endif - if (ClientApi.RENDER_STATE.clientLevelWrapper instanceof ClientLevelWrapper) - { - ClientLevelWrapper wrapper = (ClientLevelWrapper) ClientApi.RENDER_STATE.clientLevelWrapper; - if (ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class) != null) - { - if (!wrapper.isDhLevelLoaded()) - { - LOGGER.debug("IP detected - On-demand loading level " + wrapper.getDhIdentifier() + " during rendering"); - ClientApi.INSTANCE.clientLevelLoadEvent(wrapper); - } - } - - wrapper.markRendered(); - } - ClientApi.INSTANCE.renderFadeOpaque(); } @@ -270,21 +240,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy #else // handled via the same mixin as fabric for consistency #endif - - if (ClientApi.RENDER_STATE.clientLevelWrapper instanceof ClientLevelWrapper) - { - ClientLevelWrapper wrapper = (ClientLevelWrapper) ClientApi.RENDER_STATE.clientLevelWrapper; - if (ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class) != null) - { - if (!wrapper.isDhLevelLoaded()) - { - LOGGER.debug("IP detected - On-demand loading level " + wrapper.getDhIdentifier() + " during rendering"); - ClientApi.INSTANCE.clientLevelLoadEvent(wrapper); - } - } - - wrapper.markRendered(); - } } @SubscribeEvent @@ -298,21 +253,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy // handled via the same mixin as fabric for consistency #endif - if (ClientApi.RENDER_STATE.clientLevelWrapper instanceof ClientLevelWrapper) - { - ClientLevelWrapper wrapper = (ClientLevelWrapper) ClientApi.RENDER_STATE.clientLevelWrapper; - if (ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class) != null) - { - if (!wrapper.isDhLevelLoaded()) - { - LOGGER.debug("IP detected - On-demand loading level " + wrapper.getDhIdentifier() + " during rendering"); - ClientApi.INSTANCE.clientLevelLoadEvent(wrapper); - } - } - - wrapper.markRendered(); - } - try { // should generally only need to be set once per game session