Compare commits

...

59 Commits

Author SHA1 Message Date
020e933092 reconvert all animations to 1.3.9 2017-08-06 16:50:00 +07:00
5f987eeea8 fix shader properties initialization 2017-08-06 16:44:51 +07:00
08ac4cc73e Replace mask shader "if + discard" instruction to "clip" 2017-08-06 02:34:37 +07:00
5611da7a7c Replace string shader properties to id 2017-08-06 02:24:45 +07:00
9f7f0e5a2b Replace shader "if" instruction to "step" 2017-08-06 02:07:09 +07:00
17a7a1f10e todo 2017-08-06 00:40:41 +07:00
0d42dd1b12 fix warning on add missing components 2017-08-06 00:34:16 +07:00
2aa7ca4a0a hideFlags for generated mesh 2017-08-05 18:53:38 +07:00
7638614d33 todo 2017-08-01 20:25:32 +07:00
262e1f8d40 Bug fix (At line 908 of file "FTMain.jsfl": ReferenceError: ft is not defined) 2017-07-01 23:16:13 +07:00
9b89bfc00b todo 2017-07-01 22:50:31 +07:00
6fe301153f more unsupported tags 2017-06-22 02:11:20 +07:00
f342c83a39 reconvert with new version export 2017-06-20 20:38:38 +07:00
36cc95cd60 Added tag versions/1.3.8 for changeset 7590116fb2e8 2017-06-20 19:55:46 +07:00
abaaced469 update ftsources project 2017-06-20 19:28:20 +07:00
5f24a7dfd9 todo and new test animation 2017-06-20 07:26:44 +07:00
5f3302b459 force fullrect for sprites 2017-06-19 20:14:40 +07:00
4471d05910 todo and little reconvert button improvement 2017-06-19 06:30:54 +07:00
9d0846d7dc progress bar improvements 2017-06-19 06:17:36 +07:00
8142f49e90 fix filter scale for export with custom graphic scale 2017-06-19 03:49:35 +07:00
4033ca68e8 todo 2017-06-18 21:12:35 +07:00
f0fafc4314 reconvert example animations 2017-06-16 00:26:53 +07:00
47973918ad fix bug with big multiple reimport 2017-06-16 00:12:41 +07:00
8b165ba45f fix tweens with incorrect end 2017-06-14 00:33:49 +07:00
0a9aa0c5de dev tests 2017-06-12 01:38:39 +07:00
a56825cf4b TODO 2017-06-12 01:38:22 +07:00
90b2d90157 fix tick timer without clip 2017-06-02 06:12:14 +07:00
84a7539b56 todo and test animations 2017-05-29 16:47:56 +07:00
f26d1f1f2e todo 2017-05-28 04:22:42 +07:00
3b775751a2 warning for shapes in motion tween 2017-05-27 23:11:06 +07:00
26fde9fe89 add version to swf hash 2017-05-27 23:06:42 +07:00
f0f18e6aec many fixes about groups 2017-05-27 00:44:38 +07:00
9ea77def56 Fix overlay blending mode 2017-05-25 00:48:25 +07:00
fa15c96de4 little tweek prepare_all_tweens 2017-05-21 02:44:11 +07:00
a147b74ddf function names refactoring 2017-05-21 02:32:13 +07:00
7ef01ccc2e base jsfl functions to FTBase 2017-05-21 01:49:43 +07:00
ee998c3770 refactor prepare tweens 2017-05-21 00:53:40 +07:00
26427f2220 improved profile mode 2017-05-20 18:54:19 +07:00
1341a47f09 Prepare shapes in tweens 2017-05-20 05:28:50 +07:00
29dc1b3253 Add HD, SD script export 2017-05-19 04:47:36 +07:00
8ca72bf194 Fix drawing object shape problems 2017-05-18 04:11:30 +07:00
d5575c005a Fix convertSelectionToBitmap for big item (over 4000px) 2017-05-17 03:16:49 +07:00
94c44c37cb Remove excess animation reimports 2017-05-16 17:33:59 +07:00
f9b9acd3b7 Add SwfClip bounds functions (currentLocalBounds, currentWorldBounds) 2017-05-16 03:07:26 +07:00
26e30e45f2 Fix Unity 5.6 submesh sorting bug 2017-05-15 23:46:15 +07:00
4451018727 add swf path to convertion error 2017-05-15 05:33:14 +07:00
b1feaec2c9 default 2048 size and truecolor 2017-05-15 05:14:18 +07:00
a38e05f955 remove external alpha IF from shaders 2017-05-15 04:49:25 +07:00
d591379acc Shape tween warning 2017-05-15 04:21:57 +07:00
8ded077428 Fix optimizator bitmap trim problems 2017-05-13 23:43:02 +07:00
3c5f3784e5 Fix locked elements problem 2017-05-10 02:11:46 +07:00
513e477214 Fix shape groups in tweens version 2 2017-05-10 00:42:22 +07:00
55d7df349e Fix shape groups in tweens 2017-05-09 00:26:22 +07:00
faff1d4c6e todo 2017-04-08 01:20:44 +07:00
103190fcc7 move Promo. add org-mode todo. 2017-03-27 00:22:19 +07:00
8867ed855a Added tag versions/1.3.7 for changeset 3269e6a0cceb 2017-03-18 21:10:56 +07:00
df364244b4 fix multiple import 2017-02-24 02:13:55 +07:00
5012b53ac1 fix single frame optimization 2017-02-24 00:28:56 +07:00
b7e026e8ff Added tag versions/1.3.6 for changeset 9df7b359e92b 2017-02-17 22:37:05 +07:00
135 changed files with 152664 additions and 119254 deletions

0
.projectile Normal file
View File

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 2d8762b6bff92457aa59aaf03193018c
folderAsset: yes
timeCreated: 1487860932
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 489500abc518741b59e7a95b93295317
timeCreated: 1497866267
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d481c08b811dc41eda079968a32efbb9
timeCreated: 1487860937
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 31fd11df111b54e3dbf8f0b135da45d9
folderAsset: yes
timeCreated: 1494224348
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 9b15c852977e54b3b8b1dfc4fa6fc920
timeCreated: 1495641252
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b037662f7f638455d9cc6d4251710ee2
timeCreated: 1495627091
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 667a3cd1a987d40d5a4c9b6495da5480
timeCreated: 1494255165
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 12654680c0cae45d3a44f4fc666262bd
timeCreated: 1494492625
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7dc9a5d8bf33d4b30b9a58e370cad87e
timeCreated: 1494508632
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 0f878ff9c96174385bb57a48f18a6335
timeCreated: 1495910510
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: c82e30d4e993d450f8a475c408afc80f
timeCreated: 1495664549
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 89dfadc78afc648c3a5aaf39c5cec6e2
timeCreated: 1495655881
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7c9df19bccf1d4987a1c2359f55b921f
timeCreated: 1495661693
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3b209e60e405544f2bbdc7a9db61b81d
timeCreated: 1495206863
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 8006ea931faa744169bb2c56d2b04da8
timeCreated: 1495311730
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b35790b065a454a32a0518138e64d15f
timeCreated: 1491582789
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1c95e140e6cc841508d2f6a21b33068b
timeCreated: 1495287492
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ad3f6a723d9604fe9b44fe73494e6899
timeCreated: 1494279688
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 221b4d2156b3446cbbf03c70db9e69fd
timeCreated: 1495746942
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 16c36ac5146fc41799851c3b081b6846
timeCreated: 1495749347
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 137690fcc02e7478f8f0c6733fe7889c
timeCreated: 1495903354
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 95dbb06a4f0c9413480c9e92aba982d3
timeCreated: 1494272922
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,3 +1,29 @@
###### Version 1.3.9
* Not save generated meshes in scene
* Fix (At line 908 of file "FTMain.jsfl": ReferenceError: ft is not defined)
* Fix warning on add missing components
* Replace string shader properties to id
* Replace shader "if" instruction to "step"
* Replace mask shader "if + discard" instruction to "clip"
###### Version 1.3.8
* Fix shape groups in tweens problems
* Fix drawing object shape problems
* Fix locked elements problem
* Fix optimizator bitmap trim problems
* Fix Unity 5.6 submesh sorting bug
* Fix convertSelectionToBitmap for big item (over 4000px)
* Fix overlay blending mode
* Add HD, SD script export
* Add shape tween warning
* Add SwfClip bounds functions (currentLocalBounds, currentWorldBounds)
* Remove excess "if" instruction from shaders
* Remove excess animation reimports
###### Version 1.3.7
* Fix multiple import
* Fix single frame optimization
###### Version 1.3.6
* Fix for scale very small vector items
* Big vector item optimization

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: e336e165518cf4d8680e2fff9c6b59ba
timeCreated: 1486894953
timeCreated: 1502012907
licenseType: Free
TextureImporter:
fileIDToRecycleName: {}
@@ -39,7 +39,7 @@ TextureImporter:
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
spriteMeshType: 0
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}

View File

@@ -22,14 +22,94 @@ MonoBehaviour:
MeshData:
SubMeshes:
- StartVertex: 0
IndexCount: 6
IndexCount: 126
Vertices:
- {x: 0.028839836, y: -0.03892601}
- {x: 0.9771797, y: -0.03892601}
- {x: 0.9771797, y: -0.8959397}
- {x: 0.028839836, y: -0.8959397}
UVs: 00000000ff4aff52
AddColors: 0000000000000000
MulColors: 0002000200020002
- {x: 0.093291655, y: -0.5527766}
- {x: 0.5906427, y: -0.49855503}
- {x: 0.5825955, y: -0.7595181}
- {x: 0.08524446, y: -0.81373966}
- {x: 0.6724206, y: -0.36256573}
- {x: 0.8942103, y: -0.48526812}
- {x: 0.7557899, y: -0.7355155}
- {x: 0.5340002, y: -0.6128131}
- {x: 0.66955954, y: -0.7525534}
- {x: 0.8318795, y: -0.6832502}
- {x: 0.8691911, y: -0.79836786}
- {x: 0.70687115, y: -0.8676711}
- {x: 0.43360725, y: -0.12802117}
- {x: 0.88885266, y: -0.18992838}
- {x: 0.80472267, y: -0.8087083}
- {x: 0.3494773, y: -0.7468011}
- {x: 0.37824008, y: -0.69763076}
- {x: 0.49014634, y: -0.8738549}
- {x: 0.38391614, y: -0.941326}
- {x: 0.27200988, y: -0.76510197}
- {x: 0.4438706, y: -0.5868737}
- {x: 0.56574404, y: -0.6853528}
- {x: 0.45655966, y: -0.82049984}
- {x: 0.33468625, y: -0.7220208}
- {x: 0.6787334, y: -0.4077256}
- {x: 0.7619559, y: -0.41904274}
- {x: 0.74033403, y: -0.5780727}
- {x: 0.6571115, y: -0.5667556}
- {x: 0.46749952, y: -0.34338287}
- {x: 0.7503639, y: -0.3818486}
- {x: 0.7349386, y: -0.49530196}
- {x: 0.4520743, y: -0.45683625}
- {x: 0.86364335, y: -0.09722355}
- {x: 0.96060354, y: -0.09934438}
- {x: 0.9590185, y: -0.17182186}
- {x: 0.86205834, y: -0.16970102}
- {x: 0.5517408, y: -0.22355518}
- {x: 1.0120615, y: -0.23362388}
- {x: 1.0079622, y: -0.42106485}
- {x: 0.54764163, y: -0.41099614}
- {x: 0.49390063, y: -0.07256326}
- {x: 1.039184, y: -0.08449037}
- {x: 1.032505, y: -0.38989362}
- {x: 0.48722172, y: -0.3779665}
- {x: 0.6388158, y: -0.13516656}
- {x: 0.7662644, y: -0.13795426}
- {x: 0.7637611, y: -0.25242078}
- {x: 0.63631254, y: -0.24963307}
- {x: 0.69845474, y: -0.20390525}
- {x: 0.7184471, y: -0.20434254}
- {x: 0.7180098, y: -0.22433674}
- {x: 0.6980175, y: -0.22389945}
- {x: 0.7316064, y: -0.20348743}
- {x: 0.74759996, y: -0.20383726}
- {x: 0.74697685, y: -0.23232873}
- {x: 0.7309833, y: -0.2319789}
- {x: 0.6183724, y: -0.18158044}
- {x: 0.7728118, y: -0.18495853}
- {x: 0.77112836, y: -0.26193565}
- {x: 0.61668897, y: -0.2585576}
- {x: 0.6127337, y: -0.099736005}
- {x: 0.7977926, y: -0.10378384}
- {x: 0.79564387, y: -0.20203815}
- {x: 0.610585, y: -0.19799031}
- {x: 0.507205, y: -0.11742941}
- {x: 1.0924743, y: -0.13023114}
- {x: 1.088419, y: -0.31567165}
- {x: 0.50314957, y: -0.30286992}
- {x: 0.42519823, y: -0.00019747685}
- {x: 0.9140025, y: -0.010889203}
- {x: 0.90442663, y: -0.44875968}
- {x: 0.41562238, y: -0.43806794}
- {x: 0.4386289, y: -0.40727332}
- {x: 0.5306043, y: -0.40566462}
- {x: 0.53292096, y: -0.5381406}
- {x: 0.44094557, y: -0.53974926}
- {x: 0.46142825, y: -0.5042712}
- {x: 0.6632915, y: -0.4016091}
- {x: 0.7555196, y: -0.58299005}
- {x: 0.5536564, y: -0.68565214}
- {x: 0.029411115, y: -0.035497963}
- {x: 0.97329503, y: -0.035497963}
- {x: 0.97329503, y: -0.8919796}
- {x: 0.029411115, y: -0.8919796}
UVs: 0000ffbfff19fff1ff56ff37ff73ff50ff1affecff26fffe0000ff5eff3dff8cff1affbfff27ffd4ff52ff76ff65ff87ff56ff51ff66ff59ff67ff5eff72ff7bff76ff0fff7dff19ff3eff5eff51ff8cff560000ff75ff36ff73ff5eff7eff6bff7aff1aff7cff1cff76ff1aff79ff1cff760000ff7eff0eff1affd5ff26ffebff2cff8dff3fffc80000ff8dff2bffbeff67ff51ff74ff5aff52ff5eff66ff7500000000ff55ff5d
AddColors: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MulColors: 000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200020002
Materials:
- {fileID: 2100000, guid: d58d9a5e482e8429f8d7d18a9538d94a, type: 2}

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: a25723a1cd8b141a6b489606584a6f65
timeCreated: 1480707413
timeCreated: 1494801036
licenseType: Free
NativeFormatImporter:
userData:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: c1278c7f98af44db8a86e620305eb32b
timeCreated: 1486894967
timeCreated: 1502012900
licenseType: Free
TextureImporter:
fileIDToRecycleName: {}
@@ -39,7 +39,7 @@ TextureImporter:
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
spriteMeshType: 0
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}

View File

