@lumen5/lottie-web 5.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/.babelrc.json +3 -0
  2. package/.eslintrc.json +46 -0
  3. package/.gitattributes +1 -0
  4. package/.github/FUNDING.yml +1 -0
  5. package/.github/ISSUE_TEMPLATE.md +22 -0
  6. package/.github/workflows/publish.yml +26 -0
  7. package/.github/workflows/testAnimations.yml +29 -0
  8. package/.github/workflows/updateScreenshots.yml +34 -0
  9. package/CHANGELOG.md +601 -0
  10. package/History.md +1230 -0
  11. package/LICENSE.md +21 -0
  12. package/README.md +351 -0
  13. package/bower.json +31 -0
  14. package/build/old_parser/bodymovin_parser.jsx +3023 -0
  15. package/build/old_parser/helperProject.aep +0 -0
  16. package/build/player/cjs/lottie.min.js +18229 -0
  17. package/build/player/cjs/lottie_canvas.min.js +16465 -0
  18. package/build/player/cjs/lottie_html.min.js +16312 -0
  19. package/build/player/cjs/lottie_light.min.js +11584 -0
  20. package/build/player/cjs/lottie_light_canvas.min.js +13518 -0
  21. package/build/player/cjs/lottie_light_html.min.js +12843 -0
  22. package/build/player/cjs/lottie_svg.min.js +15053 -0
  23. package/build/player/esm/lottie.min.js +18225 -0
  24. package/build/player/esm/lottie_canvas.min.js +16461 -0
  25. package/build/player/esm/lottie_html.min.js +16308 -0
  26. package/build/player/esm/lottie_light.min.js +11580 -0
  27. package/build/player/esm/lottie_light_canvas.min.js +13514 -0
  28. package/build/player/esm/lottie_light_html.min.js +12839 -0
  29. package/build/player/esm/lottie_svg.min.js +15049 -0
  30. package/build/player/lottie.d.ts +5 -0
  31. package/build/player/lottie.js +17151 -0
  32. package/build/player/lottie.min.js +1 -0
  33. package/build/player/lottie_canvas.js +15506 -0
  34. package/build/player/lottie_canvas.min.js +1 -0
  35. package/build/player/lottie_canvas_worker.js +18196 -0
  36. package/build/player/lottie_canvas_worker.min.js +15 -0
  37. package/build/player/lottie_html.d.ts +5 -0
  38. package/build/player/lottie_html.js +15354 -0
  39. package/build/player/lottie_html.min.js +1 -0
  40. package/build/player/lottie_light.d.ts +5 -0
  41. package/build/player/lottie_light.js +10854 -0
  42. package/build/player/lottie_light.min.js +1 -0
  43. package/build/player/lottie_light_canvas.d.ts +5 -0
  44. package/build/player/lottie_light_canvas.js +12666 -0
  45. package/build/player/lottie_light_canvas.min.js +1 -0
  46. package/build/player/lottie_light_html.d.ts +5 -0
  47. package/build/player/lottie_light_html.js +12029 -0
  48. package/build/player/lottie_light_html.min.js +1 -0
  49. package/build/player/lottie_svg.d.ts +5 -0
  50. package/build/player/lottie_svg.js +14179 -0
  51. package/build/player/lottie_svg.min.js +1 -0
  52. package/build/player/lottie_worker.js +18196 -0
  53. package/build/player/lottie_worker.min.js +15 -0
  54. package/docs/json/animation.json +101 -0
  55. package/docs/json/effects/angle.json +40 -0
  56. package/docs/json/effects/checkBox.json +40 -0
  57. package/docs/json/effects/color.json +40 -0
  58. package/docs/json/effects/customValue.json +4 -0
  59. package/docs/json/effects/dropDown.json +40 -0
  60. package/docs/json/effects/fill.json +55 -0
  61. package/docs/json/effects/group.json +41 -0
  62. package/docs/json/effects/index.json +51 -0
  63. package/docs/json/effects/layer.json +33 -0
  64. package/docs/json/effects/noValue.json +1 -0
  65. package/docs/json/effects/point.json +43 -0
  66. package/docs/json/effects/proLevels.json +130 -0
  67. package/docs/json/effects/slider.json +40 -0
  68. package/docs/json/effects/stroke.json +64 -0
  69. package/docs/json/effects/tint.json +43 -0
  70. package/docs/json/effects/tritone.json +46 -0
  71. package/docs/json/helpers/blendMode.json +71 -0
  72. package/docs/json/helpers/boolean.json +14 -0
  73. package/docs/json/helpers/composite.json +15 -0
  74. package/docs/json/helpers/lineCap.json +19 -0
  75. package/docs/json/helpers/lineJoin.json +19 -0
  76. package/docs/json/helpers/mask.json +80 -0
  77. package/docs/json/helpers/textBased.json +23 -0
  78. package/docs/json/helpers/textGrouping.json +23 -0
  79. package/docs/json/helpers/textShape.json +31 -0
  80. package/docs/json/helpers/transform.json +146 -0
  81. package/docs/json/layers/image.json +113 -0
  82. package/docs/json/layers/null.json +87 -0
  83. package/docs/json/layers/preComp.json +118 -0
  84. package/docs/json/layers/shape.json +157 -0
  85. package/docs/json/layers/solid.json +120 -0
  86. package/docs/json/layers/text.json +523 -0
  87. package/docs/json/properties/doubleKeyframe.json +50 -0
  88. package/docs/json/properties/multiDimensional.json +21 -0
  89. package/docs/json/properties/multiDimensionalKeyframed.json +35 -0
  90. package/docs/json/properties/offsetKeyframe.json +53 -0
  91. package/docs/json/properties/shape.json +27 -0
  92. package/docs/json/properties/shapeKeyframed.json +35 -0
  93. package/docs/json/properties/shapeProp.json +50 -0
  94. package/docs/json/properties/shapePropKeyframe.json +54 -0
  95. package/docs/json/properties/value.json +21 -0
  96. package/docs/json/properties/valueKeyframe.json +33 -0
  97. package/docs/json/properties/valueKeyframed.json +25 -0
  98. package/docs/json/shapes/ellipse.json +54 -0
  99. package/docs/json/shapes/fill.json +48 -0
  100. package/docs/json/shapes/gFill.json +107 -0
  101. package/docs/json/shapes/gStroke.json +137 -0
  102. package/docs/json/shapes/group.json +89 -0
  103. package/docs/json/shapes/merge.json +27 -0
  104. package/docs/json/shapes/rect.json +66 -0
  105. package/docs/json/shapes/repeater.json +63 -0
  106. package/docs/json/shapes/round.json +35 -0
  107. package/docs/json/shapes/shape.json +40 -0
  108. package/docs/json/shapes/star.json +133 -0
  109. package/docs/json/shapes/stroke.json +78 -0
  110. package/docs/json/shapes/transform.json +102 -0
  111. package/docs/json/shapes/trim.json +61 -0
  112. package/docs/json/sources/chars.json +61 -0
  113. package/docs/json/sources/image.json +31 -0
  114. package/docs/json/sources/precomp.json +39 -0
  115. package/index.d.ts +197 -0
  116. package/package.json +54 -0
  117. package/player/index.html +115 -0
  118. package/player/js/3rd_party/BezierEaser.js +158 -0
  119. package/player/js/3rd_party/howler.js +5 -0
  120. package/player/js/3rd_party/seedrandom.js +237 -0
  121. package/player/js/3rd_party/transformation-matrix.js +449 -0
  122. package/player/js/EffectsManager.js +83 -0
  123. package/player/js/animation/AnimationItem.js +809 -0
  124. package/player/js/animation/AnimationItemWorkerOverride.js +157 -0
  125. package/player/js/animation/AnimationManager.js +248 -0
  126. package/player/js/animation/AnimationManagerWorkerOverride.js +201 -0
  127. package/player/js/effects/EffectsManagerPlaceholder.js +5 -0
  128. package/player/js/effects/SliderEffect.js +37 -0
  129. package/player/js/effects/TransformEffect.js +44 -0
  130. package/player/js/elements/AudioElement.js +102 -0
  131. package/player/js/elements/BaseElement.js +78 -0
  132. package/player/js/elements/BaseTextElement.js +4 -0
  133. package/player/js/elements/CompElement.js +107 -0
  134. package/player/js/elements/FootageElement.js +47 -0
  135. package/player/js/elements/ImageElement.js +42 -0
  136. package/player/js/elements/NullElement.js +39 -0
  137. package/player/js/elements/ShapeElement.js +76 -0
  138. package/player/js/elements/SolidElement.js +23 -0
  139. package/player/js/elements/TextElement.js +94 -0
  140. package/player/js/elements/canvasElements/CVBaseElement.js +167 -0
  141. package/player/js/elements/canvasElements/CVCompBaseElement.js +11 -0
  142. package/player/js/elements/canvasElements/CVCompElement.js +57 -0
  143. package/player/js/elements/canvasElements/CVContextData.js +239 -0
  144. package/player/js/elements/canvasElements/CVEffects.js +57 -0
  145. package/player/js/elements/canvasElements/CVImageElement.js +58 -0
  146. package/player/js/elements/canvasElements/CVMaskElement.js +72 -0
  147. package/player/js/elements/canvasElements/CVShapeElement.js +521 -0
  148. package/player/js/elements/canvasElements/CVSolidElement.js +30 -0
  149. package/player/js/elements/canvasElements/CVTextElement.js +244 -0
  150. package/player/js/elements/canvasElements/effects/CVGaussianBlurEffect.js +29 -0
  151. package/player/js/elements/canvasElements/effects/CVTransformEffect.js +9 -0
  152. package/player/js/elements/helpers/FrameElement.js +54 -0
  153. package/player/js/elements/helpers/HierarchyElement.js +52 -0
  154. package/player/js/elements/helpers/RenderableDOMElement.js +72 -0
  155. package/player/js/elements/helpers/RenderableElement.js +87 -0
  156. package/player/js/elements/helpers/TransformElement.js +140 -0
  157. package/player/js/elements/helpers/shapes/CVShapeData.js +33 -0
  158. package/player/js/elements/helpers/shapes/ProcessedElement.js +6 -0
  159. package/player/js/elements/helpers/shapes/SVGElementsRenderer.js +239 -0
  160. package/player/js/elements/helpers/shapes/SVGFillStyleData.js +18 -0
  161. package/player/js/elements/helpers/shapes/SVGGradientFillStyleData.js +100 -0
  162. package/player/js/elements/helpers/shapes/SVGGradientStrokeStyleData.js +20 -0
  163. package/player/js/elements/helpers/shapes/SVGNoStyleData.js +15 -0
  164. package/player/js/elements/helpers/shapes/SVGShapeData.js +28 -0
  165. package/player/js/elements/helpers/shapes/SVGStrokeStyleData.js +21 -0
  166. package/player/js/elements/helpers/shapes/SVGStyleData.js +19 -0
  167. package/player/js/elements/helpers/shapes/SVGTransformData.js +11 -0
  168. package/player/js/elements/helpers/shapes/ShapeElement.js +5 -0
  169. package/player/js/elements/helpers/shapes/ShapeGroupData.js +9 -0
  170. package/player/js/elements/helpers/shapes/ShapeTransformManager.js +61 -0
  171. package/player/js/elements/htmlElements/HBaseElement.js +88 -0
  172. package/player/js/elements/htmlElements/HCameraElement.js +170 -0
  173. package/player/js/elements/htmlElements/HCompElement.js +61 -0
  174. package/player/js/elements/htmlElements/HEffects.js +3 -0
  175. package/player/js/elements/htmlElements/HImageElement.js +42 -0
  176. package/player/js/elements/htmlElements/HShapeElement.js +261 -0
  177. package/player/js/elements/htmlElements/HSolidElement.js +36 -0
  178. package/player/js/elements/htmlElements/HTextElement.js +290 -0
  179. package/player/js/elements/svgElements/SVGBaseElement.js +181 -0
  180. package/player/js/elements/svgElements/SVGCompElement.js +28 -0
  181. package/player/js/elements/svgElements/SVGEffects.js +70 -0
  182. package/player/js/elements/svgElements/SVGEffectsPlaceholder.js +3 -0
  183. package/player/js/elements/svgElements/SVGShapeElement.js +366 -0
  184. package/player/js/elements/svgElements/SVGTextElement.js +322 -0
  185. package/player/js/elements/svgElements/effects/SVGComposableEffect.js +22 -0
  186. package/player/js/elements/svgElements/effects/SVGDropShadowEffect.js +83 -0
  187. package/player/js/elements/svgElements/effects/SVGFillFilter.js +22 -0
  188. package/player/js/elements/svgElements/effects/SVGGaussianBlurEffect.js +44 -0
  189. package/player/js/elements/svgElements/effects/SVGMatte3Effect.js +101 -0
  190. package/player/js/elements/svgElements/effects/SVGProLevelsFilter.js +108 -0
  191. package/player/js/elements/svgElements/effects/SVGStrokeEffect.js +119 -0
  192. package/player/js/elements/svgElements/effects/SVGTintEffect.js +47 -0
  193. package/player/js/elements/svgElements/effects/SVGTransformEffect.js +10 -0
  194. package/player/js/elements/svgElements/effects/SVGTritoneFilter.js +43 -0
  195. package/player/js/main.js +21 -0
  196. package/player/js/mask.js +239 -0
  197. package/player/js/module.js +153 -0
  198. package/player/js/modules/canvas.js +22 -0
  199. package/player/js/modules/canvas_light.js +25 -0
  200. package/player/js/modules/full.js +70 -0
  201. package/player/js/modules/full_worker.js +0 -0
  202. package/player/js/modules/html.js +37 -0
  203. package/player/js/modules/html_light.js +25 -0
  204. package/player/js/modules/main.js +162 -0
  205. package/player/js/modules/svg.js +37 -0
  206. package/player/js/modules/svg_light.js +25 -0
  207. package/player/js/renderers/BaseRenderer.js +187 -0
  208. package/player/js/renderers/CanvasRenderer.js +67 -0
  209. package/player/js/renderers/CanvasRendererBase.js +318 -0
  210. package/player/js/renderers/CanvasRendererWorkerOverride.js +54 -0
  211. package/player/js/renderers/HybridRenderer.js +47 -0
  212. package/player/js/renderers/HybridRendererBase.js +344 -0
  213. package/player/js/renderers/SVGRenderer.js +82 -0
  214. package/player/js/renderers/SVGRendererBase.js +255 -0
  215. package/player/js/renderers/renderersManager.js +29 -0
  216. package/player/js/utils/BaseEvent.js +42 -0
  217. package/player/js/utils/DataManager.js +676 -0
  218. package/player/js/utils/DataManagerWorkerOverrides.js +13 -0
  219. package/player/js/utils/FontManager.js +443 -0
  220. package/player/js/utils/FontManagerWorkerOverride.js +16 -0
  221. package/player/js/utils/PolynomialBezier.js +253 -0
  222. package/player/js/utils/PropertyFactory.js +489 -0
  223. package/player/js/utils/SlotManager.js +17 -0
  224. package/player/js/utils/TransformProperty.js +251 -0
  225. package/player/js/utils/animationFramePolyFill.js +25 -0
  226. package/player/js/utils/asset_loader.js +53 -0
  227. package/player/js/utils/asset_loader_worker_override.js +3 -0
  228. package/player/js/utils/audio/AudioController.js +85 -0
  229. package/player/js/utils/audio/AudioElement.js +6 -0
  230. package/player/js/utils/bez.js +251 -0
  231. package/player/js/utils/common.js +280 -0
  232. package/player/js/utils/expressions/CompInterface.js +28 -0
  233. package/player/js/utils/expressions/EffectInterface.js +111 -0
  234. package/player/js/utils/expressions/ExpressionManager.js +752 -0
  235. package/player/js/utils/expressions/ExpressionPropertyDecorator.js +463 -0
  236. package/player/js/utils/expressions/ExpressionTextPropertyDecorator.js +40 -0
  237. package/player/js/utils/expressions/ExpressionValue.js +61 -0
  238. package/player/js/utils/expressions/ExpressionValueFactory.js +102 -0
  239. package/player/js/utils/expressions/Expressions.js +48 -0
  240. package/player/js/utils/expressions/FootageInterface.js +60 -0
  241. package/player/js/utils/expressions/InterfacesProvider.js +21 -0
  242. package/player/js/utils/expressions/LayerInterface.js +179 -0
  243. package/player/js/utils/expressions/MaskInterface.js +50 -0
  244. package/player/js/utils/expressions/ProjectInterface.js +31 -0
  245. package/player/js/utils/expressions/PropertyGroupFactory.js +13 -0
  246. package/player/js/utils/expressions/PropertyInterface.js +19 -0
  247. package/player/js/utils/expressions/ShapeInterface.js +543 -0
  248. package/player/js/utils/expressions/TextInterface.js +35 -0
  249. package/player/js/utils/expressions/TextSelectorPropertyDecorator.js +44 -0
  250. package/player/js/utils/expressions/TransformInterface.js +126 -0
  251. package/player/js/utils/expressions/expressionHelpers.js +86 -0
  252. package/player/js/utils/expressions/shapes/ShapePathInterface.js +47 -0
  253. package/player/js/utils/featureSupport.js +16 -0
  254. package/player/js/utils/filters.js +32 -0
  255. package/player/js/utils/functionExtensions.js +27 -0
  256. package/player/js/utils/getFontProperties.js +42 -0
  257. package/player/js/utils/helpers/arrays.js +43 -0
  258. package/player/js/utils/helpers/assetManager.js +96 -0
  259. package/player/js/utils/helpers/blendModes.js +26 -0
  260. package/player/js/utils/helpers/bufferManager.js +61 -0
  261. package/player/js/utils/helpers/dynamicProperties.js +29 -0
  262. package/player/js/utils/helpers/effectTypes.js +3 -0
  263. package/player/js/utils/helpers/html_elements.js +6 -0
  264. package/player/js/utils/helpers/propTypes.js +3 -0
  265. package/player/js/utils/helpers/shapeEnums.js +16 -0
  266. package/player/js/utils/helpers/svg_elements.js +8 -0
  267. package/player/js/utils/imagePreloader.js +213 -0
  268. package/player/js/utils/imagePreloaderWorkerOverride.js +3 -0
  269. package/player/js/utils/markers/markerParser.js +47 -0
  270. package/player/js/utils/pooling/bezier_length_pool.js +20 -0
  271. package/player/js/utils/pooling/point_pool.js +13 -0
  272. package/player/js/utils/pooling/pool_factory.js +44 -0
  273. package/player/js/utils/pooling/pooling.js +15 -0
  274. package/player/js/utils/pooling/segments_length_pool.js +24 -0
  275. package/player/js/utils/pooling/shapeCollection_pool.js +48 -0
  276. package/player/js/utils/pooling/shape_pool.js +44 -0
  277. package/player/js/utils/shapes/DashProperty.js +63 -0
  278. package/player/js/utils/shapes/GradientProperty.js +93 -0
  279. package/player/js/utils/shapes/MouseModifier.js +222 -0
  280. package/player/js/utils/shapes/OffsetPathModifier.js +306 -0
  281. package/player/js/utils/shapes/PuckerAndBloatModifier.js +80 -0
  282. package/player/js/utils/shapes/RepeaterModifier.js +232 -0
  283. package/player/js/utils/shapes/RoundCornersModifier.js +122 -0
  284. package/player/js/utils/shapes/ShapeCollection.js +29 -0
  285. package/player/js/utils/shapes/ShapeModifiers.js +71 -0
  286. package/player/js/utils/shapes/ShapePath.js +100 -0
  287. package/player/js/utils/shapes/ShapeProperty.js +546 -0
  288. package/player/js/utils/shapes/TrimModifier.js +359 -0
  289. package/player/js/utils/shapes/ZigZagModifier.js +174 -0
  290. package/player/js/utils/shapes/shapePathBuilder.js +20 -0
  291. package/player/js/utils/text/LetterProps.js +60 -0
  292. package/player/js/utils/text/TextAnimatorDataProperty.js +34 -0
  293. package/player/js/utils/text/TextAnimatorProperty.js +610 -0
  294. package/player/js/utils/text/TextProperty.js +461 -0
  295. package/player/js/utils/text/TextSelectorProperty.js +179 -0
  296. package/player/js/worker_wrapper.js +1029 -0
  297. package/rollup.config.js +215 -0
  298. package/tasks/build.js +773 -0
  299. package/tasks/build_worker.js +164 -0
  300. package/tasks/watch.js +34 -0
