Merge remote-tracking branch 'origin/develop' into snapshot

This commit is contained in:
Jonas Herzig
2020-06-28 22:07:49 +02:00
15 changed files with 238 additions and 265 deletions

View File

@@ -95,10 +95,9 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
}
// Update export arguments to match new Preset
exportArguments.setText(newPreset.getValue());
// If the user hasn't changed the output file by themselves,
if (!outputFileManuallySet) {
// generate a new output file name with updated file extension
outputFile = generateOutputFile(newPreset);
// Update output file ending
if (outputFile != null) {
outputFile = conformExtension(outputFile, newPreset);
outputFileButton.setLabel(outputFile.getName());
}
updateInputs();
@@ -125,15 +124,20 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
public final GuiButton outputFileButton = new GuiButton().setMinSize(new Dimension(0, 20)).onClick(new Runnable() {
@Override
public void run() {
GuiFileChooserPopup popup = GuiFileChooserPopup.openSaveGui(GuiRenderSettings.this, "replaymod.gui.save",
encodingPresetDropdown.getSelectedValue().getFileExtension());
popup.setFolder(outputFile.getParentFile());
popup.setFileName(outputFile.getName());
Futures.addCallback(
GuiFileChooserPopup.openSaveGui(GuiRenderSettings.this, "replaymod.gui.save",
encodingPresetDropdown.getSelectedValue().getFileExtension()).getFuture(),
popup.getFuture(),
new FutureCallback<File>() {
@Override
public void onSuccess(@Nullable File result) {
if (result != null) {
if (!result.getName().equals(outputFile.getName())) {
userDefinedOutputFileName = true;
}
outputFile = result;
outputFileManuallySet = true;
outputFileButton.setLabel(result.getName());
}
}
@@ -318,7 +322,7 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
private final ReplayHandler replayHandler;
private final Timeline timeline;
private File outputFile;
private boolean outputFileManuallySet;
private boolean userDefinedOutputFileName;
public GuiRenderSettings(ReplayHandler replayHandler, Timeline timeline) {
this.replayHandler = replayHandler;
@@ -500,14 +504,19 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
bitRateField.setValue(settings.getBitRate());
bitRateUnit.setSelected(0);
}
if (settings.getOutputFile() == null) {
outputFile = generateOutputFile(settings.getEncodingPreset());
outputFileManuallySet = false;
File savedOutputFile = settings.getOutputFile();
if (savedOutputFile == null || !savedOutputFile.getParentFile().exists()) {
this.outputFile = generateOutputFile(settings.getEncodingPreset());
userDefinedOutputFileName = false;
} else if (savedOutputFile.exists()) {
String name = generateOutputFile(settings.getEncodingPreset()).getName();
this.outputFile = new File(savedOutputFile.isDirectory() ? savedOutputFile : savedOutputFile.getParentFile(), name);
userDefinedOutputFileName = false;
} else {
outputFile = settings.getOutputFile();
outputFileManuallySet = true;
this.outputFile = conformExtension(savedOutputFile, settings.getEncodingPreset());
userDefinedOutputFileName = true;
}
outputFileButton.setLabel(outputFile.getName());
outputFileButton.setLabel(this.outputFile.getName());
nametagCheckbox.setChecked(settings.isRenderNameTags());
stabilizeYaw.setChecked(settings.isStabilizeYaw());
stabilizePitch.setChecked(settings.isStabilizePitch());
@@ -543,7 +552,7 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
videoHeight.getInteger(),
frameRateSlider.getValue() + 10,
bitRateField.getInteger() << (10 * bitRateUnit.getSelected()),
serialize ? null : outputFile,
serialize && !userDefinedOutputFileName ? outputFile.getParentFile() : outputFile,
nametagCheckbox.isChecked(),
stabilizeYaw.isChecked() && (serialize || stabilizeYaw.isEnabled()),
stabilizePitch.isChecked() && (serialize || stabilizePitch.isEnabled()),
@@ -564,6 +573,14 @@ public class GuiRenderSettings extends GuiScreen implements Closeable {
return new File(folder, fileName + "." + encodingPreset.getFileExtension());
}
protected File conformExtension(File file, RenderSettings.EncodingPreset preset) {
String name = file.getName();
if (name.contains(".")) {
name = name.substring(0, name.lastIndexOf('.'));
}
return new File(file.getParentFile(), name + "." + preset.getFileExtension());
}
protected Path getSettingsPath() {
return ReplayModRender.instance.getRenderSettingsPath();
}

View File

@@ -44,7 +44,9 @@ import org.lwjgl.opengl.GL11;
//#if MC>=11400
import com.replaymod.render.mixin.MainWindowAccessor;
import net.minecraft.client.gui.screen.Screen;
import org.lwjgl.glfw.GLFW;
import java.util.concurrent.CompletableFuture;
//#else
//$$ import net.minecraft.client.gui.ScaledResolution;
//$$ import org.lwjgl.input.Mouse;
@@ -219,7 +221,15 @@ public class VideoRenderer implements RenderInfo {
//#endif
if (!settings.isHighPerformance() || framesDone % fps == 0) {
drawGui();
while (drawGui() && paused) {
try {
//noinspection BusyWait
Thread.sleep(50);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}
// Updating the timer will cause the timeline player to update the game state
@@ -398,6 +408,20 @@ public class VideoRenderer implements RenderInfo {
private void executeTaskQueue() {
//#if MC>=11400
while (true) {
while (mc.overlay != null) {
drawGui();
((MinecraftMethodAccessor) mc).replayModExecuteTaskQueue();
}
CompletableFuture<Void> resourceReloadFuture = ((MinecraftAccessor) mc).getResourceReloadFuture();
if (resourceReloadFuture != null) {
((MinecraftAccessor) mc).setResourceReloadFuture(null);
mc.reloadResources().thenRun(() -> resourceReloadFuture.complete(null));
continue;
}
break;
}
((MCVer.MinecraftMethodAccessor) mc).replayModExecuteTaskQueue();
//#else
//$$ Queue<FutureTask<?>> scheduledTasks = ((MinecraftAccessor) mc).getScheduledTasks();
@@ -430,14 +454,14 @@ public class VideoRenderer implements RenderInfo {
//#endif
}
public void drawGui() {
public boolean drawGui() {
do {
//#if MC>=11400
if (GLFW.glfwWindowShouldClose(getWindow(mc).getHandle()) || ((MinecraftAccessor) mc).getCrashReporter() != null) {
//#else
//$$ if (Display.isCloseRequested() || ((MinecraftAccessor) mc).getCrashReporter() != null) {
//#endif
return;
return false;
}
// Resize the GUI framebuffer if the display size changed
@@ -510,12 +534,26 @@ public class VideoRenderer implements RenderInfo {
int mouseX = (int) mc.mouse.getX() * getWindow(mc).getScaledWidth() / displayWidth;
int mouseY = (int) mc.mouse.getY() * getWindow(mc).getScaledHeight() / displayHeight;
gui.toMinecraft().tick();
gui.toMinecraft().render(
//#if MC>=11600
//$$ new MatrixStack(),
//#endif
mouseX, mouseY, 0);
if (mc.overlay != null) {
Screen orgScreen = mc.currentScreen;
try {
mc.currentScreen = gui.toMinecraft();
mc.overlay.render(
//#if MC>=11600
//$$ new MatrixStack(),
//#endif
mouseX, mouseY, 0);
} finally {
mc.currentScreen = orgScreen;
}
} else {
gui.toMinecraft().tick();
gui.toMinecraft().render(
//#if MC>=11600
//$$ new MatrixStack(),
//#endif
mouseX, mouseY, 0);
}
//#else
//$$ int mouseX = Mouse.getX() * scaled.getScaledWidth() / mc.displayWidth;
//$$ int mouseY = scaled.getScaledHeight() - Mouse.getY() * scaled.getScaledHeight() / mc.displayHeight - 1;
@@ -558,15 +596,9 @@ public class VideoRenderer implements RenderInfo {
//$$ Mouse.setGrabbed(false);
//$$ }
//#endif
if (paused) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
} while (paused && !hasFailed() && !cancelled);
return !hasFailed() && !cancelled;
} while (true);
}
private boolean displaySizeChanged() {