mirror of
https://github.com/BlackMATov/unity-flash-tools.git
synced 2025-12-16 14:11:19 +07:00
Prepare shapes in tweens
This commit is contained in:
@@ -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 () {
|
||||
var args = arguments;
|
||||
return this.replace(/{(\d+)}/g, function (match, number) {
|
||||
@@ -8,29 +14,29 @@
|
||||
}
|
||||
|
||||
ft_main = function (opts) {
|
||||
opts = opts || {}
|
||||
opts = opts || {};
|
||||
|
||||
//
|
||||
// ft config
|
||||
//
|
||||
|
||||
var ft = {
|
||||
profile_mode : opts.profile_mode == undefined ? false : opts.profile_mode,
|
||||
verbose_mode : opts.verbose_mode == undefined ? false : opts.verbose_mode,
|
||||
profile_mode : opts.profile_mode === undefined ? false : opts.profile_mode,
|
||||
verbose_mode : opts.verbose_mode === undefined ? false : opts.verbose_mode,
|
||||
|
||||
graphics_scale : opts.graphics_scale == undefined ? 1.0 : opts.graphics_scale,
|
||||
scale_precision : opts.scale_precision == undefined ? 0.01 : opts.scale_precision,
|
||||
graphics_scale : opts.graphics_scale === undefined ? 1.0 : opts.graphics_scale,
|
||||
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_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_single_graphics : opts.optimize_single_graphics == undefined ? true : opts.optimize_single_graphics,
|
||||
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_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,
|
||||
|
||||
open_documents : opts.open_documents == undefined ? [] : opts.open_documents,
|
||||
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,
|
||||
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
|
||||
open_documents : opts.open_documents === undefined ? [] : opts.open_documents,
|
||||
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,
|
||||
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
|
||||
};
|
||||
|
||||
//
|
||||
@@ -101,7 +107,7 @@ ft_main = function (opts) {
|
||||
var func_time = ft.get_call_function_time(func);
|
||||
--ft.profile_function_level;
|
||||
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) {
|
||||
var info = ft.profile_function_stack[i];
|
||||
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.type_assert(arr, Array);
|
||||
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.prepare_all_bitmaps(doc); }, "Prepare all bitmaps");
|
||||
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.calculate_item_scales(doc); }, "Calculate item scales");
|
||||
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) {
|
||||
if (!ftdoc.hasOwnProperty("temp")) {
|
||||
ftdoc["temp"] = {
|
||||
ftdoc.temp = {
|
||||
max_scales : {}
|
||||
}
|
||||
};
|
||||
}
|
||||
return ftdoc["temp"];
|
||||
return ftdoc.temp;
|
||||
};
|
||||
|
||||
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)) {
|
||||
var elem_r = doc.getSelectionRect();
|
||||
(function() {
|
||||
var elem_r = doc.getSelectionRect();
|
||||
|
||||
var elem_x = elem_r.left;
|
||||
var elem_y = elem_r.top;
|
||||
var elem_w = elem_r.right - elem_r.left;
|
||||
var elem_h = elem_r.bottom - elem_r.top;
|
||||
var elem_x = elem_r.left;
|
||||
var elem_y = elem_r.top;
|
||||
var elem_w = elem_r.right - elem_r.left;
|
||||
var elem_h = elem_r.bottom - elem_r.top;
|
||||
|
||||
var elem_dx = Math.round(elem_x) - elem_x;
|
||||
var elem_dy = Math.round(elem_y) - elem_y;
|
||||
var elem_dw = Math.round(elem_w) - elem_w;
|
||||
var elem_dh = Math.round(elem_h) - elem_h;
|
||||
var elem_dx = Math.round(elem_x) - elem_x;
|
||||
var elem_dy = Math.round(elem_y) - elem_y;
|
||||
var elem_dw = Math.round(elem_w) - elem_w;
|
||||
var elem_dh = Math.round(elem_h) - elem_h;
|
||||
|
||||
doc.convertSelectionToBitmap();
|
||||
elem = doc.selection[0];
|
||||
doc.convertSelectionToBitmap();
|
||||
var elem = doc.selection[0];
|
||||
|
||||
elem.x -= elem_dx;
|
||||
elem.y -= elem_dy;
|
||||
elem.width -= elem_dw;
|
||||
elem.height -= elem_dh;
|
||||
elem.x -= elem_dx;
|
||||
elem.y -= elem_dy;
|
||||
elem.width -= elem_dw;
|
||||
elem.height -= elem_dh;
|
||||
})();
|
||||
} else {
|
||||
var wrapper_item_name = ft.gen_unique_name();
|
||||
var wrapper_item = doc.convertToSymbol("graphic", wrapper_item_name , "top left");
|
||||
fttim.recursive_scale_filters(doc, wrapper_item.timeline, final_scale);
|
||||
(function() {
|
||||
var wrapper_item_name = ft.gen_unique_name();
|
||||
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];
|
||||
elem.setTransformationPoint({x: 0, y: 0});
|
||||
doc.scaleSelection(final_scale, final_scale);
|
||||
var elem = doc.selection[0];
|
||||
elem.setTransformationPoint({x: 0, y: 0});
|
||||
doc.scaleSelection(final_scale, final_scale);
|
||||
|
||||
var elem_x = elem.x;
|
||||
var elem_y = elem.y;
|
||||
var elem_w = elem.width;
|
||||
var elem_h = elem.height;
|
||||
var elem_x = elem.x;
|
||||
var elem_y = elem.y;
|
||||
var elem_w = elem.width;
|
||||
var elem_h = elem.height;
|
||||
|
||||
var elem_dx = Math.round(elem_x) - elem_x;
|
||||
var elem_dy = Math.round(elem_y) - elem_y;
|
||||
var elem_dw = Math.round(elem_w) - elem_w;
|
||||
var elem_dh = Math.round(elem_h) - elem_h;
|
||||
var elem_dx = Math.round(elem_x) - elem_x;
|
||||
var elem_dy = Math.round(elem_y) - elem_y;
|
||||
var elem_dw = Math.round(elem_w) - elem_w;
|
||||
var elem_dh = Math.round(elem_h) - elem_h;
|
||||
|
||||
doc.convertSelectionToBitmap();
|
||||
elem = doc.selection[0];
|
||||
doc.convertSelectionToBitmap();
|
||||
elem = doc.selection[0];
|
||||
|
||||
elem.x -= elem_dx;
|
||||
elem.y -= elem_dy;
|
||||
elem.width -= elem_dw;
|
||||
elem.height -= elem_dh;
|
||||
elem.x -= elem_dx;
|
||||
elem.y -= elem_dy;
|
||||
elem.width -= elem_dw;
|
||||
elem.height -= elem_dh;
|
||||
|
||||
elem.setTransformationPoint({x: (elem_x - elem.x), y: (elem_y - elem.y)});
|
||||
doc.scaleSelection(1.0 / final_scale, 1.0 / final_scale);
|
||||
elem.setTransformationPoint({x: (elem_x - elem.x), y: (elem_y - elem.y)});
|
||||
doc.scaleSelection(1.0 / final_scale, 1.0 / final_scale);
|
||||
})();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -402,21 +424,28 @@ ft_main = function (opts) {
|
||||
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) {
|
||||
ft.type_assert(doc, Document);
|
||||
var arr1 = ftlib.prepare_all_groups(doc, doc.library);
|
||||
var arr2 = fttim.prepare_all_groups(doc, doc.getTimeline());
|
||||
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) {
|
||||
var new_symbols_copy = ft.array_clone(new_symbols);
|
||||
new_symbols = [];
|
||||
ft.array_foreach(new_symbols_copy, 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();
|
||||
}
|
||||
});
|
||||
ft.array_foreach(new_symbols_copy, process_item);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -444,7 +473,7 @@ ft_main = function (opts) {
|
||||
ft.type_assert(lib, Library);
|
||||
ft.type_assert(func, Function);
|
||||
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);
|
||||
};
|
||||
|
||||
@@ -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) {
|
||||
ft.type_assert(doc, Document);
|
||||
ft.type_assert(library, Library);
|
||||
@@ -743,7 +780,12 @@ ft_main = function (opts) {
|
||||
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);
|
||||
return frame.tweenType == "shape";
|
||||
};
|
||||
@@ -814,7 +856,7 @@ ft_main = function (opts) {
|
||||
var frame_width = Math.max(0, bounds.right - bounds.left);
|
||||
var frame_height = Math.max(0, bounds.bottom - bounds.top);
|
||||
return Math.round(frame_width) * Math.round(frame_height);
|
||||
}
|
||||
};
|
||||
|
||||
fttim.recursive_scale_filters = function (doc, timeline, scale) {
|
||||
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}'",
|
||||
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) {
|
||||
timeline.currentFrame = frame_index;
|
||||
}
|
||||
@@ -905,6 +947,29 @@ ft_main = function (opts) {
|
||||
}, 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) {
|
||||
ft.type_assert(doc, Document);
|
||||
ft.type_assert(timeline, Timeline);
|
||||
@@ -940,9 +1005,6 @@ ft_main = function (opts) {
|
||||
});
|
||||
}, fttim.is_keyframe);
|
||||
}, 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;
|
||||
};
|
||||
|
||||
@@ -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!";
|
||||
}
|
||||
}, 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);
|
||||
|
||||
|
||||
@@ -63,16 +63,19 @@ dipyalov: фишка в том, что swf обновился, но и собр
|
||||
Таки стоит, но с рекурсивным выносом в отдельные символы и последующей их обработкой
|
||||
**** DONE В ошибках конвертации писать, что нужно прогнать через скрипт экспорта
|
||||
А еще лучше как-то метить прогнанную анимацию и нет
|
||||
**** TODO Оптимизация растеризируемых групп
|
||||
*** Баги
|
||||
**** DONE При больших (>= 4000 пикселей) выделениях не работает convertSelectionToBitmap
|
||||
**** TODO Не работает конвертация в batchmod'е
|
||||
**** DONE В ошибках конвертации не пишется путь до swf
|
||||
**** DONE Не растеризуются группы в твинах
|
||||
**** DONE Проблемы с порядком drawing objects и groups при экспорте
|
||||
**** TODO При конверте нескольких документов накапливаются временные значения(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
|
||||
**** DONE Шейпы в классических твинах (да, это ошибка, но флеш её пропускает) не растеризуются
|
||||
**** TODO Возможно проблемы с DX9
|
||||
UNITY_UV_STARTS_AT_TOP
|
||||
UNITY_HALF_TEXEL_OFFSET
|
||||
|
||||
Reference in New Issue
Block a user