many fixes about groups

This commit is contained in:
2017-05-27 00:44:38 +07:00
parent 9ea77def56
commit f0f18e6aec
4 changed files with 116 additions and 72 deletions

View File

@@ -1,3 +1,12 @@
var script_dir = fl.scriptURI.replace('FlashExport.jsfl', ''); var script_dir = fl.scriptURI.replace('FlashExport.jsfl', '');
fl.runScript(script_dir + 'Internal/FTBase.jsfl'); fl.runScript(script_dir + 'Internal/FTBase.jsfl');
fl.runScript(script_dir + 'Internal/FTMain.jsfl', "ft_main"); 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
});

View File

@@ -193,7 +193,7 @@ ft.array_foreach = function (arr, func, filter) {
ft.array_group_by = function(arr, func) { ft.array_group_by = function(arr, func) {
return ft.array_foldl(arr, function (value, acc) { 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); acc.peek().push(value);
} else { } else {
acc.push([value]); acc.push([value]);

View File

@@ -46,12 +46,16 @@
}; };
ftdoc.get_temp = function (doc) { ftdoc.get_temp = function (doc) {
if (!ftdoc.hasOwnProperty("temp")) { ft.type_assert(doc, Document);
ftdoc.temp = { 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 : {} max_scales : {}
}; };
} }
return ftdoc.temp; return ftdoc.get_temp_ft_temp[doc.pathURI];
}; };
ftdoc.calculate_item_prefer_scale = function (doc, optional_item) { ftdoc.calculate_item_prefer_scale = function (doc, optional_item) {
@@ -61,7 +65,7 @@
if (optional_item && (cfg.optimize_big_items || cfg.optimize_small_items)) { if (optional_item && (cfg.optimize_big_items || cfg.optimize_small_items)) {
var item_name = optional_item.name; var item_name = optional_item.name;
var max_scales = ftdoc.get_temp(doc).max_scales; 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 max_scale = max_scales[item_name];
var big_item = cfg.optimize_big_items && (max_scale - cfg.scale_precision > 1.0); 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); 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) { ftdoc.unlock_all_timelines = function (doc) {
ft.type_assert(doc, Document); ft.type_assert(doc, Document);
@@ -220,7 +229,7 @@
ftdoc.calculate_item_scales = function (doc) { ftdoc.calculate_item_scales = function (doc) {
ft.type_assert(doc, Document); 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) { var walk_by_timeline = function(timeline, func, acc) {
ft.type_assert(timeline, Timeline); ft.type_assert(timeline, Timeline);
@@ -268,6 +277,8 @@
walk_by_library(doc.library, y_func, 1.0); walk_by_library(doc.library, y_func, 1.0);
walk_by_timeline(doc.getTimeline(), 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) { if (cfg.verbose_mode) {
for (var item_name in max_scales) { for (var item_name in max_scales) {
@@ -301,11 +312,6 @@
fttim.rasterize_all_shapes(doc, doc.getTimeline()); 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) { ftdoc.export_swf = function (doc) {
ft.type_assert(doc, Document); ft.type_assert(doc, Document);
doc.exportSWF(ftdoc.get_export_swf_path(doc)); doc.exportSWF(ftdoc.get_export_swf_path(doc));
@@ -370,6 +376,13 @@
ft.type_assert(func, Function); ft.type_assert(func, Function);
ftlib.edit_all_items(doc, library, func, ftlib.is_symbol_item); 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) { ftlib.unlock_all_timelines = function (doc, library) {
ft.type_assert(doc, Document); ft.type_assert(doc, Document);
@@ -498,13 +511,6 @@
return new_symbols; 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 // timeline
// //
@@ -587,12 +593,10 @@
ft.array_foreach(timeline.layers, function (layer, layer_index) { ft.array_foreach(timeline.layers, function (layer, layer_index) {
layer.locked = false; layer.locked = false;
layer.visible = true; layer.visible = true;
timeline.setSelectedLayers(layer_index);
ft.array_foreach(layer.frames, function (frame, frame_index) { ft.array_foreach(layer.frames, function (frame, frame_index) {
var has_locked = ft.array_any(frame.elements, fttim.is_element_locked); var has_locked = ft.array_any(frame.elements, fttim.is_element_locked);
if (has_locked) { if (has_locked) {
timeline.currentFrame = frame_index; timeline.currentFrame = frame_index;
timeline.setSelectedFrames(frame_index, frame_index + 1, true);
try { try {
doc.unlockAllElements(); doc.unlockAllElements();
} catch (e) {} } catch (e) {}
@@ -666,9 +670,8 @@
ft.type_assert(timeline, Timeline); ft.type_assert(timeline, Timeline);
ft.array_foreach(timeline.layers, function (layer) { ft.array_foreach(timeline.layers, function (layer) {
ft.array_foreach(layer.frames, function (frame, frame_index) { 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) { ft.array_foreach(frame.elements, function (elem) {
if (replaces.hasOwnProperty(elem.libraryItem.name)) { if (replaces.hasOwnProperty(elem.libraryItem.name)) {
doc.selectNone(); doc.selectNone();
@@ -735,29 +738,28 @@
ft.type_assert(timeline, Timeline); ft.type_assert(timeline, Timeline);
ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) { ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) {
timeline.setSelectedLayers(layer_index);
ft.array_foreach(layer.frames, function (frame, frame_index) { ft.array_foreach(layer.frames, function (frame, frame_index) {
if (fttim.is_shape_tween_frame(frame)) { if (fttim.is_shape_tween_frame(frame)) {
if ( ft.is_function(frame.convertToFrameByFrameAnimation) ) { if (ft.is_function(frame.convertToFrameByFrameAnimation)) {
ft.trace_fmt( 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.", "- 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(); frame.convertToFrameByFrameAnimation();
} else { } else {
throw "Animation uses shape tweens. To export this animation you should use Adobe Animate CC or higher!"; 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)) { } else if (fttim.is_motion_tween_frame(frame)) {
var shapes = ft.array_filter(frame.elements, fttim.is_shape_element); var has_shapes = ft.array_any(frame.elements, fttim.is_shape_element);
if (shapes.length > 0) { 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.currentFrame = frame_index;
timeline.setSelectedFrames(frame_index, frame_index + 1, true);
doc.selectNone(); doc.selectNone();
doc.selection = shapes; doc.selection = frame.elements;
if (doc.selection.length > 0) { doc.convertToSymbol("graphic", ft.gen_unique_name(), "top left");
doc.group();
doc.arrange("back");
}
} }
} }
}, fttim.is_keyframe); }, fttim.is_keyframe);
@@ -767,36 +769,54 @@
fttim.prepare_all_groups = function (doc, timeline) { fttim.prepare_all_groups = function (doc, timeline) {
ft.type_assert(doc, Document); ft.type_assert(doc, Document);
ft.type_assert(timeline, Timeline); 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 = []; var new_symbols = [];
ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) { ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) {
timeline.setSelectedLayers(layer_index);
ft.array_foreach(layer.frames, function (frame, frame_index) { ft.array_foreach(layer.frames, function (frame, frame_index) {
timeline.currentFrame = frame_index; var has_complex_shapes = ft.array_any(frame.elements, fttim.is_complex_shape_element);
timeline.setSelectedFrames(frame_index, frame_index + 1, true); if (has_complex_shapes) {
timeline.currentFrame = frame_index;
var elements = ft.array_clone(frame.elements);
ft.array_foreach(elements, function (elem, elem_index) {
doc.selectNone(); doc.selectNone();
doc.selection = [elem];
var elements = ft.array_clone(frame.elements);
if (fttim.is_simple_shape_element(elem)) { ft.array_foreach(elements, function (elem, elem_index) {
// nothing if (fttim.is_simple_shape_element(elem)) {
} else if (fttim.is_complex_shape_element(elem)) { // nothing
if (fttim.is_object_shape_element(elem)) { } else if (fttim.is_complex_shape_element(elem) && check_need_for_ungroup(frame, elem)) {
doc.breakApart(); doc.selectNone();
doc.group(); 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_keyframe);
}, fttim.is_not_guide_layer); }, fttim.is_not_guide_layer);
return new_symbols; return new_symbols;
@@ -808,18 +828,26 @@
var rasterize_count = 0; var rasterize_count = 0;
ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) { ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) {
timeline.setSelectedLayers(layer_index);
ft.array_foreach(layer.frames, function (frame, frame_index) { ft.array_foreach(layer.frames, function (frame, frame_index) {
timeline.currentFrame = frame_index; var has_shapes = ft.array_any(frame.elements, fttim.is_shape_element);
timeline.setSelectedFrames(frame_index, frame_index + 1, true); if (has_shapes) {
timeline.currentFrame = frame_index;
doc.selectNone(); doc.selectNone();
doc.selection = ft.array_filter(frame.elements, fttim.is_shape_element); var groups_arr = ft.array_group_by(frame.elements, fttim.is_shape_element);
if (doc.selection.length > 0) { for (var i = 0; i < groups_arr.length; ++i) {
var location_name = "Timeline: {0}".format(timeline.name); var groups = groups_arr[i];
ftdoc.convert_selection_to_bitmap(doc, location_name, timeline.libraryItem); if (fttim.is_shape_element(groups.peek())) {
doc.arrange("back"); doc.selectNone();
++rasterize_count; 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_keyframe);
}, fttim.is_not_guide_layer); }, fttim.is_not_guide_layer);

View File

@@ -58,6 +58,9 @@ https://gist.github.com/talecrafter/111ea3345911bd238f4998b4d5a04bf3
**** DONE Добавить возможность брать bounds у клипа **** DONE Добавить возможность брать bounds у клипа
**** DONE Не реимпортить на каждый чих анимацию, хранить хэш **** DONE Не реимпортить на каждый чих анимацию, хранить хэш
dipyalov: фишка в том, что swf обновился, но и собранные ассеты-то тоже обновились dipyalov: фишка в том, что swf обновился, но и собранные ассеты-то тоже обновились
**** TODO Добавить версию в хэш анимаций, дабы они конвертились при смене версии плагина
**** TODO Добавить ворнинг на некорректные твины (с шейпами и группами)
**** TODO Группы без шейпов не нужно растеризировать
**** DONE Элемент может быть залокан (element.locked) **** DONE Элемент может быть залокан (element.locked)
**** DONE Возможно не стоит преобразовывать группы в символы **** DONE Возможно не стоит преобразовывать группы в символы
Таки стоит, но с рекурсивным выносом в отдельные символы и последующей их обработкой Таки стоит, но с рекурсивным выносом в отдельные символы и последующей их обработкой
@@ -70,12 +73,16 @@ dipyalov: фишка в том, что swf обновился, но и собр
**** DONE В ошибках конвертации не пишется путь до swf **** DONE В ошибках конвертации не пишется путь до swf
**** DONE Не растеризуются группы в твинах **** DONE Не растеризуются группы в твинах
**** DONE Проблемы с порядком drawing objects и groups при экспорте **** DONE Проблемы с порядком drawing objects и groups при экспорте
**** TODO При конверте нескольких документов накапливаются временные значения(max_scale, unique_id) **** DONE При конверте нескольких документов накапливаются временные значения(max_scale, unique_id)
**** DONE Unity может переставлять сабмеши на одинаковой глубине (проблема с масками) **** DONE Unity может переставлять сабмеши на одинаковой глубине (проблема с масками)
https://fogbugz.unity3d.com/default.asp?910858_0diqjnj67814hj3i https://fogbugz.unity3d.com/default.asp?910858_0diqjnj67814hj3i
http://ru.esotericsoftware.com/forum/Submeshes-render-in-random-order-with-orthographic-camera-8528 http://ru.esotericsoftware.com/forum/Submeshes-render-in-random-order-with-orthographic-camera-8528
**** TODO При автоплее с пустым клипом контроллер накапливает _tickTimer **** TODO При автоплее с пустым клипом контроллер накапливает _tickTimer
**** TODO Шейпы в классических твинах (да, это ошибка, но флеш её пропускает) не растеризуются **** TODO Шейпы в классических твинах (да, это ошибка, но флеш её пропускает) не растеризуются
**** TODO Скейлы клипов не проверяются в группах
**** TODO Площадь для оптимизации вычисляется некорректно при повёрнутых клипах
**** TODO При множественном импорте ошибка в импорте по поводу удаление из-под носа ассета воспроизводится 100%
**** TODO Скейл фильтров не заходит в группы
**** TODO Возможно проблемы с DX9 **** TODO Возможно проблемы с DX9
UNITY_UV_STARTS_AT_TOP UNITY_UV_STARTS_AT_TOP
UNITY_HALF_TEXEL_OFFSET UNITY_HALF_TEXEL_OFFSET