mirror of
https://github.com/BlackMATov/unity-flash-tools.git
synced 2025-12-16 22:19:31 +07:00
many fixes about groups
This commit is contained in:
@@ -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
|
||||||
|
});
|
||||||
@@ -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]);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user