gdcore-tools 2.0.0-beta6 → 2.0.0-beta8

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 (139) hide show
  1. package/dist/Runtime/Cordova/config.xml +4 -0
  2. package/dist/Runtime/Cordova/package.json +12 -20
  3. package/dist/Runtime/CustomRuntimeObject.js +1 -1
  4. package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
  5. package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js +1 -1
  6. package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js.map +2 -2
  7. package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js +1 -1
  8. package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js.map +2 -2
  9. package/dist/Runtime/Extensions/3D/AmbientLight.js +1 -1
  10. package/dist/Runtime/Extensions/3D/AmbientLight.js.map +2 -2
  11. package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js +1 -1
  12. package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +2 -2
  13. package/dist/Runtime/Extensions/3D/DirectionalLight.js +1 -1
  14. package/dist/Runtime/Extensions/3D/DirectionalLight.js.map +2 -2
  15. package/dist/Runtime/Extensions/3D/ExponentialFog.js +1 -1
  16. package/dist/Runtime/Extensions/3D/ExponentialFog.js.map +2 -2
  17. package/dist/Runtime/Extensions/3D/HemisphereLight.js +1 -1
  18. package/dist/Runtime/Extensions/3D/HemisphereLight.js.map +2 -2
  19. package/dist/Runtime/Extensions/3D/JsExtension.js +419 -228
  20. package/dist/Runtime/Extensions/3D/LinearFog.js +1 -1
  21. package/dist/Runtime/Extensions/3D/LinearFog.js.map +2 -2
  22. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js +1 -1
  23. package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js.map +2 -2
  24. package/dist/Runtime/Extensions/AdvancedWindow/electron-advancedwindowtools.js +1 -1
  25. package/dist/Runtime/Extensions/AdvancedWindow/electron-advancedwindowtools.js.map +2 -2
  26. package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js +1 -1
  27. package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js.map +2 -2
  28. package/dist/Runtime/Extensions/BBText/JsExtension.js +45 -42
  29. package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js +1 -1
  30. package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js.map +2 -2
  31. package/dist/Runtime/Extensions/BitmapText/JsExtension.js +40 -49
  32. package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js +1 -1
  33. package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js.map +2 -2
  34. package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js +1 -1
  35. package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js.map +2 -2
  36. package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js +1 -1
  37. package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js.map +2 -2
  38. package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js +1 -1
  39. package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js.map +2 -2
  40. package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js +1 -1
  41. package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js.map +2 -2
  42. package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js +1 -1
  43. package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js.map +2 -2
  44. package/dist/Runtime/Extensions/ExampleJsExtension/JsExtension.js +18 -21
  45. package/dist/Runtime/Extensions/Firebase/B_firebasetools/C_firebasetools.js +1 -1
  46. package/dist/Runtime/Extensions/Firebase/B_firebasetools/C_firebasetools.js.map +2 -2
  47. package/dist/Runtime/Extensions/JsExtensionTypes.d.ts +8 -2
  48. package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js +1 -1
  49. package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js.map +2 -2
  50. package/dist/Runtime/Extensions/Lighting/JsExtension.js +50 -38
  51. package/dist/Runtime/Extensions/Lighting/lightruntimeobject-pixi-renderer.js +1 -1
  52. package/dist/Runtime/Extensions/Lighting/lightruntimeobject-pixi-renderer.js.map +2 -2
  53. package/dist/Runtime/Extensions/Multiplayer/JsExtension.js +15 -0
  54. package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js +1 -1
  55. package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +2 -2
  56. package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js.map +2 -2
  57. package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js +1 -1
  58. package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
  59. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js +1 -1
  60. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js.map +2 -2
  61. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js +1 -1
  62. package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js.map +2 -2
  63. package/dist/Runtime/Extensions/Physics2Behavior/JsExtension.js +76 -24
  64. package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js +1 -1
  65. package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js.map +2 -2
  66. package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js +1 -1
  67. package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js.map +2 -2
  68. package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js +1 -1
  69. package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
  70. package/dist/Runtime/Extensions/Spine/JsExtension.js +45 -36
  71. package/dist/Runtime/Extensions/Spine/spineruntimeobject.js +1 -1
  72. package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
  73. package/dist/Runtime/Extensions/TextInput/JsExtension.js +52 -55
  74. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js +1 -1
  75. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js.map +2 -2
  76. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js +1 -1
  77. package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js.map +2 -2
  78. package/dist/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js +1 -1
  79. package/dist/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js.map +2 -2
  80. package/dist/Runtime/Extensions/TextObject/textruntimeobject.js +1 -1
  81. package/dist/Runtime/Extensions/TextObject/textruntimeobject.js.map +2 -2
  82. package/dist/Runtime/Extensions/TileMap/JsExtension.js +430 -261
  83. package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js +1 -1
  84. package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js.map +2 -2
  85. package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js +1 -1
  86. package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js.map +2 -2
  87. package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js +1 -1
  88. package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js.map +1 -1
  89. package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map +1 -1
  90. package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts +1 -0
  91. package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts.map +1 -1
  92. package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js +1 -1
  93. package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +2 -2
  94. package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js +1 -1
  95. package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js.map +2 -2
  96. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js +1 -1
  97. package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
  98. package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js +1 -1
  99. package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
  100. package/dist/Runtime/Extensions/Video/JsExtension.js +35 -44
  101. package/dist/Runtime/Extensions/Video/videoruntimeobject.js +1 -1
  102. package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
  103. package/dist/Runtime/ResourceLoader.js +1 -1
  104. package/dist/Runtime/ResourceLoader.js.map +2 -2
  105. package/dist/Runtime/RuntimeInstanceContainer.js.map +2 -2
  106. package/dist/Runtime/debugger-client/hot-reloader.js +2 -2
  107. package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
  108. package/dist/Runtime/events-tools/inputtools.js +1 -1
  109. package/dist/Runtime/events-tools/inputtools.js.map +2 -2
  110. package/dist/Runtime/events-tools/objecttools.js +1 -1
  111. package/dist/Runtime/events-tools/objecttools.js.map +2 -2
  112. package/dist/Runtime/gd.js +1 -1
  113. package/dist/Runtime/gd.js.map +2 -2
  114. package/dist/Runtime/howler-sound-manager/howler-sound-manager.js +1 -1
  115. package/dist/Runtime/howler-sound-manager/howler-sound-manager.js.map +2 -2
  116. package/dist/Runtime/inputmanager.js +1 -1
  117. package/dist/Runtime/inputmanager.js.map +2 -2
  118. package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js +1 -1
  119. package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js.map +2 -2
  120. package/dist/Runtime/pixi-renderers/pixi-filters-tools.js +1 -1
  121. package/dist/Runtime/pixi-renderers/pixi-filters-tools.js.map +2 -2
  122. package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js +1 -1
  123. package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js.map +2 -2
  124. package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js +1 -1
  125. package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js.map +2 -2
  126. package/dist/Runtime/runtimegame.js +1 -1
  127. package/dist/Runtime/runtimegame.js.map +1 -1
  128. package/dist/Runtime/runtimeobject.js +1 -1
  129. package/dist/Runtime/runtimeobject.js.map +2 -2
  130. package/dist/Runtime/spriteruntimeobject.js +1 -1
  131. package/dist/Runtime/spriteruntimeobject.js.map +2 -2
  132. package/dist/Runtime/types/project-data.d.ts +5 -0
  133. package/dist/lib/libGD.cjs +1 -1
  134. package/dist/lib/libGD.d.cts +5 -0
  135. package/dist/lib/libGD.wasm +0 -0
  136. package/dist/loaders.cjs +3 -1
  137. package/dist/loaders.d.cts +2 -0
  138. package/gd.d.ts +74 -30
  139. package/package.json +3 -3
