From 59a3c81f37923426bf91565d735284a8641ee59e Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Thu, 22 Feb 2024 11:58:27 +1000 Subject: [PATCH] Partial compatibility with vivecraft --- build.gradle | 4 +- gradle.properties | 2 +- .../voxy/client/core/ViewportSelector.java | 45 +++++++++++++++++++ .../me/cortex/voxy/client/core/VoxelCore.java | 11 ++--- 4 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 src/main/java/me/cortex/voxy/client/core/ViewportSelector.java diff --git a/build.gradle b/build.gradle index 3c626aab..8cb5686f 100644 --- a/build.gradle +++ b/build.gradle @@ -58,8 +58,10 @@ dependencies { include(modImplementation("maven.modrinth:cloth-config:13.0.121+fabric")) modImplementation("maven.modrinth:modmenu:9.0.0") modCompileOnly("maven.modrinth:iris:1.6.17+1.20.4") - modCompileOnly("maven.modrinth:starlight:1.1.3+1.20.4") //modRuntimeOnly("maven.modrinth:iris:1.6.17+1.20.4") + modCompileOnly("maven.modrinth:starlight:1.1.3+1.20.4") + //modCompileOnly("maven.modrinth:immersiveportals:v5.1.7-mc1.20.4") + modCompileOnly("maven.modrinth:vivecraft:1.20.4-1.1.6-fabric") } diff --git a/gradle.properties b/gradle.properties index deb4ffaf..c020cd64 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=1.20.4+build.1 loader_version=0.15.1 # Mod Properties -mod_version = 0.1.3-alpha +mod_version = 0.1.4-alpha maven_group = me.cortex archives_base_name = voxy diff --git a/src/main/java/me/cortex/voxy/client/core/ViewportSelector.java b/src/main/java/me/cortex/voxy/client/core/ViewportSelector.java new file mode 100644 index 00000000..ebfe9b4a --- /dev/null +++ b/src/main/java/me/cortex/voxy/client/core/ViewportSelector.java @@ -0,0 +1,45 @@ +package me.cortex.voxy.client.core; + +import me.cortex.voxy.client.core.rendering.AbstractFarWorldRenderer; +import me.cortex.voxy.client.core.rendering.Viewport; +import net.fabricmc.loader.api.FabricLoader; +import org.vivecraft.client_vr.ClientDataHolderVR; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +public class ViewportSelector { + public static final boolean VIVECRAFT_INSTALLED = FabricLoader.getInstance().isModLoaded("vivecraft"); + + private final Supplier creator; + private final T defaultViewport; + private final Map extraViewports = new HashMap<>(); + + public ViewportSelector(Supplier viewportCreator) { + this.creator = viewportCreator; + this.defaultViewport = viewportCreator.get(); + } + + private T getVivecraftViewport() { + var cdh = ClientDataHolderVR.getInstance(); + var pass = cdh.currentPass; + if (pass == null) { + return this.defaultViewport; + } + return this.extraViewports.computeIfAbsent(pass, a->this.creator.get()); + } + + public T getViewport() { + if (VIVECRAFT_INSTALLED) { + return getVivecraftViewport(); + } + return this.defaultViewport; + } + + public void free() { + this.defaultViewport.delete(); + this.extraViewports.values().forEach(Viewport::delete); + this.extraViewports.clear(); + } +} diff --git a/src/main/java/me/cortex/voxy/client/core/VoxelCore.java b/src/main/java/me/cortex/voxy/client/core/VoxelCore.java index a2944e36..57316313 100644 --- a/src/main/java/me/cortex/voxy/client/core/VoxelCore.java +++ b/src/main/java/me/cortex/voxy/client/core/VoxelCore.java @@ -49,7 +49,7 @@ public class VoxelCore { private final RenderTracker renderTracker; private final AbstractFarWorldRenderer renderer; - private Viewport viewport; + private final ViewportSelector viewportSelector; private final PostProcessing postProcessing; //private final Thread shutdownThread = new Thread(this::shutdown); @@ -62,7 +62,7 @@ public class VoxelCore { //Trigger the shared index buffer loading SharedIndexBuffer.INSTANCE.id(); this.renderer = new Gl46FarWorldRenderer(VoxyConfig.CONFIG.geometryBufferSize, VoxyConfig.CONFIG.maxSections); - this.viewport = this.renderer.createViewport(); + this.viewportSelector = new ViewportSelector<>(this.renderer::createViewport); System.out.println("Renderer initialized"); this.renderTracker = new RenderTracker(this.world, this.renderer); @@ -155,12 +155,13 @@ public class VoxelCore { //fb.bind(); var projection = computeProjectionMat(); - this.viewport.setProjection(projection).setModelView(matrices.peek().getPositionMatrix()).setCamera(cameraX, cameraY, cameraZ); + var viewport = this.viewportSelector.getViewport(); + viewport.setProjection(projection).setModelView(matrices.peek().getPositionMatrix()).setCamera(cameraX, cameraY, cameraZ); int boundFB = GL11.glGetInteger(GL_DRAW_FRAMEBUFFER_BINDING); this.postProcessing.setup(MinecraftClient.getInstance().getFramebuffer().textureWidth, MinecraftClient.getInstance().getFramebuffer().textureHeight, boundFB); - this.renderer.renderFarAwayOpaque(this.viewport); + this.renderer.renderFarAwayOpaque(viewport); //Compute the SSAO of the rendered terrain this.postProcessing.computeSSAO(projection, matrices); @@ -199,7 +200,7 @@ public class VoxelCore { System.out.println("Render gen shut down"); try {this.world.shutdown();} catch (Exception e) {System.err.println(e);} System.out.println("World engine shut down"); - try {this.renderer.shutdown(); if (viewport!=null)this.viewport.delete();} catch (Exception e) {System.err.println(e);} + try {this.renderer.shutdown(); this.viewportSelector.free();} catch (Exception e) {System.err.println(e);} System.out.println("Renderer shut down"); if (this.postProcessing!=null){try {this.postProcessing.shutdown();} catch (Exception e) {System.err.println(e);}} System.out.println("Voxel core shut down");