diff --git a/common/src/main/java/org/vivecraft/VRTextureTarget.java b/common/src/main/java/org/vivecraft/VRTextureTarget.java index c139ad503..c29bb2824 100644 --- a/common/src/main/java/org/vivecraft/VRTextureTarget.java +++ b/common/src/main/java/org/vivecraft/VRTextureTarget.java @@ -14,6 +14,9 @@ public VRTextureTarget(String name, int width, int height, boolean usedepth, boo ((RenderTargetExtension)this).isLinearFilter(linearFilter); ((RenderTargetExtension)this).setUseStencil(useStencil); this.resize(width, height, onMac); + if (useStencil) { + Xplat.enableRenderTargetStencil(this); + } this.setClearColor(0, 0, 0, 0); } } diff --git a/common/src/main/java/org/vivecraft/Xplat.java b/common/src/main/java/org/vivecraft/Xplat.java index 0365e66bf..e408b9150 100644 --- a/common/src/main/java/org/vivecraft/Xplat.java +++ b/common/src/main/java/org/vivecraft/Xplat.java @@ -1,5 +1,6 @@ package org.vivecraft; +import com.mojang.blaze3d.pipeline.RenderTarget; import dev.architectury.injectables.annotations.ExpectPlatform; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.storage.LevelResource; @@ -49,4 +50,9 @@ static String getModVersion() { static boolean isModLoadedSuccess() { return false; } + + @ExpectPlatform + static boolean enableRenderTargetStencil(RenderTarget renderTarget) { + return false; + } } diff --git a/common/src/main/java/org/vivecraft/extensions/RenderTargetExtension.java b/common/src/main/java/org/vivecraft/extensions/RenderTargetExtension.java index 62c77a8ef..5f63e293f 100644 --- a/common/src/main/java/org/vivecraft/extensions/RenderTargetExtension.java +++ b/common/src/main/java/org/vivecraft/extensions/RenderTargetExtension.java @@ -28,6 +28,8 @@ default void genMipMaps() { void setUseStencil(boolean useStencil); + boolean getUseStencil(); + void isLinearFilter(boolean linearFilter); void blitFovReduction(ShaderInstance instance, int width, int height); diff --git a/common/src/main/java/org/vivecraft/gui/settings/GuiRenderOpticsSettings.java b/common/src/main/java/org/vivecraft/gui/settings/GuiRenderOpticsSettings.java index a7b3e1ada..ff6611fee 100644 --- a/common/src/main/java/org/vivecraft/gui/settings/GuiRenderOpticsSettings.java +++ b/common/src/main/java/org/vivecraft/gui/settings/GuiRenderOpticsSettings.java @@ -152,9 +152,9 @@ protected void actionPerformed(AbstractWidget widget) { GuiVROptionButton guivroptionbutton = (GuiVROptionButton)widget; - if (guivroptionbutton.id == VRSettings.VrOptions.MIRROR_DISPLAY.ordinal() || guivroptionbutton.id == VRSettings.VrOptions.FSAA.ordinal()) + if (guivroptionbutton.id == VRSettings.VrOptions.MIRROR_DISPLAY.ordinal() || guivroptionbutton.id == VRSettings.VrOptions.FSAA.ordinal() || guivroptionbutton.id == VRSettings.VrOptions.STENCIL_ON.ordinal()) { - if (guivroptionbutton.id != VRSettings.VrOptions.MIRROR_DISPLAY.ordinal() && !((Xplat.isModLoaded("iris") || Xplat.isModLoaded("oculus")) && IrisHelper.isShaderActive())) { + if (guivroptionbutton.id != VRSettings.VrOptions.MIRROR_DISPLAY.ordinal() || !((Xplat.isModLoaded("iris") || Xplat.isModLoaded("oculus")) && IrisHelper.isShaderActive())) { this.dataholder.vrRenderer.reinitFrameBuffers("Render Setting Changed"); } } diff --git a/common/src/main/java/org/vivecraft/mixin/blaze3d/pipeline/RenderTargetMixin.java b/common/src/main/java/org/vivecraft/mixin/blaze3d/pipeline/RenderTargetMixin.java index 9a9b39e53..553b42a1e 100644 --- a/common/src/main/java/org/vivecraft/mixin/blaze3d/pipeline/RenderTargetMixin.java +++ b/common/src/main/java/org/vivecraft/mixin/blaze3d/pipeline/RenderTargetMixin.java @@ -89,6 +89,11 @@ public void setUseStencil(boolean useStencil){ this.useStencil = useStencil; } + @Override + public boolean getUseStencil(){ + return useStencil; + } + @Override public void clearWithColor(float r, float g, float b, float a, boolean isMac) { RenderSystem.assertOnRenderThreadOrInit(); diff --git a/common/src/main/java/org/vivecraft/mixin/client/renderer/PostChainVRMixin.java b/common/src/main/java/org/vivecraft/mixin/client/renderer/PostChainVRMixin.java new file mode 100644 index 000000000..77a2f023d --- /dev/null +++ b/common/src/main/java/org/vivecraft/mixin/client/renderer/PostChainVRMixin.java @@ -0,0 +1,28 @@ +package org.vivecraft.mixin.client.renderer; + +import com.mojang.blaze3d.pipeline.RenderTarget; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.PostChain; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.vivecraft.extensions.RenderTargetExtension; + +@Mixin(PostChain.class) +public class PostChainVRMixin { + + @Shadow + @Final + private RenderTarget screenTarget; + + @ModifyVariable(method = "addTempTarget", at = @At(value = "STORE"), ordinal = 0) + private RenderTarget vrTarget(RenderTarget old) { + if (((RenderTargetExtension)screenTarget).getUseStencil()) { + ((RenderTargetExtension) old).setUseStencil(true); + old.resize(old.width, old.height, Minecraft.ON_OSX); + } + return old; + } +} diff --git a/common/src/main/resources/vivecraft.vr.mixins.json b/common/src/main/resources/vivecraft.vr.mixins.json index b55148175..a059779ad 100644 --- a/common/src/main/resources/vivecraft.vr.mixins.json +++ b/common/src/main/resources/vivecraft.vr.mixins.json @@ -44,6 +44,7 @@ "client.renderer.entity.MobRendererVRMixin", "client.renderer.item.ItemPropertiesVRMixin", "client.renderer.NoSodiumLevelRendererVRMixin", + "client.renderer.PostChainVRMixin", "world.entity.vehicle.BoatMixin", "world.item.ItemVRMixin", diff --git a/fabric/src/main/java/org/vivecraft/fabric/XplatImpl.java b/fabric/src/main/java/org/vivecraft/fabric/XplatImpl.java index d1f43486f..e86d4e94f 100644 --- a/fabric/src/main/java/org/vivecraft/fabric/XplatImpl.java +++ b/fabric/src/main/java/org/vivecraft/fabric/XplatImpl.java @@ -1,5 +1,6 @@ package org.vivecraft.fabric; +import com.mojang.blaze3d.pipeline.RenderTarget; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; @@ -32,4 +33,8 @@ public static String getModVersion() { public static boolean isModLoadedSuccess() { return FabricLoader.getInstance().isModLoaded("vivecraft"); } + + public static boolean enableRenderTargetStencil(RenderTarget renderTarget) { + return false; + } } diff --git a/forge/src/main/java/org/vivecraft/forge/XplatImpl.java b/forge/src/main/java/org/vivecraft/forge/XplatImpl.java index 66bf23416..2441e0745 100644 --- a/forge/src/main/java/org/vivecraft/forge/XplatImpl.java +++ b/forge/src/main/java/org/vivecraft/forge/XplatImpl.java @@ -1,5 +1,6 @@ package org.vivecraft.forge; +import com.mojang.blaze3d.pipeline.RenderTarget; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.fml.loading.FMLLoader; @@ -34,4 +35,9 @@ public static String getModVersion() { public static boolean isModLoadedSuccess() { return FMLLoader.getLoadingModList().getModFileById("vivecraft") != null; } + + public static boolean enableRenderTargetStencil(RenderTarget renderTarget) { + renderTarget.enableStencil(); + return true; + } }