var lastData = "Initialise..." var frames = "0"; var lastFrame = "0"; var logCount = 0; var fps = 25 var width = 540 var stickDistance = 5 var stickMode2 = true var log = '"None"' var output = "None" const statusDisplay = document.getElementById("status"); const fpsDisplay = document.getElementById("fpsInput"); const widthDistplay = document.getElementById("widthInput"); const stickDistanceDisplay = document.getElementById("stickDistanceInput"); const stickModeDisplay = document.getElementById("stickMode"); const logDisplay = document.getElementById("log"); const outputDisplay = document.getElementById("output"); const logNumberDisplay = document.getElementById("logNumber"); const logger = require('electron-log'); const fs = require("fs"); const formatXml = require("xml-formatter"); const {dialog, app} = require("@electron/remote"); const path = require('path'); const lineReplace = require('line-replace'); const dataFolder = app.getPath('userData'); const SettingFolder = path.join(dataFolder, "settings.xml"); const blenderPath = path.join("assets", "blender", "blender"); const templatePath = path.join("assets", "template.blend"); const blenderScriptPath = path.join("assets", "blenderScript.py"); lineReplace({ file: blenderScriptPath, line: 9, text: 'settings = ET.parse("' + SettingFolder.replaceAll('\\', '/') + '")', addNewLine: true, callback: ({error}) => { if(error != null) { statusDisplay.innerHTML = "Something went wrong! Check Logs."; statusDisplay.style.color = "red"; logger.error(error); } } }); logger.transports.console.format = "{h}:{i}:{s} {text}"; logger.transports.file.getFile(); logger.transports.file.resolvePath = () => path.join(dataFolder, "logs", "main.log"); function startRender() { const {exec} = require("child_process"); var blenderCons = exec('"' + blenderPath + '" "' + templatePath + '" --background --python "' + blenderScriptPath + '"', {maxBuffer: Infinity}); frames = "0"; lastFrame = "0"; statusDisplay.innerHTML = lastData = "Initialise..."; statusDisplay.style.color = "white"; logNumberDisplay.innerHTML = "Log 0/" + String(logCount); blenderCons.stdout.on("data", (data) => { var dataStr = String(data); logger.info(dataStr); if(dataStr.startsWith("Frames:")) { frames = dataStr.split(":")[1]; } else if(dataStr.startsWith("Fra:")) { lastFrame = dataStr.split(":")[1].split(" ")[0] lastData = "Render Frame " + lastFrame + "/" + frames; } else if(dataStr.startsWith("Finished")) { if(lastFrame == frames) { lastData = "Finished Render Successfully!" statusDisplay.style.color = "white"; } else { lastData = "Something went wrong! Check Logs." statusDisplay.style.color = "red"; } } else if(dataStr.includes("Blender quit")) { if(lastData != "Finished Render Successfully!") { lastData = "Something went wrong! Check Logs."; statusDisplay.style.color = "red"; } } else if(dataStr.startsWith("Init:")) { lastData = "Initialize Frame " + dataStr.split(":")[1] + "/" + frames; } else if(dataStr.startsWith("Lognr:")) { logNumberDisplay.innerHTML = "Log " + dataStr.split(":")[1] + "/" + String(logCount); } if(statusDisplay.innerHTML != lastData) { statusDisplay.innerHTML = lastData; } }); } function getXMLChild(doc, child) { return String(doc.getElementsByTagName(child)[0].childNodes[0].nodeValue); } function updateSettingDisplay() { fpsDisplay.value = String(fps); widthDistplay.value = String(width); stickDistanceDisplay.value = String(stickDistance); stickModeDisplay.checked = stickMode2; logDisplay.innerHTML = "Logs:
" + log.substring(1).slice(0, -1).replaceAll("\"\"", "
"); outputDisplay.innerHTML = "Output Folder: " + output; logCount = log.split("\"\"").length; logNumberDisplay.innerHTML = "Log 0/" + String(logCount); } function updateSettings() { var xmlStr = '' + String(fps) + '' + String(width) + '' + String(stickDistance) + '' + ((stickMode2)?"true":"false") + '' + log + '' + output + ''; fs.writeFile(SettingFolder, formatXml(xmlStr, {collapseContent: true}), function(err) { if(err) { statusDisplay.innerHTML = "Couldn't write Log! Check Logs."; statusDisplay.style.color = "red"; logger.error(err); } }); } fetch(SettingFolder).then(function(response){ return response.text(); }).then(function(data){ let parser = new DOMParser(); let xmlDoc = parser.parseFromString(data, 'text/xml'); fps = parseInt(getXMLChild(xmlDoc, "fps")); width = parseInt(getXMLChild(xmlDoc, "width")); stickDistance = parseInt(getXMLChild(xmlDoc, "stickDistance")); if(getXMLChild(xmlDoc, "stickMode2") == "false") { stickMode2 = false; } else { stickMode2 = true; } log = getXMLChild(xmlDoc, "log"); output = getXMLChild(xmlDoc, "output"); updateSettingDisplay(); }).catch(function(error) { logger.error(error); updateSettingDisplay(); updateSettings(); }); function openLog() { dialog.showOpenDialog({ properties: [ "multiSelections" ], filters: [ { name: "TX-Logs", extensions: [ "csv" ] } ] }).then(result => { logStr = ""; result.filePaths.forEach(value => { logStr += "\"" + String(value) + "\""; }); log = logStr; updateSettingDisplay(); updateSettings(); }).catch(err => { statusDisplay.innerHTML = "Something went wrong! Check Logs."; statusDisplay.style.color = "red"; logger.error(err); }); } function openVid() { dialog.showOpenDialog({ properties: [ "openDirectory" ] }).then(result => { output = String(result.filePaths); updateSettingDisplay(); updateSettings(); }).catch(err => { statusDisplay.innerHTML = "Something went wrong! Check Logs."; statusDisplay.style.color = "red"; logger.error(err); }); } function setFPS() { fps = parseInt(fpsDisplay.value); updateSettings(); } function setWidth() { width = parseInt(widthDistplay.value); updateSettings(); } function setStickDistance() { stickDistance = parseInt(stickDistanceDisplay.value); updateSettings(); } function setStickMode() { stickMode2 = stickModeDisplay.checked; updateSettings(); } function openOutputFolder() { require("child_process").exec('start "" "' + output + '"'); }