forked from TheBrokenRail/EnergonRelics
61 lines
2.6 KiB
Java
61 lines
2.6 KiB
Java
package com.thebrokenrail.energonrelics.mixin;
|
|
|
|
import com.thebrokenrail.energonrelics.client.block.entity.render.HolographicSkyBlockEntityRenderer;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
import net.minecraft.client.MinecraftClient;
|
|
import net.minecraft.client.gl.Framebuffer;
|
|
import net.minecraft.client.render.Camera;
|
|
import net.minecraft.client.render.GameRenderer;
|
|
import net.minecraft.client.render.LightmapTextureManager;
|
|
import net.minecraft.client.render.WorldRenderer;
|
|
import net.minecraft.client.util.math.MatrixStack;
|
|
import net.minecraft.util.math.Matrix4f;
|
|
import org.lwjgl.opengl.GL30;
|
|
import org.spongepowered.asm.mixin.Final;
|
|
import org.spongepowered.asm.mixin.Mixin;
|
|
import org.spongepowered.asm.mixin.Shadow;
|
|
import org.spongepowered.asm.mixin.Unique;
|
|
import org.spongepowered.asm.mixin.injection.At;
|
|
import org.spongepowered.asm.mixin.injection.Inject;
|
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
@Mixin(WorldRenderer.class)
|
|
public class MixinWorldRenderer implements HolographicSkyBlockEntityRenderer.WorldWithSky {
|
|
@Shadow
|
|
@Final
|
|
private MinecraftClient client;
|
|
|
|
@Unique
|
|
private Framebuffer sky;
|
|
|
|
@Override
|
|
public Framebuffer getSky() {
|
|
return sky;
|
|
}
|
|
|
|
@Inject(at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiler/Profiler;swap(Ljava/lang/String;)V", args = "ldc=fog"), method = "render", allow = 1)
|
|
public void render(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, CallbackInfo info) {
|
|
Framebuffer mcFb = client.getFramebuffer();
|
|
|
|
if (sky == null) {
|
|
sky = new Framebuffer(mcFb.viewportWidth, mcFb.viewportHeight, true, true);
|
|
} else if (sky.viewportWidth != mcFb.viewportWidth || sky.viewportHeight != mcFb.viewportHeight) {
|
|
sky.initFbo(mcFb.viewportWidth, mcFb.viewportHeight, true);
|
|
}
|
|
|
|
blit(mcFb, sky);
|
|
|
|
mcFb.beginWrite(false);
|
|
}
|
|
|
|
@Unique
|
|
private void blit(Framebuffer from, Framebuffer into) {
|
|
GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, from.fbo);
|
|
GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, into.fbo);
|
|
GL30.glBlitFramebuffer(0, 0, from.viewportWidth, from.viewportHeight, 0, 0, into.viewportWidth, into.viewportHeight, GL30.GL_COLOR_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT | GL30.GL_STENCIL_BUFFER_BIT, GL30.GL_NEAREST);
|
|
GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, 0);
|
|
GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, 0);
|
|
}
|
|
} |