@urso/core 0.3.5 → 0.3.6

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