Partial compatibility with vivecraft

This commit is contained in:
mcrcortex
2024-02-22 11:58:27 +10:00
parent e5c1e22bad
commit 59a3c81f37
4 changed files with 55 additions and 7 deletions

View File

@@ -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 <T extends Viewport> {
public static final boolean VIVECRAFT_INSTALLED = FabricLoader.getInstance().isModLoaded("vivecraft");
private final Supplier<T> creator;
private final T defaultViewport;
private final Map<Object, T> extraViewports = new HashMap<>();
public ViewportSelector(Supplier<T> 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();
}
}

View File

@@ -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");