@@ -0,0 +1,3023 @@
1
+ var Gtlym = {};var bodymovinWindow = this;
2
+ (function(){
3
+ /****** INIT JSON PARSER ******/
4
+ if (typeof JSON !== 'object') {
5
+ JSON = {};
6
+ }
7
+ (function () {
8
+ 'use strict';
9
+
10
+ function f(n) {
11
+ return n < 10 ? '0' + n : n;
12
+ }
13
+
14
+ if (typeof Date.prototype.toJSON !== 'function') {
15
+
16
+ Date.prototype.toJSON = function () {
17
+
18
+ return isFinite(this.valueOf())
19
+ ? this.getUTCFullYear() + '-' +
20
+ f(this.getUTCMonth() + 1) + '-' +
21
+ f(this.getUTCDate()) + 'T' +
22
+ f(this.getUTCHours()) + ':' +
23
+ f(this.getUTCMinutes()) + ':' +
24
+ f(this.getUTCSeconds()) + 'Z'
25
+ : null;
26
+ };
27
+
28
+ String.prototype.toJSON =
29
+ Number.prototype.toJSON =
30
+ Boolean.prototype.toJSON = function () {
31
+ return this.valueOf();
32
+ };
33
+ }
34
+
35
+ var cx,
36
+ escapable,
37
+ gap,
38
+ indent,
39
+ meta,
40
+ rep;
41
+
42
+ function quote(string) {
43
+ escapable.lastIndex = 0;
44
+ return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
45
+ var c = meta[a];
46
+ return typeof c === 'string'
47
+ ? c
48
+ : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
49
+ }) + '"' : '"' + string + '"';
50
+ }
51
+
52
+
53
+ function str(key, holder) {
54
+ var i,
55
+
56
+ k,
57
+ v,
58
+ length,
59
+ mind = gap,
60
+ partial,
61
+ value = holder[key];
62
+ if (value && typeof value === 'object' &&
63
+ typeof value.toJSON === 'function') {
64
+ value = value.toJSON(key);
65
+ }
66
+ if (typeof rep === 'function') {
67
+ value = rep.call(holder, key, value);
68
+ }
69
+ switch (typeof value) {
70
+ case 'string':
71
+ return quote(value);
72
+ case 'number':
73
+ return isFinite(value) ? String(value) : 'null';
74
+ case 'boolean':
75
+ case 'null':
76
+ return String(value);
77
+ case 'object':
78
+ if (!value) {
79
+ return 'null';
80
+ }
81
+ gap += indent;
82
+ partial = [];
83
+ if (Object.prototype.toString.apply(value) === '[object Array]') {
84
+ length = value.length;
85
+ for (i = 0; i < length; i += 1) {
86
+ partial[i] = str(i, value) || 'null';
87
+ }
88
+ v = partial.length === 0
89
+ ? '[]'
90
+ : gap
91
+ ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
92
+ : '[' + partial.join(',') + ']';
93
+ gap = mind;
94
+ return v;
95
+ }
96
+ if (rep && typeof rep === 'object') {
97
+ length = rep.length;
98
+ for (i = 0; i < length; i += 1) {
99
+ if (typeof rep[i] === 'string') {
100
+ k = rep[i];
101
+ v = str(k, value);
102
+ if (v) {
103
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
104
+ }
105
+ }
106
+ }
107
+ } else {
108
+ for (k in value) {
109
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
110
+ v = str(k, value);
111
+ if (v) {
112
+ partial.push(quote(k) + (gap ? ': ' : ':') + v);
113
+ }
114
+ }
115
+ }
116
+ }
117
+ v = partial.length === 0
118
+ ? '{}'
119
+ : gap
120
+ ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
121
+ : '{' + partial.join(',') + '}';
122
+ gap = mind;
123
+ return v;
124
+ }
125
+ }
126
+ if (typeof JSON.stringify !== 'function') {
127
+ escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
128
+ meta = {
129
+ '\b': '\\b',
130
+ '\t': '\\t',
131
+ '\n': '\\n',
132
+ '\f': '\\f',
133
+ '\r': '\\r',
134
+ '"' : '\\"',
135
+ '\\': '\\\\'
136
+ };
137
+ JSON.stringify = function (value, replacer, space) {
138
+ var i;
139
+ gap = '';
140
+ indent = '';
141
+ if (typeof space === 'number') {
142
+ for (i = 0; i < space; i += 1) {
143
+ indent += ' ';
144
+ }
145
+ } else if (typeof space === 'string') {
146
+ indent = space;
147
+ }
148
+ rep = replacer;
149
+ if (replacer && typeof replacer !== 'function' &&
150
+ (typeof replacer !== 'object' ||
151
+ typeof replacer.length !== 'number')) {
152
+ throw new Error('JSON.stringify');
153
+ }
154
+ return str('', {'': value});
155
+ };
156
+ }
157
+ if (typeof JSON.parse !== 'function') {
158
+ cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
159
+ JSON.parse = function (text, reviver) {
160
+ var j;
161
+ function walk(holder, key) {
162
+ var k, v, value = holder[key];
163
+ if (value && typeof value === 'object') {
164
+ for (k in value) {
165
+ if (Object.prototype.hasOwnProperty.call(value, k)) {
166
+ v = walk(value, k);
167
+ if (v !== undefined) {
168
+ value[k] = v;
169
+ } else {
170
+ delete value[k];
171
+ }
172
+ }
173
+ }
174
+ }
175
+ return reviver.call(holder, key, value);
176
+ }
177
+ text = String(text);
178
+ cx.lastIndex = 0;
179
+ if (cx.test(text)) {
180
+ text = text.replace(cx, function (a) {
181
+ return '\\u' +
182
+ ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
183
+ });
184
+ }
185
+ if (/^[\],:{}\s]*$/
186
+ .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
187
+ .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
188
+ .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
189
+
190
+ j = eval('(' + text + ')');
191
+ return typeof reviver === 'function'
192
+ ? walk({'': j}, '')
193
+ : j;
194
+ }
195
+ throw new SyntaxError('JSON.parse');
196
+ };
197
+ }
198
+ }());
199
+ /****** END JSON PARSER ******/
200
+ /****** INIT ARRAY POLYFILLS ******/
201
+ if (!Array.prototype.forEach) {
202
+ Array.prototype.forEach = function(callback, thisArg) {
203
+ var T, k;
204
+ if (this == null) {
205
+ throw new TypeError(' this is null or not defined');
206
+ }
207
+ var O = Object(this);
208
+ var len = O.length >>> 0;
209
+ if (typeof callback !== "function") {
210
+ throw new TypeError(callback + ' is not a function');
211
+ }
212
+ if (arguments.length > 1) {
213
+ T = thisArg;
214
+ }
215
+ k = 0;
216
+ while (k < len) {
217
+ var kValue;
218
+ if (k in O) {
219
+ kValue = O[k];
220
+ callback.call(T, kValue, k, O);
221
+ }
222
+ k++;
223
+ }
224
+ };
225
+ }
226
+ if (!Array.prototype.map) {
227
+ Array.prototype.map = function(callback, thisArg) {
228
+
229
+ var T, A, k;
230
+
231
+ if (this == null) {
232
+ throw new TypeError(' this is null or not defined');
233
+ }
234
+ var O = Object(this);
235
+ var len = O.length >>> 0;
236
+ if (typeof callback !== 'function') {
237
+ throw new TypeError(callback + ' is not a function');
238
+ }
239
+ if (arguments.length > 1) {
240
+ T = thisArg;
241
+ }
242
+ A = new Array(len);
243
+ k = 0;
244
+ while (k < len) {
245
+ var kValue, mappedValue;
246
+ if (k in O) {
247
+ kValue = O[k];
248
+ mappedValue = callback.call(T, kValue, k, O);
249
+ A[k] = mappedValue;
250
+ }
251
+ k++;
252
+ }
253
+
254
+ return A;
255
+ };
256
+ }
257
+ /****** END ARRAY POLYFILLS ******/
258
+
259
+ var console = {
260
+ log : function(){
261
+ $.writeln.call($,arguments);
262
+ }
263
+ };
264
+ /****** INIT Var Declarations ******/
265
+ var helperSolidComp;
266
+ var helperFootage;
267
+ //Solid for anchor point fix on shape layers
268
+ var helperSolid;
269
+ //Destination export folder
270
+ var exportFolder;
271
+ //Interval objects container
272
+ //var Gtlym = {};
273
+ Gtlym.CALL = {};
274
+ //Render cancelled flag
275
+ var renderCancelled = false;
276
+
277
+ //modules
278
+ var LayerConverter;
279
+ var rqManager;
280
+ var extrasInstance;
281
+ var AsyncManager;
282
+ var DOMAnimationManager;
283
+ var CompConverter;
284
+ var ShapesParser;
285
+ var EffectsParser;
286
+ var UI;
287
+ /****** INIT Assets Manager ******/
288
+ (function(){
289
+ var ob = {};
290
+ var sourceAssets = [];
291
+ var sourceExportData = [];
292
+
293
+ function reset(){
294
+ sourceAssets = [];
295
+ sourceExportData = [];
296
+ }
297
+
298
+ function associateLayerToSource(layer, source){
299
+ var i=0, len = sourceAssets.length;
300
+ while(i<len){
301
+ if(sourceAssets[i].s === source){
302
+ sourceAssets[i].l.push(layer);
303
+ break;
304
+ }
305
+ i+=1;
306
+ }
307
+ }
308
+
309
+ function exportFileFromLayer(layer, filesDirectory){
310
+ var i = 0, len = sourceAssets.length;
311
+ var j, jLen, found = false;
312
+ while(i<len){
313
+ j = 0;
314
+ jLen = sourceAssets[i].l.length;
315
+ while(j<jLen){
316
+ if(sourceAssets[i].l[j] === layer){
317
+ found = true;
318
+ if(sourceAssets[i].exported === false){
319
+ var imageName = 'imagen_'+i;
320
+ var imageExtension = 'png';
321
+ var destinationFile = new File(filesDirectory.fullName+'/'+imageName+'.'+imageExtension);
322
+ sourceAssets[i].f.copy(destinationFile);
323
+ sourceAssets[i].exported = true;
324
+ sourceAssets[i].path = 'files/'+imageName+'.'+imageExtension;
325
+ }
326
+ }
327
+ j+=1;
328
+ }
329
+ if(found === true){
330
+ return i;
331
+ }
332
+ i+=1;
333
+ }
334
+ }
335
+
336
+ function createAssetsDataForExport(){
337
+ sourceAssets.forEach(function(item){
338
+ if(item.exported === true){
339
+ sourceExportData.push({path:item.path});
340
+ }
341
+ })
342
+ }
343
+
344
+ function createLayerSource(file, layer, source){
345
+ sourceAssets.push({s:source,f:file,l:[layer], exported:false});
346
+ }
347
+
348
+ function getAssetsData(){
349
+ return sourceExportData;
350
+ }
351
+ ob.getAssetsData = getAssetsData;
352
+ ob.reset = reset;
353
+ ob.associateLayerToSource = associateLayerToSource;
354
+ ob.createLayerSource = createLayerSource;
355
+ ob.createAssetsDataForExport = createAssetsDataForExport;
356
+ ob.exportFileFromLayer = exportFileFromLayer;
357
+ AssetsManager = ob;
358
+
359
+ }());
360
+ /****** END Assets Manager ******/
361
+ /**** Async Manager ****/
362
+ (function(){
363
+ var ob = {};
364
+ var asyncCount = 0;
365
+ var callback;
366
+ var asyncElements = [];
367
+ function executeCall(item){
368
+ item.call();
369
+ }
370
+ function executeAsyncCalls(){
371
+ var executingElements = asyncElements.splice(0,asyncElements.length);
372
+ asyncElements.length = 0;
373
+ executingElements.forEach(executeCall);
374
+ asyncCount -= 1;
375
+ if(asyncCount == 0){
376
+ callback.apply();
377
+ }
378
+ }
379
+ function addAsyncCall(fn){
380
+ asyncElements.push(fn);
381
+ if(asyncElements.length == 1){
382
+ asyncCount += 1;
383
+ //Todo Create async call
384
+ extrasInstance.setTimeout(executeAsyncCalls,1);
385
+ }
386
+ }
387
+ function addAsyncCounter(){
388
+ asyncCount += 1;
389
+ }
390
+ function removeAsyncCounter(){
391
+ asyncCount -= 1;
392
+ if(asyncCount == 0){
393
+ callback.apply();
394
+ }
395
+ }
396
+ function getAsyncCounter(){
397
+ return asyncCount;
398
+ }
399
+ function setCallBack(cb){
400
+ callback = cb;
401
+ }
402
+ ob.addAsyncCall = addAsyncCall;
403
+ ob.addAsyncCount = addAsyncCounter;
404
+ ob.removeAsyncCounter = removeAsyncCounter;
405
+ ob.getAsyncCounter = getAsyncCounter;
406
+ ob.setCallBack = setCallBack;
407
+ AsyncManager = ob;
408
+ }());
409
+ /**** END Async Manager ****/
410
+ /****** INIT DOMAnimationMAnager ******/
411
+ (function(){
412
+ var frameRate = 0;
413
+ var totalFrames = 0;
414
+ var firstFrame = 0;
415
+ var currentRenderFrame = 0;
416
+ var currentTime = 0;
417
+ var imageCount = 0;
418
+ var zCount = 0;
419
+ var isRenderReady = false;
420
+ var mainComp;
421
+ var mainLayers = [];
422
+ var filesDirectory;
423
+ var callback;
424
+ var pendingLayers = [];
425
+ var totalLayers = 0;
426
+ var exportedComps = [];
427
+
428
+ function getCompositionAnimationData(compo, compositionData,fDirectory){
429
+ exportedComps = [];
430
+ mainComp = compo;
431
+ frameRate = mainComp.frameRate;
432
+ currentRenderFrame = 0;
433
+ imageCount = 0;
434
+ zCount = 0;
435
+ mainLayers = [];
436
+ totalFrames = mainComp.workAreaDuration*mainComp.frameRate;
437
+ firstFrame = mainComp.workAreaStart*mainComp.frameRate;
438
+ //totalFrames = 1;
439
+ var animationOb = {};
440
+ compositionData.animation = animationOb;
441
+ compositionData.assets = AssetsManager.getAssetsData();
442
+ compositionData.v = '2.0.6';
443
+ animationOb.layers = mainLayers;
444
+ animationOb.totalFrames = totalFrames;
445
+ animationOb.frameRate = frameRate;
446
+ animationOb.ff = mainComp.workAreaStart;
447
+ animationOb.compWidth = mainComp.width;
448
+ animationOb.compHeight = mainComp.height;
449
+ filesDirectory = fDirectory;
450
+ iterateComposition();
451
+ }
452
+
453
+ function getMaskMode (num){
454
+ switch(num){
455
+ case MaskMode.NONE:
456
+ return 'n';
457
+ case MaskMode.ADD:
458
+ return 'a';
459
+ case MaskMode.SUBTRACT:
460
+ return 's';
461
+ case MaskMode.INTERSECT:
462
+ return 'i';
463
+ case MaskMode.LIGHTEN:
464
+ return 'l';
465
+ case MaskMode.DARKEN:
466
+ return 'd';
467
+ case MaskMode.DIFFERENCE:
468
+ return 'f';
469
+ }
470
+ }
471
+
472
+ function addMasksToLayer(layerInfo,layerOb,time){
473
+ layerOb.mk = [];
474
+ var i, len = layerInfo.mask.numProperties, maskShape, maskElement;
475
+ for(i=0;i<len;i++){
476
+ maskElement = layerInfo.mask(i+1);
477
+ maskShape = layerInfo.mask(i+1).property('maskShape').valueAtTime(time,false);
478
+ layerOb.mk.push({v:extrasInstance.roundNumber(maskShape.vertices,3), i:extrasInstance.roundNumber(maskShape.inTangents,3), o:extrasInstance.roundNumber(maskShape.outTangents,3), t:extrasInstance.roundNumber(maskElement.property('Mask Opacity').valueAtTime(time,false)/100,3)});
479
+ }
480
+ }
481
+
482
+ function setMasks(masks,layerOb){
483
+ layerOb.masksProperties = [];
484
+ var i, len = masks.numProperties, maskShape, maskElement;
485
+ for(i=0;i<len;i++){
486
+ maskElement = masks(i+1);
487
+ maskShape = maskElement.property('maskShape').value;
488
+ var shapeData = {
489
+ cl:maskShape.closed,
490
+ inv:maskElement.inverted,
491
+ mode:getMaskMode(maskElement.maskMode)
492
+ };
493
+ extrasInstance.convertToBezierValues(maskElement.property('maskShape'), frameRate, shapeData,'pt');
494
+ extrasInstance.convertToBezierValues(maskElement.property('Mask Opacity'), frameRate, shapeData,'o');
495
+ layerOb.masksProperties.push(shapeData);
496
+ }
497
+ }
498
+
499
+ function addStillAsset(layerOb,layerInfo){
500
+ layerOb.assetId = AssetsManager.exportFileFromLayer(layerInfo,filesDirectory);
501
+ }
502
+
503
+ function removeExtraData(layersData){
504
+ var i, len = layersData.length,j, jLen, shapes;
505
+ for(i = 0;i<len;i++){
506
+ var layerOb = layersData[i];
507
+ if(layerOb.enabled == false){
508
+ layersData.splice(i,1);
509
+ i -= 1;
510
+ len -= 1;
511
+ continue;
512
+ }
513
+ layerOb.lastData = null ;
514
+ delete layerOb.lastData;
515
+ if(layerOb.type == 'ShapeLayer'){
516
+ shapes = layerOb.shapes;
517
+ jLen = shapes.length;
518
+ for(j=0;j<jLen;j++){
519
+ shapes[j].lastData = null;
520
+ delete shapes[j].lastData;
521
+ }
522
+ }
523
+ if(layerOb.type == 'PreCompLayer' && layerOb.layers){
524
+ removeExtraData(layerOb.layers);
525
+ }
526
+ EffectsParser.saveEffectData(layerOb);
527
+ }
528
+ }
529
+
530
+ function processFinalData(layersData){
531
+ var i, len = layersData.length;
532
+ for(i = 0;i<len;i++){
533
+ var layerOb = layersData[i];
534
+ if(layerOb.type == 'ShapeLayer'){
535
+ layerOb.rectData.w = extrasInstance.roundNumber(layerOb.rectData.r - layerOb.rectData.l,3);
536
+ layerOb.rectData.h = extrasInstance.roundNumber(layerOb.rectData.b - layerOb.rectData.t,3);
537
+ }
538
+ if(layerOb.type == 'PreCompLayer' && layerOb.layers){
539
+ processFinalData(layerOb.layers);
540
+ }
541
+ }
542
+ }
543
+
544
+ function buildTextData(textDocument){
545
+ var textDataOb = {};
546
+ textDataOb.font = textDocument.font;
547
+ textDataOb.fontSize = textDocument.fontSize;
548
+ textDataOb.fillColor = extrasInstance.arrayRgbToHex(textDocument.fillColor);
549
+ textDataOb.text = textDocument.text;
550
+ var justification = '';
551
+ switch(textDocument.justification){
552
+ case ParagraphJustification.LEFT_JUSTIFY:
553
+ justification = 'left';
554
+ break;
555
+ case ParagraphJustification.RIGHT_JUSTIFY:
556
+ justification = 'right';
557
+ break;
558
+ case ParagraphJustification.CENTER_JUSTIFY:
559
+ justification = 'center';
560
+ break;
561
+ case ParagraphJustification.FULL_JUSTIFY_LASTLINE_LEFT:
562
+ case ParagraphJustification.FULL_JUSTIFY_LASTLINE_RIGHT:
563
+ case ParagraphJustification.FULL_JUSTIFY_LASTLINE_CENTER:
564
+ case ParagraphJustification.FULL_JUSTIFY_LASTLINE_FULL:
565
+ justification = 'justify';
566
+ break;
567
+ default:
568
+ justification = 'left';
569
+ break;
570
+ }
571
+ textDataOb.justification = justification;
572
+ return textDataOb;
573
+ }
574
+
575
+ function analyzeNextLayer(){
576
+ if(pendingLayers.length == 0){
577
+ renderNextFrame();
578
+ }else{
579
+ var pendingItem = pendingLayers.pop();
580
+ UI.setProgress(pendingLayers.length/totalLayers);
581
+ var layerOb = pendingItem.lOb;
582
+ var layerInfo = pendingItem.lInfo;
583
+ var frameRate = pendingItem.frameRate;
584
+ var lType = extrasInstance.layerType(layerInfo);
585
+ if(lType == 'AudioLayer' || lType == 'CameraLayer' || (layerInfo.enabled == false && !layerInfo.isTrackMatte)){
586
+ //TODO add audios
587
+ layerOb.enabled = false;
588
+ extrasInstance.setTimeout(analyzeNextLayer,100);
589
+ return;
590
+ }else if(lType == 'TextLayer'){
591
+ var textProp = layerInfo.property("Source Text");
592
+ var textDocument = textProp.value;
593
+ layerOb.textData = buildTextData(textDocument);
594
+ var r = layerInfo.sourceRectAtTime(0, false);
595
+ layerOb.textData.xOffset = r.left;
596
+ layerOb.textData.yOffset = r.top;
597
+ layerOb.textData.width = r.width;
598
+ layerOb.textData.height = r.height;
599
+ }
600
+
601
+ //EffectsParser.createEffects(layerInfo,layerOb);
602
+
603
+ if(layerInfo.mask.numProperties>0){
604
+ setMasks(layerInfo.mask,layerOb);
605
+ layerOb.hasMask = true;
606
+ }
607
+ layerOb.type = lType;
608
+ if(lType == 'ShapeLayer'){
609
+ ShapesParser.createShapes(layerInfo,layerOb, frameRate);
610
+ layerOb.rectData = {l:0,t:0,b:0,r:0,w:0,h:0};
611
+ }
612
+ if(layerInfo.parent != null){
613
+ layerOb.parent = layerInfo.parent.index - 1;
614
+ }
615
+ layerOb.layerName = layerInfo.name;
616
+ layerOb.threeD = layerInfo.threeDLayer;
617
+ layerOb.an = {};
618
+
619
+ if(lType=='PreCompLayer'){
620
+ layerOb.width = layerInfo.source.width;
621
+ layerOb.height = layerInfo.source.height;
622
+ }else if(lType == 'StillLayer'){
623
+ addStillAsset(layerOb,layerInfo);
624
+ layerOb.width = layerInfo.source.width;
625
+ layerOb.height = layerInfo.source.height;
626
+ }else if(lType == 'SolidLayer'){
627
+ layerOb.width = layerInfo.source.width;
628
+ layerOb.height = layerInfo.source.height;
629
+ layerOb.color = extrasInstance.arrayRgbToHex(layerInfo.source.mainSource.color);
630
+ }else if(lType == 'ShapeLayer'){
631
+ layerOb.width = layerInfo.width;
632
+ layerOb.height = layerInfo.height;
633
+ }
634
+ layerOb.inPoint = layerInfo.inPoint*frameRate;
635
+ layerOb.outPoint = layerInfo.outPoint*frameRate;
636
+ layerOb.startTime = layerInfo.startTime*frameRate;
637
+ layerOb.lastData = {};
638
+
639
+ layerOb.ks = {};
640
+ if(layerInfo.transform.opacity.numKeys>1){
641
+ extrasInstance.convertToBezierValues(layerInfo.transform.opacity, frameRate, layerOb.ks,'o');
642
+ }else{
643
+ layerOb.ks.o = extrasInstance.roundNumber(layerInfo.transform.opacity.valueAtTime(0,false),3);
644
+ }
645
+ if(layerInfo.transform.rotation.numKeys>1){
646
+ extrasInstance.convertToBezierValues(layerInfo.transform.rotation, frameRate, layerOb.ks,'r');
647
+ }else{
648
+ layerOb.ks.r = extrasInstance.roundNumber(layerInfo.transform.rotation.valueAtTime(0,false),3);
649
+ }
650
+ if(layerInfo.transform.position.dimensionsSeparated){
651
+ layerOb.ks.p = {s:true};
652
+ extrasInstance.convertToBezierValues(layerInfo.transform['X Position'], frameRate, layerOb.ks.p,'x');
653
+ extrasInstance.convertToBezierValues(layerInfo.transform['Y Position'], frameRate, layerOb.ks.p,'y');
654
+ }else{
655
+ if(layerInfo.transform.position.numKeys>1){
656
+ extrasInstance.convertToBezierValues(layerInfo.transform.position, frameRate, layerOb.ks,'p');
657
+ }else{
658
+ layerOb.ks.p = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(0,false),3);
659
+ }
660
+ }
661
+ if(layerInfo.transform['Anchor Point'].numKeys>1){
662
+ if(lType == 'ShapeLayer'){
663
+ prepareHelperSolid(layerInfo.transform['Anchor Point'],frameRate,layerOb.ks,'a');
664
+ }else{
665
+ extrasInstance.convertToBezierValues(layerInfo.transform['Anchor Point'], frameRate, layerOb.ks,'a');
666
+ }
667
+ }else{
668
+ layerOb.ks.a = extrasInstance.roundNumber(layerInfo.transform['Anchor Point'].valueAtTime(0,false),3);
669
+ }
670
+ if(layerInfo.transform['Scale'].numKeys>1){
671
+ extrasInstance.convertToBezierValues(layerInfo.transform['Scale'], frameRate, layerOb.ks,'s');
672
+ }else{
673
+ layerOb.ks.s = extrasInstance.roundNumber(layerInfo.transform['Scale'].valueAtTime(0,false),3);
674
+ }
675
+
676
+ if(layerInfo.canSetTimeRemapEnabled && layerInfo.timeRemapEnabled){
677
+ extrasInstance.convertToBezierValues(layerInfo['Time Remap'], frameRate, layerOb,'tm');
678
+ }
679
+ checkLayerReady();
680
+ }
681
+ }
682
+
683
+ function checkLayerReady(){
684
+ if(renderCancelled){
685
+ callback.apply();
686
+ }else{
687
+ extrasInstance.setTimeout(analyzeNextLayer,100);
688
+ }
689
+ }
690
+
691
+ function prepareHelperSolid(property,frameRate,ob,param){
692
+ var currentKeyframe = 1;
693
+ var helperPosition = helperSolid.transform["Anchor Point"];
694
+ var jLen = helperPosition.numKeys;
695
+ while(jLen > 0){
696
+ helperPosition.removeKey(1);
697
+ jLen -= 1;
698
+ }
699
+ helperSolidComp.frameRate = frameRate;
700
+ jLen = property.numKeys;
701
+ var keyIn, keyOut;
702
+ var keyInHelper, keyOutHelper;
703
+ var propertyValueDelta, helperValueDelta;
704
+
705
+ function adjustNextHelperSpeed(){
706
+ var j;
707
+ for(j = 0; j<jLen; j+=1){
708
+ keyIn = property.keyInTemporalEase(j+1)[0];
709
+ keyOut = property.keyOutTemporalEase(j+1)[0];
710
+ keyInHelper = new KeyframeEase(keyIn.speed, keyIn.influence);
711
+ keyOutHelper = new KeyframeEase(keyOut.speed, keyOut.influence);
712
+ helperPosition.addKey(property.keyTime(j+1));
713
+ helperPosition.setValueAtTime(property.keyTime(j+1),property.valueAtTime(property.keyTime(j+1),true));
714
+ helperPosition.setTemporalEaseAtKey(j+1, [keyInHelper], [keyOutHelper]);
715
+ }
716
+ correctNextKey();
717
+ }
718
+
719
+ function correctNextKey(){
720
+
721
+ var i= 0, len = 20;
722
+ if(currentKeyframe !== jLen + 1){
723
+ keyIn = property.keyInTemporalEase(currentKeyframe)[0];
724
+ keyOut = property.keyOutTemporalEase(currentKeyframe)[0];
725
+ propertyValueDelta = property.valueAtTime(property.keyTime(currentKeyframe)+0.01,false);
726
+ keyOutHelper = helperPosition.keyOutTemporalEase(currentKeyframe);
727
+ keyInHelper = helperPosition.keyInTemporalEase(currentKeyframe);
728
+ var flag = true;
729
+ var currentSpeed, deltaSpeed = 10, dir = 0;
730
+ var helpValue,helpValue2;
731
+ if(currentKeyframe != 1){
732
+ helpValue = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe),false);
733
+ helpValue2 = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe-1),false);
734
+ propertyValueDelta = property.valueAtTime(property.keyTime(currentKeyframe)-0.01,false);
735
+ helperValueDelta = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe)-0.01,false);
736
+ currentSpeed = keyInHelper[0].speed;
737
+ deltaSpeed = Math.abs(keyInHelper[0].speed);
738
+ if(Math.abs(helperValueDelta[0]) > Math.abs(propertyValueDelta[0]) || Math.abs(helperValueDelta[1]) > Math.abs(propertyValueDelta[1])){
739
+ dir = 1;
740
+ }else{
741
+ dir = -1;
742
+ }
743
+ while(flag){
744
+ helpValue = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe),false);
745
+ helpValue2 = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe - 1),false);
746
+ helperValueDelta = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe)-0.01,false);
747
+ if(Math.abs(helperValueDelta[0]-propertyValueDelta[0]) < 0.001 && Math.abs(helperValueDelta[1]-propertyValueDelta[1]) < 0.001){
748
+ flag = false;
749
+ }else{
750
+ if(Math.abs(helperValueDelta[0]) > Math.abs(propertyValueDelta[0]) || Math.abs(helperValueDelta[1]) > Math.abs(propertyValueDelta[1])){
751
+ if(dir == 1){
752
+ deltaSpeed /= 2;
753
+ }
754
+ dir = -1;
755
+ currentSpeed += deltaSpeed;
756
+ keyInHelper[0].speed = currentSpeed;
757
+ helperPosition.setTemporalEaseAtKey(currentKeyframe, keyInHelper, keyOutHelper);
758
+ }else{
759
+ if(dir == -1){
760
+ deltaSpeed /= 2;
761
+ }
762
+ dir = 1;
763
+ currentSpeed -= deltaSpeed;
764
+ keyInHelper[0].speed = currentSpeed;
765
+ helperPosition.setTemporalEaseAtKey(currentKeyframe, keyInHelper, keyOutHelper);
766
+ }
767
+ }
768
+ i += 1;
769
+ if(i == len){
770
+ keyInHelper[0].speed = keyIn.speed;
771
+ helperPosition.setTemporalEaseAtKey(currentKeyframe, keyInHelper, keyOutHelper);
772
+ flag = false;
773
+ }
774
+ }
775
+ }
776
+ if(currentKeyframe != jLen){
777
+ i = 0;
778
+ flag = true;
779
+ propertyValueDelta = property.valueAtTime(property.keyTime(currentKeyframe)+0.01,false);
780
+ helperValueDelta = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe)+0.01,false);
781
+ helpValue = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe),false);
782
+ currentSpeed = keyOutHelper[0].speed;
783
+ deltaSpeed = Math.abs(keyOutHelper[0].speed);
784
+ if(Math.abs(helperValueDelta[0]) > Math.abs(propertyValueDelta[0]) || Math.abs(helperValueDelta[1]) > Math.abs(propertyValueDelta[1])){
785
+ dir = -1;
786
+ }else{
787
+ dir = 1;
788
+ }
789
+ while(flag){
790
+ helpValue = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe),false);
791
+ helperValueDelta = helperPosition.valueAtTime(helperPosition.keyTime(currentKeyframe)+0.01,false);
792
+ if(Math.abs(helperValueDelta[0]-propertyValueDelta[0]) < 0.001 && Math.abs(helperValueDelta[1]-propertyValueDelta[1]) < 0.001){
793
+ flag = false;
794
+ }else{
795
+ if(Math.abs(helperValueDelta[0]) > Math.abs(propertyValueDelta[0]) || Math.abs(helperValueDelta[1]) > Math.abs(propertyValueDelta[1]) ){
796
+ if(dir == -1){
797
+ deltaSpeed /= 2;
798
+ }
799
+ dir = 1;
800
+ currentSpeed -= deltaSpeed;
801
+ keyOutHelper[0].speed = currentSpeed;
802
+ helperPosition.setTemporalEaseAtKey(currentKeyframe, keyInHelper, keyOutHelper);
803
+ }else{
804
+ if(dir == 1){
805
+ deltaSpeed /= 2;
806
+ }
807
+ dir = -1;
808
+ currentSpeed += deltaSpeed;
809
+ keyOutHelper[0].speed = currentSpeed;
810
+ helperPosition.setTemporalEaseAtKey(currentKeyframe, keyInHelper, keyOutHelper);
811
+ }
812
+ }
813
+ i += 1;
814
+ if(i == len){
815
+ keyOutHelper[0].speed = keyOut.speed;
816
+ helperPosition.setTemporalEaseAtKey(currentKeyframe, keyInHelper, keyOutHelper);
817
+ flag = false;
818
+ }
819
+ }
820
+ }
821
+ currentKeyframe += 1;
822
+ correctNextKey();
823
+ }else{
824
+ extrasInstance.convertToBezierValues(helperPosition, frameRate, ob,param);
825
+ }
826
+ }
827
+
828
+ adjustNextHelperSpeed();
829
+ }
830
+
831
+ function createLayers(compo, layersData, frameRate){
832
+ var i, len = compo.layers.length;
833
+ var pendingType;
834
+ for(i = 0;i<len;i++){
835
+ var layerOb = {};
836
+ layerOb.ind = i;
837
+ var layerInfo = compo.layers[i+1];
838
+ var lType = extrasInstance.layerType(layerInfo);
839
+ //$.writeln('layerInfo.isTrackMatte: ',layerInfo.isTrackMatte);
840
+ //$.writeln('layerInfo.hasTrackMatte: ',layerInfo.hasTrackMatte);
841
+ layersData.push(layerOb);
842
+ if(lType == 'AudioLayer' || lType == 'CameraLayer' || (layerInfo.enabled == false && !layerInfo.isTrackMatte)){
843
+ //TODO add audios
844
+ layerOb.enabled = false;
845
+ continue;
846
+ }
847
+ if(layerInfo.hasTrackMatte){
848
+ switch(layerInfo.trackMatteType){
849
+ case TrackMatteType.ALPHA:
850
+ pendingType = 1;
851
+ break;
852
+ case TrackMatteType.ALPHA_INVERTED:
853
+ pendingType = 2;
854
+ break;
855
+ case TrackMatteType.LUMA:
856
+ pendingType = 3;
857
+ break;
858
+ case TrackMatteType.LUMA_INVERTED :
859
+ pendingType = 4;
860
+ break;
861
+ }
862
+ layerOb.tt = pendingType;
863
+ }else if(layerInfo.isTrackMatte){
864
+ layerOb.td = 1;
865
+ }
866
+ pendingLayers.push({lInfo:layerInfo,lOb:layerOb,frameRate:frameRate});
867
+ if(lType=='PreCompLayer'){
868
+ var j = 0, jLen = exportedComps.length, isRendered = false;
869
+ while(j<jLen){
870
+ if(exportedComps[j].lInfo.source == layerInfo.source){
871
+ isRendered = true;
872
+ break;
873
+ }
874
+ j+=1;
875
+ }
876
+ if(isRendered){
877
+ if(!exportedComps[j].lOb.compId){
878
+ exportedComps[j].lOb.compId = extrasInstance.getRandomName(7);
879
+ }
880
+ layerOb.refId = exportedComps[j].lOb.compId;
881
+ }else{
882
+ layerOb.layers = [];
883
+ createLayers(layerInfo.source,layerOb.layers,layerInfo.source.frameRate);
884
+ exportedComps.push({
885
+ lInfo: layerInfo,
886
+ lOb: layerOb
887
+ })
888
+ }
889
+ }
890
+
891
+ }
892
+ }
893
+
894
+ function getParentSize (name,layers){
895
+ var i=0, len = layers.length;
896
+ while(i<len){
897
+ if(layers[i].layerName == name){
898
+ return {width:layers[i].width,height:layers[i].height};
899
+ }
900
+ i++;
901
+ }
902
+ return {width:0,height:0};
903
+ }
904
+
905
+ function traverseAnimation(compo,layersData, frameNum, time){
906
+ var i, len = compo.layers.length;
907
+ for(i = 0;i<len;i++){
908
+ var layerInfo = compo.layers[i+1];
909
+ var lType = extrasInstance.layerType(layerInfo);
910
+ if(lType == 'AudioLayer' || lType == 'CameraLayer' || (layerInfo.enabled == false && !layerInfo.isTrackMatte)){
911
+ //TODO add audios
912
+ continue;
913
+ }
914
+ var layerOb = layersData[i];
915
+ var animData = {};
916
+ if(layerOb.hasMask){
917
+ addMasksToLayer(layerInfo,animData,time);
918
+ }
919
+ animData.tr = {};
920
+ animData.tr.p = [];
921
+ animData.tr.a = [];
922
+ animData.tr.r = [];
923
+ animData.tr.s = [];
924
+ animData.tr.o = {};
925
+
926
+ if(layerOb.parent != null){
927
+ var parentSize = getParentSize(layerOb.parent,layersData);
928
+ animData.tr.p[0] = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(time,false)[0],3);
929
+ animData.tr.p[1] = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(time,false)[1],3);
930
+ }else{
931
+ animData.tr.p[0] = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(time,false)[0],3);
932
+ animData.tr.p[1] = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(time,false)[1],3);
933
+ }
934
+ if(layerOb.threeD){
935
+ animData.tr.p[2] = extrasInstance.roundNumber(-layerInfo.transform.position.valueAtTime(time,false)[2],3);
936
+ }else{
937
+ animData.tr.p[2] = -zCount;
938
+ zCount++;
939
+ }
940
+ if(lType=='ShapeLayer'){
941
+ var r = layerInfo.sourceRectAtTime(frameNum, false);
942
+ layerOb.rectData.l = extrasInstance.roundNumber(Math.min(r.left,layerOb.rectData.l),3);
943
+ layerOb.rectData.t = extrasInstance.roundNumber(Math.min(r.top,layerOb.rectData.t),3);
944
+ layerOb.rectData.r = extrasInstance.roundNumber(Math.max(r.left+r.width,layerOb.rectData.r),3);
945
+ layerOb.rectData.b = extrasInstance.roundNumber(Math.max(r.top+r.height,layerOb.rectData.b),3);
946
+ }
947
+ animData.tr.a[0] = extrasInstance.roundNumber(layerInfo.transform['Anchor Point'].valueAtTime(time,false)[0],3);
948
+ animData.tr.a[1] = extrasInstance.roundNumber(layerInfo.transform['Anchor Point'].valueAtTime(time,false)[1],3);
949
+ animData.tr.a[2] = extrasInstance.roundNumber(-layerInfo.transform['Anchor Point'].valueAtTime(time,false)[2],3);
950
+ animData.tr.s = extrasInstance.roundNumber([(layerInfo.transform['Scale'].valueAtTime(time,false)[0]/100),(layerInfo.transform['Scale'].valueAtTime(time,false)[1]/100),(layerInfo.transform['Scale'].valueAtTime(time,false)[2]/100)],3);
951
+ if(layerOb.threeD){
952
+ animData.tr.r[0] = extrasInstance.roundNumber((layerInfo.transform['X Rotation'].valueAtTime(time,false)+layerInfo.transform['Orientation'].valueAtTime(time,false)[0])*Math.PI/180,3);
953
+ animData.tr.r[1] = extrasInstance.roundNumber(-(layerInfo.transform['Y Rotation'].valueAtTime(time,false)+layerInfo.transform['Orientation'].valueAtTime(time,false)[1])*Math.PI/180,3);
954
+ animData.tr.r[2] = extrasInstance.roundNumber((layerInfo.transform['Rotation'].valueAtTime(time,false)+layerInfo.transform['Orientation'].valueAtTime(time,false)[2])*Math.PI/180,3);
955
+ }else{
956
+ animData.tr.r[0] = 0;
957
+ animData.tr.r[1] = 0;
958
+ animData.tr.r[2] = extrasInstance.roundNumber(layerInfo.transform['Rotation'].valueAtTime(time,false)*Math.PI/180,3);
959
+ }
960
+ animData.tr.o = extrasInstance.roundNumber(layerInfo.transform['Opacity'].valueAtTime(time,false)/100,3);
961
+ if(lType == 'ShapeLayer'){
962
+ ShapesParser.addFrameData(layerInfo,layerOb, frameNum, time);
963
+ }
964
+ if(lType == 'PreCompLayer'){
965
+ var compoInTime = -layerInfo.startTime;
966
+ traverseAnimation(layerInfo.source,layerOb.layers, frameNum, time+compoInTime);
967
+ }
968
+ //THIS IS REPLACED WITH THE KEYFRAMES. LEAVE THIS FOR NOW.
969
+ /*if(layerOb.lastData.an == null || extrasInstance.compareObjects(animData,layerOb.lastData.an)==false){
970
+ layerOb.an[frameNum] = animData;
971
+ layerOb.lastData.an = animData;
972
+ }*/
973
+ EffectsParser.renderFrame(layerOb,frameNum);
974
+ }
975
+ }
976
+
977
+ function iterateComposition(){
978
+ createLayers(mainComp, mainLayers, mainComp.frameRate);
979
+ // TO TRAVERSE LAYER BY LAYER. NEEDED FOR TIME REMAP?
980
+ /*renderCompo(mainComp, mainLayers);
981
+ AssetsManager.createAssetsDataForExport();
982
+ removeExtraData(mainLayers);
983
+ processFinalData(mainLayers);
984
+ callback.apply();*/
985
+ // END TO TRAVERSE LAYER BY LAYER. NEEDED FOR TIME REMAP?
986
+ totalLayers = pendingLayers.length;
987
+ extrasInstance.setTimeout(analyzeNextLayer,100);
988
+ }
989
+
990
+ function iterateLayer(layerInfo, layerOb,frameRate){
991
+ var duration =layerInfo.duration;
992
+ layerOb.st = layerInfo.startTime;
993
+ var frameNum = 0;
994
+ var time = layerInfo.startTime;
995
+
996
+ var lType = extrasInstance.layerType(layerInfo);
997
+ if(lType == 'AudioLayer' || lType == 'CameraLayer' || (layerInfo.enabled == false && !layerInfo.isTrackMatte)){
998
+ //TODO add audios
999
+ return;
1000
+ }
1001
+ while(frameNum < duration*frameRate){
1002
+ var layerOb = layersData[i];
1003
+ var animData = {};
1004
+ if(layerOb.hasMask){
1005
+ addMasksToLayer(layerInfo,animData,time);
1006
+ }
1007
+ animData.tr = {};
1008
+ animData.tr.p = [];
1009
+ animData.tr.a = [];
1010
+ animData.tr.r = [];
1011
+ animData.tr.s = [];
1012
+ animData.tr.o = {};
1013
+
1014
+ if(layerOb.parent != null){
1015
+ var parentSize = getParentSize(layerOb.parent,layersData);
1016
+ animData.tr.p[0] = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(time,false)[0],3);
1017
+ animData.tr.p[1] = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(time,false)[1],3);
1018
+ }else{
1019
+ animData.tr.p[0] = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(time,false)[0],3);
1020
+ animData.tr.p[1] = extrasInstance.roundNumber(layerInfo.transform.position.valueAtTime(time,false)[1],3);
1021
+ }
1022
+ if(layerOb.threeD){
1023
+ animData.tr.p[2] = extrasInstance.roundNumber(-layerInfo.transform.position.valueAtTime(time,false)[2],3);
1024
+ }else{
1025
+ animData.tr.p[2] = -zCount;
1026
+ zCount++;
1027
+ }
1028
+ if(lType=='ShapeLayer'){
1029
+ var r = layerInfo.sourceRectAtTime(frameNum, false);
1030
+ layerOb.rectData.l = extrasInstance.roundNumber(Math.min(r.left,layerOb.rectData.l),3);
1031
+ layerOb.rectData.t = extrasInstance.roundNumber(Math.min(r.top,layerOb.rectData.t),3);
1032
+ layerOb.rectData.r = extrasInstance.roundNumber(Math.max(r.left+r.width,layerOb.rectData.r),3);
1033
+ layerOb.rectData.b = extrasInstance.roundNumber(Math.max(r.top+r.height,layerOb.rectData.b),3);
1034
+ }
1035
+ animData.tr.a[0] = extrasInstance.roundNumber(layerInfo.transform['Anchor Point'].valueAtTime(time,false)[0],3);
1036
+ animData.tr.a[1] = extrasInstance.roundNumber(layerInfo.transform['Anchor Point'].valueAtTime(time,false)[1],3);
1037
+ animData.tr.a[2] = extrasInstance.roundNumber(-layerInfo.transform['Anchor Point'].valueAtTime(time,false)[2],3);
1038
+ animData.tr.s = extrasInstance.roundNumber([(layerInfo.transform['Scale'].valueAtTime(time,false)[0]/100),(layerInfo.transform['Scale'].valueAtTime(time,false)[1]/100),(layerInfo.transform['Scale'].valueAtTime(time,false)[2]/100)],3);
1039
+ if(layerOb.threeD){
1040
+ animData.tr.r[0] = extrasInstance.roundNumber((layerInfo.transform['X Rotation'].valueAtTime(time,false)+layerInfo.transform['Orientation'].valueAtTime(time,false)[0])*Math.PI/180,3);
1041
+ animData.tr.r[1] = extrasInstance.roundNumber(-(layerInfo.transform['Y Rotation'].valueAtTime(time,false)+layerInfo.transform['Orientation'].valueAtTime(time,false)[1])*Math.PI/180,3);
1042
+ animData.tr.r[2] = extrasInstance.roundNumber((layerInfo.transform['Rotation'].valueAtTime(time,false)+layerInfo.transform['Orientation'].valueAtTime(time,false)[2])*Math.PI/180,3);
1043
+ }else{
1044
+ animData.tr.r[0] = 0;
1045
+ animData.tr.r[1] = 0;
1046
+ animData.tr.r[2] = extrasInstance.roundNumber(layerInfo.transform['Rotation'].valueAtTime(time,false)*Math.PI/180,3);
1047
+ }
1048
+ animData.tr.o = extrasInstance.roundNumber(layerInfo.transform['Opacity'].valueAtTime(time,false)/100,3);
1049
+ if(lType == 'ShapeLayer'){
1050
+ ShapesParser.addFrameData(layerInfo,layerOb, frameNum, time);
1051
+ }
1052
+ //THIS IS REPLACED WITH THE KEYFRAMES. BUT SHOULD BE USED FOR EXPRESSION LAYERS.
1053
+ if(layerOb.lastData.an == null || extrasInstance.compareObjects(animData,layerOb.lastData.an)==false){
1054
+ layerOb.an[frameNum] = animData;
1055
+ layerOb.lastData.an = animData;
1056
+ }
1057
+ //END FOR EXPRESSION LAYERS
1058
+
1059
+ EffectsParser.renderFrame(layerOb,frameNum);
1060
+ frameNum += 1;
1061
+ time += 1/frameRate;
1062
+ }
1063
+
1064
+
1065
+
1066
+ //traverseAnimation(layerInfo.source,layerOb.layers, frameNum, time+compoInTime);
1067
+ if(lType == 'PreCompLayer'){
1068
+ var i, len = layerInfo.source.layers.length;
1069
+ for(i = 0;i<len;i++){
1070
+ iterateLayer(layerInfo.source.layers[i+1],layerOb.layers[i],layerInfo.source.frameRate);
1071
+ }
1072
+ }
1073
+ }
1074
+
1075
+ function renderCompo(compo, mainLayers){
1076
+ //var duration = compo.duration;
1077
+ var i, len = compo.layers.length;
1078
+ for(i = 0;i<len;i++){
1079
+ iterateLayer(compo.layers[i+1],mainLayers[i],compo.frameRate);
1080
+ }
1081
+ }
1082
+
1083
+ function renderNextFrame(){
1084
+ /*if(currentRenderFrame < totalFrames && renderCancelled === false){
1085
+ renderFrame();
1086
+ currentRenderFrame +=1;
1087
+ renderNextFrame();
1088
+ //extrasInstance.setTimeout(renderNextFrame,50);
1089
+ }else{
1090
+ isRenderReady = true;
1091
+ checkRenderReady();
1092
+ }*/
1093
+ isRenderReady = true;
1094
+ checkRenderReady();
1095
+ }
1096
+
1097
+ function checkRenderReady(){
1098
+ if(AsyncManager.getAsyncCounter() == 0 && isRenderReady == true){
1099
+ AssetsManager.createAssetsDataForExport();
1100
+ removeExtraData(mainLayers);
1101
+ processFinalData(mainLayers);
1102
+ callback.apply();
1103
+ }
1104
+ }
1105
+
1106
+ function renderFrame(){
1107
+ currentTime = (currentRenderFrame+firstFrame)/frameRate;
1108
+ zCount = 0;
1109
+ traverseAnimation(mainComp,mainLayers, currentRenderFrame,currentTime);
1110
+ }
1111
+
1112
+ function setCallback(cb){
1113
+ callback = cb;
1114
+ }
1115
+
1116
+ AsyncManager.setCallBack(checkRenderReady);
1117
+
1118
+ var ob = {};
1119
+ ob.getCompositionAnimationData = getCompositionAnimationData;
1120
+ ob.setCallback = setCallback;
1121
+
1122
+ DOMAnimationManager = ob;
1123
+ }());
1124
+ /****** END DOMAnimationMAnager ******/
1125
+ /****** INIT Effects Parser ******/
1126
+ (function(){
1127
+ var ob = {};
1128
+ var registeredEffects = {};
1129
+
1130
+ function createEffects(layerInfo,layerOb){
1131
+ if(layerInfo.effect.numProperties>0){
1132
+ layerOb.eff = [];
1133
+ var i, len = layerInfo.effect.numProperties, name;
1134
+ for(i=0;i<len;i++){
1135
+ name = layerInfo.effect(i+1).name;
1136
+ if(registeredEffects[name] != null){
1137
+ layerOb.eff.push({parser: registeredEffects[name], id:registeredEffects[name].registerElement(layerInfo.effect(i+1))});
1138
+ }
1139
+ }
1140
+ }
1141
+ }
1142
+
1143
+ function renderFrame(layerOb,frameNum){
1144
+ if(layerOb.eff){
1145
+ layerOb.eff.forEach(function(item){
1146
+ item.parser.renderFrame(frameNum);
1147
+ });
1148
+ }
1149
+ }
1150
+
1151
+ function saveEffectData(layerOb){
1152
+ if(layerOb.eff){
1153
+ layerOb.eff = layerOb.eff.map(function(item){
1154
+ return item.parser.getData(item.id);
1155
+ });
1156
+ }
1157
+ }
1158
+
1159
+ function registerEffect(name,object){
1160
+ registeredEffects[name] = object;
1161
+ }
1162
+
1163
+ ob.registerEffect = registerEffect;
1164
+ ob.createEffects = createEffects;
1165
+ ob.renderFrame = renderFrame;
1166
+ ob.saveEffectData = saveEffectData;
1167
+
1168
+ EffectsParser = ob;
1169
+
1170
+ }());
1171
+ /****** END Effects Parser ******/
1172
+ /****** INIT Effects Stroke Parser ******/
1173
+ (function(){
1174
+ var ob = {};
1175
+ var registeredElements = [];
1176
+ var lastValues = {};
1177
+
1178
+ function renderFrame(frameNum, id){
1179
+ var effectData = registeredElements[id];
1180
+ var effectInfo = effectData.elem;
1181
+ for(var s in effectData.animated){
1182
+ var propertyValue = getPropertyValue(effectInfo[s].value,getPropertyType(s));
1183
+ if(lastValues[s] == null || !extrasInstance.compareObjects(propertyValue,lastValues[s])){
1184
+ effectData.animated[s][frameNum] = propertyValue;
1185
+ lastValues[s] = propertyValue;
1186
+ }
1187
+ }
1188
+ }
1189
+
1190
+ function getPropertyValue(value,type){
1191
+ switch(type)
1192
+ {
1193
+ case 'color':
1194
+ return extrasInstance.arrayRgbToHex(value);
1195
+ break;
1196
+ default:
1197
+ return value;
1198
+ break;
1199
+ }
1200
+ }
1201
+
1202
+ function getPropertyType(propertyName){
1203
+ var i = 0;len = animatableProperties.length;
1204
+ while(i<len){
1205
+ if(animatableProperties[i].name == propertyName){
1206
+ return animatableProperties[i].type;
1207
+ }
1208
+ i++;
1209
+ }
1210
+ return '';
1211
+ }
1212
+
1213
+ function getData(id){
1214
+ return registeredElements[id];
1215
+ }
1216
+
1217
+ function registerElement(elem){
1218
+ var effectData = {
1219
+ type: 'Stroke',
1220
+ effectInfo : elem,
1221
+ effectDataPath : elem['Path'].value,
1222
+ allMasks : elem['All Masks'].value,
1223
+ strokeSequentially : elem['Stroke Sequentially'].value,
1224
+ animated: {},
1225
+ singleValue: {}
1226
+ };
1227
+ registeredElements.push(effectData);
1228
+ animatableProperties.forEach(function(item){
1229
+ if(elem[item.name].numKeys == 0){
1230
+ effectData.singleValue[item.name] = getPropertyValue(effectInfo[item.name].value, item.type);
1231
+ }else{
1232
+ effectData.animated[item.name] = {};
1233
+ }
1234
+ });
1235
+ return registeredElements.length;
1236
+ }
1237
+ var animatableProperties = [{name:'Color',type:'color'},{name:'Brush Size',type:'simple'},{name:'Brush Hardness',type:'simple'},{name:'Opacity',type:'simple'},{name:'Start',type:'simple'},{name:'End',type:'simple'},{name:'Spacing',type:'simple'},{name:'Paint Style',type:'simple'}];
1238
+ var i, len = animatableProperties.length;
1239
+
1240
+ ob.renderFrame = renderFrame;
1241
+ ob.getData = getData;
1242
+ ob.registerElement = registerElement;
1243
+ EffectsParser.registerEffect('Stroke',ob);
1244
+ }());
1245
+ /****** END Effects Stroke Parser ******/
1246
+ /****** INIT extras******/
1247
+ (function (){
1248
+ function getItemByName(name,collection){
1249
+ for(var i=0;i<collection.length;i++){
1250
+ if(collection[i+1].name==name){
1251
+ return collection[i+1];
1252
+ }
1253
+ }
1254
+ return null;
1255
+ }
1256
+
1257
+ function compareObjects(object1,object2){
1258
+ return JSON.stringify(object1) === JSON.stringify(object2);
1259
+ }
1260
+
1261
+ function roundNumber(num, decimals){
1262
+ if( typeof num == 'number'){
1263
+ return parseFloat(num.toFixed(decimals));
1264
+ }else{
1265
+ return roundArray(num,decimals);
1266
+ }
1267
+ }
1268
+
1269
+ function roundArray(arr, decimals){
1270
+ var i, len = arr.length;
1271
+ var retArray = [];
1272
+ for( i = 0; i < len ; i += 1){
1273
+ if( typeof arr[i] == 'number'){
1274
+ retArray.push(roundNumber(arr[i],decimals));
1275
+ }else{
1276
+ retArray.push(roundArray(arr[i],decimals));
1277
+ }
1278
+ }
1279
+ return retArray;
1280
+ }
1281
+
1282
+ function setInterval(func,millis){
1283
+ var guid = getRandomName(10);
1284
+ Gtlym.CALL["interval_"+guid] = func;
1285
+ return app.scheduleTask('Gtlym.CALL["interval_'+guid+'"]();',millis,true);
1286
+ }
1287
+
1288
+ function setTimeout(func,millis){
1289
+ var guid = getRandomName(10);
1290
+ Gtlym.CALL["interval_"+guid] = func;
1291
+ return app.scheduleTask('Gtlym.CALL["interval_'+guid+'"]();',millis,false);
1292
+ }
1293
+
1294
+ function cancelTimeout(id){
1295
+ app.cancelTask(id);
1296
+ }
1297
+
1298
+ function cancelInterval(id){
1299
+ app.cancelTask(id);
1300
+ }
1301
+
1302
+ function removeDirectoryContent(f, callback){
1303
+ var removeNextItem = function(){
1304
+ currentFileIndex++;
1305
+ if(currentFileIndex == len){
1306
+ callback.apply();
1307
+ }else{
1308
+ removeFileFromDisk(files[currentFileIndex],removeNextItem);
1309
+ }
1310
+ };
1311
+ var files = f.getFiles();
1312
+ var len = files.length;
1313
+ var currentFileIndex = 0;
1314
+ if(len==0){
1315
+ callback.apply();
1316
+ }else{
1317
+ removeFileFromDisk(files[currentFileIndex],removeNextItem);
1318
+ }
1319
+ }
1320
+
1321
+ function removeFileFromDisk(f, cb){
1322
+ var callback = cb;
1323
+ var currentFileIndex =0;
1324
+ var removeNextItem = function(){
1325
+ currentFileIndex++;
1326
+ if(currentFileIndex >= len){
1327
+ if(f.remove()){
1328
+ callback.apply();
1329
+ }else{
1330
+ }
1331
+ }else{
1332
+ removeFileFromDisk(files[currentFileIndex],removeNextItem);
1333
+ }
1334
+ };
1335
+ if (f instanceof File){
1336
+ if(f.remove()){
1337
+ callback.apply();
1338
+ }else{
1339
+ }
1340
+ }else{
1341
+ var files = f.getFiles();
1342
+ var len = files.length;
1343
+ if(len==0){
1344
+ removeNextItem();
1345
+ }else{
1346
+ removeFileFromDisk(files[currentFileIndex],removeNextItem);
1347
+ }
1348
+ }
1349
+ }
1350
+
1351
+ function getRandomName(length){
1352
+ var sequence = 'abcdefghijklmnoqrstuvwxyz1234567890';
1353
+ var returnString ='';
1354
+ for(var i=0;i<length;i++){
1355
+ returnString += sequence.charAt(Math.floor(Math.random()*sequence.length));
1356
+ }
1357
+ return returnString;
1358
+ }
1359
+
1360
+ function iterateProperty(property, space){
1361
+ if(space === null || space === undefined){
1362
+ space = 0;
1363
+ }
1364
+ var spaceString ='';
1365
+ for(var a=0;a<space;a++){
1366
+ spaceString+=' ';
1367
+ }
1368
+ if(property.numProperties){
1369
+ $.writeln(spaceString+'--- new iteration '+property.name+' ---');
1370
+ var i=0, len = property.numProperties;
1371
+ while(i<len){
1372
+ $.writeln(spaceString+'-> '+property(i+1).name +" | "+property(i+1).matchName );
1373
+ iterateProperty(property(i+1), space+1);
1374
+ i++;
1375
+ }
1376
+ }else{
1377
+ if(property.propertyValueType != PropertyValueType.NO_VALUE && property.value != undefined){
1378
+ $.writeln(spaceString+'--- Value:'+property.value.toString()+' ---');
1379
+ }else{
1380
+ $.writeln(spaceString+'--- No Value:'+' ---');
1381
+ }
1382
+ }
1383
+ }
1384
+
1385
+ function rgbToHex(r, g, b) {
1386
+ return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
1387
+ }
1388
+
1389
+ function arrayRgbToHex(values) {
1390
+ return rgbToHex(Math.round(values[0]*255),Math.round(values[1]*255),Math.round(values[2]*255));
1391
+ }
1392
+
1393
+ function layerType(layerOb){
1394
+ function avLayerType(lObj){
1395
+ var lSource = lObj.source;
1396
+ if(lSource instanceof CompItem){
1397
+ return "PreCompLayer";
1398
+ }
1399
+ var lMainSource = lSource.mainSource;
1400
+ var lFile = lMainSource.file;
1401
+ if(!lObj.hasVideo){
1402
+ return "AudioLayer";
1403
+ }else if(lSource instanceof CompItem){
1404
+ return "PreCompLayer";
1405
+ }else if(lSource.frameDuration < 1){
1406
+ if(lMainSource instanceof PlaceholderSource){
1407
+ return "PlaceholderVideoLayer";
1408
+ }else if(lSource.name.toString().indexOf("].") != -1){
1409
+ return "ImageSequenceLayer";
1410
+ }else{
1411
+ return "VideoLayer";
1412
+ }
1413
+ }else if(lSource.frameDuration == 1){
1414
+ if(lMainSource instanceof PlaceholderSource){
1415
+ return "PlaceholderStillLayer";
1416
+ }else if(lMainSource.color){
1417
+ return "SolidLayer";
1418
+ }else{
1419
+ return "StillLayer";
1420
+ }
1421
+ }
1422
+ }
1423
+ try{
1424
+ var curLayer,instanceOfArray,instanceOfArrayLength,result;
1425
+ curLayer = layerOb;
1426
+ instanceOfArray = [AVLayer, CameraLayer, LightLayer, ShapeLayer, TextLayer];
1427
+ instanceOfArrayLength = instanceOfArray.length;
1428
+ if(curLayer.guideLayer){
1429
+ return "GuideLayer";
1430
+ }else if(curLayer.adjustmentLayer){
1431
+ return "AdjustmentLayer";
1432
+ }else if (curLayer.nullLayer)
1433
+ {
1434
+ return "NullLayer";
1435
+ }
1436
+ for(var i = 0;i<instanceOfArrayLength;i++){
1437
+ if(curLayer instanceof instanceOfArray[i]){
1438
+ result = instanceOfArray[i].name;
1439
+ break;
1440
+ }
1441
+ }
1442
+ if(result == "AVLayer"){
1443
+ result = avLayerType(curLayer);
1444
+ };
1445
+ return result;
1446
+ }catch(err){alert(err.line.toString+" "+err.toString())}
1447
+ }
1448
+
1449
+ function getprojectItemType(item){
1450
+ var getType = {};
1451
+ var type = getType.toString.call(item);
1452
+ var itemType = '';
1453
+ switch(type){
1454
+ case "[object FolderItem]":
1455
+ itemType = 'Folder';
1456
+ break;
1457
+ case "[object FootageItem]":
1458
+ itemType = 'Footage';
1459
+ break;
1460
+ case "[object CompItem]":
1461
+ itemType = 'Comp';
1462
+ break;
1463
+ default:
1464
+ itemType = type;
1465
+ break;
1466
+
1467
+ }
1468
+ return itemType;
1469
+ }
1470
+
1471
+ function convertToBezierValues(property, frameRate, ob,propertyName){
1472
+ function getPropertyValue(value, roundFlag){
1473
+ switch(property.propertyValueType){
1474
+ case PropertyValueType.SHAPE:
1475
+ var elem = {
1476
+ i : roundFlag ? extrasInstance.roundNumber(value.inTangents,3) : value.inTangents,
1477
+ o : roundFlag ? extrasInstance.roundNumber(value.outTangents,3) : value.outTangents,
1478
+ v : roundFlag ? extrasInstance.roundNumber(value.vertices,3) : value.vertices
1479
+ };
1480
+ return elem;
1481
+ case PropertyValueType.COLOR:
1482
+ var i, len = value.length;
1483
+ for(i = 0; i < len; i+=1){
1484
+ value[i] = Math.round(value[i]*255);
1485
+ }
1486
+ return value;
1487
+ default:
1488
+ return roundFlag ? extrasInstance.roundNumber(value,3) : value;
1489
+ }
1490
+ }
1491
+
1492
+ var j = 1, jLen = property.numKeys;
1493
+ var beziersArray = [];
1494
+ var averageSpeed, duration;
1495
+ var bezierIn, bezierOut;
1496
+ function buildSegment(segmentOb, indexTime){
1497
+
1498
+ function getCurveLength(initPos,endPos, outBezier, inBezier){
1499
+ var k, curveSegments = 200;
1500
+ var point,lastPoint = null;
1501
+ var ptDistance;
1502
+ var absToCoord,absTiCoord;
1503
+ var triCoord1,triCoord2,triCoord3,liCoord1,liCoord2,ptCoord,perc,addedLength = 0;
1504
+ for(k=0;k<curveSegments;k+=1){
1505
+ point = [];
1506
+ perc = k/(curveSegments-1);
1507
+ ptDistance = 0;
1508
+ absToCoord = [];
1509
+ absTiCoord = [];
1510
+ outBezier.forEach(function(item,index){
1511
+ if(absToCoord[index] == null){
1512
+ absToCoord[index] = initPos[index] + outBezier[index];
1513
+ absTiCoord[index] = endPos[index] + inBezier[index];
1514
+ }
1515
+ triCoord1 = initPos[index] + (absToCoord[index] - initPos[index])*perc;
1516
+ triCoord2 = absToCoord[index] + (absTiCoord[index] - absToCoord[index])*perc;
1517
+ triCoord3 = absTiCoord[index] + (endPos[index] - absTiCoord[index])*perc;
1518
+ liCoord1 = triCoord1 + (triCoord2 - triCoord1)*perc;
1519
+ liCoord2 = triCoord2 + (triCoord3 - triCoord2)*perc;
1520
+ ptCoord = liCoord1 + (liCoord2 - liCoord1)*perc;
1521
+ point.push(ptCoord);
1522
+ if(lastPoint !== null){
1523
+ ptDistance += Math.pow(point[index] - lastPoint[index],2);
1524
+ }
1525
+ });
1526
+ ptDistance = Math.sqrt(ptDistance);
1527
+ addedLength += ptDistance;
1528
+ lastPoint = point;
1529
+ }
1530
+ return addedLength;
1531
+ }
1532
+
1533
+ var i, len;
1534
+ var key = {};
1535
+ var lastKey = {};
1536
+ var interpolationType = '';
1537
+ key.time = property.keyTime(indexTime+1);
1538
+ lastKey.time = property.keyTime(indexTime);
1539
+ key.value = getPropertyValue(property.keyValue(indexTime+1), false);
1540
+ lastKey.value = getPropertyValue(property.keyValue(indexTime), false);
1541
+ if(!(key.value instanceof Array)){
1542
+ key.value = [key.value];
1543
+ lastKey.value = [lastKey.value];
1544
+ }
1545
+ if(property.keyOutInterpolationType(indexTime) == KeyframeInterpolationType.HOLD){
1546
+ interpolationType = 'hold';
1547
+ }else{
1548
+ if(property.keyOutInterpolationType(indexTime) == KeyframeInterpolationType.LINEAR && property.keyInInterpolationType(indexTime + 1) == KeyframeInterpolationType.LINEAR){
1549
+ interpolationType = 'linear';
1550
+ }
1551
+ buildKeyInfluence(key, lastKey, indexTime);
1552
+ switch(property.propertyValueType){
1553
+ case PropertyValueType.ThreeD_SPATIAL:
1554
+ case PropertyValueType.TwoD_SPATIAL:
1555
+ lastKey.to = property.keyOutSpatialTangent(indexTime);
1556
+ key.ti = property.keyInSpatialTangent(indexTime+1);
1557
+ break;
1558
+ }
1559
+ }
1560
+ if(interpolationType == 'hold'){
1561
+ segmentOb.t = extrasInstance.roundNumber(lastKey.time*frameRate,3);
1562
+ segmentOb.s = getPropertyValue(property.keyValue(j), true);
1563
+ if(!(segmentOb.s instanceof Array)){
1564
+ segmentOb.s = [segmentOb.s];
1565
+ }
1566
+ segmentOb.h = 1;
1567
+ j += 1;
1568
+ buildNextSegment();
1569
+ return;
1570
+ }
1571
+ duration = key.time - lastKey.time;
1572
+ len = key.value.length;
1573
+ bezierIn = {};
1574
+ bezierOut = {};
1575
+ averageSpeed = 0;
1576
+ var infOut,infIn;
1577
+ switch(property.propertyValueType){
1578
+ case PropertyValueType.ThreeD_SPATIAL:
1579
+ case PropertyValueType.TwoD_SPATIAL:
1580
+ var curveLength = getCurveLength(lastKey.value,key.value, lastKey.to, key.ti);
1581
+ averageSpeed = curveLength/duration;
1582
+ if(curveLength === 0){
1583
+ infOut = lastKey.easeOut.influence;
1584
+ infIn = key.easeIn.influence;
1585
+ }else{
1586
+ infOut = Math.min(100*curveLength/(lastKey.easeOut.speed*duration), lastKey.easeOut.influence);
1587
+ infIn = Math.min(100*curveLength/(key.easeIn.speed*duration), key.easeIn.influence);
1588
+ }
1589
+ bezierIn.x = 1 - infIn / 100;
1590
+ bezierOut.x = infOut / 100;
1591
+ break;
1592
+ case PropertyValueType.SHAPE:
1593
+ averageSpeed = 1;
1594
+ infOut = Math.min(100/lastKey.easeOut.speed, lastKey.easeOut.influence);
1595
+ infIn = Math.min(100/key.easeIn.speed, key.easeIn.influence);
1596
+ bezierIn.x = 1 - infIn / 100;
1597
+ bezierOut.x = infOut / 100;
1598
+ break;
1599
+ case PropertyValueType.ThreeD:
1600
+ case PropertyValueType.TwoD:
1601
+ case PropertyValueType.OneD:
1602
+ case PropertyValueType.COLOR:
1603
+ bezierIn.x = [];
1604
+ bezierOut.x = [];
1605
+ key.easeIn.forEach(function(item, index){
1606
+ bezierIn.x[index] = 1 - item.influence / 100;
1607
+ bezierOut.x[index] = lastKey.easeOut[index].influence / 100;
1608
+
1609
+ });
1610
+ averageSpeed = [];
1611
+ for(i=0;i<len;i+=1){
1612
+ averageSpeed[i] = (key.value[i] - lastKey.value[i])/duration;
1613
+ }
1614
+ break;
1615
+ }
1616
+ if(averageSpeed == 0){
1617
+ bezierIn.y = bezierIn.x;
1618
+ bezierOut.y = bezierOut.x;
1619
+ }else{
1620
+ switch(property.propertyValueType){
1621
+ case PropertyValueType.ThreeD_SPATIAL:
1622
+ case PropertyValueType.TwoD_SPATIAL:
1623
+ case PropertyValueType.SHAPE:
1624
+ if(interpolationType == 'linear'){
1625
+ bezierIn.y = bezierIn.x;
1626
+ bezierOut.y = bezierOut.x;
1627
+ }else{
1628
+ bezierIn.y = 1 - ((key.easeIn.speed) / averageSpeed) * (infIn / 100);
1629
+ bezierOut.y = ((lastKey.easeOut.speed) / averageSpeed) * bezierOut.x;
1630
+ }
1631
+ break;
1632
+ case PropertyValueType.ThreeD:
1633
+ case PropertyValueType.TwoD:
1634
+ case PropertyValueType.OneD:
1635
+ case PropertyValueType.COLOR:
1636
+ bezierIn.y = [];
1637
+ bezierOut.y = [];
1638
+ key.easeIn.forEach(function(item,index){
1639
+ if(averageSpeed[index] == 0 || interpolationType == 'linear'){
1640
+ bezierIn.y[index] = bezierIn.x[index];
1641
+ bezierOut.y[index] = bezierOut.x[index];
1642
+ }else{
1643
+ bezierIn.y[index] = 1 - ((item.speed) / averageSpeed[index]) * (item.influence / 100);
1644
+ bezierOut.y[index] = ((lastKey.easeOut[index].speed) / averageSpeed[index]) * bezierOut.x[index];
1645
+ }
1646
+ });
1647
+ break;
1648
+ }
1649
+ }
1650
+
1651
+ bezierIn.x = extrasInstance.roundNumber(bezierIn.x,3);
1652
+ bezierIn.y = extrasInstance.roundNumber(bezierIn.y,3);
1653
+ bezierOut.x = extrasInstance.roundNumber(bezierOut.x,3);
1654
+ bezierOut.y = extrasInstance.roundNumber(bezierOut.y,3);
1655
+ segmentOb.i = bezierIn;
1656
+ segmentOb.o = bezierOut;
1657
+ segmentOb.n = (bezierIn.x.toString()+'_'+bezierIn.y.toString()+'_'+bezierOut.x.toString()+'_'+bezierOut.y.toString()).replace(/\./g, 'p');
1658
+ segmentOb.t = extrasInstance.roundNumber(lastKey.time*frameRate,3);
1659
+ segmentOb.s = getPropertyValue(property.keyValue(j), true);
1660
+ segmentOb.e = getPropertyValue(property.keyValue(j+1), true);
1661
+ if(!(segmentOb.s instanceof Array)){
1662
+ segmentOb.s = [segmentOb.s];
1663
+ segmentOb.e = [segmentOb.e];
1664
+ }
1665
+ if(property.propertyValueType == PropertyValueType.ThreeD_SPATIAL || property.propertyValueType == PropertyValueType.TwoD_SPATIAL ){
1666
+ segmentOb.to = lastKey.to;
1667
+ segmentOb.ti = key.ti;
1668
+ }
1669
+ j += 1;
1670
+ buildNextSegment();
1671
+ }
1672
+
1673
+ if(property.numKeys <= 1){
1674
+ //beziersArray.push(getPropertyValue(property.valueAtTime(0,true), true));
1675
+ ob[propertyName] = getPropertyValue(property.valueAtTime(0,true), true);
1676
+ return;
1677
+ }
1678
+
1679
+ function buildKeyInfluence(key,lastKey, indexTime){
1680
+ switch(property.propertyValueType){
1681
+ case PropertyValueType.ThreeD_SPATIAL:
1682
+ case PropertyValueType.TwoD_SPATIAL:
1683
+ case PropertyValueType.SHAPE:
1684
+ key.easeIn = {
1685
+ influence : property.keyInTemporalEase(indexTime+1)[0].influence,
1686
+ speed : property.keyInTemporalEase(indexTime+1)[0].speed
1687
+ };
1688
+ lastKey.easeOut = {
1689
+ influence : property.keyOutTemporalEase(indexTime)[0].influence,
1690
+ speed : property.keyOutTemporalEase(indexTime)[0].speed
1691
+ };
1692
+ break;
1693
+ default:
1694
+ key.easeIn = [];
1695
+ lastKey.easeOut = [];
1696
+ var inEase = property.keyInTemporalEase(indexTime+1);
1697
+ var outEase = property.keyOutTemporalEase(indexTime);
1698
+ inEase.forEach(function(item,index){
1699
+ key.easeIn.push({influence : item.influence, speed:item.speed});
1700
+ lastKey.easeOut.push({influence : outEase[index].influence, speed:outEase[index].speed});
1701
+ });
1702
+ }
1703
+ }
1704
+
1705
+ function buildNextSegment(){
1706
+ if(j<jLen){
1707
+ var segmentOb = {};
1708
+ beziersArray.push(segmentOb);
1709
+ buildSegment(segmentOb,j);
1710
+ }
1711
+ }
1712
+ buildNextSegment();
1713
+ beziersArray.push({t:property.keyTime(j)*frameRate});
1714
+ ob[propertyName] = beziersArray;
1715
+ }
1716
+
1717
+ var ob = {};
1718
+ ob.getItemByName = getItemByName;
1719
+ ob.compareObjects = compareObjects;
1720
+ ob.roundNumber = roundNumber;
1721
+ ob.roundArray = roundArray;
1722
+ ob.setInterval = setInterval;
1723
+ ob.setTimeout = setTimeout;
1724
+ ob.cancelTimeout = cancelTimeout;
1725
+ ob.cancelInterval = cancelInterval;
1726
+ ob.removeDirectoryContent = removeDirectoryContent;
1727
+ ob.removeFileFromDisk = removeFileFromDisk;
1728
+ ob.getRandomName = getRandomName;
1729
+ ob.iterateProperty = iterateProperty;
1730
+ ob.rgbToHex = rgbToHex;
1731
+ ob.arrayRgbToHex = arrayRgbToHex;
1732
+ ob.layerType = layerType;
1733
+ ob.getprojectItemType = getprojectItemType;
1734
+ ob.convertToBezierValues = convertToBezierValues;
1735
+
1736
+ extrasInstance = ob;
1737
+
1738
+ }());
1739
+ (function(){
1740
+ var rqCollection;
1741
+ var proj = null;
1742
+
1743
+ var queueItem;
1744
+ var moduleItem;
1745
+ var destinationFile;
1746
+ var counter = 0;
1747
+ var templateName = 'HTML_bodyMoving_template';
1748
+ var filesDirectory;
1749
+ function addComposition(comp){
1750
+ filesDirectory = new Folder(exportFolder.fullName+'/temp');
1751
+ if(!filesDirectory.exists){
1752
+ filesDirectory.create();
1753
+ }
1754
+ unqueueAllItems();
1755
+ queueItem = rqCollection.add(comp);
1756
+ queueItem.render = true;
1757
+ moduleItem = queueItem.outputModule(1);
1758
+ moduleItem.applyTemplate(templateName);
1759
+ destinationFile = new File(filesDirectory.fullName+'/'+'tempFile_'+counter+'.png');
1760
+ moduleItem.file = destinationFile;
1761
+ proj.renderQueue.render();
1762
+ counter++;
1763
+ }
1764
+
1765
+ function importHelperProject(){
1766
+ var i=0, len = helperFootage.items.length;
1767
+ var helperComp;
1768
+ while(i<len){
1769
+ if(extrasInstance.getprojectItemType(helperFootage.item(i+1)) == 'Comp'){
1770
+ helperComp = helperFootage.item(i+1);
1771
+ break;
1772
+ }
1773
+ i += 1;
1774
+ }
1775
+ var renderer = searchHelperRenderer(helperComp);
1776
+ var helperModule = renderer.outputModule(1);
1777
+ var templates = helperModule.templates;
1778
+ i = 0;
1779
+ len = templates.length;
1780
+ var found = false;
1781
+ while(i<len){
1782
+ if(templates[i] === templateName){
1783
+ found = true;
1784
+ break;
1785
+ }
1786
+ i+=1;
1787
+ }
1788
+ if(found === false){
1789
+ helperModule.saveAsTemplate(templateName);
1790
+ }
1791
+ renderer.remove();
1792
+ }
1793
+
1794
+ function searchHelperRenderer(helperComp){
1795
+ var i=0,len = proj.renderQueue.items.length;
1796
+ var item;
1797
+ while(i<len){
1798
+ item = proj.renderQueue.items[i+1];
1799
+ if(item.comp == helperComp){
1800
+ return item;
1801
+ }
1802
+ i++;
1803
+ }
1804
+ }
1805
+
1806
+ function unqueueAllItems(){
1807
+ var item;
1808
+ var i,len = proj.renderQueue.items.length;
1809
+ for(i=0;i<len;i++){
1810
+ item = proj.renderQueue.items[i+1];
1811
+ if(verifyIfRenderable(item.status)){
1812
+ proj.renderQueue.items[i+1].render = false;
1813
+ }
1814
+ }
1815
+ }
1816
+
1817
+ function verifyIfRenderable(status){
1818
+ switch(status){
1819
+ case RQItemStatus.USER_STOPPED:
1820
+ case RQItemStatus.ERR_STOPPED:
1821
+ case RQItemStatus.DONE:
1822
+ case RQItemStatus.RENDERING:
1823
+ return false;
1824
+ }
1825
+ return true;
1826
+ }
1827
+
1828
+ function getStatus(){
1829
+ var status = queueItem.status;
1830
+ if(status==RQItemStatus.DONE){
1831
+ queueItem.remove();
1832
+ renameFile();
1833
+ }
1834
+ return status;
1835
+ }
1836
+
1837
+ function renameFile(){
1838
+ if(destinationFile.exists){
1839
+ if(destinationFile.remove()){
1840
+ var renamingFile = new File(destinationFile.fullName+'00000');
1841
+ renamingFile.rename(destinationFile.name);
1842
+ }else{
1843
+ //TODO handle error when removing file
1844
+ }
1845
+ }else{
1846
+ var renamingFile = new File(destinationFile.fullName+'00000');
1847
+ renamingFile.rename(destinationFile.name);
1848
+ }
1849
+ }
1850
+
1851
+ function getFile(){
1852
+ return destinationFile;
1853
+ }
1854
+
1855
+ function setProject(project){
1856
+ if(proj == null){
1857
+ proj = project;
1858
+ rqCollection = project.renderQueue.items;
1859
+ importHelperProject();
1860
+ }
1861
+ }
1862
+
1863
+ var ob = {};
1864
+ ob.addComposition = addComposition;
1865
+ ob.getStatus = getStatus;
1866
+ ob.getFile = getFile;
1867
+ ob.setProject = setProject;
1868
+
1869
+ rqManager = ob;
1870
+ }());
1871
+ /****** END rqManager ******/
1872
+ /****** INIT LayerConverter ******/
1873
+ (function(){
1874
+ var pendingComps = [];
1875
+ var convertedSources = [];
1876
+ var duplicatedSources = [];
1877
+ var helperFolder;
1878
+ var currentLayerNum = 0;
1879
+ var currentCompositionNum = 0;
1880
+ var totalLayers;
1881
+ var tempConverterComp;
1882
+ var currentComposition;
1883
+ var currentSource;
1884
+ var currentLayerInfo;
1885
+ var duplicateMainComp;
1886
+ var callback;
1887
+ function convertComposition(comp){
1888
+ var i=0, len = helperFootage.items.length;
1889
+ while(i<len){
1890
+ if(extrasInstance.getprojectItemType(helperFootage.item(i+1)) == 'Folder'){
1891
+ helperFolder = helperFootage.item(i+1);
1892
+ break;
1893
+ }
1894
+ i += 1;
1895
+ }
1896
+ AssetsManager.reset();
1897
+ duplicateMainComp = comp.duplicate();
1898
+ //duplicateMainComp.openInViewer() ;
1899
+ duplicateMainComp.parentFolder = helperFolder;
1900
+ currentLayerNum = 0;
1901
+ currentCompositionNum = 0;
1902
+ pendingComps = [];
1903
+ convertedSources = [];
1904
+ duplicatedSources = [];
1905
+ pendingComps.push(duplicateMainComp);
1906
+ if(pendingComps.length == 1){
1907
+ extrasInstance.setTimeout(iterateNextComposition,100);
1908
+ }
1909
+ };
1910
+
1911
+ function iterateNextComposition(){
1912
+ UI.setExportText('Searching next comp');
1913
+ if(currentCompositionNum == pendingComps.length){
1914
+ UI.setExportText('Done');
1915
+ //TODO dar acceso externo a main comp
1916
+ //TODO despachar evento de fin
1917
+ callback.apply(null,[duplicateMainComp]);
1918
+ return;
1919
+ }
1920
+ currentComposition = pendingComps[currentCompositionNum];
1921
+ currentLayerNum = 0;
1922
+ totalLayers = currentComposition.layers.length;
1923
+ extrasInstance.setTimeout(verifyNextItem,100);
1924
+ }
1925
+
1926
+ function verifyNextItem(){
1927
+ if(currentLayerNum<totalLayers){
1928
+ var layerInfo = currentComposition.layers[currentLayerNum+1];
1929
+ UI.setExportText('Verifying item: ' + currentLayerNum + ' from '+ layerInfo.name);
1930
+ var lType = extrasInstance.layerType(layerInfo);
1931
+ if(lType == 'StillLayer' && layerInfo.enabled){
1932
+ currentSource = layerInfo.source;
1933
+ var convertedSource = searchConvertedSource(currentSource);
1934
+ if(convertedSource==null){
1935
+ currentLayerInfo = layerInfo;
1936
+ tempConverterComp = app.project.items.addComp('tempConverterComp',Math.max(4,currentSource.width),Math.max(4,currentSource.height),1,1,1);
1937
+ tempConverterComp.layers.add(currentSource);
1938
+ rqManager.addComposition(tempConverterComp);
1939
+ waitForRenderDone();
1940
+ }else{
1941
+ AssetsManager.associateLayerToSource(layerInfo,currentSource);
1942
+ //replaceCurrentLayerSource(convertedSource); //NOT REPLACING FOOTAGE. NOT SURE IF NEEDED.
1943
+ currentLayerNum++;
1944
+ extrasInstance.setTimeout(verifyNextItem,100);
1945
+ }
1946
+ }else{
1947
+ if(lType=='PreCompLayer'){
1948
+ var copy = searchCompositionDuplicate(layerInfo);
1949
+ layerInfo.replaceSource(copy, false);
1950
+ pendingComps.push(copy);
1951
+ copy.parentFolder = helperFolder;
1952
+ }
1953
+ currentLayerNum++;
1954
+ extrasInstance.setTimeout(verifyNextItem,100);
1955
+ }
1956
+ }else{
1957
+ currentCompositionNum++;
1958
+ extrasInstance.setTimeout(iterateNextComposition,100);
1959
+ }
1960
+ }
1961
+
1962
+ function searchCompositionDuplicate(layerInfo){
1963
+ var i=0,len = duplicatedSources.length;
1964
+ while(i<len){
1965
+ if(duplicatedSources[i].s == layerInfo.source){
1966
+ return duplicatedSources[i].c;
1967
+ }
1968
+ i++;
1969
+ }
1970
+ var copy = layerInfo.source.duplicate();
1971
+ UI.setExportText('Duplicating: '+layerInfo.name);
1972
+ //copy.openInViewer() ;
1973
+ duplicatedSources.push({s:layerInfo.source,c:copy});
1974
+ return copy;
1975
+ }
1976
+
1977
+ function searchConvertedSource(source){
1978
+ var i = 0, len = convertedSources.length;
1979
+ while(i<len){
1980
+ if(source == convertedSources[i].c){
1981
+ return convertedSources[i].r;
1982
+ }
1983
+ i++;
1984
+ }
1985
+ return null;
1986
+ }
1987
+
1988
+ function waitForRenderDone(){
1989
+ if(checkRender()){
1990
+ replaceCurrentLayer();
1991
+ currentLayerNum++;
1992
+ extrasInstance.setTimeout(verifyNextItem,100);
1993
+ }else{
1994
+ extrasInstance.setTimeout(waitForRenderDone,100);
1995
+ }
1996
+ }
1997
+
1998
+ function checkRender(){
1999
+ if(rqManager.getStatus() == RQItemStatus.DONE){
2000
+ return true;
2001
+ }
2002
+ return false;
2003
+ }
2004
+
2005
+ function replaceCurrentLayerSource(source){
2006
+ var layerInfo = currentComposition.layers[currentLayerNum+1];
2007
+ layerInfo.replaceSource(source, false);
2008
+ }
2009
+
2010
+ function replaceCurrentLayer(){
2011
+ var myFile = rqManager.getFile();
2012
+ var myImportOptions = new ImportOptions();
2013
+ myImportOptions.file = myFile;
2014
+ var myFootage =app.project.importFile(myImportOptions);
2015
+ myFootage.parentFolder = helperFolder;
2016
+ convertedSources.push({c:currentSource,r:myFootage});
2017
+ AssetsManager.createLayerSource(myFile,currentLayerInfo,currentSource);
2018
+ //currentLayerInfo.replaceSource(myFootage, false); //NOT REPLACING FOOTAGE. NOT SURE IF NEEDED.
2019
+ if(tempConverterComp!=null){
2020
+ tempConverterComp.remove();
2021
+ }
2022
+ }
2023
+
2024
+ function setCallback(cb){
2025
+ callback = cb;
2026
+ }
2027
+
2028
+ var ob = {};
2029
+ ob.convertComposition = convertComposition;
2030
+ ob.setCallback = setCallback;
2031
+
2032
+ LayerConverter = ob;
2033
+ }());
2034
+ /****** END LayerConverter ******/
2035
+ /****** INIT shapesParser ******/
2036
+ (function (){
2037
+ var currentShape;
2038
+ var currentOb;
2039
+ var currentFrame;
2040
+
2041
+ function parsePaths(paths,array,lastData,time){
2042
+ var i, len = paths.length;
2043
+ var frames =[];
2044
+ var framesI =[];
2045
+ var framesO =[];
2046
+ var framesV =[];
2047
+ for(i=0;i<len;i+=1){
2048
+ var path = paths[i].property('Path').valueAtTime(time,false);
2049
+ var frame = {};
2050
+ var frameI = {};
2051
+ var frameO = {};
2052
+ var frameV = {};
2053
+ frame.v = extrasInstance.roundNumber(path.vertices,3);
2054
+ frame.i = extrasInstance.roundNumber(path.inTangents,3);
2055
+ frame.o = extrasInstance.roundNumber(path.outTangents,3);
2056
+ frameI = extrasInstance.roundNumber(path.inTangents,3);
2057
+ frameO = extrasInstance.roundNumber(path.outTangents,3);
2058
+ frameV = extrasInstance.roundNumber(path.vertices,3);
2059
+ frames .push(frame);
2060
+ framesI .push(frameI);
2061
+ framesO .push(frameO);
2062
+ framesV .push(frameV);
2063
+ }
2064
+ /*if(lastData.path == null || extrasInstance.compareObjects(lastData.path,frames) == false){
2065
+ array[currentFrame]=frames;
2066
+ lastData.path = frames;
2067
+ }*/
2068
+ if(lastData.pathI == null || extrasInstance.compareObjects(lastData.pathI,framesI) == false){
2069
+ array.i[currentFrame]=framesI;
2070
+ lastData.pathI = framesI;
2071
+ }
2072
+ if(lastData.pathO == null || extrasInstance.compareObjects(lastData.pathO,framesO) == false){
2073
+ array.o[currentFrame]=framesO;
2074
+ lastData.pathO = framesO;
2075
+ }
2076
+ if(lastData.pathV== null || extrasInstance.compareObjects(lastData.pathV,framesV) == false){
2077
+ array.v[currentFrame]=framesV;
2078
+ lastData.pathV = framesV;
2079
+ }
2080
+ }
2081
+ function parseStar(){
2082
+
2083
+ }
2084
+ function parseRect(info,array, lastData, time){
2085
+ //Todo Use this when property has expressions
2086
+ return;
2087
+ var frame = {};
2088
+ frame.size = info.property('Size').valueAtTime(time,false);
2089
+ frame.p = extrasInstance.roundNumber(info.property('Position').valueAtTime(time,false),3);
2090
+ frame.roundness = extrasInstance.roundNumber(info.property('Roundness').valueAtTime(time,false),3);
2091
+ if(lastData.rect == null || extrasInstance.compareObjects(lastData.rect,frame) == false){
2092
+ array[currentFrame]=frame;
2093
+ lastData.rect = frame;
2094
+ }else{
2095
+ //array.push(new Object());
2096
+ }
2097
+ }
2098
+ function parseEllipse(info,array, lastData, time){
2099
+ //Todo Use this when property has expressions
2100
+ return;
2101
+ var frame = {};
2102
+ frame.size = info.property('Size').valueAtTime(time,false);
2103
+ frame.p = extrasInstance.roundNumber(info.property('Position').valueAtTime(time,false),3);
2104
+ if(lastData.rect == null || extrasInstance.compareObjects(lastData.rect,frame) == false){
2105
+ array[currentFrame]=frame;
2106
+ lastData.rect = frame;
2107
+ }else{
2108
+ //array.push(new Object());
2109
+ }
2110
+ return frame.size;
2111
+ }
2112
+ function parseStroke(info,array, lastData, time){
2113
+ //Todo Use this when property has expressions
2114
+ return;
2115
+ var frame = {};
2116
+ var color = info.property('Color').valueAtTime(time,false);
2117
+ frame.color =extrasInstance.rgbToHex(Math.round(color[0]*255),Math.round(color[1]*255),Math.round(color[2]*255));
2118
+ frame.opacity = extrasInstance.roundNumber(info.property('Opacity').valueAtTime(time,false),3);
2119
+ frame.width = info.property('Stroke Width').valueAtTime(time,false);
2120
+ if(lastData.stroke == null || extrasInstance.compareObjects(lastData.stroke,frame) == false){
2121
+ array[currentFrame]=frame;
2122
+ lastData.stroke = frame;
2123
+ }else{
2124
+ //array.push(new Object());
2125
+ }
2126
+ }
2127
+ function parseFill(info,array, lastData, time){
2128
+ //Todo Use this when property has expressions
2129
+ return;
2130
+
2131
+ var frame = {};
2132
+ var color = info.property('Color').valueAtTime(time,false);
2133
+ frame.color =extrasInstance.rgbToHex(Math.round(color[0]*255),Math.round(color[1]*255),Math.round(color[2]*255));
2134
+ frame.opacity = extrasInstance.roundNumber(info.property('Opacity').valueAtTime(time,false),3);
2135
+ if(lastData.fill == null || extrasInstance.compareObjects(lastData.fill,frame) == false){
2136
+ array[currentFrame]=frame;
2137
+ lastData.fill = frame;
2138
+ }else{
2139
+ //array.push(new Object());
2140
+ }
2141
+ }
2142
+ function parseTransform(info,array, lastData, time){
2143
+ //Todo Use this when property has expressions
2144
+ return;
2145
+ var frame = {};
2146
+ frame.p = extrasInstance.roundNumber(info.property('Position').valueAtTime(time,false),3);
2147
+ frame.a = extrasInstance.roundNumber(info.property('Anchor Point').valueAtTime(time,false),3);
2148
+ frame.s = [];
2149
+ frame.s[0] = extrasInstance.roundNumber(info.property('Scale').valueAtTime(time,false)[0]/100,3);
2150
+ frame.s[1] = extrasInstance.roundNumber(info.property('Scale').valueAtTime(time,false)[1]/100,3);
2151
+ frame.r = extrasInstance.roundNumber(info.property('Rotation').valueAtTime(time,false)*Math.PI/180,3);
2152
+ frame.o = extrasInstance.roundNumber(info.property('Opacity').valueAtTime(time,false),3);
2153
+ if(lastData.transform == null || extrasInstance.compareObjects(lastData.transform,frame) == false){
2154
+ array[currentFrame]=frame;
2155
+ lastData.transform = frame;
2156
+ }else{
2157
+ //array.push(new Object());
2158
+ }
2159
+ }
2160
+
2161
+ function parseTrim(info,trim,lastData,time){
2162
+ //Todo Use this when property has expressions
2163
+ return;
2164
+ var frame = {};
2165
+ var trimS = extrasInstance.roundNumber(info.property('Start').valueAtTime(time,false),3);
2166
+ var trimE = extrasInstance.roundNumber(info.property('End').valueAtTime(time,false),3);
2167
+ var trimO = extrasInstance.roundNumber(info.property('Offset').valueAtTime(time,false),3);
2168
+ if(lastData.trimS == null || extrasInstance.compareObjects(trimS,lastData.trimS)==false){
2169
+ trim.s[currentFrame] = trimS;
2170
+ lastData.trimS = trimS;
2171
+ }
2172
+ if(lastData.trimE == null || extrasInstance.compareObjects(trimE,lastData.trimE)==false){
2173
+ trim.e[currentFrame] = trimE;
2174
+ lastData.trimE = trimE;
2175
+ }
2176
+ if(lastData.trimO == null || extrasInstance.compareObjects(trimO ,lastData.trimO )==false){
2177
+ trim.o[currentFrame] = trimO ;
2178
+ lastData.trimO = trimO ;
2179
+ }
2180
+ }
2181
+
2182
+ function parseShape(shapeInfo, shapeOb, time){
2183
+ //iterateProperty(shapeInfo,0);
2184
+ var shapeContents = shapeInfo.property('Contents');
2185
+
2186
+ var paths = [];
2187
+ var numProperties = shapeContents.numProperties;
2188
+ for(var i = 0;i<numProperties;i+=1){
2189
+ if(shapeContents(i+1).matchName == 'ADBE Vector Shape - Group'){
2190
+ paths.push(shapeContents(i+1));
2191
+ }
2192
+ }
2193
+
2194
+ if(shapeContents.property('ADBE Vector Graphic - Stroke')){
2195
+ parseStroke(shapeContents.property('ADBE Vector Graphic - Stroke'),shapeOb.an.stroke, shapeOb.lastData, time);
2196
+ }
2197
+ if(shapeContents.property('ADBE Vector Graphic - Fill')){
2198
+ parseFill(shapeContents.property('ADBE Vector Graphic - Fill'),shapeOb.an.fill, shapeOb.lastData, time);
2199
+ }
2200
+ if(paths.length>0){
2201
+ if(shapeOb.an.path){
2202
+ parsePaths(paths,shapeOb.an.path, shapeOb.lastData, time);
2203
+ }
2204
+ }
2205
+ if(shapeContents.property('ADBE Vector Shape - Rect')){
2206
+ parseRect(shapeContents.property('ADBE Vector Shape - Rect'),shapeOb.an.rect, shapeOb.lastData, time);
2207
+ }
2208
+ if(shapeContents.property('ADBE Vector Shape - Ellipse')){
2209
+ parseEllipse(shapeContents.property('ADBE Vector Shape - Ellipse'),shapeOb.an.ell, shapeOb.lastData, time);
2210
+ }
2211
+ if(shapeContents.property('ADBE Vector Filter - Trim')){
2212
+ parseTrim(shapeContents.property('ADBE Vector Filter - Trim'),shapeOb.trim, shapeOb.lastData, time);
2213
+ }
2214
+ parseTransform(shapeInfo.property('Transform'),shapeOb.an.tr, shapeOb.lastData, time);
2215
+ }
2216
+
2217
+ function addFrameData(layerInfo,layerOb, frameNum, time){
2218
+ currentFrame = frameNum;
2219
+ var contents = layerInfo.property('Contents');
2220
+ /** Todo Use for expressions
2221
+ if(contents.property('ADBE Vector Filter - Trim')){
2222
+ var trim = layerOb.trim;
2223
+ var trimS = extrasInstance.roundNumber(contents.property('ADBE Vector Filter - Trim').property('Start').valueAtTime(time,false),3);
2224
+ var trimE = extrasInstance.roundNumber(contents.property('ADBE Vector Filter - Trim').property('End').valueAtTime(time,false),3);
2225
+ var trimO = extrasInstance.roundNumber(contents.property('ADBE Vector Filter - Trim').property('Offset').valueAtTime(time,false),3);
2226
+ if(layerOb.lastData.trimS == null || extrasInstance.compareObjects(trimS,layerOb.lastData.trimS)==false){
2227
+ trim.s[currentFrame] = trimS;
2228
+ layerOb.lastData.trimS = trimS;
2229
+ }
2230
+ if(layerOb.lastData.trimE == null || extrasInstance.compareObjects(trimE,layerOb.lastData.trimE)==false){
2231
+ trim.e[currentFrame] = trimE;
2232
+ layerOb.lastData.trimE = trimE;
2233
+ }
2234
+ if(layerOb.lastData.trimO == null || extrasInstance.compareObjects(trimO ,layerOb.lastData.trimO )==false){
2235
+ trim.o[currentFrame] = trimO ;
2236
+ layerOb.lastData.trimO = trimO ;
2237
+ }
2238
+ }
2239
+ **/
2240
+ var shapes = layerOb.shapes;
2241
+ var i,len = shapes.length;
2242
+ for(i=0;i<len;i++){
2243
+ parseShape(contents.property(shapes[i].name), shapes[i], time);
2244
+ }
2245
+ }
2246
+
2247
+ function iterateProperties(iteratable,array,frameRate){
2248
+ var i, len = iteratable.numProperties;
2249
+ var ob, prop;
2250
+ for(i=0;i<len;i+=1){
2251
+ prop = iteratable.property(i+1);
2252
+ if(!prop.enabled){
2253
+ continue;
2254
+ }
2255
+ var itemType = getItemType(prop.matchName);
2256
+ if(itemType == 'sh'){
2257
+ ob = {};
2258
+ ob.ty = itemType;
2259
+ ob.closed = prop.property('Path').value.closed;
2260
+ extrasInstance.convertToBezierValues(prop.property('Path'), frameRate, ob,'ks');
2261
+ array.push(ob);
2262
+ }else if(itemType == 'rc'){
2263
+ ob = {};
2264
+ ob.ty = itemType;
2265
+ extrasInstance.convertToBezierValues(prop.property('Size'), frameRate, ob,'s');
2266
+ extrasInstance.convertToBezierValues(prop.property('Position'), frameRate, ob,'p');
2267
+ extrasInstance.convertToBezierValues(prop.property('Roundness'), frameRate, ob,'r');
2268
+ array.push(ob);
2269
+ }else if(itemType == 'el'){
2270
+ ob = {};
2271
+ ob.ty = itemType;
2272
+ extrasInstance.convertToBezierValues(prop.property('Size'), frameRate, ob,'s');
2273
+ extrasInstance.convertToBezierValues(prop.property('Position'), frameRate, ob,'p');
2274
+ array.push(ob);
2275
+ }else if(itemType == 'fl'){
2276
+ ob = {};
2277
+ ob.ty = itemType;
2278
+ ob.fillEnabled = prop.enabled;
2279
+ extrasInstance.convertToBezierValues(prop.property('Color'), frameRate, ob,'c');
2280
+ extrasInstance.convertToBezierValues(prop.property('Opacity'), frameRate, ob,'o');
2281
+ array.push(ob);
2282
+ }else if(itemType == 'st'){
2283
+ ob = {};
2284
+ ob.ty = itemType;
2285
+ ob.fillEnabled = prop.enabled;
2286
+ extrasInstance.convertToBezierValues(prop.property('Color'), frameRate, ob,'c');
2287
+ extrasInstance.convertToBezierValues(prop.property('Opacity'), frameRate, ob,'o');
2288
+ extrasInstance.convertToBezierValues(prop.property('Stroke Width'), frameRate, ob,'w');
2289
+ var j, jLen = prop.property('Dashes').numProperties;
2290
+ var dashesData = [];
2291
+ var changed = false;
2292
+ for(j=0;j<jLen;j+=1){
2293
+ if(prop.property('Dashes').property(j+1).numKeys > 0 || (prop.property('Dashes').property(j+1).name == 'Offset' && changed)) {
2294
+ changed = true;
2295
+ var dashData = {};
2296
+ var name = '';
2297
+ if(prop.property('Dashes').property(j+1).name == 'Dash'){
2298
+ name = 'd';
2299
+ }else if(prop.property('Dashes').property(j+1).name == 'Gap'){
2300
+ name = 'g';
2301
+ }else if(prop.property('Dashes').property(j+1).name == 'Offset'){
2302
+ name = 'o';
2303
+ }
2304
+ dashData.n = name;
2305
+ extrasInstance.convertToBezierValues(prop.property('Dashes').property(j+1), frameRate, dashData,'v');
2306
+ dashesData.push(dashData)
2307
+ }
2308
+ /*$.writeln('matchName: ',prop.property('Dashes').property(j+1).matchName);
2309
+ $.writeln('value: ',prop.property('Dashes').property(j+1).value);
2310
+ $.writeln('enabled: ',prop.property('Dashes').property(j+1).enabled);*/
2311
+ }
2312
+ if(changed){
2313
+ ob.d = dashesData;
2314
+ }
2315
+ //extrasInstance.iterateProperty(prop);
2316
+ array.push(ob);
2317
+ }else if(itemType == 'mm'){
2318
+ ob = {};
2319
+ ob.ty = itemType;
2320
+ ob.mm = prop.property('ADBE Vector Merge Type').value;
2321
+ array.push(ob);
2322
+ }else if(itemType == 'tm'){
2323
+ ob = {};
2324
+ ob.ty = itemType;
2325
+ extrasInstance.convertToBezierValues(prop.property('Start'), frameRate, ob,'s');
2326
+ extrasInstance.convertToBezierValues(prop.property('End'), frameRate, ob,'e');
2327
+ extrasInstance.convertToBezierValues(prop.property('Offset'), frameRate, ob,'o');
2328
+ ob.m = prop.property('Trim Multiple Shapes').value;
2329
+ //extrasInstance.iterateProperty(prop);
2330
+ array.push(ob);
2331
+ }else if(itemType == 'gr'){
2332
+ ob = {
2333
+ ty : itemType,
2334
+ it: []
2335
+ };
2336
+ iterateProperties(prop.property('Contents'),ob.it,frameRate);
2337
+ var trOb = {};
2338
+ var transformProperty = prop.property('Transform');
2339
+ trOb.ty = 'tr';
2340
+ extrasInstance.convertToBezierValues(transformProperty.property('Position'), frameRate, trOb,'p');
2341
+ extrasInstance.convertToBezierValues(transformProperty.property('Anchor Point'), frameRate, trOb,'a');
2342
+ extrasInstance.convertToBezierValues(transformProperty.property('Scale'), frameRate, trOb,'s');
2343
+ extrasInstance.convertToBezierValues(transformProperty.property('Rotation'), frameRate, trOb,'r');
2344
+ extrasInstance.convertToBezierValues(transformProperty.property('Opacity'), frameRate, trOb,'o');
2345
+ ob.it.push(trOb);
2346
+ array.push(ob);
2347
+ }
2348
+ }
2349
+ }
2350
+
2351
+ function createShapes(layerInfo,layerOb, frameRate){
2352
+ var shapes = [];
2353
+ layerOb.shapes = shapes;
2354
+ var contents = layerInfo.property('Contents');
2355
+ iterateProperties(contents,shapes,frameRate);
2356
+ }
2357
+
2358
+ function getItemType(matchName){
2359
+ //$.writeln('matchName: ',matchName);
2360
+ switch(matchName){
2361
+ case 'ADBE Vector Shape - Group':
2362
+ return 'sh';
2363
+ case 'ADBE Vector Shape - Rect':
2364
+ return 'rc';
2365
+ case 'ADBE Vector Shape - Ellipse':
2366
+ return 'el';
2367
+ case 'ADBE Vector Graphic - Fill':
2368
+ return 'fl';
2369
+ case 'ADBE Vector Graphic - Stroke':
2370
+ return 'st';
2371
+ case 'ADBE Vector Graphic - Merge':
2372
+ return 'mm';
2373
+ case 'ADBE Vector Graphic - Trim':
2374
+ case 'ADBE Vector Filter - Trim':
2375
+ return 'tm';
2376
+ case 'ADBE Vector Group':
2377
+ return 'gr';
2378
+ default:
2379
+ //$.writeln('unsupported: ',matchName);
2380
+ return '';
2381
+ }
2382
+ }
2383
+
2384
+ var ob = {};
2385
+ ob.createShapes = createShapes;
2386
+ ob.addFrameData = addFrameData;
2387
+
2388
+ ShapesParser = ob;
2389
+ }());
2390
+
2391
+ /****** END shapesParser ******/
2392
+ /****** INIT CompConverter ******/
2393
+ (function(){
2394
+ var isExportDirectoryCreated = false;
2395
+ var directoryCreationFailed = false;
2396
+ var compositionsList;
2397
+ var currentCompositionData;
2398
+ var filesDirectory;
2399
+ var mainProject = app.project;
2400
+ var scriptPath = ((File($.fileName)).path);
2401
+ var mainComp;
2402
+ var endCallback;
2403
+
2404
+ var compositionData = {};
2405
+
2406
+ function saveData(){
2407
+ if(!renderCancelled){
2408
+ var dataFile = new File(exportFolder.fullName+'/data.json');
2409
+ dataFile.open('w','TEXT','????');
2410
+ var string = JSON.stringify(compositionData);
2411
+ string = string.replace(/\n/g,'') ;
2412
+ dataFile.write(string); //DO NOT ERASE, JSON UNFORMATTED
2413
+ //dataFile.write(JSON.stringify(compositionData, null, ' ')); //DO NOT ERASE, JSON FORMATTED
2414
+ dataFile.close();
2415
+ }
2416
+ currentCompositionData.rendered = true;
2417
+ searchNextComposition();
2418
+ }
2419
+
2420
+ function layersConverted(duplicateMainComp){
2421
+ DOMAnimationManager.setCallback(saveData);
2422
+ //FOR DOM
2423
+ DOMAnimationManager.getCompositionAnimationData(duplicateMainComp,compositionData,filesDirectory);
2424
+ }
2425
+
2426
+ function animationSaved(){
2427
+ saveData();
2428
+ }
2429
+
2430
+ function directoryRemoved(){
2431
+ filesDirectory = new Folder(exportFolder.fullName+'/files');
2432
+ if(filesDirectory.create()){
2433
+ isExportDirectoryCreated = true;
2434
+ }
2435
+ }
2436
+
2437
+ function createExportDirectory(){
2438
+ exportFolder = new Folder(currentCompositionData.destination+'/'+currentCompositionData.comp.name+'/');
2439
+ filesDirectory = new Folder(exportFolder.fullName+'/files');
2440
+ if(filesDirectory.exists){
2441
+ isExportDirectoryCreated = true;
2442
+ }else{
2443
+ if(filesDirectory.create()){
2444
+ isExportDirectoryCreated = true;
2445
+ }else{
2446
+ directoryCreationFailed = true;
2447
+ }
2448
+ }
2449
+ }
2450
+
2451
+ function waitForDirectoryCreated(){
2452
+ if(isExportDirectoryCreated){
2453
+ start();
2454
+ }else if(directoryCreationFailed){
2455
+ alert(UITextsData.alertMessages.directoryCreationFailed);
2456
+ }else{
2457
+ $.sleep(100);
2458
+ waitForDirectoryCreated();
2459
+ }
2460
+ }
2461
+
2462
+ function searchHelperRenderer(helperComp){
2463
+ var i=0,len = app.project.renderQueue.items.length;
2464
+ var item;
2465
+ while(i<len){
2466
+ item = app.project.renderQueue.items[i+1];
2467
+ if(item.comp == helperComp){
2468
+ return item;
2469
+ }
2470
+ i++;
2471
+ }
2472
+ }
2473
+
2474
+ function start(){
2475
+ UI.setExportText('Starting export');
2476
+ LayerConverter.convertComposition(mainComp);
2477
+ }
2478
+
2479
+ function exportNextComposition(){
2480
+ isExportDirectoryCreated = false;
2481
+ directoryCreationFailed = false;
2482
+ mainComp = currentCompositionData.comp;
2483
+ createExportDirectory();
2484
+ waitForDirectoryCreated();
2485
+ }
2486
+
2487
+ function searchNextComposition(){
2488
+ if(!renderCancelled){
2489
+ var len = compositionsList.length;
2490
+ var i = 0;
2491
+ while(i < len){
2492
+ if(compositionsList[i].queued === true && compositionsList[i].rendered == false){
2493
+ currentCompositionData = compositionsList[i];
2494
+ exportNextComposition();
2495
+ return;
2496
+ }
2497
+ i+=1;
2498
+ }
2499
+ }
2500
+ //If it gets here there are no more compositions to render and callback is executed
2501
+ helperFootage.remove();
2502
+ endCallback.apply();
2503
+ }
2504
+
2505
+ function renderCompositions(list){
2506
+ var helperFile = new File(scriptPath+'/helperProject.aep');
2507
+ var helperImportOptions = new ImportOptions();
2508
+ helperImportOptions.file = helperFile;
2509
+ helperFootage = mainProject.importFile(helperImportOptions);
2510
+ var i=0, len = helperFootage.items.length;
2511
+ var helperFolder;
2512
+ while(i<len){
2513
+ if(extrasInstance.getprojectItemType(helperFootage.item(i+1)) == 'Folder'){
2514
+ helperFolder = helperFootage.item(i+1);
2515
+ break;
2516
+ }
2517
+ i += 1;
2518
+ }
2519
+ i = 0;
2520
+ len = helperFolder.items.length;
2521
+ while(i<len){
2522
+ if(helperFolder.item(i+1).name == 'helperSolidComp'){
2523
+ helperSolidComp = helperFolder.item(i+1);
2524
+ }
2525
+ i += 1;
2526
+ }
2527
+ helperSolid = helperSolidComp.layer(1);
2528
+ var helperPosition = helperSolid.transform["Anchor Point"];
2529
+ helperPosition.expression = "valueAtTime(time)";
2530
+
2531
+ rqManager.setProject(app.project);
2532
+ LayerConverter.setCallback(layersConverted);
2533
+ compositionsList = list;
2534
+ len = compositionsList.length;
2535
+ for(i=0;i<len;i+=1){
2536
+ compositionsList[i].rendered = false;
2537
+ }
2538
+ searchNextComposition();
2539
+ }
2540
+
2541
+ function setFinishCallback(cb){
2542
+ endCallback = cb;
2543
+ }
2544
+
2545
+ var ob = {};
2546
+ ob.renderCompositions = renderCompositions;
2547
+ ob.setFinishCallback = setFinishCallback;
2548
+
2549
+ CompConverter = ob;
2550
+ }());
2551
+ /****** END CompConverter ******/
2552
+ (function(){
2553
+ var UITextsData = {
2554
+ generalButtons : {render:'Render'},
2555
+ alertMessages : {
2556
+ noComps:'You don\'t have compositions to render',
2557
+ directoryCreationFailed:'Error trying to create directory'
2558
+ },
2559
+ tabs : {comps:'Compositions',images:'Images'},
2560
+ compsButtons : {add:'Add to render queue',remove:'Remove from render queue',destination:'Destination Folder',refresh:'Refresh'},
2561
+ compsColumns : {name:'Name',queue:'In Queue',destination:'Destination Path'},
2562
+ imagesButtons : {refresh:'Refresh', exportTxt:'Export', notExportTxt:'Do not export'},
2563
+ imagesColumns : {name:'Name',exportTxt:'Export'},
2564
+ renderTexts : {cancel:'Cancel Render'}
2565
+ }
2566
+ var availableCompositions = [];
2567
+ var bodyMovinPanel;
2568
+ var settingsGroup;
2569
+ var renderGroup;
2570
+ var compsList;
2571
+ var imagesList;
2572
+ var compTab;
2573
+ var imagesTab;
2574
+ var compsSelectionButton;
2575
+ var compsDestinationButton;
2576
+ var imagesCompsDropDown;
2577
+ var toggleImagesExportButton;
2578
+ var isPanelFocused = false;
2579
+ var ignoreEvent = true;
2580
+
2581
+
2582
+
2583
+ function myScript_buildUI(thisObj){
2584
+ bodyMovinPanel = (thisObj instanceof Panel) ? thisObj : new Window("palette", "Body Movin Exporter", undefined, {resizeable:true});
2585
+ ////bodyMovinPanel.addEventListener('focus', panelFocusHandler, true);
2586
+ bodyMovinPanel.onActivate = panelFocusHandler;
2587
+ ////bodyMovinPanel.addEventListener('blur', panelBlurHandler, true);
2588
+ bodyMovinPanel.onDeactivate = panelBlurHandler;
2589
+ ////bodyMovinPanel.addEventListener('close',closePanel);
2590
+ bodyMovinPanel.onClose = closePanel;
2591
+
2592
+ /**** WINDOW VIEW *****/
2593
+
2594
+ var mainGroupRes = "group{orientation:'stack',alignment:['fill','fill'],alignChildren:['fill',fill']}";
2595
+ bodyMovinPanel.mainGroup = bodyMovinPanel.add(mainGroupRes);
2596
+
2597
+ /**** SETTINGS GROUP ****/
2598
+ var settingsGroupRes = "group{orientation:'column',alignment:['fill','fill'],alignChildren:['fill',fill'],\
2599
+ myTabbedPanel: Panel{type:'tabbedpanel', text:'',alignment:['fill','fill'],alignChildren:['fill',fill'],\
2600
+ compTab: Panel{type:'tab', text:'"+UITextsData.tabs.comps+"',orientation:'columns',\
2601
+ },\
2602
+ imagesTab: Panel{type:'tab', text: '"+UITextsData.tabs.images+"',\
2603
+ },\
2604
+ },\
2605
+ generalButtonsGroup: Group{orientation:'row',alignment:['fill','bottom'],alignChildren:['fill',fill'],\
2606
+ renderButton: Button{text:'"+UITextsData.generalButtons.render+"',alignment:['right','bottom']},\
2607
+ }\
2608
+ }";
2609
+ settingsGroup = bodyMovinPanel.mainGroup.add(settingsGroupRes);
2610
+ ////settingsGroup.myTabbedPanel.addEventListener('change',tabChangedHandler);
2611
+ settingsGroup.myTabbedPanel.onChange = tabChangedHandler;
2612
+ ////settingsGroup.generalButtonsGroup.renderButton.addEventListener('click', startRender);
2613
+ settingsGroup.generalButtonsGroup.renderButton.onClick = startRender;
2614
+ /**** COMPOSITION TAB VIEW *****/
2615
+ var compGroup = "Group{orientation:'column',alignment:['fill','fill'],alignChildren:['fill',fill'],\
2616
+ buttonGroup: Group{orientation:'row',alignment:['fill','top'],alignChildren:['left',top'],\
2617
+ compsSelectionButton: Button{text:'"+UITextsData.compsButtons.remove+"'},\
2618
+ compsDestinationButton: Button{text:'"+UITextsData.compsButtons.destination+"'},\
2619
+ compsRefreshButton: Button{text:'"+UITextsData.compsButtons.refresh+"',alignment:['right','top']},\
2620
+ }\
2621
+ list: ListBox{text:'Components List',alignment:['fill','fill'],alignChildren:['fill',fill'],\
2622
+ properties:{numberOfColumns: 3,multiselect:true, showHeaders: true,columnTitles: ['"+UITextsData.compsColumns.name+"', '"+UITextsData.compsColumns.queue+"','"+UITextsData.compsColumns.destination+"']}\
2623
+ }\
2624
+ }";
2625
+ settingsGroup.myTabbedPanel.compTab.compGroup = settingsGroup.myTabbedPanel.compTab.add(compGroup);
2626
+ compsList = settingsGroup.myTabbedPanel.compTab.compGroup.list;
2627
+ compsSelectionButton = settingsGroup.myTabbedPanel.compTab.compGroup.buttonGroup.compsSelectionButton;
2628
+ compsDestinationButton = settingsGroup.myTabbedPanel.compTab.compGroup.buttonGroup.compsDestinationButton;
2629
+ ////compsSelectionButton.addEventListener('click',compRenderButtonClickHandler);
2630
+ compsSelectionButton.onClick = compRenderButtonClickHandler;
2631
+ ////compsDestinationButton.addEventListener('click',compDestinationButtonClickHandler);
2632
+ compsDestinationButton.onClick = compDestinationButtonClickHandler;
2633
+ ////settingsGroup.myTabbedPanel.compTab.compGroup.buttonGroup.compsRefreshButton.addEventListener('click',compRefreshButtonClickHandler);
2634
+ settingsGroup.myTabbedPanel.compTab.compGroup.buttonGroup.compsRefreshButton.onClick = compRefreshButtonClickHandler;
2635
+ compsSelectionButton.hide();
2636
+ compsDestinationButton.hide();
2637
+ ////compsList.addEventListener('change',listChangeHandler);
2638
+ compsList.onChange = listChangeHandler;
2639
+ /**** IMAGES TAB VIEW *****/
2640
+ var imagesGroup = "Group{orientation:'column',alignment:['fill','fill'],alignChildren:['fill',fill'],\
2641
+ optionsGroup: Group{orientation:'row',alignment:['fill','top'],alignChildren:['left',top'],\
2642
+ whichCompo : DropDownList { alignment:'left',properties: {items: ['Dummy text']} }, \
2643
+ toggleExportButton: Button{text:'"+UITextsData.imagesButtons.notExportTxt+"',alignment:['right','top']},\
2644
+ refreshButton: Button{text:'"+UITextsData.imagesButtons.refresh+"',alignment:['right','top']},\
2645
+ }\
2646
+ list: ListBox{text:'Images List',alignment:['fill','fill'],alignChildren:['fill',fill'],\
2647
+ properties:{numberOfColumns: 2,multiselect:true, showHeaders: true,columnTitles: ['"+UITextsData.imagesColumns.name+"', '"+UITextsData.imagesColumns.exportTxt+"']}\
2648
+ }\
2649
+ }";
2650
+ settingsGroup.myTabbedPanel.imagesTab.imagesGroup = settingsGroup.myTabbedPanel.imagesTab.add(imagesGroup);
2651
+ imagesCompsDropDown = settingsGroup.myTabbedPanel.imagesTab.imagesGroup.optionsGroup.whichCompo;
2652
+ toggleImagesExportButton = settingsGroup.myTabbedPanel.imagesTab.imagesGroup.optionsGroup.toggleExportButton;
2653
+ toggleImagesExportButton.hide();
2654
+ //toggleImagesExportButton.addEventListener('click',toggleExportImagesHandler);
2655
+ imagesList = settingsGroup.myTabbedPanel.imagesTab.imagesGroup.list;
2656
+ //imagesList.addEventListener('change',imagesListChangeHandler);
2657
+ //imagesCompsDropDown.addEventListener('change',imagesCompsDDChangeHandler);
2658
+ //settingsGroup.myTabbedPanel.imagesTab.imagesGroup.optionsGroup.refreshButton.addEventListener('click',imagesRefreshButtonClickHandler);
2659
+
2660
+ /**** RENDER GROUP ****/
2661
+ var renderGroupRes = "group{orientation:'column',alignment:['fill','fill'],alignChildren:['fill',fill'],\
2662
+ componentText:StaticText{text:'Rendering Composition ',alignment:['left','top']},\
2663
+ infoText:StaticText{text:'Exporting images ',alignment:['fill','top']},\
2664
+ progress:Progressbar{value:50,alignment:['fill','top']},\
2665
+ cancelButton: Button{text:'"+UITextsData.renderTexts.cancel+"',alignment:['center','top']},\
2666
+ }";
2667
+ bodyMovinPanel.mainGroup.renderGroup = bodyMovinPanel.mainGroup.add(renderGroupRes);
2668
+ renderGroup = bodyMovinPanel.mainGroup.renderGroup;
2669
+ ////renderGroup.cancelButton.addEventListener('click',cancelRender);
2670
+ renderGroup.cancelButton.onClick = cancelRender;
2671
+ renderGroup.hide();
2672
+
2673
+ bodyMovinPanel.layout.layout(true);
2674
+ settingsGroup.minimumSize = settingsGroup.size;
2675
+
2676
+ bodyMovinPanel.onResizing = bodyMovinPanel.onResize = function () { this.layout.resize(); }
2677
+ //panelManager.setPanel(bodyMovinPanel);
2678
+
2679
+ settingsGroup.myTabbedPanel.imagesTab.enabled = false;
2680
+
2681
+ settingsGroup.myTabbedPanel.imagesTab.hide();
2682
+
2683
+ return bodyMovinPanel;
2684
+ }
2685
+
2686
+ function closePanel(){
2687
+ bodyMovinPanel.removeEventListener('focus', panelFocusHandler);
2688
+ bodyMovinPanel.removeEventListener('blur', panelBlurHandler);
2689
+ bodyMovinPanel.removeEventListener('close',closePanel);
2690
+ settingsGroup.myTabbedPanel.removeEventListener('change',tabChangedHandler);
2691
+ settingsGroup.generalButtonsGroup.renderButton.removeEventListener('click', startRender);
2692
+ compsSelectionButton.removeEventListener('click',compRenderButtonClickHandler);
2693
+ compsDestinationButton.removeEventListener('click',compDestinationButtonClickHandler);
2694
+ compsList.removeEventListener('change',listChangeHandler);
2695
+ //toggleImagesExportButton.removeEventListener('click',toggleExportImagesHandler);
2696
+ //imagesList.removeEventListener('change',imagesListChangeHandler);
2697
+ //imagesCompsDropDown.removeEventListener('change',imagesCompsDDChangeHandler);
2698
+ //settingsGroup.myTabbedPanel.imagesTab.imagesGroup.optionsGroup.refreshButton.removeEventListener('click',imagesRefreshButtonClickHandler);
2699
+ renderGroup.cancelButton.removeEventListener('click',cancelRender);
2700
+ settingsGroup.myTabbedPanel.compTab.compGroup.buttonGroup.compsRefreshButton.removeEventListener('click',compRefreshButtonClickHandler);
2701
+ bodyMovinPanel.onResizing = bodyMovinPanel.onResize = null;
2702
+ }
2703
+
2704
+ function panelFocusHandler(ev){
2705
+ if(app.project === null || app.project === undefined){
2706
+ return;
2707
+ }
2708
+ if(isPanelFocused === true){
2709
+ return;
2710
+ }
2711
+ isPanelFocused = true;
2712
+ tabChangedHandler(null); //Uncomment this por production
2713
+ }
2714
+
2715
+ function panelBlurHandler(ev){
2716
+ if(isPanelFocused === false){
2717
+ return;
2718
+ }
2719
+ isPanelFocused = false;
2720
+ }
2721
+
2722
+ function setProgress(value){
2723
+ renderGroup.progress.value = (1 - value)*100;
2724
+ renderGroup.infoText.text = ((1 - value)*100).toFixed(2) + '%';
2725
+ }
2726
+
2727
+ function cancelRender(){
2728
+ renderCancelled = true;
2729
+ renderFinished();
2730
+ }
2731
+
2732
+ function renderFinished(){
2733
+ renderGroup.hide();
2734
+ settingsGroup.show();
2735
+ //app.endUndoGroup();
2736
+ }
2737
+
2738
+ function startRender(){
2739
+ renderCancelled = false;
2740
+ var foundComps = false,i=0, len = availableCompositions.length;
2741
+ while(i<len){
2742
+ if(availableCompositions[i].queued){
2743
+ foundComps = true;
2744
+ getCompositionImages(availableCompositions[i]);
2745
+ }
2746
+ i+=1;
2747
+ }
2748
+ if(foundComps === false){
2749
+ alert(UITextsData.alertMessages.noComps);
2750
+ return;
2751
+ }
2752
+ //TODO handle full undo
2753
+ //app.beginUndoGroup("Undo Render");
2754
+ renderGroup.show();
2755
+ settingsGroup.hide();
2756
+ CompConverter.setFinishCallback(renderFinished);
2757
+ CompConverter.renderCompositions(availableCompositions);
2758
+ }
2759
+
2760
+ function getCompositionImages(compositionData){
2761
+ if(compositionData.exportableImages === null || compositionData.exportableImages === undefined){
2762
+ compositionData.exportableImages = [];
2763
+ }
2764
+ addImagesFromComposition(compositionData.comp,compositionData.exportableImages);
2765
+ }
2766
+
2767
+ function addImagesFromComposition(compo,imagesList){
2768
+ var i, len = compo.layers.length;
2769
+ for(i = 0;i<len;i+=1){
2770
+ var layerInfo = compo.layers[i+1];
2771
+ var lType = extrasInstance.layerType(layerInfo);
2772
+ if(lType == 'StillLayer'){
2773
+ addLayerToImagesList(layerInfo,imagesList);
2774
+ }else if(lType == 'PreCompLayer'){
2775
+ addImagesFromComposition(layerInfo.source,imagesList);
2776
+ }
2777
+ }
2778
+ }
2779
+
2780
+ function addLayerToImagesList(layer,list){
2781
+ var i = 0, len = list.length, existingItem= null;
2782
+ while(i<len){
2783
+ if(list[i].item === layer){
2784
+ existingItem = list.splice(i,1)[0];
2785
+ break;
2786
+ }
2787
+ i+=1;
2788
+ }
2789
+ var listItem;
2790
+ if(existingItem === null){
2791
+ listItem = {item: layer, exportable: true, uiItem: null};
2792
+ }else{
2793
+ listItem = {item:layer, exportable:existingItem.exportable,uiItem:null}
2794
+ }
2795
+ list.push(listItem);
2796
+ }
2797
+
2798
+ function tabChangedHandler(ev){
2799
+ if(!settingsGroup || !settingsGroup.myTabbedPanel || !settingsGroup.myTabbedPanel.selection){
2800
+ return;
2801
+ }
2802
+ if(ev !== null && ev.target !== settingsGroup.myTabbedPanel){
2803
+ return;
2804
+ }
2805
+ switch(settingsGroup.myTabbedPanel.selection.text){
2806
+ case UITextsData.tabs.comps:
2807
+ updateCompositionsTab();
2808
+ break;
2809
+ case UITextsData.tabs.images:
2810
+ //updateImagesTab();
2811
+ break;
2812
+ }
2813
+ }
2814
+
2815
+ function compRefreshButtonClickHandler(ev){
2816
+ updateCompositionsTab();
2817
+ }
2818
+
2819
+ function compDestinationButtonClickHandler(ev){
2820
+ var f = new Folder();
2821
+ var outputFolder = f.selectDlg();
2822
+ if(outputFolder !== null){
2823
+ var selection = compsList.selection;
2824
+ var i, len = selection.length;
2825
+ var j, jLen = availableCompositions.length;
2826
+ for(i=0;i<len;i++){
2827
+ selection[i].subItems[1].text = outputFolder.absoluteURI;
2828
+ j = 0;
2829
+ while(j<jLen){
2830
+ if(availableCompositions[j].item === selection[i]){
2831
+ availableCompositions[j].destination = outputFolder.absoluteURI;
2832
+ break;
2833
+ }
2834
+ j++;
2835
+ }
2836
+ }
2837
+ updateCompView();
2838
+ }
2839
+ }
2840
+
2841
+ function compRenderButtonClickHandler(ev){
2842
+ updateCompositionsTab();
2843
+ var sendToQueue;
2844
+ if(compsSelectionButton.text === UITextsData.compsButtons.add){
2845
+ sendToQueue = true;
2846
+ }else{
2847
+ sendToQueue = false;
2848
+ }
2849
+ var selection = compsList.selection;
2850
+ var i, len = selection.length;
2851
+ var j, jLen = availableCompositions.length;
2852
+ for(i=0;i<len;i++){
2853
+ j = 0;
2854
+ while(j<jLen){
2855
+ if(availableCompositions[j].item === selection[i]){
2856
+ availableCompositions[j].queued = sendToQueue;
2857
+ break;
2858
+ }
2859
+ j++;
2860
+ }
2861
+ }
2862
+ listChangeHandler();
2863
+ }
2864
+
2865
+ function searchRemovedElements(){
2866
+ compsList.selection = null;
2867
+ compsList.removeAll();
2868
+ var i=0, len = availableCompositions.length;
2869
+ while(i<len){
2870
+ if(!isValid(availableCompositions[i].comp)){
2871
+ availableCompositions.splice(i,1);
2872
+ i-=1;
2873
+ len-=1;
2874
+ }else{
2875
+ if(!isValid(availableCompositions[i].imageDdItem)){
2876
+ delete availableCompositions[i].imageDdItem;
2877
+ }
2878
+ }
2879
+ i+=1;
2880
+ }
2881
+ i = 0;
2882
+ var j, jLen, images;
2883
+ while(i<len){
2884
+ if(availableCompositions[i].exportableImages){
2885
+ images = availableCompositions[i].exportableImages;
2886
+ jLen = images.length;
2887
+ j = 0;
2888
+ while(j<jLen){
2889
+ if(!isValid(images[j].item)){
2890
+ images.splice(j,1);
2891
+ j-=1;
2892
+ jLen-=1;
2893
+ }
2894
+ j+=1;
2895
+ }
2896
+ }
2897
+ i+=1;
2898
+ }
2899
+ }
2900
+
2901
+ function updateCompositionsTab(){
2902
+ ignoreEvent = true;
2903
+ searchRemovedElements();
2904
+ var project = app.project;
2905
+
2906
+ var i,numItems = project.numItems;
2907
+ var count = 0;
2908
+ for(i=0;i<numItems;i+=1){
2909
+ if(extrasInstance.getprojectItemType(project.item(i+1))=='Comp'){
2910
+ addCompositionToList(project.item(i+1), count);
2911
+ count+=1;
2912
+ };
2913
+ }
2914
+ var numComps = availableCompositions.length;
2915
+ for(i=0;i<numComps;i++){
2916
+ availableCompositions[i].item = compsList.add('item',availableCompositions[i].comp.name);
2917
+ if(availableCompositions[i].selected){
2918
+ availableCompositions[i].item.selected = true;
2919
+ }
2920
+ }
2921
+ updateCompView();
2922
+ ignoreEvent = false;
2923
+ }
2924
+
2925
+ function addCompositionToList(item,pos){
2926
+ var i=0, len = availableCompositions.length, compItem = null;
2927
+ while(i<len){
2928
+ if(availableCompositions[i].comp === item){
2929
+ compItem = availableCompositions[i];
2930
+ availableCompositions.splice(i,1);
2931
+ break;
2932
+ }
2933
+ i++;
2934
+ }
2935
+ if(compItem === null){
2936
+ //app.project.file.path
2937
+ compItem = {comp:item, queued:false, selected:false, destination: Folder.myDocuments.absoluteURI};
2938
+ }
2939
+ availableCompositions.splice(pos,0,compItem);
2940
+ }
2941
+
2942
+ function listChangeHandler(ev){
2943
+ if(ignoreEvent){
2944
+ return;
2945
+ }
2946
+ var selection = compsList.selection;
2947
+ if(selection===null){
2948
+ compsSelectionButton.hide();
2949
+ compsDestinationButton.hide();
2950
+ return;
2951
+ }
2952
+ availableCompositions.forEach(function(compData){
2953
+ compData.selected = false;
2954
+ });
2955
+ compsSelectionButton.show();
2956
+ var i, len = selection.length;
2957
+ var j, jLen = availableCompositions.length;
2958
+ var areQueued = true;
2959
+ selection.forEach(function(selectionItem){
2960
+ j = 0;
2961
+ while(j<jLen){
2962
+ if(availableCompositions[j].item === selectionItem){
2963
+ availableCompositions[j].selected = true;
2964
+ if(availableCompositions[j].queued == false){
2965
+ areQueued = false;
2966
+ }
2967
+ break;
2968
+ }
2969
+ j++;
2970
+ }
2971
+ });
2972
+ for(i=0;i<len;i++){
2973
+ j = 0;
2974
+ while(j<jLen){
2975
+ if(availableCompositions[j].item === selection[i]){
2976
+ if(availableCompositions[j].queued == false){
2977
+ areQueued = false;
2978
+ }
2979
+ break;
2980
+ }
2981
+ j++;
2982
+ }
2983
+ }
2984
+ if(areQueued === false){
2985
+ compsDestinationButton.hide();
2986
+ compsSelectionButton.text = UITextsData.compsButtons.add;
2987
+ }else{
2988
+ compsDestinationButton.show();
2989
+ compsSelectionButton.text = UITextsData.compsButtons.remove;
2990
+ }
2991
+ updateCompView();
2992
+ }
2993
+
2994
+ function updateCompView(){
2995
+ var i, len = availableCompositions.length;
2996
+ for(i=0;i<len;i++){
2997
+ compsList.items[i].subItems[0].text = availableCompositions[i].queued;
2998
+ if(availableCompositions[i].queued == false){
2999
+ compsList.items[i].subItems[1].text = '';
3000
+ }else{
3001
+ compsList.items[i].subItems[1].text = availableCompositions[i].destination;
3002
+ }
3003
+ }
3004
+ }
3005
+
3006
+ function setExportText(text){
3007
+ bodyMovinPanel.mainGroup.renderGroup.infoText.text = text;
3008
+ }
3009
+
3010
+ myScript_buildUI(bodymovinWindow);
3011
+ if (bodyMovinPanel != null && bodyMovinPanel instanceof Window){
3012
+ bodyMovinPanel.center();
3013
+ bodyMovinPanel.show();
3014
+ }
3015
+
3016
+ var ob ={};
3017
+ ob.setExportText = setExportText;
3018
+ ob.setProgress = setProgress;
3019
+
3020
+ UI = ob;
3021
+
3022
+ }());
3023
+ }());