@urso/core 0.8.20-dev → 0.9.0-dev

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 (134) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +227 -227
  3. package/build/js/index.js +77216 -2
  4. package/package.json +36 -50
  5. package/src/js/app.js +105 -104
  6. package/src/js/components/base/controller.js +76 -78
  7. package/src/js/components/debug/controller.js +39 -39
  8. package/src/js/components/debug/coords.js +23 -23
  9. package/src/js/components/debug/fps.js +36 -36
  10. package/src/js/components/debug/template.js +55 -55
  11. package/src/js/components/debug/timescale.js +60 -60
  12. package/src/js/components/deviceRotate/controller.js +95 -95
  13. package/src/js/components/editor/api.js +127 -127
  14. package/src/js/components/editor/controller.js +13 -13
  15. package/src/js/components/fullscreen/android.js +104 -104
  16. package/src/js/components/fullscreen/controller.js +76 -76
  17. package/src/js/components/fullscreen/desktop.js +49 -49
  18. package/src/js/components/fullscreen/ios.js +115 -115
  19. package/src/js/components/layersSwitcher/config.js +26 -26
  20. package/src/js/components/layersSwitcher/controller.js +36 -36
  21. package/src/js/components/loader/controller.js +66 -66
  22. package/src/js/components/loader/template.js +71 -71
  23. package/src/js/components/soundInitialPopup/controller.js +43 -43
  24. package/src/js/components/soundInitialPopup/template.js +110 -110
  25. package/src/js/components/stateDriven/controller.js +123 -123
  26. package/src/js/config/load.js +325 -194
  27. package/src/js/config/main.js +17 -17
  28. package/src/js/extra/browserEvents.js +57 -57
  29. package/src/js/extra/main.js +23 -25
  30. package/src/js/extra/pixiPatch.js +173 -171
  31. package/src/js/index.js +7 -7
  32. package/src/js/lib/cache.js +199 -125
  33. package/src/js/lib/composition.js +85 -85
  34. package/src/js/lib/device.js +1215 -1215
  35. package/src/js/lib/helper.js +678 -678
  36. package/src/js/lib/loader.js +216 -218
  37. package/src/js/lib/localData.js +29 -29
  38. package/src/js/lib/logger.js +69 -69
  39. package/src/js/lib/math.js +161 -161
  40. package/src/js/lib/objectPool.js +208 -208
  41. package/src/js/lib/time.js +19 -19
  42. package/src/js/lib/tween.js +153 -153
  43. package/src/js/modules/assets/baseModel.js +21 -21
  44. package/src/js/modules/assets/config.js +38 -38
  45. package/src/js/modules/assets/controller.js +65 -65
  46. package/src/js/modules/assets/models/atlas.js +19 -19
  47. package/src/js/modules/assets/models/audiosprite.js +28 -28
  48. package/src/js/modules/assets/models/bitmapFont.js +11 -11
  49. package/src/js/modules/assets/models/container.js +19 -19
  50. package/src/js/modules/assets/models/font.js +11 -11
  51. package/src/js/modules/assets/models/html.js +11 -11
  52. package/src/js/modules/assets/models/image.js +17 -17
  53. package/src/js/modules/assets/models/json.js +11 -11
  54. package/src/js/modules/assets/models/jsonAtlas.js +11 -11
  55. package/src/js/modules/assets/models/sound.js +17 -17
  56. package/src/js/modules/assets/models/spine.js +18 -17
  57. package/src/js/modules/assets/models/spineAtlas.js +11 -0
  58. package/src/js/modules/assets/service.js +564 -553
  59. package/src/js/modules/i18n/config.js +17 -17
  60. package/src/js/modules/i18n/controller.js +71 -71
  61. package/src/js/modules/instances/controller.js +357 -357
  62. package/src/js/modules/logic/config/sounds.js +23 -23
  63. package/src/js/modules/logic/controller.js +52 -52
  64. package/src/js/modules/logic/main.js +8 -8
  65. package/src/js/modules/logic/sounds.js +103 -103
  66. package/src/js/modules/objects/baseModel.js +205 -207
  67. package/src/js/modules/objects/cache.js +99 -99
  68. package/src/js/modules/objects/config.js +10 -10
  69. package/src/js/modules/objects/controller.js +139 -139
  70. package/src/js/modules/objects/find.js +58 -58
  71. package/src/js/modules/objects/models/bitmapText.js +56 -49
  72. package/src/js/modules/objects/models/button.js +208 -209
  73. package/src/js/modules/objects/models/buttonComposite.js +38 -38
  74. package/src/js/modules/objects/models/checkbox.js +100 -100
  75. package/src/js/modules/objects/models/collection.js +56 -54
  76. package/src/js/modules/objects/models/component.js +48 -48
  77. package/src/js/modules/objects/models/container.js +22 -22
  78. package/src/js/modules/objects/models/emitterFx.js +103 -114
  79. package/src/js/modules/objects/models/graphics.js +40 -40
  80. package/src/js/modules/objects/models/group.js +22 -22
  81. package/src/js/modules/objects/models/hitArea.js +187 -187
  82. package/src/js/modules/objects/models/image.js +36 -36
  83. package/src/js/modules/objects/models/imagesAnimation.js +115 -115
  84. package/src/js/modules/objects/models/mask.js +40 -40
  85. package/src/js/modules/objects/models/nineSlicePlane.js +32 -32
  86. package/src/js/modules/objects/models/slider.js +357 -357
  87. package/src/js/modules/objects/models/spine.js +354 -339
  88. package/src/js/modules/objects/models/text.js +70 -70
  89. package/src/js/modules/objects/models/toggle.js +186 -186
  90. package/src/js/modules/objects/models/world.js +22 -22
  91. package/src/js/modules/objects/pool.js +68 -68
  92. package/src/js/modules/objects/propertyAdapter.js +592 -592
  93. package/src/js/modules/objects/proxy.js +299 -298
  94. package/src/js/modules/objects/selector.js +136 -136
  95. package/src/js/modules/objects/service.js +255 -254
  96. package/src/js/modules/objects/styles.js +210 -210
  97. package/src/js/modules/observer/controller.js +168 -168
  98. package/src/js/modules/observer/events.js +51 -56
  99. package/src/js/modules/scenes/controller.js +126 -127
  100. package/src/js/modules/scenes/model.js +28 -28
  101. package/src/js/modules/scenes/pixiWrapper.js +359 -351
  102. package/src/js/modules/scenes/resolutions.js +173 -173
  103. package/src/js/modules/scenes/resolutionsConfig.js +73 -73
  104. package/src/js/modules/scenes/service.js +144 -146
  105. package/src/js/modules/soundManager/controller.js +103 -103
  106. package/src/js/modules/soundManager/soundSprite.js +314 -314
  107. package/src/js/modules/statesManager/action.js +97 -97
  108. package/src/js/modules/statesManager/all.js +23 -23
  109. package/src/js/modules/statesManager/configStates.js +77 -77
  110. package/src/js/modules/statesManager/controller.js +219 -219
  111. package/src/js/modules/statesManager/functionsStorage.js +83 -83
  112. package/src/js/modules/statesManager/helper.js +27 -27
  113. package/src/js/modules/statesManager/race.js +91 -91
  114. package/src/js/modules/statesManager/sequence.js +48 -48
  115. package/src/js/modules/template/controller.js +28 -28
  116. package/src/js/modules/template/model.js +11 -11
  117. package/src/js/modules/template/service.js +137 -137
  118. package/src/js/modules/template/types.js +50 -49
  119. package/src/js/modules/transport/baseConnectionType.js +25 -25
  120. package/src/js/modules/transport/config.js +13 -13
  121. package/src/js/modules/transport/connectionTypes/websocket.js +77 -77
  122. package/src/js/modules/transport/connectionTypes/xhr.js +47 -47
  123. package/src/js/modules/transport/controller.js +48 -48
  124. package/src/js/modules/transport/decorator.js +17 -17
  125. package/src/js/modules/transport/service.js +150 -150
  126. package/vite.config.js +31 -0
  127. package/.babelrc +0 -12
  128. package/build/js/index.js.LICENSE.txt +0 -227
  129. package/src/js/modules/objects/models/atlasImage.js +0 -52
  130. package/src/js/modules/objects/models/dragContainer.js +0 -665
  131. package/src/js/modules/objects/models/emitter.js +0 -69
  132. package/src/js/modules/objects/models/scrollbox.js +0 -67
  133. package/src/js/modules/objects/models/textInput.js +0 -68
  134. package/webpack.config.js +0 -47
