Prepare shapes in tweens

This commit is contained in:
2017-05-20 05:28:50 +07:00
parent 29dc1b3253
commit 1341a47f09
2 changed files with 197 additions and 132 deletions

View File

@@ -1,4 +1,10 @@
if (!String.prototype.format) { if (!Array.prototype.peek) {
Array.prototype.peek = function () {
return this[this.length - 1];
};
}
if (!String.prototype.format) {
String.prototype.format = function () { String.prototype.format = function () {
var args = arguments; var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) { return this.replace(/{(\d+)}/g, function (match, number) {
@@ -8,29 +14,29 @@
} }
ft_main = function (opts) { ft_main = function (opts) {
opts = opts || {} opts = opts || {};
// //
// ft config // ft config
// //
var ft = { var ft = {
profile_mode : opts.profile_mode == undefined ? false : opts.profile_mode, profile_mode : opts.profile_mode === undefined ? false : opts.profile_mode,
verbose_mode : opts.verbose_mode == undefined ? false : opts.verbose_mode, verbose_mode : opts.verbose_mode === undefined ? false : opts.verbose_mode,
graphics_scale : opts.graphics_scale == undefined ? 1.0 : opts.graphics_scale, graphics_scale : opts.graphics_scale === undefined ? 1.0 : opts.graphics_scale,
scale_precision : opts.scale_precision == undefined ? 0.01 : opts.scale_precision, scale_precision : opts.scale_precision === undefined ? 0.01 : opts.scale_precision,
optimize_big_items : opts.optimize_big_items == undefined ? true : opts.optimize_big_items, optimize_big_items : opts.optimize_big_items === undefined ? true : opts.optimize_big_items,
optimize_small_items : opts.optimize_small_items == undefined ? true : opts.optimize_small_items, optimize_small_items : opts.optimize_small_items === undefined ? true : opts.optimize_small_items,
optimize_static_items : opts.optimize_static_items == undefined ? true : opts.optimize_static_items, optimize_static_items : opts.optimize_static_items === undefined ? true : opts.optimize_static_items,
optimize_single_graphics : opts.optimize_single_graphics == undefined ? true : opts.optimize_single_graphics, optimize_single_graphics : opts.optimize_single_graphics === undefined ? true : opts.optimize_single_graphics,
open_documents : opts.open_documents == undefined ? [] : opts.open_documents, open_documents : opts.open_documents === undefined ? [] : opts.open_documents,
export_path_postfix : opts.export_path_postfix == undefined ? "_export" : opts.export_path_postfix, export_path_postfix : opts.export_path_postfix === undefined ? "_export" : opts.export_path_postfix,
close_after_conversion : opts.close_after_conversion == undefined ? false : opts.close_after_conversion, close_after_conversion : opts.close_after_conversion === undefined ? false : opts.close_after_conversion,
revert_after_conversion : opts.revert_after_conversion == undefined ? true : opts.revert_after_conversion, revert_after_conversion : opts.revert_after_conversion === undefined ? true : opts.revert_after_conversion,
max_convertible_selection : opts.max_convertible_selection == undefined ? 3900 : opts.max_convertible_selection max_convertible_selection : opts.max_convertible_selection === undefined ? 3900 : opts.max_convertible_selection
}; };
// //
@@ -101,7 +107,7 @@ ft_main = function (opts) {
var func_time = ft.get_call_function_time(func); var func_time = ft.get_call_function_time(func);
--ft.profile_function_level; --ft.profile_function_level;
ft.profile_function_stack[stack_index].time = func_time; ft.profile_function_stack[stack_index].time = func_time;
if (stack_index == 0) { if (stack_index === 0) {
for (var i = 0; i < ft.profile_function_stack.length; ++i) { for (var i = 0; i < ft.profile_function_stack.length; ++i) {
var info = ft.profile_function_stack[i]; var info = ft.profile_function_stack[i];
var ident = "--"; var ident = "--";
@@ -212,6 +218,17 @@ ft_main = function (opts) {
} }
}; };
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)) {
acc.peek().push(value);
} else {
acc.push([value]);
}
return acc;
}, []);
};
ft.array_reverse_foreach = function (arr, func, filter) { ft.array_reverse_foreach = function (arr, func, filter) {
ft.type_assert(arr, Array); ft.type_assert(arr, Array);
ft.type_assert(func, Function); ft.type_assert(func, Function);
@@ -252,6 +269,7 @@ ft_main = function (opts) {
ft.profile_function(function() { ftdoc.remove_unused_items(doc); }, "Remove unused items"); ft.profile_function(function() { ftdoc.remove_unused_items(doc); }, "Remove unused items");
ft.profile_function(function() { ftdoc.prepare_all_bitmaps(doc); }, "Prepare all bitmaps"); ft.profile_function(function() { ftdoc.prepare_all_bitmaps(doc); }, "Prepare all bitmaps");
ft.profile_function(function() { ftdoc.unlock_all_timelines(doc); }, "Unlock all timelines"); ft.profile_function(function() { ftdoc.unlock_all_timelines(doc); }, "Unlock all timelines");
ft.profile_function(function() { ftdoc.prepare_all_shapes(doc); }, "Prepare all shapes");
ft.profile_function(function() { ftdoc.prepare_all_groups(doc); }, "Prepare all groups"); ft.profile_function(function() { ftdoc.prepare_all_groups(doc); }, "Prepare all groups");
ft.profile_function(function() { ftdoc.calculate_item_scales(doc); }, "Calculate item scales"); ft.profile_function(function() { ftdoc.calculate_item_scales(doc); }, "Calculate item scales");
ft.profile_function(function() { ftdoc.optimize_all_timelines(doc); }, "Optimize all timelines"); ft.profile_function(function() { ftdoc.optimize_all_timelines(doc); }, "Optimize all timelines");
@@ -261,11 +279,11 @@ ft_main = function (opts) {
ftdoc.get_temp = function (doc) { ftdoc.get_temp = function (doc) {
if (!ftdoc.hasOwnProperty("temp")) { if (!ftdoc.hasOwnProperty("temp")) {
ftdoc["temp"] = { ftdoc.temp = {
max_scales : {} max_scales : {}
} };
} }
return ftdoc["temp"]; return ftdoc.temp;
}; };
ftdoc.calculate_item_prefer_scale = function (doc, optional_item) { ftdoc.calculate_item_prefer_scale = function (doc, optional_item) {
@@ -309,54 +327,58 @@ ft_main = function (opts) {
} }
if (ft.approximately(final_scale, 1.0, ft.scale_precision)) { if (ft.approximately(final_scale, 1.0, ft.scale_precision)) {
var elem_r = doc.getSelectionRect(); (function() {
var elem_r = doc.getSelectionRect();
var elem_x = elem_r.left; var elem_x = elem_r.left;
var elem_y = elem_r.top; var elem_y = elem_r.top;
var elem_w = elem_r.right - elem_r.left; var elem_w = elem_r.right - elem_r.left;
var elem_h = elem_r.bottom - elem_r.top; var elem_h = elem_r.bottom - elem_r.top;
var elem_dx = Math.round(elem_x) - elem_x; var elem_dx = Math.round(elem_x) - elem_x;
var elem_dy = Math.round(elem_y) - elem_y; var elem_dy = Math.round(elem_y) - elem_y;
var elem_dw = Math.round(elem_w) - elem_w; var elem_dw = Math.round(elem_w) - elem_w;
var elem_dh = Math.round(elem_h) - elem_h; var elem_dh = Math.round(elem_h) - elem_h;
doc.convertSelectionToBitmap(); doc.convertSelectionToBitmap();
elem = doc.selection[0]; var elem = doc.selection[0];
elem.x -= elem_dx; elem.x -= elem_dx;
elem.y -= elem_dy; elem.y -= elem_dy;
elem.width -= elem_dw; elem.width -= elem_dw;
elem.height -= elem_dh; elem.height -= elem_dh;
})();
} else { } else {
var wrapper_item_name = ft.gen_unique_name(); (function() {
var wrapper_item = doc.convertToSymbol("graphic", wrapper_item_name , "top left"); var wrapper_item_name = ft.gen_unique_name();
fttim.recursive_scale_filters(doc, wrapper_item.timeline, final_scale); var wrapper_item = doc.convertToSymbol("graphic", wrapper_item_name , "top left");
fttim.recursive_scale_filters(doc, wrapper_item.timeline, final_scale);
var elem = doc.selection[0]; var elem = doc.selection[0];
elem.setTransformationPoint({x: 0, y: 0}); elem.setTransformationPoint({x: 0, y: 0});
doc.scaleSelection(final_scale, final_scale); doc.scaleSelection(final_scale, final_scale);
var elem_x = elem.x; var elem_x = elem.x;
var elem_y = elem.y; var elem_y = elem.y;
var elem_w = elem.width; var elem_w = elem.width;
var elem_h = elem.height; var elem_h = elem.height;
var elem_dx = Math.round(elem_x) - elem_x; var elem_dx = Math.round(elem_x) - elem_x;
var elem_dy = Math.round(elem_y) - elem_y; var elem_dy = Math.round(elem_y) - elem_y;
var elem_dw = Math.round(elem_w) - elem_w; var elem_dw = Math.round(elem_w) - elem_w;
var elem_dh = Math.round(elem_h) - elem_h; var elem_dh = Math.round(elem_h) - elem_h;
doc.convertSelectionToBitmap(); doc.convertSelectionToBitmap();
elem = doc.selection[0]; elem = doc.selection[0];
elem.x -= elem_dx; elem.x -= elem_dx;
elem.y -= elem_dy; elem.y -= elem_dy;
elem.width -= elem_dw; elem.width -= elem_dw;
elem.height -= elem_dh; elem.height -= elem_dh;
elem.setTransformationPoint({x: (elem_x - elem.x), y: (elem_y - elem.y)}); elem.setTransformationPoint({x: (elem_x - elem.x), y: (elem_y - elem.y)});
doc.scaleSelection(1.0 / final_scale, 1.0 / final_scale); doc.scaleSelection(1.0 / final_scale, 1.0 / final_scale);
})();
} }
}; };
@@ -402,21 +424,28 @@ ft_main = function (opts) {
fttim.unlock(doc, doc.getTimeline()); fttim.unlock(doc, doc.getTimeline());
}; };
ftdoc.prepare_all_shapes = function (doc) {
ft.type_assert(doc, Document);
ftlib.prepare_all_shapes(doc, doc.library);
fttim.prepare_all_shapes(doc, doc.getTimeline());
};
ftdoc.prepare_all_groups = function (doc) { ftdoc.prepare_all_groups = function (doc) {
ft.type_assert(doc, Document); ft.type_assert(doc, Document);
var arr1 = ftlib.prepare_all_groups(doc, doc.library); var arr1 = ftlib.prepare_all_groups(doc, doc.library);
var arr2 = fttim.prepare_all_groups(doc, doc.getTimeline()); var arr2 = fttim.prepare_all_groups(doc, doc.getTimeline());
var new_symbols = arr1.concat(arr2); var new_symbols = arr1.concat(arr2);
var process_item = function (item) {
if (doc.library.editItem(item.name)) {
var arr3 = fttim.prepare_all_groups(doc, item.timeline);
new_symbols = new_symbols.concat(arr3);
doc.exitEditMode();
}
};
while (new_symbols.length > 0) { while (new_symbols.length > 0) {
var new_symbols_copy = ft.array_clone(new_symbols); var new_symbols_copy = ft.array_clone(new_symbols);
new_symbols = []; new_symbols = [];
ft.array_foreach(new_symbols_copy, function (item) { ft.array_foreach(new_symbols_copy, process_item);
if (doc.library.editItem(item.name)) {
var arr3 = fttim.prepare_all_groups(doc, item.timeline);
new_symbols = new_symbols.concat(arr3);
doc.exitEditMode();
}
});
} }
}; };
@@ -444,7 +473,7 @@ ft_main = function (opts) {
ft.type_assert(lib, Library); ft.type_assert(lib, Library);
ft.type_assert(func, Function); ft.type_assert(func, Function);
ft.array_foreach(lib.items, function (item) { ft.array_foreach(lib.items, function (item) {
walk_by_timeline(item.timeline, func, acc) walk_by_timeline(item.timeline, func, acc);
}, ftlib.is_symbol_item); }, ftlib.is_symbol_item);
}; };
@@ -683,6 +712,14 @@ ft_main = function (opts) {
}); });
}; };
ftlib.prepare_all_shapes = function (doc, library) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ftlib.edit_all_symbol_items(doc, library, function (item) {
fttim.prepare_all_shapes(doc, item.timeline);
});
};
ftlib.prepare_all_groups = function (doc, library) { ftlib.prepare_all_groups = function (doc, library) {
ft.type_assert(doc, Document); ft.type_assert(doc, Document);
ft.type_assert(library, Library); ft.type_assert(library, Library);
@@ -743,7 +780,12 @@ ft_main = function (opts) {
return fttim.is_symbol_instance(elem) && elem.symbolType == "movie clip"; return fttim.is_symbol_instance(elem) && elem.symbolType == "movie clip";
}; };
fttim.is_tween_shape_frame = function (frame) { fttim.is_tween_frame = function (frame) {
ft.type_assert(frame, Frame);
return frame.tweenType != "none";
};
fttim.is_shape_tween_frame = function (frame) {
ft.type_assert(frame, Frame); ft.type_assert(frame, Frame);
return frame.tweenType == "shape"; return frame.tweenType == "shape";
}; };
@@ -814,7 +856,7 @@ ft_main = function (opts) {
var frame_width = Math.max(0, bounds.right - bounds.left); var frame_width = Math.max(0, bounds.right - bounds.left);
var frame_height = Math.max(0, bounds.bottom - bounds.top); var frame_height = Math.max(0, bounds.bottom - bounds.top);
return Math.round(frame_width) * Math.round(frame_height); return Math.round(frame_width) * Math.round(frame_height);
} };
fttim.recursive_scale_filters = function (doc, timeline, scale) { fttim.recursive_scale_filters = function (doc, timeline, scale) {
ft.type_assert(doc, Document); ft.type_assert(doc, Document);
@@ -868,7 +910,7 @@ ft_main = function (opts) {
ft.trace_fmt("Optimize single graphic '{0}' for frame '{1}' in '{2}'", ft.trace_fmt("Optimize single graphic '{0}' for frame '{1}' in '{2}'",
lib_item_name, elem.firstFrame, timeline.name); lib_item_name, elem.firstFrame, timeline.name);
} }
if (opt_item == null || doc.library.editItem(opt_item.name)) { if (opt_item === null || doc.library.editItem(opt_item.name)) {
if (timeline.currentFrame != frame_index) { if (timeline.currentFrame != frame_index) {
timeline.currentFrame = frame_index; timeline.currentFrame = frame_index;
} }
@@ -905,6 +947,29 @@ ft_main = function (opts) {
}, true); }, true);
}; };
fttim.prepare_all_shapes = function (doc, timeline) {
ft.type_assert(doc, Document);
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) {
timeline.currentFrame = frame_index;
timeline.setSelectedFrames(frame_index, frame_index + 1, true);
if (ft.array_any(frame.elements, fttim.is_shape_instance)) {
doc.selectNone();
doc.selectAll();
if (doc.selection.length > 0) {
doc.group();
}
}
}, function (frame, frame_index) {
return fttim.is_keyframe(frame, frame_index) && fttim.is_tween_frame(frame);
});
}, fttim.is_not_guide_layer);
};
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);
@@ -940,9 +1005,6 @@ ft_main = function (opts) {
}); });
}, fttim.is_keyframe); }, fttim.is_keyframe);
}, fttim.is_not_guide_layer); }, fttim.is_not_guide_layer);
if (new_symbols.length > 0 && ft.verbose_mode) {
ft.trace_fmt("Ungroup groups({0}) in '{1}'", new_symbols.length, timeline.name);
}
return new_symbols; return new_symbols;
}; };
@@ -963,7 +1025,7 @@ ft_main = function (opts) {
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!";
} }
}, function (frame, frame_index) { }, function (frame, frame_index) {
return fttim.is_keyframe(frame, frame_index) && fttim.is_tween_shape_frame(frame); return fttim.is_keyframe(frame, frame_index) && fttim.is_shape_tween_frame(frame);
}); });
}, fttim.is_not_guide_layer); }, fttim.is_not_guide_layer);