@@ -54,7 +54,8 @@ module.exports = {
54
54
  .addIncludeFile('Extensions/Spine/pixi-spine/pixi-spine.js')
55
55
  .addIncludeFile('Extensions/Spine/managers/pixi-spine-atlas-manager.js')
56
56
  .addIncludeFile('Extensions/Spine/managers/pixi-spine-manager.js')
57
- .setCategoryFullName(_('Advanced'));
57
+ .setCategoryFullName(_('Advanced'))
58
+ .setOpenFullEditorLabel(_('Edit animations'));
58
59
 
59
60
  object
60
61
  .addExpressionAndConditionAndAction(
@@ -166,6 +167,7 @@ module.exports = {
166
167
  this._pixiObject.addChild(this._rect);
167
168
  this._pixiContainer.addChild(this._pixiObject);
168
169
 
170
+ this._spineResourceName = '';
169
171
  this._loadSpine();
170
172
  }
171
173
 
@@ -174,6 +176,17 @@ module.exports = {
174
176
  }
175
177
 
176
178
  update() {
179
+ const object = gd.castObject(
180
+ this._associatedObjectConfiguration,
181
+ gd.SpineObjectConfiguration
182
+ );
183
+
184
+ const spineResourceName = object.getSpineResourceName();
185
+ if (this._spineResourceName !== spineResourceName) {
186
+ this._spineResourceName = spineResourceName;
187
+ this._loadSpine();
188
+ }
189
+
177
190
  this._pixiObject.position.set(
178
191
  this._instance.getX(),
179
192
  this._instance.getY()
@@ -182,12 +195,33 @@ module.exports = {
182
195
  this._instance.getAngle()
183
196
  );
184
197
 
198
+ // Do not hide completely an object so it can still be manipulated
199
+ const alphaForDisplay = Math.max(
200
+ this._instance.getOpacity() / 255,
201
+ 0.5
202
+ );
203
+ this._pixiObject.alpha = alphaForDisplay;
204
+ // Scale is already handled below, so we just apply the flip here.
205
+ this._pixiObject.scale.x =
206
+ Math.abs(this._pixiObject.scale.x) *
207
+ (this._instance.isFlippedX() ? -1 : 1);
208
+ this._pixiObject.scale.y =
209
+ Math.abs(this._pixiObject.scale.y) *
210
+ (this._instance.isFlippedY() ? -1 : 1);
211
+
185
212
  this.setAnimation(this._instance.getRawDoubleProperty('animation'));
186
213
 
214
+ const scale = object.getScale() || 1;
215
+
216
+ const spine = this._spine;
217
+ if (spine) {
218
+ const localBounds = spine.getLocalBounds(undefined, true);
219
+ this._initialWidth = localBounds.width * scale;
220
+ this._initialHeight = localBounds.height * scale;
221
+ }
222
+
187
223
  const width = this.getWidth();
188
224
  const height = this.getHeight();
189
- const { _spine: spine } = this;
190
-
191
225
  if (spine) {
192
226
  spine.width = width;
193
227
  spine.height = height;
@@ -234,7 +268,9 @@ module.exports = {
234
268
  */
235
269
  setAnimation(index) {
236
270
  const { _spine: spine } = this;
237
- const configuration = this._getConfiguration();
271
+ const configuration = gd.asSpineConfiguration(
272
+ this._associatedObjectConfiguration
273
+ );
238
274
 
239
275
  if (
240
276
  !spine ||
@@ -262,8 +298,6 @@ module.exports = {
262
298
  spine.state.tracks[0].trackTime = 0;
263
299
  spine.update(0);
264
300
  spine.autoUpdate = false;
265
- this._initialWidth = spine.width * this.getScale();
266
- this._initialHeight = spine.height * this.getScale();
267
301
  }
268
302
 
269
303
  /**
@@ -280,41 +314,18 @@ module.exports = {
280
314
  return this._initialHeight !== null ? this._initialHeight : 256;
281
315
  }
282
316
 
283
- /**
284
- * @returns {number} defined scale
285
- */
286
- getScale() {
287
- return Number(this._getProperties().get('scale').getValue()) || 1;
288
- }
289
-
290
317
  onRemovedFromScene() {
291
318
  super.onRemovedFromScene();
292
319
  this._pixiObject.destroy({ children: true });
293
320
  }
294
321
 
295
- /**
296
- * @returns this spine object configuration
297
- */
298
- _getConfiguration() {
299
- return gd.asSpineConfiguration(this._associatedObjectConfiguration);
300
- }
301
-
302
- /**
303
- * @returns this object properties container
304
- */
305
- _getProperties() {
306
- return this._associatedObjectConfiguration.getProperties();
307
- }
308
-
309
322
  _loadSpine() {
310
- const properties = this._getProperties();
311
- const spineResourceName = properties
312
- .get('spineResourceName')
313
- .getValue();
314
-
315
323
  this._pixiResourcesLoader
316
- .getSpineData(this._project, spineResourceName)
324
+ .getSpineData(this._project, this._spineResourceName)
317
325
  .then((spineDataOrLoadingError) => {
326
+ if (this._wasDestroyed) return;
327
+ if (this._spine) this._pixiObject.removeChild(this._spine);
328
+
318
329
  if (!spineDataOrLoadingError.skeleton) {
319
330
  console.error(
320
331
  'Unable to load Spine (' +
@@ -329,13 +340,11 @@ module.exports = {
329
340
 
330
341
  try {
331
342
  this._spine = new PIXI.Spine(spineDataOrLoadingError.skeleton);
343
+ this._pixiObject.addChild(this._spine);
332
344
  } catch (error) {
333
345
  console.error('Exception while loading Spine.', error);
334
346
  this._spine = null;
335
- return;
336
347
  }
337
- this._pixiObject.addChild(this._spine);
338
- this.update();
339
348
  });
340
349
  }
341
350
  }
@@ -1,2 +1,2 @@
1
- var gdjs;(function(n){class a extends n.RuntimeObject{constructor(i,e){super(i,e);this._opacity=255;this._scaleX=1;this._scaleY=1;this._flippedX=!1;this._flippedY=!1;this._currentAnimationIndex=-1;this._animationSpeedScale=1;this._animationPaused=!1;this._isPausedFrameDirty=!1;this._animations=e.content.animations,this._originalScale=e.content.scale,this.spineResourceName=e.content.spineResourceName,this._animationMixingDuration=0,this._renderer=new n.SpineRuntimeObjectRenderer(this,i),this.setAnimationIndex(0),this._renderer.updateAnimation(0),this.onCreated()}update(i){if(this._animationPaused){this._isPausedFrameDirty&&(this._renderer.updateAnimation(0),this.invalidateHitboxes(),this._isPausedFrameDirty=!1);return}const e=this.getElapsedTime()/1e3;this._renderer.updateAnimation(e*this._animationSpeedScale),this.invalidateHitboxes()}getRendererObject(){return this._renderer.getRendererObject()}updateFromObjectData(i,e){return super.updateFromObjectData(i,e),i.content.scale!==e.content.scale&&(this._originalScale=e.content.scale,this._renderer.updateScale(),this.invalidateHitboxes()),!0}getNetworkSyncData(){return{...super.getNetworkSyncData(),opa:this._opacity,wid:this.getWidth(),hei:this.getHeight(),scaX:this.getScaleX(),scaY:this.getScaleY(),flipX:this.isFlippedX(),flipY:this.isFlippedY(),ani:this.getAnimationIndex(),anmd:this.getAnimationMixingDuration(),anp:this.isAnimationPaused(),anss:this.getAnimationSpeedScale(),anet:this.getAnimationElapsedTime()}}updateFromNetworkSyncData(i){super.updateFromNetworkSyncData(i),i.opa!==void 0&&i.opa!==this._opacity&&this.setOpacity(i.opa),i.wid!==void 0&&i.wid!==this.getWidth()&&this.setWidth(i.wid),i.hei!==void 0&&i.hei!==this.getHeight()&&this.setHeight(i.hei),i.scaX!==void 0&&i.scaX!==this.getScaleX()&&this.setScaleX(i.scaX),i.scaY!==void 0&&i.scaY!==this.getScaleY()&&this.setScaleY(i.scaY),i.flipX!==void 0&&i.flipX!==this.isFlippedX()&&this.flipX(i.flipX),i.flipY!==void 0&&i.flipY!==this.isFlippedY()&&this.flipY(i.flipY),i.ani!==void 0&&i.ani!==this.getAnimationIndex()&&this.setAnimationIndex(i.ani),i.anmd!==void 0&&i.anmd!==this.getAnimationMixingDuration()&&this.setAnimationMixingDuration(i.anmd),i.anp!==void 0&&i.anp!==this.isAnimationPaused()&&(i.anp?this.pauseAnimation():this.resumeAnimation()),i.anss!==void 0&&i.anss!==this.getAnimationSpeedScale()&&this.setAnimationSpeedScale(i.anss),i.anet!==void 0&&i.anet!==this.getAnimationElapsedTime()&&this.setAnimationElapsedTime(i.anet)}extraInitializationFromInitialInstance(i){const e=i.numberProperties.find(t=>t.name==="animation"),s=e?e.value:this._currentAnimationIndex;this.setAnimationIndexWithMixing(s,0),i.customSize&&(this.setSize(i.width,i.height),this.invalidateHitboxes())}getDrawableX(){const i=this._renderer.getOriginOffset();return this.getX()+i.x}getDrawableY(){const i=this._renderer.getOriginOffset();return this.getY()+i.y}getCenterX(){return-this._renderer.getOriginOffset().x}getCenterY(){return-this._renderer.getOriginOffset().y}onDestroyed(){super.onDestroyed(),this._renderer.onDestroy()}setX(i){super.setX(i),this._renderer.updatePosition()}setY(i){super.setY(i),this._renderer.updatePosition()}setAngle(i){super.setAngle(i),this._renderer.updateAngle()}setOpacity(i){this._opacity=Math.max(0,Math.min(255,i)),this._renderer.updateOpacity()}getOpacity(){return this._opacity}getWidth(){return this._renderer.getWidth()}getHeight(){return this._renderer.getHeight()}setWidth(i){const e=this._renderer.getUnscaledWidth();e!==0&&this.setScaleX(i/e)}setHeight(i){const e=this._renderer.getUnscaledHeight();e!==0&&this.setScaleY(i/e)}setSize(i,e){this.setWidth(i),this.setHeight(e)}setScale(i){i<0&&(i=0),!(i===Math.abs(this._scaleX)&&i===Math.abs(this._scaleY))&&(this._scaleX=i*(this._flippedX?-1:1),this._scaleY=i*(this._flippedY?-1:1),this._renderer.updateScale(),this.invalidateHitboxes())}setScaleX(i){i<0&&(i=0),i!==Math.abs(this._scaleX)&&(this._scaleX=i*(this._flippedX?-1:1),this._renderer.updateScale(),this.invalidateHitboxes())}setScaleY(i){i<0&&(i=0),i!==Math.abs(this._scaleY)&&(this._scaleY=i*(this._flippedY?-1:1),this._renderer.updateScale(),this.invalidateHitboxes())}getScale(){const i=Math.abs(this._scaleX),e=Math.abs(this._scaleY);return i===e?i:Math.sqrt(i*e)}getScaleY(){return Math.abs(this._scaleY)}getScaleX(){return Math.abs(this._scaleX)}isFlippedX(){return this._flippedX}isFlippedY(){return this._flippedY}flipX(i){i!==this._flippedX&&(this._scaleX*=-1,this._flippedX=i,this.invalidateHitboxes(),this._renderer.updateScale())}flipY(i){i!==this._flippedY&&(this._scaleY*=-1,this._flippedY=i,this.invalidateHitboxes(),this._renderer.updateScale())}setAnimationIndex(i){this.setAnimationIndexWithMixing(i,this._animationMixingDuration)}setAnimationIndexWithMixing(i,e){if(this._animations.length===0||this._currentAnimationIndex===i||!this.isAnimationIndex(i))return;const s=this._animations[this._currentAnimationIndex],t=this._animations[i];this._currentAnimationIndex=i,s&&this._renderer.setMixing(s.source,t.source,e),this._renderer.setAnimation(t.source,t.loop),this._isPausedFrameDirty=!0}setAnimationName(i){this.setAnimationNameWithMixing(i,this._animationMixingDuration)}setAnimationNameWithMixing(i,e){this.setAnimationIndexWithMixing(this.getAnimationIndexFor(i),e)}getAnimationIndexFor(i){return this._animations.findIndex(e=>e.name===i)}getAnimationMixingDuration(){return this._animationMixingDuration}setAnimationMixingDuration(i){this._animationMixingDuration=i}getAnimationIndex(){return this._currentAnimationIndex}getAnimationName(){return this.isAnimationIndex(this._currentAnimationIndex)?this._animations[this._currentAnimationIndex].name:""}isAnimationIndex(i){return Number.isInteger(i)&&i>=0&&i<this._animations.length}hasAnimationEnded(){return this._renderer.isAnimationComplete()}isAnimationPaused(){return this._animationPaused}pauseAnimation(){this._animationPaused=!0}resumeAnimation(){this._animationPaused=!1}getAnimationSpeedScale(){return this._animationSpeedScale}setAnimationSpeedScale(i){this._animationSpeedScale=i}getAnimationElapsedTime(){return this._animations.length===0?0:this._renderer.getAnimationElapsedTime()}setAnimationElapsedTime(i){this._animations.length!==0&&(this._renderer.setAnimationElapsedTime(i),this._isPausedFrameDirty=!0)}getPointAttachmentX(i,e){return this._renderer.getPointAttachmentPosition(i,e).x}getPointAttachmentY(i,e){return this._renderer.getPointAttachmentPosition(i,e).y}getAnimationDuration(){return this._animations.length===0?0:this._renderer.getAnimationDuration(this._animations[this._currentAnimationIndex].source)}}n.SpineRuntimeObject=a,n.registerObject("SpineObject::SpineObject",n.SpineRuntimeObject)})(gdjs||(gdjs={}));
1
+ var gdjs;(function(n){class r extends n.RuntimeObject{constructor(i,e){super(i,e);this._opacity=255;this._scaleX=1;this._scaleY=1;this._flippedX=!1;this._flippedY=!1;this._currentAnimationIndex=-1;this._animationSpeedScale=1;this._animationPaused=!1;this._isPausedFrameDirty=!1;this._animations=e.content.animations,this._originalScale=e.content.scale,this.spineResourceName=e.content.spineResourceName,this._animationMixingDuration=0,this._renderer=new n.SpineRuntimeObjectRenderer(this,i),this.setAnimationIndex(0),this._renderer.updateAnimation(0),this.onCreated()}update(i){if(this._animationPaused){this._isPausedFrameDirty&&(this._renderer.updateAnimation(0),this.invalidateHitboxes(),this._isPausedFrameDirty=!1);return}const e=this.getElapsedTime()/1e3;this._renderer.updateAnimation(e*this._animationSpeedScale),this.invalidateHitboxes()}getRendererObject(){return this._renderer.getRendererObject()}updateFromObjectData(i,e){return super.updateFromObjectData(i,e),i.content.scale!==e.content.scale&&(this._originalScale=e.content.scale,this._renderer.updateScale(),this.invalidateHitboxes()),!0}getNetworkSyncData(){return{...super.getNetworkSyncData(),opa:this._opacity,wid:this.getWidth(),hei:this.getHeight(),scaX:this.getScaleX(),scaY:this.getScaleY(),flipX:this.isFlippedX(),flipY:this.isFlippedY(),ani:this.getAnimationIndex(),anmd:this.getAnimationMixingDuration(),anp:this.isAnimationPaused(),anss:this.getAnimationSpeedScale(),anet:this.getAnimationElapsedTime()}}updateFromNetworkSyncData(i){super.updateFromNetworkSyncData(i),i.opa!==void 0&&i.opa!==this._opacity&&this.setOpacity(i.opa),i.wid!==void 0&&i.wid!==this.getWidth()&&this.setWidth(i.wid),i.hei!==void 0&&i.hei!==this.getHeight()&&this.setHeight(i.hei),i.scaX!==void 0&&i.scaX!==this.getScaleX()&&this.setScaleX(i.scaX),i.scaY!==void 0&&i.scaY!==this.getScaleY()&&this.setScaleY(i.scaY),i.flipX!==void 0&&i.flipX!==this.isFlippedX()&&this.flipX(i.flipX),i.flipY!==void 0&&i.flipY!==this.isFlippedY()&&this.flipY(i.flipY),i.ani!==void 0&&i.ani!==this.getAnimationIndex()&&this.setAnimationIndex(i.ani),i.anmd!==void 0&&i.anmd!==this.getAnimationMixingDuration()&&this.setAnimationMixingDuration(i.anmd),i.anp!==void 0&&i.anp!==this.isAnimationPaused()&&(i.anp?this.pauseAnimation():this.resumeAnimation()),i.anss!==void 0&&i.anss!==this.getAnimationSpeedScale()&&this.setAnimationSpeedScale(i.anss),i.anet!==void 0&&i.anet!==this.getAnimationElapsedTime()&&this.setAnimationElapsedTime(i.anet)}extraInitializationFromInitialInstance(i){const e=i.numberProperties.find(t=>t.name==="animation"),s=e?e.value:this._currentAnimationIndex;this.setAnimationIndexWithMixing(s,0),i.customSize&&(this.setSize(i.width,i.height),this.invalidateHitboxes()),i.opacity!==void 0&&this.setOpacity(i.opacity),i.flippedX&&this.flipX(i.flippedX),i.flippedY&&this.flipY(i.flippedY)}getDrawableX(){const i=this._renderer.getOriginOffset();return this.getX()+i.x}getDrawableY(){const i=this._renderer.getOriginOffset();return this.getY()+i.y}getCenterX(){return-this._renderer.getOriginOffset().x}getCenterY(){return-this._renderer.getOriginOffset().y}onDestroyed(){super.onDestroyed(),this._renderer.onDestroy()}setX(i){super.setX(i),this._renderer.updatePosition()}setY(i){super.setY(i),this._renderer.updatePosition()}setAngle(i){super.setAngle(i),this._renderer.updateAngle()}setOpacity(i){this._opacity=Math.max(0,Math.min(255,i)),this._renderer.updateOpacity()}getOpacity(){return this._opacity}getWidth(){return this._renderer.getWidth()}getHeight(){return this._renderer.getHeight()}setWidth(i){const e=this._renderer.getUnscaledWidth();e!==0&&this.setScaleX(i/e)}setHeight(i){const e=this._renderer.getUnscaledHeight();e!==0&&this.setScaleY(i/e)}setSize(i,e){this.setWidth(i),this.setHeight(e)}setScale(i){i<0&&(i=0),!(i===Math.abs(this._scaleX)&&i===Math.abs(this._scaleY))&&(this._scaleX=i*(this._flippedX?-1:1),this._scaleY=i*(this._flippedY?-1:1),this._renderer.updateScale(),this.invalidateHitboxes())}setScaleX(i){i<0&&(i=0),i!==Math.abs(this._scaleX)&&(this._scaleX=i*(this._flippedX?-1:1),this._renderer.updateScale(),this.invalidateHitboxes())}setScaleY(i){i<0&&(i=0),i!==Math.abs(this._scaleY)&&(this._scaleY=i*(this._flippedY?-1:1),this._renderer.updateScale(),this.invalidateHitboxes())}getScale(){const i=Math.abs(this._scaleX),e=Math.abs(this._scaleY);return i===e?i:Math.sqrt(i*e)}getScaleY(){return Math.abs(this._scaleY)}getScaleX(){return Math.abs(this._scaleX)}isFlippedX(){return this._flippedX}isFlippedY(){return this._flippedY}flipX(i){i!==this._flippedX&&(this._scaleX*=-1,this._flippedX=i,this.invalidateHitboxes(),this._renderer.updateScale())}flipY(i){i!==this._flippedY&&(this._scaleY*=-1,this._flippedY=i,this.invalidateHitboxes(),this._renderer.updateScale())}setAnimationIndex(i){this.setAnimationIndexWithMixing(i,this._animationMixingDuration)}setAnimationIndexWithMixing(i,e){if(this._animations.length===0||this._currentAnimationIndex===i||!this.isAnimationIndex(i))return;const s=this._animations[this._currentAnimationIndex],t=this._animations[i];this._currentAnimationIndex=i,s&&this._renderer.setMixing(s.source,t.source,e),this._renderer.setAnimation(t.source,t.loop),this._isPausedFrameDirty=!0}setAnimationName(i){this.setAnimationNameWithMixing(i,this._animationMixingDuration)}setAnimationNameWithMixing(i,e){this.setAnimationIndexWithMixing(this.getAnimationIndexFor(i),e)}getAnimationIndexFor(i){return this._animations.findIndex(e=>e.name===i)}getAnimationMixingDuration(){return this._animationMixingDuration}setAnimationMixingDuration(i){this._animationMixingDuration=i}getAnimationIndex(){return this._currentAnimationIndex}getAnimationName(){return this.isAnimationIndex(this._currentAnimationIndex)?this._animations[this._currentAnimationIndex].name:""}isAnimationIndex(i){return Number.isInteger(i)&&i>=0&&i<this._animations.length}hasAnimationEnded(){return this._renderer.isAnimationComplete()}isAnimationPaused(){return this._animationPaused}pauseAnimation(){this._animationPaused=!0}resumeAnimation(){this._animationPaused=!1}getAnimationSpeedScale(){return this._animationSpeedScale}setAnimationSpeedScale(i){this._animationSpeedScale=i}getAnimationElapsedTime(){return this._animations.length===0?0:this._renderer.getAnimationElapsedTime()}setAnimationElapsedTime(i){this._animations.length!==0&&(this._renderer.setAnimationElapsedTime(i),this._isPausedFrameDirty=!0)}getPointAttachmentX(i,e){return this._renderer.getPointAttachmentPosition(i,e).x}getPointAttachmentY(i,e){return this._renderer.getPointAttachmentPosition(i,e).y}getAnimationDuration(){return this._animations.length===0?0:this._renderer.getAnimationDuration(this._animations[this._currentAnimationIndex].source)}}n.SpineRuntimeObject=r,n.registerObject("SpineObject::SpineObject",n.SpineRuntimeObject)})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=spineruntimeobject.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../GDevelop/Extensions/Spine/spineruntimeobject.ts"],
4
- "sourcesContent": ["namespace gdjs {\n type SpineAnimation = { name: string; source: string; loop: boolean };\n\n export type SpineObjectDataType = {\n content: {\n opacity: float;\n scale: float;\n timeScale: float;\n spineResourceName: string;\n animations: SpineAnimation[];\n };\n };\n export type SpineObjectData = ObjectData & SpineObjectDataType;\n\n export type SpineNetworkSyncDataType = {\n opa: float;\n wid: float;\n hei: float;\n scaX: float;\n scaY: float;\n flipX: boolean;\n flipY: boolean;\n ani: number;\n anmd: number;\n anp: boolean;\n anss: float;\n anet: number;\n };\n\n export type SpineNetworkSyncData = ObjectNetworkSyncData &\n SpineNetworkSyncDataType;\n\n export class SpineRuntimeObject\n extends gdjs.RuntimeObject\n implements\n gdjs.Resizable,\n gdjs.Scalable,\n gdjs.Animatable,\n gdjs.OpacityHandler {\n private _opacity: float = 255;\n private _scaleX: number = 1;\n private _scaleY: number = 1;\n _originalScale: number;\n private _flippedX: boolean = false;\n private _flippedY: boolean = false;\n private _animations: SpineAnimation[];\n private _currentAnimationIndex = -1;\n private _animationSpeedScale: float = 1;\n private _animationPaused: boolean = false;\n private _isPausedFrameDirty = false;\n /** The duration in second for the smooth transition between 2 animations */\n private _animationMixingDuration: number;\n private _renderer: gdjs.SpineRuntimeObjectPixiRenderer;\n\n readonly spineResourceName: string;\n\n /**\n * @param instanceContainer The container the object belongs to.\n * @param objectData The object data used to initialize the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n objectData: SpineObjectData\n ) {\n super(instanceContainer, objectData);\n\n this._animations = objectData.content.animations;\n this._originalScale = objectData.content.scale;\n this.spineResourceName = objectData.content.spineResourceName;\n this._animationMixingDuration = 0;\n this._renderer = new gdjs.SpineRuntimeObjectRenderer(\n this,\n instanceContainer\n );\n this.setAnimationIndex(0);\n this._renderer.updateAnimation(0);\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n if (this._animationPaused) {\n if (this._isPausedFrameDirty) {\n this._renderer.updateAnimation(0);\n this.invalidateHitboxes();\n this._isPausedFrameDirty = false;\n }\n return;\n }\n const elapsedTime = this.getElapsedTime() / 1000;\n this._renderer.updateAnimation(elapsedTime * this._animationSpeedScale);\n this.invalidateHitboxes();\n }\n\n getRendererObject(): pixi_spine.Spine | PIXI.Container {\n return this._renderer.getRendererObject();\n }\n\n updateFromObjectData(\n oldObjectData: SpineObjectData,\n newObjectData: SpineObjectData\n ): boolean {\n super.updateFromObjectData(oldObjectData, newObjectData);\n\n if (oldObjectData.content.scale !== newObjectData.content.scale) {\n this._originalScale = newObjectData.content.scale;\n this._renderer.updateScale();\n this.invalidateHitboxes();\n }\n\n return true;\n }\n\n getNetworkSyncData(): SpineNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n opa: this._opacity,\n wid: this.getWidth(),\n hei: this.getHeight(),\n scaX: this.getScaleX(),\n scaY: this.getScaleY(),\n flipX: this.isFlippedX(),\n flipY: this.isFlippedY(),\n ani: this.getAnimationIndex(),\n anmd: this.getAnimationMixingDuration(),\n anp: this.isAnimationPaused(),\n anss: this.getAnimationSpeedScale(),\n anet: this.getAnimationElapsedTime(),\n };\n }\n\n updateFromNetworkSyncData(syncData: SpineNetworkSyncData): void {\n super.updateFromNetworkSyncData(syncData);\n\n if (syncData.opa !== undefined && syncData.opa !== this._opacity) {\n this.setOpacity(syncData.opa);\n }\n if (syncData.wid !== undefined && syncData.wid !== this.getWidth()) {\n this.setWidth(syncData.wid);\n }\n if (syncData.hei !== undefined && syncData.hei !== this.getHeight()) {\n this.setHeight(syncData.hei);\n }\n if (syncData.scaX !== undefined && syncData.scaX !== this.getScaleX()) {\n this.setScaleX(syncData.scaX);\n }\n if (syncData.scaY !== undefined && syncData.scaY !== this.getScaleY()) {\n this.setScaleY(syncData.scaY);\n }\n if (\n syncData.flipX !== undefined &&\n syncData.flipX !== this.isFlippedX()\n ) {\n this.flipX(syncData.flipX);\n }\n if (\n syncData.flipY !== undefined &&\n syncData.flipY !== this.isFlippedY()\n ) {\n this.flipY(syncData.flipY);\n }\n if (\n syncData.ani !== undefined &&\n syncData.ani !== this.getAnimationIndex()\n ) {\n this.setAnimationIndex(syncData.ani);\n }\n if (\n syncData.anmd !== undefined &&\n syncData.anmd !== this.getAnimationMixingDuration()\n ) {\n this.setAnimationMixingDuration(syncData.anmd);\n }\n if (\n syncData.anp !== undefined &&\n syncData.anp !== this.isAnimationPaused()\n ) {\n syncData.anp ? this.pauseAnimation() : this.resumeAnimation();\n }\n if (\n syncData.anss !== undefined &&\n syncData.anss !== this.getAnimationSpeedScale()\n ) {\n this.setAnimationSpeedScale(syncData.anss);\n }\n if (\n syncData.anet !== undefined &&\n syncData.anet !== this.getAnimationElapsedTime()\n ) {\n this.setAnimationElapsedTime(syncData.anet);\n }\n }\n\n extraInitializationFromInitialInstance(\n initialInstanceData: InstanceData\n ): void {\n const animationData = initialInstanceData.numberProperties.find(\n (data) => data.name === 'animation'\n );\n const animationIndex = animationData\n ? animationData.value\n : this._currentAnimationIndex;\n\n this.setAnimationIndexWithMixing(animationIndex, 0);\n\n if (initialInstanceData.customSize) {\n this.setSize(initialInstanceData.width, initialInstanceData.height);\n this.invalidateHitboxes();\n }\n }\n\n getDrawableX(): number {\n const originOffset = this._renderer.getOriginOffset();\n\n return this.getX() + originOffset.x;\n }\n\n getDrawableY(): number {\n const originOffset = this._renderer.getOriginOffset();\n\n return this.getY() + originOffset.y;\n }\n\n getCenterX(): float {\n const originOffset = this._renderer.getOriginOffset();\n return -originOffset.x;\n }\n\n getCenterY(): float {\n const originOffset = this._renderer.getOriginOffset();\n return -originOffset.y;\n }\n\n onDestroyed(): void {\n super.onDestroyed();\n this._renderer.onDestroy();\n }\n\n setX(x: float): void {\n super.setX(x);\n this._renderer.updatePosition();\n }\n\n setY(y: float): void {\n super.setY(y);\n this._renderer.updatePosition();\n }\n\n setAngle(angle: float): void {\n super.setAngle(angle);\n this._renderer.updateAngle();\n }\n\n setOpacity(opacity: float): void {\n this._opacity = Math.max(0, Math.min(255, opacity));\n this._renderer.updateOpacity();\n }\n\n getOpacity(): float {\n return this._opacity;\n }\n\n getWidth(): float {\n return this._renderer.getWidth();\n }\n\n getHeight(): float {\n return this._renderer.getHeight();\n }\n\n setWidth(newWidth: float): void {\n const unscaledWidth = this._renderer.getUnscaledWidth();\n if (unscaledWidth !== 0) {\n this.setScaleX(newWidth / unscaledWidth);\n }\n }\n\n setHeight(newHeight: float): void {\n const unscaledHeight = this._renderer.getUnscaledHeight();\n if (unscaledHeight !== 0) {\n this.setScaleY(newHeight / unscaledHeight);\n }\n }\n\n setSize(newWidth: number, newHeight: number): void {\n this.setWidth(newWidth);\n this.setHeight(newHeight);\n }\n\n setScale(newScale: float): void {\n if (newScale < 0) {\n newScale = 0;\n }\n if (\n newScale === Math.abs(this._scaleX) &&\n newScale === Math.abs(this._scaleY)\n ) {\n return;\n }\n this._scaleX = newScale * (this._flippedX ? -1 : 1);\n this._scaleY = newScale * (this._flippedY ? -1 : 1);\n this._renderer.updateScale();\n this.invalidateHitboxes();\n }\n\n setScaleX(newScale: float): void {\n if (newScale < 0) {\n newScale = 0;\n }\n if (newScale === Math.abs(this._scaleX)) {\n return;\n }\n this._scaleX = newScale * (this._flippedX ? -1 : 1);\n this._renderer.updateScale();\n this.invalidateHitboxes();\n }\n\n setScaleY(newScale: float): void {\n if (newScale < 0) {\n newScale = 0;\n }\n if (newScale === Math.abs(this._scaleY)) {\n return;\n }\n this._scaleY = newScale * (this._flippedY ? -1 : 1);\n this._renderer.updateScale();\n this.invalidateHitboxes();\n }\n\n /**\n * Get the scale of the object (or the geometric mean of the X and Y scale in case they are different).\n *\n * @return the scale of the object (or the geometric mean of the X and Y scale in case they are different).\n */\n getScale(): float {\n const scaleX = Math.abs(this._scaleX);\n const scaleY = Math.abs(this._scaleY);\n return scaleX === scaleY ? scaleX : Math.sqrt(scaleX * scaleY);\n }\n\n getScaleY(): float {\n return Math.abs(this._scaleY);\n }\n\n getScaleX(): float {\n return Math.abs(this._scaleX);\n }\n\n isFlippedX(): boolean {\n return this._flippedX;\n }\n\n isFlippedY(): boolean {\n return this._flippedY;\n }\n\n flipX(enable: boolean) {\n if (enable !== this._flippedX) {\n this._scaleX *= -1;\n this._flippedX = enable;\n this.invalidateHitboxes();\n this._renderer.updateScale();\n }\n }\n\n flipY(enable: boolean) {\n if (enable !== this._flippedY) {\n this._scaleY *= -1;\n this._flippedY = enable;\n this.invalidateHitboxes();\n this._renderer.updateScale();\n }\n }\n\n setAnimationIndex(animationIndex: number): void {\n this.setAnimationIndexWithMixing(\n animationIndex,\n this._animationMixingDuration\n );\n }\n\n setAnimationIndexWithMixing(\n animationIndex: number,\n mixingDuration: number\n ): void {\n if (\n this._animations.length === 0 ||\n this._currentAnimationIndex === animationIndex ||\n !this.isAnimationIndex(animationIndex)\n ) {\n return;\n }\n const previousAnimation = this._animations[this._currentAnimationIndex];\n const newAnimation = this._animations[animationIndex];\n this._currentAnimationIndex = animationIndex;\n\n if (previousAnimation) {\n this._renderer.setMixing(\n previousAnimation.source,\n newAnimation.source,\n mixingDuration\n );\n }\n this._renderer.setAnimation(newAnimation.source, newAnimation.loop);\n this._isPausedFrameDirty = true;\n }\n\n setAnimationName(animationName: string): void {\n this.setAnimationNameWithMixing(\n animationName,\n this._animationMixingDuration\n );\n }\n\n setAnimationNameWithMixing(\n animationName: string,\n mixingDuration: number\n ): void {\n this.setAnimationIndexWithMixing(\n this.getAnimationIndexFor(animationName),\n mixingDuration\n );\n }\n\n getAnimationIndexFor(animationName: string): number {\n return this._animations.findIndex(\n (animation) => animation.name === animationName\n );\n }\n\n /**\n * Return the duration in second for the smooth transition between 2 animations.\n */\n getAnimationMixingDuration(): number {\n return this._animationMixingDuration;\n }\n\n /**\n * Change the duration in second for the smooth transition between 2 animations.\n */\n setAnimationMixingDuration(animationMixingDuration: number): void {\n this._animationMixingDuration = animationMixingDuration;\n }\n\n getAnimationIndex(): number {\n return this._currentAnimationIndex;\n }\n\n getAnimationName(): string {\n return this.isAnimationIndex(this._currentAnimationIndex)\n ? this._animations[this._currentAnimationIndex].name\n : '';\n }\n\n isAnimationIndex(animationIndex: number): boolean {\n return (\n Number.isInteger(animationIndex) &&\n animationIndex >= 0 &&\n animationIndex < this._animations.length\n );\n }\n\n hasAnimationEnded(): boolean {\n return this._renderer.isAnimationComplete();\n }\n\n isAnimationPaused() {\n return this._animationPaused;\n }\n\n pauseAnimation() {\n this._animationPaused = true;\n }\n\n resumeAnimation() {\n this._animationPaused = false;\n }\n\n getAnimationSpeedScale() {\n return this._animationSpeedScale;\n }\n\n setAnimationSpeedScale(ratio: float): void {\n this._animationSpeedScale = ratio;\n }\n\n getAnimationElapsedTime(): number {\n if (this._animations.length === 0) {\n return 0;\n }\n return this._renderer.getAnimationElapsedTime();\n }\n\n setAnimationElapsedTime(time: number): void {\n if (this._animations.length === 0) {\n return;\n }\n this._renderer.setAnimationElapsedTime(time);\n this._isPausedFrameDirty = true;\n }\n\n getPointAttachmentX(attachmentName: string, slotName?: string): number {\n return this._renderer.getPointAttachmentPosition(attachmentName, slotName)\n .x;\n }\n\n getPointAttachmentY(attachmentName: string, slotName?: string): number {\n return this._renderer.getPointAttachmentPosition(attachmentName, slotName)\n .y;\n }\n\n getAnimationDuration(): number {\n if (this._animations.length === 0) {\n return 0;\n }\n return this._renderer.getAnimationDuration(\n this._animations[this._currentAnimationIndex].source\n );\n }\n }\n\n gdjs.registerObject('SpineObject::SpineObject', gdjs.SpineRuntimeObject);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["namespace gdjs {\n type SpineAnimation = { name: string; source: string; loop: boolean };\n\n export type SpineObjectDataType = {\n content: {\n opacity: float;\n scale: float;\n timeScale: float;\n spineResourceName: string;\n animations: SpineAnimation[];\n };\n };\n export type SpineObjectData = ObjectData & SpineObjectDataType;\n\n export type SpineNetworkSyncDataType = {\n opa: float;\n wid: float;\n hei: float;\n scaX: float;\n scaY: float;\n flipX: boolean;\n flipY: boolean;\n ani: number;\n anmd: number;\n anp: boolean;\n anss: float;\n anet: number;\n };\n\n export type SpineNetworkSyncData = ObjectNetworkSyncData &\n SpineNetworkSyncDataType;\n\n export class SpineRuntimeObject\n extends gdjs.RuntimeObject\n implements\n gdjs.Resizable,\n gdjs.Scalable,\n gdjs.Animatable,\n gdjs.OpacityHandler {\n private _opacity: float = 255;\n private _scaleX: number = 1;\n private _scaleY: number = 1;\n _originalScale: number;\n private _flippedX: boolean = false;\n private _flippedY: boolean = false;\n private _animations: SpineAnimation[];\n private _currentAnimationIndex = -1;\n private _animationSpeedScale: float = 1;\n private _animationPaused: boolean = false;\n private _isPausedFrameDirty = false;\n /** The duration in second for the smooth transition between 2 animations */\n private _animationMixingDuration: number;\n private _renderer: gdjs.SpineRuntimeObjectPixiRenderer;\n\n readonly spineResourceName: string;\n\n /**\n * @param instanceContainer The container the object belongs to.\n * @param objectData The object data used to initialize the object\n */\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n objectData: SpineObjectData\n ) {\n super(instanceContainer, objectData);\n\n this._animations = objectData.content.animations;\n this._originalScale = objectData.content.scale;\n this.spineResourceName = objectData.content.spineResourceName;\n this._animationMixingDuration = 0;\n this._renderer = new gdjs.SpineRuntimeObjectRenderer(\n this,\n instanceContainer\n );\n this.setAnimationIndex(0);\n this._renderer.updateAnimation(0);\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n if (this._animationPaused) {\n if (this._isPausedFrameDirty) {\n this._renderer.updateAnimation(0);\n this.invalidateHitboxes();\n this._isPausedFrameDirty = false;\n }\n return;\n }\n const elapsedTime = this.getElapsedTime() / 1000;\n this._renderer.updateAnimation(elapsedTime * this._animationSpeedScale);\n this.invalidateHitboxes();\n }\n\n getRendererObject(): pixi_spine.Spine | PIXI.Container {\n return this._renderer.getRendererObject();\n }\n\n updateFromObjectData(\n oldObjectData: SpineObjectData,\n newObjectData: SpineObjectData\n ): boolean {\n super.updateFromObjectData(oldObjectData, newObjectData);\n\n if (oldObjectData.content.scale !== newObjectData.content.scale) {\n this._originalScale = newObjectData.content.scale;\n this._renderer.updateScale();\n this.invalidateHitboxes();\n }\n\n return true;\n }\n\n getNetworkSyncData(): SpineNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n opa: this._opacity,\n wid: this.getWidth(),\n hei: this.getHeight(),\n scaX: this.getScaleX(),\n scaY: this.getScaleY(),\n flipX: this.isFlippedX(),\n flipY: this.isFlippedY(),\n ani: this.getAnimationIndex(),\n anmd: this.getAnimationMixingDuration(),\n anp: this.isAnimationPaused(),\n anss: this.getAnimationSpeedScale(),\n anet: this.getAnimationElapsedTime(),\n };\n }\n\n updateFromNetworkSyncData(syncData: SpineNetworkSyncData): void {\n super.updateFromNetworkSyncData(syncData);\n\n if (syncData.opa !== undefined && syncData.opa !== this._opacity) {\n this.setOpacity(syncData.opa);\n }\n if (syncData.wid !== undefined && syncData.wid !== this.getWidth()) {\n this.setWidth(syncData.wid);\n }\n if (syncData.hei !== undefined && syncData.hei !== this.getHeight()) {\n this.setHeight(syncData.hei);\n }\n if (syncData.scaX !== undefined && syncData.scaX !== this.getScaleX()) {\n this.setScaleX(syncData.scaX);\n }\n if (syncData.scaY !== undefined && syncData.scaY !== this.getScaleY()) {\n this.setScaleY(syncData.scaY);\n }\n if (\n syncData.flipX !== undefined &&\n syncData.flipX !== this.isFlippedX()\n ) {\n this.flipX(syncData.flipX);\n }\n if (\n syncData.flipY !== undefined &&\n syncData.flipY !== this.isFlippedY()\n ) {\n this.flipY(syncData.flipY);\n }\n if (\n syncData.ani !== undefined &&\n syncData.ani !== this.getAnimationIndex()\n ) {\n this.setAnimationIndex(syncData.ani);\n }\n if (\n syncData.anmd !== undefined &&\n syncData.anmd !== this.getAnimationMixingDuration()\n ) {\n this.setAnimationMixingDuration(syncData.anmd);\n }\n if (\n syncData.anp !== undefined &&\n syncData.anp !== this.isAnimationPaused()\n ) {\n syncData.anp ? this.pauseAnimation() : this.resumeAnimation();\n }\n if (\n syncData.anss !== undefined &&\n syncData.anss !== this.getAnimationSpeedScale()\n ) {\n this.setAnimationSpeedScale(syncData.anss);\n }\n if (\n syncData.anet !== undefined &&\n syncData.anet !== this.getAnimationElapsedTime()\n ) {\n this.setAnimationElapsedTime(syncData.anet);\n }\n }\n\n extraInitializationFromInitialInstance(\n initialInstanceData: InstanceData\n ): void {\n const animationData = initialInstanceData.numberProperties.find(\n (data) => data.name === 'animation'\n );\n const animationIndex = animationData\n ? animationData.value\n : this._currentAnimationIndex;\n\n this.setAnimationIndexWithMixing(animationIndex, 0);\n\n if (initialInstanceData.customSize) {\n this.setSize(initialInstanceData.width, initialInstanceData.height);\n this.invalidateHitboxes();\n }\n if (initialInstanceData.opacity !== undefined) {\n this.setOpacity(initialInstanceData.opacity);\n }\n if (initialInstanceData.flippedX) {\n this.flipX(initialInstanceData.flippedX);\n }\n if (initialInstanceData.flippedY) {\n this.flipY(initialInstanceData.flippedY);\n }\n }\n\n getDrawableX(): number {\n const originOffset = this._renderer.getOriginOffset();\n\n return this.getX() + originOffset.x;\n }\n\n getDrawableY(): number {\n const originOffset = this._renderer.getOriginOffset();\n\n return this.getY() + originOffset.y;\n }\n\n getCenterX(): float {\n const originOffset = this._renderer.getOriginOffset();\n return -originOffset.x;\n }\n\n getCenterY(): float {\n const originOffset = this._renderer.getOriginOffset();\n return -originOffset.y;\n }\n\n onDestroyed(): void {\n super.onDestroyed();\n this._renderer.onDestroy();\n }\n\n setX(x: float): void {\n super.setX(x);\n this._renderer.updatePosition();\n }\n\n setY(y: float): void {\n super.setY(y);\n this._renderer.updatePosition();\n }\n\n setAngle(angle: float): void {\n super.setAngle(angle);\n this._renderer.updateAngle();\n }\n\n setOpacity(opacity: float): void {\n this._opacity = Math.max(0, Math.min(255, opacity));\n this._renderer.updateOpacity();\n }\n\n getOpacity(): float {\n return this._opacity;\n }\n\n getWidth(): float {\n return this._renderer.getWidth();\n }\n\n getHeight(): float {\n return this._renderer.getHeight();\n }\n\n setWidth(newWidth: float): void {\n const unscaledWidth = this._renderer.getUnscaledWidth();\n if (unscaledWidth !== 0) {\n this.setScaleX(newWidth / unscaledWidth);\n }\n }\n\n setHeight(newHeight: float): void {\n const unscaledHeight = this._renderer.getUnscaledHeight();\n if (unscaledHeight !== 0) {\n this.setScaleY(newHeight / unscaledHeight);\n }\n }\n\n setSize(newWidth: number, newHeight: number): void {\n this.setWidth(newWidth);\n this.setHeight(newHeight);\n }\n\n setScale(newScale: float): void {\n if (newScale < 0) {\n newScale = 0;\n }\n if (\n newScale === Math.abs(this._scaleX) &&\n newScale === Math.abs(this._scaleY)\n ) {\n return;\n }\n this._scaleX = newScale * (this._flippedX ? -1 : 1);\n this._scaleY = newScale * (this._flippedY ? -1 : 1);\n this._renderer.updateScale();\n this.invalidateHitboxes();\n }\n\n setScaleX(newScale: float): void {\n if (newScale < 0) {\n newScale = 0;\n }\n if (newScale === Math.abs(this._scaleX)) {\n return;\n }\n this._scaleX = newScale * (this._flippedX ? -1 : 1);\n this._renderer.updateScale();\n this.invalidateHitboxes();\n }\n\n setScaleY(newScale: float): void {\n if (newScale < 0) {\n newScale = 0;\n }\n if (newScale === Math.abs(this._scaleY)) {\n return;\n }\n this._scaleY = newScale * (this._flippedY ? -1 : 1);\n this._renderer.updateScale();\n this.invalidateHitboxes();\n }\n\n /**\n * Get the scale of the object (or the geometric mean of the X and Y scale in case they are different).\n *\n * @return the scale of the object (or the geometric mean of the X and Y scale in case they are different).\n */\n getScale(): float {\n const scaleX = Math.abs(this._scaleX);\n const scaleY = Math.abs(this._scaleY);\n return scaleX === scaleY ? scaleX : Math.sqrt(scaleX * scaleY);\n }\n\n getScaleY(): float {\n return Math.abs(this._scaleY);\n }\n\n getScaleX(): float {\n return Math.abs(this._scaleX);\n }\n\n isFlippedX(): boolean {\n return this._flippedX;\n }\n\n isFlippedY(): boolean {\n return this._flippedY;\n }\n\n flipX(enable: boolean) {\n if (enable !== this._flippedX) {\n this._scaleX *= -1;\n this._flippedX = enable;\n this.invalidateHitboxes();\n this._renderer.updateScale();\n }\n }\n\n flipY(enable: boolean) {\n if (enable !== this._flippedY) {\n this._scaleY *= -1;\n this._flippedY = enable;\n this.invalidateHitboxes();\n this._renderer.updateScale();\n }\n }\n\n setAnimationIndex(animationIndex: number): void {\n this.setAnimationIndexWithMixing(\n animationIndex,\n this._animationMixingDuration\n );\n }\n\n setAnimationIndexWithMixing(\n animationIndex: number,\n mixingDuration: number\n ): void {\n if (\n this._animations.length === 0 ||\n this._currentAnimationIndex === animationIndex ||\n !this.isAnimationIndex(animationIndex)\n ) {\n return;\n }\n const previousAnimation = this._animations[this._currentAnimationIndex];\n const newAnimation = this._animations[animationIndex];\n this._currentAnimationIndex = animationIndex;\n\n if (previousAnimation) {\n this._renderer.setMixing(\n previousAnimation.source,\n newAnimation.source,\n mixingDuration\n );\n }\n this._renderer.setAnimation(newAnimation.source, newAnimation.loop);\n this._isPausedFrameDirty = true;\n }\n\n setAnimationName(animationName: string): void {\n this.setAnimationNameWithMixing(\n animationName,\n this._animationMixingDuration\n );\n }\n\n setAnimationNameWithMixing(\n animationName: string,\n mixingDuration: number\n ): void {\n this.setAnimationIndexWithMixing(\n this.getAnimationIndexFor(animationName),\n mixingDuration\n );\n }\n\n getAnimationIndexFor(animationName: string): number {\n return this._animations.findIndex(\n (animation) => animation.name === animationName\n );\n }\n\n /**\n * Return the duration in second for the smooth transition between 2 animations.\n */\n getAnimationMixingDuration(): number {\n return this._animationMixingDuration;\n }\n\n /**\n * Change the duration in second for the smooth transition between 2 animations.\n */\n setAnimationMixingDuration(animationMixingDuration: number): void {\n this._animationMixingDuration = animationMixingDuration;\n }\n\n getAnimationIndex(): number {\n return this._currentAnimationIndex;\n }\n\n getAnimationName(): string {\n return this.isAnimationIndex(this._currentAnimationIndex)\n ? this._animations[this._currentAnimationIndex].name\n : '';\n }\n\n isAnimationIndex(animationIndex: number): boolean {\n return (\n Number.isInteger(animationIndex) &&\n animationIndex >= 0 &&\n animationIndex < this._animations.length\n );\n }\n\n hasAnimationEnded(): boolean {\n return this._renderer.isAnimationComplete();\n }\n\n isAnimationPaused() {\n return this._animationPaused;\n }\n\n pauseAnimation() {\n this._animationPaused = true;\n }\n\n resumeAnimation() {\n this._animationPaused = false;\n }\n\n getAnimationSpeedScale() {\n return this._animationSpeedScale;\n }\n\n setAnimationSpeedScale(ratio: float): void {\n this._animationSpeedScale = ratio;\n }\n\n getAnimationElapsedTime(): number {\n if (this._animations.length === 0) {\n return 0;\n }\n return this._renderer.getAnimationElapsedTime();\n }\n\n setAnimationElapsedTime(time: number): void {\n if (this._animations.length === 0) {\n return;\n }\n this._renderer.setAnimationElapsedTime(time);\n this._isPausedFrameDirty = true;\n }\n\n getPointAttachmentX(attachmentName: string, slotName?: string): number {\n return this._renderer.getPointAttachmentPosition(attachmentName, slotName)\n .x;\n }\n\n getPointAttachmentY(attachmentName: string, slotName?: string): number {\n return this._renderer.getPointAttachmentPosition(attachmentName, slotName)\n .y;\n }\n\n getAnimationDuration(): number {\n if (this._animations.length === 0) {\n return 0;\n }\n return this._renderer.getAnimationDuration(\n this._animations[this._currentAnimationIndex].source\n );\n }\n }\n\n gdjs.registerObject('SpineObject::SpineObject', gdjs.SpineRuntimeObject);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -31,11 +31,8 @@ module.exports = {
31
31
  .setIcon('JsPlatform/Extensions/text_input.svg');
32
32
 
33
33
  const textInputObject = new gd.ObjectJsImplementation();
34
- textInputObject.updateProperty = function (
35
- objectContent,
36
- propertyName,
37
- newValue
38
- ) {
34
+ textInputObject.updateProperty = function (propertyName, newValue) {
35
+ const objectContent = this.content;
39
36
  if (propertyName === 'initialValue') {
40
37
  objectContent.initialValue = newValue;
41
38
  return true;
@@ -85,8 +82,9 @@ module.exports = {
85
82
 
86
83
  return false;
87
84
  };
88
- textInputObject.getProperties = function (objectContent) {
85
+ textInputObject.getProperties = function () {
89
86
  const objectProperties = new gd.MapStringPropertyDescriptor();
87
+ const objectContent = this.content;
90
88
 
91
89
  objectProperties
92
90
  .getOrCreate('initialValue')
@@ -141,21 +139,21 @@ module.exports = {
141
139
  .setValue(objectContent.readOnly ? 'true' : 'false')
142
140
  .setType('boolean')
143
141
  .setLabel(_('Read only'))
144
- .setGroup(_('Field appearance'));
142
+ .setGroup(_('Field'));
145
143
 
146
144
  objectProperties
147
145
  .getOrCreate('disabled')
148
146
  .setValue(objectContent.disabled ? 'true' : 'false')
149
147
  .setType('boolean')
150
148
  .setLabel(_('Disabled'))
151
- .setGroup(_('Field appearance'));
149
+ .setGroup(_('Field'));
152
150
 
153
151
  objectProperties
154
152
  .getOrCreate('textColor')
155
153
  .setValue(objectContent.textColor || '0;0;0')
156
154
  .setType('color')
157
155
  .setLabel(_('Text color'))
158
- .setGroup(_('Field appearance'));
156
+ .setGroup(_('Font'));
159
157
 
160
158
  objectProperties
161
159
  .getOrCreate('fillColor')
@@ -180,8 +178,8 @@ module.exports = {
180
178
  .getOrCreate('borderColor')
181
179
  .setValue(objectContent.borderColor || '0;0;0')
182
180
  .setType('color')
183
- .setLabel(_('Border color'))
184
- .setGroup(_('Field appearance'));
181
+ .setLabel(_('Color'))
182
+ .setGroup(_('Border appearance'));
185
183
 
186
184
  objectProperties
187
185
  .getOrCreate('borderOpacity')
@@ -192,38 +190,35 @@ module.exports = {
192
190
  ).toString()
193
191
  )
194
192
  .setType('number')
195
- .setLabel(_('Border opacity'))
196
- .setGroup(_('Field appearance'));
193
+ .setLabel(_('Opacity'))
194
+ .setGroup(_('Border appearance'));
197
195
 
198
196
  objectProperties
199
197
  .getOrCreate('borderWidth')
200
198
  .setValue((objectContent.borderWidth || 0).toString())
201
199
  .setType('number')
202
- .setLabel(_('Border width'))
203
- .setGroup(_('Field appearance'));
200
+ .setLabel(_('Width'))
201
+ .setGroup(_('Border appearance'));
204
202
 
205
203
  return objectProperties;
206
204
  };
207
- textInputObject.setRawJSONContent(
208
- JSON.stringify({
209
- initialValue: '',
210
- placeholder: 'Touch to start typing',
211
- fontResourceName: '',
212
- fontSize: 20,
213
- inputType: 'text',
214
- textColor: '0;0;0',
215
- fillColor: '255;255;255',
216
- fillOpacity: 255,
217
- borderColor: '0;0;0',
218
- borderOpacity: 255,
219
- borderWidth: 1,
220
- readOnly: false,
221
- disabled: false,
222
- })
223
- );
205
+ textInputObject.content = {
206
+ initialValue: '',
207
+ placeholder: 'Touch to start typing',
208
+ fontResourceName: '',
209
+ fontSize: 20,
210
+ inputType: 'text',
211
+ textColor: '0;0;0',
212
+ fillColor: '255;255;255',
213
+ fillOpacity: 255,
214
+ borderColor: '0;0;0',
215
+ borderOpacity: 255,
216
+ borderWidth: 1,
217
+ readOnly: false,
218
+ disabled: false,
219
+ };
224
220
 
225
221
  textInputObject.updateInitialInstanceProperty = function (
226
- objectContent,
227
222
  instance,
228
223
  propertyName,
229
224
  newValue
@@ -238,10 +233,7 @@ module.exports = {
238
233
 
239
234
  return false;
240
235
  };
241
- textInputObject.getInitialInstanceProperties = function (
242
- content,
243
- instance
244
- ) {
236
+ textInputObject.getInitialInstanceProperties = function (instance) {
245
237
  const instanceProperties = new gd.MapStringPropertyDescriptor();
246
238
 
247
239
  instanceProperties
@@ -682,18 +674,21 @@ module.exports = {
682
674
 
683
675
  update() {
684
676
  const instance = this._instance;
685
- const properties = this._associatedObjectConfiguration.getProperties();
677
+ const object = gd.castObject(
678
+ this._associatedObjectConfiguration,
679
+ gd.ObjectJsImplementation
680
+ );
686
681
 
687
682
  const placeholder =
688
683
  instance.getRawStringProperty('placeholder') ||
689
- properties.get('placeholder').getValue();
684
+ object.content.placeholder;
690
685
  const initialValue =
691
686
  instance.getRawStringProperty('initialValue') ||
692
- properties.get('initialValue').getValue();
687
+ object.content.initialValue;
693
688
  const hasInitialValue = initialValue !== '';
694
689
  this._pixiText.text = hasInitialValue ? initialValue : placeholder;
695
690
 
696
- const textColor = properties.get('textColor').getValue();
691
+ const textColor = object.content.textColor;
697
692
  const finalTextColor = hasInitialValue
698
693
  ? objectsRenderingService.rgbOrHexToHexNumber(textColor)
699
694
  : 0x888888;
@@ -703,19 +698,20 @@ module.exports = {
703
698
  this._pixiText.dirty = true;
704
699
  }
705
700
 
706
- const fontSize = parseFloat(properties.get('fontSize').getValue());
701
+ const fontSize = object.content.fontSize;
707
702
  if (this._pixiText.style.fontSize !== fontSize) {
708
703
  this._pixiText.style.fontSize = fontSize;
709
704
  this._pixiText.dirty = true;
710
705
  }
711
706
 
712
- const fontResourceName = properties.get('fontResourceName').getValue();
707
+ const fontResourceName = object.content.fontResourceName;
713
708
  if (this._fontResourceName !== fontResourceName) {
714
709
  this._fontResourceName = fontResourceName;
715
710
 
716
711
  this._pixiResourcesLoader
717
712
  .loadFontFamily(this._project, fontResourceName)
718
713
  .then((fontFamily) => {
714
+ if (this._wasDestroyed) return;
719
715
  this._pixiText.style.fontFamily = fontFamily;
720
716
  this._pixiText.dirty = true;
721
717
  })
@@ -744,8 +740,7 @@ module.exports = {
744
740
  this._instance.getAngle()
745
741
  );
746
742
 
747
- const borderWidth =
748
- parseFloat(properties.get('borderWidth').getValue()) || 0;
743
+ const borderWidth = object.content.borderWidth || 0;
749
744
 
750
745
  // Draw the mask for the text.
751
746
  const textOffset = borderWidth + TEXT_MASK_PADDING;
@@ -759,8 +754,7 @@ module.exports = {
759
754
  );
760
755
  this._pixiTextMask.endFill();
761
756
 
762
- const isTextArea =
763
- properties.get('inputType').getValue() === 'text area';
757
+ const isTextArea = object.content.inputType === 'text area';
764
758
 
765
759
  this._pixiText.position.x = textOffset;
766
760
  this._pixiText.position.y = isTextArea
@@ -768,14 +762,10 @@ module.exports = {
768
762
  : height / 2 - this._pixiText.height / 2;
769
763
 
770
764
  // Draw the background and border.
771
- const fillColor = properties.get('fillColor').getValue();
772
- const fillOpacity = parseFloat(
773
- properties.get('fillOpacity').getValue()
774
- );
775
- const borderColor = properties.get('borderColor').getValue();
776
- const borderOpacity = parseFloat(
777
- properties.get('borderOpacity').getValue()
778
- );
765
+ const fillColor = object.content.fillColor;
766
+ const fillOpacity = object.content.fillOpacity;
767
+ const borderColor = object.content.borderColor;
768
+ const borderOpacity = object.content.borderOpacity;
779
769
 
780
770
  this._pixiGraphics.clear();
781
771
  this._pixiGraphics.lineStyle(
@@ -789,6 +779,13 @@ module.exports = {
789
779
  );
790
780
  this._pixiGraphics.drawRect(0, 0, width, height);
791
781
  this._pixiGraphics.endFill();
782
+
783
+ // Do not hide completely an object so it can still be manipulated
784
+ const alphaForDisplay = Math.max(
785
+ this._instance.getOpacity() / 255,
786
+ 0.5
787
+ );
788
+ this._pixiObject.alpha = alphaForDisplay;
792
789
  }
793
790
 
794
791
  getDefaultWidth() {
@@ -1,2 +1,2 @@
1
- var gdjs;(function(a){const m={text:"text",email:"email",password:"password",number:"number","telephone number":"tel",url:"url",search:"search"},n=(o,e)=>"rgba("+o[0]+","+o[1]+","+o[2]+","+e/255+")";class s{constructor(e,t){this._input=null;this._object=e,this._instanceContainer=t,this._runtimeGame=this._instanceContainer.getGame(),this._createElement()}_createElement(){if(this._input)throw new Error("Tried to recreate an input while it already exists.");const e=this._object.getInputType()==="text area";this._input=document.createElement(e?"textarea":"input"),this._input.style.border="1px solid black",this._input.autocomplete="off",this._input.style.borderRadius="0px",this._input.style.backgroundColor="white",this._input.style.position="absolute",this._input.style.resize="none",this._input.style.outline="none",this._input.style.pointerEvents="auto",this._input.style.display="none",this._input.style.boxSizing="border-box",this._input.addEventListener("input",()=>{!this._input||this._object.onRendererInputValueChanged(this._input.value)}),this._input.addEventListener("touchstart",()=>{!this._input||document.activeElement!==this._input&&this._input.focus()}),this.updateString(),this.updateFont(),this.updatePlaceholder(),this.updateOpacity(),this.updateInputType(),this.updateTextColor(),this.updateFillColorAndOpacity(),this.updateBorderColorAndOpacity(),this.updateBorderWidth(),this.updateDisabled(),this.updateReadOnly(),this._runtimeGame.getRenderer().getDomElementContainer().appendChild(this._input)}_destroyElement(){!this._input||(this._input.remove(),this._input=null)}onScenePaused(){this._destroyElement()}onSceneResumed(){this._input||this._createElement()}onDestroy(){this._destroyElement()}updatePreRender(){if(!this._input)return;if(this._object.isHidden()){this._input.style.display="none";return}const e=this._instanceContainer.getLayer(this._object.getLayer());if(!e.isVisible()){this._input.style.display="none";return}const t=a.staticArray(s.prototype.updatePreRender),i=this._instanceContainer.getGame(),r=i.getRenderer(),u=e.convertInverseCoords(this._object.x,this._object.y,0,t),p=u[0],h=u[1],l=e.convertInverseCoords(this._object.x+this._object.getWidth(),this._object.y+this._object.getHeight(),0,t),c=l[0],d=l[1];if(c<0||d<0||p>i.getGameResolutionWidth()||h>i.getGameResolutionHeight()){this._input.style.display="none";return}t[0]=p,t[1]=h,r.convertCanvasToDomElementContainerCoords(t,t);const _=t[0],y=t[1];t[0]=c,t[1]=d,r.convertCanvasToDomElementContainerCoords(t,t);const g=t[0],b=t[1],f=g-_,C=b-y;this._input.style.left=_+"px",this._input.style.top=y+"px",this._input.style.width=f+"px",this._input.style.height=C+"px",this._input.style.transform="rotate3d(0,0,1,"+this._object.getAngle()%360+"deg)",this._input.style.fontSize=this._object.getFontSize()*r.getCanvasToDomElementContainerHeightScale()+"px",this._input.style.display="initial"}updateString(){!this._input||(this._input.value=this._object.getString())}updatePlaceholder(){!this._input||(this._input.placeholder=this._object.getPlaceholder())}updateFont(){!this._input||(this._input.style.fontFamily=this._instanceContainer.getGame().getFontManager().getFontFamily(this._object.getFontResourceName()))}updateOpacity(){!this._input||(this._input.style.opacity=""+this._object.getOpacity()/255)}updateInputType(){if(!this._input)return;const e=this._input instanceof HTMLTextAreaElement,t=this._object.getInputType()==="text area";e!==t&&(this._destroyElement(),this._createElement());const i=m[this._object.getInputType()]||"text";this._input.setAttribute("type",i)}updateTextColor(){!this._input||(this._input.style.color=n(this._object._getRawTextColor(),255))}updateFillColorAndOpacity(){!this._input||(this._input.style.backgroundColor=n(this._object._getRawFillColor(),this._object.getFillOpacity()))}updateBorderColorAndOpacity(){!this._input||(this._input.style.borderColor=n(this._object._getRawBorderColor(),this._object.getBorderOpacity()))}updateBorderWidth(){!this._input||(this._input.style.borderWidth=this._object.getBorderWidth()+"px")}updateDisabled(){!this._input||(this._input.disabled=this._object.isDisabled())}updateReadOnly(){!this._input||(this._input.readOnly=this._object.isReadOnly())}isFocused(){return this._input===document.activeElement}focus(){!this._input||this._input.focus()}}a.TextInputRuntimeObjectRenderer=s})(gdjs||(gdjs={}));
1
+ var gdjs;(function(a){const C={text:"text",email:"email",password:"password",number:"number","telephone number":"tel",url:"url",search:"search"},o=(u,t)=>"rgba("+u[0]+","+u[1]+","+u[2]+","+t/255+")";class r{constructor(t,e){this._input=null;this._object=t,this._instanceContainer=e,this._runtimeGame=this._instanceContainer.getGame(),this._createElement()}_createElement(){if(this._input)throw new Error("Tried to recreate an input while it already exists.");const t=this._object.getInputType()==="text area";this._input=document.createElement(t?"textarea":"input"),this._input.style.border="1px solid black",this._input.autocomplete="off",this._input.style.borderRadius="0px",this._input.style.backgroundColor="white",this._input.style.position="absolute",this._input.style.resize="none",this._input.style.outline="none",this._input.style.pointerEvents="auto",this._input.style.display="none",this._input.style.boxSizing="border-box",this._input.addEventListener("input",()=>{!this._input||this._object.onRendererInputValueChanged(this._input.value)}),this._input.addEventListener("touchstart",()=>{!this._input||document.activeElement!==this._input&&this._input.focus()}),this.updateString(),this.updateFont(),this.updatePlaceholder(),this.updateOpacity(),this.updateInputType(),this.updateTextColor(),this.updateFillColorAndOpacity(),this.updateBorderColorAndOpacity(),this.updateBorderWidth(),this.updateDisabled(),this.updateReadOnly(),this._runtimeGame.getRenderer().getDomElementContainer().appendChild(this._input)}_destroyElement(){!this._input||(this._input.remove(),this._input=null)}onScenePaused(){this._destroyElement()}onSceneResumed(){this._input||this._createElement()}onDestroy(){this._destroyElement()}updatePreRender(){if(!this._input)return;if(this._object.isHidden()){this._input.style.display="none";return}{let n=this._instanceContainer,s=this._object,b=!0;do{if(!n.getLayer(s.getLayer()).isVisible()||!s.isVisible()){this._input.style.display="none";return}n instanceof a.CustomRuntimeObjectInstanceContainer?(s=n.getOwner(),n=s.getInstanceContainer()):b=!1}while(b)}const t=a.staticArray(r.prototype.updatePreRender),e=this._instanceContainer.getGame(),i=e.getRenderer(),p=this._instanceContainer.getLayer(this._object.getLayer()),h=p.convertInverseCoords(this._object.x,this._object.y,0,t),l=h[0],c=h[1],d=p.convertInverseCoords(this._object.x+this._object.getWidth(),this._object.y+this._object.getHeight(),0,t),_=d[0],y=d[1];if(_<0||y<0||l>e.getGameResolutionWidth()||c>e.getGameResolutionHeight()){this._input.style.display="none";return}t[0]=l,t[1]=c,i.convertCanvasToDomElementContainerCoords(t,t);const m=t[0],g=t[1];t[0]=_,t[1]=y,i.convertCanvasToDomElementContainerCoords(t,t);const f=t[0],j=t[1],x=f-m,R=j-g;this._input.style.left=m+"px",this._input.style.top=g+"px",this._input.style.width=x+"px",this._input.style.height=R+"px",this._input.style.transform="rotate3d(0,0,1,"+this._object.getAngle()%360+"deg)",this._input.style.fontSize=this._object.getFontSize()*i.getCanvasToDomElementContainerHeightScale()+"px",this._input.style.display="initial"}updateString(){!this._input||(this._input.value=this._object.getString())}updatePlaceholder(){!this._input||(this._input.placeholder=this._object.getPlaceholder())}updateFont(){!this._input||(this._input.style.fontFamily=this._instanceContainer.getGame().getFontManager().getFontFamily(this._object.getFontResourceName()))}updateOpacity(){!this._input||(this._input.style.opacity=""+this._object.getOpacity()/255)}updateInputType(){if(!this._input)return;const t=this._input instanceof HTMLTextAreaElement,e=this._object.getInputType()==="text area";t!==e&&(this._destroyElement(),this._createElement());const i=C[this._object.getInputType()]||"text";this._input.setAttribute("type",i)}updateTextColor(){!this._input||(this._input.style.color=o(this._object._getRawTextColor(),255))}updateFillColorAndOpacity(){!this._input||(this._input.style.backgroundColor=o(this._object._getRawFillColor(),this._object.getFillOpacity()))}updateBorderColorAndOpacity(){!this._input||(this._input.style.borderColor=o(this._object._getRawBorderColor(),this._object.getBorderOpacity()))}updateBorderWidth(){!this._input||(this._input.style.borderWidth=this._object.getBorderWidth()+"px")}updateDisabled(){!this._input||(this._input.disabled=this._object.isDisabled())}updateReadOnly(){!this._input||(this._input.readOnly=this._object.isReadOnly())}isFocused(){return this._input===document.activeElement}focus(){!this._input||this._input.focus()}}a.TextInputRuntimeObjectRenderer=r})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=textinputruntimeobject-pixi-renderer.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../GDevelop/Extensions/TextInput/textinputruntimeobject-pixi-renderer.ts"],
4
- "sourcesContent": ["namespace gdjs {\n const userFriendlyToHtmlInputTypes = {\n text: 'text',\n email: 'email',\n password: 'password',\n number: 'number',\n 'telephone number': 'tel',\n url: 'url',\n search: 'search',\n };\n\n const formatRgbAndOpacityToCssRgba = (\n rgbColor: [float, float, float],\n opacity: float\n ) => {\n return (\n 'rgba(' +\n rgbColor[0] +\n ',' +\n rgbColor[1] +\n ',' +\n rgbColor[2] +\n ',' +\n opacity / 255 +\n ')'\n );\n };\n\n class TextInputRuntimeObjectPixiRenderer {\n private _object: gdjs.TextInputRuntimeObject;\n private _input: HTMLInputElement | HTMLTextAreaElement | null = null;\n private _instanceContainer: gdjs.RuntimeInstanceContainer;\n private _runtimeGame: gdjs.RuntimeGame;\n\n constructor(\n runtimeObject: gdjs.TextInputRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n this._object = runtimeObject;\n this._instanceContainer = instanceContainer;\n this._runtimeGame = this._instanceContainer.getGame();\n\n this._createElement();\n }\n\n _createElement() {\n if (!!this._input)\n throw new Error('Tried to recreate an input while it already exists.');\n\n const isTextArea = this._object.getInputType() === 'text area';\n this._input = document.createElement(isTextArea ? 'textarea' : 'input');\n this._input.style.border = '1px solid black';\n this._input.autocomplete = 'off';\n this._input.style.borderRadius = '0px';\n this._input.style.backgroundColor = 'white';\n this._input.style.position = 'absolute';\n this._input.style.resize = 'none';\n this._input.style.outline = 'none';\n this._input.style.pointerEvents = 'auto'; // Element can be clicked/touched.\n this._input.style.display = 'none'; // Hide while object is being set up.\n this._input.style.boxSizing = 'border-box'; // Important for iOS, because border is added to width/height.\n\n this._input.addEventListener('input', () => {\n if (!this._input) return;\n\n this._object.onRendererInputValueChanged(this._input.value);\n });\n this._input.addEventListener('touchstart', () => {\n if (!this._input) return;\n\n // Focus directly when touching the input on touchscreens.\n if (document.activeElement !== this._input) this._input.focus();\n });\n\n this.updateString();\n this.updateFont();\n this.updatePlaceholder();\n this.updateOpacity();\n this.updateInputType();\n this.updateTextColor();\n this.updateFillColorAndOpacity();\n this.updateBorderColorAndOpacity();\n this.updateBorderWidth();\n this.updateDisabled();\n this.updateReadOnly();\n\n this._runtimeGame\n .getRenderer()\n .getDomElementContainer()!\n .appendChild(this._input);\n }\n\n _destroyElement() {\n if (!this._input) return;\n this._input.remove();\n this._input = null;\n }\n\n onScenePaused() {\n // This is the only renderer that uses a DOM element. PixiJS renderers\n // usually don't need to know if a scene is paused/resumed,\n // because their renderers are then not used (not part of the other scene graphs).\n // For this object, we need to remove the DOM element whenever it must\n // be not rendered.\n this._destroyElement();\n }\n\n onSceneResumed() {\n // The input must have been destroyed when the scene was paused,\n // in case it still exists, skip recreation.\n if (!this._input) this._createElement();\n }\n\n onDestroy() {\n this._destroyElement();\n }\n\n updatePreRender() {\n if (!this._input) return;\n\n // Hide the input entirely if the object is hidden.\n // Because this object is rendered as a DOM element (and not part of the PixiJS\n // scene graph), we have to do this manually.\n if (this._object.isHidden()) {\n this._input.style.display = 'none';\n return;\n }\n\n // Hide the input entirely if the layer is not visible.\n // Because this object is rendered as a DOM element (and not part of the PixiJS\n // scene graph), we have to do this manually.\n const layer = this._instanceContainer.getLayer(this._object.getLayer());\n if (!layer.isVisible()) {\n this._input.style.display = 'none';\n return;\n }\n\n const workingPoint: FloatPoint = gdjs.staticArray(\n TextInputRuntimeObjectPixiRenderer.prototype.updatePreRender\n ) as FloatPoint;\n\n const runtimeGame = this._instanceContainer.getGame();\n const runtimeGameRenderer = runtimeGame.getRenderer();\n const topLeftCanvasCoordinates = layer.convertInverseCoords(\n this._object.x,\n this._object.y,\n 0,\n workingPoint\n );\n const canvasLeft = topLeftCanvasCoordinates[0];\n const canvasTop = topLeftCanvasCoordinates[1];\n\n const bottomRightCanvasCoordinates = layer.convertInverseCoords(\n this._object.x + this._object.getWidth(),\n this._object.y + this._object.getHeight(),\n 0,\n workingPoint\n );\n const canvasRight = bottomRightCanvasCoordinates[0];\n const canvasBottom = bottomRightCanvasCoordinates[1];\n\n // Hide the input entirely if not visible at all.\n const isOutsideCanvas =\n canvasRight < 0 ||\n canvasBottom < 0 ||\n canvasLeft > runtimeGame.getGameResolutionWidth() ||\n canvasTop > runtimeGame.getGameResolutionHeight();\n if (isOutsideCanvas) {\n this._input.style.display = 'none';\n return;\n }\n\n // Position the input on the container on top of the canvas.\n workingPoint[0] = canvasLeft;\n workingPoint[1] = canvasTop;\n runtimeGameRenderer.convertCanvasToDomElementContainerCoords(\n workingPoint,\n workingPoint\n );\n const pageLeft = workingPoint[0];\n const pageTop = workingPoint[1];\n\n workingPoint[0] = canvasRight;\n workingPoint[1] = canvasBottom;\n runtimeGameRenderer.convertCanvasToDomElementContainerCoords(\n workingPoint,\n workingPoint\n );\n const pageRight = workingPoint[0];\n const pageBottom = workingPoint[1];\n\n const widthInContainer = pageRight - pageLeft;\n const heightInContainer = pageBottom - pageTop;\n\n this._input.style.left = pageLeft + 'px';\n this._input.style.top = pageTop + 'px';\n this._input.style.width = widthInContainer + 'px';\n this._input.style.height = heightInContainer + 'px';\n this._input.style.transform =\n 'rotate3d(0,0,1,' + (this._object.getAngle() % 360) + 'deg)';\n\n // Automatically adjust the font size to follow the game scale.\n this._input.style.fontSize =\n this._object.getFontSize() *\n runtimeGameRenderer.getCanvasToDomElementContainerHeightScale() +\n 'px';\n\n // Display after the object is positioned.\n this._input.style.display = 'initial';\n }\n\n updateString() {\n if (!this._input) return;\n this._input.value = this._object.getString();\n }\n\n updatePlaceholder() {\n if (!this._input) return;\n this._input.placeholder = this._object.getPlaceholder();\n }\n\n updateFont() {\n if (!this._input) return;\n this._input.style.fontFamily = this._instanceContainer\n .getGame()\n .getFontManager()\n .getFontFamily(this._object.getFontResourceName());\n }\n\n updateOpacity() {\n if (!this._input) return;\n this._input.style.opacity = '' + this._object.getOpacity() / 255;\n }\n\n updateInputType() {\n if (!this._input) return;\n\n const isTextArea = this._input instanceof HTMLTextAreaElement;\n const shouldBeTextArea = this._object.getInputType() === 'text area';\n if (isTextArea !== shouldBeTextArea) {\n this._destroyElement();\n this._createElement();\n }\n\n const newType =\n userFriendlyToHtmlInputTypes[this._object.getInputType()] || 'text';\n this._input.setAttribute('type', newType);\n }\n\n updateTextColor() {\n if (!this._input) return;\n\n this._input.style.color = formatRgbAndOpacityToCssRgba(\n this._object._getRawTextColor(),\n 255\n );\n }\n\n updateFillColorAndOpacity() {\n if (!this._input) return;\n\n this._input.style.backgroundColor = formatRgbAndOpacityToCssRgba(\n this._object._getRawFillColor(),\n this._object.getFillOpacity()\n );\n }\n\n updateBorderColorAndOpacity() {\n if (!this._input) return;\n\n this._input.style.borderColor = formatRgbAndOpacityToCssRgba(\n this._object._getRawBorderColor(),\n this._object.getBorderOpacity()\n );\n }\n updateBorderWidth() {\n if (!this._input) return;\n\n this._input.style.borderWidth = this._object.getBorderWidth() + 'px';\n }\n updateDisabled() {\n if (!this._input) return;\n\n this._input.disabled = this._object.isDisabled();\n }\n updateReadOnly() {\n if (!this._input) return;\n\n this._input.readOnly = this._object.isReadOnly();\n }\n\n isFocused() {\n return this._input === document.activeElement;\n }\n\n focus() {\n if (!this._input) return;\n\n this._input.focus();\n }\n }\n\n export const TextInputRuntimeObjectRenderer = TextInputRuntimeObjectPixiRenderer;\n export type TextInputRuntimeObjectRenderer = TextInputRuntimeObjectPixiRenderer;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["namespace gdjs {\n const userFriendlyToHtmlInputTypes = {\n text: 'text',\n email: 'email',\n password: 'password',\n number: 'number',\n 'telephone number': 'tel',\n url: 'url',\n search: 'search',\n };\n\n const formatRgbAndOpacityToCssRgba = (\n rgbColor: [float, float, float],\n opacity: float\n ) => {\n return (\n 'rgba(' +\n rgbColor[0] +\n ',' +\n rgbColor[1] +\n ',' +\n rgbColor[2] +\n ',' +\n opacity / 255 +\n ')'\n );\n };\n\n class TextInputRuntimeObjectPixiRenderer {\n private _object: gdjs.TextInputRuntimeObject;\n private _input: HTMLInputElement | HTMLTextAreaElement | null = null;\n private _instanceContainer: gdjs.RuntimeInstanceContainer;\n private _runtimeGame: gdjs.RuntimeGame;\n\n constructor(\n runtimeObject: gdjs.TextInputRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n this._object = runtimeObject;\n this._instanceContainer = instanceContainer;\n this._runtimeGame = this._instanceContainer.getGame();\n\n this._createElement();\n }\n\n _createElement() {\n if (!!this._input)\n throw new Error('Tried to recreate an input while it already exists.');\n\n const isTextArea = this._object.getInputType() === 'text area';\n this._input = document.createElement(isTextArea ? 'textarea' : 'input');\n this._input.style.border = '1px solid black';\n this._input.autocomplete = 'off';\n this._input.style.borderRadius = '0px';\n this._input.style.backgroundColor = 'white';\n this._input.style.position = 'absolute';\n this._input.style.resize = 'none';\n this._input.style.outline = 'none';\n this._input.style.pointerEvents = 'auto'; // Element can be clicked/touched.\n this._input.style.display = 'none'; // Hide while object is being set up.\n this._input.style.boxSizing = 'border-box'; // Important for iOS, because border is added to width/height.\n\n this._input.addEventListener('input', () => {\n if (!this._input) return;\n\n this._object.onRendererInputValueChanged(this._input.value);\n });\n this._input.addEventListener('touchstart', () => {\n if (!this._input) return;\n\n // Focus directly when touching the input on touchscreens.\n if (document.activeElement !== this._input) this._input.focus();\n });\n\n this.updateString();\n this.updateFont();\n this.updatePlaceholder();\n this.updateOpacity();\n this.updateInputType();\n this.updateTextColor();\n this.updateFillColorAndOpacity();\n this.updateBorderColorAndOpacity();\n this.updateBorderWidth();\n this.updateDisabled();\n this.updateReadOnly();\n\n this._runtimeGame\n .getRenderer()\n .getDomElementContainer()!\n .appendChild(this._input);\n }\n\n _destroyElement() {\n if (!this._input) return;\n this._input.remove();\n this._input = null;\n }\n\n onScenePaused() {\n // This is the only renderer that uses a DOM element. PixiJS renderers\n // usually don't need to know if a scene is paused/resumed,\n // because their renderers are then not used (not part of the other scene graphs).\n // For this object, we need to remove the DOM element whenever it must\n // be not rendered.\n this._destroyElement();\n }\n\n onSceneResumed() {\n // The input must have been destroyed when the scene was paused,\n // in case it still exists, skip recreation.\n if (!this._input) this._createElement();\n }\n\n onDestroy() {\n this._destroyElement();\n }\n\n updatePreRender() {\n if (!this._input) return;\n\n // Hide the input entirely if the object is hidden.\n // Because this object is rendered as a DOM element (and not part of the PixiJS\n // scene graph), we have to do this manually.\n if (this._object.isHidden()) {\n this._input.style.display = 'none';\n return;\n }\n\n // Hide the input entirely if the layer is not visible.\n // Because this object is rendered as a DOM element (and not part of the PixiJS\n // scene graph), we have to do this manually.\n {\n let instanceContainer = this._instanceContainer;\n let object: gdjs.RuntimeObject = this._object;\n let hasParent = true;\n do {\n const layer = instanceContainer.getLayer(object.getLayer());\n if (!layer.isVisible() || !object.isVisible()) {\n this._input.style.display = 'none';\n return;\n }\n // TODO Declare an interface to move up in the object tree.\n if (\n instanceContainer instanceof\n gdjs.CustomRuntimeObjectInstanceContainer\n ) {\n object = instanceContainer.getOwner();\n instanceContainer = object.getInstanceContainer();\n } else {\n hasParent = false;\n }\n } while (hasParent);\n }\n\n const workingPoint: FloatPoint = gdjs.staticArray(\n TextInputRuntimeObjectPixiRenderer.prototype.updatePreRender\n ) as FloatPoint;\n\n const runtimeGame = this._instanceContainer.getGame();\n const runtimeGameRenderer = runtimeGame.getRenderer();\n const layer = this._instanceContainer.getLayer(this._object.getLayer());\n const topLeftCanvasCoordinates = layer.convertInverseCoords(\n this._object.x,\n this._object.y,\n 0,\n workingPoint\n );\n const canvasLeft = topLeftCanvasCoordinates[0];\n const canvasTop = topLeftCanvasCoordinates[1];\n\n const bottomRightCanvasCoordinates = layer.convertInverseCoords(\n this._object.x + this._object.getWidth(),\n this._object.y + this._object.getHeight(),\n 0,\n workingPoint\n );\n const canvasRight = bottomRightCanvasCoordinates[0];\n const canvasBottom = bottomRightCanvasCoordinates[1];\n\n // Hide the input entirely if not visible at all.\n const isOutsideCanvas =\n canvasRight < 0 ||\n canvasBottom < 0 ||\n canvasLeft > runtimeGame.getGameResolutionWidth() ||\n canvasTop > runtimeGame.getGameResolutionHeight();\n if (isOutsideCanvas) {\n this._input.style.display = 'none';\n return;\n }\n\n // Position the input on the container on top of the canvas.\n workingPoint[0] = canvasLeft;\n workingPoint[1] = canvasTop;\n runtimeGameRenderer.convertCanvasToDomElementContainerCoords(\n workingPoint,\n workingPoint\n );\n const pageLeft = workingPoint[0];\n const pageTop = workingPoint[1];\n\n workingPoint[0] = canvasRight;\n workingPoint[1] = canvasBottom;\n runtimeGameRenderer.convertCanvasToDomElementContainerCoords(\n workingPoint,\n workingPoint\n );\n const pageRight = workingPoint[0];\n const pageBottom = workingPoint[1];\n\n const widthInContainer = pageRight - pageLeft;\n const heightInContainer = pageBottom - pageTop;\n\n this._input.style.left = pageLeft + 'px';\n this._input.style.top = pageTop + 'px';\n this._input.style.width = widthInContainer + 'px';\n this._input.style.height = heightInContainer + 'px';\n this._input.style.transform =\n 'rotate3d(0,0,1,' + (this._object.getAngle() % 360) + 'deg)';\n\n // Automatically adjust the font size to follow the game scale.\n this._input.style.fontSize =\n this._object.getFontSize() *\n runtimeGameRenderer.getCanvasToDomElementContainerHeightScale() +\n 'px';\n\n // Display after the object is positioned.\n this._input.style.display = 'initial';\n }\n\n updateString() {\n if (!this._input) return;\n this._input.value = this._object.getString();\n }\n\n updatePlaceholder() {\n if (!this._input) return;\n this._input.placeholder = this._object.getPlaceholder();\n }\n\n updateFont() {\n if (!this._input) return;\n this._input.style.fontFamily = this._instanceContainer\n .getGame()\n .getFontManager()\n .getFontFamily(this._object.getFontResourceName());\n }\n\n updateOpacity() {\n if (!this._input) return;\n this._input.style.opacity = '' + this._object.getOpacity() / 255;\n }\n\n updateInputType() {\n if (!this._input) return;\n\n const isTextArea = this._input instanceof HTMLTextAreaElement;\n const shouldBeTextArea = this._object.getInputType() === 'text area';\n if (isTextArea !== shouldBeTextArea) {\n this._destroyElement();\n this._createElement();\n }\n\n const newType =\n userFriendlyToHtmlInputTypes[this._object.getInputType()] || 'text';\n this._input.setAttribute('type', newType);\n }\n\n updateTextColor() {\n if (!this._input) return;\n\n this._input.style.color = formatRgbAndOpacityToCssRgba(\n this._object._getRawTextColor(),\n 255\n );\n }\n\n updateFillColorAndOpacity() {\n if (!this._input) return;\n\n this._input.style.backgroundColor = formatRgbAndOpacityToCssRgba(\n this._object._getRawFillColor(),\n this._object.getFillOpacity()\n );\n }\n\n updateBorderColorAndOpacity() {\n if (!this._input) return;\n\n this._input.style.borderColor = formatRgbAndOpacityToCssRgba(\n this._object._getRawBorderColor(),\n this._object.getBorderOpacity()\n );\n }\n updateBorderWidth() {\n if (!this._input) return;\n\n this._input.style.borderWidth = this._object.getBorderWidth() + 'px';\n }\n updateDisabled() {\n if (!this._input) return;\n\n this._input.disabled = this._object.isDisabled();\n }\n updateReadOnly() {\n if (!this._input) return;\n\n this._input.readOnly = this._object.isReadOnly();\n }\n\n isFocused() {\n return this._input === document.activeElement;\n }\n\n focus() {\n if (!this._input) return;\n\n this._input.focus();\n }\n }\n\n export const TextInputRuntimeObjectRenderer = TextInputRuntimeObjectPixiRenderer;\n export type TextInputRuntimeObjectRenderer = TextInputRuntimeObjectPixiRenderer;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }