Fix Optifine shaders not rendering

This commit is contained in:
James Seibel
2023-11-02 21:45:12 -05:00
parent ef1699f2e9
commit a227547daa
3 changed files with 52 additions and 5 deletions
@@ -42,6 +42,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper;
#if PRE_MC_1_19_4
import com.mojang.math.Vector3f;
#else
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor;
import org.joml.Vector3f;
#endif
#if MC_1_20_2
@@ -103,6 +104,12 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
*/
public HashMap<IDimensionTypeWrapper, LightMapWrapper> lightmapByDimensionType = new HashMap<>();
/**
* Holds the render buffer that should be used when displaying levels to the screen.
* This is used for Optifine shader support so we can render directly to Optifine's level frame buffer.
*/
public int finalLevelFrameBufferId = -1;
@Override
@@ -255,9 +262,23 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
public int getTargetFrameBuffer()
{
int frameBufferOverrideId = DhApiRenderProxy.INSTANCE.targetFrameBufferOverride;
return (frameBufferOverrideId == -1) ? this.getRenderTarget().frameBufferId : frameBufferOverrideId;
if (frameBufferOverrideId != -1)
{
return frameBufferOverrideId;
}
// used so we can access the framebuffer shaders end up rendering to
if (AbstractOptifineAccessor.optifinePresent())
{
return this.finalLevelFrameBufferId;
}
return this.getRenderTarget().frameBufferId;
}
@Override
public void clearTargetFrameBuffer() { this.finalLevelFrameBufferId = -1; }
@Override
public int getDepthTextureId() { return this.getRenderTarget().getDepthTextureId(); }
@@ -20,13 +20,12 @@
package com.seibel.distanthorizons.forge;
import com.seibel.distanthorizons.common.util.ProxyUtil;
import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.api.internal.SharedApi;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.pos.DhChunkPos;
import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
@@ -34,7 +33,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapp
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.coreapi.ModInfo;
//import io.netty.buffer.ByteBuf;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.client.multiplayer.ClientLevel;
@@ -42,6 +40,7 @@ import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraftforge.event.world.ChunkEvent;
import net.minecraftforge.event.world.WorldEvent;
#else
import net.minecraftforge.client.event.RenderLevelStageEvent;
import net.minecraftforge.event.level.ChunkEvent;
import net.minecraftforge.event.level.LevelEvent;
#endif
@@ -61,6 +60,7 @@ import net.minecraft.client.Minecraft;
import net.minecraftforge.client.event.InputEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import org.lwjgl.opengl.GL32;
/**
* This handles all events sent to the client,
@@ -289,4 +289,30 @@ public class ForgeClientProxy
}
}
//===========//
// rendering //
//===========//
@SubscribeEvent
public void afterLevelRenderEvent(RenderLevelStageEvent event)
{
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_LEVEL)
{
try
{
// should generally only need to be set once per game session
// allows DH to render directly to Optifine's level frame buffer,
// allowing better shader support
MinecraftRenderWrapper.INSTANCE.finalLevelFrameBufferId = GL32.glGetInteger(GL32.GL_FRAMEBUFFER_BINDING);
}
catch (Exception | Error e)
{
LOGGER.error("Unexpected error in afterLevelRenderEvent: "+e.getMessage(), e);
}
}
}
}