@@ -22,114 +22,154 @@ MonoBehaviour:
MeshData:
SubMeshes:
- StartVertex: 0
IndexCount: 6
- StartVertex: 4
IndexCount: 6
- StartVertex: 8
IndexCount: 24
- StartVertex: 24
IndexCount: 6
- StartVertex: 28
IndexCount: 156
Vertices:
- {x: 0.106315956, y: 0.12643726}
- {x: 0.2629222, y: 0.12643726}
- {x: 0.2629222, y: 0.0341479}
- {x: 0.106315956, y: 0.0341479}
- {x: 0.06176914, y: 0.14451343}
- {x: 0.30489662, y: 0.14451343}
- {x: 0.30489662, y: 0.05434666}
- {x: 0.06176914, y: 0.05434666}
- {x: 0.096862756, y: 0.1299182}
- {x: 0.1545074, y: 0.1299182}
- {x: 0.1545074, y: 0.050229903}
- {x: 0.096862756, y: 0.050229903}
- {x: 0.17279011, y: 0.12516041}
- {x: 0.19912747, y: 0.12392976}
- {x: 0.19211169, y: 0.04833745}
- {x: 0.16577433, y: 0.049568094}
- {x: 0.19564708, y: 0.121027105}
- {x: 0.23835461, y: 0.12022791}
- {x: 0.23566528, y: 0.048127156}
- {x: 0.19295773, y: 0.048926346}
- {x: 0.20316595, y: 0.11463966}
- {x: 0.24947853, y: 0.11463966}
- {x: 0.24947853, y: 0.047944065}
- {x: 0.20316595, y: 0.047944065}
- {x: 0.06176914, y: 0.14451343}
- {x: 0.30489662, y: 0.14451343}
- {x: 0.30489662, y: 0.05434666}
- {x: 0.06176914, y: 0.05434666}
- {x: 0.17883545, y: -0.33088514}
- {x: 0.27845198, y: -0.41441038}
- {x: 0.18850175, y: -0.5216897}
- {x: 0.0888852, y: -0.4381645}
- {x: 0.27924088, y: -0.41507185}
- {x: 0.19028847, y: -0.52116114}
- {x: 0.08988304, y: -0.43697444}
- {x: 0.04699825, y: -0.5018102}
- {x: 0.13128917, y: -0.5724854}
- {x: 0.041338928, y: -0.67976475}
- {x: -0.042951997, y: -0.60908955}
- {x: 0.13262679, y: -0.57360697}
- {x: 0.04558219, y: -0.67742085}
- {x: -0.040046353, y: -0.60562414}
- {x: 0.28633544, y: -0.32388517}
- {x: 0.3936148, y: -0.4138354}
- {x: 0.31008956, y: -0.51345193}
- {x: 0.20281021, y: -0.4235017}
- {x: 0.21864823, y: -0.34363583}
- {x: 0.30293915, y: -0.41431102}
- {x: 0.23868898, y: -0.49093914}
- {x: 0.15439805, y: -0.42026395}
- {x: 0.122, y: -0.39949995}
- {x: 0.412, y: -0.39949995}
- {x: 0.412, y: -0.7594999}
- {x: 0.122, y: -0.7594999}
- {x: 0.3912854, y: -0.4118823}
- {x: 0.30582932, y: -0.5138017}
- {x: 0.20087935, y: -0.42580456}
- {x: 0.22631103, y: -0.35006085}
- {x: 0.30587783, y: -0.41677502}
- {x: 0.23916365, y: -0.49634182}
- {x: 0.15959686, y: -0.42962766}
- {x: 0.122, y: -0.40399995}
- {x: 0.40749973, y: -0.40399995}
- {x: 0.40749973, y: -0.7604953}
- {x: 0.122, y: -0.7604953}
- {x: 0.2266193, y: -0.65309644}
- {x: 0.32225987, y: -0.60883987}
- {x: 0.35238072, y: -0.7319035}
- {x: 0.25674015, y: -0.7761601}
- {x: 0.32643726, y: -0.6069068}
- {x: 0.3576628, y: -0.7344838}
- {x: 0.2578448, y: -0.7806734}
- {x: 0.173, y: -0.71999997}
- {x: 0.313, y: -0.71999997}
- {x: 0.313, y: -0.79999995}
- {x: 0.173, y: -0.79999995}
- {x: 0.31064036, y: -0.71999997}
- {x: 0.31064036, y: -0.79705167}
- {x: 0.173, y: -0.79705167}
- {x: 0.2075, y: -0.69649994}
- {x: 0.3075, y: -0.69649994}
- {x: 0.3075, y: -0.76649994}
- {x: 0.2075, y: -0.76649994}
- {x: 0.19299999, y: -0.6795}
- {x: 0.30299997, y: -0.6795}
- {x: 0.30299997, y: -0.7295}
- {x: 0.19299999, y: -0.7295}
- {x: 0.3041623, y: -0.69649994}
- {x: 0.3041623, y: -0.7633929}
- {x: 0.2075, y: -0.7633929}
- {x: 0.19299999, y: -0.66949993}
- {x: 0.30682567, y: -0.66949993}
- {x: 0.30682567, y: -0.71853286}
- {x: 0.19299999, y: -0.71853286}
- {x: 0.315, y: -0.63199997}
- {x: 0.45499998, y: -0.63199997}
- {x: 0.45499998, y: -0.732}
- {x: 0.315, y: -0.732}
- {x: 0.45133758, y: -0.63199997}
- {x: 0.45133758, y: -0.73108685}
- {x: 0.315, y: -0.73108685}
- {x: 0.305, y: -0.752}
- {x: 0.45499998, y: -0.752}
- {x: 0.45499998, y: -0.83199996}
- {x: 0.305, y: -0.83199996}
- {x: 0.44998062, y: -0.752}
- {x: 0.44998062, y: -0.8315501}
- {x: 0.305, y: -0.8315501}
- {x: 0.337, y: -0.71599996}
- {x: 0.447, y: -0.71599996}
- {x: 0.447, y: -0.77599996}
- {x: 0.337, y: -0.77599996}
- {x: 0.3195, y: -0.70399994}
- {x: 0.4495, y: -0.70399994}
- {x: 0.4495, y: -0.74399996}
- {x: 0.3195, y: -0.74399996}
- {x: 0.18099998, y: -0.36449996}
- {x: 0.571, y: -0.36449996}
- {x: 0.571, y: -0.6744999}
- {x: 0.18099998, y: -0.6744999}
- {x: 0.3995, y: -0.32349998}
- {x: 0.6395, y: -0.32349998}
- {x: 0.6395, y: -0.8135}
- {x: 0.3995, y: -0.8135}
- {x: 0.1625, y: -0.49149996}
- {x: 0.5925, y: -0.49149996}
- {x: 0.5925, y: -0.6514999}
- {x: 0.1625, y: -0.6514999}
- {x: 0.13650002, y: 0.087000005}
- {x: 0.6465, y: 0.087000005}
- {x: 0.6465, y: -0.45299998}
- {x: 0.13650002, y: -0.45299998}
- {x: 0.442047, y: -0.71599996}
- {x: 0.442047, y: -0.7778359}
- {x: 0.337, y: -0.7778359}
- {x: 0.3295, y: -0.70399994}
- {x: 0.46136615, y: -0.70399994}
- {x: 0.46136615, y: -0.7479553}
- {x: 0.3295, y: -0.7479553}
- {x: 0.17849998, y: -0.36099997}
- {x: 0.5664945, y: -0.36099997}
- {x: 0.5664945, y: -0.67049855}
- {x: 0.17849998, y: -0.67049855}
- {x: 0.40300003, y: -0.32099998}
- {x: 0.6404988, y: -0.32099998}
- {x: 0.6404988, y: -0.8089962}
- {x: 0.40300003, y: -0.8089962}
- {x: 0.1575, y: -0.49599996}
- {x: 0.5875, y: -0.49599996}
- {x: 0.5875, y: -0.65249896}
- {x: 0.1575, y: -0.65249896}
- {x: 0.13700001, y: 0.08049999}
- {x: 0.65149796, y: 0.08049999}
- {x: 0.65149796, y: -0.45499286}
- {x: 0.13700001, y: -0.45499286}
- {x: 0.262, y: -0.17849998}
- {x: 0.362, y: -0.17849998}
- {x: 0.362, y: -0.28849998}
- {x: 0.262, y: -0.28849998}
- {x: 0.36318973, y: -0.17849998}
- {x: 0.36318973, y: -0.2919961}
- {x: 0.262, y: -0.2919961}
- {x: 0.13250002, y: -0.16}
- {x: 0.22250001, y: -0.16}
- {x: 0.22250001, y: -0.28}
- {x: 0.13250002, y: -0.28}
- {x: 0.21949664, y: -0.16}
- {x: 0.21949664, y: -0.27586058}
- {x: 0.13250002, y: -0.27586058}
- {x: 0.11150001, y: -0.17449999}
- {x: 0.5215, y: -0.17449999}
- {x: 0.5215, y: -0.48449996}
- {x: 0.11150001, y: -0.48449996}
- {x: 0.09650002, y: 0.017000007}
- {x: 0.5265, y: 0.017000007}
- {x: 0.5265, y: -0.33299997}
- {x: 0.09650002, y: -0.33299997}
- {x: -0.020737303, y: -0.44349837}
- {x: 0.3277887, y: -0.47559524}
- {x: 0.30486238, y: -0.7245424}
- {x: -0.043663636, y: -0.6924455}
- {x: 0.4193734, y: -0.45619494}
- {x: 0.559305, y: -0.45187333}
- {x: 0.56331795, y: -0.5818099}
- {x: 0.4233863, y: -0.58613145}
- {x: 0.31538656, y: -0.5147328}
- {x: 0.45426717, y: -0.5323866}
- {x: 0.43661335, y: -0.6712672}
- {x: 0.29773277, y: -0.6536134}
- {x: 0.52488655, y: -0.17449999}
- {x: 0.52488655, y: -0.48745242}
- {x: 0.11150001, y: -0.48745242}
- {x: 0.09200001, y: 0.015500011}
- {x: 0.5254972, y: 0.015500011}
- {x: 0.5254972, y: -0.3314986}
- {x: 0.09200001, y: -0.3314986}
- {x: -0.016302101, y: -0.44440895}
- {x: 0.33271846, y: -0.47655135}
- {x: 0.31025076, y: -0.72051847}
- {x: -0.038769808, y: -0.68837607}
- {x: 0.42293343, y: -0.45808592}
- {x: 0.5598651, y: -0.45385697}
- {x: 0.5639706, y: -0.5867913}
- {x: 0.4270389, y: -0.5910202}
- {x: 0.31725287, y: -0.5119459}
- {x: 0.4556355, y: -0.5295364}
- {x: 0.43754044, y: -0.6718882}
- {x: 0.29915783, y: -0.6542977}
- {x: 0.37866077, y: -0.5215725}
- {x: 0.47755602, y: -0.50675315}
- {x: 0.49533924, y: -0.6254274}
- {x: 0.39644396, y: -0.6402468}
- {x: 0.26616642, y: -0.5326745}
- {x: 0.36073795, y: -0.58885443}
- {x: 0.2892362, y: -0.7092182}
- {x: 0.19466466, y: -0.65303826}
UVs: ffbaff22ffc17f29fff7ff05fffe7f0bffbaff297fc1ff307fe57f0c7feaff117f3c7fc87f4effd6ffeaff11ffefff167fbeff417fc2ff48fff07f117ff47f167f4c7fabff4effb07f497fd77f4e7fde7fbeff317fc27f397f4c7fa57f4fffaa7f4c7fc17f4effc77f3c7fb4ff4bffc7ffde00007ff7ff0bff447fe9ff4cfffe7fc300007fde7f19ffea7f0c7ff07f11fff07f0cfff6ff107f3c7f9fff4bffb37f3c7f89ff4dff9e7f3c7fd7ff48ffe8ffbaff297fc1ff30ffba7f1bffc17f22ffde7f0cffe47f11fff70000fffe7f05
AddColors: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MulColors: 00020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002
- {x: 0.47597006, y: -0.5069908}
- {x: 0.49384904, y: -0.6263043}
- {x: 0.39653975, y: -0.640886}
- {x: 0.26679638, y: -0.53944594}
- {x: 0.36222652, y: -0.596136}
- {x: 0.29327887, y: -0.7122002}
- {x: 0.19784872, y: -0.6555102}
UVs: ffa000007ff37f63000000007f507f9a0000ff9a7f477fbfffa0ff63ffe4ff740000ffdd7f40fff80000ffbf7f3b7fdd000000007f507f9afff3ff27fffa7f2e7f437fd77f4affdcfff3ff2e7ffaff35ff4a7fd77f50ffdcffb97f75ffcbff83ff47fff17f4f7ff9fff3ff157ff9ff1ffff9ff15fffeff1cfff3ff457ff7ff4dff40fff17f47fffaff47ffb0ff4d7fbb7ffb7f207fff7f277ffc00007fffff08ff40ffdd7f507ff1ffa07f757fb97f81fff30000fffb7f15ff507f89ff6bffa27f077ff97f0dfffe00007ff9ff06fffeff3bffbf7f4dffd67fe5ff63fff67f797fcc7f75ffd8ff86fff3ff2e7ffaff35fff37f20fffa7f27ff0d7ff9ff137ffeff3b7fd7ff42ffdc
AddColors: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MulColors: 000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002000200020002
Materials:
- {fileID: 2100000, guid: d58d9a5e482e8429f8d7d18a9538d94a, type: 2}
- {fileID: 2100000, guid: 3c29e337d2fa54be7af8d125c34562b7, type: 2}
- {fileID: 2100000, guid: fd62ebda9455442f4a7861e78484f3b6, type: 2}
- {fileID: 2100000, guid: 69837dba6d9e9419a8e22a6b25de0008, type: 2}
- {fileID: 2100000, guid: d58d9a5e482e8429f8d7d18a9538d94a, type: 2}

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 269 KiB

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: a799322aa44e44b38980bc9d307f0c38
timeCreated: 1486894960
timeCreated: 1502012881
licenseType: Free
TextureImporter:
fileIDToRecycleName: {}
@@ -39,7 +39,7 @@ TextureImporter:
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
spriteMeshType: 0
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}

View File

