diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiVideoRenderer.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiVideoRenderer.java index 0c64ba0b..343c132e 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiVideoRenderer.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiVideoRenderer.java @@ -1,6 +1,7 @@ package eu.crushedpixel.replaymod.gui; import eu.crushedpixel.replaymod.gui.elements.GuiProgressBar; +import eu.crushedpixel.replaymod.utils.DurationUtils; import eu.crushedpixel.replaymod.video.VideoRenderer; import eu.crushedpixel.replaymod.video.frame.FrameRenderer; import net.minecraft.client.gui.GuiButton; @@ -26,6 +27,15 @@ public class GuiVideoRenderer extends GuiScreen { private GuiCheckBox previewCheckBox; private GuiProgressBar progressBar; + private int renderTimeTaken = 0; + private long prevRenderTime = -1; + + private int[] renderTimes = new int[50]; + private int currentIndex = 0; + + private int prevRenderedFrames = 0; + private int renderTimeLeft = 0; + public GuiVideoRenderer(VideoRenderer renderer) { this.renderer = renderer; } @@ -45,7 +55,7 @@ public class GuiVideoRenderer extends GuiScreen { text = PREVIEW; buttonList.add(previewCheckBox = new GuiCheckBox(0, (width - fontRendererObj.getStringWidth(text)) / 2 - 8, - pauseButton.yPosition - 10 - 20 - 10 - 5 , text, false)); + pauseButton.yPosition - 10 - 20 - 10 - 20 - 5 , text, false)); } @Override @@ -83,6 +93,48 @@ public class GuiVideoRenderer extends GuiScreen { @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { + long current = System.currentTimeMillis(); + + //calculate estimated time left + if(prevRenderTime == -1) { + prevRenderTime = current; + } + + int renderTime = (int)(current - prevRenderTime); + + if(!renderer.isPaused()) { + renderTimeTaken += renderTime; + } + + if(prevRenderedFrames < renderer.getFramesDone()) { + prevRenderedFrames = renderer.getFramesDone(); + + renderTimes[currentIndex] = renderTime; + + int validValues = 0; + + int totalTime = 0; + for(int i : renderTimes) { + if(i > 0) { + totalTime += i; + validValues++; + } + } + + float averageRenderTime = validValues > 0 ? totalTime / validValues : 0; + + prevRenderTime = current; + + //remaining render time in seconds + renderTimeLeft = Math.round((averageRenderTime * (renderer.getTotalFrames() - renderer.getFramesDone())) / 1000); + } + + currentIndex++; + if(currentIndex >= renderTimes.length) currentIndex = 0; + + String takenString = I18n.format("replaymod.gui.rendering.timetaken")+": "+DurationUtils.convertSecondsToString(renderTimeTaken/1000); + String leftString = I18n.format("replaymod.gui.rendering.timeleft")+": "+DurationUtils.convertSecondsToString(renderTimeLeft); + FrameRenderer frameRenderer = renderer.getFrameRenderer(); int centerX = width / 2; @@ -102,11 +154,17 @@ public class GuiVideoRenderer extends GuiScreen { int previewHeight = previewCheckBox.yPosition - 10 - 20; int previewY = previewCheckBox.yPosition - 10 - previewHeight; - if (previewCheckBox.isChecked()) { + if(previewCheckBox.isChecked()) { frameRenderer.renderPreview(previewX, previewY, previewWidth, previewHeight); } else { FrameRenderer.renderNoPreview(previewX, previewY, previewWidth, previewHeight); } + + drawString(fontRendererObj, takenString, 12, previewCheckBox.yPosition + 5 + 20, Color.WHITE.getRGB()); + drawString(fontRendererObj, leftString, width - 12 - fontRendererObj.getStringWidth(leftString), + previewCheckBox.yPosition + 5 + 20, Color.WHITE.getRGB()); + + super.drawScreen(mouseX, mouseY, partialTicks); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/utils/DurationUtils.java b/src/main/java/eu/crushedpixel/replaymod/utils/DurationUtils.java new file mode 100644 index 00000000..6e9a4b36 --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/utils/DurationUtils.java @@ -0,0 +1,17 @@ +package eu.crushedpixel.replaymod.utils; + +public class DurationUtils { + + public static String convertSecondsToString(int seconds) { + int hours = seconds/(60*60); + int min = seconds/60 - hours*60; + int sec = seconds - ((min*60) + (hours*60*60)); + + StringBuilder builder = new StringBuilder(); + if(hours > 0) builder.append(hours).append("h "); + if(min > 0 || hours > 0) builder.append(min).append("min "); + builder.append(sec).append("sec"); + + return builder.toString(); + } +} diff --git a/src/main/resources/assets/replaymod/lang/en_US.lang b/src/main/resources/assets/replaymod/lang/en_US.lang index c01e609e..94badfb0 100644 --- a/src/main/resources/assets/replaymod/lang/en_US.lang +++ b/src/main/resources/assets/replaymod/lang/en_US.lang @@ -276,6 +276,8 @@ replaymod.gui.rendering.cancel=Cancel Rendering replaymod.gui.rendering.cancel.callback=Are you sure? replaymod.gui.rendering.preview=Show Preview (Performance might suffer) replaymod.gui.rendering.progress=Frames rendered: %1$d / %2$d +replaymod.gui.rendering.timetaken=Render Time +replaymod.gui.rendering.timeleft=Time Left #Ingame Menu replaymod.gui.ingame.menu.addposkeyframe=Add Position Keyframe