@urso/core 0.3.10 → 0.3.11
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.
- package/.babelrc +11 -11
- package/README.md +10 -10
- package/build/js/index.js +1 -1
- package/build/js/index.js.LICENSE.txt +29 -29
- package/package.json +51 -51
- package/src/js/app.js +77 -77
- package/src/js/components/_info.js +8 -8
- package/src/js/components/base/_info.js +3 -3
- package/src/js/components/base/controller.js +78 -78
- package/src/js/components/debug/_info.js +7 -7
- package/src/js/components/debug/controller.js +38 -38
- package/src/js/components/debug/coords.js +23 -23
- package/src/js/components/debug/fps.js +34 -34
- package/src/js/components/debug/template.js +55 -55
- package/src/js/components/debug/timescale.js +60 -60
- package/src/js/components/deviceRotate/_info.js +3 -3
- package/src/js/components/deviceRotate/controller.js +86 -86
- package/src/js/components/fullscreen/_info.js +6 -6
- package/src/js/components/fullscreen/android.js +104 -104
- package/src/js/components/fullscreen/controller.js +64 -64
- package/src/js/components/fullscreen/desktop.js +49 -49
- package/src/js/components/fullscreen/ios.js +111 -111
- package/src/js/components/loader/_info.js +4 -4
- package/src/js/components/loader/controller.js +66 -66
- package/src/js/components/loader/template.js +70 -70
- package/src/js/components/soundInitialPopup/_info.js +3 -3
- package/src/js/components/soundInitialPopup/controller.js +42 -42
- package/src/js/components/soundInitialPopup/template.js +109 -109
- package/src/js/components/stateDriven/_info.js +3 -3
- package/src/js/components/stateDriven/controller.js +118 -118
- package/src/js/config/load.js +5 -5
- package/src/js/config/main.js +10 -10
- package/src/js/extra/_info.js +22 -22
- package/src/js/extra/browserEvents.js +38 -38
- package/src/js/extra/setTimeout.js +7 -7
- package/src/js/index.js +8 -8
- package/src/js/lib/_info.js +13 -13
- package/src/js/lib/cache.js +105 -105
- package/src/js/lib/composition.js +89 -89
- package/src/js/lib/device.js +1276 -1276
- package/src/js/lib/helper.js +539 -539
- package/src/js/lib/loader.js +127 -127
- package/src/js/lib/localData.js +15 -15
- package/src/js/lib/logger.js +22 -22
- package/src/js/lib/math.js +35 -35
- package/src/js/lib/objectPool.js +54 -54
- package/src/js/lib/time.js +18 -18
- package/src/js/lib/tween.js +147 -147
- package/src/js/modules/_info.js +11 -11
- package/src/js/modules/assets/_info.js +7 -7
- package/src/js/modules/assets/baseModel.js +18 -18
- package/src/js/modules/assets/config.js +35 -35
- package/src/js/modules/assets/controller.js +39 -39
- package/src/js/modules/assets/models/_info.js +11 -11
- package/src/js/modules/assets/models/atlas.js +8 -8
- package/src/js/modules/assets/models/audiosprite.js +27 -27
- package/src/js/modules/assets/models/bitmapFont.js +8 -8
- package/src/js/modules/assets/models/container.js +16 -16
- package/src/js/modules/assets/models/font.js +8 -8
- package/src/js/modules/assets/models/image.js +13 -13
- package/src/js/modules/assets/models/json.js +8 -8
- package/src/js/modules/assets/models/sound.js +14 -14
- package/src/js/modules/assets/models/spine.js +14 -14
- package/src/js/modules/assets/service.js +353 -353
- package/src/js/modules/instances/_info.js +3 -3
- package/src/js/modules/instances/controller.js +219 -219
- package/src/js/modules/logic/_info.js +4 -4
- package/src/js/modules/logic/config/_info.js +2 -2
- package/src/js/modules/logic/config/sounds.js +23 -23
- package/src/js/modules/logic/controller.js +48 -48
- package/src/js/modules/logic/sounds.js +96 -96
- package/src/js/modules/objects/_info.js +11 -11
- package/src/js/modules/objects/baseModel.js +170 -161
- package/src/js/modules/objects/cache.js +99 -99
- package/src/js/modules/objects/controller.js +121 -121
- package/src/js/modules/objects/create.js +234 -230
- package/src/js/modules/objects/find.js +140 -140
- package/src/js/modules/objects/models/_info.js +24 -24
- package/src/js/modules/objects/models/atlasImage.js +50 -50
- package/src/js/modules/objects/models/bitmapText.js +23 -23
- package/src/js/modules/objects/models/button.js +184 -184
- package/src/js/modules/objects/models/buttonComposite.js +35 -35
- package/src/js/modules/objects/models/checkbox.js +96 -96
- package/src/js/modules/objects/models/collection.js +54 -54
- package/src/js/modules/objects/models/component.js +44 -44
- package/src/js/modules/objects/models/container.js +19 -19
- package/src/js/modules/objects/models/emitter.js +54 -54
- package/src/js/modules/objects/models/graphics.js +38 -38
- package/src/js/modules/objects/models/group.js +19 -19
- package/src/js/modules/objects/models/hitArea.js +104 -104
- package/src/js/modules/objects/models/image.js +34 -34
- package/src/js/modules/objects/models/imagesAnimation.js +113 -113
- package/src/js/modules/objects/models/mask.js +38 -38
- package/src/js/modules/objects/models/scrollbox.js +61 -61
- package/src/js/modules/objects/models/slider.js +223 -223
- package/src/js/modules/objects/models/spine.js +89 -89
- package/src/js/modules/objects/models/text.js +38 -38
- package/src/js/modules/objects/models/textInput.js +66 -66
- package/src/js/modules/objects/models/toggle.js +178 -178
- package/src/js/modules/objects/models/world.js +19 -19
- package/src/js/modules/objects/propertyAdapter.js +421 -421
- package/src/js/modules/objects/proxy.js +182 -182
- package/src/js/modules/objects/styles.js +116 -116
- package/src/js/modules/observer/_info.js +4 -4
- package/src/js/modules/observer/controller.js +99 -99
- package/src/js/modules/observer/events.js +38 -38
- package/src/js/modules/scenes/_info.js +8 -8
- package/src/js/modules/scenes/controller.js +42 -42
- package/src/js/modules/scenes/model.js +35 -35
- package/src/js/modules/scenes/pixiWrapper.js +202 -202
- package/src/js/modules/scenes/resolutions.js +176 -176
- package/src/js/modules/scenes/resolutionsConfig.js +73 -73
- package/src/js/modules/scenes/service.js +92 -92
- package/src/js/modules/soundManager/_info.js +3 -3
- package/src/js/modules/soundManager/controller.js +99 -99
- package/src/js/modules/soundManager/soundSprite.js +202 -202
- package/src/js/modules/statesManager/_info.js +12 -12
- package/src/js/modules/statesManager/action.js +60 -60
- package/src/js/modules/statesManager/actions/_info.js +3 -3
- package/src/js/modules/statesManager/all.js +23 -23
- package/src/js/modules/statesManager/configStates.js +71 -71
- package/src/js/modules/statesManager/controller.js +170 -170
- package/src/js/modules/statesManager/functionsStorage.js +82 -82
- package/src/js/modules/statesManager/helper.js +27 -27
- package/src/js/modules/statesManager/race.js +75 -75
- package/src/js/modules/statesManager/sequence.js +47 -47
- package/src/js/modules/template/_info.js +6 -6
- package/src/js/modules/template/controller.js +28 -28
- package/src/js/modules/template/model.js +11 -11
- package/src/js/modules/template/service.js +125 -125
- package/src/js/modules/template/types.js +44 -44
- package/src/js/modules/transport/_info.js +8 -8
- package/src/js/modules/transport/baseConnectionType.js +24 -24
- package/src/js/modules/transport/config.js +13 -13
- package/src/js/modules/transport/connectionTypes/_info.js +3 -3
- package/src/js/modules/transport/connectionTypes/websocket.js +74 -74
- package/src/js/modules/transport/connectionTypes/xhr.js +44 -44
- package/src/js/modules/transport/controller.js +48 -48
- package/src/js/modules/transport/decorator.js +17 -17
- package/src/js/modules/transport/service.js +153 -153
- package/src/js/templates/_info.js +4 -4
- package/src/js/templates/groups/_info.js +1 -1
- package/src/js/templates/scenes/_info.js +1 -1
- package/webpack.config.js +47 -47
|
@@ -1,353 +1,353 @@
|
|
|
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
|
+
_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;
|