@@ -22,22 +22,154 @@ MonoBehaviour:
MeshData:
SubMeshes:
- StartVertex: 0
IndexCount: 18
IndexCount: 216
Vertices:
- {x: 1.139, y: -2.095}
- {x: 1.2790855, y: -2.095}
- {x: 1.2790855, y: -2.8981402}
- {x: 1.139, y: -2.8981402}
- {x: 1.1025, y: -1.056}
- {x: 1.3759177, y: -1.056}
- {x: 1.3759177, y: -2.7861564}
- {x: 1.1025, y: -2.7861564}
- {x: 1.126, y: -1.0004998}
- {x: 1.5205874, y: -1.0004998}
- {x: 1.5205874, y: -2.9477496}
- {x: 1.126, y: -2.9477496}
- {x: 0.8705, y: -1.6520001}
- {x: 1.2186888, y: -1.6520001}
- {x: 1.2186888, y: -2.4983816}
- {x: 0.8705, y: -2.4983816}
- {x: 1.0625, y: -1.0354998}
- {x: 1.3845642, y: -1.0354998}
- {x: 1.3845642, y: -2.7268858}
- {x: 1.0625, y: -2.7268858}
- {x: 1.253, y: -1.2565002}
- {x: 1.4584018, y: -1.2565002}
- {x: 1.4584018, y: -3.0470023}
- {x: 1.253, y: -3.0470023}
- {x: 1.563, y: -2.0925}
- {x: 1.7030854, y: -2.0925}
- {x: 1.7030854, y: -2.8960884}
- {x: 1.563, y: -2.8960884}
- {x: 1.4990001, y: -1.0945001}
- {x: 1.7719691, y: -1.0945001}
- {x: 1.7719691, y: -2.8084314}
- {x: 1.4990001, y: -2.8084314}
- {x: 1.35, y: -1.0004998}
- {x: 1.7445874, y: -1.0004998}
- {x: 1.7445874, y: -2.9477496}
- {x: 1.35, y: -2.9477496}
- {x: 1.549, y: -1.547}
- {x: 1.8971888, y: -1.547}
- {x: 1.8971888, y: -2.3933816}
- {x: 1.549, y: -2.3933816}
- {x: 1.4805, y: -1.1229999}
- {x: 1.8025641, y: -1.1229999}
- {x: 1.8025641, y: -2.8139558}
- {x: 1.4805, y: -2.8139558}
- {x: 1.4475, y: -1.1140002}
- {x: 1.6529018, y: -1.1140002}
- {x: 1.6529018, y: -2.812595}
- {x: 1.4475, y: -2.812595}
- {x: 0.5695001, y: 0.005499954}
- {x: 1.5321016, y: 0.005499954}
- {x: 1.5321016, y: -0.96880054}
- {x: 0.5695001, y: -0.96880054}
- {x: 1.3535, y: 0.005499954}
- {x: 2.3156445, y: 0.005499954}
- {x: 2.3156445, y: -0.96880054}
- {x: 1.3535, y: -0.96880054}
- {x: -0.0025, y: -0.82850003}
- {x: 1.305124, y: -0.82850003}
- {x: 1.305124, y: -1.5514493}
- {x: -0.0025, y: -1.5514493}
- {x: 1.54, y: -0.829}
- {x: 2.847624, y: -0.829}
- {x: 2.847624, y: -1.5519493}
- {x: 1.54, y: -1.5519493}
- {x: 1.4375, y: -1.4825}
- {x: 2.5618057, y: -1.4825}
- {x: 2.5618057, y: -2.2865365}
- {x: 1.4375, y: -2.2865365}
- {x: 0.36249998, y: -1.4825}
- {x: 1.4868057, y: -1.4825}
- {x: 1.4868057, y: -2.2869847}
- {x: 0.36249998, y: -2.2869847}
- {x: 0.7260001, y: -1.1345}
- {x: 2.1597319, y: -1.1345}
- {x: 2.1597319, y: -1.9128515}
- {x: 0.7260001, y: -1.9128515}
- {x: 0.778, y: -1.3199999}
- {x: 2.1261826, y: -1.3199999}
- {x: 2.1261826, y: -1.8591814}
- {x: 0.778, y: -1.8591814}
- {x: 0.66600007, y: -0.48749998}
- {x: 2.2209303, y: -0.48749998}
- {x: 2.2209303, y: -1.3311706}
- {x: 0.66600007, y: -1.3311706}
- {x: 0.7415001, y: -0.57449996}
- {x: 2.1793175, y: -0.57449996}
- {x: 2.1793175, y: -1.3046691}
- {x: 0.7415001, y: -1.3046691}
- {x: 0.7995001, y: -1.148}
- {x: 2.0819185, y: -1.148}
- {x: 2.0819185, y: -1.7824947}
- {x: 0.7995001, y: -1.7824947}
- {x: 0.8690001, y: -1.366}
- {x: 2.0115485, y: -1.366}
- {x: 2.0115485, y: -1.7135457}
- {x: 0.8690001, y: -1.7135457}
- {x: 1.2855, y: -1.458}
- {x: 1.6248952, y: -1.458}
- {x: 1.6248952, y: -2.4030576}
- {x: 1.2855, y: -2.4030576}
- {x: 0.8095001, y: -1.2175}
- {x: 2.0860398, y: -1.2175}
- {x: 2.0860398, y: -1.5008262}
- {x: 0.8095001, y: -1.5008262}
- {x: 0.788, y: -0.67550004}
- {x: 2.098783, y: -0.67550004}
- {x: 2.098783, y: -1.3583705}
- {x: 0.788, y: -1.3583705}
- {x: 0.81250006, y: -1.163}
- {x: 0.8850208, y: -1.163}
- {x: 0.8850208, y: -1.290926}
- {x: 0.81250006, y: -1.290926}
- {x: 1.7355, y: -0.92499995}
- {x: 2.035947, y: -0.92499995}
- {x: 2.035947, y: -1.2623844}
- {x: 1.7355, y: -1.2623844}
- {x: 1.8845, y: -1.153}
- {x: 2.1408007, y: -1.153}
- {x: 2.1408007, y: -0.79580396}
- {x: 1.8845, y: -0.79580396}
- {x: 1.7355, y: -0.92499995}
- {x: 2.035947, y: -0.92499995}
- {x: 2.035947, y: -1.2623844}
- {x: 1.7355, y: -1.2623844}
- {x: 0.7215001, y: -0.92499995}
- {x: 1.1629382, y: -0.92499995}
- {x: 1.1629382, y: -1.4857965}
- {x: 0.7215001, y: -1.4857965}
- {x: 1.4074999, y: -1.2465}
- {x: 1.4567962, y: -1.2465}
- {x: 1.4567962, y: -1.265126}
- {x: 1.4074999, y: -1.265126}
- {x: 1.4563452, y: -1.2465}
- {x: 1.4563452, y: -1.2653537}
- {x: 1.4074999, y: -1.2653537}
- {x: 1.3113072, y: -1.1273378}
- {x: 1.6636108, y: -1.226211}
- {x: 1.4024341, y: -1.3672544}
- {x: 1.0501305, y: -1.2683811}
- {x: 1.3955, y: -1.242}
- {x: 1.4708942, y: -1.242}
- {x: 1.4708942, y: -1.2696567}
- {x: 1.3955, y: -1.2696567}
- {x: 1.4714679, y: -1.242}
- {x: 1.4714679, y: -1.2697064}
- {x: 1.3955, y: -1.2697064}
- {x: 1.3870001, y: -1.2475}
- {x: 1.4810733, y: -1.2475}
- {x: 1.4810733, y: -1.2815095}
- {x: 1.3870001, y: -1.2815095}
UVs: bf443fa4ff4cbfacff0f7ff23f1c7fff7f1c7fee3f26fff8
AddColors: 000000000000000000000000000000000000000000000000
MulColors: 000200020001000200020002000100020002000200010002
- {x: 1.4802694, y: -1.2475}
- {x: 1.4802694, y: -1.2818046}
- {x: 1.3870001, y: -1.2818046}
UVs: 3fcd9f875fd89f89df4f7fcedf673fd23f265fd33f41dfd83f119ffaff1c7fff1f255fec9f3cdff03f5e5fd21f773fd5dfdadf85ffe5df87ff677fcebf7f3fd2bf1dffdabf387fe0df4f1fee9f5bfff21f25fff09f3c7ff53f5e5fd5df753fd83fcd1f7abfda7f873fcd9f6cbfdaff79ffb89f6cffc2bf7e1fc39f6c1fcdbf7edfda9f6cffe53f7c1fe69f6c3ff13f7c1ff5ff1edfffdf323f11bfe7bf187ffaffa29f6cbfae3f821ff5ff323fffff4600005fd31f11fff51ff500007ffedf1e3f115fd31f26dfdafffa9f6cdffe5f7e5ff19f6cdffadf7e9ffddf4e5fffdf4fbf49fff95f4e1ffedf7f7fcedf84ffd1bf3cfff05f411ff5df4f1ff39f573ff95f447f8a9f875fce000000005f8e5f8a00007f8a3f443fd37f8e0000fff47f6c
AddColors: 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
MulColors: 000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200000002000200020000000200020002000000020002000200010002000200020000000200020002000100020002000200010002
Materials:
- {fileID: 2100000, guid: d58d9a5e482e8429f8d7d18a9538d94a, type: 2}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 47e46d443fd064d78ae33281e2840297
timeCreated: 1486894975
timeCreated: 1502012889
licenseType: Free
TextureImporter:
fileIDToRecycleName: {}
@@ -39,7 +39,7 @@ TextureImporter:
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
spriteMeshType: 0
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spriteBorder: {x: 0, y: 0, z: 0, w: 0}

File diff suppressed because one or more lines are too long

View File

