├── .gitattributes ├── .gitignore ├── BlenderRenderController ├── BlenderRenderController.sln └── BlenderRenderController │ ├── App.config │ ├── BlenderRenderController.csproj │ ├── MainForm.Designer.cs │ ├── MainForm.cs │ ├── MainForm.resx │ ├── Program.cs │ ├── Properties │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Resources.resx │ ├── Settings.Designer.cs │ └── Settings.settings │ ├── Scripts │ ├── get_project_info.py │ └── mixdown_audio.py │ ├── Settings.cs │ ├── json_info.Designer.cs │ ├── json_info.cs │ ├── json_info.resx │ └── resources │ ├── blender-icon.ico │ └── icon.txt ├── LICENSE.txt └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | build/ 21 | bld/ 22 | [Bb]in/ 23 | [Oo]bj/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | artifacts/ 46 | 47 | *_i.c 48 | *_p.c 49 | *_i.h 50 | *.ilk 51 | *.meta 52 | *.obj 53 | *.pch 54 | *.pdb 55 | *.pgc 56 | *.pgd 57 | *.rsp 58 | *.sbr 59 | *.tlb 60 | *.tli 61 | *.tlh 62 | *.tmp 63 | *.tmp_proj 64 | *.log 65 | *.vspscc 66 | *.vssscc 67 | .builds 68 | *.pidb 69 | *.svclog 70 | *.scc 71 | 72 | # Chutzpah Test files 73 | _Chutzpah* 74 | 75 | # Visual C++ cache files 76 | ipch/ 77 | *.aps 78 | *.ncb 79 | *.opensdf 80 | *.sdf 81 | *.cachefile 82 | 83 | # Visual Studio profiler 84 | *.psess 85 | *.vsp 86 | *.vspx 87 | *.sap 88 | 89 | # TFS 2012 Local Workspace 90 | $tf/ 91 | 92 | # Guidance Automation Toolkit 93 | *.gpState 94 | 95 | # ReSharper is a .NET coding add-in 96 | _ReSharper*/ 97 | *.[Rr]e[Ss]harper 98 | *.DotSettings.user 99 | 100 | # JustCode is a .NET coding add-in 101 | .JustCode 102 | 103 | # TeamCity is a build add-in 104 | _TeamCity* 105 | 106 | # DotCover is a Code Coverage Tool 107 | *.dotCover 108 | 109 | # NCrunch 110 | _NCrunch_* 111 | .*crunch*.local.xml 112 | nCrunchTemp_* 113 | 114 | # MightyMoose 115 | *.mm.* 116 | AutoTest.Net/ 117 | 118 | # Web workbench (sass) 119 | .sass-cache/ 120 | 121 | # Installshield output folder 122 | [Ee]xpress/ 123 | 124 | # DocProject is a documentation generator add-in 125 | DocProject/buildhelp/ 126 | DocProject/Help/*.HxT 127 | DocProject/Help/*.HxC 128 | DocProject/Help/*.hhc 129 | DocProject/Help/*.hhk 130 | DocProject/Help/*.hhp 131 | DocProject/Help/Html2 132 | DocProject/Help/html 133 | 134 | # Click-Once directory 135 | publish/ 136 | 137 | # Publish Web Output 138 | *.[Pp]ublish.xml 139 | *.azurePubxml 140 | # TODO: Comment the next line if you want to checkin your web deploy settings 141 | # but database connection strings (with potential passwords) will be unencrypted 142 | *.pubxml 143 | *.publishproj 144 | 145 | # NuGet Packages 146 | *.nupkg 147 | # The packages folder can be ignored because of Package Restore 148 | **/packages/* 149 | # except build/, which is used as an MSBuild target. 150 | !**/packages/build/ 151 | # Uncomment if necessary however generally it will be regenerated when needed 152 | #!**/packages/repositories.config 153 | 154 | # Windows Azure Build Output 155 | csx/ 156 | *.build.csdef 157 | 158 | # Windows Azure Emulator 159 | efc/ 160 | rfc/ 161 | 162 | # Windows Store app package directory 163 | AppPackages/ 164 | 165 | # Visual Studio cache files 166 | # files ending in .cache can be ignored 167 | *.[Cc]ache 168 | # but keep track of directories ending in .cache 169 | !*.[Cc]ache/ 170 | 171 | # Others 172 | ClientBin/ 173 | [Ss]tyle[Cc]op.* 174 | ~$* 175 | *~ 176 | *.dbmdl 177 | *.dbproj.schemaview 178 | *.pfx 179 | *.publishsettings 180 | node_modules/ 181 | orleans.codegen.cs 182 | 183 | # RIA/Silverlight projects 184 | Generated_Code/ 185 | 186 | # Backup & report files from converting an old project file 187 | # to a newer Visual Studio version. Backup files are not needed, 188 | # because we have git ;-) 189 | _UpgradeReport_Files/ 190 | Backup*/ 191 | UpgradeLog*.XML 192 | UpgradeLog*.htm 193 | 194 | # SQL Server files 195 | *.mdf 196 | *.ldf 197 | 198 | # Business Intelligence projects 199 | *.rdl.data 200 | *.bim.layout 201 | *.bim_*.settings 202 | 203 | # Microsoft Fakes 204 | FakesAssemblies/ 205 | 206 | # GhostDoc plugin setting file 207 | *.GhostDoc.xml 208 | 209 | # Node.js Tools for Visual Studio 210 | .ntvs_analysis.dat 211 | 212 | # Visual Studio 6 build log 213 | *.plg 214 | 215 | # Visual Studio 6 workspace options file 216 | *.opt 217 | 218 | # Visual Studio LightSwitch build output 219 | **/*.HTMLClient/GeneratedArtifacts 220 | **/*.DesktopClient/GeneratedArtifacts 221 | **/*.DesktopClient/ModelManifest.xml 222 | **/*.Server/GeneratedArtifacts 223 | **/*.Server/ModelManifest.xml 224 | _Pvt_Extensions 225 | 226 | # Paket dependency manager 227 | .paket/paket.exe 228 | 229 | # FAKE - F# Make 230 | .fake/ 231 | 232 | # ========================= 233 | # Operating System Files 234 | # ========================= 235 | 236 | # OSX 237 | # ========================= 238 | 239 | .DS_Store 240 | .AppleDouble 241 | .LSOverride 242 | 243 | # Thumbnails 244 | ._* 245 | 246 | # Files that might appear in the root of a volume 247 | .DocumentRevisions-V100 248 | .fseventsd 249 | .Spotlight-V100 250 | .TemporaryItems 251 | .Trashes 252 | .VolumeIcon.icns 253 | 254 | # Directories potentially created on remote AFP share 255 | .AppleDB 256 | .AppleDesktop 257 | Network Trash Folder 258 | Temporary Items 259 | .apdisk 260 | 261 | # Windows 262 | # ========================= 263 | 264 | # Windows image file caches 265 | Thumbs.db 266 | ehthumbs.db 267 | 268 | # Folder config file 269 | Desktop.ini 270 | 271 | # Recycle Bin used on file shares 272 | $RECYCLE.BIN/ 273 | 274 | # Windows Installer files 275 | *.cab 276 | *.msi 277 | *.msm 278 | *.msp 279 | 280 | # Windows shortcuts 281 | *.lnk 282 | /BlenderRenderController/BlenderRenderController/bkp.txt 283 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.23107.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlenderRenderController", "BlenderRenderController\BlenderRenderController.csproj", "{B050DD69-B2BE-4F42-8D4E-23B7A7EFF2E5}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {B050DD69-B2BE-4F42-8D4E-23B7A7EFF2E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {B050DD69-B2BE-4F42-8D4E-23B7A7EFF2E5}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {B050DD69-B2BE-4F42-8D4E-23B7A7EFF2E5}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {B050DD69-B2BE-4F42-8D4E-23B7A7EFF2E5}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/BlenderRenderController.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {B050DD69-B2BE-4F42-8D4E-23B7A7EFF2E5} 8 | WinExe 9 | Properties 10 | BlenderRenderController 11 | BlenderRenderController 12 | v4.5 13 | 512 14 | true 15 | 16 | false 17 | E:\Programas\BlenderRenderController\git\ 18 | true 19 | Disk 20 | false 21 | Foreground 22 | 7 23 | Days 24 | false 25 | false 26 | true 27 | 0 28 | 1.0.0.%2a 29 | false 30 | true 31 | 32 | 33 | AnyCPU 34 | true 35 | full 36 | false 37 | bin\Debug\ 38 | DEBUG;TRACE 39 | prompt 40 | 4 41 | 42 | 43 | AnyCPU 44 | pdbonly 45 | true 46 | bin\Release\ 47 | TRACE 48 | prompt 49 | 4 50 | 51 | 52 | resources\blender-icon.ico 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | Form 71 | 72 | 73 | json_info.cs 74 | 75 | 76 | Form 77 | 78 | 79 | MainForm.cs 80 | 81 | 82 | 83 | 84 | 85 | json_info.cs 86 | 87 | 88 | MainForm.cs 89 | 90 | 91 | ResXFileCodeGenerator 92 | Resources.Designer.cs 93 | Designer 94 | 95 | 96 | True 97 | Resources.resx 98 | True 99 | 100 | 101 | README.md 102 | 103 | 104 | SettingsSingleFileGenerator 105 | Settings.Designer.cs 106 | 107 | 108 | True 109 | Settings.settings 110 | True 111 | 112 | 113 | 114 | 115 | Designer 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | PreserveNewest 124 | 125 | 126 | PreserveNewest 127 | 128 | 129 | 130 | 131 | False 132 | Microsoft .NET Framework 4.5 %28x86 and x64%29 133 | true 134 | 135 | 136 | False 137 | .NET Framework 3.5 SP1 138 | false 139 | 140 | 141 | 142 | 149 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/MainForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace BlenderRenderController 2 | { 3 | partial class MainForm 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.components = new System.ComponentModel.Container(); 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); 33 | this.renderSegmentButton = new System.Windows.Forms.Button(); 34 | this.blendFileBrowseButton = new System.Windows.Forms.Button(); 35 | this.renderProgressBar = new System.Windows.Forms.ProgressBar(); 36 | this.blendFilePathTextBox = new System.Windows.Forms.TextBox(); 37 | this.startFrameNumericUpDown = new System.Windows.Forms.NumericUpDown(); 38 | this.endFrameNumericUpDown = new System.Windows.Forms.NumericUpDown(); 39 | this.startFrameLabel = new System.Windows.Forms.Label(); 40 | this.endFrameLabel = new System.Windows.Forms.Label(); 41 | this.blendFileLabel = new System.Windows.Forms.Label(); 42 | this.partsFolderBrowseButton = new System.Windows.Forms.Button(); 43 | this.partsFolderPathTextBox = new System.Windows.Forms.TextBox(); 44 | this.partsFolderLabel = new System.Windows.Forms.Label(); 45 | this.rendererLabel = new System.Windows.Forms.Label(); 46 | this.rendererComboBox = new System.Windows.Forms.ComboBox(); 47 | this.progressLabel = new System.Windows.Forms.Label(); 48 | this.nextChunkButton = new System.Windows.Forms.Button(); 49 | this.prevChunkButton = new System.Windows.Forms.Button(); 50 | this.totalFrameCountLabel = new System.Windows.Forms.Label(); 51 | this.totalFrameCountNumericUpDown = new System.Windows.Forms.NumericUpDown(); 52 | this.processCountNumericUpDown = new System.Windows.Forms.NumericUpDown(); 53 | this.processCountLabel = new System.Windows.Forms.Label(); 54 | this.renderAllButton = new System.Windows.Forms.Button(); 55 | this.concatenatePartsButton = new System.Windows.Forms.Button(); 56 | this.ReadBlenderData = new System.Windows.Forms.Button(); 57 | this.MixdownAudio = new System.Windows.Forms.Button(); 58 | this.TotalTime = new System.Windows.Forms.Label(); 59 | this.menuStrip1 = new System.Windows.Forms.MenuStrip(); 60 | this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 61 | this.tipsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 62 | this.autocombineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 63 | this.debugShow = new System.Windows.Forms.ToolStripMenuItem(); 64 | this.speToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); 65 | this.visitGithubPageToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 66 | this.isti115ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 67 | this.meTwentyFiveToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 68 | this.redRaptor93ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 69 | this.jendabekToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 70 | this.infoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 71 | this.readmeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 72 | this.jsonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 73 | this.debugToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 74 | this.deleteJsonToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 75 | this.cMDArgsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); 76 | this.label1 = new System.Windows.Forms.Label(); 77 | this.infoPanel = new System.Windows.Forms.Panel(); 78 | this.outFolderPathTextBox = new System.Windows.Forms.TextBox(); 79 | this.label4 = new System.Windows.Forms.Label(); 80 | this.infoNoScenes = new System.Windows.Forms.TextBox(); 81 | this.infoActiveScene = new System.Windows.Forms.TextBox(); 82 | this.label3 = new System.Windows.Forms.Label(); 83 | this.label2 = new System.Windows.Forms.Label(); 84 | this.activeWarn = new System.Windows.Forms.ToolTip(this.components); 85 | this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); 86 | this.ajustOutDir = new System.Windows.Forms.CheckBox(); 87 | this.label5 = new System.Windows.Forms.Label(); 88 | this.label6 = new System.Windows.Forms.Label(); 89 | this.line = new System.Windows.Forms.Label(); 90 | this.line2 = new System.Windows.Forms.Label(); 91 | this.mergeAudioButton = new System.Windows.Forms.Button(); 92 | this.label7 = new System.Windows.Forms.Label(); 93 | this.label8 = new System.Windows.Forms.Label(); 94 | this.label9 = new System.Windows.Forms.Label(); 95 | this.label10 = new System.Windows.Forms.Label(); 96 | this.label11 = new System.Windows.Forms.Label(); 97 | this.label12 = new System.Windows.Forms.Label(); 98 | ((System.ComponentModel.ISupportInitialize)(this.startFrameNumericUpDown)).BeginInit(); 99 | ((System.ComponentModel.ISupportInitialize)(this.endFrameNumericUpDown)).BeginInit(); 100 | ((System.ComponentModel.ISupportInitialize)(this.totalFrameCountNumericUpDown)).BeginInit(); 101 | ((System.ComponentModel.ISupportInitialize)(this.processCountNumericUpDown)).BeginInit(); 102 | this.menuStrip1.SuspendLayout(); 103 | this.infoPanel.SuspendLayout(); 104 | this.SuspendLayout(); 105 | // 106 | // renderSegmentButton 107 | // 108 | this.renderSegmentButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F); 109 | this.renderSegmentButton.Location = new System.Drawing.Point(276, 294); 110 | this.renderSegmentButton.Name = "renderSegmentButton"; 111 | this.renderSegmentButton.Size = new System.Drawing.Size(127, 39); 112 | this.renderSegmentButton.TabIndex = 0; 113 | this.renderSegmentButton.Text = "Render segment"; 114 | this.toolTip1.SetToolTip(this.renderSegmentButton, "Render current segment"); 115 | this.renderSegmentButton.UseVisualStyleBackColor = true; 116 | this.renderSegmentButton.Click += new System.EventHandler(this.renderSegmentButton_Click); 117 | // 118 | // blendFileBrowseButton 119 | // 120 | this.blendFileBrowseButton.Location = new System.Drawing.Point(565, 69); 121 | this.blendFileBrowseButton.Name = "blendFileBrowseButton"; 122 | this.blendFileBrowseButton.Size = new System.Drawing.Size(76, 27); 123 | this.blendFileBrowseButton.TabIndex = 1; 124 | this.blendFileBrowseButton.Text = "Browse"; 125 | this.blendFileBrowseButton.UseVisualStyleBackColor = true; 126 | this.blendFileBrowseButton.Click += new System.EventHandler(this.blendFileBrowseButton_Click); 127 | // 128 | // renderProgressBar 129 | // 130 | this.renderProgressBar.Location = new System.Drawing.Point(37, 343); 131 | this.renderProgressBar.Name = "renderProgressBar"; 132 | this.renderProgressBar.Size = new System.Drawing.Size(604, 23); 133 | this.renderProgressBar.Step = 1; 134 | this.renderProgressBar.TabIndex = 2; 135 | this.toolTip1.SetToolTip(this.renderProgressBar, "Progress bar"); 136 | // 137 | // blendFilePathTextBox 138 | // 139 | this.blendFilePathTextBox.Location = new System.Drawing.Point(76, 72); 140 | this.blendFilePathTextBox.Name = "blendFilePathTextBox"; 141 | this.blendFilePathTextBox.Size = new System.Drawing.Size(482, 20); 142 | this.blendFilePathTextBox.TabIndex = 3; 143 | // 144 | // startFrameNumericUpDown 145 | // 146 | this.startFrameNumericUpDown.Location = new System.Drawing.Point(86, 233); 147 | this.startFrameNumericUpDown.Maximum = new decimal(new int[] { 148 | 1000000, 149 | 0, 150 | 0, 151 | 0}); 152 | this.startFrameNumericUpDown.Name = "startFrameNumericUpDown"; 153 | this.startFrameNumericUpDown.Size = new System.Drawing.Size(78, 20); 154 | this.startFrameNumericUpDown.TabIndex = 4; 155 | this.toolTip1.SetToolTip(this.startFrameNumericUpDown, "Segment\'s starting frame"); 156 | this.startFrameNumericUpDown.Value = new decimal(new int[] { 157 | 1, 158 | 0, 159 | 0, 160 | 0}); 161 | // 162 | // endFrameNumericUpDown 163 | // 164 | this.endFrameNumericUpDown.Location = new System.Drawing.Point(86, 266); 165 | this.endFrameNumericUpDown.Maximum = new decimal(new int[] { 166 | 1000000, 167 | 0, 168 | 0, 169 | 0}); 170 | this.endFrameNumericUpDown.Minimum = new decimal(new int[] { 171 | 1, 172 | 0, 173 | 0, 174 | 0}); 175 | this.endFrameNumericUpDown.Name = "endFrameNumericUpDown"; 176 | this.endFrameNumericUpDown.Size = new System.Drawing.Size(78, 20); 177 | this.endFrameNumericUpDown.TabIndex = 5; 178 | this.toolTip1.SetToolTip(this.endFrameNumericUpDown, "Segment\'s end frame"); 179 | this.endFrameNumericUpDown.Value = new decimal(new int[] { 180 | 3000, 181 | 0, 182 | 0, 183 | 0}); 184 | // 185 | // startFrameLabel 186 | // 187 | this.startFrameLabel.AutoSize = true; 188 | this.startFrameLabel.Location = new System.Drawing.Point(19, 235); 189 | this.startFrameLabel.Name = "startFrameLabel"; 190 | this.startFrameLabel.Size = new System.Drawing.Size(61, 13); 191 | this.startFrameLabel.TabIndex = 6; 192 | this.startFrameLabel.Text = "Start frame:"; 193 | this.toolTip1.SetToolTip(this.startFrameLabel, "Segment\'s starting frame"); 194 | // 195 | // endFrameLabel 196 | // 197 | this.endFrameLabel.AutoSize = true; 198 | this.endFrameLabel.Location = new System.Drawing.Point(19, 268); 199 | this.endFrameLabel.Name = "endFrameLabel"; 200 | this.endFrameLabel.Size = new System.Drawing.Size(58, 13); 201 | this.endFrameLabel.TabIndex = 7; 202 | this.endFrameLabel.Text = "End frame:"; 203 | this.toolTip1.SetToolTip(this.endFrameLabel, "Segment\'s end frame"); 204 | // 205 | // blendFileLabel 206 | // 207 | this.blendFileLabel.AutoSize = true; 208 | this.blendFileLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F); 209 | this.blendFileLabel.Location = new System.Drawing.Point(6, 73); 210 | this.blendFileLabel.Name = "blendFileLabel"; 211 | this.blendFileLabel.Size = new System.Drawing.Size(61, 15); 212 | this.blendFileLabel.TabIndex = 8; 213 | this.blendFileLabel.Text = "Blend file:"; 214 | // 215 | // partsFolderBrowseButton 216 | // 217 | this.partsFolderBrowseButton.Location = new System.Drawing.Point(564, 403); 218 | this.partsFolderBrowseButton.Name = "partsFolderBrowseButton"; 219 | this.partsFolderBrowseButton.Size = new System.Drawing.Size(76, 27); 220 | this.partsFolderBrowseButton.TabIndex = 1; 221 | this.partsFolderBrowseButton.Text = "Browse"; 222 | this.partsFolderBrowseButton.UseVisualStyleBackColor = true; 223 | this.partsFolderBrowseButton.Click += new System.EventHandler(this.partsFolderBrowseButton_Click); 224 | // 225 | // partsFolderPathTextBox 226 | // 227 | this.partsFolderPathTextBox.Location = new System.Drawing.Point(111, 406); 228 | this.partsFolderPathTextBox.Name = "partsFolderPathTextBox"; 229 | this.partsFolderPathTextBox.Size = new System.Drawing.Size(447, 20); 230 | this.partsFolderPathTextBox.TabIndex = 3; 231 | this.partsFolderPathTextBox.TextChanged += new System.EventHandler(this.outFolderPathTextBox_TextChanged); 232 | // 233 | // partsFolderLabel 234 | // 235 | this.partsFolderLabel.AutoSize = true; 236 | this.partsFolderLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 237 | this.partsFolderLabel.Location = new System.Drawing.Point(33, 408); 238 | this.partsFolderLabel.Name = "partsFolderLabel"; 239 | this.partsFolderLabel.Size = new System.Drawing.Size(72, 15); 240 | this.partsFolderLabel.TabIndex = 8; 241 | this.partsFolderLabel.Text = "Parts folder:"; 242 | // 243 | // rendererLabel 244 | // 245 | this.rendererLabel.AutoSize = true; 246 | this.rendererLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 247 | this.rendererLabel.Location = new System.Drawing.Point(421, 264); 248 | this.rendererLabel.Name = "rendererLabel"; 249 | this.rendererLabel.Size = new System.Drawing.Size(62, 15); 250 | this.rendererLabel.TabIndex = 9; 251 | this.rendererLabel.Text = "Renderer:"; 252 | // 253 | // rendererComboBox 254 | // 255 | this.rendererComboBox.FormattingEnabled = true; 256 | this.rendererComboBox.Items.AddRange(new object[] { 257 | "BLENDER_EEVEE", 258 | "BLENDER_WORKBENCH", 259 | "BLENDER_RENDER", 260 | "CYCLES"}); 261 | this.rendererComboBox.Location = new System.Drawing.Point(489, 263); 262 | this.rendererComboBox.Name = "rendererComboBox"; 263 | this.rendererComboBox.Size = new System.Drawing.Size(134, 21); 264 | this.rendererComboBox.TabIndex = 10; 265 | this.rendererComboBox.Text = ""; 266 | // 267 | // progressLabel 268 | // 269 | this.progressLabel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft; 270 | this.progressLabel.Location = new System.Drawing.Point(170, 313); 271 | this.progressLabel.Name = "progressLabel"; 272 | this.progressLabel.Size = new System.Drawing.Size(53, 23); 273 | this.progressLabel.TabIndex = 11; 274 | this.progressLabel.Text = "0/0"; 275 | this.progressLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; 276 | this.toolTip1.SetToolTip(this.progressLabel, "Progress"); 277 | this.progressLabel.Visible = false; 278 | // 279 | // nextChunkButton 280 | // 281 | this.nextChunkButton.Location = new System.Drawing.Point(299, 259); 282 | this.nextChunkButton.Name = "nextChunkButton"; 283 | this.nextChunkButton.Size = new System.Drawing.Size(74, 27); 284 | this.nextChunkButton.TabIndex = 12; 285 | this.nextChunkButton.Text = "Next chunk"; 286 | this.toolTip1.SetToolTip(this.nextChunkButton, "Segment select"); 287 | this.nextChunkButton.UseVisualStyleBackColor = true; 288 | this.nextChunkButton.Click += new System.EventHandler(this.nextChunkButton_Click); 289 | // 290 | // prevChunkButton 291 | // 292 | this.prevChunkButton.Location = new System.Drawing.Point(299, 226); 293 | this.prevChunkButton.Name = "prevChunkButton"; 294 | this.prevChunkButton.Size = new System.Drawing.Size(74, 27); 295 | this.prevChunkButton.TabIndex = 12; 296 | this.prevChunkButton.Text = "Prev chunk"; 297 | this.toolTip1.SetToolTip(this.prevChunkButton, "Segment select"); 298 | this.prevChunkButton.UseVisualStyleBackColor = true; 299 | this.prevChunkButton.Click += new System.EventHandler(this.prevChunkButton_Click); 300 | // 301 | // totalFrameCountLabel 302 | // 303 | this.totalFrameCountLabel.AutoSize = true; 304 | this.totalFrameCountLabel.Location = new System.Drawing.Point(179, 246); 305 | this.totalFrameCountLabel.Name = "totalFrameCountLabel"; 306 | this.totalFrameCountLabel.Size = new System.Drawing.Size(93, 13); 307 | this.totalFrameCountLabel.TabIndex = 13; 308 | this.totalFrameCountLabel.Text = "Total frame count:"; 309 | this.toolTip1.SetToolTip(this.totalFrameCountLabel, "Project\'s end frame"); 310 | // 311 | // totalFrameCountNumericUpDown 312 | // 313 | this.totalFrameCountNumericUpDown.Location = new System.Drawing.Point(182, 266); 314 | this.totalFrameCountNumericUpDown.Maximum = new decimal(new int[] { 315 | 1000000, 316 | 0, 317 | 0, 318 | 0}); 319 | this.totalFrameCountNumericUpDown.Minimum = new decimal(new int[] { 320 | 1, 321 | 0, 322 | 0, 323 | 0}); 324 | this.totalFrameCountNumericUpDown.Name = "totalFrameCountNumericUpDown"; 325 | this.totalFrameCountNumericUpDown.Size = new System.Drawing.Size(90, 20); 326 | this.totalFrameCountNumericUpDown.TabIndex = 5; 327 | this.toolTip1.SetToolTip(this.totalFrameCountNumericUpDown, "Project\'s end frame"); 328 | this.totalFrameCountNumericUpDown.Value = new decimal(new int[] { 329 | 3000, 330 | 0, 331 | 0, 332 | 0}); 333 | // 334 | // processCountNumericUpDown 335 | // 336 | this.processCountNumericUpDown.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 337 | this.processCountNumericUpDown.Location = new System.Drawing.Point(514, 229); 338 | this.processCountNumericUpDown.Name = "processCountNumericUpDown"; 339 | this.processCountNumericUpDown.Size = new System.Drawing.Size(44, 21); 340 | this.processCountNumericUpDown.TabIndex = 14; 341 | this.toolTip1.SetToolTip(this.processCountNumericUpDown, "N# of processes. For best results set acording to \r\nhow many logical cores you ha" + 342 | "ve."); 343 | this.processCountNumericUpDown.Value = new decimal(new int[] { 344 | 4, 345 | 0, 346 | 0, 347 | 0}); 348 | // 349 | // processCountLabel 350 | // 351 | this.processCountLabel.AutoSize = true; 352 | this.processCountLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 353 | this.processCountLabel.Location = new System.Drawing.Point(421, 231); 354 | this.processCountLabel.Name = "processCountLabel"; 355 | this.processCountLabel.Size = new System.Drawing.Size(87, 15); 356 | this.processCountLabel.TabIndex = 15; 357 | this.processCountLabel.Text = "Process count:"; 358 | this.toolTip1.SetToolTip(this.processCountLabel, "N# of processes. For best results set acording to\r\nhow many logical cores you hav" + 359 | "e."); 360 | // 361 | // renderAllButton 362 | // 363 | this.renderAllButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.5F, System.Drawing.FontStyle.Bold); 364 | this.renderAllButton.Location = new System.Drawing.Point(470, 293); 365 | this.renderAllButton.Name = "renderAllButton"; 366 | this.renderAllButton.Size = new System.Drawing.Size(171, 39); 367 | this.renderAllButton.TabIndex = 0; 368 | this.renderAllButton.Text = "Render all"; 369 | this.toolTip1.SetToolTip(this.renderAllButton, "Render all segments"); 370 | this.renderAllButton.UseVisualStyleBackColor = true; 371 | this.renderAllButton.Click += new System.EventHandler(this.renderAllButton_Click); 372 | // 373 | // concatenatePartsButton 374 | // 375 | this.concatenatePartsButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 376 | this.concatenatePartsButton.Location = new System.Drawing.Point(470, 436); 377 | this.concatenatePartsButton.Name = "concatenatePartsButton"; 378 | this.concatenatePartsButton.Size = new System.Drawing.Size(173, 39); 379 | this.concatenatePartsButton.TabIndex = 16; 380 | this.concatenatePartsButton.Text = "Concatenate parts *"; 381 | this.toolTip1.SetToolTip(this.concatenatePartsButton, "Combine segments in FFmpeg"); 382 | this.concatenatePartsButton.UseVisualStyleBackColor = true; 383 | this.concatenatePartsButton.Click += new System.EventHandler(this.concatenatePartsButton_Click); 384 | // 385 | // ReadBlenderData 386 | // 387 | this.ReadBlenderData.Location = new System.Drawing.Point(566, 134); 388 | this.ReadBlenderData.Name = "ReadBlenderData"; 389 | this.ReadBlenderData.Size = new System.Drawing.Size(75, 63); 390 | this.ReadBlenderData.TabIndex = 17; 391 | this.ReadBlenderData.Text = "Re-Read"; 392 | this.toolTip1.SetToolTip(this.ReadBlenderData, "Re-read info from .blend"); 393 | this.ReadBlenderData.UseVisualStyleBackColor = true; 394 | this.ReadBlenderData.Click += new System.EventHandler(this.ReadBlenderData_Click); 395 | // 396 | // MixdownAudio 397 | // 398 | this.MixdownAudio.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 399 | this.MixdownAudio.Location = new System.Drawing.Point(177, 500); 400 | this.MixdownAudio.Name = "MixdownAudio"; 401 | this.MixdownAudio.Size = new System.Drawing.Size(99, 51); 402 | this.MixdownAudio.TabIndex = 18; 403 | this.MixdownAudio.Text = "MixDown audio"; 404 | this.MixdownAudio.UseVisualStyleBackColor = true; 405 | this.MixdownAudio.Click += new System.EventHandler(this.MixdownAudio_Click); 406 | // 407 | // TotalTime 408 | // 409 | this.TotalTime.AutoSize = true; 410 | this.TotalTime.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.25F); 411 | this.TotalTime.Location = new System.Drawing.Point(37, 316); 412 | this.TotalTime.Name = "TotalTime"; 413 | this.TotalTime.Size = new System.Drawing.Size(127, 16); 414 | this.TotalTime.TabIndex = 19; 415 | this.TotalTime.Text = "Total Time: 00:00:00"; 416 | // 417 | // menuStrip1 418 | // 419 | this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 420 | this.aboutToolStripMenuItem, 421 | this.infoToolStripMenuItem, 422 | this.debugToolStripMenuItem}); 423 | this.menuStrip1.Location = new System.Drawing.Point(0, 0); 424 | this.menuStrip1.Name = "menuStrip1"; 425 | this.menuStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; 426 | this.menuStrip1.Size = new System.Drawing.Size(655, 24); 427 | this.menuStrip1.TabIndex = 20; 428 | this.menuStrip1.Text = "menuStrip1"; 429 | // 430 | // aboutToolStripMenuItem 431 | // 432 | this.aboutToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 433 | this.tipsToolStripMenuItem, 434 | this.autocombineToolStripMenuItem, 435 | this.debugShow, 436 | this.speToolStripMenuItem, 437 | this.visitGithubPageToolStripMenuItem}); 438 | this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; 439 | this.aboutToolStripMenuItem.Size = new System.Drawing.Size(61, 20); 440 | this.aboutToolStripMenuItem.Text = "Options"; 441 | this.aboutToolStripMenuItem.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal; 442 | this.aboutToolStripMenuItem.ToolTipText = "Extra options"; 443 | // 444 | // tipsToolStripMenuItem 445 | // 446 | this.tipsToolStripMenuItem.Checked = true; 447 | this.tipsToolStripMenuItem.CheckOnClick = true; 448 | this.tipsToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; 449 | this.tipsToolStripMenuItem.Name = "tipsToolStripMenuItem"; 450 | this.tipsToolStripMenuItem.Size = new System.Drawing.Size(166, 22); 451 | this.tipsToolStripMenuItem.Text = "Tooltips"; 452 | this.tipsToolStripMenuItem.Click += new System.EventHandler(this.tipsToolStripMenuItem_Click); 453 | // 454 | // autocombineToolStripMenuItem 455 | // 456 | this.autocombineToolStripMenuItem.CheckOnClick = true; 457 | this.autocombineToolStripMenuItem.Name = "autocombineToolStripMenuItem"; 458 | this.autocombineToolStripMenuItem.Size = new System.Drawing.Size(166, 22); 459 | this.autocombineToolStripMenuItem.Text = "Auto-combine"; 460 | this.autocombineToolStripMenuItem.ToolTipText = "Automatically combine parts when clicking \"Render all\""; 461 | this.autocombineToolStripMenuItem.Visible = false; 462 | // 463 | // debugShow 464 | // 465 | this.debugShow.CheckOnClick = true; 466 | this.debugShow.Name = "debugShow"; 467 | this.debugShow.Size = new System.Drawing.Size(166, 22); 468 | this.debugShow.Text = "Debug menu"; 469 | this.debugShow.Click += new System.EventHandler(this.debugMenuToolStripMenuItem_Click); 470 | // 471 | // speToolStripMenuItem 472 | // 473 | this.speToolStripMenuItem.Name = "speToolStripMenuItem"; 474 | this.speToolStripMenuItem.Size = new System.Drawing.Size(163, 6); 475 | // 476 | // visitGithubPageToolStripMenuItem 477 | // 478 | this.visitGithubPageToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 479 | this.isti115ToolStripMenuItem, 480 | this.meTwentyFiveToolStripMenuItem, 481 | this.redRaptor93ToolStripMenuItem, 482 | this.jendabekToolStripMenuItem}); 483 | this.visitGithubPageToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 484 | this.visitGithubPageToolStripMenuItem.ForeColor = System.Drawing.Color.CornflowerBlue; 485 | this.visitGithubPageToolStripMenuItem.Name = "visitGithubPageToolStripMenuItem"; 486 | this.visitGithubPageToolStripMenuItem.Size = new System.Drawing.Size(166, 22); 487 | this.visitGithubPageToolStripMenuItem.Text = "Visit GitHub page"; 488 | // 489 | // isti115ToolStripMenuItem 490 | // 491 | this.isti115ToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 492 | this.isti115ToolStripMenuItem.ForeColor = System.Drawing.Color.CornflowerBlue; 493 | this.isti115ToolStripMenuItem.Name = "isti115ToolStripMenuItem"; 494 | this.isti115ToolStripMenuItem.Size = new System.Drawing.Size(150, 22); 495 | this.isti115ToolStripMenuItem.Text = "Isti115"; 496 | this.isti115ToolStripMenuItem.Click += new System.EventHandler(this.isti115ToolStripMenuItem_Click); 497 | // 498 | // meTwentyFiveToolStripMenuItem 499 | // 500 | this.meTwentyFiveToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 501 | this.meTwentyFiveToolStripMenuItem.ForeColor = System.Drawing.Color.CornflowerBlue; 502 | this.meTwentyFiveToolStripMenuItem.Name = "meTwentyFiveToolStripMenuItem"; 503 | this.meTwentyFiveToolStripMenuItem.Size = new System.Drawing.Size(150, 22); 504 | this.meTwentyFiveToolStripMenuItem.Text = "MeTwentyFive"; 505 | this.meTwentyFiveToolStripMenuItem.Click += new System.EventHandler(this.meTwentyFiveToolStripMenuItem_Click); 506 | // 507 | // redRaptor93ToolStripMenuItem 508 | // 509 | this.redRaptor93ToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 510 | this.redRaptor93ToolStripMenuItem.ForeColor = System.Drawing.Color.CornflowerBlue; 511 | this.redRaptor93ToolStripMenuItem.Name = "redRaptor93ToolStripMenuItem"; 512 | this.redRaptor93ToolStripMenuItem.Size = new System.Drawing.Size(150, 22); 513 | this.redRaptor93ToolStripMenuItem.Text = "RedRaptor93"; 514 | this.redRaptor93ToolStripMenuItem.Click += new System.EventHandler(this.redRaptor93ToolStripMenuItem_Click); 515 | // 516 | // jendabekToolStripMenuItem 517 | // 518 | this.jendabekToolStripMenuItem.ForeColor = System.Drawing.Color.CornflowerBlue; 519 | this.jendabekToolStripMenuItem.Name = "jendabekToolStripMenuItem"; 520 | this.jendabekToolStripMenuItem.Size = new System.Drawing.Size(150, 22); 521 | this.jendabekToolStripMenuItem.Text = "jendabek"; 522 | this.jendabekToolStripMenuItem.Click += new System.EventHandler(this.jendabekToolStripMenuItem_Click); 523 | // 524 | // infoToolStripMenuItem 525 | // 526 | this.infoToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 527 | this.readmeToolStripMenuItem, 528 | this.jsonToolStripMenuItem}); 529 | this.infoToolStripMenuItem.Name = "infoToolStripMenuItem"; 530 | this.infoToolStripMenuItem.Size = new System.Drawing.Size(40, 20); 531 | this.infoToolStripMenuItem.Text = "Info"; 532 | // 533 | // readmeToolStripMenuItem 534 | // 535 | this.readmeToolStripMenuItem.Name = "readmeToolStripMenuItem"; 536 | this.readmeToolStripMenuItem.Size = new System.Drawing.Size(121, 22); 537 | this.readmeToolStripMenuItem.Text = "Readme"; 538 | this.readmeToolStripMenuItem.ToolTipText = "Open readme (WIP)"; 539 | // 540 | // jsonToolStripMenuItem 541 | // 542 | this.jsonToolStripMenuItem.Name = "jsonToolStripMenuItem"; 543 | this.jsonToolStripMenuItem.Size = new System.Drawing.Size(121, 22); 544 | this.jsonToolStripMenuItem.Text = "Json info"; 545 | this.jsonToolStripMenuItem.ToolTipText = "Show contents of Json file"; 546 | this.jsonToolStripMenuItem.Click += new System.EventHandler(this.jsonToolStripMenuItem_Click); 547 | // 548 | // debugToolStripMenuItem 549 | // 550 | this.debugToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 551 | this.deleteJsonToolStripMenuItem, 552 | this.cMDArgsToolStripMenuItem}); 553 | this.debugToolStripMenuItem.Name = "debugToolStripMenuItem"; 554 | this.debugToolStripMenuItem.Size = new System.Drawing.Size(54, 20); 555 | this.debugToolStripMenuItem.Text = "Debug"; 556 | this.debugToolStripMenuItem.Visible = false; 557 | // 558 | // deleteJsonToolStripMenuItem 559 | // 560 | this.deleteJsonToolStripMenuItem.Name = "deleteJsonToolStripMenuItem"; 561 | this.deleteJsonToolStripMenuItem.Size = new System.Drawing.Size(132, 22); 562 | this.deleteJsonToolStripMenuItem.Text = "Delete json"; 563 | this.deleteJsonToolStripMenuItem.Click += new System.EventHandler(this.deleteJsonToolStripMenuItem_Click); 564 | // 565 | // cMDArgsToolStripMenuItem 566 | // 567 | this.cMDArgsToolStripMenuItem.Name = "cMDArgsToolStripMenuItem"; 568 | this.cMDArgsToolStripMenuItem.Size = new System.Drawing.Size(132, 22); 569 | this.cMDArgsToolStripMenuItem.Text = "CMD args"; 570 | // 571 | // label1 572 | // 573 | this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 574 | this.label1.AutoSize = true; 575 | this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 576 | this.label1.Location = new System.Drawing.Point(10, 61); 577 | this.label1.Name = "label1"; 578 | this.label1.Size = new System.Drawing.Size(101, 13); 579 | this.label1.TabIndex = 21; 580 | this.label1.Text = "Active scene name:"; 581 | this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 582 | this.activeWarn.SetToolTip(this.label1, "This program will only render the ACTIVE scene, if you \r\nhave more then one scene" + 583 | " on your project sure you \r\nsave it with the scene you want OPEN."); 584 | // 585 | // infoPanel 586 | // 587 | this.infoPanel.BackColor = System.Drawing.SystemColors.Info; 588 | this.infoPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 589 | this.infoPanel.Controls.Add(this.outFolderPathTextBox); 590 | this.infoPanel.Controls.Add(this.label4); 591 | this.infoPanel.Controls.Add(this.infoNoScenes); 592 | this.infoPanel.Controls.Add(this.infoActiveScene); 593 | this.infoPanel.Controls.Add(this.label3); 594 | this.infoPanel.Controls.Add(this.label1); 595 | this.infoPanel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 596 | this.infoPanel.ForeColor = System.Drawing.SystemColors.InfoText; 597 | this.infoPanel.Location = new System.Drawing.Point(76, 106); 598 | this.infoPanel.Name = "infoPanel"; 599 | this.infoPanel.Size = new System.Drawing.Size(482, 112); 600 | this.infoPanel.TabIndex = 22; 601 | // 602 | // outFolderPathTextBox 603 | // 604 | this.outFolderPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 605 | | System.Windows.Forms.AnchorStyles.Right))); 606 | this.outFolderPathTextBox.BackColor = System.Drawing.SystemColors.Window; 607 | this.outFolderPathTextBox.Cursor = System.Windows.Forms.Cursors.No; 608 | this.outFolderPathTextBox.Location = new System.Drawing.Point(9, 30); 609 | this.outFolderPathTextBox.Name = "outFolderPathTextBox"; 610 | this.outFolderPathTextBox.ReadOnly = true; 611 | this.outFolderPathTextBox.Size = new System.Drawing.Size(464, 20); 612 | this.outFolderPathTextBox.TabIndex = 28; 613 | this.outFolderPathTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; 614 | this.activeWarn.SetToolTip(this.outFolderPathTextBox, "Render outputs will go here, must be changed in Blender."); 615 | this.outFolderPathTextBox.TextChanged += new System.EventHandler(this.outFolderPathTextBox_TextChanged); 616 | // 617 | // label4 618 | // 619 | this.label4.AutoSize = true; 620 | this.label4.Location = new System.Drawing.Point(6, 14); 621 | this.label4.Name = "label4"; 622 | this.label4.Size = new System.Drawing.Size(110, 13); 623 | this.label4.TabIndex = 27; 624 | this.label4.Text = ".blend\'s Output folder:"; 625 | this.activeWarn.SetToolTip(this.label4, "Render outputs will go here, must be changed in Blender."); 626 | // 627 | // infoNoScenes 628 | // 629 | this.infoNoScenes.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 630 | this.infoNoScenes.BackColor = System.Drawing.SystemColors.Window; 631 | this.infoNoScenes.Cursor = System.Windows.Forms.Cursors.No; 632 | this.infoNoScenes.Location = new System.Drawing.Point(351, 78); 633 | this.infoNoScenes.Name = "infoNoScenes"; 634 | this.infoNoScenes.ReadOnly = true; 635 | this.infoNoScenes.Size = new System.Drawing.Size(116, 20); 636 | this.infoNoScenes.TabIndex = 26; 637 | this.infoNoScenes.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; 638 | this.toolTip1.SetToolTip(this.infoNoScenes, "Number of scenes in project."); 639 | // 640 | // infoActiveScene 641 | // 642 | this.infoActiveScene.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); 643 | this.infoActiveScene.BackColor = System.Drawing.SystemColors.Window; 644 | this.infoActiveScene.Cursor = System.Windows.Forms.Cursors.No; 645 | this.infoActiveScene.Location = new System.Drawing.Point(13, 80); 646 | this.infoActiveScene.Name = "infoActiveScene"; 647 | this.infoActiveScene.ReadOnly = true; 648 | this.infoActiveScene.Size = new System.Drawing.Size(122, 20); 649 | this.infoActiveScene.TabIndex = 25; 650 | this.infoActiveScene.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; 651 | this.activeWarn.SetToolTip(this.infoActiveScene, "This program will only render the ACTIVE scene, if you \r\nhave more then one scene" + 652 | " on your project sure you \r\nsave it with the scene you want OPEN."); 653 | // 654 | // label3 655 | // 656 | this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 657 | this.label3.AutoSize = true; 658 | this.label3.Location = new System.Drawing.Point(348, 61); 659 | this.label3.Name = "label3"; 660 | this.label3.Size = new System.Drawing.Size(96, 13); 661 | this.label3.TabIndex = 23; 662 | this.label3.Text = "Number of scenes:"; 663 | this.activeWarn.SetToolTip(this.label3, "Number of scenes in project."); 664 | // 665 | // label2 666 | // 667 | this.label2.AutoSize = true; 668 | this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.5F, System.Drawing.FontStyle.Underline); 669 | this.label2.Location = new System.Drawing.Point(28, 141); 670 | this.label2.Name = "label2"; 671 | this.label2.Size = new System.Drawing.Size(39, 16); 672 | this.label2.TabIndex = 23; 673 | this.label2.Text = "Infos:"; 674 | // 675 | // activeWarn 676 | // 677 | this.activeWarn.AutomaticDelay = 1000; 678 | this.activeWarn.IsBalloon = true; 679 | this.activeWarn.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Warning; 680 | this.activeWarn.ToolTipTitle = "Caution"; 681 | // 682 | // toolTip1 683 | // 684 | this.toolTip1.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info; 685 | // 686 | // ajustOutDir 687 | // 688 | this.ajustOutDir.AutoSize = true; 689 | this.ajustOutDir.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 690 | this.ajustOutDir.Location = new System.Drawing.Point(111, 447); 691 | this.ajustOutDir.Name = "ajustOutDir"; 692 | this.ajustOutDir.Size = new System.Drawing.Size(155, 19); 693 | this.ajustOutDir.TabIndex = 27; 694 | this.ajustOutDir.Text = "Remove FILE from path"; 695 | this.toolTip1.SetToolTip(this.ajustOutDir, "If path ends in a file insted of a folder, use this to \r\npoint to intended direct" + 696 | "ory"); 697 | this.ajustOutDir.UseVisualStyleBackColor = true; 698 | this.ajustOutDir.CheckedChanged += new System.EventHandler(this.ajustOutDir_CheckedChanged); 699 | // 700 | // label5 701 | // 702 | this.label5.AutoSize = true; 703 | this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 12.25F, System.Drawing.FontStyle.Underline); 704 | this.label5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); 705 | this.label5.Location = new System.Drawing.Point(33, 374); 706 | this.label5.Name = "label5"; 707 | this.label5.Size = new System.Drawing.Size(80, 20); 708 | this.label5.TabIndex = 24; 709 | this.label5.Text = "2. Joining"; 710 | // 711 | // label6 712 | // 713 | this.label6.AutoSize = true; 714 | this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 12.25F, System.Drawing.FontStyle.Underline); 715 | this.label6.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); 716 | this.label6.Location = new System.Drawing.Point(33, 41); 717 | this.label6.Name = "label6"; 718 | this.label6.Size = new System.Drawing.Size(103, 20); 719 | this.label6.TabIndex = 25; 720 | this.label6.Text = "1. Rendering"; 721 | // 722 | // line 723 | // 724 | this.line.BackColor = System.Drawing.Color.Silver; 725 | this.line.ForeColor = System.Drawing.Color.Silver; 726 | this.line.Location = new System.Drawing.Point(142, 51); 727 | this.line.Margin = new System.Windows.Forms.Padding(0); 728 | this.line.Name = "line"; 729 | this.line.Size = new System.Drawing.Size(494, 5); 730 | this.line.TabIndex = 28; 731 | this.line.Text = "███"; 732 | // 733 | // line2 734 | // 735 | this.line2.BackColor = System.Drawing.Color.Silver; 736 | this.line2.ForeColor = System.Drawing.Color.Silver; 737 | this.line2.Location = new System.Drawing.Point(119, 384); 738 | this.line2.Margin = new System.Windows.Forms.Padding(0); 739 | this.line2.Name = "line2"; 740 | this.line2.Size = new System.Drawing.Size(517, 5); 741 | this.line2.TabIndex = 29; 742 | this.line2.Text = "███"; 743 | // 744 | // mergeAudioButton 745 | // 746 | this.mergeAudioButton.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 747 | this.mergeAudioButton.Location = new System.Drawing.Point(314, 500); 748 | this.mergeAudioButton.Name = "mergeAudioButton"; 749 | this.mergeAudioButton.Size = new System.Drawing.Size(93, 51); 750 | this.mergeAudioButton.TabIndex = 30; 751 | this.mergeAudioButton.Text = "Merge audio *"; 752 | this.mergeAudioButton.UseVisualStyleBackColor = true; 753 | this.mergeAudioButton.Click += new System.EventHandler(this.mergeAudioButton_Click); 754 | // 755 | // label7 756 | // 757 | this.label7.AutoSize = true; 758 | this.label7.Font = new System.Drawing.Font("Microsoft Sans Serif", 12.25F, System.Drawing.FontStyle.Underline); 759 | this.label7.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64))))); 760 | this.label7.Location = new System.Drawing.Point(33, 468); 761 | this.label7.Name = "label7"; 762 | this.label7.Size = new System.Drawing.Size(69, 20); 763 | this.label7.TabIndex = 24; 764 | this.label7.Text = "3. Audio"; 765 | // 766 | // label8 767 | // 768 | this.label8.BackColor = System.Drawing.Color.Silver; 769 | this.label8.ForeColor = System.Drawing.Color.Silver; 770 | this.label8.Location = new System.Drawing.Point(119, 478); 771 | this.label8.Margin = new System.Windows.Forms.Padding(0); 772 | this.label8.Name = "label8"; 773 | this.label8.Size = new System.Drawing.Size(517, 5); 774 | this.label8.TabIndex = 29; 775 | this.label8.Text = "███"; 776 | // 777 | // label9 778 | // 779 | this.label9.AutoSize = true; 780 | this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 781 | this.label9.Location = new System.Drawing.Point(283, 516); 782 | this.label9.Name = "label9"; 783 | this.label9.Size = new System.Drawing.Size(27, 18); 784 | this.label9.TabIndex = 31; 785 | this.label9.Text = "-->"; 786 | // 787 | // label10 788 | // 789 | this.label10.AutoSize = true; 790 | this.label10.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 791 | this.label10.Location = new System.Drawing.Point(413, 490); 792 | this.label10.Name = "label10"; 793 | this.label10.Size = new System.Drawing.Size(234, 64); 794 | this.label10.TabIndex = 31; 795 | this.label10.Text = "This button will replace the existing\r\naudio in concat_output.mp4 with\r\nthe mixed" + 796 | " down ac3 track and write the\r\nresult to audio_output.mp4"; 797 | // 798 | // label11 799 | // 800 | this.label11.AutoSize = true; 801 | this.label11.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 802 | this.label11.Location = new System.Drawing.Point(9, 490); 803 | this.label11.Name = "label11"; 804 | this.label11.Size = new System.Drawing.Size(162, 64); 805 | this.label11.TabIndex = 31; 806 | this.label11.Text = "This button will export only\r\nthe audio track from the\r\nblend file into a\r\nsepara" + 807 | "te ac3 file."; 808 | this.label11.TextAlign = System.Drawing.ContentAlignment.TopRight; 809 | // 810 | // label12 811 | // 812 | this.label12.AutoSize = true; 813 | this.label12.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 814 | this.label12.Location = new System.Drawing.Point(58, 571); 815 | this.label12.Name = "label12"; 816 | this.label12.Size = new System.Drawing.Size(532, 36); 817 | this.label12.TabIndex = 32; 818 | this.label12.Text = "*: A console window may pop up asking for confirmation if the file already exists" + 819 | ".\r\nIn this case type in the letter y and press Enter if you wish to overwrite it" + 820 | "."; 821 | this.label12.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; 822 | // 823 | // MainForm 824 | // 825 | this.AllowDrop = true; 826 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 827 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 828 | this.ClientSize = new System.Drawing.Size(655, 616); 829 | this.Controls.Add(this.label12); 830 | this.Controls.Add(this.label11); 831 | this.Controls.Add(this.label10); 832 | this.Controls.Add(this.label9); 833 | this.Controls.Add(this.mergeAudioButton); 834 | this.Controls.Add(this.label8); 835 | this.Controls.Add(this.line2); 836 | this.Controls.Add(this.line); 837 | this.Controls.Add(this.ajustOutDir); 838 | this.Controls.Add(this.label7); 839 | this.Controls.Add(this.label6); 840 | this.Controls.Add(this.label5); 841 | this.Controls.Add(this.label2); 842 | this.Controls.Add(this.infoPanel); 843 | this.Controls.Add(this.TotalTime); 844 | this.Controls.Add(this.MixdownAudio); 845 | this.Controls.Add(this.ReadBlenderData); 846 | this.Controls.Add(this.concatenatePartsButton); 847 | this.Controls.Add(this.processCountLabel); 848 | this.Controls.Add(this.processCountNumericUpDown); 849 | this.Controls.Add(this.totalFrameCountLabel); 850 | this.Controls.Add(this.prevChunkButton); 851 | this.Controls.Add(this.nextChunkButton); 852 | this.Controls.Add(this.progressLabel); 853 | this.Controls.Add(this.rendererComboBox); 854 | this.Controls.Add(this.rendererLabel); 855 | this.Controls.Add(this.partsFolderLabel); 856 | this.Controls.Add(this.blendFileLabel); 857 | this.Controls.Add(this.endFrameLabel); 858 | this.Controls.Add(this.startFrameLabel); 859 | this.Controls.Add(this.totalFrameCountNumericUpDown); 860 | this.Controls.Add(this.endFrameNumericUpDown); 861 | this.Controls.Add(this.partsFolderPathTextBox); 862 | this.Controls.Add(this.startFrameNumericUpDown); 863 | this.Controls.Add(this.blendFilePathTextBox); 864 | this.Controls.Add(this.partsFolderBrowseButton); 865 | this.Controls.Add(this.renderProgressBar); 866 | this.Controls.Add(this.blendFileBrowseButton); 867 | this.Controls.Add(this.renderAllButton); 868 | this.Controls.Add(this.renderSegmentButton); 869 | this.Controls.Add(this.menuStrip1); 870 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 871 | this.MainMenuStrip = this.menuStrip1; 872 | this.MaximizeBox = false; 873 | this.MinimumSize = new System.Drawing.Size(480, 280); 874 | this.Name = "MainForm"; 875 | this.Text = "Blender Render Controller"; 876 | this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.MainForm_Close); 877 | this.Load += new System.EventHandler(this.MainForm_Load); 878 | this.DragDrop += new System.Windows.Forms.DragEventHandler(this.MainForm_DragDrop); 879 | this.DragEnter += new System.Windows.Forms.DragEventHandler(this.MainForm_DragEnter); 880 | ((System.ComponentModel.ISupportInitialize)(this.startFrameNumericUpDown)).EndInit(); 881 | ((System.ComponentModel.ISupportInitialize)(this.endFrameNumericUpDown)).EndInit(); 882 | ((System.ComponentModel.ISupportInitialize)(this.totalFrameCountNumericUpDown)).EndInit(); 883 | ((System.ComponentModel.ISupportInitialize)(this.processCountNumericUpDown)).EndInit(); 884 | this.menuStrip1.ResumeLayout(false); 885 | this.menuStrip1.PerformLayout(); 886 | this.infoPanel.ResumeLayout(false); 887 | this.infoPanel.PerformLayout(); 888 | this.ResumeLayout(false); 889 | this.PerformLayout(); 890 | 891 | } 892 | 893 | #endregion 894 | 895 | private System.Windows.Forms.Button renderSegmentButton; 896 | private System.Windows.Forms.Button blendFileBrowseButton; 897 | private System.Windows.Forms.ProgressBar renderProgressBar; 898 | private System.Windows.Forms.TextBox blendFilePathTextBox; 899 | private System.Windows.Forms.NumericUpDown startFrameNumericUpDown; 900 | private System.Windows.Forms.NumericUpDown endFrameNumericUpDown; 901 | private System.Windows.Forms.Label startFrameLabel; 902 | private System.Windows.Forms.Label endFrameLabel; 903 | private System.Windows.Forms.Label blendFileLabel; 904 | private System.Windows.Forms.Button partsFolderBrowseButton; 905 | private System.Windows.Forms.TextBox partsFolderPathTextBox; 906 | private System.Windows.Forms.Label partsFolderLabel; 907 | private System.Windows.Forms.Label rendererLabel; 908 | private System.Windows.Forms.ComboBox rendererComboBox; 909 | private System.Windows.Forms.Label progressLabel; 910 | private System.Windows.Forms.Button nextChunkButton; 911 | private System.Windows.Forms.Button prevChunkButton; 912 | private System.Windows.Forms.Label totalFrameCountLabel; 913 | private System.Windows.Forms.NumericUpDown totalFrameCountNumericUpDown; 914 | private System.Windows.Forms.NumericUpDown processCountNumericUpDown; 915 | private System.Windows.Forms.Label processCountLabel; 916 | private System.Windows.Forms.Button renderAllButton; 917 | private System.Windows.Forms.Button concatenatePartsButton; 918 | private System.Windows.Forms.Button ReadBlenderData; 919 | private System.Windows.Forms.Button MixdownAudio; 920 | private System.Windows.Forms.Label TotalTime; 921 | private System.Windows.Forms.MenuStrip menuStrip1; 922 | private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem; 923 | private System.Windows.Forms.Label label1; 924 | private System.Windows.Forms.Panel infoPanel; 925 | private System.Windows.Forms.Label label3; 926 | private System.Windows.Forms.Label label2; 927 | private System.Windows.Forms.TextBox infoNoScenes; 928 | private System.Windows.Forms.TextBox infoActiveScene; 929 | private System.Windows.Forms.ToolTip activeWarn; 930 | private System.Windows.Forms.ToolTip toolTip1; 931 | private System.Windows.Forms.ToolStripMenuItem tipsToolStripMenuItem; 932 | private System.Windows.Forms.ToolStripMenuItem visitGithubPageToolStripMenuItem; 933 | private System.Windows.Forms.ToolStripMenuItem isti115ToolStripMenuItem; 934 | private System.Windows.Forms.ToolStripMenuItem meTwentyFiveToolStripMenuItem; 935 | private System.Windows.Forms.ToolStripMenuItem redRaptor93ToolStripMenuItem; 936 | private System.Windows.Forms.ToolStripMenuItem jendabekToolStripMenuItem; 937 | private System.Windows.Forms.ToolStripMenuItem infoToolStripMenuItem; 938 | private System.Windows.Forms.ToolStripMenuItem jsonToolStripMenuItem; 939 | private System.Windows.Forms.ToolStripSeparator speToolStripMenuItem; 940 | private System.Windows.Forms.ToolStripMenuItem readmeToolStripMenuItem; 941 | private System.Windows.Forms.TextBox outFolderPathTextBox; 942 | private System.Windows.Forms.Label label4; 943 | private System.Windows.Forms.Label label5; 944 | private System.Windows.Forms.Label label6; 945 | private System.Windows.Forms.CheckBox ajustOutDir; 946 | private System.Windows.Forms.Label line; 947 | private System.Windows.Forms.Label line2; 948 | private System.Windows.Forms.ToolStripMenuItem autocombineToolStripMenuItem; 949 | private System.Windows.Forms.ToolStripMenuItem debugShow; 950 | private System.Windows.Forms.ToolStripMenuItem debugToolStripMenuItem; 951 | private System.Windows.Forms.ToolStripMenuItem deleteJsonToolStripMenuItem; 952 | private System.Windows.Forms.ToolStripMenuItem cMDArgsToolStripMenuItem; 953 | private System.Windows.Forms.Button mergeAudioButton; 954 | private System.Windows.Forms.Label label7; 955 | private System.Windows.Forms.Label label8; 956 | private System.Windows.Forms.Label label9; 957 | private System.Windows.Forms.Label label10; 958 | private System.Windows.Forms.Label label11; 959 | private System.Windows.Forms.Label label12; 960 | } 961 | } 962 | 963 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/MainForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Diagnostics; 6 | using System.Drawing; 7 | using System.IO; 8 | using System.Linq; 9 | using System.Text; 10 | using System.Text.RegularExpressions; 11 | using System.Threading.Tasks; 12 | using System.Windows.Forms; 13 | 14 | using System.Web.Script.Serialization; 15 | 16 | namespace BlenderRenderController 17 | { 18 | 19 | public partial class MainForm : Form 20 | { 21 | string blendFilePath; 22 | string outFolderPath; 23 | string blendProjectName = "concat_output.mp4"; 24 | DateTime startTime = DateTime.MaxValue; 25 | 26 | string ScriptsPath; 27 | 28 | Timer renderAllTimer; 29 | int runningRenderProcessCount; 30 | 31 | int ErrorCode; 32 | string AltDir; 33 | // Lenth of segments, TEST 34 | int SeqFrame = 1000; 35 | 36 | public class BlenderData 37 | { 38 | public int StartFrame; 39 | public int EndFrame; 40 | public string OutputDirectory; 41 | public string ProjectName; 42 | // new 43 | public string NumScenes; 44 | public string ActiveScene; 45 | public string AltDir; 46 | public int ErrorCode; 47 | //public int SegFrame = 1000; 48 | public string RenderingEngine; 49 | } 50 | 51 | 52 | string[] args = Environment.GetCommandLineArgs(); 53 | 54 | 55 | public MainForm() 56 | { 57 | InitializeComponent(); 58 | 59 | //string execPath = Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().CodeBase ); 60 | string execPath = new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath; 61 | 62 | ScriptsPath = Path.Combine(Path.GetDirectoryName(execPath), "Scripts"); 63 | Trace.WriteLine(String.Format("Scripts Path: '{0}'", ScriptsPath)); 64 | } 65 | 66 | // Deletes json on form close 67 | private void MainForm_Close(object sender, FormClosedEventArgs e) 68 | { 69 | jsonDel(); 70 | } 71 | 72 | private void MainForm_Load(object sender, EventArgs e) 73 | { 74 | // Arguments 75 | if (args.Length > 1) 76 | { 77 | //test arguments 78 | //for (int i = 0; i < args.Length; i++) 79 | //{ 80 | // string teste = string.Format("Arg[{0}] = [{1}] \r\n", i, args[i]); 81 | // MessageBox.Show(teste); 82 | //} 83 | 84 | // arg 1 = .blend path 85 | blendFilePath = args[1]; 86 | blendFilePathTextBox.Text = blendFilePath; 87 | DoReadBlenderData(); 88 | } 89 | 90 | blendFilePath = ""; 91 | outFolderPath = ""; 92 | 93 | renderAllTimer = new Timer(); 94 | renderAllTimer.Interval = 2500; 95 | renderAllTimer.Tick += new EventHandler(updateProcessManagement); 96 | 97 | runningRenderProcessCount = 0; 98 | } 99 | 100 | private void blendFileBrowseButton_Click(object sender, EventArgs e) 101 | { 102 | var blendFileBrowseDialog = new OpenFileDialog(); 103 | blendFileBrowseDialog.Filter = "Blend|*.blend"; 104 | 105 | var result = blendFileBrowseDialog.ShowDialog(); 106 | 107 | if (result == DialogResult.OK) 108 | { 109 | blendFilePath = blendFileBrowseDialog.FileName; 110 | blendFilePathTextBox.Text = blendFilePath; 111 | DoReadBlenderData(); 112 | } 113 | } 114 | 115 | private void partsFolderBrowseButton_Click(object sender, EventArgs e) 116 | { 117 | var partsFolderBrowseDialog = new FolderBrowserDialog(); 118 | //outFileBrowseDialog.Filter = "Blend|*.blend"; 119 | 120 | var result = partsFolderBrowseDialog.ShowDialog(); 121 | 122 | if (result == DialogResult.OK) 123 | { 124 | outFolderPath = partsFolderBrowseDialog.SelectedPath; 125 | partsFolderPathTextBox.Text = outFolderPath; 126 | } 127 | } 128 | 129 | private void outFolderPathTextBox_TextChanged(object sender, EventArgs e) 130 | { 131 | outFolderPath = partsFolderPathTextBox.Text; 132 | } 133 | 134 | private void renderSegmentButton_Click(object sender, EventArgs e) 135 | { 136 | Process p = new Process(); 137 | 138 | p.StartInfo.WorkingDirectory = outFolderPath; 139 | p.StartInfo.FileName = "blender"; 140 | p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 141 | 142 | //p.StartInfo.Arguments = String.Format("-b \"{0}\" -E {1} -s {2} -e {3} {4} -a ", 143 | p.StartInfo.Arguments = String.Format("-b \"{0}\" -E {1} -s {2} -e {3} -a ", 144 | blendFilePathTextBox.Text, 145 | rendererComboBox.Text, 146 | startFrameNumericUpDown.Value, 147 | endFrameNumericUpDown.Value 148 | ); 149 | 150 | Trace.WriteLine(String.Format("CEW: {0}", p.StartInfo.Arguments)); 151 | 152 | p.EnableRaisingEvents = true; 153 | p.Exited += new EventHandler(chunk_Finished); 154 | 155 | p.Start(); 156 | runningRenderProcessCount++; 157 | } 158 | 159 | private void chunk_Finished(object sender, EventArgs e) 160 | { 161 | runningRenderProcessCount--; 162 | } 163 | 164 | private void prevChunkButton_Click(object sender, EventArgs e) 165 | { 166 | var difference = endFrameNumericUpDown.Value - startFrameNumericUpDown.Value; 167 | //difference = SegFrame; 168 | //var step = endFrameNumericUpDown.Value = startFrameNumericUpDown.Value + SegFrame; 169 | if (startFrameNumericUpDown.Value - difference < 1) 170 | { 171 | startFrameNumericUpDown.Value = 1; 172 | endFrameNumericUpDown.Value = 1 + difference; 173 | } 174 | else 175 | { 176 | endFrameNumericUpDown.Value = startFrameNumericUpDown.Value - 1; 177 | startFrameNumericUpDown.Value = endFrameNumericUpDown.Value - difference; 178 | } 179 | } 180 | 181 | private void nextChunkButton_Click(object sender, EventArgs e) 182 | { 183 | var difference = endFrameNumericUpDown.Value - startFrameNumericUpDown.Value; 184 | startFrameNumericUpDown.Value = endFrameNumericUpDown.Value + 1; 185 | 186 | if (endFrameNumericUpDown.Value + difference + 1 > totalFrameCountNumericUpDown.Value) 187 | { 188 | endFrameNumericUpDown.Value = totalFrameCountNumericUpDown.Value; 189 | } 190 | else 191 | { 192 | endFrameNumericUpDown.Value = startFrameNumericUpDown.Value + difference; 193 | } 194 | } 195 | 196 | private void renderAllButton_Click(object sender, EventArgs e) 197 | { 198 | //Becuase "clever" coding before us 199 | if (startTime == DateTime.MaxValue) 200 | { 201 | //First time, set start time 202 | startTime = DateTime.Now; 203 | TotalTime.Text = "Total Time: 00:00:00"; 204 | } 205 | else 206 | { 207 | //Stopping whether finished or user intervention so show time run 208 | TimeSpan runTime = DateTime.Now - startTime; 209 | TotalTime.Text = String.Format("Total Time: {0,2:D2}:{1,2:D2}:{2,2:D2}", (int)runTime.TotalHours, runTime.Minutes, runTime.Seconds); 210 | startTime = DateTime.MaxValue; 211 | } 212 | 213 | renderAllTimer.Enabled = !renderAllTimer.Enabled; 214 | renderAllButton.Text = renderAllTimer.Enabled ? "Stop" : "Render all"; 215 | } 216 | 217 | private void updateProcessManagement(object sender, EventArgs e) 218 | { 219 | if (!(startFrameNumericUpDown.Value < totalFrameCountNumericUpDown.Value)) 220 | { 221 | renderAllButton_Click(sender, e); 222 | return; 223 | } 224 | 225 | renderProgressBar.Value = (int)((endFrameNumericUpDown.Value / totalFrameCountNumericUpDown.Value) * 100); 226 | 227 | TimeSpan runTime = DateTime.Now - startTime; 228 | TotalTime.Text = String.Format("Total Time: {0,2:D2}:{1,2:D2}:{2,2:D2}", (int)runTime.TotalHours, runTime.Minutes, runTime.Seconds); 229 | 230 | if (runningRenderProcessCount < processCountNumericUpDown.Value) 231 | { 232 | renderSegmentButton_Click(null, EventArgs.Empty); 233 | nextChunkButton_Click(null, EventArgs.Empty); 234 | } 235 | } 236 | 237 | private List findFiles(string folderPath, string fileSearch) 238 | { 239 | string[] partList = Directory.GetFiles(folderPath, fileSearch); 240 | Regex filePatern = new Regex(@"\d+-\d+" + Path.GetExtension(fileSearch)); 241 | 242 | return partList.Where(file => filePatern.IsMatch(file)).ToList(); 243 | } 244 | 245 | private void concatenatePartsButton_Click(object sender, EventArgs e) 246 | { 247 | string ffmpeg_dir = "..."; 248 | 249 | switch (ajustOutDir.CheckState) 250 | { 251 | case CheckState.Checked: 252 | ffmpeg_dir = AltDir; 253 | break; 254 | case CheckState.Unchecked: 255 | ffmpeg_dir = outFolderPath; 256 | break; 257 | case CheckState.Indeterminate: 258 | break; 259 | default: 260 | ffmpeg_dir = outFolderPath; 261 | break; 262 | } 263 | 264 | if (!Directory.Exists(ffmpeg_dir)) 265 | { 266 | errorMsgs(-100); 267 | return; 268 | } 269 | 270 | StreamWriter partListWriter = new StreamWriter(ffmpeg_dir + "\\partList.txt"); 271 | List stringPartList = findFiles(ffmpeg_dir, "*.avi"); 272 | string fileExtension = "avi"; 273 | string audioFile = Path.GetFileNameWithoutExtension(blendFilePathTextBox.Text); 274 | string audioSettings = string.Empty;//"-c:a aac -b:a 256k"; 275 | 276 | if (stringPartList == null || stringPartList.Count == 0) 277 | { 278 | stringPartList = findFiles(ffmpeg_dir, "*.mp4"); 279 | fileExtension = "mp4"; 280 | } 281 | 282 | if (File.Exists(Path.Combine(ffmpeg_dir, audioFile + ".ac3"))) 283 | { 284 | audioFile = " -i " + audioFile + ".ac3"; 285 | } 286 | else 287 | { 288 | audioFile = string.Empty; 289 | audioSettings = string.Empty; 290 | } 291 | 292 | stringPartList.Sort(compareParts); 293 | 294 | foreach (var currentPart in stringPartList) 295 | { 296 | partListWriter.WriteLine("file '{0}'", Path.GetFileName(currentPart)); 297 | } 298 | 299 | partListWriter.Close(); 300 | 301 | 302 | Process p = new Process(); 303 | 304 | p.StartInfo.WorkingDirectory = ffmpeg_dir; 305 | //p.StartInfo.WorkingDirectory = AltDir; 306 | p.StartInfo.FileName = "ffmpeg"; 307 | p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 308 | 309 | p.StartInfo.Arguments = String.Format("-f concat -i partList.txt {0} -c:v copy {1} concat_output.{2}", 310 | audioFile, 311 | audioSettings, 312 | fileExtension 313 | ); 314 | 315 | p.Start(); 316 | } 317 | 318 | public int compareParts(string a, string b) 319 | { 320 | Regex pattern = new Regex(@".*-(.*)\.(mp4|avi)"); 321 | 322 | int aEnd = Convert.ToInt32(pattern.Match(a).Groups[1].Value); 323 | int bEnd = Convert.ToInt32(pattern.Match(b).Groups[1].Value); 324 | 325 | return aEnd.CompareTo(bEnd); 326 | } 327 | 328 | private void DoReadBlenderData() 329 | { 330 | 331 | if (!File.Exists(blendFilePathTextBox.Text)) 332 | { 333 | // file does not exist 334 | errorMsgs(-104); 335 | return; 336 | } 337 | 338 | if (!Directory.Exists(ScriptsPath)) 339 | { 340 | // Error scriptsfolder not found 341 | errorMsgs(-404); 342 | return; 343 | } 344 | 345 | Process p = new Process(); 346 | //p.StartInfo.WorkingDirectory = outFolderPath; 347 | p.StartInfo.WorkingDirectory = ScriptsPath; 348 | p.StartInfo.FileName = "blender"; 349 | p.StartInfo.RedirectStandardOutput = true; 350 | p.StartInfo.CreateNoWindow = true; 351 | p.StartInfo.UseShellExecute = false; 352 | 353 | p.StartInfo.Arguments = String.Format("-b \"{0}\" -P \"{1}\"", 354 | blendFilePathTextBox.Text, 355 | Path.Combine(ScriptsPath, "get_project_info.py") 356 | ); 357 | 358 | try 359 | { 360 | p.Start(); 361 | } 362 | catch (Exception ex) 363 | { 364 | Trace.WriteLine(ex); 365 | } 366 | 367 | StringBuilder jsonInfo = new StringBuilder(); 368 | bool jsonStarted = false; 369 | int curlyStack = 0; 370 | 371 | while (!p.StandardOutput.EndOfStream) 372 | { 373 | string line = p.StandardOutput.ReadLine(); 374 | 375 | if (line.Contains("{")) 376 | { 377 | jsonStarted = true; 378 | curlyStack++; 379 | } 380 | 381 | if (jsonStarted) 382 | { 383 | 384 | if (!line.ToLower().Contains("blender quit") && curlyStack > 0) 385 | { 386 | jsonInfo.AppendLine(line); 387 | } 388 | 389 | if (line.Contains("}")) 390 | { 391 | 392 | curlyStack--; 393 | 394 | if (curlyStack == 0) 395 | { 396 | jsonStarted = false; 397 | } 398 | 399 | } 400 | 401 | } 402 | 403 | } 404 | 405 | BlenderData blendData = null; 406 | if (jsonInfo.Length > 0) 407 | { 408 | JavaScriptSerializer serializer = new JavaScriptSerializer(); 409 | blendData = serializer.Deserialize(jsonInfo.ToString()); 410 | } 411 | 412 | if (blendData != null) 413 | { 414 | 415 | startFrameNumericUpDown.Value = blendData.StartFrame; 416 | totalFrameCountNumericUpDown.Value = blendData.EndFrame; 417 | 418 | rendererComboBox.Text = blendData.RenderingEngine; 419 | 420 | //endFrameNumericUpDown.Value = startFrameNumericUpDown.Value + endFrameNumericUpDown.Value; 421 | 422 | // Remove last bit from file path, if checked 423 | if (ajustOutDir.Checked == true) 424 | { 425 | partsFolderPathTextBox.Text = blendData.AltDir; 426 | } 427 | else 428 | { 429 | partsFolderPathTextBox.Text = outFolderPath = blendData.OutputDirectory; 430 | } 431 | 432 | outFolderPathTextBox.Text = outFolderPath = blendData.OutputDirectory; 433 | infoActiveScene.Text = blendData.ActiveScene; 434 | infoNoScenes.Text = blendData.NumScenes; 435 | AltDir = blendData.AltDir; 436 | ErrorCode = blendData.ErrorCode; 437 | //blendProjectName = blendData.ProjectName; 438 | 439 | if (blendData.EndFrame < endFrameNumericUpDown.Value) 440 | { 441 | endFrameNumericUpDown.Value = blendData.EndFrame; 442 | } 443 | 444 | } 445 | // Error checker 446 | errorMsgs(ErrorCode); 447 | 448 | //outFolderPathTextBox.Text = string.Empty; 449 | 450 | Trace.WriteLine("Json data = " + jsonInfo.ToString()); 451 | 452 | //Trace.WriteLine( String.Format( "CEW: {0}", p.StartInfo.Arguments ) ); 453 | 454 | } 455 | 456 | /// 457 | /// Error central, displays message and does actions 458 | /// according to given code, then returns 459 | /// 460 | /// 461 | /// same as er 462 | void errorMsgs(int er) 463 | { 464 | int input = er; 465 | // Actions 466 | 467 | // disable buttons if invalid 468 | var invalid_list = new List { -1, -2, -3, -104 }; 469 | var isbad = invalid_list.Contains(input); 470 | if (isbad == true) 471 | { 472 | renderAllButton.Enabled = false; 473 | renderSegmentButton.Enabled = false; 474 | concatenatePartsButton.Enabled = false; 475 | MixdownAudio.Enabled = false; 476 | } 477 | else 478 | { 479 | renderAllButton.Enabled = true; 480 | renderSegmentButton.Enabled = true; 481 | concatenatePartsButton.Enabled = true; 482 | MixdownAudio.Enabled = true; 483 | } 484 | 485 | // Messages 486 | string message; 487 | string caption = string.Format("Error ({0})", input); 488 | 489 | if (input == -1) 490 | { 491 | message = "Output file path empty, please set a valid path in project"; 492 | MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 493 | return; 494 | } 495 | else if (input == -2) 496 | { 497 | message = "Invalid Output path"; 498 | MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 499 | return; 500 | } 501 | else if (input == -3) 502 | { 503 | message = "Output path is relative, you MUST use absolute paths ONLY"; 504 | MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 505 | return; 506 | } 507 | else if (input == -100) 508 | { 509 | message = "FFmpeg can't find working folder"; 510 | MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 511 | return; 512 | } 513 | else if (input == -104) 514 | { 515 | message = "Invalid project"; 516 | MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Error); 517 | return; 518 | } 519 | else if (input == -404) 520 | { 521 | // Error scriptsfolder not found 522 | message = "Scripts folder not found. Separate audio mixdown and automatic project info detection will not work, but you can still use the basic rendering functionality."; 523 | MessageBox.Show(message, caption, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 524 | return; 525 | } 526 | else 527 | { 528 | // no problems, don't show error message 529 | return; 530 | } 531 | 532 | } 533 | 534 | private void ReadBlenderData_Click(object sender, EventArgs e) 535 | { 536 | DoReadBlenderData(); 537 | } 538 | 539 | private void MixdownAudio_Click(object sender, EventArgs e) 540 | { 541 | if (!File.Exists(blendFilePathTextBox.Text)) 542 | { 543 | return; 544 | } 545 | 546 | if (!Directory.Exists(ScriptsPath)) 547 | { 548 | errorMsgs(-404); 549 | return; 550 | } 551 | 552 | if (!Directory.Exists(partsFolderPathTextBox.Text)) 553 | { 554 | Directory.CreateDirectory(partsFolderPathTextBox.Text); 555 | } 556 | 557 | Process p = new Process(); 558 | 559 | p.StartInfo.FileName = "blender"; 560 | p.StartInfo.RedirectStandardOutput = true; 561 | p.StartInfo.UseShellExecute = false; 562 | //Using minimized instead so we get feedback 563 | //p.StartInfo.CreateNoWindow = true; 564 | p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 565 | 566 | p.StartInfo.Arguments = String.Format("-b \"{0}\" -P \"{1}\"", 567 | blendFilePathTextBox.Text, 568 | Path.Combine(ScriptsPath, "mixdown_audio.py") 569 | ); 570 | 571 | p.Start(); 572 | 573 | p.WaitForExit((int)TimeSpan.FromMinutes(5).TotalMilliseconds); 574 | 575 | Trace.WriteLine("MixDown Completed"); 576 | } 577 | 578 | private void mergeAudioButton_Click(object sender, EventArgs e) 579 | { 580 | string ffmpeg_dir; 581 | if (ajustOutDir.Checked == true) 582 | { 583 | ffmpeg_dir = AltDir; 584 | } 585 | else 586 | { 587 | ffmpeg_dir = outFolderPath; 588 | } 589 | if (!Directory.Exists(ffmpeg_dir)) 590 | { 591 | errorMsgs(-100); 592 | return; 593 | } 594 | 595 | string audioFile = Path.GetFileNameWithoutExtension(blendFilePathTextBox.Text); 596 | 597 | if (File.Exists(Path.Combine(ffmpeg_dir, audioFile + ".ac3"))) 598 | { 599 | Process p = new Process(); 600 | 601 | p.StartInfo.WorkingDirectory = ffmpeg_dir; 602 | //p.StartInfo.WorkingDirectory = AltDir; 603 | p.StartInfo.FileName = "ffmpeg"; 604 | //p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 605 | 606 | p.StartInfo.Arguments = String.Format("-i concat_output.mp4 -i {0}.ac3 -map 0:v -map 1:a -c copy -shortest audio_output.mp4", audioFile); 607 | 608 | p.Start(); 609 | 610 | //p.StandardInput.WriteLine('y'); 611 | } 612 | } 613 | 614 | /* About this app 615 | private void creditsToolStripMenuItem_Click(object sender, EventArgs e) 616 | { 617 | About about = new About(); 618 | about.Show(); 619 | } 620 | */ 621 | 622 | private void tipsToolStripMenuItem_Click(object sender, EventArgs e) 623 | { 624 | // show / hide tooltips 625 | if (tipsToolStripMenuItem.Checked == false) 626 | { 627 | activeWarn.Active = false; 628 | toolTip1.Active = false; 629 | //toolTip.Active = false; 630 | } 631 | else if (tipsToolStripMenuItem.Checked == true) 632 | { 633 | activeWarn.Active = true; 634 | toolTip1.Active = true; 635 | } 636 | 637 | } 638 | 639 | private void isti115ToolStripMenuItem_Click(object sender, EventArgs e) 640 | { 641 | Process.Start("https://github.com/Isti115/BlenderRenderController"); 642 | } 643 | 644 | private void meTwentyFiveToolStripMenuItem_Click(object sender, EventArgs e) 645 | { 646 | Process.Start("https://github.com/MeTwentyFive/BlenderRenderController"); 647 | } 648 | 649 | private void redRaptor93ToolStripMenuItem_Click(object sender, EventArgs e) 650 | { 651 | Process.Start("https://github.com/RedRaptor93/BlenderRenderController"); 652 | } 653 | private void jendabekToolStripMenuItem_Click(object sender, EventArgs e) 654 | { 655 | Process.Start("https://github.com/jendabek/BlenderRenderController"); 656 | } 657 | 658 | private void jsonToolStripMenuItem_Click(object sender, EventArgs e) 659 | { 660 | json_info op = new json_info(); 661 | op.Show(); 662 | } 663 | 664 | private void ajustOutDir_CheckedChanged(object sender, EventArgs e) 665 | { 666 | DoReadBlenderData(); 667 | } 668 | 669 | // DEBUG OPTIONS 670 | private void debugMenuToolStripMenuItem_Click(object sender, EventArgs e) 671 | { 672 | if (debugShow.Checked == false) 673 | { 674 | debugToolStripMenuItem.Visible = false; 675 | } 676 | else if (debugShow.Checked == true) 677 | { 678 | debugToolStripMenuItem.Visible = true; 679 | } 680 | } 681 | 682 | void jsonDel() 683 | { 684 | // delete json 685 | string jsonfile = Path.Combine(ScriptsPath, "blend_info.json"); 686 | if (File.Exists(jsonfile)) 687 | { 688 | File.Delete(jsonfile); 689 | //MessageBox.Show("Json deleted", "Ok"); 690 | } 691 | else 692 | { 693 | //MessageBox.Show("Json not found", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 694 | return; 695 | } 696 | 697 | } 698 | 699 | private void deleteJsonToolStripMenuItem_Click(object sender, EventArgs e) 700 | { 701 | jsonDel(); 702 | } 703 | 704 | private void MainForm_DragEnter(object sender, DragEventArgs e) 705 | { 706 | if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; 707 | } 708 | 709 | private void MainForm_DragDrop(object sender, DragEventArgs e) 710 | { 711 | string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 712 | 713 | this.blendFilePath = files[0]; 714 | this.blendFilePathTextBox.Text = this.blendFilePath; 715 | 716 | DoReadBlenderData(); 717 | } 718 | } 719 | } 720 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/MainForm.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 244, 17 122 | 123 | 124 | 17, 17 125 | 126 | 127 | 132, 17 128 | 129 | 130 | 46 131 | 132 | 133 | 134 | 135 | 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 756 | 757 | 758 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Threading.Tasks; 5 | using System.Windows.Forms; 6 | 7 | namespace BlenderRenderController 8 | { 9 | static class Program 10 | { 11 | /// 12 | /// The main entry point for the application. 13 | /// 14 | [STAThread] 15 | static void Main() 16 | { 17 | Application.EnableVisualStyles(); 18 | Application.SetCompatibleTextRenderingDefault(false); 19 | Application.Run(new MainForm()); 20 | } 21 | 22 | //string[] Args = Environment.GetCommandLineArgs(); 23 | //public static class ArgHolder 24 | //{ 25 | // public static Args { get; set; } 26 | //} 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("BlenderRenderController")] 9 | [assembly: AssemblyDescription("Contributors:")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("BlenderRenderController")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("b050dd69-b2be-4f42-8d4e-23b7a7eff2e5")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("0.5.0.0")] 36 | [assembly: AssemblyFileVersion("0.5.0.0")] 37 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.34209 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace BlenderRenderController.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BlenderRenderController.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | text/microsoft-resx 107 | 108 | 109 | 2.0 110 | 111 | 112 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 113 | 114 | 115 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.34209 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace BlenderRenderController.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Scripts/get_project_info.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import bpy 4 | import re 5 | from bpy import context 6 | from bpy import ops 7 | from bpy import data 8 | 9 | blendPath = bpy.context.blend_data.filepath; 10 | projName = bpy.path.display_name_from_filepath( blendPath ); 11 | 12 | # get number of Scenes and active scene name 13 | n_data = bpy.data.scenes 14 | a_data = bpy.context.scene 15 | 16 | # get values from strings 17 | N_of_Scenes = str(n_data).partition('[')[-1].rpartition(']')[0] 18 | ActiveScene = str(a_data).partition('("')[-1].rpartition('")')[0] 19 | 20 | # set infos acording to active Scene 21 | startFrame = bpy.data.scenes[ActiveScene].frame_start 22 | endFrame = bpy.data.scenes[ActiveScene].frame_end 23 | outputPath = bpy.data.scenes[ActiveScene].render.filepath 24 | 25 | # get rendering engine 26 | renderingEngine = bpy.context.scene.render.engine 27 | 28 | """ 29 | Error code table: 30 | 0: no errors 31 | -1: output unset, lenth = 0 32 | -2: output invalid, no slashes in path 33 | -3: output is relative, has // at start 34 | """ 35 | 36 | # check if relative 37 | rel_chk = outputPath[0:2] 38 | 39 | if len(outputPath) == 0: 40 | errorcode = -1 41 | 42 | elif outputPath.count("\\") == 0: 43 | errorcode = -2 44 | 45 | elif rel_chk == "//": 46 | errorcode = -3 47 | 48 | else: 49 | errorcode = 0 50 | 51 | # os.path.isabs(my_path) | true = absolute, false = relative 52 | 53 | # get output dir minus file name 54 | altdir = str(outputPath).rpartition('\\')[:-1][0] 55 | 56 | #print( "Proj Name: %s\n" % (projName) ) 57 | #print( "Start: %s\n" % (startFrame) ) 58 | #print( "end: %s\n" % (endFrame) ) 59 | 60 | data = { 'ProjectName': projName, 'StartFrame': startFrame, 'EndFrame': endFrame, 'OutputDirectory': outputPath, 61 | 'NumScenes': N_of_Scenes, 'ActiveScene': ActiveScene, 'AltDir': altdir, 'ErrorCode': errorcode, 62 | 'RenderingEngine': renderingEngine }; 63 | 64 | jsonData = json.dumps(data, indent=4, skipkeys=True, sort_keys=True); 65 | 66 | 67 | with open('blend_info.json', 'w') as f: 68 | print(jsonData, file=f) 69 | 70 | print(jsonData); 71 | 72 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Scripts/mixdown_audio.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | import bpy 4 | from bpy import context 5 | from bpy import ops 6 | 7 | blendPath = bpy.context.blend_data.filepath; 8 | projName = bpy.path.display_name_from_filepath( blendPath ); 9 | 10 | # get active scene name 11 | a_data = bpy.context.scene 12 | ActiveScene = str(a_data).partition('("')[-1].rpartition('")')[0] 13 | 14 | outputPath = bpy.data.scenes[ActiveScene].render.filepath 15 | 16 | #outputPath = bpy.data.scenes["Scene"].render.filepath 17 | 18 | bpy.ops.sound.mixdown( filepath=outputPath + "\\" + projName + ".ac3", 19 | container='AC3', 20 | codec='AC3', 21 | accuracy=1024, 22 | bitrate=512, 23 | format="F32", 24 | split_channels=False); 25 | 26 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/Settings.cs: -------------------------------------------------------------------------------- 1 | namespace BlenderRenderController.Properties { 2 | 3 | 4 | // This class allows you to handle specific events on the settings class: 5 | // The SettingChanging event is raised before a setting's value is changed. 6 | // The PropertyChanged event is raised after a setting's value is changed. 7 | // The SettingsLoaded event is raised after the setting values are loaded. 8 | // The SettingsSaving event is raised before the setting values are saved. 9 | internal sealed partial class Settings { 10 | 11 | public Settings() { 12 | // // To add event handlers for saving and changing settings, uncomment the lines below: 13 | // 14 | // this.SettingChanging += this.SettingChangingEventHandler; 15 | // 16 | // this.SettingsSaving += this.SettingsSavingEventHandler; 17 | // 18 | } 19 | 20 | private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { 21 | // Add code to handle the SettingChangingEvent event here. 22 | } 23 | 24 | private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { 25 | // Add code to handle the SettingsSaving event here. 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/json_info.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace BlenderRenderController 2 | { 3 | partial class json_info 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.label1 = new System.Windows.Forms.Label(); 32 | this.textBox1 = new System.Windows.Forms.TextBox(); 33 | this.button1 = new System.Windows.Forms.Button(); 34 | this.SuspendLayout(); 35 | // 36 | // label1 37 | // 38 | this.label1.AutoSize = true; 39 | this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 40 | this.label1.Location = new System.Drawing.Point(14, 10); 41 | this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); 42 | this.label1.Name = "label1"; 43 | this.label1.Size = new System.Drawing.Size(137, 20); 44 | this.label1.TabIndex = 0; 45 | this.label1.Text = "Json file contents:"; 46 | // 47 | // textBox1 48 | // 49 | this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 50 | | System.Windows.Forms.AnchorStyles.Left) 51 | | System.Windows.Forms.AnchorStyles.Right))); 52 | this.textBox1.Location = new System.Drawing.Point(14, 37); 53 | this.textBox1.Margin = new System.Windows.Forms.Padding(4); 54 | this.textBox1.Multiline = true; 55 | this.textBox1.Name = "textBox1"; 56 | this.textBox1.ReadOnly = true; 57 | this.textBox1.Size = new System.Drawing.Size(302, 207); 58 | this.textBox1.TabIndex = 1; 59 | this.textBox1.TabStop = false; 60 | this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); 61 | // 62 | // button1 63 | // 64 | this.button1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) 65 | | System.Windows.Forms.AnchorStyles.Right))); 66 | this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 67 | this.button1.Location = new System.Drawing.Point(108, 251); 68 | this.button1.Margin = new System.Windows.Forms.Padding(4); 69 | this.button1.Name = "button1"; 70 | this.button1.Size = new System.Drawing.Size(94, 36); 71 | this.button1.TabIndex = 2; 72 | this.button1.Text = "Refresh"; 73 | this.button1.UseVisualStyleBackColor = true; 74 | this.button1.Click += new System.EventHandler(this.button1_Click); 75 | // 76 | // json_info 77 | // 78 | this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); 79 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 80 | this.ClientSize = new System.Drawing.Size(332, 301); 81 | this.Controls.Add(this.button1); 82 | this.Controls.Add(this.textBox1); 83 | this.Controls.Add(this.label1); 84 | this.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 85 | this.Margin = new System.Windows.Forms.Padding(4); 86 | this.Name = "json_info"; 87 | this.Text = "Json"; 88 | this.Load += new System.EventHandler(this.debug_Load); 89 | this.ResumeLayout(false); 90 | this.PerformLayout(); 91 | 92 | } 93 | 94 | #endregion 95 | 96 | private System.Windows.Forms.Label label1; 97 | private System.Windows.Forms.Button button1; 98 | public System.Windows.Forms.TextBox textBox1; 99 | } 100 | } -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/json_info.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Drawing; 6 | using System.IO; 7 | using System.Linq; 8 | using System.Text; 9 | using System.Threading.Tasks; 10 | using System.Windows.Forms; 11 | 12 | namespace BlenderRenderController 13 | { 14 | public partial class json_info : Form 15 | { 16 | string ScriptsPath; 17 | string jsonfile; 18 | 19 | public class BlenderData 20 | { 21 | public int StartFrame; 22 | public int EndFrame; 23 | public string OutputDirectory; 24 | public string ProjectName; 25 | public string NumScenes; 26 | public string ActiveScene; 27 | } 28 | 29 | public json_info() 30 | { 31 | InitializeComponent(); 32 | 33 | string execPath = new Uri(System.Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath; 34 | ScriptsPath = Path.Combine(Path.GetDirectoryName(execPath), "Scripts"); 35 | jsonfile = Path.Combine(ScriptsPath, "blend_info.json"); 36 | } 37 | 38 | private void debug_Load(object sender, EventArgs e) 39 | { 40 | 41 | if (!File.Exists(jsonfile)) 42 | { 43 | textBox1.Text = "Json file not found!"; 44 | } 45 | else 46 | { 47 | textBox1.Text = File.ReadAllText(jsonfile); 48 | } 49 | } 50 | 51 | private void button1_Click(object sender, EventArgs e) 52 | { 53 | 54 | if (!File.Exists(jsonfile)) 55 | { 56 | return; 57 | } 58 | else 59 | { 60 | textBox1.Text = File.ReadAllText(jsonfile); 61 | } 62 | //textBox1.Text = File.ReadAllText(jsonfile); 63 | } 64 | 65 | private void textBox1_TextChanged(object sender, EventArgs e) 66 | { 67 | 68 | } 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/json_info.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/resources/blender-icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/isti115/BlenderRenderController/9f3434326ea9b0f223934d354762ccb417253340/BlenderRenderController/BlenderRenderController/resources/blender-icon.ico -------------------------------------------------------------------------------- /BlenderRenderController/BlenderRenderController/resources/icon.txt: -------------------------------------------------------------------------------- 1 | Icon source: 2 | http://www.iconarchive.com/show/real-vista-electrical-appliances-icons-by-iconshock/blender-icon.html 3 | 4 | re-color by RedRaptor93 -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 István Donkó 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Blender Render Controller 2 | 3 | Original post by me on Blender StackExchange: http://blender.stackexchange.com/a/44906/20611 4 | 5 | ## UPDATE: 6 | 7 | This program has been more or less deprecated, since **multithreaded rendering is now natively implemented in blender for the video sequence editor**, but since this project allows a more granular approach for setting up chunks and the number of threads, it could still be useful for: 8 | * Rendering on multiple machines and stitching the results together afterwards (for which copying them into a single folder and using this program's functionality is enough) 9 | * Rendering in the background without using up all the resources of the computer 10 | 11 | Because of these I will still leave it up here, but won't necessarily provide updates / support for it. The latest version I have tested with is Blender 2.9, for which the installation path has changed a little bit, but after updating the environmental variables it seems to work perfectly fine. 12 | 13 | ### Warning! This repository is not really well maintained, I recommend checking out mikeycal's script instead for a more active project: 14 | https://github.com/mikeycal/the-video-editors-render-script-for-blender 15 | 16 | If you would still like to use this app instead, I've implemented a quick fix in v0.5 for blender 2.8 (tested on the 2.83 LTS release) to get the rendering engine from the project `.blend` file, as in 2.8 the `BLENDER_RENDERER` was removed and `EEVEE` was introduced. 17 | 18 | ## Thanks to 19 | 20 | * [MeTwentyFive](https://github.com/MeTwentyFive/BlenderRenderController) for the initial update. 21 | * [RedRaptor93](https://github.com/RedRaptor93/BlenderRenderController/) for adding features and writing the first version of this README. 22 | * [jendabek](https://github.com/jendabek/BlenderRenderController) for the separate development. His changes are not merged into the release, so make sure to check them out as well at his repository! 23 | 24 | # Below is the README written by RedRaptor93 and modified by me (Isti115) for `Release v0.4` 25 | 26 | ## What is this? 27 | Blender Render Controller is a tool to help speed up the render process in Blender's Video Sequence Editor(VSE). 28 | 29 | VSE is pretty good for editing videos, it's precise and relatively easy to learn, making it a compelling choice next to other free video editing tools. There are some downsides too, main of which been that the renderer is SINGLE THREADED. Meaning that it won't take full advantage of all logical cores in your system, so rendering your finished project is SUPER SLOW compared to other video editors. 30 | 31 | This tool offers a work-around until the Blender developers make a better renderer for VSE, 32 | 33 | This tool offers a work-around by calling multiple instances of `blender.exe`, each rendering a different segment of the project at the same time, making use of processing power that would otherwise go unused. After all parts are rendered, join them together and BAM, your video is ready much faster then previously possible. 34 | 35 | ## How much difference does it make? 36 | Quite a lot! I did some testing shown below (Blender Render Controller shown in orange): 37 | 38 | ![Test3](https://raw.githubusercontent.com/RedRaptor93/BlenderRenderController/multiPlat/BlenderRenderController/extras/brc%20graph%201080p.png) 39 | 40 | ![Test1](https://raw.githubusercontent.com/RedRaptor93/BlenderRenderController/multiPlat/BlenderRenderController/extras/brc%20graph%20720p.png) 41 | 42 | PC used: i7 4790, 16GB DDR3 RAM @ 1600Mhz 43 | 44 | Really shows the importance of those extra cores huh? Even if you don't use Blender VSE often, that’s a LOT of time saved. And the time added by joining the videos together is negligible (less then 1min). 45 | 46 | ## HOW TO USE 47 | 48 | ### Dependencies 49 | - Blender, obviously 50 | - FFmpeg, required for joining the parts together. 51 | 52 | 1. Save your .blend file with the settings you want (output path, resolution, etc) 53 | 54 | - Make sure the "output path" is an ABSOLUTE path and not relative, you can change the default kind of path in Blender's user settings, BRC WON'T work w/ relative paths 55 | 56 | 2. Open BlenderRenderController, browse for the desired blend file 57 | 58 | - Alternatively, you can drop the .blend file onto the window or specify it as a command line argument: 59 | `> BlenderRenderController.exe "myProjectFile.blend"` 60 | 61 | 3. Select the chunk of the segment you want to render and press "render segment" to render a single segment or select "render all" to render the project in segments. 62 | 63 | - The length of each segment is controlled by the difference between the "Start Frame" and "End frame" values. 64 | [Only in RedRaptor's version: The default length when you open or re-read a file can be adjusted ("segment length" in Options => Settings)] 65 | 66 | 4. When all the parts are done, click "Concatenate parts" to join all parts together 67 | 68 | - If you get a "Can't find working folder error", try "remove file from path" option below, "parts folder" must point to a FOLDER, not a FILE. 69 | 70 | 5. If you find that the sound glitches at the concatenation points you should export the audio separately and then merge it with the video file afterwards with the labeled buttons in section __3. Audio__ of the program. 71 | 72 | 6. That's it! Hopefully you found this useful! 73 | If so, don't forget to star the repository and upvote the [StackExchange answer](http://blender.stackexchange.com/a/44906/20611) so more people can find it! :) 74 | --- 75 | ### Cross-platform alternative 76 | Mikeycal Meyers wrote his own python script as a cross-platform solution for the problem. 77 | You can find his explanation about it here: 78 | https://youtu.be/rgwP5L1bICk 79 | and the actual project here: 80 | https://github.com/mikeycal/the-video-editors-render-script-for-blender 81 | Make sure to check his work out as well, and help him improve it if you know some python! ;) 82 | --------------------------------------------------------------------------------