@urso/core 0.3.9 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/.babelrc +11 -11
  2. package/README.md +10 -10
  3. package/build/js/index.js +1 -1
  4. package/build/js/index.js.LICENSE.txt +29 -29
  5. package/package.json +51 -51
  6. package/src/js/app.js +77 -77
  7. package/src/js/components/_info.js +8 -8
  8. package/src/js/components/base/_info.js +3 -3
  9. package/src/js/components/base/controller.js +78 -78
  10. package/src/js/components/debug/_info.js +7 -7
  11. package/src/js/components/debug/controller.js +38 -38
  12. package/src/js/components/debug/coords.js +23 -23
  13. package/src/js/components/debug/fps.js +34 -34
  14. package/src/js/components/debug/template.js +55 -55
  15. package/src/js/components/debug/timescale.js +60 -60
  16. package/src/js/components/deviceRotate/_info.js +3 -3
  17. package/src/js/components/deviceRotate/controller.js +86 -86
  18. package/src/js/components/fullscreen/_info.js +6 -6
  19. package/src/js/components/fullscreen/android.js +104 -104
  20. package/src/js/components/fullscreen/controller.js +64 -64
  21. package/src/js/components/fullscreen/desktop.js +49 -49
  22. package/src/js/components/fullscreen/ios.js +111 -111
  23. package/src/js/components/loader/_info.js +4 -4
  24. package/src/js/components/loader/controller.js +66 -66
  25. package/src/js/components/loader/template.js +70 -70
  26. package/src/js/components/soundInitialPopup/_info.js +3 -3
  27. package/src/js/components/soundInitialPopup/controller.js +42 -42
  28. package/src/js/components/soundInitialPopup/template.js +109 -109
  29. package/src/js/components/stateDriven/_info.js +3 -3
  30. package/src/js/components/stateDriven/controller.js +118 -118
  31. package/src/js/config/load.js +5 -5
  32. package/src/js/config/main.js +10 -10
  33. package/src/js/extra/_info.js +22 -22
  34. package/src/js/extra/browserEvents.js +38 -38
  35. package/src/js/extra/setTimeout.js +7 -7
  36. package/src/js/index.js +8 -8
  37. package/src/js/lib/_info.js +13 -13
  38. package/src/js/lib/cache.js +105 -105
  39. package/src/js/lib/composition.js +85 -89
  40. package/src/js/lib/device.js +1286 -1276
  41. package/src/js/lib/helper.js +539 -539
  42. package/src/js/lib/loader.js +127 -127
  43. package/src/js/lib/localData.js +15 -15
  44. package/src/js/lib/logger.js +22 -22
  45. package/src/js/lib/math.js +35 -35
  46. package/src/js/lib/objectPool.js +54 -54
  47. package/src/js/lib/time.js +18 -18
  48. package/src/js/lib/tween.js +147 -147
  49. package/src/js/modules/_info.js +11 -11
  50. package/src/js/modules/assets/_info.js +7 -7
  51. package/src/js/modules/assets/baseModel.js +18 -18
  52. package/src/js/modules/assets/config.js +37 -35
  53. package/src/js/modules/assets/controller.js +46 -39
  54. package/src/js/modules/assets/models/_info.js +11 -11
  55. package/src/js/modules/assets/models/atlas.js +8 -8
  56. package/src/js/modules/assets/models/audiosprite.js +27 -27
  57. package/src/js/modules/assets/models/bitmapFont.js +8 -8
  58. package/src/js/modules/assets/models/container.js +16 -16
  59. package/src/js/modules/assets/models/font.js +8 -8
  60. package/src/js/modules/assets/models/image.js +13 -13
  61. package/src/js/modules/assets/models/json.js +8 -8
  62. package/src/js/modules/assets/models/sound.js +14 -14
  63. package/src/js/modules/assets/models/spine.js +14 -14
  64. package/src/js/modules/assets/service.js +356 -353
  65. package/src/js/modules/instances/_info.js +3 -3
  66. package/src/js/modules/instances/controller.js +251 -219
  67. package/src/js/modules/logic/_info.js +4 -4
  68. package/src/js/modules/logic/config/_info.js +2 -2
  69. package/src/js/modules/logic/config/sounds.js +23 -23
  70. package/src/js/modules/logic/controller.js +48 -48
  71. package/src/js/modules/logic/sounds.js +96 -96
  72. package/src/js/modules/objects/_info.js +11 -11
  73. package/src/js/modules/objects/baseModel.js +171 -161
  74. package/src/js/modules/objects/cache.js +99 -99
  75. package/src/js/modules/objects/controller.js +131 -121
  76. package/src/js/modules/objects/create.js +234 -230
  77. package/src/js/modules/objects/find.js +140 -140
  78. package/src/js/modules/objects/models/_info.js +24 -24
  79. package/src/js/modules/objects/models/atlasImage.js +50 -50
  80. package/src/js/modules/objects/models/bitmapText.js +23 -23
  81. package/src/js/modules/objects/models/button.js +184 -184
  82. package/src/js/modules/objects/models/buttonComposite.js +35 -35
  83. package/src/js/modules/objects/models/checkbox.js +96 -96
  84. package/src/js/modules/objects/models/collection.js +54 -54
  85. package/src/js/modules/objects/models/component.js +44 -44
  86. package/src/js/modules/objects/models/container.js +19 -19
  87. package/src/js/modules/objects/models/emitter.js +54 -54
  88. package/src/js/modules/objects/models/graphics.js +38 -38
  89. package/src/js/modules/objects/models/group.js +19 -19
  90. package/src/js/modules/objects/models/hitArea.js +104 -104
  91. package/src/js/modules/objects/models/image.js +34 -34
  92. package/src/js/modules/objects/models/imagesAnimation.js +113 -113
  93. package/src/js/modules/objects/models/mask.js +38 -38
  94. package/src/js/modules/objects/models/scrollbox.js +61 -61
  95. package/src/js/modules/objects/models/slider.js +223 -223
  96. package/src/js/modules/objects/models/spine.js +89 -89
  97. package/src/js/modules/objects/models/text.js +38 -38
  98. package/src/js/modules/objects/models/textInput.js +66 -66
  99. package/src/js/modules/objects/models/toggle.js +178 -178
  100. package/src/js/modules/objects/models/world.js +19 -19
  101. package/src/js/modules/objects/propertyAdapter.js +421 -421
  102. package/src/js/modules/objects/proxy.js +182 -182
  103. package/src/js/modules/objects/styles.js +116 -116
  104. package/src/js/modules/observer/_info.js +4 -4
  105. package/src/js/modules/observer/controller.js +99 -99
  106. package/src/js/modules/observer/events.js +38 -38
  107. package/src/js/modules/scenes/_info.js +8 -8
  108. package/src/js/modules/scenes/controller.js +46 -42
  109. package/src/js/modules/scenes/model.js +35 -35
  110. package/src/js/modules/scenes/pixiWrapper.js +202 -202
  111. package/src/js/modules/scenes/resolutions.js +172 -176
  112. package/src/js/modules/scenes/resolutionsConfig.js +73 -73
  113. package/src/js/modules/scenes/service.js +105 -92
  114. package/src/js/modules/soundManager/_info.js +3 -3
  115. package/src/js/modules/soundManager/controller.js +99 -99
  116. package/src/js/modules/soundManager/soundSprite.js +202 -202
  117. package/src/js/modules/statesManager/_info.js +12 -12
  118. package/src/js/modules/statesManager/action.js +60 -60
  119. package/src/js/modules/statesManager/actions/_info.js +3 -3
  120. package/src/js/modules/statesManager/all.js +23 -23
  121. package/src/js/modules/statesManager/configStates.js +71 -71
  122. package/src/js/modules/statesManager/controller.js +170 -170
  123. package/src/js/modules/statesManager/functionsStorage.js +82 -82
  124. package/src/js/modules/statesManager/helper.js +27 -27
  125. package/src/js/modules/statesManager/race.js +75 -75
  126. package/src/js/modules/statesManager/sequence.js +47 -47
  127. package/src/js/modules/template/_info.js +6 -6
  128. package/src/js/modules/template/controller.js +28 -28
  129. package/src/js/modules/template/model.js +11 -11
  130. package/src/js/modules/template/service.js +137 -125
  131. package/src/js/modules/template/types.js +44 -44
  132. package/src/js/modules/transport/_info.js +8 -8
  133. package/src/js/modules/transport/baseConnectionType.js +24 -24
  134. package/src/js/modules/transport/config.js +13 -13
  135. package/src/js/modules/transport/connectionTypes/_info.js +3 -3
  136. package/src/js/modules/transport/connectionTypes/websocket.js +74 -74
  137. package/src/js/modules/transport/connectionTypes/xhr.js +44 -44
  138. package/src/js/modules/transport/controller.js +48 -48
  139. package/src/js/modules/transport/decorator.js +17 -17
  140. package/src/js/modules/transport/service.js +153 -153
  141. package/src/js/templates/_info.js +4 -4
  142. package/src/js/templates/groups/_info.js +1 -1
  143. package/src/js/templates/scenes/_info.js +1 -1
  144. package/webpack.config.js +47 -47
@@ -1,353 +1,356 @@
1
- class ModulesAssetsService {
2
- constructor() {
3
- this.singleton = true;
4
-
5
- this.assets = {};
6
-
7
- this._currentQuality = 'auto';
8
- this._addedAssetsCache = [];
9
- };
10
-
11
- getQuality() {
12
- return this._currentQuality;
13
- }
14
-
15
- updateQuality() {
16
- this._currentQuality = this._detectQuality();
17
- Urso.addInstancesMode(this._currentQuality + 'Quality');
18
- }
19
-
20
- sortAssets(assets) {
21
- this.assets[this.getInstance('Config').loadingGroups.initial] = [];
22
-
23
- if (Array.isArray(assets))
24
- for (let asset of assets)
25
- this._addAsset(asset);
26
- else
27
- this._addAsset(assets);
28
- }
29
-
30
- startLoad(callback) {
31
- this.loadGroup(
32
- this.getInstance('Config').loadingGroups.initial,
33
- (() => { callback(); this._continueLazyLoad(); }).bind(this)
34
- )
35
- }
36
-
37
- loadUpdate(param) {
38
- Urso.scenes.loadUpdate(Math.floor(param.progress));
39
- }
40
-
41
- loadGroup(group, callback) {
42
- if (!this.assets[group])
43
- return Urso.logger.error('ModulesAssetsService group error, no assets:' + group + ' Check ModulesAssetsConfig please');
44
-
45
- //we need load and parse atlases at first (!)
46
- this._loadGroupAtlases(group, () => { this._loadGroupRestAssets(group, callback) });
47
- }
48
-
49
- _loadGroupAtlases(group, callback) {
50
- const atlases = this.assets[group].filter(assetModel => assetModel.type === Urso.types.assets.ATLAS);
51
-
52
- if (!atlases.length)
53
- return callback();
54
-
55
- let loader = Urso.getInstance('Lib.Loader');
56
-
57
- for (let assetModel of atlases)
58
- this._addAssetToLoader(assetModel, loader);
59
-
60
- loader.start(() => { this._processLoadedAtlases(group); callback(); });
61
- }
62
-
63
- _loadGroupRestAssets(group, callback) {
64
- let loader = Urso.getInstance('Lib.Loader');
65
- loader.setOnLoadUpdate(this.loadUpdate.bind(this));
66
- const noAtlasSpines = [];
67
-
68
- for (let assetModel of this.assets[group])
69
- if (assetModel.type !== Urso.types.assets.ATLAS)
70
- if (!Urso.cache.getFile(assetModel.path)) {
71
- //filter noAtlas Spine files
72
- if (assetModel.type === Urso.types.assets.SPINE && assetModel.noAtlas) {
73
- noAtlasSpines.push(assetModel);
74
- } else
75
- this._addAssetToLoader(assetModel, loader);
76
- }
77
-
78
- loader.start(
79
- () => {
80
- this._processLoadedAssets(group);
81
- this._loadNoAtlasSpines(noAtlasSpines, () => {
82
- this.emit(Urso.events.MODULES_ASSETS_GROUP_LOADED, group);
83
- callback();
84
- });
85
- }
86
- );
87
- }
88
-
89
- _loadNoAtlasSpines(noAtlasSpines, callback) {
90
- if (!noAtlasSpines.length)
91
- return callback();
92
-
93
- let loader = Urso.getInstance('Lib.Loader');
94
-
95
- for (let assetModel of noAtlasSpines)
96
- this._addAssetToLoader(assetModel, loader);
97
-
98
- loader.start(callback);
99
- }
100
-
101
- _processLoadedAtlases(group) {
102
- const atlases = this.assets[group].filter(assetModel => assetModel.type === Urso.types.assets.ATLAS);
103
-
104
- for (let assetModel of atlases) {
105
- const assetKey = assetModel.key;
106
- let imageData = Urso.cache.getAtlas(assetKey);
107
- const folderPath = imageData.url.split('/').slice(0, -1).join('/');
108
-
109
- for (let i = 0; i < imageData.spritesheet._frames.length; i++) {
110
- let frame = imageData.spritesheet._frames[i];
111
- let texture = imageData.textures[i];
112
- let newFilename = frame.filename;
113
-
114
- if (frame.filename.indexOf('/') === -1)
115
- newFilename = folderPath + '/' + frame.filename;
116
-
117
- Urso.cache.addFile(newFilename, texture);
118
- }
119
- }
120
- }
121
-
122
- _processLoadedAssets(group) {
123
- for (let assetModel of this.assets[group]) {
124
- if (assetModel.type === Urso.types.assets.IMAGE)
125
- this._processLoadedImage(assetModel);
126
-
127
- if (assetModel.type === Urso.types.assets.BITMAPFONT)
128
- this._processLoadedBitmapFont(assetModel);
129
-
130
- if (assetModel.type === Urso.types.assets.FONT)
131
- this._processLoadedFont(assetModel);
132
- }
133
-
134
- delete this.assets[group];
135
- }
136
-
137
- _processLoadedFont(source) {
138
- const data = Urso.cache.getFile(source.key);
139
- const font = new FontFace(source.key, data.data);
140
- font.load().then(() => {
141
- document.fonts.add(font);
142
- });
143
- }
144
-
145
- _processLoadedBitmapFont(assetModel) {
146
- this._updateFontKey(assetModel.key)
147
- }
148
-
149
- _updateFontKey(fontName) {
150
- const fontData = Urso.cache.getBitmapFont(fontName);
151
-
152
- if (PIXI.BitmapFont.available[fontName] || !fontData)
153
- return;
154
-
155
- const savedFont = PIXI.BitmapFont.available[fontData.bitmapFont.font];
156
-
157
- if (savedFont) {
158
- PIXI.BitmapFont.available[fontName] = savedFont;
159
- delete PIXI.BitmapFont.available[fontData.bitmapFont.font];
160
- }
161
- }
162
-
163
- _processLoadedImage(assetModel) {
164
- const { qualityFactors } = this.getInstance('Config');
165
-
166
- const resolution = qualityFactors[this._currentQuality] || 1;
167
-
168
- const assetKey = assetModel.key;
169
- //textures cache
170
- let imageData = Urso.cache.getImage(assetKey);
171
-
172
- if (!imageData) {
173
- //from atlas ?!
174
- let texture = Urso.cache.getFile(assetModel.path);
175
-
176
- if (!texture)
177
- return Urso.logger.error('ModulesAssetsService process Loaded Image error: no image ', assetModel);
178
-
179
- Urso.cache.addTexture(assetKey, texture); //TODO change resolution of base texture
180
- } else {
181
- //regular image
182
- const baseTexture = new PIXI.BaseTexture(imageData.data, { resolution });
183
- const texture = new PIXI.Texture(baseTexture);
184
- Urso.cache.addTexture(assetKey, texture);
185
- }
186
-
187
- if (assetModel.preloadGPU) {
188
- let tempOblect = Urso.objects.create({
189
- type: Urso.types.objects.IMAGE,
190
- assetKey: assetKey,
191
- x: -10000, y: -10000
192
- }, false, true);
193
-
194
- setTimeout(() => { tempOblect.destroy() }, 1)
195
- }
196
- }
197
-
198
- _addAsset(asset, loadingGroup) {
199
- //cache for all assets. We do not need to load same assets twice or more
200
- if (asset.type !== Urso.types.assets.CONTAINER) {
201
- let addedAssetKey = `${asset.type}_${asset.key}`;
202
-
203
- if (this._addedAssetsCache.includes(addedAssetKey))
204
- return;
205
-
206
- this._addedAssetsCache.push(addedAssetKey);
207
- }
208
-
209
- let model;
210
-
211
- switch (asset.type) {
212
- case Urso.types.assets.IMAGE:
213
- model = this.getInstance('Models.Image', asset)
214
- break;
215
- case Urso.types.assets.CONTAINER:
216
- model = this.getInstance('Models.Container', asset)
217
- break;
218
- case Urso.types.assets.ATLAS:
219
- model = this.getInstance('Models.Atlas', asset)
220
- break;
221
- case Urso.types.assets.AUDIOSPRITE:
222
- model = this.getInstance('Models.Audiosprite', asset)
223
- break;
224
- case Urso.types.assets.JSON:
225
- model = this.getInstance('Models.Json', asset)
226
- break;
227
- case Urso.types.assets.SPINE:
228
- model = this.getInstance('Models.Spine', asset)
229
- break;
230
- case Urso.types.assets.BITMAPFONT:
231
- model = this.getInstance('Models.BitmapFont', asset)
232
- break;
233
- case Urso.types.assets.FONT:
234
- model = this.getInstance('Models.Font', asset)
235
- break;
236
- case Urso.types.assets.SOUND:
237
- model = this.getInstance('Models.Sound', asset)
238
- break;
239
- default:
240
- Urso.logger.error('ModulesAssetsService asset type error', asset);
241
- break;
242
- };
243
-
244
- //set loadingGroup
245
- model.loadingGroup = loadingGroup || model.loadingGroup || this.getInstance('Config').loadingGroups.initial;
246
-
247
- //check if container
248
- if (model.contents) {
249
- for (let content of model.contents) {
250
- this._addAsset(content, model.loadingGroup);
251
- }
252
-
253
- return;
254
- }
255
-
256
- //add single asset to loading group
257
- if (!this.assets[model.loadingGroup])
258
- this.assets[model.loadingGroup] = [];
259
-
260
- this.assets[model.loadingGroup].push(model);
261
- }
262
-
263
- _continueLazyLoad(step) {
264
- if (!step)
265
- step = 0;
266
-
267
- const lazyLoadGroups = this.getInstance('Config').lazyLoadGroups;
268
-
269
- if (step >= lazyLoadGroups.length) {
270
- this.emit(Urso.events.MODULES_ASSETS_LAZYLOAD_FINISHED);
271
- return;
272
- }
273
-
274
- let groupName = lazyLoadGroups[step];
275
-
276
- if (!groupName)
277
- Urso.logger.error('ModulesAssetsService lazy loading groupName error');
278
-
279
- this.loadGroup(groupName, () => { this._continueLazyLoad(step + 1); })
280
- }
281
-
282
- _qualityReducer(qualityFactors, widthFactor) {
283
- return [(acc, val) => {
284
- if (acc === null) {
285
- return val;
286
- }
287
-
288
- const currentQuality = qualityFactors[acc];
289
- const qualityFactor = qualityFactors[val];
290
-
291
- const nextQuality = (currentQuality > qualityFactor && qualityFactor >= widthFactor)
292
- || (qualityFactor >= widthFactor && widthFactor > currentQuality)
293
- || (widthFactor >= qualityFactor && qualityFactor > currentQuality);
294
-
295
- return nextQuality ? val : acc;
296
-
297
- }, null]
298
- }
299
-
300
- _detectQuality() {
301
- const { qualityFactors } = this.getInstance('Config');
302
- const userQuality = Urso.helper.parseGetParams()['quality'];
303
-
304
- if (userQuality && qualityFactors[userQuality]) {
305
- return userQuality;
306
- }
307
-
308
- return this._calculateQuality(qualityFactors);
309
- }
310
-
311
- _calculateQuality(qualityFactors) {
312
- const { android, iOS, iPad, macOS } = Urso.device;
313
- const isMobile = android || iOS || iPad;
314
-
315
- if (macOS && !isMobile) {
316
- return 'high';
317
- }
318
-
319
- if (macOS && iPad) {
320
- return 'medium';
321
- }
322
-
323
- const resCfg = Urso.getInstance('Modules.Scenes.ResolutionsConfig').contents[0];
324
-
325
- const { devicePixelRatio } = window;
326
- let { width, height } = screen;
327
-
328
- if (isMobile) {
329
- width = (width > height) ? width : height;
330
- }
331
-
332
- if (iOS) {
333
- width *= devicePixelRatio;
334
- }
335
-
336
- const widthFactor = width / resCfg.width;
337
-
338
- return Object
339
- .keys(qualityFactors)
340
- .reduce(...this._qualityReducer(qualityFactors, widthFactor));
341
- }
342
-
343
- _addAssetToLoader(assetModel, loader) {
344
- if (assetModel.path)
345
- loader.addAsset(assetModel);
346
- else if (assetModel.contents) {
347
- //do nothing, its a container
348
- } else
349
- Urso.logger.error('ModulesAssetsService model error', assetModel);
350
- };
351
- }
352
-
353
- module.exports = ModulesAssetsService;
1
+ class ModulesAssetsService {
2
+ constructor() {
3
+ this.singleton = true;
4
+
5
+ this.assets = {};
6
+
7
+ this._currentQuality = 'auto';
8
+ this._addedAssetsCache = [];
9
+ };
10
+
11
+ getQuality() {
12
+ return this._currentQuality;
13
+ }
14
+
15
+ updateQuality() {
16
+ this._currentQuality = this._detectQuality();
17
+ Urso.addInstancesMode(this._currentQuality + 'Quality');
18
+ }
19
+
20
+ sortAssets(assets) {
21
+ this.assets[this.getInstance('Config').loadingGroups.initial] = [];
22
+
23
+ if (Array.isArray(assets))
24
+ for (let asset of assets)
25
+ this._addAsset(asset);
26
+ else
27
+ this._addAsset(assets);
28
+ }
29
+
30
+ startLoad(callback) {
31
+ this.loadGroup(
32
+ this.getInstance('Config').loadingGroups.initial,
33
+ (() => { callback(); this._continueLazyLoad(); }).bind(this)
34
+ )
35
+ }
36
+
37
+ loadUpdate(param) {
38
+ Urso.scenes.loadUpdate(Math.floor(param.progress));
39
+ }
40
+
41
+ loadGroup(group, callback) {
42
+ if (!this.assets[group])
43
+ return Urso.logger.error('ModulesAssetsService group error, no assets:' + group + ' Check ModulesAssetsConfig please');
44
+
45
+ //we need load and parse atlases at first (!)
46
+ this._loadGroupAtlases(group, () => { this._loadGroupRestAssets(group, callback) });
47
+ }
48
+
49
+ _loadGroupAtlases(group, callback) {
50
+ const atlases = this.assets[group].filter(assetModel => assetModel.type === Urso.types.assets.ATLAS);
51
+
52
+ if (!atlases.length)
53
+ return callback();
54
+
55
+ let loader = Urso.getInstance('Lib.Loader');
56
+
57
+ for (let assetModel of atlases)
58
+ this._addAssetToLoader(assetModel, loader);
59
+
60
+ loader.start(() => { this._processLoadedAtlases(group); callback(); });
61
+ }
62
+
63
+ _loadGroupRestAssets(group, callback) {
64
+ let loader = Urso.getInstance('Lib.Loader');
65
+ loader.setOnLoadUpdate(this.loadUpdate.bind(this));
66
+ const noAtlasSpines = [];
67
+
68
+ for (let assetModel of this.assets[group])
69
+ if (assetModel.type !== Urso.types.assets.ATLAS)
70
+ if (!Urso.cache.getFile(assetModel.path)) {
71
+ //filter noAtlas Spine files
72
+ if (assetModel.type === Urso.types.assets.SPINE && assetModel.noAtlas) {
73
+ noAtlasSpines.push(assetModel);
74
+ } else
75
+ this._addAssetToLoader(assetModel, loader);
76
+ }
77
+
78
+ loader.start(
79
+ () => {
80
+ this._processLoadedAssets(group);
81
+ this._loadNoAtlasSpines(noAtlasSpines, () => {
82
+ this.emit(Urso.events.MODULES_ASSETS_GROUP_LOADED, group);
83
+ callback();
84
+ });
85
+ }
86
+ );
87
+ }
88
+
89
+ _loadNoAtlasSpines(noAtlasSpines, callback) {
90
+ if (!noAtlasSpines.length)
91
+ return callback();
92
+
93
+ let loader = Urso.getInstance('Lib.Loader');
94
+
95
+ for (let assetModel of noAtlasSpines)
96
+ this._addAssetToLoader(assetModel, loader);
97
+
98
+ loader.start(callback);
99
+ }
100
+
101
+ _processLoadedAtlases(group) {
102
+ const atlases = this.assets[group].filter(assetModel => assetModel.type === Urso.types.assets.ATLAS);
103
+
104
+ for (let assetModel of atlases) {
105
+ const assetKey = assetModel.key;
106
+ let imageData = Urso.cache.getAtlas(assetKey);
107
+ const folderPath = imageData.url.split('/').slice(0, -1).join('/');
108
+
109
+ for (let i = 0; i < imageData.spritesheet._frames.length; i++) {
110
+ let frame = imageData.spritesheet._frames[i];
111
+ let texture = imageData.textures[i];
112
+ let newFilename = frame.filename;
113
+
114
+ if (frame.filename.indexOf('/') === -1)
115
+ newFilename = folderPath + '/' + frame.filename;
116
+
117
+ Urso.cache.addFile(newFilename, texture);
118
+ }
119
+ }
120
+ }
121
+
122
+ _processLoadedAssets(group) {
123
+ for (let assetModel of this.assets[group]) {
124
+ if (assetModel.type === Urso.types.assets.IMAGE)
125
+ this._processLoadedImage(assetModel);
126
+
127
+ if (assetModel.type === Urso.types.assets.BITMAPFONT)
128
+ this._processLoadedBitmapFont(assetModel);
129
+
130
+ if (assetModel.type === Urso.types.assets.FONT)
131
+ this._processLoadedFont(assetModel);
132
+ }
133
+
134
+ delete this.assets[group];
135
+ }
136
+
137
+ _processLoadedFont(source) {
138
+ const data = Urso.cache.getFile(source.key);
139
+ const font = new FontFace(source.key, data.data);
140
+ font.load().then(() => {
141
+ document.fonts.add(font);
142
+ });
143
+ }
144
+
145
+ _processLoadedBitmapFont(assetModel) {
146
+ this._updateFontKey(assetModel.key)
147
+ }
148
+
149
+ _updateFontKey(fontName) {
150
+ const fontData = Urso.cache.getBitmapFont(fontName);
151
+
152
+ if (PIXI.BitmapFont.available[fontName] || !fontData)
153
+ return;
154
+
155
+ const savedFont = PIXI.BitmapFont.available[fontData.bitmapFont.font];
156
+
157
+ if (savedFont) {
158
+ PIXI.BitmapFont.available[fontName] = savedFont;
159
+ delete PIXI.BitmapFont.available[fontData.bitmapFont.font];
160
+ }
161
+ }
162
+
163
+ getCurrentResolution() {
164
+ const { qualityFactors, defaultQualityFactor } = this.getInstance('Config');
165
+ return qualityFactors[this._currentQuality] || defaultQualityFactor || 1;
166
+ }
167
+
168
+ _processLoadedImage(assetModel) {
169
+ const resolution = this.getCurrentResolution();
170
+
171
+ const assetKey = assetModel.key;
172
+ //textures cache
173
+ let imageData = Urso.cache.getImage(assetKey);
174
+
175
+ if (!imageData) {
176
+ //from atlas ?!
177
+ let texture = Urso.cache.getFile(assetModel.path);
178
+
179
+ if (!texture)
180
+ return Urso.logger.error('ModulesAssetsService process Loaded Image error: no image ', assetModel);
181
+
182
+ Urso.cache.addTexture(assetKey, texture); //TODO change resolution of base texture
183
+ } else {
184
+ //regular image
185
+ const baseTexture = new PIXI.BaseTexture(imageData.data, { resolution });
186
+ const texture = new PIXI.Texture(baseTexture);
187
+ Urso.cache.addTexture(assetKey, texture);
188
+ }
189
+
190
+ if (assetModel.preloadGPU) {
191
+ let tempOblect = Urso.objects.create({
192
+ type: Urso.types.objects.IMAGE,
193
+ assetKey: assetKey,
194
+ x: -10000, y: -10000
195
+ }, false, true);
196
+
197
+ setTimeout(() => { tempOblect.destroy() }, 1)
198
+ }
199
+ }
200
+
201
+ _addAsset(asset, loadingGroup) {
202
+ //cache for all assets. We do not need to load same assets twice or more
203
+ if (asset.type !== Urso.types.assets.CONTAINER) {
204
+ let addedAssetKey = `${asset.type}_${asset.key}`;
205
+
206
+ if (this._addedAssetsCache.includes(addedAssetKey))
207
+ return;
208
+
209
+ this._addedAssetsCache.push(addedAssetKey);
210
+ }
211
+
212
+ let model;
213
+
214
+ switch (asset.type) {
215
+ case Urso.types.assets.IMAGE:
216
+ model = this.getInstance('Models.Image', asset)
217
+ break;
218
+ case Urso.types.assets.CONTAINER:
219
+ model = this.getInstance('Models.Container', asset)
220
+ break;
221
+ case Urso.types.assets.ATLAS:
222
+ model = this.getInstance('Models.Atlas', asset)
223
+ break;
224
+ case Urso.types.assets.AUDIOSPRITE:
225
+ model = this.getInstance('Models.Audiosprite', asset)
226
+ break;
227
+ case Urso.types.assets.JSON:
228
+ model = this.getInstance('Models.Json', asset)
229
+ break;
230
+ case Urso.types.assets.SPINE:
231
+ model = this.getInstance('Models.Spine', asset)
232
+ break;
233
+ case Urso.types.assets.BITMAPFONT:
234
+ model = this.getInstance('Models.BitmapFont', asset)
235
+ break;
236
+ case Urso.types.assets.FONT:
237
+ model = this.getInstance('Models.Font', asset)
238
+ break;
239
+ case Urso.types.assets.SOUND:
240
+ model = this.getInstance('Models.Sound', asset)
241
+ break;
242
+ default:
243
+ Urso.logger.error('ModulesAssetsService asset type error', asset);
244
+ break;
245
+ };
246
+
247
+ //set loadingGroup
248
+ model.loadingGroup = loadingGroup || model.loadingGroup || this.getInstance('Config').loadingGroups.initial;
249
+
250
+ //check if container
251
+ if (model.contents) {
252
+ for (let content of model.contents) {
253
+ this._addAsset(content, model.loadingGroup);
254
+ }
255
+
256
+ return;
257
+ }
258
+
259
+ //add single asset to loading group
260
+ if (!this.assets[model.loadingGroup])
261
+ this.assets[model.loadingGroup] = [];
262
+
263
+ this.assets[model.loadingGroup].push(model);
264
+ }
265
+
266
+ _continueLazyLoad(step) {
267
+ if (!step)
268
+ step = 0;
269
+
270
+ const lazyLoadGroups = this.getInstance('Config').lazyLoadGroups;
271
+
272
+ if (step >= lazyLoadGroups.length) {
273
+ this.emit(Urso.events.MODULES_ASSETS_LAZYLOAD_FINISHED);
274
+ return;
275
+ }
276
+
277
+ let groupName = lazyLoadGroups[step];
278
+
279
+ if (!groupName)
280
+ Urso.logger.error('ModulesAssetsService lazy loading groupName error');
281
+
282
+ this.loadGroup(groupName, () => { this._continueLazyLoad(step + 1); })
283
+ }
284
+
285
+ _qualityReducer(qualityFactors, widthFactor) {
286
+ return [(acc, val) => {
287
+ if (acc === null) {
288
+ return val;
289
+ }
290
+
291
+ const currentQuality = qualityFactors[acc];
292
+ const qualityFactor = qualityFactors[val];
293
+
294
+ const nextQuality = (currentQuality > qualityFactor && qualityFactor >= widthFactor)
295
+ || (qualityFactor >= widthFactor && widthFactor > currentQuality)
296
+ || (widthFactor >= qualityFactor && qualityFactor > currentQuality);
297
+
298
+ return nextQuality ? val : acc;
299
+
300
+ }, null]
301
+ }
302
+
303
+ _detectQuality() {
304
+ const { qualityFactors } = this.getInstance('Config');
305
+ const userQuality = Urso.helper.parseGetParams()['quality'];
306
+
307
+ if (userQuality && qualityFactors[userQuality]) {
308
+ return userQuality;
309
+ }
310
+
311
+ return this._calculateQuality(qualityFactors);
312
+ }
313
+
314
+ _calculateQuality(qualityFactors) {
315
+ const { android, iOS, iPad, macOS } = Urso.device;
316
+ const isMobile = android || iOS || iPad;
317
+
318
+ if (macOS && !isMobile) {
319
+ return 'high';
320
+ }
321
+
322
+ if (macOS && iPad) {
323
+ return 'medium';
324
+ }
325
+
326
+ const resCfg = Urso.getInstance('Modules.Scenes.ResolutionsConfig').contents[0];
327
+
328
+ const { devicePixelRatio } = window;
329
+ let { width, height } = screen;
330
+
331
+ if (isMobile) {
332
+ width = (width > height) ? width : height;
333
+ }
334
+
335
+ if (iOS) {
336
+ width *= devicePixelRatio;
337
+ }
338
+
339
+ const widthFactor = width / resCfg.width;
340
+
341
+ return Object
342
+ .keys(qualityFactors)
343
+ .reduce(...this._qualityReducer(qualityFactors, widthFactor));
344
+ }
345
+
346
+ _addAssetToLoader(assetModel, loader) {
347
+ if (assetModel.path)
348
+ loader.addAsset(assetModel);
349
+ else if (assetModel.contents) {
350
+ //do nothing, its a container
351
+ } else
352
+ Urso.logger.error('ModulesAssetsService model error', assetModel);
353
+ };
354
+ }
355
+
356
+ module.exports = ModulesAssetsService;