@@ -1,840 +1,5 @@
if (!String.prototype.format) {
String.prototype.format = function () {
var args = arguments;
return this.replace(/{(\d+)}/g, function (match, number) {
return typeof args[number] != 'undefined' ? args[number] : match;
});
};
}
(function () {
"use strict";
//
// ft config
//
var ft = {
profile_mode : false,
verbose_mode : false,
graphics_scale : 1.0,
scale_precision : 0.01,
optimize_big_items : true,
optimize_small_items : true,
optimize_static_items : true,
optimize_single_graphics : true,
export_path_postfix : "_export"
};
//
// ft base functions
//
ft.trace = function () {
fl.outputPanel.trace(
Array.prototype.join.call(arguments, " "));
};
ft.trace_fmt = function (format) {
var args = Array.prototype.slice.call(arguments, 1);
ft.trace(format.format.apply(format, args));
};
ft.clear_output = function () {
fl.outputPanel.clear();
};
ft.assert = function (expr, format) {
if (!expr) {
if (format === undefined) {
throw "!!!Assert!!!";
} else {
var args = Array.prototype.slice.call(arguments, 2);
throw "!!!Assert!!! " + format.format.apply(format, args);
}
}
};
ft.type_assert = function (item, type) {
var type_is_string = (typeof type === 'string');
ft.assert(
(type_is_string && typeof item === type) ||
(!type_is_string && item instanceof type),
"Type error: {0} != {1}",
typeof item,
type_is_string ? type : type.constructor.name);
};
ft.type_assert_if_defined = function (item, type) {
if (item && item !== undefined) {
ft.type_assert(item, type);
}
};
ft.is_function = function (func) {
return func && typeof(func) === 'function';
};
ft.profile_function = function (func, msg) {
ft.type_assert(func, Function);
ft.type_assert(msg, 'string');
if (!ft.profile_function_stack) {
ft.profile_function_stack = [];
}
if (!ft.profile_function_level) {
ft.profile_function_level = 0;
}
var stack_index = ft.profile_function_stack.length;
ft.profile_function_stack.push({
msg: msg,
level: ft.profile_function_level,
time: 0
});
++ft.profile_function_level;
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) {
for (var i = 0; i < ft.profile_function_stack.length; ++i) {
var info = ft.profile_function_stack[i];
var ident = "--";
for (var j = 0; j < info.level; ++j) {
ident += "--";
}
if (ft.profile_mode) {
ft.trace_fmt("{0} Profile: '{1}' : {2}", ident, info.msg, info.time);
}
}
ft.profile_function_stack = [];
}
};
ft.get_call_function_time = function (func) {
ft.type_assert(func, Function);
var b_time = Date.now();
func();
var e_time = Date.now();
return (e_time - b_time) / 1000;
};
ft.escape_path = function (path) {
ft.type_assert(path, 'string');
return path.replace(/ /g, '%20');
};
ft.escape_string = function (str) {
ft.type_assert(str, 'string');
return str
.replace(/\&/g, '&amp;')
.replace(/\"/g, '&quot;')
.replace(/\'/g, '&apos;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
};
ft.combine_path = function (lhs, rhs) {
ft.type_assert(lhs, 'string');
ft.type_assert(rhs, 'string');
return ft.escape_path(lhs) + ft.escape_path(rhs);
};
ft.array_foldl = function (arr, func, acc) {
ft.type_assert(arr, Array);
ft.type_assert(func, Function);
for (var index = 0; index < arr.length; ++index) {
var value = arr[index];
acc = func(value, acc);
}
return acc;
};
ft.array_foldr = function (arr, func, acc) {
ft.type_assert(arr, Array);
ft.type_assert(func, Function);
for (var index = arr.length - 1; index >= 0; --index) {
var value = arr[index];
acc = func(value, acc);
}
return acc;
};
ft.array_filter = function (arr, filter) {
ft.type_assert(arr, Array);
ft.type_assert(filter, Function);
var new_arr = [];
for (var index = 0; index < arr.length; ++index) {
var value = arr[index];
if (filter(value, index)) {
new_arr.push(value);
}
}
return new_arr;
};
ft.array_foreach = function (arr, func, filter) {
ft.type_assert(arr, Array);
ft.type_assert(func, Function);
ft.type_assert_if_defined(filter, Function);
for (var index = 0; index < arr.length; ++index) {
var value = arr[index];
if (filter === undefined || filter(value, index)) {
func(value, index);
}
}
};
ft.array_reverse_foreach = function (arr, func, filter) {
ft.type_assert(arr, Array);
ft.type_assert(func, Function);
ft.type_assert_if_defined(filter, Function);
for (var index = arr.length - 1; index >= 0; --index) {
var value = arr[index];
if (filter === undefined || filter(value, index)) {
func(value, index);
}
}
};
ft.approximately = function(a, b, precision) {
ft.type_assert(a, 'number');
ft.type_assert(b, 'number');
ft.type_assert(precision, 'number');
return Math.abs(b - a) < Math.abs(precision);
};
ft.gen_unique_name = function () {
if (!ft.gen_unique_name_index) {
ft.gen_unique_name_index = 0;
}
++ft.gen_unique_name_index;
return "ft_unique_name_" + ft.gen_unique_name_index;
};
//
// document
//
var ftdoc = {};
ftdoc.prepare = function (doc) {
ft.type_assert(doc, Document);
ft.profile_function(function() { ftdoc.prepare_folders(doc); }, "Prepare folders");
ft.profile_function(function() { ftdoc.full_exit_edit_mode(doc); }, "Full exit edit mode");
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.calculate_item_scales(doc); }, "Calculate item scales");
ft.profile_function(function() { ftdoc.optimize_all_timelines(doc); }, "Optimize all timelines");
ft.profile_function(function() { ftdoc.rasterize_all_shapes(doc); }, "Rasterize all shapes");
ft.profile_function(function() { ftdoc.export_swf(doc); }, "Export swf");
};
ftdoc.get_temp = function (doc) {
if (!ftdoc.hasOwnProperty("temp")) {
ftdoc["temp"] = {
max_scales : {}
}
}
return ftdoc["temp"];
};
ftdoc.calculate_item_final_scale = function (doc, optional_item) {
ft.type_assert(doc, Document);
ft.type_assert_if_defined(optional_item, LibraryItem);
var final_scale = ft.graphics_scale;
if (optional_item && (ft.optimize_big_items || ft.optimize_small_items)) {
var item_name = optional_item.name;
var max_scales = ftdoc.get_temp(doc).max_scales;
if (max_scales.hasOwnProperty(item_name)) {
var max_scale = max_scales[item_name];
var big_item = ft.optimize_big_items && (max_scale - ft.scale_precision > 1.0);
var small_item = ft.optimize_small_items && (max_scale + ft.scale_precision < 1.0);
if (big_item || small_item) {
final_scale *= max_scale;
}
}
}
return final_scale;
};
ftdoc.convert_selection_to_bitmap = function (doc, optional_item) {
ft.type_assert(doc, Document);
ft.type_assert_if_defined(optional_item, LibraryItem);
var final_scale = ftdoc.calculate_item_final_scale(doc, optional_item);
if (ft.approximately(final_scale, 1.0, ft.scale_precision)) {
doc.convertSelectionToBitmap();
} 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);
var elem = doc.selection[0];
var elem_x = elem.x;
var elem_y = elem.y;
var elem_w = elem.width;
var elem_h = elem.height;
doc.scaleSelection(final_scale, final_scale);
doc.convertSelectionToBitmap();
doc.scaleSelection(1.0 / final_scale, 1.0 / final_scale);
var new_elem = doc.selection[0];
new_elem.x = elem_x;
new_elem.y = elem_y;
new_elem.width = elem_w;
new_elem.height = elem_h;
}
};
ftdoc.prepare_folders = function (doc) {
ft.type_assert(doc, Document);
var export_folder = ftdoc.get_export_folder(doc);
if (!FLfile.exists(export_folder) && !FLfile.createFolder(export_folder)) {
throw "Can't create document export folder ({0})!"
.format(export_folder);
}
};
ftdoc.get_export_folder = function (doc) {
ft.type_assert(doc, Document);
return ft.combine_path(
ft.escape_path(doc.pathURI),
ft.export_path_postfix + "/");
};
ftdoc.full_exit_edit_mode = function (doc) {
ft.type_assert(doc, Document);
for (var i = 0; i < 100; ++i) {
doc.exitEditMode();
}
};
ftdoc.remove_unused_items = function (doc) {
ft.type_assert(doc, Document);
var unused_items = doc.library.unusedItems;
if (unused_items && unused_items !== undefined) {
ft.array_reverse_foreach(unused_items, function(item) {
if (ft.verbose_mode) {
ft.trace_fmt("Remove unused item: {0}", item.name);
}
doc.library.deleteItem(item.name);
});
}
};
ftdoc.unlock_all_timelines = function (doc) {
ft.type_assert(doc, Document);
ftlib.unlock_all_timelines(doc, doc.library);
fttim.unlock(doc.getTimeline());
};
ftdoc.calculate_item_scales = function (doc) {
ft.type_assert(doc, Document);
var max_scales = ftdoc.get_temp(doc).max_scales;
var walk_by_timeline = function(timeline, func, acc) {
ft.type_assert(timeline, Timeline);
ft.type_assert(func, Function);
ft.array_foreach(timeline.layers, function (layer) {
ft.array_foreach(layer.frames, function (frame) {
ft.array_foreach(frame.elements, function (elem) {
walk_by_timeline(
elem.libraryItem.timeline,
func,
func(elem, acc));
}, fttim.is_symbol_instance);
}, fttim.is_keyframe);
});
};
var walk_by_library = function(lib, func, acc) {
ft.type_assert(lib, Library);
ft.type_assert(func, Function);
ft.array_foreach(lib.items, function (item) {
walk_by_timeline(item.timeline, func, acc)
}, ftlib.is_symbol_item);
};
var x_func = function(elem, acc) {
var elem_sx = elem.scaleX * acc;
var item_name = elem.libraryItem.name;
max_scales[item_name] = Math.max(
max_scales.hasOwnProperty(item_name) ? max_scales[item_name] : elem_sx,
elem_sx);
return elem_sx;
};
var y_func = function(elem, acc) {
var elem_sy = elem.scaleY * acc;
var item_name = elem.libraryItem.name;
max_scales[item_name] = Math.max(
max_scales.hasOwnProperty(item_name) ? max_scales[item_name] : elem_sy,
elem_sy);
return elem_sy;
};
walk_by_library(doc.library, x_func, 1.0);
walk_by_timeline(doc.getTimeline(), x_func, 1.0);
walk_by_library(doc.library, y_func, 1.0);
walk_by_timeline(doc.getTimeline(), y_func, 1.0);
if (ft.verbose_mode) {
for (var item_name in max_scales) {
var max_scale = max_scales.hasOwnProperty(item_name) ? max_scales[item_name] : 1.0;
if (max_scale - ft.scale_precision > 1.0) {
ft.trace_fmt("Big item for optimize: {0} - {1}", item_name, max_scale);
} else if (max_scale + ft.scale_precision < 1.0) {
ft.trace_fmt("Small item for optimize: {0} - {1}", item_name, max_scale);
}
}
}
};
ftdoc.optimize_all_timelines = function (doc) {
ft.type_assert(doc, Document);
if (ft.optimize_static_items) {
ft.profile_function(function () {
ftlib.optimize_static_items(doc, doc.library);
}, "Optimize static items");
}
if (ft.optimize_single_graphics) {
ft.profile_function(function () {
ftlib.optimize_single_graphics(doc, doc.library);
}, "Optimize single graphics");
}
};
ftdoc.rasterize_all_shapes = function (doc) {
ft.type_assert(doc, Document);
ftlib.rasterize_all_shapes(doc, doc.library);
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);
ft.trace_fmt("!!!Document!!!: '{0}' conversion complete!", doc.name);
doc.exportSWF(ftdoc.get_export_swf_path(doc));
};
ftdoc.get_export_swf_path = function (doc) {
ft.type_assert(doc, Document);
return ft.combine_path(
ftdoc.get_export_folder(doc),
doc.name + ".swf");
};
//
// library
//
var ftlib = {};
ftlib.is_folder_item = function (item) {
ft.type_assert(item, LibraryItem);
return item.itemType == "folder";
};
ftlib.is_bitmap_item = function (item) {
ft.type_assert(item, LibraryItem);
return item.itemType == "bitmap";
};
ftlib.is_symbol_item = function (item) {
ft.type_assert(item, LibraryItem);
return item.itemType == "graphic" || item.itemType == "movie clip";
};
ftlib.find_item_by_name = function (library, item_name) {
ft.type_assert(library, Library);
ft.type_assert(item_name, 'string');
for (var i = 0; i < library.items.length; ++i) {
var item = library.items[i];
if (item.name == item_name) {
return item;
}
}
return null;
};
ftlib.edit_all_items = function (doc, library, func, filter) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ft.type_assert(func, Function);
ft.type_assert_if_defined(filter, Function);
ft.array_foreach(library.items, function (item) {
if (library.editItem(item.name)) {
func(item);
doc.exitEditMode();
}
}, filter);
};
ftlib.edit_all_symbol_items = function (doc, library, func) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ft.type_assert(func, Function);
ftlib.edit_all_items(doc, library, func, ftlib.is_symbol_item);
};
ftlib.unlock_all_timelines = function (doc, library) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ftlib.edit_all_symbol_items(doc, library, function (item) {
fttim.unlock(item.timeline);
});
};
ftlib.optimize_static_items = function (doc, library) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
var replaces = {};
ft.array_reverse_foreach(library.items, function (item) {
var new_item_name = ft.gen_unique_name();
if (ftlib.bake_symbol_item(doc, library, item.name, new_item_name, 0)) {
replaces[item.name] = new_item_name;
if (ft.verbose_mode) {
ft.trace_fmt("Optimize static item: '{0}'", item.name);
}
} else {
if (ft.verbose_mode) {
ft.trace_fmt("NOT Optimize static item: '{0}'", item.name);
}
}
}, function (item) {
return ftlib.is_symbol_item(item) && fttim.is_static(item.timeline);
});
ftlib.edit_all_symbol_items(doc, library, function (item) {
fttim.replace_baked_symbols(doc, item.timeline, replaces);
});
fttim.replace_baked_symbols(doc, doc.getTimeline(), replaces);
};
ftlib.bake_symbol_item = function (doc, library, item_name, new_item_name, first_frame) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ft.type_assert(item_name, 'string');
ft.type_assert(new_item_name, 'string');
ft.type_assert(first_frame, 'number');
if (library.itemExists(new_item_name)) {
return true;
}
var item = ftlib.find_item_by_name(library, item_name);
if (!item) {
return false;
}
var item_frame_area = fttim.calculate_frame_area(item.timeline, first_frame);
var item_elems_area = fttim.calculate_elems_area(item.timeline, first_frame);
if (ft.verbose_mode) {
ft.trace_fmt(
"Library item: '{0}'\n- frame area: {1}\n- elems area: {2}",
item_name, item_frame_area, item_elems_area);
}
if (item_frame_area >= item_elems_area) {
return false;
}
if (!library.addNewItem("graphic", new_item_name)) {
return false;
}
if (!library.editItem(new_item_name)) {
library.deleteItem(new_item_name);
return false;
}
if (library.addItemToDocument({x: 0, y: 0}, item_name)) {
var new_item_elem = doc.selection[0];
new_item_elem.symbolType = "graphic";
new_item_elem.firstFrame = first_frame;
new_item_elem.setTransformationPoint({x: 0, y: 0});
new_item_elem.transformX = 0;
new_item_elem.transformY = 0;
ftdoc.convert_selection_to_bitmap(doc, item);
return true;
} else {
doc.exitEditMode();
library.deleteItem(new_item_name);
return false;
}
};
ftlib.optimize_single_graphics = function (doc, library) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ft.array_reverse_foreach(library.items, function (item) {
fttim.optimize_single_graphics(doc, item.timeline, item);
}, ftlib.is_symbol_item);
fttim.optimize_single_graphics(doc, doc.getTimeline(), null);
};
ftlib.rasterize_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.rasterize_all_shapes(doc, item.timeline);
});
};
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
//
var fttim = {};
fttim.is_shape_instance = function (elem) {
return elem.elementType == "shape";
};
fttim.is_symbol_instance = function (elem) {
return elem.elementType == "instance" && elem.instanceType == "symbol";
};
fttim.is_symbol_graphic_instance = function (elem) {
return fttim.is_symbol_instance(elem) && elem.symbolType == "graphic";
};
fttim.is_symbol_graphic_single_frame_instance = function (elem) {
return fttim.is_symbol_instance(elem) && elem.symbolType == "graphic" && elem.loop == "single frame";
};
fttim.is_symbol_movie_clip_instance = function (elem) {
return fttim.is_symbol_instance(elem) && elem.symbolType == "movie clip";
};
fttim.is_shape_frame = function (frame) {
ft.type_assert(frame, Frame);
return frame.tweenType == "shape";
};
fttim.is_keyframe = function (frame, frame_index) {
ft.type_assert(frame, Frame);
ft.type_assert(frame_index, 'number');
return frame.startFrame == frame_index;
};
fttim.is_not_guide_layer = function(layer) {
ft.type_assert(layer, Layer);
return layer.layerType != "guide";
};
fttim.unlock = function (timeline) {
ft.type_assert(timeline, Timeline);
ft.array_foreach(timeline.layers, function (layer) {
layer.locked = false;
layer.visible = true;
});
};
fttim.calculate_elems_area = function (timeline, frame_index) {
ft.type_assert(timeline, Timeline);
ft.type_assert(frame_index, 'number');
return ft.array_foldl(timeline.layers, function (layer, acc) {
if (frame_index >= 0 && frame_index < layer.frames.length) {
return ft.array_foldl(layer.frames[frame_index].elements, function (elem, acc2) {
return acc2 + Math.round(elem.width) * Math.round(elem.height);
}, acc);
} else {
return acc;
}
}, 0);
};
fttim.calculate_frame_area = function (timeline, frame_index) {
ft.type_assert(timeline, Timeline);
ft.type_assert(frame_index, 'number');
var bounds = ft.array_foldl(timeline.layers, function (layer, acc) {
if (frame_index >= 0 && frame_index < layer.frames.length) {
return ft.array_foldl(layer.frames[frame_index].elements, function (elem, acc2) {
acc2.left = Math.min(acc2.left, elem.left);
acc2.right = Math.max(acc2.right, elem.left + elem.width);
acc2.top = Math.min(acc2.top, elem.top);
acc2.bottom = Math.max(acc2.bottom, elem.top + elem.height);
return acc2;
}, acc);
} else {
return acc;
}
}, {
left: Number.POSITIVE_INFINITY,
right: Number.NEGATIVE_INFINITY,
top: Number.POSITIVE_INFINITY,
bottom: Number.NEGATIVE_INFINITY
});
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);
ft.type_assert(timeline, Timeline);
ft.array_foreach(timeline.layers, function (layer) {
ft.array_foreach(layer.frames, function (frame, frame_index) {
ft.array_foreach(frame.elements, function (elem) {
var elem_filters = elem.filters;
if (elem_filters && elem_filters !== undefined) {
ft.array_foreach(elem_filters, function (elem_filter, filter_index) {
elem_filter.blurX *= scale;
elem_filter.blurY *= scale;
});
elem.filters = elem_filters;
}
fttim.recursive_scale_filters(doc, elem.libraryItem.timeline, scale);
}, fttim.is_symbol_instance);
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
};
fttim.replace_baked_symbols = function (doc, timeline, replaces) {
ft.type_assert(doc, Document);
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;
}
ft.array_foreach(frame.elements, function (elem) {
if (replaces.hasOwnProperty(elem.libraryItem.name)) {
doc.selectNone();
doc.selection = [elem];
doc.swapElement(replaces[elem.libraryItem.name]);
}
}, fttim.is_symbol_instance);
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
};
fttim.optimize_single_graphics = function (doc, timeline, opt_item) {
ft.type_assert(doc, Document);
ft.type_assert(timeline, Timeline);
ft.array_foreach(timeline.layers, function (layer) {
ft.array_foreach(layer.frames, function (frame, frame_index) {
ft.array_foreach(frame.elements, function (elem) {
var lib_item_name = elem.libraryItem.name;
var lib_item_cache_name = "ft_cache_name_" + lib_item_name + "_" + elem.firstFrame;
if (ftlib.bake_symbol_item(doc, doc.library, lib_item_name, lib_item_cache_name, elem.firstFrame)) {
if (ft.verbose_mode) {
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 (timeline.currentFrame != frame_index) {
timeline.currentFrame = frame_index;
}
doc.selectNone();
doc.selection = [elem];
doc.swapElement(lib_item_cache_name);
doc.selection[0].firstFrame = 0;
doc.exitEditMode();
}
} else {
if (ft.verbose_mode) {
ft.trace_fmt("NOT Optimize single graphic '{0}' for frame '{1}' in '{2}'",
lib_item_name, elem.firstFrame, timeline.name);
}
}
}, function (elem) {
return fttim.is_symbol_graphic_single_frame_instance(elem) && !fttim.is_static(elem.libraryItem.timeline);
});
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
};
fttim.is_static = function (timeline) {
ft.type_assert(timeline, Timeline);
if (timeline.frameCount > 1) {
return false;
}
return ft.array_foldl(timeline.layers, function (layer, acc) {
return ft.array_foldl(layer.frames, function (frame, acc2) {
return ft.array_foldl(frame.elements, function (elem, acc3) {
return acc3 && fttim.is_symbol_instance(elem) ? elem.blendMode != "erase" && (fttim.is_symbol_graphic_single_frame_instance(elem) || fttim.is_static(elem.libraryItem.timeline)) : acc3;
}, acc2);
}, acc);
}, true);
};
fttim.rasterize_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) {
if ( ft.is_function(frame.convertToFrameByFrameAnimation) ) {
frame.convertToFrameByFrameAnimation();
} else {
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_shape_frame(frame);
});
}, fttim.is_not_guide_layer);
var any_rasterize = false;
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_instance);
if (doc.selection.length > 0) {
ftdoc.convert_selection_to_bitmap(doc, timeline.libraryItem);
doc.arrange("back");
any_rasterize = true;
}
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
if (any_rasterize && ft.verbose_mode) {
ft.trace_fmt("Rasterize vector shapes in '{0}'", timeline.name);
}
};
//
// main
//
(function () {
ft.clear_output();
fl.showIdleMessage(false);
ft.trace("- Start -");
ft.array_foreach(fl.documents, function (doc) {
try {
ft.trace_fmt("!!!Document!!!: '{0}'", doc.name);
ftdoc.prepare(doc);
} catch (e) {
ft.trace_fmt("!!!Document!!!: '{0}' conversion error: '{1}'", doc.name, e);
}
});
ft.profile_function(function () {
ft.array_foreach(fl.documents, function (doc) {
if (doc.canRevert()) {
fl.revertDocument(doc);
}
});
}, "Revert documents");
ft.trace("- Finish -");
})();
})();
var script_dir = fl.scriptURI.replace('FlashExport.jsfl', '');
fl.runScript(script_dir + 'Internal/FTBase.jsfl');
fl.runScript(script_dir + 'Internal/FTMain.jsfl', "ft_main", ft, {
graphics_scale : 1.0
});

View File

@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 4a1ba4a960de04365b94351f8c3f24d0
timeCreated: 1472974636
guid: 7646daba632cc4e63997be01363bc478
timeCreated: 1495135907
licenseType: Free
DefaultImporter:
userData:

View File

