diff --git a/src/main/java/net/montoyo/wd/SharedProxy.java b/src/main/java/net/montoyo/wd/SharedProxy.java index 0535750..20009f8 100644 --- a/src/main/java/net/montoyo/wd/SharedProxy.java +++ b/src/main/java/net/montoyo/wd/SharedProxy.java @@ -14,18 +14,21 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.server.ServerLifecycleHooks; import net.montoyo.wd.core.HasAdvancement; import net.montoyo.wd.core.JSServerRequest; import net.montoyo.wd.data.GuiData; import net.montoyo.wd.entity.ScreenBlockEntity; +import net.montoyo.wd.entity.ScreenData; import net.montoyo.wd.utilities.*; import net.montoyo.wd.utilities.math.Vector2i; import net.montoyo.wd.utilities.math.Vector3i; import net.montoyo.wd.utilities.data.BlockSide; import net.montoyo.wd.utilities.data.Rotation; import net.montoyo.wd.utilities.serialization.NameUUIDPair; +import org.joml.Vector3d; import javax.annotation.Nonnull; import java.util.UUID; @@ -125,4 +128,21 @@ public class SharedProxy { public boolean isShiftDown() { return false; } + + public double distanceTo(ScreenBlockEntity tes, Vec3 position) { + double dist = Double.POSITIVE_INFINITY; + for (int i = 0; i < tes.screenCount(); i++) { + ScreenData scrn = tes.getScreen(i); + + Vector3d pos = new Vector3d( + scrn.side.right.x * scrn.size.x / 2d + scrn.size.y * scrn.side.up.x / 2d, + scrn.side.right.y * scrn.size.x / 2d + scrn.size.y * scrn.side.up.y / 2d, + scrn.side.right.z * scrn.size.x / 2d + scrn.size.y * scrn.side.up.z / 2d + ).add(tes.getBlockPos().getX(), tes.getBlockPos().getY(), tes.getBlockPos().getZ()); + + double dist2 = position.distanceToSqr(pos.x, pos.y, pos.z); + dist = Math.min(dist, dist2); + } + return dist; + } } diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 4063afa..95461bf 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -61,6 +61,7 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.client.gui.*; import net.montoyo.wd.client.gui.loading.GuiLoader; +import net.montoyo.wd.utilities.browser.WDBrowser; import net.montoyo.wd.utilities.browser.handlers.DisplayHandler; import net.montoyo.wd.utilities.browser.handlers.WDRouter; import net.montoyo.wd.client.renderers.*; @@ -207,7 +208,7 @@ public class ClientProxy extends SharedProxy implements ResourceManagerReloadLis } catch (IOException e) { throw new RuntimeException(e); } - view = MCEF.createBrowser(WebDisplays.applyBlacklist(webUrl), false); + view = WDBrowser.createBrowser(WebDisplays.applyBlacklist(webUrl), false); if (view instanceof MCEFBrowser browser) { browser.resize((int) WebDisplays.INSTANCE.padResX, (int) WebDisplays.INSTANCE.padResY); browser.setCursorChangeListener((cursor) -> { @@ -229,7 +230,6 @@ public class ClientProxy extends SharedProxy implements ResourceManagerReloadLis private Minecraft mc; private MinePadRenderer minePadRenderer; -// private JSQueryDispatcher jsDispatcher; private LaserPointerRenderer laserPointerRenderer; private Screen nextScreen; private boolean isF1Down; @@ -263,10 +263,6 @@ public class ClientProxy extends SharedProxy implements ResourceManagerReloadLis event.register(ScreenModelLoader.SCREEN_LOADER.getPath(), new ScreenModelLoader()); } - private static void registerBlockRenderLayers(RenderType layer, Block... blocks) { - Stream.of(blocks).forEach(block -> ItemBlockRenderTypes.setRenderLayer(block, layer)); - } - @Override public void preInit() { super.preInit(); @@ -274,11 +270,6 @@ public class ClientProxy extends SharedProxy implements ResourceManagerReloadLis MinecraftForge.EVENT_BUS.register(this); } - @Override - public void init() { - super.init(); - } - @Override public void onCefInit() { minePadRenderer = new MinePadRenderer(); @@ -580,7 +571,7 @@ public class ClientProxy extends SharedProxy implements ResourceManagerReloadLis if (ev.phase != TickEvent.Phase.END) return; //Unload/load screens depending on client player distance - if (mc.player != null || !screenTracking.isEmpty()) + if (mc.player == null || screenTracking.isEmpty()) return; int id = lastTracked % screenTracking.size(); @@ -597,27 +588,15 @@ public class ClientProxy extends SharedProxy implements ResourceManagerReloadLis if (!tes.isLoaded()) tes.load(); } else { - double dist = Double.POSITIVE_INFINITY; - for (int i = 0; i < tes.screenCount(); i++) { - ScreenData scrn = tes.getScreen(i); - - Vector3d pos = new Vector3d( - scrn.side.right.x * scrn.size.x + scrn.size.y * scrn.side.up.x, - scrn.side.right.y * scrn.size.x + scrn.size.y * scrn.side.up.y, - scrn.side.right.z * scrn.size.x + scrn.size.y * scrn.side.up.z - ); - - double dist2 = mc.player.distanceToSqr(pos.x, pos.y, pos.z); - dist = Math.min(dist, dist2); - } + double dist = distanceTo(tes, mc.getEntityRenderDispatcher().camera.getPosition()); if (tes.isLoaded()) { - if (dist > WebDisplays.INSTANCE.unloadDistance2) - tes.unload(); + if (dist > WebDisplays.INSTANCE.unloadDistance2 * 16) + tes.deactivate(); // else if (ClientConfig.AutoVolumeControl.enableAutoVolume) // tes.updateTrackDistance(dist, 80); //ToDo find master volume - } else if (dist <= WebDisplays.INSTANCE.loadDistance2) - tes.load(); + } else if (dist <= WebDisplays.INSTANCE.loadDistance2 * 16) + tes.activate(); } } diff --git a/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java b/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java index 2b72e32..3254a56 100644 --- a/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java +++ b/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java @@ -1,6 +1,5 @@ package net.montoyo.wd.client.gui.camera; -import com.google.gson.JsonObject; import net.minecraft.client.Minecraft; import net.minecraft.commands.arguments.EntityAnchorArgument; import net.minecraft.util.Mth; @@ -10,7 +9,6 @@ import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.event.TickEvent; import net.montoyo.wd.utilities.browser.handlers.js.queries.ElementCenterQuery; -import net.montoyo.wd.utilities.browser.handlers.WDRouter; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.entity.ScreenData; import net.montoyo.wd.utilities.browser.WDBrowser; @@ -117,8 +115,8 @@ public class KeyboardCamera { ScreenData scr = teTmp.getScreen(sdTmp); if (scr != null) { if (scr.browser instanceof WDBrowser wdBrowser) { - wdBrowser.pointerLock().dispatch(scr.browser); - updateCrd(((WDBrowser) scr.browser).pointerLock()); + wdBrowser.focusedElement().dispatch(scr.browser); + updateCrd(((WDBrowser) scr.browser).focusedElement()); } } } diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java index 14cf7bf..51b9fa6 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java @@ -7,10 +7,12 @@ package net.montoyo.wd.client.renderers; import com.cinemamod.mcef.MCEFBrowser; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.montoyo.wd.WebDisplays; import net.montoyo.wd.entity.ScreenData; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.utilities.math.Vector3f; @@ -38,16 +40,19 @@ public class ScreenRenderer implements BlockEntityRenderer { public void render(ScreenBlockEntity te, float partialTick, @NotNull PoseStack poseStack, @NotNull MultiBufferSource bufferSource, int packedLight, int packedOverlay) { if (!te.isLoaded()) return; - + //Disable lighting // RenderSystem.enableTexture(); -// RenderSystem.disableCull(); +// RenderSystem.disableCull(); RenderSystem.disableBlend(); for (int i = 0; i < te.screenCount(); i++) { ScreenData scr = te.getScreen(i); if (scr.browser == null) { - scr.createBrowser(true); + double dist = WebDisplays.PROXY.distanceTo(te, Minecraft.getInstance().getEntityRenderDispatcher().camera.getPosition()); + if (dist <= WebDisplays.INSTANCE.loadDistance2 * 16) + scr.createBrowser(true); + else continue; } // TODO: manually backface cull the screens diff --git a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java index 89414bc..c5ac793 100644 --- a/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java +++ b/src/main/java/net/montoyo/wd/entity/ScreenBlockEntity.java @@ -1073,6 +1073,21 @@ public class ScreenBlockEntity extends BlockEntity { } } + public void deactivate() { + for (ScreenData screen : screens) { + if (screen.browser != null) { + screen.browser.close(true); + screen.browser = null; + } + } + } + + public void activate() { + for (ScreenData screen : screens) { + if (screen.browser == null) + screen.createBrowser(false); + } + } // @Override // public boolean shouldRefresh(Level world, BlockPos pos, @Nonnull BlockState oldState, @Nonnull BlockState newState) { diff --git a/src/main/java/net/montoyo/wd/utilities/browser/WDBrowser.java b/src/main/java/net/montoyo/wd/utilities/browser/WDBrowser.java index aa7aedf..7815427 100644 --- a/src/main/java/net/montoyo/wd/utilities/browser/WDBrowser.java +++ b/src/main/java/net/montoyo/wd/utilities/browser/WDBrowser.java @@ -20,10 +20,10 @@ public interface WDBrowser { static void registerQueries(WDBrowser browser) { Map handlerMap = browser.queryHandlers(); - JSQueryHandler handler = browser.pointerLock(); + JSQueryHandler handler = browser.focusedElement(); handlerMap.put(handler.getName(), handler); } HashMap queryHandlers(); - ElementCenterQuery pointerLock(); + ElementCenterQuery focusedElement(); } diff --git a/src/main/java/net/montoyo/wd/utilities/browser/WDClientBrowser.java b/src/main/java/net/montoyo/wd/utilities/browser/WDClientBrowser.java index 738a445..528fee0 100644 --- a/src/main/java/net/montoyo/wd/utilities/browser/WDClientBrowser.java +++ b/src/main/java/net/montoyo/wd/utilities/browser/WDClientBrowser.java @@ -8,7 +8,7 @@ import net.montoyo.wd.utilities.browser.handlers.js.JSQueryHandler; import java.util.HashMap; public class WDClientBrowser extends MCEFBrowser implements WDBrowser { - ElementCenterQuery lock = new ElementCenterQuery("ActiveElement","document.activeElement"); + ElementCenterQuery focusedEl = new ElementCenterQuery("ActiveElement", "document.activeElement"); HashMap handlerHashMap = new HashMap<>(); public WDClientBrowser(MCEFClient client, String url, boolean transparent) { @@ -21,7 +21,7 @@ public class WDClientBrowser extends MCEFBrowser implements WDBrowser { } @Override - public ElementCenterQuery pointerLock() { - return lock; + public ElementCenterQuery focusedElement() { + return focusedEl; } }