Release 2.6.5

This commit is contained in:
Jonas Herzig
2022-05-01 21:25:21 +02:00
19 changed files with 260 additions and 140 deletions

View File

@@ -341,7 +341,7 @@ dependencies {
shadow 'com.github.ReplayMod.JavaBlend:2.79.0:a0696f8' shadow 'com.github.ReplayMod.JavaBlend:2.79.0:a0696f8'
shadow "com.github.ReplayMod:ReplayStudio:b5539d1", shadeExclusions shadow "com.github.ReplayMod:ReplayStudio:6fc8e20", shadeExclusions
implementation(FABRIC ? dependencies.project(path: jGui.path, configuration: "namedElements") : jGui) { implementation(FABRIC ? dependencies.project(path: jGui.path, configuration: "namedElements") : jGui) {
transitive = false // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those transitive = false // FG 1.2 puts all MC deps into the compile configuration and we don't want to shade those

View File

@@ -59,6 +59,7 @@ import java.io.OutputStream;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.InvalidPathException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import java.nio.file.attribute.FileAttribute; import java.nio.file.attribute.FileAttribute;
@@ -185,7 +186,16 @@ public class Utils {
* Checks whether a given file name is actually usable with the file system / operating system at the given folder. * Checks whether a given file name is actually usable with the file system / operating system at the given folder.
*/ */
private static boolean isUsable(Path folder, String fileName) { private static boolean isUsable(Path folder, String fileName) {
Path path = folder.resolve(fileName); if (fileName.contains(folder.getFileSystem().getSeparator())) {
return false; // file name contains the name separator, definitely not usable
}
Path path;
try {
path = folder.resolve(fileName);
} catch (InvalidPathException e) {
return false; // file name contains invalid characters, definitely not usable
}
if (Files.exists(path)) { if (Files.exists(path)) {
return true; // if it already exits, it's definitely usable return true; // if it already exits, it's definitely usable
} }

View File

@@ -27,9 +27,9 @@ import net.minecraft.resource.ResourcePackSource;
//#if MC>=11400 //#if MC>=11400
import com.replaymod.render.mixin.MainWindowAccessor; import com.replaymod.render.mixin.MainWindowAccessor;
import net.minecraft.SharedConstants; import net.minecraft.SharedConstants;
import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.client.gui.widget.AbstractButtonWidget;
import net.minecraft.client.util.Window;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
@@ -106,17 +106,10 @@ public class MCVer {
public static void resizeMainWindow(MinecraftClient mc, int width, int height) { public static void resizeMainWindow(MinecraftClient mc, int width, int height) {
//#if MC>=11400 //#if MC>=11400
Framebuffer fb = mc.getFramebuffer(); Window window = mc.getWindow();
if (fb.viewportWidth != width || fb.viewportHeight != height) { MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) window;
fb.resize(width, height, false);
}
//noinspection ConstantConditions //noinspection ConstantConditions
MainWindowAccessor mainWindow = (MainWindowAccessor) (Object) mc.getWindow(); mainWindow.invokeOnFramebufferSizeChanged(window.getHandle(), width, height);
mainWindow.setFramebufferWidth(width);
mainWindow.setFramebufferHeight(height);
//#if MC>=11500
mc.gameRenderer.onResized(width, height);
//#endif
//#else //#else
//$$ if (width != mc.displayWidth || height != mc.displayHeight) { //$$ if (width != mc.displayWidth || height != mc.displayHeight) {
//$$ mc.resize(width, height); //$$ mc.resize(width, height);

View File

@@ -0,0 +1,148 @@
package com.replaymod.render.gui.progress;
import com.replaymod.render.hooks.MinecraftClientExt;
import com.replaymod.render.mixin.MainWindowAccessor;
import de.johni0702.minecraft.gui.function.Closeable;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.util.Window;
//#if MC>=11700
//$$ import net.minecraft.client.gl.WindowFramebuffer;
//#endif
public class VirtualWindow implements Closeable {
private final MinecraftClient mc;
private final Window window;
private final MainWindowAccessor acc;
private final Framebuffer guiFramebuffer;
private boolean isBound;
private int framebufferWidth, framebufferHeight;
private int gameWidth, gameHeight;
public VirtualWindow(MinecraftClient mc) {
this.mc = mc;
this.window = mc.getWindow();
this.acc = (MainWindowAccessor) (Object) this.window;
framebufferWidth = acc.getFramebufferWidth();
framebufferHeight = acc.getFramebufferHeight();
//#if MC>=11700
//$$ guiFramebuffer = new WindowFramebuffer(framebufferWidth, framebufferHeight);
//#else
guiFramebuffer = new Framebuffer(framebufferWidth, framebufferHeight, true
//#if MC>=11400
, false
//#endif
);
//#endif
MinecraftClientExt.get(mc).setWindowDelegate(this);
}
@Override
public void close() {
guiFramebuffer.delete();
MinecraftClientExt.get(mc).setWindowDelegate(null);
}
public void bind() {
gameWidth = acc.getFramebufferWidth();
gameHeight = acc.getFramebufferHeight();
acc.setFramebufferWidth(framebufferWidth);
acc.setFramebufferHeight(framebufferHeight);
applyScaleFactor();
isBound = true;
}
public void unbind() {
acc.setFramebufferWidth(gameWidth);
acc.setFramebufferHeight(gameHeight);
applyScaleFactor();
isBound = false;
}
public void beginWrite() {
guiFramebuffer.beginWrite(true);
}
public void endWrite() {
guiFramebuffer.endWrite();
}
public void flip() {
guiFramebuffer.draw(framebufferWidth, framebufferHeight);
//#if MC>=11500
window.swapBuffers();
//#else
//#if MC>=11400
//$$ window.setFullscreen(false);
//#else
//#if MC>=10800
//$$ mc.updateDisplay();
//#else
//$$ mc.resetSize();
//#endif
//#endif
//#endif
}
/**
* Updates the size of the window's framebuffer. Must only be called while this window is bound.
*/
public void onResolutionChanged(int newWidth, int newHeight) {
if (newWidth == 0 || newHeight == 0) {
// These can be zero on Windows if minimized.
// Creating zero-sized framebuffers however will throw an error, so we never want to switch to zero values.
return;
}
if (framebufferWidth == newWidth && framebufferHeight == newHeight) {
return; // size is unchanged, nothing to do
}
framebufferWidth = newWidth;
framebufferHeight = newHeight;
//#if MC>=11400
guiFramebuffer.resize(newWidth, newHeight
//#if MC>=11400
, false
//#endif
);
//#else
//$$ guiFramebuffer.createBindFramebuffer(newWidth, newHeight);
//#endif
applyScaleFactor();
if (mc.currentScreen != null) {
mc.currentScreen.resize(mc, window.getScaledWidth(), window.getScaledHeight());
}
}
private void applyScaleFactor() {
//#if MC>=11400
window.setScaleFactor(window.calculateScaleFactor(mc.options.guiScale, mc.forcesUnicodeFont()));
//#else
//$$ // Nothing to do, ScaledResolution re-computes the scale factor every time it is created
//#endif
}
public int getFramebufferWidth() {
return framebufferWidth;
}
public int getFramebufferHeight() {
return framebufferHeight;
}
public boolean isBound() {
return isBound;
}
}

View File

@@ -0,0 +1,12 @@
package com.replaymod.render.hooks;
import com.replaymod.render.gui.progress.VirtualWindow;
import net.minecraft.client.MinecraftClient;
public interface MinecraftClientExt {
void setWindowDelegate(VirtualWindow window);
static MinecraftClientExt get(MinecraftClient mc) {
return (MinecraftClientExt) mc;
}
}

View File

@@ -15,12 +15,6 @@ public interface MainWindowAccessor {
int getFramebufferHeight(); int getFramebufferHeight();
@Accessor @Accessor
void setFramebufferHeight(int value); void setFramebufferHeight(int value);
// FIXME preprocessor should be able to infer this mapping
// FIXME preprocessor should be able to remap this one when the mapping is given manually
//#if MC>=11500
@Invoker @Invoker
//#else void invokeOnFramebufferSizeChanged(long window, int width, int height);
//$$ @Invoker("method_4483")
//#endif
void invokeUpdateFramebufferSize();
} }

View File

@@ -1,5 +1,6 @@
package com.replaymod.render.mixin; package com.replaymod.render.mixin;
import com.mojang.blaze3d.platform.GlStateManager;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler; import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.render.BackgroundRenderer; import net.minecraft.client.render.BackgroundRenderer;
@@ -20,6 +21,17 @@ public abstract class Mixin_ChromaKeyDisableFog {
((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler(); ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler();
if (handler == null) return; if (handler == null) return;
if (handler.getSettings().getChromaKeyingColor() != null) { if (handler.getSettings().getChromaKeyingColor() != null) {
// Starting with 1.15, fog is no longer enabled in this method but is instead managed by the RenderLayer
// system (and with 1.17, they are enabled permanently / depend only on the shader). Therefore, cancelling
// this method is no longer sufficient, and we additionally also need to set the start value to get rid of
// fog (this doesn't hurt on 1.14 either).
// Note: This only becomes noticeable with Sodium because Vanilla would already set the start to max for
// unrelated reasons. But Sodium does some math which gives wrong results if end isn't greater than
// start, as would be the case in these cases. Sodium doing math is also the reason we don't set start
// equal to end (that'll result in undefined behavior because it sticks those into a smoothstep on old
// versions), and we don't set it to MAX_VALUE because that also gives wrong results.
GlStateManager.fogStart(1E10F);
GlStateManager.fogEnd(2E10F);
ci.cancel(); ci.cancel();
} }
} }

View File

@@ -83,6 +83,8 @@ public abstract class Mixin_Omnidirectional_Rotation {
//#else //#else
//$$ GL11.glRotatef(angle, x, y, 0); //$$ GL11.glRotatef(angle, x, y, 0);
//#endif //#endif
getMinecraft().worldRenderer.scheduleTerrainUpdate();
} }
//#if MC<11500 //#if MC<11500
//$$ if (getHandler() != null && getHandler().omnidirectional) { //$$ if (getHandler() != null && getHandler().omnidirectional) {

View File

@@ -0,0 +1,39 @@
package com.replaymod.render.mixin;
import com.replaymod.render.gui.progress.VirtualWindow;
import com.replaymod.render.hooks.MinecraftClientExt;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.util.Window;
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;
@Mixin(MinecraftClient.class)
public class Mixin_SuppressFramebufferResizeDuringRender implements MinecraftClientExt {
@Unique
private VirtualWindow windowDelegate;
@Override
public void setWindowDelegate(VirtualWindow window) {
this.windowDelegate = window;
}
//#if MC>=11400
@Inject(method = "onResolutionChanged", at = @At("HEAD"), cancellable = true)
//#else
//$$ @Inject(method = "resize", at = @At("HEAD"), cancellable = true)
//#endif
private void suppressResizeDuringRender(CallbackInfo ci) {
VirtualWindow delegate = this.windowDelegate;
if (delegate != null && delegate.isBound()) {
Window window = ((MinecraftClient) (Object) this).getWindow();
delegate.onResolutionChanged(window.getFramebufferWidth(), window.getFramebufferHeight());
ci.cancel();
}
}
}

View File

@@ -6,7 +6,6 @@ import com.replaymod.core.mixin.TimerAccessor;
import com.replaymod.core.utils.WrappedTimer; import com.replaymod.core.utils.WrappedTimer;
import com.replaymod.core.versions.MCVer; import com.replaymod.core.versions.MCVer;
import com.replaymod.pathing.player.AbstractTimelinePlayer; import com.replaymod.pathing.player.AbstractTimelinePlayer;
import com.replaymod.pathing.player.ReplayTimer;
import com.replaymod.pathing.properties.TimestampProperty; import com.replaymod.pathing.properties.TimestampProperty;
import com.replaymod.render.CameraPathExporter; import com.replaymod.render.CameraPathExporter;
import com.replaymod.render.PNGWriter; import com.replaymod.render.PNGWriter;
@@ -19,9 +18,9 @@ import com.replaymod.render.events.ReplayRenderCallback;
import com.replaymod.render.frame.BitmapFrame; import com.replaymod.render.frame.BitmapFrame;
import com.replaymod.render.gui.GuiRenderingDone; import com.replaymod.render.gui.GuiRenderingDone;
import com.replaymod.render.gui.GuiVideoRenderer; import com.replaymod.render.gui.GuiVideoRenderer;
import com.replaymod.render.gui.progress.VirtualWindow;
import com.replaymod.render.hooks.ForceChunkLoadingHook; import com.replaymod.render.hooks.ForceChunkLoadingHook;
import com.replaymod.render.metadata.MetadataInjector; import com.replaymod.render.metadata.MetadataInjector;
import com.replaymod.render.mixin.MainWindowAccessor;
import com.replaymod.render.mixin.WorldRendererAccessor; import com.replaymod.render.mixin.WorldRendererAccessor;
import com.replaymod.render.utils.FlawlessFrames; import com.replaymod.render.utils.FlawlessFrames;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
@@ -32,7 +31,6 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import com.mojang.blaze3d.platform.GLX; import com.mojang.blaze3d.platform.GLX;
import net.minecraft.client.gl.Framebuffer;
import net.minecraft.client.sound.PositionedSoundInstance; import net.minecraft.client.sound.PositionedSoundInstance;
import net.minecraft.client.util.Window; import net.minecraft.client.util.Window;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
@@ -43,7 +41,6 @@ import net.minecraft.client.render.RenderTickCounter;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
//#if MC>=11700 //#if MC>=11700
//$$ import net.minecraft.client.gl.WindowFramebuffer;
//$$ import net.minecraft.client.render.DiffuseLighting; //$$ import net.minecraft.client.render.DiffuseLighting;
//$$ import net.minecraft.util.math.Matrix4f; //$$ import net.minecraft.util.math.Matrix4f;
//#endif //#endif
@@ -113,15 +110,12 @@ public class VideoRenderer implements RenderInfo {
private int framesDone; private int framesDone;
private int totalFrames; private int totalFrames;
private final VirtualWindow guiWindow = new VirtualWindow(mc);
private final GuiVideoRenderer gui; private final GuiVideoRenderer gui;
private boolean paused; private boolean paused;
private boolean cancelled; private boolean cancelled;
private volatile Throwable failureCause; private volatile Throwable failureCause;
private Framebuffer guiFramebuffer;
private int displayWidth, displayHeight;
private int framebufferWidth, framebufferHeight;
public VideoRenderer(RenderSettings settings, ReplayHandler replayHandler, Timeline timeline) throws IOException { public VideoRenderer(RenderSettings settings, ReplayHandler replayHandler, Timeline timeline) throws IOException {
this.settings = settings; this.settings = settings;
this.replayHandler = replayHandler; this.replayHandler = replayHandler;
@@ -245,11 +239,7 @@ public class VideoRenderer implements RenderInfo {
@Override @Override
public float updateForNextFrame() { public float updateForNextFrame() {
// because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily // because the jGui lib uses Minecraft's displayWidth and displayHeight values, update these temporarily
MainWindowAccessor acc = (MainWindowAccessor) (Object) mc.getWindow(); guiWindow.bind();
int framebufferWidthBefore = acc.getFramebufferWidth();
int framebufferHeightBefore = acc.getFramebufferHeight();
acc.setFramebufferWidth(framebufferWidth);
acc.setFramebufferHeight(framebufferHeight);
if (!settings.isHighPerformance() || framesDone % fps == 0) { if (!settings.isHighPerformance() || framesDone % fps == 0) {
while (drawGui() && paused) { while (drawGui() && paused) {
@@ -290,8 +280,7 @@ public class VideoRenderer implements RenderInfo {
} }
// change Minecraft's display size back // change Minecraft's display size back
acc.setFramebufferWidth(framebufferWidthBefore); guiWindow.unbind();
acc.setFramebufferHeight(framebufferHeightBefore);
if (cameraPathExporter != null) { if (cameraPathExporter != null) {
cameraPathExporter.recordFrame(timer.tickDelta); cameraPathExporter.recordFrame(timer.tickDelta);
@@ -362,23 +351,9 @@ public class VideoRenderer implements RenderInfo {
cameraPathExporter.setup(totalFrames); cameraPathExporter.setup(totalFrames);
} }
updateDisplaySize();
updateFramebufferSize();
gui.toMinecraft().init(mc, mc.getWindow().getScaledWidth(), mc.getWindow().getScaledHeight()); gui.toMinecraft().init(mc, mc.getWindow().getScaledWidth(), mc.getWindow().getScaledHeight());
forceChunkLoadingHook = new ForceChunkLoadingHook(mc.worldRenderer); forceChunkLoadingHook = new ForceChunkLoadingHook(mc.worldRenderer);
// Set up our own framebuffer to render the GUI to
//#if MC>=11700
//$$ guiFramebuffer = new WindowFramebuffer(framebufferWidth, framebufferHeight);
//#else
guiFramebuffer = new Framebuffer(framebufferWidth, framebufferHeight, true
//#if MC>=11400
, false
//#endif
);
//#endif
} }
private void finish() { private void finish() {
@@ -388,6 +363,8 @@ public class VideoRenderer implements RenderInfo {
// Tear down of the timeline player might only happen the next tick after it was cancelled // Tear down of the timeline player might only happen the next tick after it was cancelled
timelinePlayer.onTick(); timelinePlayer.onTick();
guiWindow.close();
// FBOs are always used in 1.14+ // FBOs are always used in 1.14+
//#if MC<11400 //#if MC<11400
//$$ if (!OpenGlHelper.isFramebufferEnabled()) { //$$ if (!OpenGlHelper.isFramebufferEnabled()) {
@@ -427,7 +404,7 @@ public class VideoRenderer implements RenderInfo {
} }
// Finally, resize the Minecraft framebuffer to the actual width/height of the window // Finally, resize the Minecraft framebuffer to the actual width/height of the window
resizeMainWindow(mc, framebufferWidth, framebufferHeight); resizeMainWindow(mc, guiWindow.getFramebufferWidth(), guiWindow.getFramebufferHeight());
} }
private void executeTaskQueue() { private void executeTaskQueue() {
@@ -485,26 +462,6 @@ public class VideoRenderer implements RenderInfo {
return false; return false;
} }
// Check if display size has changes and force recalculate GUI framebuffer size.
if (displaySizeChanged()) {
updateDisplaySize();
((MainWindowAccessor) (Object) window).invokeUpdateFramebufferSize();
}
// Resize the GUI framebuffer if the display size changed
if (framebufferSizeChanged()) {
updateFramebufferSize();
//#if MC>=11400
guiFramebuffer.resize(framebufferWidth, framebufferHeight
//#if MC>=11400
, false
//#endif
);
//#else
//$$ guiFramebuffer.createBindFramebuffer(framebufferWidth, framebufferHeight);
//#endif
}
pushMatrix(); pushMatrix();
GlStateManager.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT GlStateManager.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
//#if MC>=11400 //#if MC>=11400
@@ -512,7 +469,7 @@ public class VideoRenderer implements RenderInfo {
//#endif //#endif
); );
GlStateManager.enableTexture(); GlStateManager.enableTexture();
guiFramebuffer.beginWrite(true); guiWindow.beginWrite();
//#if MC>=11500 //#if MC>=11500
RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC); RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC);
@@ -568,8 +525,8 @@ public class VideoRenderer implements RenderInfo {
//#endif //#endif
//#if MC>=11400 //#if MC>=11400
int mouseX = (int) mc.mouse.getX() * window.getScaledWidth() / displayWidth; int mouseX = (int) mc.mouse.getX() * window.getScaledWidth() / Math.max(window.getWidth(), 1);
int mouseY = (int) mc.mouse.getY() * window.getScaledHeight() / displayHeight; int mouseY = (int) mc.mouse.getY() * window.getScaledHeight() / Math.max(window.getHeight(), 1);
if (mc.getOverlay() != null) { if (mc.getOverlay() != null) {
Screen orgScreen = mc.currentScreen; Screen orgScreen = mc.currentScreen;
@@ -599,31 +556,12 @@ public class VideoRenderer implements RenderInfo {
//$$ gui.toMinecraft().drawScreen(mouseX, mouseY, 0); //$$ gui.toMinecraft().drawScreen(mouseX, mouseY, 0);
//#endif //#endif
guiFramebuffer.endWrite(); guiWindow.endWrite();
popMatrix(); popMatrix();
pushMatrix(); pushMatrix();
guiFramebuffer.draw(framebufferWidth, framebufferHeight); guiWindow.flip();
popMatrix(); popMatrix();
//#if MC>=11500
window.swapBuffers();
//#else
//#if MC>=11400
//$$ window.setFullscreen(false);
//#else
//$$ // if not in high performance mode, update the gui size if screen size changed
//$$ // otherwise just swap the progress gui to screen
//$$ if (settings.isHighPerformance()) {
//$$ Display.update();
//$$ } else {
//#if MC>=10800
//$$ mc.updateDisplay();
//#else
//$$ mc.resetSize();
//#endif
//$$ }
//#endif
//#endif
//#if MC>=11400 //#if MC>=11400
if (mc.mouse.isCursorLocked()) { if (mc.mouse.isCursorLocked()) {
mc.mouse.unlockCursor(); mc.mouse.unlockCursor();
@@ -638,33 +576,6 @@ public class VideoRenderer implements RenderInfo {
} while (true); } while (true);
} }
private boolean displaySizeChanged() {
int realWidth = mc.getWindow().getWidth();
int realHeight = mc.getWindow().getHeight();
return displayWidth != realWidth || displayHeight != realHeight;
}
private boolean framebufferSizeChanged() {
int realWidth = mc.getWindow().getFramebufferWidth();
int realHeight = mc.getWindow().getFramebufferHeight();
if (realWidth == 0 || realHeight == 0) {
// These can be zero on Windows if minimized.
// Creating zero-sized framebuffers however will throw an error, so we never want to switch to zero values.
return false;
}
return framebufferWidth != realWidth || framebufferHeight != realHeight;
}
private void updateDisplaySize() {
displayWidth = mc.getWindow().getWidth();
displayHeight = mc.getWindow().getHeight();
}
private void updateFramebufferSize() {
framebufferWidth = mc.getWindow().getFramebufferWidth();
framebufferHeight = mc.getWindow().getFramebufferHeight();
}
public int getFramesDone() { public int getFramesDone() {
return framesDone; return framesDone;
} }

View File

@@ -585,6 +585,12 @@ public class FullReplaySender extends ChannelDuplexHandler implements ReplaySend
//#else //#else
//$$ String channelName = packet.getChannelName(); //$$ String channelName = packet.getChannelName();
//#endif //#endif
String channelNameStr = channelName.toString();
if (channelNameStr.startsWith("fabric-screen-handler-api-v")) {
return null; // we do not want to show modded screens which got opened for the recording player
}
// On 1.14+ there's a dedicated OpenWrittenBookS2CPacket now // On 1.14+ there's a dedicated OpenWrittenBookS2CPacket now
//#if MC<11400 //#if MC<11400
//#if MC>=11400 //#if MC>=11400

View File

@@ -688,6 +688,7 @@ public class CameraEntity
//#if MC>=10904 //#if MC>=10904
cameraA.setItemStackMainHand(viewPlayerA != null ? viewPlayerA.getItemStackMainHand() : empty); cameraA.setItemStackMainHand(viewPlayerA != null ? viewPlayerA.getItemStackMainHand() : empty);
this.preferredHand = viewPlayer != null ? viewPlayer.preferredHand : Hand.MAIN_HAND; this.preferredHand = viewPlayer != null ? viewPlayer.preferredHand : Hand.MAIN_HAND;
this.activeItemStack = viewPlayer != null ? viewPlayer.getActiveItem() : empty;
cameraA.setActiveItemStackUseCount(viewPlayerA != null ? viewPlayerA.getActiveItemStackUseCount() : 0); cameraA.setActiveItemStackUseCount(viewPlayerA != null ? viewPlayerA.getActiveItemStackUseCount() : 0);
//#else //#else
//$$ cameraA.setItemInUse(viewPlayerA != null ? viewPlayerA.getItemInUse() : empty); //$$ cameraA.setItemInUse(viewPlayerA != null ? viewPlayerA.getItemInUse() : empty);

View File

@@ -21,6 +21,7 @@
"Mixin_StabilizeCamera", "Mixin_StabilizeCamera",
"Mixin_Stereoscopic_Camera", "Mixin_Stereoscopic_Camera",
"Mixin_Stereoscopic_HandRenderPass", "Mixin_Stereoscopic_HandRenderPass",
"Mixin_SuppressFramebufferResizeDuringRender",
//#if MC>=11600 //#if MC>=11600
"Mixin_AddIrisOdsShaderUniforms", "Mixin_AddIrisOdsShaderUniforms",
"Mixin_LoadIrisOdsShaderPack", "Mixin_LoadIrisOdsShaderPack",

View File

@@ -1 +1 @@
2.6.4 2.6.5

View File

@@ -8,7 +8,6 @@ import org.lwjgl.opengl.Display;
public class Window implements MainWindowAccessor { public class Window implements MainWindowAccessor {
private final Minecraft mc; private final Minecraft mc;
private ScaledResolution scaledResolution;
public Window(Minecraft mc) { public Window(Minecraft mc) {
this.mc = mc; this.mc = mc;
@@ -34,11 +33,6 @@ public class Window implements MainWindowAccessor {
mc.displayHeight = value; mc.displayHeight = value;
} }
@Override
public void invokeUpdateFramebufferSize() {
// no-op, pre-LWJGL3 MC doesn't differentiate between window and framebuffer size
}
public long getHandle() { public long getHandle() {
return 0; return 0;
} }
@@ -52,16 +46,11 @@ public class Window implements MainWindowAccessor {
} }
private ScaledResolution scaledResolution() { private ScaledResolution scaledResolution() {
ScaledResolution scaledResolution = this.scaledResolution; //#if MC>=10809
if (scaledResolution == null) { return new ScaledResolution(mc);
//#if MC>=10809 //#else
scaledResolution = new ScaledResolution(mc); //$$ return new ScaledResolution(mc, mc.displayWidth, mc.displayHeight);
//#else //#endif
//$$ scaledResolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight);
//#endif
this.scaledResolution = scaledResolution;
}
return scaledResolution;
} }
public int getScaledWidth() { public int getScaledWidth() {

View File

@@ -15,6 +15,4 @@ public interface MainWindowAccessor {
int getFramebufferHeight(); int getFramebufferHeight();
@Accessor("displayHeight") @Accessor("displayHeight")
void setFramebufferHeight(int value); void setFramebufferHeight(int value);
@Invoker
void invokeUpdateFramebufferSize();
} }

View File

@@ -181,6 +181,7 @@ net.minecraft.client.gui.screen.Screen hasShiftDown() isShiftKeyDown()
net.minecraft.client.gui.screen.Screen init() setWorldAndResolution() net.minecraft.client.gui.screen.Screen init() setWorldAndResolution()
net.minecraft.client.gui.screen.Screen minecraft mc net.minecraft.client.gui.screen.Screen minecraft mc
net.minecraft.client.gui.screen.Screen net.minecraft.client.gui.GuiScreen net.minecraft.client.gui.screen.Screen net.minecraft.client.gui.GuiScreen
net.minecraft.client.gui.screen.Screen resize() onResize()
net.minecraft.client.gui.screen.Screen passEvents allowUserInput net.minecraft.client.gui.screen.Screen passEvents allowUserInput
net.minecraft.client.gui.screen.Screen removed() onGuiClosed() net.minecraft.client.gui.screen.Screen removed() onGuiClosed()
net.minecraft.client.gui.screen.Screen renderBackground() drawDefaultBackground() net.minecraft.client.gui.screen.Screen renderBackground() drawDefaultBackground()

View File

@@ -1,3 +1,4 @@
net.minecraft.client.gui.GuiScreen onResize() func_175273_b()
net.minecraft.entity.player.EntityPlayer isWearing() func_175148_a() net.minecraft.entity.player.EntityPlayer isWearing() func_175148_a()
net.minecraft.client.renderer.WorldRenderer begin() startDrawing() net.minecraft.client.renderer.WorldRenderer begin() startDrawing()
net.minecraft.network.play.server.S38PacketPlayerListItem getAction() func_179768_b() net.minecraft.network.play.server.S38PacketPlayerListItem getAction() func_179768_b()

View File

@@ -1,4 +1,6 @@
com.mojang.blaze3d.systems.RenderSystem com.mojang.blaze3d.platform.GlStateManager com.mojang.blaze3d.systems.RenderSystem com.mojang.blaze3d.platform.GlStateManager
com.mojang.blaze3d.systems.RenderSystem setShaderFogStart() fogStart()
com.mojang.blaze3d.systems.RenderSystem setShaderFogEnd() fogEnd()
net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket getDimensionType() method_29445() net.minecraft.network.packet.s2c.play.PlayerRespawnS2CPacket getDimensionType() method_29445()
net.minecraft.entity.Entity getId() getEntityId() net.minecraft.entity.Entity getId() getEntityId()
net.minecraft.client.network.ClientPlayerEntity init() net.minecraft.entity.player.PlayerEntity afterSpawn() net.minecraft.client.network.ClientPlayerEntity init() net.minecraft.entity.player.PlayerEntity afterSpawn()