@@ -1,339 +1,354 @@
1
- const ModulesObjectsBaseModel = require('./../baseModel');
2
-
3
- class ModulesObjectsModelsSpine extends ModulesObjectsBaseModel {
4
- constructor(params) {
5
- super(params);
6
-
7
- this.type = Urso.types.objects.SPINE;
8
- this._addBaseObject();
9
- }
10
-
11
- /**
12
- * setup params to object model
13
- * @param {Object} params
14
- */
15
- setupParams(params) {
16
- super.setupParams(params);
17
-
18
- this.assetKey = Urso.helper.recursiveGet('assetKey', params, false);
19
-
20
- this.animation = {
21
- timeScale: Urso.helper.recursiveGet('animation.timeScale', params, 1),
22
- name: Urso.helper.recursiveGet('animation.name', params, false),
23
- skinName: Urso.helper.recursiveGet('animation.skinName', params, false),
24
- loop: Urso.helper.recursiveGet('animation.loop', params, false),
25
- onComplete: Urso.helper.recursiveGet('animation.onComplete', params, false)
26
- };
27
-
28
- params.animation = this.animation; //we redefine original property here
29
- this.contents = Urso.helper.recursiveGet('contents', params, []);
30
- }
31
-
32
- /**
33
- * play spine animation
34
- * @param {String} animationName
35
- * @param {Boolean} [loopFlag]
36
- * @param {Number} [track] - you can define track number for current animation
37
- */
38
- play(animationName, loopFlag = false, track = 0) {
39
- this._baseObject.state.setAnimation(track, animationName, loopFlag);
40
- }
41
-
42
- /**
43
- * set up the mixes between animations
44
- * @param {String} from - animation name
45
- * @param {String} to - animation name
46
- * @param {Number} duration - time in seconds
47
- * @example setMix("walk", "jump", 0.2)
48
- */
49
- setMix(from, to, duration) {
50
- this._baseObject.stateData.setMix(from, to, duration);
51
- }
52
-
53
- /**
54
- * Clears all listeners and resubscribes to spine events
55
- */
56
- clearListeners() {
57
- this._baseObject.state.clearListeners();
58
- this._baseObject.state.addListener({ event: this._eventHandler.bind(this) });
59
- }
60
-
61
- /**
62
- * set skin by name
63
- * @param {String} skinName
64
- */
65
- setSkinByName(skinName) {
66
- this._baseObject.skeleton.setSkinByName(skinName);
67
- }
68
-
69
- /**
70
- * reset animation to first frame
71
- */
72
- setToSetupPose() {
73
- this._baseObject.skeleton.setToSetupPose();
74
- }
75
-
76
- /**
77
- * set skin by name and reset animation to first frame
78
- * @param {String} skinName
79
- */
80
- setSkinByNameAndReset(skinName) {
81
- this.setSkinByName(skinName);
82
- this.setToSetupPose();
83
- }
84
-
85
- /**
86
- * play spine animation and execute function after animation completes
87
- * @param {String} animation - name of the animation to be played
88
- * @param {Function} func - function to be executed
89
- */
90
- playAndThen(animation, func) {
91
- this.playInSequenceAndThen([animation], func);
92
- }
93
-
94
- /**
95
- * play spine animations in sequence
96
- * @param {String[]} animations - names of the animations to be played
97
- */
98
- playInSequence(animations) {
99
- this._playInSequenceAndThen(animations);
100
- }
101
-
102
- /**
103
- * play spine animations in sequence and execute function after last animation completes
104
- * @param {String[]} animations - names of the animations to be played
105
- * @param {Function} func - function to be executed
106
- */
107
- playInSequenceAndThen(animations, func) {
108
- this._playInSequenceAndThen(animations, func);
109
- }
110
-
111
- /**
112
- * play spine animations in sequence and execute function after last animation completes
113
- * @param {String[]} animations - names of the animations to be played
114
- * @param {Function} func - function to be executed
115
- */
116
- _playInSequenceAndThen(animations, func) {
117
- this.stop();
118
- let removeSelf = () => { };
119
- let animationCount = 0;
120
-
121
- const completer = {
122
- complete: () => {
123
- animationCount++;
124
-
125
- if (animations[animationCount])
126
- this.play(animations[animationCount])
127
- else {
128
- func && func();
129
- removeSelf();
130
- }
131
- }
132
- }
133
-
134
- removeSelf = () => this._baseObject.state.removeListener(completer);
135
- this._baseObject.state.addListener(completer);
136
- this.play(animations[0]);
137
- }
138
-
139
- /**
140
- * stop track animation
141
- * @param {Number} [track] - you can define track number to stop
142
- */
143
- stopTrack(track) {
144
- this.clearTrack(track);
145
- this._baseObject.state.addEmptyAnimation(track, 0.2, 0); //int trackIndex, float mixDuration, float delay
146
- this.setToSetupPose();
147
- }
148
-
149
- /**
150
- * clear track animation
151
- * @param {Number} [track] - you can define track number to stop
152
- */
153
- clearTrack(track) {
154
- this._baseObject.state.clearTrack(track);
155
- }
156
-
157
- /**
158
- * stop all animations
159
- */
160
- stop() {
161
- this._baseObject.state.clearTracks();
162
- }
163
-
164
- /**
165
- * reset all animations
166
- */
167
- reset() {
168
- this._baseObject.state.setEmptyAnimations();
169
- }
170
-
171
- /**
172
- * add object to spine slot
173
- * @param {String} slotName
174
- * @param {Object} object - created by engine object
175
- */
176
- addToSlot(slotName, object) {
177
- this._addToSlot(slotName, object, false);
178
- }
179
-
180
- /**
181
- * replace spine slot with new object
182
- * @param {String} slotName
183
- * @param {Object} object - created by engine object
184
- */
185
- replaceSlotWith(slotName, object) {
186
- this._addToSlot(slotName, object, true);
187
- }
188
-
189
- /**
190
- * set/update animation config
191
- * @param {*} config
192
- * @param {boolean} [noObjectCreate] dont use this flag out of core
193
- *
194
- * config keys:
195
- timeScale
196
- onComplete
197
- */
198
- setAnimationConfig(config = {}, noObjectCreate) {
199
- this.animation = {
200
- ...this.animation,
201
- ...config
202
- };
203
-
204
- /*if (config.timeScale)
205
- this._baseObject.state.timeScale = config.timeScale;*/ //deprecated - now we use getTimeScale getter
206
-
207
- if (config.onComplete) {
208
- if (this._baseObject.state.listeners.length !== 0) {
209
- Urso.logger.warn('ModulesObjectsModelsSpine setAnimationConfig warning: animation state listeners will be cleared');
210
- }
211
-
212
- this._baseObject.state.clearListeners();
213
- this._baseObject.state.addListener({ complete: this.animation.onComplete });
214
- }
215
- }
216
-
217
- /**
218
- * returns skeleton's child by it's name
219
- * @param {string} name
220
- * @returns {DisplayObject}
221
- */
222
- getChildByName(name) {
223
- return this.children[this._baseObject.skeleton.findSlotIndex(name)];
224
- }
225
-
226
- /**
227
- * returns skeleton's slot by it's name
228
- * @param {string} name
229
- * @returns {Slot}
230
- */
231
- findSlot(name) {
232
- return this._baseObject.skeleton.findSlot(name)
233
- }
234
-
235
- /**
236
- * returns skeleton's bone by it's name
237
- * @param {string} name
238
- * @returns {Bone}
239
- */
240
- findBone(name) {
241
- return this._baseObject.skeleton.findBone(name)
242
- }
243
-
244
- /**
245
- * returns IK constraint
246
- * @param {string} name
247
- * @returns {Bone}
248
- */
249
- findIkConstraint(name) {
250
- return this._baseObject.skeleton.findIkConstraint(name)
251
- }
252
-
253
- /**
254
- * returns animation from spineData by it's name
255
- * @param {string} name
256
- * @returns {Animation}
257
- */
258
- findAnimation(name) {
259
- return this._baseObject.spineData.findAnimation(name)
260
- }
261
-
262
- /**
263
- * returns event from spineData by it's name
264
- * @param {string} name
265
- * @returns {EventData}
266
- */
267
- findEvent(name) {
268
- return this._baseObject.spineData.findEvent(name)
269
- }
270
-
271
- /**
272
- * system function
273
- * add object to pixi tree
274
- */
275
- _addBaseObject() {
276
- let spineAsset = Urso.cache.getSpine(this.assetKey);
277
-
278
- if (!spineAsset)
279
- Urso.logger.error('ModulesObjectsModelsSpine assets error: no spine object ' + this.assetKey);
280
-
281
- if (!spineAsset.spineData)
282
- Urso.logger.error('ModulesObjectsModelsSpine assets error: no spine correct object (no spineData) for key ' + this.assetKey);
283
-
284
- this._baseObject = new PIXI.spine.Spine(spineAsset.spineData);
285
- //this._baseObject.state.timeScale = this.animation.timeScale;
286
- Object.defineProperty(this._baseObject.state, 'timeScale', { get: this.getTimeScale.bind(this) });
287
-
288
- if (this.animation.onComplete)
289
- this._baseObject.state.addListener({ complete: this.animation.onComplete });
290
-
291
- if (this.animation.skinName)
292
- this.setSkinByName(this.animation.skinName);
293
-
294
- if (this.animation.name)
295
- this.play(this.animation.name, this.animation.loop);
296
-
297
- this._baseObject.state.addListener({ event: this._eventHandler.bind(this) });
298
- };
299
-
300
- _eventHandler(entry, event) {
301
- this.emit(Urso.events.MODULES_OBJECTS_SPINE_EVENT, { eventName: event.data.name, name: this.name, class: this.class });
302
- }
303
-
304
- _addToSlot(slotName, object, replaceSlotContents) {
305
- if (!object?._baseObject) {
306
- Urso.logger.warn('ModulesObjectsModelsSpine _addToSlot error: invalid object ' + object);
307
- return;
308
- }
309
-
310
- const spine = this._baseObject;
311
- const slotIndex = spine.spineData.slots.findIndex(({ name }) => name === slotName);
312
- const currentSlot = spine.slotContainers[slotIndex];
313
-
314
- if (currentSlot) {
315
- object._baseObject.scale.y = -1;
316
-
317
- Urso.objects.removeChild(object.parent, object, true);
318
-
319
- if (replaceSlotContents)
320
- currentSlot.removeChildren(); //todo check if its proxy and reset parent
321
-
322
- this.addChild(object); //todo make removeChild for addedToSlotObjects
323
- currentSlot.addChild(object._baseObject);
324
- Urso.objects.refreshStyles();
325
- } else {
326
- Urso.logger.warn('ModulesObjectsModelsSpine _addToSlot error: no spine slot ' + slotName);
327
- }
328
- }
329
-
330
- /**
331
- * get animation timeScale
332
- * @returns Number
333
- */
334
- getTimeScale() {
335
- return Urso.scenes.timeScale * this.animation.timeScale;
336
- }
337
- }
338
-
339
- module.exports = ModulesObjectsModelsSpine;
1
+ import ModulesObjectsBaseModel from './../baseModel';
2
+ import * as spine from '@esotericsoftware/spine-pixi-v8';
3
+
4
+ class ModulesObjectsModelsSpine extends ModulesObjectsBaseModel {
5
+ constructor(params) {
6
+ super(params);
7
+
8
+ this.type = Urso.types.objects.SPINE;
9
+ this._addBaseObject();
10
+ }
11
+
12
+ /**
13
+ * setup params to object model
14
+ * @param {Object} params
15
+ */
16
+ setupParams(params) {
17
+ super.setupParams(params);
18
+
19
+ this.assetKey = Urso.helper.recursiveGet('assetKey', params, false);
20
+
21
+ this.animation = {
22
+ timeScale: Urso.helper.recursiveGet('animation.timeScale', params, 1),
23
+ name: Urso.helper.recursiveGet('animation.name', params, false),
24
+ skinName: Urso.helper.recursiveGet('animation.skinName', params, false),
25
+ loop: Urso.helper.recursiveGet('animation.loop', params, false),
26
+ onComplete: Urso.helper.recursiveGet('animation.onComplete', params, false)
27
+ };
28
+
29
+ params.animation = this.animation; //we redefine original property here
30
+ this.contents = Urso.helper.recursiveGet('contents', params, []);
31
+ }
32
+
33
+ /**
34
+ * play spine animation
35
+ * @param {String} animationName
36
+ * @param {Boolean} [loopFlag]
37
+ * @param {Number} [track] - you can define track number for current animation
38
+ */
39
+ play(animationName, loopFlag = false, track = 0) {
40
+ this._baseObject.state.setAnimation(track, animationName, loopFlag);
41
+ }
42
+
43
+ /**
44
+ * set up the mixes between animations
45
+ * @param {String} from - animation name
46
+ * @param {String} to - animation name
47
+ * @param {Number} duration - time in seconds
48
+ * @example setMix("walk", "jump", 0.2)
49
+ */
50
+ setMix(from, to, duration) {
51
+ this._baseObject.stateData.setMix(from, to, duration);
52
+ }
53
+
54
+ /**
55
+ * Clears all listeners and resubscribes to spine events
56
+ */
57
+ clearListeners() {
58
+ this._baseObject.state.clearListeners();
59
+ this._baseObject.state.addListener({ event: this._eventHandler.bind(this) });
60
+ }
61
+
62
+ /**
63
+ * set skin by name
64
+ * @param {String} skinName
65
+ */
66
+ setSkinByName(skinName) {
67
+ this._baseObject.skeleton.setSkinByName(skinName);
68
+ }
69
+
70
+ /**
71
+ * reset animation to first frame
72
+ */
73
+ setToSetupPose() {
74
+ this._baseObject.skeleton.setToSetupPose();
75
+ }
76
+
77
+ /**
78
+ * set skin by name and reset animation to first frame
79
+ * @param {String} skinName
80
+ */
81
+ setSkinByNameAndReset(skinName) {
82
+ this.setSkinByName(skinName);
83
+ this.setToSetupPose();
84
+ }
85
+
86
+ /**
87
+ * play spine animation and execute function after animation completes
88
+ * @param {String} animation - name of the animation to be played
89
+ * @param {Function} func - function to be executed
90
+ */
91
+ playAndThen(animation, func) {
92
+ this.playInSequenceAndThen([animation], func);
93
+ }
94
+
95
+ /**
96
+ * play spine animations in sequence
97
+ * @param {String[]} animations - names of the animations to be played
98
+ */
99
+ playInSequence(animations) {
100
+ this._playInSequenceAndThen(animations);
101
+ }
102
+
103
+ /**
104
+ * play spine animations in sequence and execute function after last animation completes
105
+ * @param {String[]} animations - names of the animations to be played
106
+ * @param {Function} func - function to be executed
107
+ */
108
+ playInSequenceAndThen(animations, func) {
109
+ this._playInSequenceAndThen(animations, func);
110
+ }
111
+
112
+ /**
113
+ * play spine animations in sequence and execute function after last animation completes
114
+ * @param {String[]} animations - names of the animations to be played
115
+ * @param {Function} func - function to be executed
116
+ */
117
+ _playInSequenceAndThen(animations, func) {
118
+ this.stop();
119
+ let removeSelf = () => { };
120
+ let animationCount = 0;
121
+
122
+ const completer = {
123
+ complete: () => {
124
+ animationCount++;
125
+
126
+ if (animations[animationCount])
127
+ this.play(animations[animationCount])
128
+ else {
129
+ func && func();
130
+ removeSelf();
131
+ }
132
+ }
133
+ }
134
+
135
+ removeSelf = () => this._baseObject.state.removeListener(completer);
136
+ this._baseObject.state.addListener(completer);
137
+ this.play(animations[0]);
138
+ }
139
+
140
+ /**
141
+ * stop track animation
142
+ * @param {Number} [track] - you can define track number to stop
143
+ */
144
+ stopTrack(track) {
145
+ this.clearTrack(track);
146
+ this._baseObject.state.addEmptyAnimation(track, 0.2, 0); //int trackIndex, float mixDuration, float delay
147
+ this.setToSetupPose();
148
+ }
149
+
150
+ /**
151
+ * clear track animation
152
+ * @param {Number} [track] - you can define track number to stop
153
+ */
154
+ clearTrack(track) {
155
+ this._baseObject.state.clearTrack(track);
156
+ }
157
+
158
+ /**
159
+ * stop all animations
160
+ */
161
+ stop() {
162
+ this._baseObject.state.clearTracks();
163
+ }
164
+
165
+ /**
166
+ * reset all animations
167
+ */
168
+ reset() {
169
+ this._baseObject.state.setEmptyAnimations();
170
+ }
171
+
172
+ /**
173
+ * add object to spine slot
174
+ * @param {String} slotName
175
+ * @param {Object} object - created by engine object
176
+ */
177
+ addToSlot(slotName, object) {
178
+ this._addToSlot(slotName, object, false);
179
+ }
180
+
181
+ /**
182
+ * replace spine slot with new object
183
+ * @param {String} slotName
184
+ * @param {Object} object - created by engine object
185
+ */
186
+ replaceSlotWith(slotName, object) {
187
+ this._addToSlot(slotName, object, true);
188
+ }
189
+
190
+ /**
191
+ * set/update animation config
192
+ * @param {*} config
193
+ * @param {boolean} [noObjectCreate] dont use this flag out of core
194
+ *
195
+ * config keys:
196
+ timeScale
197
+ onComplete
198
+ */
199
+ setAnimationConfig(config = {}, noObjectCreate) {
200
+ this.animation = {
201
+ ...this.animation,
202
+ ...config
203
+ };
204
+
205
+ /*if (config.timeScale)
206
+ this._baseObject.state.timeScale = config.timeScale;*/ //deprecated - now we use getTimeScale getter
207
+
208
+ if (config.onComplete) {
209
+ if (this._baseObject.state.listeners.length !== 0) {
210
+ Urso.logger.warn('ModulesObjectsModelsSpine setAnimationConfig warning: animation state listeners will be cleared');
211
+ }
212
+
213
+ this._baseObject.state.clearListeners();
214
+ this._baseObject.state.addListener({ complete: this.animation.onComplete });
215
+ }
216
+ }
217
+
218
+ /**
219
+ * returns skeleton's child by it's name
220
+ * @param {string} name
221
+ * @returns {DisplayObject}
222
+ */
223
+ getChildByName(name) {
224
+ return this.children[this._baseObject.skeleton.findSlotIndex(name)];
225
+ }
226
+
227
+ /**
228
+ * returns skeleton's slot by it's name
229
+ * @param {string} name
230
+ * @returns {Slot}
231
+ */
232
+ findSlot(name) {
233
+ return this._baseObject.skeleton.findSlot(name)
234
+ }
235
+
236
+ /**
237
+ * returns skeleton's bone by it's name
238
+ * @param {string} name
239
+ * @returns {Bone}
240
+ */
241
+ findBone(name) {
242
+ return this._baseObject.skeleton.findBone(name)
243
+ }
244
+
245
+ /**
246
+ * returns IK constraint
247
+ * @param {string} name
248
+ * @returns {Bone}
249
+ */
250
+ findIkConstraint(name) {
251
+ return this._baseObject.skeleton.findIkConstraint(name)
252
+ }
253
+
254
+ /**
255
+ * returns animation from spineData by it's name
256
+ * @param {string} name
257
+ * @returns {Animation}
258
+ */
259
+ findAnimation(name) {
260
+ return this._baseObject.spineData.findAnimation(name)
261
+ }
262
+
263
+ /**
264
+ * returns event from spineData by it's name
265
+ * @param {string} name
266
+ * @returns {EventData}
267
+ */
268
+ findEvent(name) {
269
+ return this._baseObject.spineData.findEvent(name)
270
+ }
271
+
272
+ /**
273
+ * system function
274
+ * add object to pixi tree
275
+ */
276
+ _addBaseObject() {
277
+ const spineAsset = Urso.cache.getSpine(this.assetKey);
278
+ const spineAtlas = Urso.cache.getGlobalAtlas();
279
+
280
+ if (!spineAsset || !spineAtlas)
281
+ Urso.logger.error('ModulesObjectsModelsSpine assets error: no spine or atlas object ' + this.assetKey);
282
+
283
+ //FIXME
284
+ // if (!spineAsset.spineData)
285
+ // Urso.logger.error('ModulesObjectsModelsSpine assets error: no spine correct object (no spineData) for key ' + this.assetKey);
286
+
287
+ const attachmentLoader = new spine.AtlasAttachmentLoader(spineAtlas);
288
+
289
+ const parser = spineAsset instanceof Uint8Array ?
290
+ new spine.SkeletonBinary(attachmentLoader) :
291
+ new spine.SkeletonJson(attachmentLoader);
292
+
293
+ parser.scale = 1;
294
+ const skeletonData = parser.readSkeletonData(spineAsset);
295
+
296
+ this._baseObject = new spine.Spine({
297
+ skeletonData,
298
+ autoUpdate: true
299
+ });
300
+ //this._baseObject.state.timeScale = this.animation.timeScale;
301
+ Object.defineProperty(this._baseObject.state, 'timeScale', { get: this.getTimeScale.bind(this) });
302
+
303
+ if (this.animation.onComplete)
304
+ this._baseObject.state.addListener({ complete: this.animation.onComplete });
305
+
306
+ if (this.animation.skinName)
307
+ this.setSkinByName(this.animation.skinName);
308
+
309
+ if (this.animation.name)
310
+ this.play(this.animation.name, this.animation.loop);
311
+
312
+ this._baseObject.state.addListener({ event: this._eventHandler.bind(this) });
313
+ };
314
+
315
+ _eventHandler(entry, event) {
316
+ this.emit(Urso.events.MODULES_OBJECTS_SPINE_EVENT, { eventName: event.data.name, name: this.name, class: this.class });
317
+ }
318
+
319
+ _addToSlot(slotName, object, replaceSlotContents) {
320
+ if (!object?._baseObject) {
321
+ Urso.logger.warn('ModulesObjectsModelsSpine _addToSlot error: invalid object ' + object);
322
+ return;
323
+ }
324
+
325
+ const spine = this._baseObject;
326
+ const slotIndex = spine.spineData.slots.findIndex(({ name }) => name === slotName);
327
+ const currentSlot = spine.slotContainers[slotIndex];
328
+
329
+ if (currentSlot) {
330
+ object._baseObject.scale.y = -1;
331
+
332
+ Urso.objects.removeChild(object.parent, object, true);
333
+
334
+ if (replaceSlotContents)
335
+ currentSlot.removeChildren(); //todo check if its proxy and reset parent
336
+
337
+ this.addChild(object); //todo make removeChild for addedToSlotObjects
338
+ currentSlot.addChild(object._baseObject);
339
+ Urso.objects.refreshStyles();
340
+ } else {
341
+ Urso.logger.warn('ModulesObjectsModelsSpine _addToSlot error: no spine slot ' + slotName);
342
+ }
343
+ }
344
+
345
+ /**
346
+ * get animation timeScale
347
+ * @returns Number
348
+ */
349
+ getTimeScale() {
350
+ return Urso.scenes.timeScale * this.animation.timeScale;
351
+ }
352
+ }
353
+
354
+ export default ModulesObjectsModelsSpine;