diff --git a/src/components/blenderController.ts b/src/components/blenderController.ts index fcf9a14..b48042f 100644 --- a/src/components/blenderController.ts +++ b/src/components/blenderController.ts @@ -2,21 +2,16 @@ import { blenderPath, blenderScriptPath, templatePath, finsishedIconPath, dataPa import {spawn} from "child_process"; import logger from "./logger"; import { setBlenderLoading, setBlenderStatus } from "./ui/menu"; -import { setLogNumber, setPastTime, setRemainingTime, setRenderDisplayProgress, setStatus, setPastTimeNow, setRemainingTimeNow, addTerminalLine } from "./ui/renderingPage"; +import { setLogNumber, setStatus, addTerminalLine } from "./ui/renderingPage"; import {imageLoading, imageLoaded} from "./ui/settingsPage"; -import { getLogSize, getInOutSettings, getActiveProfile } from "./settings"; +import { getInOutSettings, getActiveProfile } from "./settings"; import { pageSetRendering, setProgress, openPage, Page } from "../renderer"; +import { setLog, setRenderProgress, startProgress, stopProgress } from "./progressController"; import { ipcRenderer } from "electron"; import path from 'path'; import fs from "fs"; // import { getDoNotDisturb } from "electron-notification-state"; -export const renderInfo = { - time: "0min 0sec", - startTime: 0, - endTime: 0 -} - const blenderStartString = [ templatePath, "--background", @@ -32,43 +27,6 @@ let renderingPicture = false; let renderingVideo = false; let waitingForRender = false; -let logPortionList:number[] = []; -let currentLogPortion = 0; - -const estimatedRenderPortion = 0.97; -function setRenderProgress(log:number, init:boolean, frameCount:number, frame:number) { - let progress = 0; - if(init) { - progress = logPortionList[log-1] * (frame / frameCount * (1 - estimatedRenderPortion)) + currentLogPortion; - } else { - progress = logPortionList[log-1] * (frame / frameCount * estimatedRenderPortion + (1 - estimatedRenderPortion)) + currentLogPortion; - } - setProgress(progress); - setRenderDisplayProgress(parseFloat((progress*100).toFixed(2))); - - const timeNow = new Date().getTime(); - const timeDiff = timeNow - renderInfo.startTime; - let timeDiffSeconds = timeDiff / 1000; - let timeDiffMinutes = 0; - while(timeDiffSeconds > 60) { - timeDiffMinutes++; - timeDiffSeconds -= 60; - } - renderInfo.time = timeDiffMinutes + "m " + timeDiffSeconds.toFixed(0) + "s"; - setPastTimeNow(renderInfo.time); - - if(progress > 0) { - const timeRemaining = (timeDiff / progress) * (1 - progress); - timeDiffSeconds = timeRemaining / 1000; - timeDiffMinutes = 0; - while(timeDiffSeconds > 60) { - timeDiffMinutes++; - timeDiffSeconds -= 60; - } - setRemainingTimeNow(timeDiffMinutes + "m " + timeDiffSeconds.toFixed(0) + "s"); - } -} - function getOutPath(log:string) { let fullOutPath = path.join(getInOutSettings().output, log.substring(log.lastIndexOf("\\")).replace(".csv", "."+getActiveProfile().videoFormat)); @@ -153,7 +111,7 @@ function startBlender() { } if(dataStr.includes("Finished") && renderingVideo) { pageSetRendering(false); - renderInfo.endTime = new Date().getTime(); + stopProgress(); if(lastFrame == frames) { openPage(Page.RenderFinish); ipcRenderer.send("renderFinished"); @@ -175,7 +133,7 @@ function startBlender() { if(dataStr.includes("Lognr:") && renderingVideo) { log = dataStr.split(":")[1]; if(log !== "1") { - currentLogPortion += logPortionList[parseInt(log)-2]; + setLog(parseInt(log)); } setLogNumber(log); } @@ -240,23 +198,6 @@ function blender(command:blenderCmd) { if(getInOutSettings().logs.length === 0) { logger.warningMSG("No log selected!"); } else { - currentLogPortion = 0; - - const logSizeList:number[] = []; - getInOutSettings().logs.forEach(function (value, index) { - logSizeList.push(getLogSize(index)); - }); - - let fullLogSize = 0; - for(let i = 0; i < logSizeList.length; i++) { - fullLogSize += logSizeList[i]; - } - - logPortionList = []; - logSizeList.forEach(function (value) { - logPortionList.push(value / fullLogSize); - }); - readyToAcceptCommand = false; renderingVideo = true; pageSetRendering(true); @@ -264,9 +205,7 @@ function blender(command:blenderCmd) { setBlenderLoading(true); blenderConsole.stdin.write("startRendering -- "+blenderArgs()+"\n"); - renderInfo.startTime = new Date().getTime(); - setPastTime("0min 0sec"); - setRemainingTime("calculating..."); + startProgress(); } } } else if(command === blenderCmd.stopRendering) { diff --git a/src/components/progressController.ts b/src/components/progressController.ts new file mode 100644 index 0000000..c1b0a7d --- /dev/null +++ b/src/components/progressController.ts @@ -0,0 +1,92 @@ +import {setProgress} from "../renderer"; +import {getLogSize} from "./logReader"; +import {getInOutSettings} from "./settings"; +import { setRenderDisplayProgress, setPastTimeNow, setRemainingTimeNow } from "./ui/renderingPage"; + +const estimatedRenderPortion = 0.97; + +const renderInfo = { + time: "0min 0sec", + startTime: 0, + endTime: 0 +} + +let logPortionList:number[] = []; +let currentLogPortion = 0; + +function setRenderProgress(log:number, init:boolean, frameCount:number, frame:number) { + let progress = 0; + if(init) { + progress = logPortionList[log-1] * (frame / frameCount * (1 - estimatedRenderPortion)) + currentLogPortion; + } else { + progress = logPortionList[log-1] * (frame / frameCount * estimatedRenderPortion + (1 - estimatedRenderPortion)) + currentLogPortion; + } + setProgress(progress); + setRenderDisplayProgress(parseFloat((progress*100).toFixed(2))); + + const timeNow = new Date().getTime(); + const timeDiff = timeNow - renderInfo.startTime; + let timeDiffSeconds = timeDiff / 1000; + let timeDiffMinutes = 0; + while(timeDiffSeconds > 60) { + timeDiffMinutes++; + timeDiffSeconds -= 60; + } + renderInfo.time = timeDiffMinutes + "m " + timeDiffSeconds.toFixed(0) + "s"; + setPastTimeNow(renderInfo.time); + + if(progress > 0) { + const timeRemaining = (timeDiff / progress) * (1 - progress); + timeDiffSeconds = timeRemaining / 1000; + timeDiffMinutes = 0; + while(timeDiffSeconds > 60) { + timeDiffMinutes++; + timeDiffSeconds -= 60; + } + setRemainingTimeNow(timeDiffMinutes + "m " + timeDiffSeconds.toFixed(0) + "s"); + } +} + +function resetRenderProgress() { + logPortionList = []; + currentLogPortion = 0; + + const logSizeList:number[] = []; + getInOutSettings().logs.forEach(function (value, index) { + logSizeList.push(getLogSize(index)); + }); + + let fullLogSize = 0; + for(let i = 0; i < logSizeList.length; i++) { + fullLogSize += logSizeList[i]; + } + + logSizeList.forEach(function (value) { + logPortionList.push(value / fullLogSize); + }); + + setPastTimeNow("0min 0sec"); + setRemainingTimeNow("calculating..."); +} + +function setLog(log:number) { + currentLogPortion += logPortionList[log-2]; +} + +function stopProgress() { + renderInfo.endTime = new Date().getTime(); +} + +function startProgress() { + renderInfo.startTime = new Date().getTime(); + resetRenderProgress(); +} + +export { + setRenderProgress, + resetRenderProgress, + setLog, + stopProgress, + startProgress, + renderInfo +} \ No newline at end of file diff --git a/src/components/settings.ts b/src/components/settings.ts index 3ec0dcf..05ec124 100644 --- a/src/components/settings.ts +++ b/src/components/settings.ts @@ -362,10 +362,6 @@ function getActiveProfile() { return activeProfile; } -function getLogSize(index:number) { - return fs.statSync(settingList.logs[index]).size; -} - function importProfile(importSucces:CallableFunction) { dialog.showOpenDialog({ properties: [ @@ -478,7 +474,6 @@ export { getInOutSettings, setShowRenderTerminal, getShowRenderTerminal, - getLogSize, importProfile, exportProfile, VideoFormat diff --git a/src/components/ui/renderFinishPage.tsx b/src/components/ui/renderFinishPage.tsx index e10067b..8c849a9 100644 --- a/src/components/ui/renderFinishPage.tsx +++ b/src/components/ui/renderFinishPage.tsx @@ -1,12 +1,13 @@ import React, { CSSProperties } from "react"; import {openPage, Page} from "../../renderer"; -import {renderInfo, outputArgs} from "../blenderController"; +import {outputArgs} from "../blenderController"; import openFolder from "../openFolder"; import {getInOutSettings, getActiveProfile} from "../settings"; import VideoPlayer from "./videoPlayer"; import path from 'path'; import {VideoJsPlayerOptions} from "video.js"; import {logList} from "../logReader"; +import {renderInfo} from "../progressController"; const detailsStyle:CSSProperties = { display: "flex",