diff --git a/Assets/FlashTools/FlashExport/FlashExport.jsfl b/Assets/FlashTools/FlashExport/FlashExport.jsfl index 490d492..0c3d4d2 100644 --- a/Assets/FlashTools/FlashExport/FlashExport.jsfl +++ b/Assets/FlashTools/FlashExport/FlashExport.jsfl @@ -1,3 +1,12 @@ var script_dir = fl.scriptURI.replace('FlashExport.jsfl', ''); fl.runScript(script_dir + 'Internal/FTBase.jsfl'); -fl.runScript(script_dir + 'Internal/FTMain.jsfl', "ft_main"); \ No newline at end of file +fl.runScript(script_dir + 'Internal/FTMain.jsfl', "ft_main", { + profile_mode : true, + verbose_mode : false, + graphics_scale : 1.0, + revert_after_conversion : false, + optimize_static_items : true, + optimize_single_graphics : true, + optimize_big_items : true, + optimize_small_items : true +}); \ No newline at end of file diff --git a/Assets/FlashTools/FlashExport/Internal/FTBase.jsfl b/Assets/FlashTools/FlashExport/Internal/FTBase.jsfl index e7f1f8c..719b408 100644 --- a/Assets/FlashTools/FlashExport/Internal/FTBase.jsfl +++ b/Assets/FlashTools/FlashExport/Internal/FTBase.jsfl @@ -193,7 +193,7 @@ ft.array_foreach = function (arr, func, filter) { ft.array_group_by = function(arr, func) { return ft.array_foldl(arr, function (value, acc) { - if (acc.length > 0 && func(acc.peek().peek()) == func(value)) { + if (acc.length > 0 && func(acc.peek().peek()) === func(value)) { acc.peek().push(value); } else { acc.push([value]); diff --git a/Assets/FlashTools/FlashExport/Internal/FTMain.jsfl b/Assets/FlashTools/FlashExport/Internal/FTMain.jsfl index a127b7d..30d9349 100644 --- a/Assets/FlashTools/FlashExport/Internal/FTMain.jsfl +++ b/Assets/FlashTools/FlashExport/Internal/FTMain.jsfl @@ -46,12 +46,16 @@ }; ftdoc.get_temp = function (doc) { - if (!ftdoc.hasOwnProperty("temp")) { - ftdoc.temp = { + ft.type_assert(doc, Document); + if (!ftdoc.get_temp_ft_temp) { + ftdoc.get_temp_ft_temp = {}; + } + if (!ftdoc.get_temp_ft_temp[doc.pathURI]) { + ftdoc.get_temp_ft_temp[doc.pathURI] = { max_scales : {} }; } - return ftdoc.temp; + return ftdoc.get_temp_ft_temp[doc.pathURI]; }; ftdoc.calculate_item_prefer_scale = function (doc, optional_item) { @@ -61,7 +65,7 @@ if (optional_item && (cfg.optimize_big_items || cfg.optimize_small_items)) { var item_name = optional_item.name; var max_scales = ftdoc.get_temp(doc).max_scales; - if (max_scales.hasOwnProperty(item_name)) { + if (max_scales && max_scales.hasOwnProperty(item_name)) { var max_scale = max_scales[item_name]; var big_item = cfg.optimize_big_items && (max_scale - cfg.scale_precision > 1.0); var small_item = cfg.optimize_small_items && (max_scale + cfg.scale_precision < 1.0); @@ -185,6 +189,11 @@ }); } }; + + ftdoc.prepare_all_bitmaps = function (doc) { + ft.type_assert(doc, Document); + ftlib.prepare_all_bitmaps(doc.library); + }; ftdoc.unlock_all_timelines = function (doc) { ft.type_assert(doc, Document); @@ -220,7 +229,7 @@ ftdoc.calculate_item_scales = function (doc) { ft.type_assert(doc, Document); - var max_scales = ftdoc.get_temp(doc).max_scales; + var max_scales = {}; var walk_by_timeline = function(timeline, func, acc) { ft.type_assert(timeline, Timeline); @@ -268,6 +277,8 @@ walk_by_library(doc.library, y_func, 1.0); walk_by_timeline(doc.getTimeline(), y_func, 1.0); + + ftdoc.get_temp(doc).max_scales = max_scales; if (cfg.verbose_mode) { for (var item_name in max_scales) { @@ -301,11 +312,6 @@ fttim.rasterize_all_shapes(doc, doc.getTimeline()); }; - ftdoc.prepare_all_bitmaps = function (doc) { - ft.type_assert(doc, Document); - ftlib.prepare_all_bitmaps(doc.library); - }; - ftdoc.export_swf = function (doc) { ft.type_assert(doc, Document); doc.exportSWF(ftdoc.get_export_swf_path(doc)); @@ -370,6 +376,13 @@ ft.type_assert(func, Function); ftlib.edit_all_items(doc, library, func, ftlib.is_symbol_item); }; + + ftlib.prepare_all_bitmaps = function (library) { + ft.type_assert(library, Library); + ft.array_foreach(library.items, function (item) { + item.compressionType = "lossless"; + }, ftlib.is_bitmap_item); + }; ftlib.unlock_all_timelines = function (doc, library) { ft.type_assert(doc, Document); @@ -498,13 +511,6 @@ return new_symbols; }; - ftlib.prepare_all_bitmaps = function (library) { - ft.type_assert(library, Library); - ft.array_foreach(library.items, function (item) { - item.compressionType = "lossless"; - }, ftlib.is_bitmap_item); - }; - // // timeline // @@ -587,12 +593,10 @@ ft.array_foreach(timeline.layers, function (layer, layer_index) { layer.locked = false; layer.visible = true; - timeline.setSelectedLayers(layer_index); ft.array_foreach(layer.frames, function (frame, frame_index) { var has_locked = ft.array_any(frame.elements, fttim.is_element_locked); if (has_locked) { timeline.currentFrame = frame_index; - timeline.setSelectedFrames(frame_index, frame_index + 1, true); try { doc.unlockAllElements(); } catch (e) {} @@ -666,9 +670,8 @@ ft.type_assert(timeline, Timeline); ft.array_foreach(timeline.layers, function (layer) { ft.array_foreach(layer.frames, function (frame, frame_index) { - if (timeline.currentFrame != frame_index) { - timeline.currentFrame = frame_index; - } + timeline.currentFrame = frame_index; + doc.selectNone(); ft.array_foreach(frame.elements, function (elem) { if (replaces.hasOwnProperty(elem.libraryItem.name)) { doc.selectNone(); @@ -735,29 +738,28 @@ ft.type_assert(timeline, Timeline); ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) { - timeline.setSelectedLayers(layer_index); ft.array_foreach(layer.frames, function (frame, frame_index) { if (fttim.is_shape_tween_frame(frame)) { - if ( ft.is_function(frame.convertToFrameByFrameAnimation) ) { + if (ft.is_function(frame.convertToFrameByFrameAnimation)) { ft.trace_fmt( - "[Warning] Timeline: '{0}'\n" + + "[Warning] Timeline: '{0}' Layer: '{1}' Frame: {2}\n" + "- Shape tween strongly not recommended because it rasterized to frame-by-frame bitmap sequence.", - timeline.name); + timeline.name, layer.name, frame_index + 1); frame.convertToFrameByFrameAnimation(); } else { throw "Animation uses shape tweens. To export this animation you should use Adobe Animate CC or higher!"; } } else if (fttim.is_motion_tween_frame(frame)) { - var shapes = ft.array_filter(frame.elements, fttim.is_shape_element); - if (shapes.length > 0) { + var has_shapes = ft.array_any(frame.elements, fttim.is_shape_element); + if (has_shapes || frame.elements.length > 1) { + ft.trace_fmt( + "[Warning] Timeline: '{0}' Layer: '{1}' Frame: {2}\n" + + "- Frame contains incorrect objects for correctly tween.", + timeline.name, layer.name, frame_index + 1); timeline.currentFrame = frame_index; - timeline.setSelectedFrames(frame_index, frame_index + 1, true); doc.selectNone(); - doc.selection = shapes; - if (doc.selection.length > 0) { - doc.group(); - doc.arrange("back"); - } + doc.selection = frame.elements; + doc.convertToSymbol("graphic", ft.gen_unique_name(), "top left"); } } }, fttim.is_keyframe); @@ -767,36 +769,54 @@ fttim.prepare_all_groups = function (doc, timeline) { ft.type_assert(doc, Document); ft.type_assert(timeline, Timeline); + + var check_need_for_ungroup = function (frame, elem) { + if (fttim.is_tween_frame(frame)) { + return true; + } + if (fttim.is_group_shape_element(elem)) { + return ft.array_any(elem.members, function (member) { + if (fttim.is_instance_element(member)) { + return true; + } + return check_need_for_ungroup(frame, member); + }); + } + return false; + }; var new_symbols = []; ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) { - timeline.setSelectedLayers(layer_index); ft.array_foreach(layer.frames, function (frame, frame_index) { - timeline.currentFrame = frame_index; - timeline.setSelectedFrames(frame_index, frame_index + 1, true); - - var elements = ft.array_clone(frame.elements); - ft.array_foreach(elements, function (elem, elem_index) { + var has_complex_shapes = ft.array_any(frame.elements, fttim.is_complex_shape_element); + if (has_complex_shapes) { + timeline.currentFrame = frame_index; doc.selectNone(); - doc.selection = [elem]; - - if (fttim.is_simple_shape_element(elem)) { - // nothing - } else if (fttim.is_complex_shape_element(elem)) { - if (fttim.is_object_shape_element(elem)) { - doc.breakApart(); - doc.group(); + + var elements = ft.array_clone(frame.elements); + ft.array_foreach(elements, function (elem, elem_index) { + if (fttim.is_simple_shape_element(elem)) { + // nothing + } else if (fttim.is_complex_shape_element(elem) && check_need_for_ungroup(frame, elem)) { + doc.selectNone(); + doc.selection = [elem]; + if (fttim.is_object_shape_element(elem)) { + doc.breakApart(); + doc.group(); + } + doc.unGroup(); + try { + doc.unlockAllElements(); + } catch (e) {} + var wrapper_item = doc.convertToSymbol("graphic", ft.gen_unique_name(), "top left"); + new_symbols.push(wrapper_item); + } else { + doc.selectNone(); + doc.selection = [elem]; + doc.arrange("front"); } - doc.unGroup(); - try { - doc.unlockAllElements(); - } catch (e) {} - var wrapper_item = doc.convertToSymbol("graphic", ft.gen_unique_name(), "top left"); - new_symbols.push(wrapper_item); - } else { - doc.arrange("front"); - } - }); + }); + } }, fttim.is_keyframe); }, fttim.is_not_guide_layer); return new_symbols; @@ -808,18 +828,26 @@ var rasterize_count = 0; ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) { - timeline.setSelectedLayers(layer_index); ft.array_foreach(layer.frames, function (frame, frame_index) { - timeline.currentFrame = frame_index; - timeline.setSelectedFrames(frame_index, frame_index + 1, true); - - doc.selectNone(); - doc.selection = ft.array_filter(frame.elements, fttim.is_shape_element); - if (doc.selection.length > 0) { - var location_name = "Timeline: {0}".format(timeline.name); - ftdoc.convert_selection_to_bitmap(doc, location_name, timeline.libraryItem); - doc.arrange("back"); - ++rasterize_count; + var has_shapes = ft.array_any(frame.elements, fttim.is_shape_element); + if (has_shapes) { + timeline.currentFrame = frame_index; + doc.selectNone(); + var groups_arr = ft.array_group_by(frame.elements, fttim.is_shape_element); + for (var i = 0; i < groups_arr.length; ++i) { + var groups = groups_arr[i]; + if (fttim.is_shape_element(groups.peek())) { + doc.selectNone(); + doc.selection = groups; + var location_name = "Timeline: {0}".format(timeline.name); + ftdoc.convert_selection_to_bitmap(doc, location_name, timeline.libraryItem); + ++rasterize_count; + } else { + doc.selectNone(); + doc.selection = groups; + doc.arrange("front"); + } + } } }, fttim.is_keyframe); }, fttim.is_not_guide_layer); diff --git a/ProjectStuff/FlashTools.org b/ProjectStuff/FlashTools.org index 83d2814..ef47c19 100644 --- a/ProjectStuff/FlashTools.org +++ b/ProjectStuff/FlashTools.org @@ -58,6 +58,9 @@ https://gist.github.com/talecrafter/111ea3345911bd238f4998b4d5a04bf3 **** DONE Добавить возможность брать bounds у клипа **** DONE Не реимпортить на каждый чих анимацию, хранить хэш dipyalov: фишка в том, что swf обновился, но и собранные ассеты-то тоже обновились +**** TODO Добавить версию в хэш анимаций, дабы они конвертились при смене версии плагина +**** TODO Добавить ворнинг на некорректные твины (с шейпами и группами) +**** TODO Группы без шейпов не нужно растеризировать **** DONE Элемент может быть залокан (element.locked) **** DONE Возможно не стоит преобразовывать группы в символы Таки стоит, но с рекурсивным выносом в отдельные символы и последующей их обработкой @@ -70,12 +73,16 @@ dipyalov: фишка в том, что swf обновился, но и собр **** DONE В ошибках конвертации не пишется путь до swf **** DONE Не растеризуются группы в твинах **** DONE Проблемы с порядком drawing objects и groups при экспорте -**** TODO При конверте нескольких документов накапливаются временные значения(max_scale, unique_id) +**** DONE При конверте нескольких документов накапливаются временные значения(max_scale, unique_id) **** DONE Unity может переставлять сабмеши на одинаковой глубине (проблема с масками) https://fogbugz.unity3d.com/default.asp?910858_0diqjnj67814hj3i http://ru.esotericsoftware.com/forum/Submeshes-render-in-random-order-with-orthographic-camera-8528 **** TODO При автоплее с пустым клипом контроллер накапливает _tickTimer **** TODO Шейпы в классических твинах (да, это ошибка, но флеш её пропускает) не растеризуются +**** TODO Скейлы клипов не проверяются в группах +**** TODO Площадь для оптимизации вычисляется некорректно при повёрнутых клипах +**** TODO При множественном импорте ошибка в импорте по поводу удаление из-под носа ассета воспроизводится 100% +**** TODO Скейл фильтров не заходит в группы **** TODO Возможно проблемы с DX9 UNITY_UV_STARTS_AT_TOP UNITY_HALF_TEXEL_OFFSET