View File

@@ -63,16 +63,19 @@ dipyalov: фишка в том, что swf обновился, но и собр
Таки стоит, но с рекурсивным выносом в отдельные символы и последующей их обработкой Таки стоит, но с рекурсивным выносом в отдельные символы и последующей их обработкой
**** DONE В ошибках конвертации писать, что нужно прогнать через скрипт экспорта **** DONE В ошибках конвертации писать, что нужно прогнать через скрипт экспорта
А еще лучше как-то метить прогнанную анимацию и нет А еще лучше как-то метить прогнанную анимацию и нет
**** TODO Оптимизация растеризируемых групп
*** Баги *** Баги
**** DONE При больших (>= 4000 пикселей) выделениях не работает convertSelectionToBitmap **** DONE При больших (>= 4000 пикселей) выделениях не работает convertSelectionToBitmap
**** TODO Не работает конвертация в batchmod'е **** TODO Не работает конвертация в batchmod'е
**** DONE В ошибках конвертации не пишется путь до swf **** DONE В ошибках конвертации не пишется путь до swf
**** DONE Не растеризуются группы в твинах **** DONE Не растеризуются группы в твинах
**** DONE Проблемы с порядком drawing objects и groups при экспорте **** DONE Проблемы с порядком drawing objects и groups при экспорте
**** TODO При конверте нескольких документов накапливаются временные значения(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
**** DONE Шейпы в классических твинах (да, это ошибка, но флеш её пропускает) не растеризуются
**** TODO Возможно проблемы с DX9 **** TODO Возможно проблемы с DX9
UNITY_UV_STARTS_AT_TOP UNITY_UV_STARTS_AT_TOP
UNITY_HALF_TEXEL_OFFSET UNITY_HALF_TEXEL_OFFSET