| /*jslint vars: true , plusplus: true, devel: true, nomen: true, regexp: true, indent: 4, maxerr: 50 */ |
| /*global bm_layerElement,bm_projectManager, bm_eventDispatcher, bm_sourceHelper, bm_generalUtils, bm_compsManager, bm_downloadManager, bm_textShapeHelper, bm_markerHelper, app, File, bm_dataManager*/ |
| |
| var bm_renderManager = (function () { |
| 'use strict'; |
| |
| var ob = {}, pendingLayers = [], pendingComps = [], destinationPath, fsDestinationPath, currentCompID, totalLayers, currentLayer, currentCompSettings, hasExpressionsFlag; |
| var currentExportedComps = []; |
| |
| function restoreParents(layers) { |
| |
| var layerData, parentData, i, len = layers.length, hasChangedState = false; |
| for (i = 0; i < len; i += 1) { |
| layerData = layers[i]; |
| if (layerData.parent){ |
| } |
| if (layerData.parent !== undefined && layerData.render !== false) { |
| parentData = layers[layerData.parent]; |
| if (parentData.render === false) { |
| parentData.ty = bm_layerElement.layerTypes.nullLayer; |
| hasChangedState = true; |
| parentData.render = true; |
| if (parentData.isValid === false || parentData.isGuide === false) { |
| parentData.isValid = true; |
| } |
| if(parentData.tt){ |
| delete parentData.tt; |
| } |
| if(parentData.td){ |
| delete parentData.td; |
| } |
| } |
| } |
| } |
| if (hasChangedState) { |
| restoreParents(layers); |
| } |
| } |
| |
| function createLayers(comp, layers, framerate, deepTraversing) { |
| var i, len = comp.layers.length, layerInfo, layerData, prevLayerData; |
| for (i = 0; i < len; i += 1) { |
| layerInfo = comp.layers[i + 1]; |
| layerData = bm_layerElement.prepareLayer(layerInfo, i); |
| ob.renderData.exportData.ddd = layerData.ddd === 1 ? 1 : ob.renderData.exportData.ddd; |
| if(currentCompSettings.hiddens && layerData.enabled === false){ |
| layerData.render = true; |
| layerData.enabled = true; |
| if(!layerData.td){ |
| layerData.hd = true; |
| } |
| } |
| if(currentCompSettings.guideds && layerData.isGuide === true){ |
| layerData.render = true; |
| layerData.hd = true; |
| } |
| if (layerData.td && prevLayerData && prevLayerData.td) { |
| prevLayerData.td = false; |
| if (prevLayerData.enabled === false && !currentCompSettings.hiddens) { |
| prevLayerData.render = false; |
| } |
| } else if (layerData.tt) { |
| if (layerData.render === false) { |
| if (prevLayerData.enabled === false && !currentCompSettings.hiddens) { |
| prevLayerData.render = false; |
| } |
| delete prevLayerData.td; |
| delete layerData.tt; |
| } else if (prevLayerData.render === false) { |
| delete layerData.tt; |
| } |
| } |
| layers.push(layerData); |
| pendingLayers.push({data: layerData, layer: layerInfo, framerate: framerate}); |
| prevLayerData = layerData; |
| } |
| restoreParents(layers); |
| for (i = 0; i < len; i += 1) { |
| layerData = layers[i]; |
| layerInfo = comp.layers[i + 1]; |
| bm_layerElement.checkLayerSource(layerInfo, layerData); |
| if (layerData.ty === bm_layerElement.layerTypes.text) { |
| bm_textShapeHelper.addComps(); |
| } |
| if (layerData.ty === bm_layerElement.layerTypes.precomp && layerData.render !== false && layerData.compId) { |
| currentExportedComps.push(layerData.compId); |
| if(deepTraversing){ |
| layerData.layers = []; |
| createLayers(layerInfo.source, layerData.layers, framerate, deepTraversing); |
| } |
| } |
| } |
| } |
| |
| function render(comp, destination, fsDestination, compSettings) { |
| currentExportedComps = []; |
| bm_ProjectHelper.init(); |
| hasExpressionsFlag = false; |
| currentCompID = comp.id; |
| currentCompSettings = compSettings; |
| bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Starting Render', compId: currentCompID, progress: 0}); |
| destinationPath = destination; |
| fsDestinationPath = fsDestination; |
| bm_sourceHelper.reset(); |
| bm_textShapeHelper.reset(); |
| pendingLayers.length = 0; |
| pendingComps.length = 0; |
| var exportData = { |
| assets : [], |
| comps : [], |
| fonts : [], |
| layers : [], |
| v : '4.4.10', |
| ddd : 0, |
| ip : comp.workAreaStart * comp.frameRate, |
| op : (comp.workAreaStart + comp.workAreaDuration) * comp.frameRate, |
| fr : comp.frameRate, |
| w : comp.width, |
| h : comp.height |
| }; |
| currentExportedComps.push(currentCompID); |
| ob.renderData.exportData = exportData; |
| ob.renderData.firstFrame = exportData.ip * comp.frameRate; |
| createLayers(comp, exportData.layers, exportData.fr, true); |
| exportExtraComps(exportData); |
| totalLayers = pendingLayers.length; |
| currentLayer = 0; |
| app.scheduleTask('bm_renderManager.renderNextLayer();', 20, false); |
| } |
| |
| function exportExtraComps(exportData){ |
| var list = currentCompSettings.extraComps.list; |
| var i, len = list.length, compData; |
| bm_eventDispatcher.log(currentExportedComps); |
| var j, jLen = currentExportedComps.length; |
| for(i=0;i<len;i+=1){ |
| j = 0; |
| while(j<jLen){ |
| if(currentExportedComps[j] === list[i]){ |
| break; |
| } |
| j += 1; |
| } |
| if(j===jLen){ |
| var comp = bm_projectManager.getCompositionById(list[i]); |
| compData = { |
| layers: [], |
| id: comp.id, |
| nm: comp.name, |
| xt: 1 |
| }; |
| createLayers(comp, compData.layers, exportData.fr, false); |
| exportData.comps.push(compData); |
| } |
| } |
| } |
| |
| function reset() { |
| pendingLayers.length = 0; |
| pendingComps.length = 0; |
| currentCompSettings = null; |
| bm_ProjectHelper.end(); |
| } |
| |
| function saveData() { |
| bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Saving data ', compId: currentCompID, progress: 1}); |
| bm_dataManager.saveData(ob.renderData.exportData, destinationPath, currentCompSettings); |
| bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Render finished ', compId: currentCompID, progress: 1, isFinished: true, fsPath: fsDestinationPath}); |
| reset(); |
| bm_textShapeHelper.removeComps(); |
| bm_compsManager.renderComplete(); |
| } |
| |
| function clearUnrenderedLayers(layers) { |
| var i, len = layers.length; |
| for (i = 0; i < len; i += 1) { |
| if (layers[i].render === false) { |
| layers.splice(i, 1); |
| i -= 1; |
| len -= 1; |
| } else if (layers[i].ty === bm_layerElement.layerTypes.precomp && layers[i].layers) { |
| clearUnrenderedLayers(layers[i].layers); |
| } |
| } |
| } |
| |
| function clearNames(layers) { |
| if (hasExpressionsFlag) { |
| return; |
| } |
| var i, len = layers.length; |
| for (i = 0; i < len; i += 1) { |
| layers[i].nm = null; |
| delete layers[i].nm; |
| if (layers[i].ty === bm_layerElement.layerTypes.precomp && layers[i].layers) { |
| clearNames(layers[i].layers); |
| } |
| } |
| |
| } |
| |
| function removeExtraData() { |
| clearUnrenderedLayers(ob.renderData.exportData.layers); |
| bm_ProjectHelper.end(); |
| /* Todo check if "clearNames" it changes filesize significantly */ |
| //clearNames(ob.renderData.exportData.layers); |
| } |
| |
| function renderNextLayer() { |
| if (bm_compsManager.cancelled) { |
| return; |
| } |
| if (pendingLayers.length) { |
| var nextLayerData = pendingLayers.pop(); |
| currentLayer += 1; |
| bm_eventDispatcher.sendEvent('bm:render:update', {type: 'update', message: 'Rendering layer: ' + nextLayerData.layer.name, compId: currentCompID, progress: currentLayer / totalLayers}); |
| bm_layerElement.renderLayer(nextLayerData); |
| } else { |
| bm_eventDispatcher.log(currentCompSettings.extraComps.list.length); |
| removeExtraData(); |
| bm_sourceHelper.exportImages(destinationPath, ob.renderData.exportData.assets, currentCompID); |
| } |
| } |
| |
| function checkFonts() { |
| var fonts = bm_sourceHelper.getFonts(); |
| var exportData; |
| if (fonts.length === 0) { |
| saveData(); |
| } else { |
| if (currentCompSettings.glyphs) { |
| var fontsInfo = { |
| list: [] |
| }; |
| var list = fontsInfo.list; |
| var i, len = fonts.length, fontOb; |
| for (i = 0; i < len; i += 1) { |
| fontOb = {}; |
| fontOb.fName = fonts[i].name; |
| fontOb.fFamily = fonts[i].family; |
| fontOb.fStyle = fonts[i].style; |
| list.push(fontOb); |
| } |
| exportData = ob.renderData.exportData; |
| exportData.fonts = fontsInfo; |
| bm_textShapeHelper.exportFonts(fontsInfo); |
| bm_textShapeHelper.exportChars(fontsInfo); |
| } else { |
| exportData = ob.renderData.exportData; |
| bm_eventDispatcher.sendEvent('bm:render:fonts', {type: 'save', compId: currentCompID, fonts: fonts}); |
| } |
| } |
| } |
| |
| function setChars(chars) { |
| bm_eventDispatcher.sendEvent('bm:render:chars', {type: 'save', compId: currentCompID, chars: chars}); |
| } |
| |
| function setFontData(fontData) { |
| var exportData = ob.renderData.exportData; |
| exportData.fonts = fontData; |
| bm_textShapeHelper.exportFonts(fontData); |
| bm_textShapeHelper.exportChars(fontData); |
| } |
| |
| function setCharsData(charData) { |
| var exportData = ob.renderData.exportData; |
| exportData.chars = charData; |
| saveData(); |
| } |
| |
| function imagesReady() { |
| checkFonts(); |
| } |
| |
| function renderLayerComplete() { |
| app.scheduleTask('bm_renderManager.renderNextLayer();', 20, false); |
| } |
| |
| function hasExpressions() { |
| hasExpressionsFlag = true; |
| } |
| |
| ob.renderData = { |
| exportData : { |
| assets : [] |
| } |
| }; |
| ob.render = render; |
| ob.renderLayerComplete = renderLayerComplete; |
| ob.renderNextLayer = renderNextLayer; |
| ob.setChars = setChars; |
| ob.imagesReady = imagesReady; |
| ob.setFontData = setFontData; |
| ob.setCharsData = setCharsData; |
| ob.hasExpressions = hasExpressions; |
| |
| return ob; |
| }()); |