@@ -0,0 +1,5 @@
var script_dir = fl.scriptURI.replace('FlashExport_HD.jsfl', '');
fl.runScript(script_dir + 'Internal/FTBase.jsfl');
fl.runScript(script_dir + 'Internal/FTMain.jsfl', "ft_main", ft, {
graphics_scale : 2.0
});

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: da5312cca96fd439c854e5cea0aa8eb5
timeCreated: 1495136101
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,5 @@
var script_dir = fl.scriptURI.replace('FlashExport_SD.jsfl', '');
fl.runScript(script_dir + 'Internal/FTBase.jsfl');
fl.runScript(script_dir + 'Internal/FTMain.jsfl', "ft_main", ft, {
graphics_scale : 0.5
});

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 16e7c78934deb4375b76aebfee58b550
timeCreated: 1495136690
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: c77692aa8dc1141c6897240794676fd8
folderAsset: yes
timeCreated: 1495136428
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,238 @@
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) {
return typeof args[number] != 'undefined' ? args[number] : match;
});
};
}
ft = {};
ft.trace = function () {
fl.outputPanel.trace(
Array.prototype.join.call(arguments, " "));
};
ft.trace_fmt = function (format) {
var args = Array.prototype.slice.call(arguments, 1);
ft.trace(format.format.apply(format, args));
};
ft.clear_output = function () {
fl.outputPanel.clear();
};
ft.assert = function (expr, format) {
if (!expr) {
if (format === undefined) {
throw "!!!Assert!!!";
} else {
var args = Array.prototype.slice.call(arguments, 2);
throw "!!!Assert!!! " + format.format.apply(format, args);
}
}
};
ft.type_assert = function (item, type) {
var type_is_string = (typeof type === 'string');
ft.assert(
(type_is_string && typeof item === type) ||
(!type_is_string && item instanceof type),
"Type error: {0} != {1}",
typeof item,
type_is_string ? type : type.constructor.name);
};
ft.type_assert_if_defined = function (item, type) {
if (item && item !== undefined) {
ft.type_assert(item, type);
}
};
ft.is_function = function (func) {
return func && typeof(func) === 'function';
};
ft.profile_function = function (verbose, func, msg) {
ft.type_assert(verbose, 'boolean');
ft.type_assert(func, Function);
ft.type_assert(msg, 'string');
if (!ft.profile_function_stack) {
ft.profile_function_stack = [];
}
if (!ft.profile_function_level) {
ft.profile_function_level = 0;
}
var stack_index = ft.profile_function_stack.length;
ft.profile_function_stack.push({
msg: msg,
level: ft.profile_function_level,
time: 0
});
++ft.profile_function_level;
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) {
for (var i = 0; i < ft.profile_function_stack.length; ++i) {
var info = ft.profile_function_stack[i];
var ident = "-";
for (var j = 0; j < info.level; ++j) {
ident += "-";
}
if (verbose) {
ft.trace_fmt("{0} [Profile] {1} ({2}s)", ident, info.msg, info.time);
}
}
ft.profile_function_stack = [];
}
};
ft.get_call_function_time = function (func) {
ft.type_assert(func, Function);
var b_time = Date.now();
func();
var e_time = Date.now();
return (e_time - b_time) / 1000;
};
ft.escape_path = function (path) {
ft.type_assert(path, 'string');
return path.replace(/ /g, '%20');
};
ft.escape_string = function (str) {
ft.type_assert(str, 'string');
return str
.replace(/\&/g, '&amp;')
.replace(/\"/g, '&quot;')
.replace(/\'/g, '&apos;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
};
ft.combine_path = function (lhs, rhs) {
ft.type_assert(lhs, 'string');
ft.type_assert(rhs, 'string');
return ft.escape_path(lhs) + ft.escape_path(rhs);
};
ft.array_any = function (arr, func) {
ft.type_assert(arr, Array);
ft.type_assert(func, Function);
for (var index = 0; index < arr.length; ++index) {
var value = arr[index];
if (func(value)) {
return true;
}
}
return false;
};
ft.array_foldl = function (arr, func, acc) {
ft.type_assert(arr, Array);
ft.type_assert(func, Function);
for (var index = 0; index < arr.length; ++index) {
var value = arr[index];
acc = func(value, acc);
}
return acc;
};
ft.array_foldr = function (arr, func, acc) {
ft.type_assert(arr, Array);
ft.type_assert(func, Function);
for (var index = arr.length - 1; index >= 0; --index) {
var value = arr[index];
acc = func(value, acc);
}
return acc;
};
ft.array_clone = function (arr) {
ft.type_assert(arr, Array);
return arr.concat();
};
ft.array_filter = function (arr, filter) {
ft.type_assert(arr, Array);
ft.type_assert(filter, Function);
var new_arr = [];
for (var index = 0; index < arr.length; ++index) {
var value = arr[index];
if (filter(value, index)) {
new_arr.push(value);
}
}
return new_arr;
};
ft.array_merge = function (arrA, arrB) {
ft.type_assert(arrA, Array);
ft.type_assert(arrB, Array);
return arrA.concat(ft.array_filter(arrB, function (value) {
return !ft.array_contains(arrA, value);
}));
};
ft.array_contains = function (arr, elem) {
ft.type_assert(arr, Array);
return arr.indexOf(elem) >= 0;
};
ft.array_foreach = function (arr, func, filter) {
ft.type_assert(arr, Array);
ft.type_assert(func, Function);
ft.type_assert_if_defined(filter, Function);
for (var index = 0; index < arr.length; ++index) {
var value = arr[index];
if (filter === undefined || filter(value, index)) {
func(value, index);
}
}
};
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);
ft.type_assert_if_defined(filter, Function);
for (var index = arr.length - 1; index >= 0; --index) {
var value = arr[index];
if (filter === undefined || filter(value, index)) {
func(value, index);
}
}
};
ft.approximately = function(a, b, precision) {
ft.type_assert(a, 'number');
ft.type_assert(b, 'number');
ft.type_assert(precision, 'number');
return Math.abs(b - a) < Math.abs(precision);
};
ft.gen_unique_name = function () {
if (!ft.gen_unique_name_index) {
ft.gen_unique_name_index = 0;
}
++ft.gen_unique_name_index;
return "ft_unique_name_" + ft.gen_unique_name_index;
};

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 1332fd3507afd4431af5d795f220d01e
timeCreated: 1495302866
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,956 @@
ft_main = function (external_ft, opts) {
ft = external_ft;
opts = opts || {};
//
// config
//
var cfg = {
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,
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
};
//
// document
//
var ftdoc = {};
ftdoc.prepare = function (doc) {
ft.type_assert(doc, Document);
ft.profile_function(cfg.profile_mode, function() { ftdoc.prepare_folders(doc); }, "Prepare folders");
ft.profile_function(cfg.profile_mode, function() { ftdoc.full_exit_edit_mode(doc); }, "Full exit edit mode");
ft.profile_function(cfg.profile_mode, function() { ftdoc.remove_unused_items(doc); }, "Remove unused items");
ft.profile_function(cfg.profile_mode, function() { ftdoc.prepare_all_bitmaps(doc); }, "Prepare all bitmaps");
ft.profile_function(cfg.profile_mode, function() { ftdoc.unlock_all_timelines(doc); }, "Unlock all timelines");
ft.profile_function(cfg.profile_mode, function() { ftdoc.prepare_all_tweens(doc); }, "Prepare all tweens");
ft.profile_function(cfg.profile_mode, function() { ftdoc.prepare_all_groups(doc); }, "Prepare all groups");
ft.profile_function(cfg.profile_mode, function() { ftdoc.calculate_item_scales(doc); }, "Calculate item scales");
ft.profile_function(cfg.profile_mode, function() { ftdoc.optimize_all_timelines(doc); }, "Optimize all timelines");
ft.profile_function(cfg.profile_mode, function() { ftdoc.rasterize_all_shapes(doc); }, "Rasterize all shapes");
ft.profile_function(cfg.profile_mode, function() { ftdoc.export_swf(doc); }, "Export swf");
};
ftdoc.get_temp = function (doc) {
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.get_temp_ft_temp[doc.pathURI];
};
ftdoc.calculate_item_prefer_scale = function (doc, optional_item) {
ft.type_assert(doc, Document);
ft.type_assert_if_defined(optional_item, LibraryItem);
var final_scale = cfg.graphics_scale;
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 && 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);
if (big_item || small_item) {
final_scale *= max_scale;
}
}
}
return final_scale;
};
ftdoc.convert_selection_to_bitmap = function (doc, location_name, optional_item) {
ft.type_assert(doc, Document);
ft.type_assert(location_name, 'string');
ft.type_assert_if_defined(optional_item, LibraryItem);
var selection_r = doc.getSelectionRect();
var selection_w = selection_r.right - selection_r.left;
var selection_h = selection_r.bottom - selection_r.top;
var max_scale = cfg.max_convertible_selection / Math.max(selection_w, selection_h);
var prefer_scale = ftdoc.calculate_item_prefer_scale(doc, optional_item);
var final_scale = Math.min(prefer_scale, max_scale);
if (final_scale < prefer_scale) {
var down_scale = Math.floor(final_scale / prefer_scale * 1000) * 0.001;
ft.trace_fmt(
"[Warning] {0}\n" +
"- Converted element was downscaled ({1}x) to maximum allowed size ({2}px)",
location_name, down_scale, cfg.max_convertible_selection);
}
if (ft.approximately(final_scale, 1.0, cfg.scale_precision)) {
(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_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();
var elem = doc.selection[0];
elem.x -= elem_dx;
elem.y -= elem_dy;
elem.width -= elem_dw;
elem.height -= elem_dh;
})();
} else {
(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, 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_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];
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);
fttim.recursive_scale_filters(doc, wrapper_item, 1.0 / final_scale);
})();
}
};
ftdoc.prepare_folders = function (doc) {
ft.type_assert(doc, Document);
var export_folder = ftdoc.get_export_folder(doc);
if (!FLfile.exists(export_folder) && !FLfile.createFolder(export_folder)) {
throw "Can't create document export folder ({0})!"
.format(export_folder);
}
};
ftdoc.get_export_folder = function (doc) {
ft.type_assert(doc, Document);
return ft.combine_path(
ft.escape_path(doc.pathURI),
cfg.export_path_postfix + "/");
};
ftdoc.full_exit_edit_mode = function (doc) {
ft.type_assert(doc, Document);
for (var i = 0; i < 100; ++i) {
doc.exitEditMode();
}
};
ftdoc.remove_unused_items = function (doc) {
ft.type_assert(doc, Document);
var unused_items = doc.library.unusedItems;
if (unused_items && unused_items !== undefined) {
ft.array_reverse_foreach(unused_items, function(item) {
if (cfg.verbose_mode) {
ft.trace_fmt("Remove unused item: {0}", item.name);
}
doc.library.deleteItem(item.name);
});
}
};
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);
ftlib.unlock_all_timelines(doc, doc.library);
fttim.unlock_all_layers(doc, doc.getTimeline());
};
ftdoc.prepare_all_tweens = function (doc) {
ft.type_assert(doc, Document);
ftlib.prepare_all_tweens(doc, doc.library);
fttim.prepare_all_tweens(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, process_item);
}
};
ftdoc.calculate_item_scales = function (doc) {
ft.type_assert(doc, Document);
var max_scales = {};
var walk_by_timeline = function(timeline, func, acc) {
ft.type_assert(timeline, Timeline);
ft.type_assert(func, Function);
ft.array_foreach(timeline.layers, function (layer) {
ft.array_foreach(layer.frames, function (frame) {
ft.array_foreach(frame.elements, function (elem) {
walk_by_timeline(
elem.libraryItem.timeline,
func,
func(elem, acc));
}, fttim.is_symbol_instance);
}, fttim.is_keyframe);
});
};
var walk_by_library = function(lib, func, acc) {
ft.type_assert(lib, Library);
ft.type_assert(func, Function);
ft.array_foreach(lib.items, function (item) {
walk_by_timeline(item.timeline, func, acc);
}, ftlib.is_symbol_item);
};
var x_func = function(elem, acc) {
var elem_sx = elem.scaleX * acc;
var item_name = elem.libraryItem.name;
max_scales[item_name] = Math.max(
max_scales.hasOwnProperty(item_name) ? max_scales[item_name] : elem_sx,
elem_sx);
return elem_sx;
};
var y_func = function(elem, acc) {
var elem_sy = elem.scaleY * acc;
var item_name = elem.libraryItem.name;
max_scales[item_name] = Math.max(
max_scales.hasOwnProperty(item_name) ? max_scales[item_name] : elem_sy,
elem_sy);
return elem_sy;
};
walk_by_library(doc.library, x_func, 1.0);
walk_by_timeline(doc.getTimeline(), x_func, 1.0);
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) {
var max_scale = max_scales.hasOwnProperty(item_name) ? max_scales[item_name] : 1.0;
if (max_scale - cfg.scale_precision > 1.0) {
ft.trace_fmt("Big item for optimize: {0} - {1}", item_name, max_scale);
} else if (max_scale + cfg.scale_precision < 1.0) {
ft.trace_fmt("Small item for optimize: {0} - {1}", item_name, max_scale);
}
}
}
};
ftdoc.optimize_all_timelines = function (doc) {
ft.type_assert(doc, Document);
if (cfg.optimize_static_items) {
ft.profile_function(cfg.profile_mode, function () {
ftlib.optimize_static_items(doc, doc.library);
}, "Optimize static items");
}
if (cfg.optimize_single_graphics) {
ft.profile_function(cfg.profile_mode, function () {
ftlib.optimize_single_graphics(doc, doc.library);
}, "Optimize single graphics");
}
};
ftdoc.rasterize_all_shapes = function (doc) {
ft.type_assert(doc, Document);
ftlib.rasterize_all_shapes(doc, doc.library);
fttim.rasterize_all_shapes(doc, doc.getTimeline());
};
ftdoc.export_swf = function (doc) {
ft.type_assert(doc, Document);
doc.exportSWF(ftdoc.get_export_swf_path(doc));
};
ftdoc.get_export_swf_path = function (doc) {
ft.type_assert(doc, Document);
return ft.combine_path(
ftdoc.get_export_folder(doc),
doc.name + ".swf");
};
//
// library
//
var ftlib = {};
ftlib.is_folder_item = function (item) {
ft.type_assert(item, LibraryItem);
return item.itemType == "folder";
};
ftlib.is_bitmap_item = function (item) {
ft.type_assert(item, LibraryItem);
return item.itemType == "bitmap";
};
ftlib.is_symbol_item = function (item) {
ft.type_assert(item, LibraryItem);
return item.itemType == "graphic" || item.itemType == "movie clip";
};
ftlib.find_item_by_name = function (library, item_name) {
ft.type_assert(library, Library);
ft.type_assert(item_name, 'string');
for (var i = 0; i < library.items.length; ++i) {
var item = library.items[i];
if (item.name == item_name) {
return item;
}
}
return null;
};
ftlib.edit_all_items = function (doc, library, func, filter) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ft.type_assert(func, Function);
ft.type_assert_if_defined(filter, Function);
ft.array_foreach(library.items, function (item) {
if (library.editItem(item.name)) {
func(item);
doc.exitEditMode();
}
}, filter);
};
ftlib.edit_all_symbol_items = function (doc, library, func) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
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);
ft.type_assert(library, Library);
ftlib.edit_all_symbol_items(doc, library, function (item) {
fttim.unlock_all_layers(doc, item.timeline);
});
};
ftlib.optimize_static_items = function (doc, library) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
var replaces = {};
ft.array_reverse_foreach(library.items, function (item) {
var new_item_name = ft.gen_unique_name();
if (ftlib.bake_symbol_item(doc, library, item.name, new_item_name, 0)) {
replaces[item.name] = new_item_name;
if (cfg.verbose_mode) {
ft.trace_fmt("Optimize static item: '{0}'", item.name);
}
} else {
if (cfg.verbose_mode) {
ft.trace_fmt("NOT Optimize static item: '{0}'", item.name);
}
}
}, function (item) {
return ftlib.is_symbol_item(item) && fttim.is_static(item.timeline);
});
ftlib.edit_all_symbol_items(doc, library, function (item) {
fttim.replace_baked_symbols(doc, item.timeline, replaces);
});
fttim.replace_baked_symbols(doc, doc.getTimeline(), replaces);
};
ftlib.bake_symbol_item = function (doc, library, item_name, new_item_name, first_frame) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ft.type_assert(item_name, 'string');
ft.type_assert(new_item_name, 'string');
ft.type_assert(first_frame, 'number');
if (library.itemExists(new_item_name)) {
return true;
}
var item = ftlib.find_item_by_name(library, item_name);
if (!item) {
return false;
}
var item_frame_area = fttim.calculate_frame_area(item.timeline, first_frame);
var item_elems_area = fttim.calculate_elems_area(item.timeline, first_frame);
if (cfg.verbose_mode) {
ft.trace_fmt(
"Library item: '{0}'\n- frame area: {1}\n- elems area: {2}",
item_name, item_frame_area, item_elems_area);
}
if (item_frame_area >= item_elems_area) {
return false;
}
if (!library.addNewItem("graphic", new_item_name)) {
return false;
}
if (!library.editItem(new_item_name)) {
library.deleteItem(new_item_name);
return false;
}
if (library.addItemToDocument({x: 0, y: 0}, item_name)) {
var new_item_elem = doc.selection[0];
new_item_elem.symbolType = "graphic";
new_item_elem.firstFrame = first_frame;
new_item_elem.setTransformationPoint({x: 0, y: 0});
new_item_elem.transformX = 0;
new_item_elem.transformY = 0;
var location_name = "Symbol: {0}".format(item_name);
ftdoc.convert_selection_to_bitmap(doc, location_name, item);
doc.exitEditMode();
return true;
} else {
doc.exitEditMode();
library.deleteItem(new_item_name);
return false;
}
};
ftlib.optimize_single_graphics = function (doc, library) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
ft.array_reverse_foreach(library.items, function (item) {
fttim.optimize_single_graphics(doc, item.timeline, item);
}, ftlib.is_symbol_item);
fttim.optimize_single_graphics(doc, doc.getTimeline(), null);
};
ftlib.rasterize_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.rasterize_all_shapes(doc, item.timeline);
});
};
ftlib.prepare_all_tweens = 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_tweens(doc, item.timeline);
});
};
ftlib.prepare_all_groups = function (doc, library) {
ft.type_assert(doc, Document);
ft.type_assert(library, Library);
var new_symbols = [];
ftlib.edit_all_symbol_items(doc, library, function (item) {
var arr = fttim.prepare_all_groups(doc, item.timeline);
new_symbols = new_symbols.concat(arr);
});
return new_symbols;
};
//
// timeline
//
var fttim = {};
fttim.is_element_locked = function (elem) {
return elem.locked;
};
fttim.is_shape_element = function (elem) {
return elem.elementType == "shape";
};
fttim.is_group_shape_element = function (elem) {
return fttim.is_shape_element(elem) && elem.isGroup;
};
fttim.is_object_shape_element = function (elem) {
return fttim.is_shape_element(elem) && elem.isDrawingObject;
};
fttim.is_simple_shape_element = function (elem) {
return fttim.is_shape_element(elem) && !elem.isGroup && !elem.isDrawingObject;
};
fttim.is_complex_shape_element = function (elem) {
return fttim.is_shape_element(elem) && (elem.isGroup || elem.isDrawingObject);
};
fttim.is_instance_element = function (elem) {
return elem.elementType == "instance";
};
fttim.is_bitmap_instance = function (elem) {
return fttim.is_instance_element(elem) && elem.instanceType == "bitmap";
};
fttim.is_symbol_instance = function (elem) {
return fttim.is_instance_element(elem) && elem.instanceType == "symbol";
};
fttim.is_symbol_graphic_instance = function (elem) {
return fttim.is_symbol_instance(elem) && elem.symbolType == "graphic";
};
fttim.is_symbol_graphic_single_frame_instance = function (elem) {
return fttim.is_symbol_instance(elem) && elem.symbolType == "graphic" && elem.loop == "single frame";
};
fttim.is_symbol_movie_clip_instance = function (elem) {
return fttim.is_symbol_instance(elem) && elem.symbolType == "movie clip";
};
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";
};
fttim.is_motion_tween_frame = function (frame) {
ft.type_assert(frame, Frame);
return frame.tweenType == "motion";
};
fttim.is_keyframe = function (frame, frame_index) {
ft.type_assert(frame, Frame);
ft.type_assert(frame_index, 'number');
return frame.startFrame == frame_index;
};
fttim.is_not_guide_layer = function(layer) {
ft.type_assert(layer, Layer);
return layer.layerType != "guide";
};
fttim.unlock_all_layers = function (doc, timeline) {
ft.type_assert(doc, Document);
ft.type_assert(timeline, Timeline);
ft.array_foreach(timeline.layers, function (layer, layer_index) {
layer.locked = false;
layer.visible = true;
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;
try {
doc.unlockAllElements();
} catch (e) {}
}
}, fttim.is_keyframe);
});
};
fttim.calculate_elems_area = function (timeline, frame_index) {
ft.type_assert(timeline, Timeline);
ft.type_assert(frame_index, 'number');
return ft.array_foldl(timeline.layers, function (layer, acc) {
if (frame_index >= 0 && frame_index < layer.frames.length) {
return ft.array_foldl(layer.frames[frame_index].elements, function (elem, acc2) {
return acc2 + Math.round(elem.width) * Math.round(elem.height);
}, acc);
} else {
return acc;
}
}, 0);
};
fttim.calculate_frame_area = function (timeline, frame_index) {
ft.type_assert(timeline, Timeline);
ft.type_assert(frame_index, 'number');
var bounds = ft.array_foldl(timeline.layers, function (layer, acc) {
if (frame_index >= 0 && frame_index < layer.frames.length) {
return ft.array_foldl(layer.frames[frame_index].elements, function (elem, acc2) {
acc2.left = Math.min(acc2.left, elem.left);
acc2.right = Math.max(acc2.right, elem.left + elem.width);
acc2.top = Math.min(acc2.top, elem.top);
acc2.bottom = Math.max(acc2.bottom, elem.top + elem.height);
return acc2;
}, acc);
} else {
return acc;
}
}, {
left: Number.POSITIVE_INFINITY,
right: Number.NEGATIVE_INFINITY,
top: Number.POSITIVE_INFINITY,
bottom: Number.NEGATIVE_INFINITY
});
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.scale_elem_filters = function (elem, scale) {
if (fttim.is_symbol_instance(elem)) {
var elem_filters = elem.filters;
if (elem_filters && elem_filters !== undefined) {
ft.array_foreach(elem_filters, function (elem_filter, filter_index) {
elem_filter.blurX *= scale;
elem_filter.blurY *= scale;
});
elem.filters = elem_filters;
}
}
if (fttim.is_group_shape_element(elem)) {
ft.array_foreach(elem.members, function(member) {
fttim.scale_elem_filters(member, scale);
});
}
};
fttim.recursive_scale_filters = function (doc, item, scale, optional_scaled_items) {
ft.type_assert(doc, Document);
ft.type_assert(item, LibraryItem);
ft.type_assert(scale, 'number');
ft.type_assert_if_defined(optional_scaled_items, Array);
var scaled_items = optional_scaled_items || [];
if (ft.array_contains(scaled_items, item)) {
return;
} else {
scaled_items.push(item);
}
ft.array_foreach(item.timeline.layers, function (layer) {
ft.array_foreach(layer.frames, function (frame, frame_index) {
ft.array_foreach(frame.elements, function (elem) {
fttim.scale_elem_filters(elem, scale);
if (fttim.is_group_shape_element(elem)) {
ft.array_foreach(elem.members, function(member) {
fttim.recursive_scale_filters(doc, member.libraryItem, scale, scaled_items);
}, fttim.is_symbol_instance);
}
if (fttim.is_symbol_instance(elem)) {
fttim.recursive_scale_filters(doc, elem.libraryItem, scale, scaled_items);
}
});
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
};
fttim.replace_baked_symbols = function (doc, timeline, replaces) {
ft.type_assert(doc, Document);
ft.type_assert(timeline, Timeline);
ft.array_foreach(timeline.layers, function (layer) {
ft.array_foreach(layer.frames, function (frame, frame_index) {
timeline.currentFrame = frame_index;
doc.selectNone();
ft.array_foreach(frame.elements, function (elem) {
if (replaces.hasOwnProperty(elem.libraryItem.name)) {
doc.selectNone();
doc.selection = [elem];
doc.swapElement(replaces[elem.libraryItem.name]);
}
}, fttim.is_symbol_instance);
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
};
fttim.optimize_single_graphics = function (doc, timeline, opt_item) {
ft.type_assert(doc, Document);
ft.type_assert(timeline, Timeline);
ft.array_foreach(timeline.layers, function (layer) {
ft.array_foreach(layer.frames, function (frame, frame_index) {
ft.array_foreach(frame.elements, function (elem) {
var lib_item_name = elem.libraryItem.name;
var lib_item_cache_name = "ft_cache_name_" + lib_item_name + "_" + elem.firstFrame;
if (ftlib.bake_symbol_item(doc, doc.library, lib_item_name, lib_item_cache_name, elem.firstFrame)) {
if (cfg.verbose_mode) {
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 (timeline.currentFrame != frame_index) {
timeline.currentFrame = frame_index;
}
doc.selectNone();
doc.selection = [elem];
doc.swapElement(lib_item_cache_name);
doc.selection[0].firstFrame = 0;
doc.exitEditMode();
}
} else {
if (cfg.verbose_mode) {
ft.trace_fmt("NOT Optimize single graphic '{0}' for frame '{1}' in '{2}'",
lib_item_name, elem.firstFrame, timeline.name);
}
}
}, function (elem) {
return fttim.is_symbol_graphic_single_frame_instance(elem) && !fttim.is_static(elem.libraryItem.timeline);
});
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
};
fttim.is_static = function (timeline) {
ft.type_assert(timeline, Timeline);
if (timeline.frameCount > 1) {
return false;
}
return ft.array_foldl(timeline.layers, function (layer, acc) {
return ft.array_foldl(layer.frames, function (frame, acc2) {
return ft.array_foldl(frame.elements, function (elem, acc3) {
return acc3 && fttim.is_symbol_instance(elem) ? elem.blendMode != "erase" && (fttim.is_symbol_graphic_single_frame_instance(elem) || fttim.is_static(elem.libraryItem.timeline)) : acc3;
}, acc2);
}, acc);
}, true);
};
fttim.prepare_all_tweens = function (doc, timeline) {
ft.type_assert(doc, Document);
ft.type_assert(timeline, Timeline);
var is_end_of_tween = function(frame_index, frames) {
while (--frame_index >= 0) {
var frame = frames[frame_index];
if (fttim.is_keyframe(frame, frame_index)) {
return fttim.is_motion_tween_frame(frame) && frame.duration > 1;
}
}
return false;
};
ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) {
ft.array_foreach(layer.frames, function (frame, frame_index) {
if (fttim.is_shape_tween_frame(frame)) {
if (ft.is_function(frame.convertToFrameByFrameAnimation)) {
ft.trace_fmt(
"[Warning] Timeline: '{0}' Layer: '{1}' Frame: {2}\n" +
"- Shape tween strongly not recommended because it rasterized to frame-by-frame bitmap sequence.",
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) || is_end_of_tween(frame_index, layer.frames)) {
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 motion tween.",
timeline.name, layer.name, frame_index + 1);
timeline.currentFrame = frame_index;
doc.selectNone();
doc.selection = frame.elements;
doc.convertToSymbol("graphic", ft.gen_unique_name(), "top left");
}
}
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
};
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) {
ft.array_foreach(layer.frames, function (frame, frame_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();
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");
}
});
}
}, fttim.is_keyframe);
}, fttim.is_not_guide_layer);
return new_symbols;
};
fttim.rasterize_all_shapes = function (doc, timeline) {
ft.type_assert(doc, Document);
ft.type_assert(timeline, Timeline);
var rasterize_count = 0;
ft.array_reverse_foreach(timeline.layers, function (layer, layer_index) {
ft.array_foreach(layer.frames, function (frame, frame_index) {
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);
if (rasterize_count > 0 && cfg.verbose_mode) {
ft.trace_fmt("Rasterize vector shapes({0}) in '{1}'", rasterize_count, timeline.name);
}
};
//
// run
//
(function () {
ft.clear_output();
fl.showIdleMessage(false);
ft.trace("[Start]");
if (cfg.open_documents.length > 0) {
ft.profile_function(cfg.profile_mode, function () {
ft.array_foreach(cfg.open_documents, function (uri) {
fl.openDocument(uri);
});
}, "Open documents");
}
ft.profile_function(cfg.profile_mode, function() {
ft.array_foreach(fl.documents, function (doc) {
ft.profile_function(cfg.profile_mode, function() {
try {
ft.trace_fmt("[Document] '{0}' conversion started...", doc.name);
ftdoc.prepare(doc);
ft.trace_fmt("[Document] '{0}' conversion complete!", doc.name);
} catch (e) {
ft.trace_fmt("[Document] '{0}' conversion error: '{1}'", doc.name, e);
}
}, "Prepare document: '{0}'".format(doc.name));
});
}, "Prepare documents");
if (cfg.revert_after_conversion) {
ft.profile_function(cfg.profile_mode, function () {
ft.array_foreach(fl.documents, function (doc) {
if (doc.canRevert()) {
fl.revertDocument(doc);
}
});
}, "Revert documents");
}
if (cfg.close_after_conversion) {
ft.profile_function(cfg.profile_mode, function () {
ft.array_foreach(fl.documents, function (doc) {
fl.closeDocument(doc, false);
});
}, "Close documents");
}
ft.trace("[Finish]");
})();
};

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b3dd0d0b9e23846999d958ecbe82e112
timeCreated: 1495142673
licenseType: Free
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -135,37 +135,28 @@ inline swf_mask_v2f_t swf_mask_vert(swf_mask_appdata_t IN) {
inline fixed4 swf_frag(swf_v2f_t IN) : SV_Target {
fixed4 c = tex2D(_MainTex, IN.uv);
if ( _ExternalAlpha ) {
c.a *= tex2D(_AlphaTex, IN.uv).r;
}
if ( c.a > 0.01 ) {
c = c * IN.mulcolor + IN.addcolor;
}
fixed4 a = tex2D(_AlphaTex, IN.uv).r;
c.a = lerp(c.a, a.r, _ExternalAlpha);
c = c * IN.mulcolor + step(0.01, c.a) * IN.addcolor;
c.rgb *= c.a;
return c;
}
inline fixed4 swf_grab_frag(swf_grab_v2f_t IN) : SV_Target {
fixed4 c = tex2D(_MainTex, IN.uv);
if ( _ExternalAlpha ) {
c.a *= tex2D(_AlphaTex, IN.uv).r;
}
if ( c.a > 0.01 ) {
c = c * IN.mulcolor + IN.addcolor;
c = grab_blend(_GrabTexture, IN.screenpos, c);
}
fixed4 a = tex2D(_AlphaTex, IN.uv).r;
c.a = lerp(c.a, a.r, _ExternalAlpha);
c = c * IN.mulcolor + step(0.01, c.a) * IN.addcolor;
c = grab_blend(_GrabTexture, IN.screenpos, c);
c.rgb *= c.a;
return c;
}
inline fixed4 swf_mask_frag(swf_mask_v2f_t IN) : SV_Target {
fixed4 c = tex2D(_MainTex, IN.uv);
if ( _ExternalAlpha ) {
c.a *= tex2D(_AlphaTex, IN.uv).r;
}
if ( c.a < 0.01 ) {
discard;
}
fixed4 a = tex2D(_AlphaTex, IN.uv).r;
c.a = lerp(c.a, a.r, _ExternalAlpha);
clip(c.a - 0.01);
return c;
}

View File

@@ -12,11 +12,11 @@ MonoBehaviour:
m_Name: SwfSettings
m_EditorClassIdentifier:
Settings:
MaxAtlasSize: 1024
MaxAtlasSize: 2048
AtlasPadding: 1
PixelsPerUnit: 100
GenerateMipMaps: 0
AtlasPowerOfTwo: 1
AtlasForceSquare: 1
AtlasTextureFilter: 1
AtlasTextureFormat: 0
AtlasTextureFormat: 2

View File

@@ -42,7 +42,11 @@ namespace FTEditor.Editors {
}
static void ReconvertAsset(SwfAsset asset) {
asset.Atlas = null;
if ( asset.Atlas ) {
AssetDatabase.DeleteAsset(
AssetDatabase.GetAssetPath(asset.Atlas));
asset.Atlas = null;
}
EditorUtility.SetDirty(asset);
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(asset));
}
@@ -69,10 +73,6 @@ namespace FTEditor.Editors {
AllAssetsForeach(p => ApplyOverriddenSettings(p));
}
void ReconvertAllAsset() {
AllAssetsForeach(p => ReconvertAsset(p));
}
//
//
//
@@ -105,7 +105,7 @@ namespace FTEditor.Editors {
GUILayout.BeginHorizontal();
{
if ( GUILayout.Button("Reconvert") ) {
ReconvertAllAsset();
ApplyAllOverriddenSettings();
}
GUILayout.FlexibleSpace();
var default_settings = GetSettingsHolder().Settings;

View File

@@ -1,4 +1,5 @@
using UnityEngine;
using UnityEngine.Rendering;
using UnityEditor;
using System.IO;
@@ -40,6 +41,9 @@ namespace FTEditor.Editors {
var clip_go = new GameObject(clip.name);
clip_go.AddComponent<MeshFilter>();
clip_go.AddComponent<MeshRenderer>();
#if UNITY_5_6_OR_NEWER
clip_go.AddComponent<SortingGroup>();
#endif
clip_go.AddComponent<SwfClip>().clip = clip;
clip_go.AddComponent<SwfClipController>();
return clip_go;

View File

@@ -174,13 +174,14 @@ namespace FTEditor.Editors {
if ( isTargetValidForPreview ) {
_previewUtils.BeginPreview(r, background);
{
if ( targetAtlas ) {
_matPropBlock.SetTexture("_MainTex", targetAtlas);
}
_matPropBlock.SetTexture(
"_MainTex",
targetAtlas ? targetAtlas : Texture2D.whiteTexture);
if ( targetAtlasA ) {
_matPropBlock.SetTexture("_AlphaTex", targetAtlasA);
_matPropBlock.SetFloat("_ExternalAlpha", 1.0f);
} else {
_matPropBlock.SetTexture("_AlphaTex", Texture2D.whiteTexture);
_matPropBlock.SetFloat("_ExternalAlpha", 0.0f);
}
ConfigureCameraForSequence(_previewUtils.m_Camera, targetSequence);

View File

@@ -18,14 +18,15 @@ namespace FTEditor.Postprocessors {
string[] moved_assets,
string[] moved_from_asset_paths)
{
var asset_paths = imported_assets
.Where(p => Path.GetExtension(p).ToLower().Equals(".asset"));
var assets = asset_paths
var assets = imported_assets
.Where(p => Path.GetExtension(p).ToLower().Equals(".asset"))
.Select(p => AssetDatabase.LoadAssetAtPath<SwfAsset>(p))
.Where(p => !!p);
foreach ( var asset in assets ) {
.Where(p => p && !p.Atlas);
if ( assets.Any() ) {
EditorApplication.delayCall += () => {
SwfAssetProcess(asset);
foreach ( var asset in assets ) {
SwfAssetProcess(asset);
}
AssetDatabase.SaveAssets();
};
}
@@ -33,23 +34,26 @@ namespace FTEditor.Postprocessors {
static void SwfAssetProcess(SwfAsset asset) {
try {
if ( !asset.Atlas ) {
EditorUtility.SetDirty(asset);
var asset_data = SwfEditorUtils.DecompressAsset<SwfAssetData>(asset.Data, progress => {
_progressBar.UpdateProgress("decompress swf asset", progress);
});
asset.Atlas = LoadAssetAtlas(asset);
if ( asset.Atlas ) {
ConfigureAtlas(asset);
ConfigureClips(asset, asset_data);
} else {
_progressBar.UpdateTitle(asset.name);
var new_data = ConfigureBitmaps(
asset,
SwfEditorUtils.DecompressAsset<SwfAssetData>(asset.Data));
asset.Data = SwfEditorUtils.CompressAsset(new_data);
asset.Atlas = LoadAssetAtlas(asset);
if ( asset.Atlas ) {
ConfigureAtlas(asset);
ConfigureClips(asset, new_data);
}
EditorUtility.SetDirty(asset);
var new_data = ConfigureBitmaps(asset, asset_data);
asset.Data = SwfEditorUtils.CompressAsset(new_data, progress => {
_progressBar.UpdateProgress("compress swf asset", progress);
});
}
} catch ( Exception e ) {
Debug.LogErrorFormat(
"<b>[FlashTools]</b> Postprocess swf asset error: {0}",
e.Message);
asset,
"<b>[FlashTools]</b> Postprocess swf asset error: {0}\nPath: {1}",
e.Message, AssetDatabase.GetAssetPath(asset));
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(asset));
} finally {
if ( asset ) {
@@ -207,6 +211,12 @@ namespace FTEditor.Postprocessors {
#else
atlas_importer.textureFormat = SwfAtlasFormatToImporterFormat(asset.Settings.AtlasTextureFormat);
#endif
var atlas_settings = new TextureImporterSettings();
atlas_importer.ReadTextureSettings(atlas_settings);
atlas_settings.spriteMeshType = SpriteMeshType.FullRect;
atlas_importer.SetTextureSettings(atlas_settings);
atlas_importer.SaveAndReimport();
}
@@ -368,7 +378,7 @@ namespace FTEditor.Postprocessors {
var bitmap = inst != null
? FindBitmapFromAssetData(data, inst.Bitmap)
: null;
if ( bitmap != null && IsVisibleInstance(inst) ) {
if ( bitmap != null ) {
var width = bitmap.RealWidth / 20.0f;
var height = bitmap.RealHeight / 20.0f;
@@ -481,11 +491,6 @@ namespace FTEditor.Postprocessors {
return null;
}
static bool IsVisibleInstance(SwfInstanceData inst) {
var result_color = inst.ColorTrans.ApplyToColor(Color.white);
return result_color.a >= 0.01f;
}
// ---------------------------------------------------------------------
//
// UpdateAssetClips

View File

@@ -24,16 +24,18 @@ namespace FTEditor.Postprocessors {
{
var swf_paths = imported_assets
.Where(p => Path.GetExtension(p).ToLower().Equals(".swf"));
if ( swf_paths.Any() && SwfEditorUtils.IsDemoEnded ) {
var title = "Demo version";
var message =
"This demo is for evaluation purpose only. " +
"It means that you can't have more than 5 animation assets in the project.";
EditorUtility.DisplayDialog(title, message, "Ok");
} else {
foreach ( var swf_path in swf_paths ) {
if ( swf_paths.Any() ) {
if ( SwfEditorUtils.IsDemoEnded ) {
var title = "Demo version";
var message =
"This demo is for evaluation purpose only. " +
"It means that you can't have more than 5 animation assets in the project.";
EditorUtility.DisplayDialog(title, message, "Ok");
} else {
EditorApplication.delayCall += () => {
SwfFileProcess(swf_path);
foreach ( var swf_path in swf_paths ) {
SwfFileProcess(swf_path);
}
AssetDatabase.SaveAssets();
};
}
@@ -41,29 +43,40 @@ namespace FTEditor.Postprocessors {
}
static void SwfFileProcess(string swf_path) {
var swf_hash = SwfEditorUtils.GetFileHashWithVersion(swf_path);
var swf_asset_path = Path.ChangeExtension(swf_path, ".asset");
SwfEditorUtils.LoadOrCreateAsset<SwfAsset>(swf_asset_path, (swf_asset, created) => {
if ( created ) {
if ( !string.IsNullOrEmpty(swf_asset.Hash) && swf_asset.Hash == swf_hash ) {
return true;
} else if ( created ) {
var default_settings = SwfEditorUtils.GetSettingsHolder().Settings;
swf_asset.Settings = default_settings;
swf_asset.Overridden = default_settings;
}
return SafeLoadSwfAsset(swf_path, swf_asset);
return SafeLoadSwfAsset(swf_path, swf_hash, swf_asset);
});
}
static bool SafeLoadSwfAsset(string swf_path, SwfAsset swf_asset) {
static bool SafeLoadSwfAsset(string swf_path, string swf_hash, SwfAsset swf_asset) {
try {
_progressBar.UpdateTitle(Path.GetFileName(swf_path));
var new_data = LoadSwfAssetData(swf_path);
swf_asset.Data = SwfEditorUtils.CompressAsset(new_data);
swf_asset.Atlas = null;
var new_data = LoadSwfAssetData(swf_path);
swf_asset.Data = SwfEditorUtils.CompressAsset(new_data, progress => {
_progressBar.UpdateProgress("swf asset compression", progress);
});
swf_asset.Hash = swf_hash;
if ( swf_asset.Atlas ) {
AssetDatabase.DeleteAsset(
AssetDatabase.GetAssetPath(swf_asset.Atlas));
swf_asset.Atlas = null;
}
EditorUtility.SetDirty(swf_asset);
return true;
} catch ( Exception e ) {
Debug.LogErrorFormat(
"<b>[FlashTools]</b> Parsing swf error: {0}",
e.Message);
AssetDatabase.LoadMainAssetAtPath(swf_path),
"<b>[FlashTools]</b> Parsing swf error: {0}\nPath: {1}",
e.Message, swf_path);
return false;
} finally {
_progressBar.HideProgress();
@@ -97,9 +110,6 @@ namespace FTEditor.Postprocessors {
.Where(p => !string.IsNullOrEmpty(p.ExportName))
.ToList();
for ( var i = 0; i < sprite_defs.Count; ++i ) {
_progressBar.UpdateProgress(
"load swf symbols",
(float)(i + 1) / sprite_defs.Count);
var def = sprite_defs[i];
var name = def.ExportName;
var tags = def.ControlTags.Tags;
@@ -117,6 +127,9 @@ namespace FTEditor.Postprocessors {
});
var symbol_frames = new List<SwfFrameData>();
while ( executer.NextFrame(tags, disp_lst) ) {
_progressBar.UpdateProgress(
string.Format("swf symbols loading ({0})", symbol_name),
(float)(executer.CurrentTag + 1) / tags.Count);
symbol_frames.Add(LoadSymbolFrameData(library, disp_lst));
}
return new SwfSymbolData{
@@ -369,6 +382,8 @@ namespace FTEditor.Postprocessors {
return new SwfBlendModeData(SwfBlendModeData.Types.Subtract);
case SwfBlendMode.Mode.Invert:
return new SwfBlendModeData(SwfBlendModeData.Types.Invert);
case SwfBlendMode.Mode.Overlay:
return new SwfBlendModeData(SwfBlendModeData.Types.Overlay);
case SwfBlendMode.Mode.Hardlight:
return new SwfBlendModeData(SwfBlendModeData.Types.Hardlight);
default:

View File

@@ -154,14 +154,6 @@ namespace FTEditor {
public SwfVec4Data mulColor;
public SwfVec4Data addColor;
public Color ApplyToColor(Color color) {
return new Color(
Mathf.Clamp01(color.r * mulColor.x + addColor.x),
Mathf.Clamp01(color.g * mulColor.y + addColor.y),
Mathf.Clamp01(color.b * mulColor.z + addColor.z),
Mathf.Clamp01(color.a * mulColor.w + addColor.w));
}
public static SwfColorTransData identity {
get {
return new SwfColorTransData{

View File

@@ -4,6 +4,7 @@ using UnityEditor;
using System.IO;
using System.Linq;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Runtime.Serialization.Formatters.Binary;
using Ionic.Zlib;
@@ -184,14 +185,14 @@ namespace FTEditor {
.ToArray();
}
public static byte[] CompressAsset<T>(T asset) {
public static byte[] CompressAsset<T>(T asset, System.Action<float> progress_act) {
var bytes = AssetToBytes(asset);
var result = ZlibStream.CompressBuffer(bytes);
var result = CompressBuffer(bytes, progress_act);
return result;
}
public static T DecompressAsset<T>(byte[] data) {
var bytes = ZlibStream.UncompressBuffer(data);
public static T DecompressAsset<T>(byte[] data, System.Action<float> progress_act) {
var bytes = DecompressBuffer(data, progress_act);
var result = BytesToAsset<T>(bytes);
return result;
}
@@ -211,6 +212,41 @@ namespace FTEditor {
}
}
static byte[] CompressBuffer(byte[] bytes, System.Action<float> progress_act) {
using ( var output = new MemoryStream() ) {
using ( var compressor = new ZlibStream(output, CompressionMode.Compress, CompressionLevel.Default) ) {
var n = 0;
while ( n < bytes.Length ) {
var count = Mathf.Min(4 * 1024, bytes.Length - n);
compressor.Write(bytes, n, count);
n += count;
if ( progress_act != null ) {
progress_act((float)n / bytes.Length);
}
}
}
return output.ToArray();
}
}
static byte[] DecompressBuffer(byte[] compressed_bytes, System.Action<float> progress_act) {
using ( var input = new MemoryStream(compressed_bytes) ) {
using ( var decompressor = new ZlibStream(input, CompressionMode.Decompress) ) {
using ( var output = new MemoryStream() ) {
int n;
var buffer = new byte[4 * 1024];
while ( (n = decompressor.Read(buffer, 0, buffer.Length)) != 0 ) {
output.Write(buffer, 0, n);
if ( progress_act != null ) {
progress_act((float)decompressor.Position / input.Length);
}
}
return output.ToArray();
}
}
}
}
// ---------------------------------------------------------------------
//
// Demo
@@ -259,6 +295,32 @@ namespace FTEditor {
}
}
// ---------------------------------------------------------------------
//
// FileHash
//
// ---------------------------------------------------------------------
public static string GetFileHashWithVersion(string path) {
return string.Format(
"{0}={1}",
GetFileHash(path), SwfVersion.AsString);
}
static string GetFileHash(string path) {
try {
using ( var sha256 = SHA256.Create() ) {
var file_bytes = File.ReadAllBytes(path);
var hash_bytes = sha256.ComputeHash(file_bytes);
return
System.Convert.ToBase64String(hash_bytes) +
file_bytes.LongLength.ToString();
}
} catch ( System.Exception ) {
return string.Empty;
}
}
// ---------------------------------------------------------------------
//
// Menu
@@ -286,6 +348,21 @@ namespace FTEditor {
}
}
[MenuItem("Tools/FlashTools/Reconvert all swf assets")]
static void Tools_FlashTools_ReconvertAllSwfAssets() {
Tools_FlashTools_ReimportAllSwfFiles();
var swf_assets = GetAllSwfAssets();
foreach ( var swf_asset in swf_assets ) {
if ( swf_asset.Atlas ) {
AssetDatabase.DeleteAsset(
AssetDatabase.GetAssetPath(swf_asset.Atlas));
swf_asset.Atlas = null;
}
EditorUtility.SetDirty(swf_asset);
AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(swf_asset));
}
}
[MenuItem("Tools/FlashTools/Pregenerate all materials")]
static void PregenerateAllMaterials() {
var blend_modes = System.Enum.GetValues(typeof(SwfBlendModeData.Types));
@@ -299,6 +376,10 @@ namespace FTEditor {
SwfMaterialCache.GetDecrMaskMaterial();
}
static SwfAsset[] GetAllSwfAssets() {
return SwfEditorUtils.LoadAllAssetsDBByFilter<SwfAsset>("t:SwfAsset");
}
static string[] GetAllSwfFilePaths() {
return AssetDatabase.GetAllAssetPaths()
.Where(p => Path.GetExtension(p).ToLower().Equals(".swf"))

View File

@@ -71,38 +71,38 @@
// Fonts and Text
// -----------------------------
DefineFont = 10,
DefineFontInfo = 13,
DefineFontInfo2 = 62,
DefineFont2 = 48,
DefineFont3 = 75,
DefineFontAlignZones = 73,
DefineFontName = 88,
DefineText = 11,
DefineText2 = 33,
DefineEditText = 37,
CSMTextSettings = 74,
DefineFont4 = 91,
DefineFont = 10, // Unsupported
DefineFontInfo = 13, // Unsupported
DefineFontInfo2 = 62, // Unsupported
DefineFont2 = 48, // Unsupported
DefineFont3 = 75, // Unsupported
DefineFontAlignZones = 73, // Unsupported
DefineFontName = 88, // Unsupported
DefineText = 11, // Unsupported
DefineText2 = 33, // Unsupported
DefineEditText = 37, // Unsupported
CSMTextSettings = 74, // Unsupported
DefineFont4 = 91, // Unsupported
// -----------------------------
// Sounds
// -----------------------------
//DefineSound = 14,
//StartSound = 15,
//StartSound2 = 89,
//SoundStreamHead = 18,
//SoundStreamHead2 = 45,
//SoundStreamBlock = 19,
DefineSound = 14, // Unsupported
StartSound = 15, // Unsupported
StartSound2 = 89, // Unsupported
SoundStreamHead = 18, // Unsupported
SoundStreamHead2 = 45, // Unsupported
SoundStreamBlock = 19, // Unsupported
// -----------------------------
// Buttons
// -----------------------------
//DefineButton = 7,
//DefineButton2 = 34,
//DefineButtonCxform = 23,
//DefineButtonSound = 17,
DefineButton = 7, // Unsupported
DefineButton2 = 34, // Unsupported
DefineButtonCxform = 23, // Unsupported
DefineButtonSound = 17, // Unsupported
// -----------------------------
// Sprites and Movie Clips
@@ -212,6 +212,18 @@
case (int)SwfTagType.DefineEditText: return UnsupportedTag.Create(SwfTagType.DefineEditText);
case (int)SwfTagType.CSMTextSettings: return UnsupportedTag.Create(SwfTagType.CSMTextSettings);
case (int)SwfTagType.DefineFont4: return UnsupportedTag.Create(SwfTagType.DefineFont4);
// Sounds
case (int)SwfTagType.DefineSound: return UnsupportedTag.Create(SwfTagType.DefineSound);
case (int)SwfTagType.StartSound: return UnsupportedTag.Create(SwfTagType.StartSound);
case (int)SwfTagType.StartSound2: return UnsupportedTag.Create(SwfTagType.StartSound2);
case (int)SwfTagType.SoundStreamHead: return UnsupportedTag.Create(SwfTagType.SoundStreamHead);
case (int)SwfTagType.SoundStreamHead2: return UnsupportedTag.Create(SwfTagType.SoundStreamHead2);
case (int)SwfTagType.SoundStreamBlock: return UnsupportedTag.Create(SwfTagType.SoundStreamBlock);
// Buttons
case (int)SwfTagType.DefineButton: return UnsupportedTag.Create(SwfTagType.DefineButton);
case (int)SwfTagType.DefineButton2: return UnsupportedTag.Create(SwfTagType.DefineButton2);
case (int)SwfTagType.DefineButtonCxform: return UnsupportedTag.Create(SwfTagType.DefineButtonCxform);
case (int)SwfTagType.DefineButtonSound: return UnsupportedTag.Create(SwfTagType.DefineButtonSound);
// Sprites and Movie Clips
case (int)SwfTagType.DefineSprite: return DefineSpriteTag.Create(reader);
// Video

View File

@@ -4,6 +4,10 @@ using System.Collections.Generic;
namespace FTRuntime.Internal {
static class SwfUtils {
//
// UnpackUV/UnpackFColorFromUInts
//
const ushort UShortMax = ushort.MaxValue;
const float FColorPrecision = 1.0f / 512.0f;
const float InvFColorPrecision = 1.0f / FColorPrecision;
@@ -24,7 +28,51 @@ namespace FTRuntime.Internal {
}
//
// Shader properties
//
public static int TintShaderProp {
get {
ShaderPropsCache.LazyInitialize();
return ShaderPropsCache.TintShaderProp;
}
}
public static int MainTexShaderProp {
get {
ShaderPropsCache.LazyInitialize();
return ShaderPropsCache.MainTexShaderProp;
}
}
public static int AlphaTexShaderProp {
get {
ShaderPropsCache.LazyInitialize();
return ShaderPropsCache.AlphaTexShaderProp;
}
}
public static int ExternalAlphaShaderProp {
get {
ShaderPropsCache.LazyInitialize();
return ShaderPropsCache.ExternalAlphaShaderProp;
}
}
//
// GetComponent<T>
//
public static T GetComponent<T>(GameObject obj, bool allow_create) where T : Component {
var comp = obj.GetComponent<T>();
if ( allow_create && !comp ) {
comp = obj.AddComponent<T>();
}
return comp;
}
//
// FillGeneratedMesh
//
public static void FillGeneratedMesh(Mesh mesh, SwfClipAsset.MeshData mesh_data) {
@@ -52,8 +100,28 @@ namespace FTRuntime.Internal {
}
}
// ShaderPropsCache
static class ShaderPropsCache {
public static int TintShaderProp = 0;
public static int MainTexShaderProp = 0;
public static int AlphaTexShaderProp = 0;
public static int ExternalAlphaShaderProp = 0;
static bool _initialized = false;
public static void LazyInitialize() {
if ( !_initialized ) {
_initialized = true;
TintShaderProp = Shader.PropertyToID("_Tint");
MainTexShaderProp = Shader.PropertyToID("_MainTex");
AlphaTexShaderProp = Shader.PropertyToID("_AlphaTex");
ExternalAlphaShaderProp = Shader.PropertyToID("_ExternalAlpha");
}
}
}
//
//
// GeneratedMeshCache
//
static class GeneratedMeshCache {

View File

@@ -6,6 +6,8 @@ namespace FTRuntime {
public class SwfAsset : ScriptableObject {
[HideInInspector]
public byte[] Data;
[HideInInspector]
public string Hash;
[SwfReadOnly]
public Texture2D Atlas;
[HideInInspector]
@@ -15,6 +17,7 @@ namespace FTRuntime {
void Reset() {
Data = new byte[0];
Hash = string.Empty;
Atlas = null;
Settings = SwfSettingsData.identity;
Overridden = SwfSettingsData.identity;

View File

@@ -1,17 +1,25 @@
using UnityEngine;
using UnityEngine.Rendering;
using FTRuntime.Internal;
namespace FTRuntime {
[ExecuteInEditMode, DisallowMultipleComponent]
#if UNITY_5_6_OR_NEWER
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer), typeof(SortingGroup))]
#else
[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
#endif
public class SwfClip : MonoBehaviour {
MeshFilter _meshFilter = null;
MeshRenderer _meshRenderer = null;
MeshFilter _meshFilter = null;
MeshRenderer _meshRenderer = null;
#if UNITY_5_6_OR_NEWER
SortingGroup _sortingGroup = null;
#endif
bool _dirtyMesh = true;
SwfClipAsset.Sequence _curSequence = null;
MaterialPropertyBlock _curPropBlock = null;
bool _dirtyMesh = true;
SwfClipAsset.Sequence _curSequence = null;
MaterialPropertyBlock _curPropBlock = null;
// ---------------------------------------------------------------------
//
@@ -182,6 +190,34 @@ namespace FTRuntime {
}
}
/// <summary>
/// Gets the current frame mesh bounding volume in local space
/// (Since 1.3.8)
/// </summary>
/// <value>The bounding volume in local space</value>
public Bounds currentLocalBounds {
get {
var frame = GetCurrentBakedFrame();
return frame != null
? frame.CachedMesh.bounds
: new Bounds();
}
}
/// <summary>
/// Gets the current frame mesh bounding volume in world space
/// (Since 1.3.8)
/// </summary>
/// <value>The bounding volume in world space</value>
public Bounds currentWorldBounds {
get {
Internal_UpdateMesh();
return _meshRenderer
? _meshRenderer.bounds
: new Bounds();
}
}
// ---------------------------------------------------------------------
//
// Functions
@@ -247,7 +283,7 @@ namespace FTRuntime {
//
// ---------------------------------------------------------------------
internal void Internal_LateUpdate() {
internal void Internal_UpdateMesh() {
if ( _meshFilter && _meshRenderer && _dirtyMesh ) {
var baked_frame = GetCurrentBakedFrame();
if ( baked_frame != null ) {
@@ -265,7 +301,7 @@ namespace FTRuntime {
/// Update all animation properties (for internal use only)
/// </summary>
public void Internal_UpdateAllProperties() {
ClearCache();
ClearCache(false);
ChangeTint();
ChangeClip();
ChangeSequence();
@@ -273,9 +309,12 @@ namespace FTRuntime {
ChangeSortingProperties();
}
void ClearCache() {
_meshFilter = GetComponent<MeshFilter>();
_meshRenderer = GetComponent<MeshRenderer>();
void ClearCache(bool allow_to_create_components) {
_meshFilter = SwfUtils.GetComponent<MeshFilter> (gameObject, allow_to_create_components);
_meshRenderer = SwfUtils.GetComponent<MeshRenderer>(gameObject, allow_to_create_components);
#if UNITY_5_6_OR_NEWER
_sortingGroup = SwfUtils.GetComponent<SortingGroup>(gameObject, allow_to_create_components);
#endif
_dirtyMesh = true;
_curSequence = null;
_curPropBlock = null;
@@ -336,6 +375,12 @@ namespace FTRuntime {
_meshRenderer.sortingOrder = sortingOrder;
_meshRenderer.sortingLayerName = sortingLayer;
}
#if UNITY_5_6_OR_NEWER
if ( _sortingGroup ) {
_sortingGroup.sortingOrder = sortingOrder;
_sortingGroup.sortingLayerName = sortingLayer;
}
#endif
}
void UpdatePropBlock() {
@@ -344,18 +389,19 @@ namespace FTRuntime {
_curPropBlock = new MaterialPropertyBlock();
}
_meshRenderer.GetPropertyBlock(_curPropBlock);
_curPropBlock.SetColor("_Tint", tint);
_curPropBlock.SetColor(SwfUtils.TintShaderProp, tint);
var sprite = clip ? clip.Sprite : null;
var atlas = sprite && sprite.texture ? sprite.texture : Texture2D.whiteTexture;
var atlasA = sprite ? sprite.associatedAlphaSplitTexture : null;
if ( atlas ) {
_curPropBlock.SetTexture("_MainTex", atlas);
}
_curPropBlock.SetTexture(
SwfUtils.MainTexShaderProp,
atlas ? atlas : Texture2D.whiteTexture);
if ( atlasA ) {
_curPropBlock.SetTexture("_AlphaTex", atlasA);
_curPropBlock.SetFloat("_ExternalAlpha", 1.0f);
_curPropBlock.SetTexture(SwfUtils.AlphaTexShaderProp, atlasA);
_curPropBlock.SetFloat(SwfUtils.ExternalAlphaShaderProp, 1.0f);
} else {
_curPropBlock.SetFloat("_ExternalAlpha", 0.0f);
_curPropBlock.SetTexture(SwfUtils.AlphaTexShaderProp, Texture2D.whiteTexture);
_curPropBlock.SetFloat(SwfUtils.ExternalAlphaShaderProp, 0.0f);
}
_meshRenderer.SetPropertyBlock(_curPropBlock);
}
@@ -386,11 +432,9 @@ namespace FTRuntime {
//
// ---------------------------------------------------------------------
void Awake() {
Internal_UpdateAllProperties();
}
void Start() {
ClearCache(true);
Internal_UpdateAllProperties();
EmitChangeEvents(true, true, true);
}

View File

@@ -42,6 +42,7 @@ namespace FTRuntime {
get {
if ( !_cachedMesh ) {
_cachedMesh = new Mesh();
_cachedMesh.hideFlags = HideFlags.DontSave;
SwfUtils.FillGeneratedMesh(_cachedMesh, MeshData);
}
return _cachedMesh;

View File

@@ -309,18 +309,23 @@ namespace FTRuntime {
// ---------------------------------------------------------------------
internal void Internal_Update(float scaled_dt, float unscaled_dt) {
if ( isPlaying ) {
_tickTimer += useUnscaledDt ? unscaled_dt : scaled_dt;
do {
var frame_rate = clip ? clip.frameRate * rateScale : 0.0f;
var frame_time = frame_rate > 0.0f ? 1.0f / frame_rate : 0.0f;
if ( frame_time > 0.0f && frame_time <= _tickTimer ) {
_tickTimer -= frame_time;
while ( isPlaying && clip ) {
var dt = useUnscaledDt ? unscaled_dt : scaled_dt;
var frame_rate = clip.frameRate * rateScale;
if ( dt > 0.0f && frame_rate > 0.0f ) {
_tickTimer += frame_rate * dt;
if ( _tickTimer >= 1.0f ) {
var unused_dt = (_tickTimer - 1.0f) / frame_rate;
_tickTimer = 0.0f;
TimerTick();
scaled_dt = unused_dt * (scaled_dt / dt);
unscaled_dt = unused_dt * (unscaled_dt / dt);
} else {
break;
}
} while ( isPlaying );
} else {
break;
}
}
}

View File

@@ -262,7 +262,7 @@ namespace FTRuntime {
for ( int i = 0, e = _clips.Count; i < e; ++i ) {
var clip = _clips[i];
if ( clip ) {
clip.Internal_LateUpdate();
clip.Internal_UpdateMesh();
}
}
}

View File

@@ -30,14 +30,14 @@ namespace FTRuntime {
public static SwfSettingsData identity {
get {
return new SwfSettingsData{
MaxAtlasSize = 1024,
MaxAtlasSize = 2048,
AtlasPadding = 1,
PixelsPerUnit = 100.0f,
GenerateMipMaps = false,
AtlasPowerOfTwo = true,
AtlasForceSquare = true,
AtlasTextureFilter = AtlasFilter.Bilinear,
AtlasTextureFormat = AtlasFormat.AutomaticCompressed};
AtlasTextureFormat = AtlasFormat.AutomaticTruecolor};
}
}

View File

@@ -0,0 +1,15 @@
namespace FTRuntime {
public static class SwfVersion {
public const int Major = 1;
public const int Minor = 3;
public const int Revision = 9;
public static string AsString {
get {
return string.Format(
"{0}.{1}.{2}",
Major, Minor, Revision);
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More