gdcore-tools 2.0.0-beta6 → 2.0.0-beta7

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 (138) 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.d.cts +2 -0
  137. package/gd.d.ts +74 -30
  138. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../GDevelop/GDJS/Runtime/inputmanager.ts"],
4
- "sourcesContent": ["/*\n * GDevelop JS Platform\n * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved.\n * This project is released under the MIT License.\n */\nnamespace gdjs {\n type Touch = { x: float; y: float; justEnded: boolean };\n\n /**\n * Store input made on a canvas: mouse position, key pressed\n * and touches states.\n */\n export class InputManager {\n static MOUSE_LEFT_BUTTON: integer = 0;\n static MOUSE_RIGHT_BUTTON: integer = 1;\n static MOUSE_MIDDLE_BUTTON: integer = 2;\n static MOUSE_BACK_BUTTON: integer = 3;\n static MOUSE_FORWARD_BUTTON: integer = 4;\n static MOUSE_TOUCH_ID: integer = 1;\n\n /**\n * Holds the raw keyCodes of the keys which only have left/right\n * variants and should default to their left variant values\n * if location is not specified.\n */\n static _DEFAULT_LEFT_VARIANT_KEYS: integer[] = [16, 17, 18, 91];\n _pressedKeys: Hashtable<boolean>;\n _releasedKeys: Hashtable<boolean>;\n _lastPressedKey: float = 0;\n _pressedMouseButtons: Array<boolean>;\n _releasedMouseButtons: Array<boolean>;\n /**\n * The cursor X position (moved by mouse and touch events).\n */\n _cursorX: float = 0;\n /**\n * The cursor Y position (moved by mouse and touch events).\n */\n _cursorY: float = 0;\n /**\n * The mouse X position (only moved by mouse events).\n */\n _mouseX: float = 0;\n /**\n * The mouse Y position (only moved by mouse events).\n */\n _mouseY: float = 0;\n _isMouseInsideCanvas: boolean = true;\n _mouseWheelDelta: float = 0;\n // TODO Remove _touches when there is no longer SpritePanelButton 1.2.0\n // extension in the wild.\n _touches = {\n firstKey: (): string | number | null => {\n for (const key in this._mouseOrTouches.items) {\n // Exclude mouse key.\n if (key !== '1') {\n return key;\n }\n }\n return null;\n },\n };\n _mouseOrTouches: Hashtable<Touch>;\n //Identifiers of the touches that started during/before the frame.\n _startedTouches: Array<integer> = [];\n\n //Identifiers of the touches that ended during/before the frame.\n _endedTouches: Array<integer> = [];\n _touchSimulateMouse: boolean = true;\n\n /**\n * @deprecated\n */\n _lastStartedTouchIndex = 0;\n /**\n * @deprecated\n */\n _lastEndedTouchIndex = 0;\n\n constructor() {\n this._pressedKeys = new Hashtable();\n this._releasedKeys = new Hashtable();\n this._pressedMouseButtons = new Array(5);\n this._releasedMouseButtons = new Array(5);\n this._mouseOrTouches = new Hashtable();\n }\n\n /**\n * Returns the \"location-aware\" keyCode, given a raw keyCode\n * and location. The location corresponds to KeyboardEvent.location,\n * which should be 0 for standard keys, 1 for left keys,\n * 2 for right keys, and 3 for numpad keys.\n *\n * @param keyCode The raw key code\n * @param location The location\n */\n _getLocationAwareKeyCode(\n keyCode: number,\n location: number | null | undefined\n ): integer {\n if (location) {\n // If it is a numpad number, do not modify it.\n if (96 <= keyCode && keyCode <= 105) {\n return keyCode;\n }\n return keyCode + 1000 * location;\n }\n if (InputManager._DEFAULT_LEFT_VARIANT_KEYS.indexOf(keyCode) !== -1) {\n return keyCode + 1000;\n }\n return keyCode;\n }\n\n /**\n * Should be called whenever a key is pressed. The location corresponds to\n * KeyboardEvent.location, which should be 0 for standard keys, 1 for left keys,\n * 2 for right keys, and 3 for numpad keys.\n * @param keyCode The raw key code associated to the key press.\n * @param location The location of the event.\n */\n onKeyPressed(keyCode: number, location?: number): void {\n const locationAwareKeyCode = this._getLocationAwareKeyCode(\n keyCode,\n location\n );\n this._pressedKeys.put(locationAwareKeyCode, true);\n this._lastPressedKey = locationAwareKeyCode;\n }\n\n /**\n * Should be called whenever a key is released. The location corresponds to\n * KeyboardEvent.location, which should be 0 for standard keys, 1 for left keys,\n * 2 for right keys, and 3 for numpad keys.\n * @param keyCode The raw key code associated to the key release.\n * @param location The location of the event.\n */\n onKeyReleased(keyCode: number, location?: number): void {\n const locationAwareKeyCode = this._getLocationAwareKeyCode(\n keyCode,\n location\n );\n this._pressedKeys.put(locationAwareKeyCode, false);\n this._releasedKeys.put(locationAwareKeyCode, true);\n }\n\n /**\n * Return the location-aware code of the last key that was pressed.\n * @return The location-aware code of the last key pressed.\n */\n getLastPressedKey(): number {\n return this._lastPressedKey;\n }\n\n /**\n * Return true if the key corresponding to the location-aware keyCode is pressed.\n * @param locationAwareKeyCode The location-aware key code to be tested.\n */\n isKeyPressed(locationAwareKeyCode: number): boolean {\n return (\n this._pressedKeys.containsKey(locationAwareKeyCode) &&\n this._pressedKeys.get(locationAwareKeyCode)\n );\n }\n\n /**\n * Return true if the key corresponding to the location-aware keyCode was released during the last frame.\n * @param locationAwareKeyCode The location-aware key code to be tested.\n */\n wasKeyReleased(locationAwareKeyCode: number) {\n return (\n this._releasedKeys.containsKey(locationAwareKeyCode) &&\n this._releasedKeys.get(locationAwareKeyCode)\n );\n }\n\n /**\n * Return true if any key is pressed.\n * @return true if any key is pressed.\n */\n anyKeyPressed(): boolean {\n for (const keyCode in this._pressedKeys.items) {\n if (this._pressedKeys.items.hasOwnProperty(keyCode)) {\n if (this._pressedKeys.items[keyCode]) {\n return true;\n }\n }\n }\n return false;\n }\n /**\n * Return true if any key is released.\n * @return true if any key is released.\n */\n anyKeyReleased(): boolean {\n for (const keyCode in this._releasedKeys.items) {\n if (this._releasedKeys.items.hasOwnProperty(keyCode)) {\n if (this._releasedKeys.items[keyCode]) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Should be called when the mouse is moved.\n *\n * Please note that the coordinates must be expressed relative to the view position.\n *\n * @param x The mouse new X position\n * @param y The mouse new Y position\n */\n onMouseMove(x: float, y: float): void {\n this._setCursorPosition(x, y);\n this._mouseX = x;\n this._mouseY = y;\n if (this.isMouseButtonPressed(InputManager.MOUSE_LEFT_BUTTON)) {\n this._moveTouch(\n InputManager.MOUSE_TOUCH_ID,\n this.getCursorX(),\n this.getCursorY()\n );\n }\n }\n\n _setCursorPosition(x: float, y: float): void {\n this._cursorX = x;\n this._cursorY = y;\n }\n\n /**\n * Get the cursor X position.\n * The cursor is moved by mouse and touch events.\n *\n * @return the cursor X position, relative to the game view.\n */\n getCursorX(): float {\n return this._cursorX;\n }\n\n /**\n * Get the cursor Y position.\n * The cursor is moved by mouse and touch events.\n *\n * @return the cursor Y position, relative to the game view.\n */\n getCursorY(): float {\n return this._cursorY;\n }\n\n /**\n * Get the mouse X position.\n *\n * @return the mouse X position, relative to the game view.\n */\n getMouseX(): float {\n return this._mouseX;\n }\n\n /**\n * Get the mouse Y position.\n *\n * @return the mouse Y position, relative to the game view.\n */\n getMouseY(): float {\n return this._mouseY;\n }\n\n /**\n * Should be called when the mouse leave the canvas.\n */\n onMouseLeave(): void {\n this._isMouseInsideCanvas = false;\n }\n\n /**\n * Should be called when the mouse enter the canvas.\n */\n onMouseEnter(): void {\n this._isMouseInsideCanvas = true;\n }\n\n /**\n * @return true when the mouse is inside the canvas.\n */\n isMouseInsideCanvas(): boolean {\n return this._isMouseInsideCanvas;\n }\n\n /**\n * Should be called whenever a mouse button is pressed.\n * @param buttonCode The mouse button code associated to the event.\n * See InputManager.MOUSE_LEFT_BUTTON, InputManager.MOUSE_RIGHT_BUTTON, InputManager.MOUSE_MIDDLE_BUTTON\n */\n onMouseButtonPressed(buttonCode: number): void {\n this._setMouseButtonPressed(buttonCode);\n if (buttonCode === InputManager.MOUSE_LEFT_BUTTON) {\n this._addTouch(\n InputManager.MOUSE_TOUCH_ID,\n this.getCursorX(),\n this.getCursorY()\n );\n }\n }\n\n _setMouseButtonPressed(buttonCode: number): void {\n this._pressedMouseButtons[buttonCode] = true;\n this._releasedMouseButtons[buttonCode] = false;\n }\n\n /**\n * Should be called whenever a mouse button is released.\n * @param buttonCode The mouse button code associated to the event. (see onMouseButtonPressed)\n */\n onMouseButtonReleased(buttonCode: number): void {\n this._setMouseButtonReleased(buttonCode);\n if (buttonCode === InputManager.MOUSE_LEFT_BUTTON) {\n this._removeTouch(InputManager.MOUSE_TOUCH_ID);\n }\n }\n\n _setMouseButtonReleased(buttonCode: number): void {\n this._pressedMouseButtons[buttonCode] = false;\n this._releasedMouseButtons[buttonCode] = true;\n }\n\n /**\n * Return true if the mouse button corresponding to buttonCode is pressed.\n * @param buttonCode The mouse button code (0: Left button, 1: Right button).\n */\n isMouseButtonPressed(buttonCode: number): boolean {\n return (\n this._pressedMouseButtons[buttonCode] !== undefined &&\n this._pressedMouseButtons[buttonCode]\n );\n }\n\n /**\n * Return true if the mouse button corresponding to buttonCode was just released.\n * @param buttonCode The mouse button code (0: Left button, 1: Right button).\n */\n isMouseButtonReleased(buttonCode: number): boolean {\n return (\n this._releasedMouseButtons[buttonCode] !== undefined &&\n this._releasedMouseButtons[buttonCode]\n );\n }\n\n /**\n * Should be called whenever the mouse wheel is used\n * @param wheelDelta The mouse wheel delta\n */\n onMouseWheel(wheelDelta: number): void {\n this._mouseWheelDelta = wheelDelta;\n }\n\n /**\n * Return the mouse wheel delta\n */\n getMouseWheelDelta(): float {\n return this._mouseWheelDelta;\n }\n\n /**\n * Get a touch X position.\n *\n * @return the touch X position, relative to the game view.\n */\n getTouchX(publicIdentifier: integer): float {\n if (!this._mouseOrTouches.containsKey(publicIdentifier)) {\n return 0;\n }\n return this._mouseOrTouches.get(publicIdentifier).x;\n }\n\n /**\n * Get a touch Y position.\n *\n * @return the touch Y position, relative to the game view.\n */\n getTouchY(publicIdentifier: integer): float {\n if (!this._mouseOrTouches.containsKey(publicIdentifier)) {\n return 0;\n }\n return this._mouseOrTouches.get(publicIdentifier).y;\n }\n\n /**\n * @param publicIdentifier the touch identifier\n * @returns true if the touch has just ended.\n */\n hasTouchEnded(publicIdentifier: integer): boolean {\n return (\n this._endedTouches.includes(publicIdentifier) &&\n // A touch that end then start in one frame is ignored\n // because it's probably noise.\n this._mouseOrTouches.get(publicIdentifier).justEnded\n );\n }\n\n /**\n * Update and return the array containing the identifiers of all touches.\n */\n getAllTouchIdentifiers(): Array<integer> {\n InputManager._allTouchIds.length = 0;\n for (const id in this._mouseOrTouches.items) {\n if (this._mouseOrTouches.items.hasOwnProperty(id)) {\n InputManager._allTouchIds.push(parseInt(id, 10));\n }\n }\n return InputManager._allTouchIds;\n }\n\n onTouchStart(rawIdentifier: integer, x: float, y: float): void {\n this._addTouch(this.getPublicTouchIdentifier(rawIdentifier), x, y);\n if (this._touchSimulateMouse) {\n this._setCursorPosition(x, y);\n this._setMouseButtonPressed(InputManager.MOUSE_LEFT_BUTTON);\n }\n }\n\n _addTouch(publicIdentifier: integer, x: float, y: float): void {\n // A touch that end then start in one frame is ignored\n // because it's probably noise.\n if (!this._endedTouches.includes(publicIdentifier)) {\n this._startedTouches.push(publicIdentifier);\n this._mouseOrTouches.put(publicIdentifier, {\n x: x,\n y: y,\n justEnded: false,\n });\n }\n }\n\n onTouchMove(rawIdentifier: integer, x: float, y: float): void {\n this._moveTouch(this.getPublicTouchIdentifier(rawIdentifier), x, y);\n if (this._touchSimulateMouse) {\n this._setCursorPosition(x, y);\n }\n }\n\n _moveTouch(publicIdentifier: integer, x: float, y: float): void {\n const touch = this._mouseOrTouches.get(publicIdentifier);\n if (!touch) {\n return;\n }\n touch.x = x;\n touch.y = y;\n }\n\n onTouchEnd(rawIdentifier: number): void {\n this._removeTouch(this.getPublicTouchIdentifier(rawIdentifier));\n if (this._touchSimulateMouse) {\n this._setMouseButtonReleased(InputManager.MOUSE_LEFT_BUTTON);\n }\n }\n\n onTouchCancel(rawIdentifier: number): void {\n // Don't do anything specific for canceled touches to avoid to make\n // touches handling more complex for users.\n this.onTouchEnd(rawIdentifier);\n }\n\n _removeTouch(publicIdentifier: number): void {\n this._endedTouches.push(publicIdentifier);\n if (this._mouseOrTouches.containsKey(publicIdentifier)) {\n //Postpone deletion at the end of the frame\n this._mouseOrTouches.get(publicIdentifier).justEnded = true;\n }\n }\n\n /**\n * Add 2 to the identifier to avoid identifiers taking the GDevelop default\n * variable value which is 0 and reserve 1 for the mouse.\n * @param rawIdentifier The identifier given by the browser.\n * @returns The identifier used in events.\n */\n private getPublicTouchIdentifier(rawIdentifier: integer): integer {\n return rawIdentifier + 2;\n }\n\n getStartedTouchIdentifiers(): integer[] {\n return this._startedTouches;\n }\n\n /**\n * @deprecated\n */\n popStartedTouch(): integer | undefined {\n const publicIdentifier = this._startedTouches[\n this._lastStartedTouchIndex\n ];\n this._lastStartedTouchIndex++;\n return publicIdentifier;\n }\n\n /**\n * @deprecated\n */\n popEndedTouch(): integer | undefined {\n const publicIdentifier = this._endedTouches[this._lastEndedTouchIndex];\n this._lastEndedTouchIndex++;\n return publicIdentifier;\n }\n\n /**\n * Set if touch events should simulate mouse events.\n *\n * If true, any touch will move the mouse position and set mouse buttons\n * as pressed/released.\n * @param enable true to simulate mouse events, false to disable it.\n */\n touchSimulateMouse(enable: boolean): void {\n if (enable === undefined) {\n enable = true;\n }\n this._touchSimulateMouse = enable;\n }\n\n /**\n * @returns true if the touch events are used to simulate mouse events.\n */\n isSimulatingMouseWithTouch(): boolean {\n return this._touchSimulateMouse;\n }\n\n /**\n * Notify the input manager that the frame ended, so anything that last\n * only for one frame (started/ended touches) should be reset.\n *\n * This method should be called in the game loop (see `gdjs.RuntimeGame.startGameLoop`).\n * You don't need to call it otherwise.\n */\n onFrameEnded(): void {\n //Only clear the ended touches at the end of the frame.\n for (const id in this._mouseOrTouches.items) {\n if (this._mouseOrTouches.items.hasOwnProperty(id)) {\n const touch = this._mouseOrTouches.items[id];\n if (touch.justEnded) {\n this._mouseOrTouches.remove(id);\n }\n }\n }\n this._startedTouches.length = 0;\n this._endedTouches.length = 0;\n this._releasedKeys.clear();\n this._releasedMouseButtons.length = 0;\n this._mouseWheelDelta = 0;\n this._lastStartedTouchIndex = 0;\n this._lastEndedTouchIndex = 0;\n }\n\n /**\n * Return true if the mouse wheel scroll to up\n */\n isScrollingUp(): boolean {\n return this.getMouseWheelDelta() > 0;\n }\n\n /**\n * Return true if the mouse wheel scroll to down\n */\n isScrollingDown(): boolean {\n return this.getMouseWheelDelta() < 0;\n }\n\n static _allTouchIds: Array<integer> = [];\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\n * GDevelop JS Platform\n * Copyright 2013-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved.\n * This project is released under the MIT License.\n */\nnamespace gdjs {\n type Touch = { x: float; y: float; justEnded: boolean };\n\n /**\n * Store input made on a canvas: mouse position, key pressed\n * and touches states.\n */\n export class InputManager {\n static MOUSE_LEFT_BUTTON: integer = 0;\n static MOUSE_RIGHT_BUTTON: integer = 1;\n static MOUSE_MIDDLE_BUTTON: integer = 2;\n static MOUSE_BACK_BUTTON: integer = 3;\n static MOUSE_FORWARD_BUTTON: integer = 4;\n static MOUSE_TOUCH_ID: integer = 1;\n\n /**\n * Holds the raw keyCodes of the keys which only have left/right\n * variants and should default to their left variant values\n * if location is not specified.\n */\n static _DEFAULT_LEFT_VARIANT_KEYS: integer[] = [16, 17, 18, 91];\n _pressedKeys: Hashtable<boolean>;\n _releasedKeys: Hashtable<boolean>;\n _lastPressedKey: float = 0;\n _pressedMouseButtons: Array<boolean>;\n _releasedMouseButtons: Array<boolean>;\n /**\n * The cursor X position (moved by mouse and touch events).\n */\n _cursorX: float = 0;\n /**\n * The cursor Y position (moved by mouse and touch events).\n */\n _cursorY: float = 0;\n /**\n * The mouse X position (only moved by mouse events).\n */\n _mouseX: float = 0;\n /**\n * The mouse Y position (only moved by mouse events).\n */\n _mouseY: float = 0;\n _isMouseInsideCanvas: boolean = true;\n _mouseWheelDelta: float = 0;\n // TODO Remove _touches when there is no longer SpritePanelButton 1.2.0\n // extension in the wild.\n _touches = {\n firstKey: (): string | number | null => {\n for (const key in this._mouseOrTouches.items) {\n // Exclude mouse key.\n if (key !== '1') {\n return key;\n }\n }\n return null;\n },\n };\n _mouseOrTouches: Hashtable<Touch>;\n //Identifiers of the touches that started during/before the frame.\n _startedTouches: Array<integer> = [];\n\n //Identifiers of the touches that ended during/before the frame.\n _endedTouches: Array<integer> = [];\n _touchSimulateMouse: boolean = true;\n\n /**\n * @deprecated\n */\n _lastStartedTouchIndex = 0;\n /**\n * @deprecated\n */\n _lastEndedTouchIndex = 0;\n\n constructor() {\n this._pressedKeys = new Hashtable();\n this._releasedKeys = new Hashtable();\n this._pressedMouseButtons = new Array(5);\n this._releasedMouseButtons = new Array(5);\n this._mouseOrTouches = new Hashtable();\n }\n\n /**\n * Returns the \"location-aware\" keyCode, given a raw keyCode\n * and location. The location corresponds to KeyboardEvent.location,\n * which should be 0 for standard keys, 1 for left keys,\n * 2 for right keys, and 3 for numpad keys.\n *\n * @param keyCode The raw key code\n * @param location The location\n */\n _getLocationAwareKeyCode(\n keyCode: number,\n location: number | null | undefined\n ): integer {\n if (location) {\n // If it is a numpad number, do not modify it.\n if (96 <= keyCode && keyCode <= 105) {\n return keyCode;\n }\n return keyCode + 1000 * location;\n }\n if (InputManager._DEFAULT_LEFT_VARIANT_KEYS.indexOf(keyCode) !== -1) {\n return keyCode + 1000;\n }\n return keyCode;\n }\n\n /**\n * Should be called whenever a key is pressed. The location corresponds to\n * KeyboardEvent.location, which should be 0 for standard keys, 1 for left keys,\n * 2 for right keys, and 3 for numpad keys.\n * @param keyCode The raw key code associated to the key press.\n * @param location The location of the event.\n */\n onKeyPressed(keyCode: number, location?: number): void {\n const locationAwareKeyCode = this._getLocationAwareKeyCode(\n keyCode,\n location\n );\n this._pressedKeys.put(locationAwareKeyCode, true);\n this._lastPressedKey = locationAwareKeyCode;\n }\n\n /**\n * Should be called whenever a key is released. The location corresponds to\n * KeyboardEvent.location, which should be 0 for standard keys, 1 for left keys,\n * 2 for right keys, and 3 for numpad keys.\n * @param keyCode The raw key code associated to the key release.\n * @param location The location of the event.\n */\n onKeyReleased(keyCode: number, location?: number): void {\n const locationAwareKeyCode = this._getLocationAwareKeyCode(\n keyCode,\n location\n );\n this._pressedKeys.put(locationAwareKeyCode, false);\n this._releasedKeys.put(locationAwareKeyCode, true);\n }\n\n /**\n * Return the location-aware code of the last key that was pressed.\n * @return The location-aware code of the last key pressed.\n */\n getLastPressedKey(): number {\n return this._lastPressedKey;\n }\n\n /**\n * Return true if the key corresponding to the location-aware keyCode is pressed.\n * @param locationAwareKeyCode The location-aware key code to be tested.\n */\n isKeyPressed(locationAwareKeyCode: number): boolean {\n return (\n this._pressedKeys.containsKey(locationAwareKeyCode) &&\n this._pressedKeys.get(locationAwareKeyCode)\n );\n }\n\n /**\n * Return true if the key corresponding to the location-aware keyCode was released during the last frame.\n * @param locationAwareKeyCode The location-aware key code to be tested.\n */\n wasKeyReleased(locationAwareKeyCode: number) {\n return (\n this._releasedKeys.containsKey(locationAwareKeyCode) &&\n this._releasedKeys.get(locationAwareKeyCode)\n );\n }\n\n /**\n * Return true if any key is pressed.\n * @return true if any key is pressed.\n */\n anyKeyPressed(): boolean {\n for (const keyCode in this._pressedKeys.items) {\n if (this._pressedKeys.items.hasOwnProperty(keyCode)) {\n if (this._pressedKeys.items[keyCode]) {\n return true;\n }\n }\n }\n return false;\n }\n /**\n * Return true if any key is released.\n * @return true if any key is released.\n */\n anyKeyReleased(): boolean {\n for (const keyCode in this._releasedKeys.items) {\n if (this._releasedKeys.items.hasOwnProperty(keyCode)) {\n if (this._releasedKeys.items[keyCode]) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * Should be called when the mouse is moved.\n *\n * Please note that the coordinates must be expressed relative to the view position.\n *\n * @param x The mouse new X position\n * @param y The mouse new Y position\n */\n onMouseMove(x: float, y: float): void {\n this._setCursorPosition(x, y);\n this._mouseX = x;\n this._mouseY = y;\n if (this.isMouseButtonPressed(InputManager.MOUSE_LEFT_BUTTON)) {\n this._moveTouch(\n InputManager.MOUSE_TOUCH_ID,\n this.getCursorX(),\n this.getCursorY()\n );\n }\n }\n\n _setCursorPosition(x: float, y: float): void {\n this._cursorX = x;\n this._cursorY = y;\n }\n\n /**\n * Get the cursor X position.\n * The cursor is moved by mouse and touch events.\n *\n * @return the cursor X position, relative to the game view.\n */\n getCursorX(): float {\n return this._cursorX;\n }\n\n /**\n * Get the cursor Y position.\n * The cursor is moved by mouse and touch events.\n *\n * @return the cursor Y position, relative to the game view.\n */\n getCursorY(): float {\n return this._cursorY;\n }\n\n /**\n * Get the mouse X position.\n *\n * @return the mouse X position, relative to the game view.\n */\n getMouseX(): float {\n return this._mouseX;\n }\n\n /**\n * Get the mouse Y position.\n *\n * @return the mouse Y position, relative to the game view.\n */\n getMouseY(): float {\n return this._mouseY;\n }\n\n /**\n * Should be called when the mouse leave the canvas.\n */\n onMouseLeave(): void {\n this._isMouseInsideCanvas = false;\n }\n\n /**\n * Should be called when the mouse enter the canvas.\n */\n onMouseEnter(): void {\n this._isMouseInsideCanvas = true;\n }\n\n /**\n * @return true when the mouse is inside the canvas.\n */\n isMouseInsideCanvas(): boolean {\n return this._isMouseInsideCanvas;\n }\n\n /**\n * Should be called whenever a mouse button is pressed.\n * @param buttonCode The mouse button code associated to the event.\n * See InputManager.MOUSE_LEFT_BUTTON, InputManager.MOUSE_RIGHT_BUTTON, InputManager.MOUSE_MIDDLE_BUTTON\n */\n onMouseButtonPressed(buttonCode: number): void {\n this._setMouseButtonPressed(buttonCode);\n if (buttonCode === InputManager.MOUSE_LEFT_BUTTON) {\n this._addTouch(\n InputManager.MOUSE_TOUCH_ID,\n this.getCursorX(),\n this.getCursorY()\n );\n }\n }\n\n _setMouseButtonPressed(buttonCode: number): void {\n this._pressedMouseButtons[buttonCode] = true;\n this._releasedMouseButtons[buttonCode] = false;\n }\n\n /**\n * Should be called whenever a mouse button is released.\n * @param buttonCode The mouse button code associated to the event. (see onMouseButtonPressed)\n */\n onMouseButtonReleased(buttonCode: number): void {\n this._setMouseButtonReleased(buttonCode);\n if (buttonCode === InputManager.MOUSE_LEFT_BUTTON) {\n this._removeTouch(InputManager.MOUSE_TOUCH_ID);\n }\n }\n\n _setMouseButtonReleased(buttonCode: number): void {\n this._pressedMouseButtons[buttonCode] = false;\n this._releasedMouseButtons[buttonCode] = true;\n }\n\n /**\n * Return true if the mouse button corresponding to buttonCode is pressed.\n * @param buttonCode The mouse button code (0: Left button, 1: Right button).\n */\n isMouseButtonPressed(buttonCode: number): boolean {\n return (\n this._pressedMouseButtons[buttonCode] !== undefined &&\n this._pressedMouseButtons[buttonCode]\n );\n }\n\n /**\n * Return true if the mouse button corresponding to buttonCode was just released.\n * @param buttonCode The mouse button code (0: Left button, 1: Right button).\n */\n isMouseButtonReleased(buttonCode: number): boolean {\n return (\n this._releasedMouseButtons[buttonCode] !== undefined &&\n this._releasedMouseButtons[buttonCode]\n );\n }\n\n /**\n * Should be called whenever the mouse wheel is used\n * @param wheelDelta The mouse wheel delta\n */\n onMouseWheel(wheelDelta: number): void {\n this._mouseWheelDelta = wheelDelta;\n }\n\n /**\n * Return the mouse wheel delta\n */\n getMouseWheelDelta(): float {\n return this._mouseWheelDelta;\n }\n\n /**\n * Get a touch X position.\n *\n * @return the touch X position, relative to the game view.\n */\n getTouchX(publicIdentifier: integer): float {\n if (!this._mouseOrTouches.containsKey(publicIdentifier)) {\n return 0;\n }\n return this._mouseOrTouches.get(publicIdentifier).x;\n }\n\n /**\n * Get a touch Y position.\n *\n * @return the touch Y position, relative to the game view.\n */\n getTouchY(publicIdentifier: integer): float {\n if (!this._mouseOrTouches.containsKey(publicIdentifier)) {\n return 0;\n }\n return this._mouseOrTouches.get(publicIdentifier).y;\n }\n\n /**\n * @param publicIdentifier the touch identifier\n * @returns true if the touch has just ended.\n */\n hasTouchEnded(publicIdentifier: integer): boolean {\n // A touch that end then start in one frame is ignored\n // because it's probably noise.\n // See _addTouch\n if (!this._mouseOrTouches.containsKey(publicIdentifier)) {\n return false;\n }\n return this._mouseOrTouches.get(publicIdentifier).justEnded;\n }\n\n /**\n * Update and return the array containing the identifiers of all touches.\n */\n getAllTouchIdentifiers(): Array<integer> {\n InputManager._allTouchIds.length = 0;\n for (const id in this._mouseOrTouches.items) {\n if (this._mouseOrTouches.items.hasOwnProperty(id)) {\n InputManager._allTouchIds.push(parseInt(id, 10));\n }\n }\n return InputManager._allTouchIds;\n }\n\n onTouchStart(rawIdentifier: integer, x: float, y: float): void {\n this._addTouch(this.getPublicTouchIdentifier(rawIdentifier), x, y);\n if (this._touchSimulateMouse) {\n this._setCursorPosition(x, y);\n this._setMouseButtonPressed(InputManager.MOUSE_LEFT_BUTTON);\n }\n }\n\n _addTouch(publicIdentifier: integer, x: float, y: float): void {\n // A touch that end then start in one frame is ignored\n // because it's probably noise.\n if (!this._endedTouches.includes(publicIdentifier)) {\n this._startedTouches.push(publicIdentifier);\n this._mouseOrTouches.put(publicIdentifier, {\n x: x,\n y: y,\n justEnded: false,\n });\n }\n }\n\n onTouchMove(rawIdentifier: integer, x: float, y: float): void {\n this._moveTouch(this.getPublicTouchIdentifier(rawIdentifier), x, y);\n if (this._touchSimulateMouse) {\n this._setCursorPosition(x, y);\n }\n }\n\n _moveTouch(publicIdentifier: integer, x: float, y: float): void {\n const touch = this._mouseOrTouches.get(publicIdentifier);\n if (!touch) {\n return;\n }\n touch.x = x;\n touch.y = y;\n }\n\n onTouchEnd(rawIdentifier: number): void {\n this._removeTouch(this.getPublicTouchIdentifier(rawIdentifier));\n if (this._touchSimulateMouse) {\n this._setMouseButtonReleased(InputManager.MOUSE_LEFT_BUTTON);\n }\n }\n\n onTouchCancel(rawIdentifier: number): void {\n // Don't do anything specific for canceled touches to avoid to make\n // touches handling more complex for users.\n this.onTouchEnd(rawIdentifier);\n }\n\n _removeTouch(publicIdentifier: number): void {\n this._endedTouches.push(publicIdentifier);\n if (this._mouseOrTouches.containsKey(publicIdentifier)) {\n //Postpone deletion at the end of the frame\n this._mouseOrTouches.get(publicIdentifier).justEnded = true;\n }\n }\n\n /**\n * Add 2 to the identifier to avoid identifiers taking the GDevelop default\n * variable value which is 0 and reserve 1 for the mouse.\n * @param rawIdentifier The identifier given by the browser.\n * @returns The identifier used in events.\n */\n private getPublicTouchIdentifier(rawIdentifier: integer): integer {\n return rawIdentifier + 2;\n }\n\n getStartedTouchIdentifiers(): integer[] {\n return this._startedTouches;\n }\n\n /**\n * @deprecated\n */\n popStartedTouch(): integer | undefined {\n const publicIdentifier = this._startedTouches[\n this._lastStartedTouchIndex\n ];\n this._lastStartedTouchIndex++;\n return publicIdentifier;\n }\n\n /**\n * @deprecated\n */\n popEndedTouch(): integer | undefined {\n const publicIdentifier = this._endedTouches[this._lastEndedTouchIndex];\n this._lastEndedTouchIndex++;\n return publicIdentifier;\n }\n\n /**\n * Set if touch events should simulate mouse events.\n *\n * If true, any touch will move the mouse position and set mouse buttons\n * as pressed/released.\n * @param enable true to simulate mouse events, false to disable it.\n */\n touchSimulateMouse(enable: boolean): void {\n if (enable === undefined) {\n enable = true;\n }\n this._touchSimulateMouse = enable;\n }\n\n /**\n * @returns true if the touch events are used to simulate mouse events.\n */\n isSimulatingMouseWithTouch(): boolean {\n return this._touchSimulateMouse;\n }\n\n /**\n * Notify the input manager that the frame ended, so anything that last\n * only for one frame (started/ended touches) should be reset.\n *\n * This method should be called in the game loop (see `gdjs.RuntimeGame.startGameLoop`).\n * You don't need to call it otherwise.\n */\n onFrameEnded(): void {\n //Only clear the ended touches at the end of the frame.\n for (const id in this._mouseOrTouches.items) {\n if (this._mouseOrTouches.items.hasOwnProperty(id)) {\n const touch = this._mouseOrTouches.items[id];\n if (touch.justEnded) {\n this._mouseOrTouches.remove(id);\n }\n }\n }\n this._startedTouches.length = 0;\n this._endedTouches.length = 0;\n this._releasedKeys.clear();\n this._releasedMouseButtons.length = 0;\n this._mouseWheelDelta = 0;\n this._lastStartedTouchIndex = 0;\n this._lastEndedTouchIndex = 0;\n }\n\n /**\n * Return true if the mouse wheel scroll to up\n */\n isScrollingUp(): boolean {\n return this.getMouseWheelDelta() > 0;\n }\n\n /**\n * Return true if the mouse wheel scroll to down\n */\n isScrollingDown(): boolean {\n return this.getMouseWheelDelta() < 0;\n }\n\n /**\n * Clears all stored pressed keys without making the keys go through\n * the release state.\n */\n clearAllPressedKeys(): void {\n this._pressedKeys.clear();\n }\n\n static _allTouchIds: Array<integer> = [];\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var gdjs;(function(r){class a{constructor(e,t,i){this._isContainerDirty=!0;this._debugDraw=null;this._debugDrawContainer=null;this._object=e,this._instanceContainer=t,this._pixiContainer=new PIXI.Container,this._debugDrawRenderedObjectsPoints={},this._pixiContainer.sortableChildren=!0,this._debugDraw=null;const n=i.getLayer("");n&&n.getRenderer().addRendererObject(this._pixiContainer,e.getZOrder())}reinitialize(e,t){this._object=e,this._isContainerDirty=!0;const i=t.getLayer("");i&&i.getRenderer().addRendererObject(this._pixiContainer,e.getZOrder())}getRendererObject(){return this._pixiContainer}get3DRendererObject(){return null}_updatePIXIContainer(){const e=this._object.getScaleX(),t=this._object.getScaleY(),i=this._object.getOpacity();this._pixiContainer.pivot.x=this._object.getUnscaledCenterX(),this._pixiContainer.pivot.y=this._object.getUnscaledCenterY(),this._pixiContainer.position.x=this._object.getX()+this._pixiContainer.pivot.x*Math.abs(e),this._pixiContainer.position.y=this._object.getY()+this._pixiContainer.pivot.y*Math.abs(t),this._pixiContainer.rotation=r.toRad(this._object.angle),this._pixiContainer.scale.x=e,this._pixiContainer.scale.y=t,this._pixiContainer.visible=!this._object.hidden,this._pixiContainer.alpha=i/255,this._isContainerDirty=!1}ensureUpToDate(){this._isContainerDirty&&this._updatePIXIContainer()}update(){this._isContainerDirty=!0}updateX(){const e=this._object.getScaleX();this._pixiContainer.position.x=this._object.x+this._pixiContainer.pivot.x*Math.abs(e)}updateY(){const e=this._object.getScaleY();this._pixiContainer.position.y=this._object.y+this._pixiContainer.pivot.y*Math.abs(e)}updateAngle(){this._pixiContainer.rotation=r.toRad(this._object.angle)}updateOpacity(){const e=this._object.getOpacity();this._pixiContainer.alpha=e/255}updateVisibility(){this._pixiContainer.visible=!this._object.hidden}getPIXIContainer(){return this._pixiContainer}getPIXIRenderer(){return null}setLayerIndex(e,t){const i=e.getRenderer();let n=i.getRendererObject();e.isLightingLayer()&&(n=i.getLightingSprite()),!!n&&this._pixiContainer.children.indexOf(n)!==t&&(this._pixiContainer.removeChild(n),this._pixiContainer.addChildAt(n,t))}static getAnimationFrameTextureManager(e){return r.SpriteRuntimeObjectPixiRenderer.getAnimationFrameTextureManager(e)}}r.CustomRuntimeObject2DPixiRenderer=a,r.CustomRuntimeObject2DRenderer=r.CustomRuntimeObject2DPixiRenderer})(gdjs||(gdjs={}));
1
+ var gdjs;(function(r){class a{constructor(e,t,i){this._isContainerDirty=!0;this._debugDraw=null;this._debugDrawContainer=null;this._object=e,this._instanceContainer=t,this._pixiContainer=new PIXI.Container,this._debugDrawRenderedObjectsPoints={},this._pixiContainer.sortableChildren=!0,this._debugDraw=null;const n=i.getLayer("");n&&n.getRenderer().addRendererObject(this._pixiContainer,e.getZOrder())}reinitialize(e,t){this._object=e,this._isContainerDirty=!0;const i=t.getLayer("");i&&i.getRenderer().addRendererObject(this._pixiContainer,e.getZOrder())}getRendererObject(){return this._pixiContainer}get3DRendererObject(){return null}_updatePIXIContainer(){const e=this._object.getScaleX(),t=this._object.getScaleY(),i=this._object.getOpacity();this._pixiContainer.pivot.x=this._object.getUnscaledCenterX(),this._pixiContainer.pivot.y=this._object.getUnscaledCenterY(),this._pixiContainer.position.x=this._object.getX()+this._pixiContainer.pivot.x*Math.abs(e),this._pixiContainer.position.y=this._object.getY()+this._pixiContainer.pivot.y*Math.abs(t),this._pixiContainer.rotation=r.toRad(this._object.angle),this._pixiContainer.scale.x=e*(this._object.isFlippedX()?-1:1),this._pixiContainer.scale.y=t*(this._object.isFlippedY()?-1:1),this._pixiContainer.visible=!this._object.hidden,this._pixiContainer.alpha=i/255,this._isContainerDirty=!1}ensureUpToDate(){this._isContainerDirty&&this._updatePIXIContainer()}update(){this._isContainerDirty=!0}updateX(){const e=this._object.getScaleX();this._pixiContainer.position.x=this._object.x+this._pixiContainer.pivot.x*Math.abs(e)}updateY(){const e=this._object.getScaleY();this._pixiContainer.position.y=this._object.y+this._pixiContainer.pivot.y*Math.abs(e)}updateAngle(){this._pixiContainer.rotation=r.toRad(this._object.angle)}updateOpacity(){const e=this._object.getOpacity();this._pixiContainer.alpha=e/255}updateVisibility(){this._pixiContainer.visible=!this._object.hidden}getPIXIContainer(){return this._pixiContainer}getPIXIRenderer(){return null}setLayerIndex(e,t){const i=e.getRenderer();let n=i.getRendererObject();e.isLightingLayer()&&(n=i.getLightingSprite()),!!n&&this._pixiContainer.children.indexOf(n)!==t&&(this._pixiContainer.removeChild(n),this._pixiContainer.addChildAt(n,t))}static getAnimationFrameTextureManager(e){return r.SpriteRuntimeObjectPixiRenderer.getAnimationFrameTextureManager(e)}}r.CustomRuntimeObject2DPixiRenderer=a,r.CustomRuntimeObject2DRenderer=r.CustomRuntimeObject2DPixiRenderer})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=CustomRuntimeObject2DPixiRenderer.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../GDevelop/GDJS/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.ts"],
4
- "sourcesContent": ["namespace gdjs {\n /**\n * The renderer for a {@link gdjs.CustomRuntimeObject2D} using Pixi.js.\n */\n export class CustomRuntimeObject2DPixiRenderer\n implements gdjs.RuntimeInstanceContainerPixiRenderer {\n _object: gdjs.CustomRuntimeObject;\n _instanceContainer: gdjs.CustomRuntimeObjectInstanceContainer;\n _pixiContainer: PIXI.Container;\n _isContainerDirty: boolean = true;\n _debugDraw: PIXI.Graphics | null = null;\n _debugDrawContainer: PIXI.Container | null = null;\n _debugDrawRenderedObjectsPoints: Record<\n number,\n {\n wasRendered: boolean;\n points: Record<string, PIXI.Text>;\n }\n >;\n\n constructor(\n object: gdjs.CustomRuntimeObject,\n instanceContainer: gdjs.CustomRuntimeObjectInstanceContainer,\n parent: gdjs.RuntimeInstanceContainer\n ) {\n this._object = object;\n this._instanceContainer = instanceContainer;\n\n // TODO (3D) - optimization: don't create a PixiJS container if only 3D objects.\n // And same, in reverse, for 2D only objects.\n this._pixiContainer = new PIXI.Container();\n this._debugDrawRenderedObjectsPoints = {};\n\n // Contains the layers of the scene (and, optionally, debug PIXI objects).\n this._pixiContainer.sortableChildren = true;\n this._debugDraw = null;\n\n const layer = parent.getLayer('');\n if (layer) {\n layer\n .getRenderer()\n .addRendererObject(this._pixiContainer, object.getZOrder());\n }\n }\n\n reinitialize(\n object: gdjs.CustomRuntimeObject,\n parent: gdjs.RuntimeInstanceContainer\n ) {\n this._object = object;\n this._isContainerDirty = true;\n const layer = parent.getLayer('');\n if (layer) {\n layer\n .getRenderer()\n .addRendererObject(this._pixiContainer, object.getZOrder());\n }\n }\n\n getRendererObject() {\n return this._pixiContainer;\n }\n\n get3DRendererObject(): THREE.Object3D | null {\n return null;\n }\n\n /**\n * Update the internal PIXI.Container position, angle...\n */\n _updatePIXIContainer() {\n const scaleX = this._object.getScaleX();\n const scaleY = this._object.getScaleY();\n const opacity = this._object.getOpacity();\n this._pixiContainer.pivot.x = this._object.getUnscaledCenterX();\n this._pixiContainer.pivot.y = this._object.getUnscaledCenterY();\n this._pixiContainer.position.x =\n this._object.getX() + this._pixiContainer.pivot.x * Math.abs(scaleX);\n this._pixiContainer.position.y =\n this._object.getY() + this._pixiContainer.pivot.y * Math.abs(scaleY);\n\n this._pixiContainer.rotation = gdjs.toRad(this._object.angle);\n this._pixiContainer.scale.x = scaleX;\n this._pixiContainer.scale.y = scaleY;\n this._pixiContainer.visible = !this._object.hidden;\n this._pixiContainer.alpha = opacity / 255;\n\n this._isContainerDirty = false;\n }\n\n /**\n * Call this to make sure the object is ready to be rendered.\n */\n ensureUpToDate() {\n if (this._isContainerDirty) {\n this._updatePIXIContainer();\n }\n }\n\n update(): void {\n this._isContainerDirty = true;\n }\n\n updateX(): void {\n const scaleX = this._object.getScaleX();\n this._pixiContainer.position.x =\n this._object.x + this._pixiContainer.pivot.x * Math.abs(scaleX);\n }\n\n updateY(): void {\n const scaleY = this._object.getScaleY();\n this._pixiContainer.position.y =\n this._object.y + this._pixiContainer.pivot.y * Math.abs(scaleY);\n }\n\n updateAngle(): void {\n this._pixiContainer.rotation = gdjs.toRad(this._object.angle);\n }\n\n updateOpacity(): void {\n const opacity = this._object.getOpacity();\n this._pixiContainer.alpha = opacity / 255;\n }\n\n updateVisibility(): void {\n this._pixiContainer.visible = !this._object.hidden;\n }\n\n getPIXIContainer() {\n return this._pixiContainer;\n }\n\n getPIXIRenderer() {\n return null;\n }\n\n setLayerIndex(layer: gdjs.RuntimeLayer, index: float): void {\n const layerPixiRenderer: gdjs.LayerPixiRenderer = layer.getRenderer();\n let layerPixiObject:\n | PIXI.Container\n | PIXI.Sprite\n | null = layerPixiRenderer.getRendererObject();\n if (layer.isLightingLayer()) {\n layerPixiObject = layerPixiRenderer.getLightingSprite();\n }\n if (!layerPixiObject) {\n return;\n }\n if (this._pixiContainer.children.indexOf(layerPixiObject) === index) {\n return;\n }\n this._pixiContainer.removeChild(layerPixiObject);\n this._pixiContainer.addChildAt(layerPixiObject, index);\n }\n\n static getAnimationFrameTextureManager(\n imageManager: gdjs.PixiImageManager\n ) {\n return gdjs.SpriteRuntimeObjectPixiRenderer.getAnimationFrameTextureManager(\n imageManager\n );\n }\n }\n\n // Register the class to let the engine use it.\n export type CustomRuntimeObject2DRenderer = gdjs.CustomRuntimeObject2DPixiRenderer;\n export const CustomRuntimeObject2DRenderer =\n gdjs.CustomRuntimeObject2DPixiRenderer;\n}\n"],
5
- "mappings": "AAAA,GAAU,MAAV,UAAU,EAAV,CAIS,OACgD,CAerD,YACE,EACA,EACA,EACA,CAfF,uBAA6B,GAC7B,gBAAmC,KACnC,yBAA6C,KAc3C,KAAK,QAAU,EACf,KAAK,mBAAqB,EAI1B,KAAK,eAAiB,GAAI,MAAK,UAC/B,KAAK,gCAAkC,GAGvC,KAAK,eAAe,iBAAmB,GACvC,KAAK,WAAa,KAElB,KAAM,GAAQ,EAAO,SAAS,IAC9B,AAAI,GACF,EACG,cACA,kBAAkB,KAAK,eAAgB,EAAO,aAIrD,aACE,EACA,EACA,CACA,KAAK,QAAU,EACf,KAAK,kBAAoB,GACzB,KAAM,GAAQ,EAAO,SAAS,IAC9B,AAAI,GACF,EACG,cACA,kBAAkB,KAAK,eAAgB,EAAO,aAIrD,mBAAoB,CAClB,MAAO,MAAK,eAGd,qBAA6C,CAC3C,MAAO,MAMT,sBAAuB,CACrB,KAAM,GAAS,KAAK,QAAQ,YACtB,EAAS,KAAK,QAAQ,YACtB,EAAU,KAAK,QAAQ,aAC7B,KAAK,eAAe,MAAM,EAAI,KAAK,QAAQ,qBAC3C,KAAK,eAAe,MAAM,EAAI,KAAK,QAAQ,qBAC3C,KAAK,eAAe,SAAS,EAC3B,KAAK,QAAQ,OAAS,KAAK,eAAe,MAAM,EAAI,KAAK,IAAI,GAC/D,KAAK,eAAe,SAAS,EAC3B,KAAK,QAAQ,OAAS,KAAK,eAAe,MAAM,EAAI,KAAK,IAAI,GAE/D,KAAK,eAAe,SAAW,EAAK,MAAM,KAAK,QAAQ,OACvD,KAAK,eAAe,MAAM,EAAI,EAC9B,KAAK,eAAe,MAAM,EAAI,EAC9B,KAAK,eAAe,QAAU,CAAC,KAAK,QAAQ,OAC5C,KAAK,eAAe,MAAQ,EAAU,IAEtC,KAAK,kBAAoB,GAM3B,gBAAiB,CACf,AAAI,KAAK,mBACP,KAAK,uBAIT,QAAe,CACb,KAAK,kBAAoB,GAG3B,SAAgB,CACd,KAAM,GAAS,KAAK,QAAQ,YAC5B,KAAK,eAAe,SAAS,EAC3B,KAAK,QAAQ,EAAI,KAAK,eAAe,MAAM,EAAI,KAAK,IAAI,GAG5D,SAAgB,CACd,KAAM,GAAS,KAAK,QAAQ,YAC5B,KAAK,eAAe,SAAS,EAC3B,KAAK,QAAQ,EAAI,KAAK,eAAe,MAAM,EAAI,KAAK,IAAI,GAG5D,aAAoB,CAClB,KAAK,eAAe,SAAW,EAAK,MAAM,KAAK,QAAQ,OAGzD,eAAsB,CACpB,KAAM,GAAU,KAAK,QAAQ,aAC7B,KAAK,eAAe,MAAQ,EAAU,IAGxC,kBAAyB,CACvB,KAAK,eAAe,QAAU,CAAC,KAAK,QAAQ,OAG9C,kBAAmB,CACjB,MAAO,MAAK,eAGd,iBAAkB,CAChB,MAAO,MAGT,cAAc,EAA0B,EAAoB,CAC1D,KAAM,GAA4C,EAAM,cACxD,GAAI,GAGO,EAAkB,oBAI7B,AAHI,EAAM,mBACR,GAAkB,EAAkB,qBAElC,EAAC,GAGD,KAAK,eAAe,SAAS,QAAQ,KAAqB,GAG9D,MAAK,eAAe,YAAY,GAChC,KAAK,eAAe,WAAW,EAAiB,UAG3C,iCACL,EACA,CACA,MAAO,GAAK,gCAAgC,gCAC1C,IA3JC,EAAM,oCAkKA,gCACX,EAAK,oCAvKC",
4
+ "sourcesContent": ["namespace gdjs {\n /**\n * The renderer for a {@link gdjs.CustomRuntimeObject2D} using Pixi.js.\n */\n export class CustomRuntimeObject2DPixiRenderer\n implements gdjs.RuntimeInstanceContainerPixiRenderer {\n _object: gdjs.CustomRuntimeObject;\n _instanceContainer: gdjs.CustomRuntimeObjectInstanceContainer;\n _pixiContainer: PIXI.Container;\n _isContainerDirty: boolean = true;\n _debugDraw: PIXI.Graphics | null = null;\n _debugDrawContainer: PIXI.Container | null = null;\n _debugDrawRenderedObjectsPoints: Record<\n number,\n {\n wasRendered: boolean;\n points: Record<string, PIXI.Text>;\n }\n >;\n\n constructor(\n object: gdjs.CustomRuntimeObject,\n instanceContainer: gdjs.CustomRuntimeObjectInstanceContainer,\n parent: gdjs.RuntimeInstanceContainer\n ) {\n this._object = object;\n this._instanceContainer = instanceContainer;\n\n // TODO (3D) - optimization: don't create a PixiJS container if only 3D objects.\n // And same, in reverse, for 2D only objects.\n this._pixiContainer = new PIXI.Container();\n this._debugDrawRenderedObjectsPoints = {};\n\n // Contains the layers of the scene (and, optionally, debug PIXI objects).\n this._pixiContainer.sortableChildren = true;\n this._debugDraw = null;\n\n const layer = parent.getLayer('');\n if (layer) {\n layer\n .getRenderer()\n .addRendererObject(this._pixiContainer, object.getZOrder());\n }\n }\n\n reinitialize(\n object: gdjs.CustomRuntimeObject,\n parent: gdjs.RuntimeInstanceContainer\n ) {\n this._object = object;\n this._isContainerDirty = true;\n const layer = parent.getLayer('');\n if (layer) {\n layer\n .getRenderer()\n .addRendererObject(this._pixiContainer, object.getZOrder());\n }\n }\n\n getRendererObject() {\n return this._pixiContainer;\n }\n\n get3DRendererObject(): THREE.Object3D | null {\n return null;\n }\n\n /**\n * Update the internal PIXI.Container position, angle...\n */\n _updatePIXIContainer() {\n const scaleX = this._object.getScaleX();\n const scaleY = this._object.getScaleY();\n const opacity = this._object.getOpacity();\n this._pixiContainer.pivot.x = this._object.getUnscaledCenterX();\n this._pixiContainer.pivot.y = this._object.getUnscaledCenterY();\n this._pixiContainer.position.x =\n this._object.getX() + this._pixiContainer.pivot.x * Math.abs(scaleX);\n this._pixiContainer.position.y =\n this._object.getY() + this._pixiContainer.pivot.y * Math.abs(scaleY);\n\n this._pixiContainer.rotation = gdjs.toRad(this._object.angle);\n this._pixiContainer.scale.x =\n scaleX * (this._object.isFlippedX() ? -1 : 1);\n this._pixiContainer.scale.y =\n scaleY * (this._object.isFlippedY() ? -1 : 1);\n this._pixiContainer.visible = !this._object.hidden;\n this._pixiContainer.alpha = opacity / 255;\n\n this._isContainerDirty = false;\n }\n\n /**\n * Call this to make sure the object is ready to be rendered.\n */\n ensureUpToDate() {\n if (this._isContainerDirty) {\n this._updatePIXIContainer();\n }\n }\n\n update(): void {\n this._isContainerDirty = true;\n }\n\n updateX(): void {\n const scaleX = this._object.getScaleX();\n this._pixiContainer.position.x =\n this._object.x + this._pixiContainer.pivot.x * Math.abs(scaleX);\n }\n\n updateY(): void {\n const scaleY = this._object.getScaleY();\n this._pixiContainer.position.y =\n this._object.y + this._pixiContainer.pivot.y * Math.abs(scaleY);\n }\n\n updateAngle(): void {\n this._pixiContainer.rotation = gdjs.toRad(this._object.angle);\n }\n\n updateOpacity(): void {\n const opacity = this._object.getOpacity();\n this._pixiContainer.alpha = opacity / 255;\n }\n\n updateVisibility(): void {\n this._pixiContainer.visible = !this._object.hidden;\n }\n\n getPIXIContainer() {\n return this._pixiContainer;\n }\n\n getPIXIRenderer() {\n return null;\n }\n\n setLayerIndex(layer: gdjs.RuntimeLayer, index: float): void {\n const layerPixiRenderer: gdjs.LayerPixiRenderer = layer.getRenderer();\n let layerPixiObject:\n | PIXI.Container\n | PIXI.Sprite\n | null = layerPixiRenderer.getRendererObject();\n if (layer.isLightingLayer()) {\n layerPixiObject = layerPixiRenderer.getLightingSprite();\n }\n if (!layerPixiObject) {\n return;\n }\n if (this._pixiContainer.children.indexOf(layerPixiObject) === index) {\n return;\n }\n this._pixiContainer.removeChild(layerPixiObject);\n this._pixiContainer.addChildAt(layerPixiObject, index);\n }\n\n static getAnimationFrameTextureManager(\n imageManager: gdjs.PixiImageManager\n ) {\n return gdjs.SpriteRuntimeObjectPixiRenderer.getAnimationFrameTextureManager(\n imageManager\n );\n }\n }\n\n // Register the class to let the engine use it.\n export type CustomRuntimeObject2DRenderer = gdjs.CustomRuntimeObject2DPixiRenderer;\n export const CustomRuntimeObject2DRenderer =\n gdjs.CustomRuntimeObject2DPixiRenderer;\n}\n"],
5
+ "mappings": "AAAA,GAAU,MAAV,UAAU,EAAV,CAIS,OACgD,CAerD,YACE,EACA,EACA,EACA,CAfF,uBAA6B,GAC7B,gBAAmC,KACnC,yBAA6C,KAc3C,KAAK,QAAU,EACf,KAAK,mBAAqB,EAI1B,KAAK,eAAiB,GAAI,MAAK,UAC/B,KAAK,gCAAkC,GAGvC,KAAK,eAAe,iBAAmB,GACvC,KAAK,WAAa,KAElB,KAAM,GAAQ,EAAO,SAAS,IAC9B,AAAI,GACF,EACG,cACA,kBAAkB,KAAK,eAAgB,EAAO,aAIrD,aACE,EACA,EACA,CACA,KAAK,QAAU,EACf,KAAK,kBAAoB,GACzB,KAAM,GAAQ,EAAO,SAAS,IAC9B,AAAI,GACF,EACG,cACA,kBAAkB,KAAK,eAAgB,EAAO,aAIrD,mBAAoB,CAClB,MAAO,MAAK,eAGd,qBAA6C,CAC3C,MAAO,MAMT,sBAAuB,CACrB,KAAM,GAAS,KAAK,QAAQ,YACtB,EAAS,KAAK,QAAQ,YACtB,EAAU,KAAK,QAAQ,aAC7B,KAAK,eAAe,MAAM,EAAI,KAAK,QAAQ,qBAC3C,KAAK,eAAe,MAAM,EAAI,KAAK,QAAQ,qBAC3C,KAAK,eAAe,SAAS,EAC3B,KAAK,QAAQ,OAAS,KAAK,eAAe,MAAM,EAAI,KAAK,IAAI,GAC/D,KAAK,eAAe,SAAS,EAC3B,KAAK,QAAQ,OAAS,KAAK,eAAe,MAAM,EAAI,KAAK,IAAI,GAE/D,KAAK,eAAe,SAAW,EAAK,MAAM,KAAK,QAAQ,OACvD,KAAK,eAAe,MAAM,EACxB,EAAU,MAAK,QAAQ,aAAe,GAAK,GAC7C,KAAK,eAAe,MAAM,EACxB,EAAU,MAAK,QAAQ,aAAe,GAAK,GAC7C,KAAK,eAAe,QAAU,CAAC,KAAK,QAAQ,OAC5C,KAAK,eAAe,MAAQ,EAAU,IAEtC,KAAK,kBAAoB,GAM3B,gBAAiB,CACf,AAAI,KAAK,mBACP,KAAK,uBAIT,QAAe,CACb,KAAK,kBAAoB,GAG3B,SAAgB,CACd,KAAM,GAAS,KAAK,QAAQ,YAC5B,KAAK,eAAe,SAAS,EAC3B,KAAK,QAAQ,EAAI,KAAK,eAAe,MAAM,EAAI,KAAK,IAAI,GAG5D,SAAgB,CACd,KAAM,GAAS,KAAK,QAAQ,YAC5B,KAAK,eAAe,SAAS,EAC3B,KAAK,QAAQ,EAAI,KAAK,eAAe,MAAM,EAAI,KAAK,IAAI,GAG5D,aAAoB,CAClB,KAAK,eAAe,SAAW,EAAK,MAAM,KAAK,QAAQ,OAGzD,eAAsB,CACpB,KAAM,GAAU,KAAK,QAAQ,aAC7B,KAAK,eAAe,MAAQ,EAAU,IAGxC,kBAAyB,CACvB,KAAK,eAAe,QAAU,CAAC,KAAK,QAAQ,OAG9C,kBAAmB,CACjB,MAAO,MAAK,eAGd,iBAAkB,CAChB,MAAO,MAGT,cAAc,EAA0B,EAAoB,CAC1D,KAAM,GAA4C,EAAM,cACxD,GAAI,GAGO,EAAkB,oBAI7B,AAHI,EAAM,mBACR,GAAkB,EAAkB,qBAElC,EAAC,GAGD,KAAK,eAAe,SAAS,QAAQ,KAAqB,GAG9D,MAAK,eAAe,YAAY,GAChC,KAAK,eAAe,WAAW,EAAiB,UAG3C,iCACL,EACA,CACA,MAAO,GAAK,gCAAgC,gCAC1C,IA7JC,EAAM,oCAoKA,gCACX,EAAK,oCAzKC",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var gdjs;(function(n){const f=new n.Logger("Filters");let u;(function(i){i.clampValue=function(r,e,t){return Math.max(e,Math.min(t,r))},i.clampKernelSize=function(r,e,t){const a=Math.round((t-e)/2+1),s=new Array(a);for(let o=0;o<a;o++)s[o]=e+2*o;return s.indexOf(r)!==-1?r:e};const l={};i.getFilterCreator=function(r){return l.hasOwnProperty(r)?l[r]:null},i.registerFilterCreator=function(r,e){l.hasOwnProperty(r)&&f.warn('Filter "'+r+'" was already registered in gdjs.PixiFiltersTools. Replacing it with the new one.'),l[r]=e},i.rgbOrHexToHexNumber=function(r){const e=r.split(";");return e.length===3?n.rgbToHexNumber(parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10)):parseInt(r.replace("#","0x"),16)};class F{makeFilter(e,t){const a=this.makePIXIFilter(e,t);return e.isLightingLayer&&e.isLightingLayer()&&(a.blendMode=PIXI.BLEND_MODES.ADD),new m(a,this)}}i.PixiFilterCreator=F;class m{constructor(e,t){this.pixiFilter=e,this.filterCreator=t}isEnabled(e){return this.pixiFilter.enabled}setEnabled(e,t){return this.pixiFilter.enabled=t}applyEffect(e){const t=e.getRendererObject();return t?(t.filters=(t.filters||[]).concat(this.pixiFilter),!0):!1}removeEffect(e){const t=e.getRendererObject();return t?(t.filters=(t.filters||[]).filter(a=>a!==this.pixiFilter),!0):!1}updatePreRender(e){this.filterCreator.updatePreRender(this.pixiFilter,e)}updateDoubleParameter(e,t){this.filterCreator.updateDoubleParameter(this.pixiFilter,e,t)}updateStringParameter(e,t){this.filterCreator.updateStringParameter(this.pixiFilter,e,t)}updateBooleanParameter(e,t){this.filterCreator.updateBooleanParameter(this.pixiFilter,e,t)}updateColorParameter(e,t){this.filterCreator.updateColorParameter(this.pixiFilter,e,t)}getDoubleParameter(e){return this.filterCreator.getDoubleParameter(this.pixiFilter,e)}getColorParameter(e){return this.filterCreator.getColorParameter(this.pixiFilter,e)}getNetworkSyncData(){return{ena:this.pixiFilter.enabled,fc:this.filterCreator.getNetworkSyncData(this.pixiFilter)}}updateFromNetworkSyncData(e){this.pixiFilter.enabled=e.ena,this.filterCreator.updateFromNetworkSyncData(this.pixiFilter,e.fc)}}i.PixiFilter=m;class P{isEnabled(e){return!1}setEnabled(e,t){return!1}applyEffect(e){return!1}removeEffect(e){return!1}updatePreRender(e){}updateDoubleParameter(e,t){}updateStringParameter(e,t){}updateBooleanParameter(e,t){}updateColorParameter(e,t){}getDoubleParameter(e){return 0}getColorParameter(e){return 0}getNetworkSyncData(){return{}}updateFromNetworkSyncData(e){}}i.EmptyFilter=P})(u=n.PixiFiltersTools||(n.PixiFiltersTools={}))})(gdjs||(gdjs={}));
1
+ var gdjs;(function(o){const f=new o.Logger("Filters");let m;(function(n){n.clampValue=function(r,e,t){return Math.max(e,Math.min(t,r))},n.clampKernelSize=function(r,e,t){const a=Math.round((t-e)/2+1),s=new Array(a);for(let l=0;l<a;l++)s[l]=e+2*l;return s.indexOf(r)!==-1?r:e};const i={};n.getFilterCreator=function(r){return i.hasOwnProperty(r)?i[r]:null},n.registerFilterCreator=function(r,e){i.hasOwnProperty(r)&&f.warn('Filter "'+r+'" was already registered in gdjs.PixiFiltersTools. Replacing it with the new one.'),i[r]=e};class b{makeFilter(e,t){const a=this.makePIXIFilter(e,t);return e.isLightingLayer&&e.isLightingLayer()&&(a.blendMode=PIXI.BLEND_MODES.ADD),new u(a,this)}}n.PixiFilterCreator=b;class u{constructor(e,t){this.pixiFilter=e,this.filterCreator=t}isEnabled(e){return this.pixiFilter.enabled}setEnabled(e,t){return this.pixiFilter.enabled=t}applyEffect(e){const t=e.getRendererObject();return t?(t.filters=(t.filters||[]).concat(this.pixiFilter),!0):!1}removeEffect(e){const t=e.getRendererObject();return t?(t.filters=(t.filters||[]).filter(a=>a!==this.pixiFilter),!0):!1}updatePreRender(e){this.filterCreator.updatePreRender(this.pixiFilter,e)}updateDoubleParameter(e,t){this.filterCreator.updateDoubleParameter(this.pixiFilter,e,t)}updateStringParameter(e,t){this.filterCreator.updateStringParameter(this.pixiFilter,e,t)}updateBooleanParameter(e,t){this.filterCreator.updateBooleanParameter(this.pixiFilter,e,t)}updateColorParameter(e,t){this.filterCreator.updateColorParameter(this.pixiFilter,e,t)}getDoubleParameter(e){return this.filterCreator.getDoubleParameter(this.pixiFilter,e)}getColorParameter(e){return this.filterCreator.getColorParameter(this.pixiFilter,e)}getNetworkSyncData(){return{ena:this.pixiFilter.enabled,fc:this.filterCreator.getNetworkSyncData(this.pixiFilter)}}updateFromNetworkSyncData(e){this.pixiFilter.enabled=e.ena,this.filterCreator.updateFromNetworkSyncData(this.pixiFilter,e.fc)}}n.PixiFilter=u;class F{isEnabled(e){return!1}setEnabled(e,t){return!1}applyEffect(e){return!1}removeEffect(e){return!1}updatePreRender(e){}updateDoubleParameter(e,t){}updateStringParameter(e,t){}updateBooleanParameter(e,t){}updateColorParameter(e,t){}getDoubleParameter(e){return 0}getColorParameter(e){return 0}getNetworkSyncData(){return{}}updateFromNetworkSyncData(e){}}n.EmptyFilter=F})(m=o.PixiFiltersTools||(o.PixiFiltersTools={}))})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=pixi-filters-tools.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../GDevelop/GDJS/Runtime/pixi-renderers/pixi-filters-tools.ts"],
4
- "sourcesContent": ["namespace gdjs {\n const logger = new gdjs.Logger('Filters');\n\n export namespace PixiFiltersTools {\n export const clampValue = function (value, min, max) {\n return Math.max(min, Math.min(max, value));\n };\n\n export const clampKernelSize = function (value, min, max) {\n const len = Math.round((max - min) / 2 + 1);\n const arr = new Array(len);\n for (let i = 0; i < len; i++) {\n arr[i] = min + 2 * i;\n }\n return arr.indexOf(value) !== -1 ? value : min;\n };\n\n const _filterCreators: {\n [filterName: string]: FilterCreator;\n } = {};\n\n /**\n * Return the creator for the filter with the given name, if any.\n * @param filterName The name of the filter to get\n * @return The filter creator, if any (null otherwise).\n */\n export const getFilterCreator = function (\n filterName: string\n ): FilterCreator | null {\n if (_filterCreators.hasOwnProperty(filterName)) {\n return _filterCreators[filterName];\n }\n return null;\n };\n\n /**\n * Register a new PIXI filter creator, to be used by GDJS.\n * @param filterName The name of the filter to get\n * @param filterCreator The object used to create the filter.\n */\n export const registerFilterCreator = function (\n filterName: string,\n filterCreator: FilterCreator\n ) {\n if (_filterCreators.hasOwnProperty(filterName)) {\n logger.warn(\n 'Filter \"' +\n filterName +\n '\" was already registered in gdjs.PixiFiltersTools. Replacing it with the new one.'\n );\n }\n _filterCreators[filterName] = filterCreator;\n };\n\n /**\n * Convert a string RGB color (\"rrr;ggg;bbb\") or a hex string (#rrggbb) to a hex number.\n * @param value The color as a RGB string or hex string\n */\n export const rgbOrHexToHexNumber = function (value: string): number {\n const splitValue = value.split(';');\n if (splitValue.length === 3) {\n return gdjs.rgbToHexNumber(\n parseInt(splitValue[0], 10),\n parseInt(splitValue[1], 10),\n parseInt(splitValue[2], 10)\n );\n }\n return parseInt(value.replace('#', '0x'), 16);\n };\n\n /** A wrapper allowing to create an effect. */\n export interface FilterCreator {\n /** Function to call to create the filter */\n makeFilter(target: EffectsTarget, effectData: EffectData): Filter;\n }\n\n /** An effect. */\n export interface Filter {\n /**\n * Check if an effect is enabled.\n * @return true if the filter is enabled\n */\n isEnabled(target: EffectsTarget): boolean;\n /**\n * Enable an effect.\n * @param enabled Set to true to enable, false to disable\n */\n setEnabled(target: EffectsTarget, enabled: boolean): boolean;\n /**\n * Apply the effect on the PixiJS DisplayObject.\n * Called after the effect is initialized.\n * @param rendererObject The renderer object\n * @param effect The effect to be applied.\n */\n applyEffect(target: EffectsTarget): boolean;\n removeEffect(target: EffectsTarget): boolean;\n /** The function to be called to update the filter at every frame before the rendering. */\n updatePreRender(target: gdjs.EffectsTarget): any;\n /** The function to be called to update a parameter (with a number) */\n updateDoubleParameter(\n //filter: PIXI.Filter,\n parameterName: string,\n value: number\n ): void;\n /** The function to be called to update a parameter (with a string) */\n updateStringParameter(parameterName: string, value: string): void;\n /** The function to be called to update a parameter (with a boolean) */\n updateBooleanParameter(parameterName: string, value: boolean): void;\n updateColorParameter(parameterName: string, value: number): void;\n getDoubleParameter(parameterName: string): number;\n getColorParameter(parameterName: string): number;\n getNetworkSyncData(): any;\n updateFromNetworkSyncData(syncData: any): void;\n }\n\n /** A wrapper allowing to create a PIXI filter and update it using a common interface */\n export abstract class PixiFilterCreator implements FilterCreator {\n /** Function to call to create the filter */\n makeFilter(target: EffectsTarget, effectData: EffectData): Filter {\n const pixiFilter = this.makePIXIFilter(target, effectData);\n if (target.isLightingLayer && target.isLightingLayer()) {\n pixiFilter.blendMode = PIXI.BLEND_MODES.ADD;\n }\n return new PixiFilter(pixiFilter, this);\n }\n /** Function to call to create the filter */\n abstract makePIXIFilter(\n target: EffectsTarget,\n effectData: EffectData\n ): any;\n /** The function to be called to update the filter at every frame before the rendering. */\n abstract updatePreRender(\n filter: PIXI.Filter,\n target: gdjs.EffectsTarget\n ): any;\n /** The function to be called to update a parameter (with a number) */\n abstract updateDoubleParameter(\n filter: PIXI.Filter,\n parameterName: string,\n value: number\n ): void;\n /** The function to be called to update a parameter (with a string) */\n abstract updateStringParameter(\n filter: PIXI.Filter,\n parameterName: string,\n value: string\n ): void;\n /** The function to be called to update a parameter (with a boolean) */\n abstract updateBooleanParameter(\n filter: PIXI.Filter,\n parameterName: string,\n value: boolean\n ): void;\n abstract updateColorParameter(\n filter: PIXI.Filter,\n parameterName: string,\n value: number\n ): void;\n abstract getDoubleParameter(\n filter: PIXI.Filter,\n parameterName: string\n ): number;\n abstract getColorParameter(\n filter: PIXI.Filter,\n parameterName: string\n ): number;\n abstract getNetworkSyncData(filter: PIXI.Filter): any;\n abstract updateFromNetworkSyncData(\n filter: PIXI.Filter,\n syncData: any\n ): void;\n }\n\n /**An effect used to manipulate a Pixi filter. */\n export class PixiFilter implements Filter {\n /** The PIXI filter */\n pixiFilter: PIXI.Filter;\n filterCreator: gdjs.PixiFiltersTools.PixiFilterCreator;\n\n constructor(\n pixiFilter: PIXI.Filter,\n filterCreator: gdjs.PixiFiltersTools.PixiFilterCreator\n ) {\n this.pixiFilter = pixiFilter;\n this.filterCreator = filterCreator;\n }\n\n isEnabled(target: EffectsTarget): boolean {\n return this.pixiFilter.enabled;\n }\n\n setEnabled(target: EffectsTarget, enabled: boolean): boolean {\n return (this.pixiFilter.enabled = enabled);\n }\n\n applyEffect(target: EffectsTarget): boolean {\n const rendererObject = target.getRendererObject() as\n | PIXI.DisplayObject\n | null\n | undefined;\n if (!rendererObject) {\n return false;\n }\n rendererObject.filters = (rendererObject.filters || []).concat(\n this.pixiFilter\n );\n return true;\n }\n\n removeEffect(target: EffectsTarget): boolean {\n const rendererObject = target.getRendererObject() as\n | PIXI.DisplayObject\n | null\n | undefined;\n if (!rendererObject) {\n return false;\n }\n rendererObject.filters = (rendererObject.filters || []).filter(\n (pixiFilter) => pixiFilter !== this.pixiFilter\n );\n return true;\n }\n\n updatePreRender(target: gdjs.EffectsTarget): any {\n this.filterCreator.updatePreRender(this.pixiFilter, target);\n }\n\n updateDoubleParameter(parameterName: string, value: number): void {\n this.filterCreator.updateDoubleParameter(\n this.pixiFilter,\n parameterName,\n value\n );\n }\n\n updateStringParameter(parameterName: string, value: string): void {\n this.filterCreator.updateStringParameter(\n this.pixiFilter,\n parameterName,\n value\n );\n }\n\n updateBooleanParameter(parameterName: string, value: boolean): void {\n this.filterCreator.updateBooleanParameter(\n this.pixiFilter,\n parameterName,\n value\n );\n }\n\n updateColorParameter(parameterName: string, value: number): void {\n this.filterCreator.updateColorParameter(\n this.pixiFilter,\n parameterName,\n value\n );\n }\n\n getDoubleParameter(parameterName: string): number {\n return this.filterCreator.getDoubleParameter(\n this.pixiFilter,\n parameterName\n );\n }\n\n getColorParameter(parameterName: string): number {\n return this.filterCreator.getColorParameter(\n this.pixiFilter,\n parameterName\n );\n }\n\n getNetworkSyncData(): any {\n return {\n ena: this.pixiFilter.enabled,\n fc: this.filterCreator.getNetworkSyncData(this.pixiFilter),\n };\n }\n\n updateFromNetworkSyncData(syncData: any): void {\n this.pixiFilter.enabled = syncData.ena;\n this.filterCreator.updateFromNetworkSyncData(\n this.pixiFilter,\n syncData.fc\n );\n }\n }\n\n export class EmptyFilter implements Filter {\n isEnabled(target: EffectsTarget): boolean {\n return false;\n }\n setEnabled(target: EffectsTarget, enabled: boolean): boolean {\n return false;\n }\n applyEffect(target: EffectsTarget): boolean {\n return false;\n }\n removeEffect(target: EffectsTarget): boolean {\n return false;\n }\n updatePreRender(target: gdjs.EffectsTarget): any {}\n updateDoubleParameter(parameterName: string, value: number): void {}\n updateStringParameter(parameterName: string, value: string): void {}\n updateBooleanParameter(parameterName: string, value: boolean): void {}\n updateColorParameter(parameterName: string, value: number): void {}\n getDoubleParameter(parameterName: string): number {\n return 0;\n }\n getColorParameter(parameterName: string): number {\n return 0;\n }\n getNetworkSyncData(): any {\n return {};\n }\n updateFromNetworkSyncData(syncData: any): void {}\n }\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["namespace gdjs {\n const logger = new gdjs.Logger('Filters');\n\n export namespace PixiFiltersTools {\n export const clampValue = function (value, min, max) {\n return Math.max(min, Math.min(max, value));\n };\n\n export const clampKernelSize = function (value, min, max) {\n const len = Math.round((max - min) / 2 + 1);\n const arr = new Array(len);\n for (let i = 0; i < len; i++) {\n arr[i] = min + 2 * i;\n }\n return arr.indexOf(value) !== -1 ? value : min;\n };\n\n const _filterCreators: {\n [filterName: string]: FilterCreator;\n } = {};\n\n /**\n * Return the creator for the filter with the given name, if any.\n * @param filterName The name of the filter to get\n * @return The filter creator, if any (null otherwise).\n */\n export const getFilterCreator = function (\n filterName: string\n ): FilterCreator | null {\n if (_filterCreators.hasOwnProperty(filterName)) {\n return _filterCreators[filterName];\n }\n return null;\n };\n\n /**\n * Register a new PIXI filter creator, to be used by GDJS.\n * @param filterName The name of the filter to get\n * @param filterCreator The object used to create the filter.\n */\n export const registerFilterCreator = function (\n filterName: string,\n filterCreator: FilterCreator\n ) {\n if (_filterCreators.hasOwnProperty(filterName)) {\n logger.warn(\n 'Filter \"' +\n filterName +\n '\" was already registered in gdjs.PixiFiltersTools. Replacing it with the new one.'\n );\n }\n _filterCreators[filterName] = filterCreator;\n };\n\n /** A wrapper allowing to create an effect. */\n export interface FilterCreator {\n /** Function to call to create the filter */\n makeFilter(target: EffectsTarget, effectData: EffectData): Filter;\n }\n\n /** An effect. */\n export interface Filter {\n /**\n * Check if an effect is enabled.\n * @return true if the filter is enabled\n */\n isEnabled(target: EffectsTarget): boolean;\n /**\n * Enable an effect.\n * @param enabled Set to true to enable, false to disable\n */\n setEnabled(target: EffectsTarget, enabled: boolean): boolean;\n /**\n * Apply the effect on the PixiJS DisplayObject.\n * Called after the effect is initialized.\n * @param rendererObject The renderer object\n * @param effect The effect to be applied.\n */\n applyEffect(target: EffectsTarget): boolean;\n removeEffect(target: EffectsTarget): boolean;\n /** The function to be called to update the filter at every frame before the rendering. */\n updatePreRender(target: gdjs.EffectsTarget): any;\n /** The function to be called to update a parameter (with a number) */\n updateDoubleParameter(\n //filter: PIXI.Filter,\n parameterName: string,\n value: number\n ): void;\n /** The function to be called to update a parameter (with a string) */\n updateStringParameter(parameterName: string, value: string): void;\n /** The function to be called to update a parameter (with a boolean) */\n updateBooleanParameter(parameterName: string, value: boolean): void;\n updateColorParameter(parameterName: string, value: number): void;\n getDoubleParameter(parameterName: string): number;\n getColorParameter(parameterName: string): number;\n getNetworkSyncData(): any;\n updateFromNetworkSyncData(syncData: any): void;\n }\n\n /** A wrapper allowing to create a PIXI filter and update it using a common interface */\n export abstract class PixiFilterCreator implements FilterCreator {\n /** Function to call to create the filter */\n makeFilter(target: EffectsTarget, effectData: EffectData): Filter {\n const pixiFilter = this.makePIXIFilter(target, effectData);\n if (target.isLightingLayer && target.isLightingLayer()) {\n pixiFilter.blendMode = PIXI.BLEND_MODES.ADD;\n }\n return new PixiFilter(pixiFilter, this);\n }\n /** Function to call to create the filter */\n abstract makePIXIFilter(\n target: EffectsTarget,\n effectData: EffectData\n ): any;\n /** The function to be called to update the filter at every frame before the rendering. */\n abstract updatePreRender(\n filter: PIXI.Filter,\n target: gdjs.EffectsTarget\n ): any;\n /** The function to be called to update a parameter (with a number) */\n abstract updateDoubleParameter(\n filter: PIXI.Filter,\n parameterName: string,\n value: number\n ): void;\n /** The function to be called to update a parameter (with a string) */\n abstract updateStringParameter(\n filter: PIXI.Filter,\n parameterName: string,\n value: string\n ): void;\n /** The function to be called to update a parameter (with a boolean) */\n abstract updateBooleanParameter(\n filter: PIXI.Filter,\n parameterName: string,\n value: boolean\n ): void;\n abstract updateColorParameter(\n filter: PIXI.Filter,\n parameterName: string,\n value: number\n ): void;\n abstract getDoubleParameter(\n filter: PIXI.Filter,\n parameterName: string\n ): number;\n abstract getColorParameter(\n filter: PIXI.Filter,\n parameterName: string\n ): number;\n abstract getNetworkSyncData(filter: PIXI.Filter): any;\n abstract updateFromNetworkSyncData(\n filter: PIXI.Filter,\n syncData: any\n ): void;\n }\n\n /**An effect used to manipulate a Pixi filter. */\n export class PixiFilter implements Filter {\n /** The PIXI filter */\n pixiFilter: PIXI.Filter;\n filterCreator: gdjs.PixiFiltersTools.PixiFilterCreator;\n\n constructor(\n pixiFilter: PIXI.Filter,\n filterCreator: gdjs.PixiFiltersTools.PixiFilterCreator\n ) {\n this.pixiFilter = pixiFilter;\n this.filterCreator = filterCreator;\n }\n\n isEnabled(target: EffectsTarget): boolean {\n return this.pixiFilter.enabled;\n }\n\n setEnabled(target: EffectsTarget, enabled: boolean): boolean {\n return (this.pixiFilter.enabled = enabled);\n }\n\n applyEffect(target: EffectsTarget): boolean {\n const rendererObject = target.getRendererObject() as\n | PIXI.DisplayObject\n | null\n | undefined;\n if (!rendererObject) {\n return false;\n }\n rendererObject.filters = (rendererObject.filters || []).concat(\n this.pixiFilter\n );\n return true;\n }\n\n removeEffect(target: EffectsTarget): boolean {\n const rendererObject = target.getRendererObject() as\n | PIXI.DisplayObject\n | null\n | undefined;\n if (!rendererObject) {\n return false;\n }\n rendererObject.filters = (rendererObject.filters || []).filter(\n (pixiFilter) => pixiFilter !== this.pixiFilter\n );\n return true;\n }\n\n updatePreRender(target: gdjs.EffectsTarget): any {\n this.filterCreator.updatePreRender(this.pixiFilter, target);\n }\n\n updateDoubleParameter(parameterName: string, value: number): void {\n this.filterCreator.updateDoubleParameter(\n this.pixiFilter,\n parameterName,\n value\n );\n }\n\n updateStringParameter(parameterName: string, value: string): void {\n this.filterCreator.updateStringParameter(\n this.pixiFilter,\n parameterName,\n value\n );\n }\n\n updateBooleanParameter(parameterName: string, value: boolean): void {\n this.filterCreator.updateBooleanParameter(\n this.pixiFilter,\n parameterName,\n value\n );\n }\n\n updateColorParameter(parameterName: string, value: number): void {\n this.filterCreator.updateColorParameter(\n this.pixiFilter,\n parameterName,\n value\n );\n }\n\n getDoubleParameter(parameterName: string): number {\n return this.filterCreator.getDoubleParameter(\n this.pixiFilter,\n parameterName\n );\n }\n\n getColorParameter(parameterName: string): number {\n return this.filterCreator.getColorParameter(\n this.pixiFilter,\n parameterName\n );\n }\n\n getNetworkSyncData(): any {\n return {\n ena: this.pixiFilter.enabled,\n fc: this.filterCreator.getNetworkSyncData(this.pixiFilter),\n };\n }\n\n updateFromNetworkSyncData(syncData: any): void {\n this.pixiFilter.enabled = syncData.ena;\n this.filterCreator.updateFromNetworkSyncData(\n this.pixiFilter,\n syncData.fc\n );\n }\n }\n\n export class EmptyFilter implements Filter {\n isEnabled(target: EffectsTarget): boolean {\n return false;\n }\n setEnabled(target: EffectsTarget, enabled: boolean): boolean {\n return false;\n }\n applyEffect(target: EffectsTarget): boolean {\n return false;\n }\n removeEffect(target: EffectsTarget): boolean {\n return false;\n }\n updatePreRender(target: gdjs.EffectsTarget): any {}\n updateDoubleParameter(parameterName: string, value: number): void {}\n updateStringParameter(parameterName: string, value: string): void {}\n updateBooleanParameter(parameterName: string, value: boolean): void {}\n updateColorParameter(parameterName: string, value: number): void {}\n getDoubleParameter(parameterName: string): number {\n return 0;\n }\n getColorParameter(parameterName: string): number {\n return 0;\n }\n getNetworkSyncData(): any {\n return {};\n }\n updateFromNetworkSyncData(syncData: any): void {}\n }\n }\n}\n"],
5
+ "mappings": "AAAA,GAAU,MAAV,UAAU,EAAV,CACE,KAAM,GAAS,GAAI,GAAK,OAAO,WAExB,GAAU,GAAV,UAAU,EAAV,CACE,AAAM,aAAa,SAAU,EAAO,EAAK,EAAK,CACnD,MAAO,MAAK,IAAI,EAAK,KAAK,IAAI,EAAK,KAGxB,kBAAkB,SAAU,EAAO,EAAK,EAAK,CACxD,KAAM,GAAM,KAAK,MAAO,GAAM,GAAO,EAAI,GACnC,EAAM,GAAI,OAAM,GACtB,OAAS,GAAI,EAAG,EAAI,EAAK,IACvB,EAAI,GAAK,EAAM,EAAI,EAErB,MAAO,GAAI,QAAQ,KAAW,GAAK,EAAQ,GAG7C,KAAM,GAEF,GAOG,AAAM,mBAAmB,SAC9B,EACsB,CACtB,MAAI,GAAgB,eAAe,GAC1B,EAAgB,GAElB,MAQI,wBAAwB,SACnC,EACA,EACA,CACA,AAAI,EAAgB,eAAe,IACjC,EAAO,KACL,WACE,EACA,qFAGN,EAAgB,GAAc,GAiDzB,OAA0D,CAE/D,WAAW,EAAuB,EAAgC,CAChE,KAAM,GAAa,KAAK,eAAe,EAAQ,GAC/C,MAAI,GAAO,iBAAmB,EAAO,mBACnC,GAAW,UAAY,KAAK,YAAY,KAEnC,GAAI,GAAW,EAAY,OAP/B,EAAe,oBA0Df,OAAmC,CAKxC,YACE,EACA,EACA,CACA,KAAK,WAAa,EAClB,KAAK,cAAgB,EAGvB,UAAU,EAAgC,CACxC,MAAO,MAAK,WAAW,QAGzB,WAAW,EAAuB,EAA2B,CAC3D,MAAQ,MAAK,WAAW,QAAU,EAGpC,YAAY,EAAgC,CAC1C,KAAM,GAAiB,EAAO,oBAI9B,MAAK,GAGL,GAAe,QAAW,GAAe,SAAW,IAAI,OACtD,KAAK,YAEA,IALE,GAQX,aAAa,EAAgC,CAC3C,KAAM,GAAiB,EAAO,oBAI9B,MAAK,GAGL,GAAe,QAAW,GAAe,SAAW,IAAI,OACtD,AAAC,GAAe,IAAe,KAAK,YAE/B,IALE,GAQX,gBAAgB,EAAiC,CAC/C,KAAK,cAAc,gBAAgB,KAAK,WAAY,GAGtD,sBAAsB,EAAuB,EAAqB,CAChE,KAAK,cAAc,sBACjB,KAAK,WACL,EACA,GAIJ,sBAAsB,EAAuB,EAAqB,CAChE,KAAK,cAAc,sBACjB,KAAK,WACL,EACA,GAIJ,uBAAuB,EAAuB,EAAsB,CAClE,KAAK,cAAc,uBACjB,KAAK,WACL,EACA,GAIJ,qBAAqB,EAAuB,EAAqB,CAC/D,KAAK,cAAc,qBACjB,KAAK,WACL,EACA,GAIJ,mBAAmB,EAA+B,CAChD,MAAO,MAAK,cAAc,mBACxB,KAAK,WACL,GAIJ,kBAAkB,EAA+B,CAC/C,MAAO,MAAK,cAAc,kBACxB,KAAK,WACL,GAIJ,oBAA0B,CACxB,MAAO,CACL,IAAK,KAAK,WAAW,QACrB,GAAI,KAAK,cAAc,mBAAmB,KAAK,aAInD,0BAA0B,EAAqB,CAC7C,KAAK,WAAW,QAAU,EAAS,IACnC,KAAK,cAAc,0BACjB,KAAK,WACL,EAAS,KA9GR,EAAM,aAmHN,OAAoC,CACzC,UAAU,EAAgC,CACxC,MAAO,GAET,WAAW,EAAuB,EAA2B,CAC3D,MAAO,GAET,YAAY,EAAgC,CAC1C,MAAO,GAET,aAAa,EAAgC,CAC3C,MAAO,GAET,gBAAgB,EAAiC,EACjD,sBAAsB,EAAuB,EAAqB,EAClE,sBAAsB,EAAuB,EAAqB,EAClE,uBAAuB,EAAuB,EAAsB,EACpE,qBAAqB,EAAuB,EAAqB,EACjE,mBAAmB,EAA+B,CAChD,MAAO,GAET,kBAAkB,EAA+B,CAC/C,MAAO,GAET,oBAA0B,CACxB,MAAO,GAET,0BAA0B,EAAqB,GA3B1C,EAAM,gBA9QE,iDAHT",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var gdjs;(function(l){const d=new l.Logger("PIXI game renderer"),f=[37,38,39,40];class R{constructor(t,e){this._isFullPage=!0;this._isFullscreen=!1;this._pixiRenderer=null;this._threeRenderer=null;this._gameCanvas=null;this._domElementsContainer=null;this._canvasWidth=0;this._canvasHeight=0;this._keepRatio=!0;this._nextFrameId=0;this.getElectronRemote=()=>{if(typeof require=="function"){const t=this._game.getAdditionalOptions(),e=t&&t.electronRemoteRequirePath?t.electronRemoteRequirePath:"@electron/remote";try{return require(e)}catch(i){console.error(`Could not load @electron/remote from "${e}". Error is:`,i)}}return null};this._game=t,this._forceFullscreen=e,this._marginLeft=this._marginTop=this._marginRight=this._marginBottom=0,this._setupOrientation()}createStandardCanvas(t){let e;typeof THREE!="undefined"?(e=document.createElement("canvas"),this._threeRenderer=new THREE.WebGLRenderer({canvas:e,antialias:this._game.getAntialiasingMode()!=="none"&&(this._game.isAntialisingEnabledOnMobile()||!l.evtTools.common.isMobile())}),this._threeRenderer.useLegacyLights=!0,this._threeRenderer.autoClear=!1,this._threeRenderer.setSize(this._game.getGameResolutionWidth(),this._game.getGameResolutionHeight()),this._pixiRenderer=new PIXI.Renderer({width:this._game.getGameResolutionWidth(),height:this._game.getGameResolutionHeight(),view:e,context:this._threeRenderer.getContext(),clearBeforeRender:!1,preserveDrawingBuffer:!0,antialias:!1,backgroundAlpha:0}),e=this._threeRenderer.domElement):(this._pixiRenderer=PIXI.autoDetectRenderer({width:this._game.getGameResolutionWidth(),height:this._game.getGameResolutionHeight(),preserveDrawingBuffer:!0,antialias:!1}),e=this._pixiRenderer.view),this._pixiRenderer.plugins.accessibility.destroy(),delete this._pixiRenderer.plugins.accessibility,t.appendChild(e),this._gameCanvas=e,e.style.position="absolute",e.tabIndex=1,e.style.userSelect="none",e.style.outline="none";const i=document.createElement("div");i.style.position="absolute",i.style.overflow="hidden",i.style.outline="none",i.style.pointerEvents="none",i.addEventListener("scroll",o=>{i.scrollLeft=0,i.scrollTop=0,o.preventDefault()}),e.addEventListener("pointerdown",()=>{e.focus()}),i.style["-webkit-user-select"]="none",t.appendChild(i),this._domElementsContainer=i,this._resizeCanvas(),this._game.getScaleMode()==="nearest"&&(e.style["image-rendering"]="-moz-crisp-edges",e.style["image-rendering"]="-webkit-optimize-contrast",e.style["image-rendering"]="-webkit-crisp-edges",e.style["image-rendering"]="pixelated"),this._game.getPixelsRounding()&&(PIXI.settings.ROUND_PIXELS=!0),window.addEventListener("resize",()=>{this._game.onWindowInnerSizeChanged(),this._resizeCanvas()}),e.focus()}static getWindowInnerWidth(){return typeof window!="undefined"?window.innerWidth:800}static getWindowInnerHeight(){return typeof window!="undefined"?window.innerHeight:800}updateRendererSize(){this._resizeCanvas()}_setupOrientation(){if(typeof window=="undefined"||!window.screen||!window.screen.orientation)return;const t=this._game.getGameData().properties.orientation;try{if(t==="default"){const e=window.screen.orientation.unlock();e&&e.catch(()=>{})}else window.screen.orientation.lock(t).catch(()=>{})}catch(e){d.error("Unexpected error while setting up orientation: ",e)}}_resizeCanvas(){if(!this._pixiRenderer||!this._domElementsContainer)return;(this._pixiRenderer.width!==this._game.getGameResolutionWidth()||this._pixiRenderer.height!==this._game.getGameResolutionHeight())&&(this._pixiRenderer.resize(this._game.getGameResolutionWidth(),this._game.getGameResolutionHeight()),this._threeRenderer&&this._threeRenderer.setSize(this._game.getGameResolutionWidth(),this._game.getGameResolutionHeight()));const t=this._forceFullscreen||this._isFullPage||this._isFullscreen;let e=this._game.getGameResolutionWidth(),i=this._game.getGameResolutionHeight(),o=window.innerWidth-this._marginLeft-this._marginRight,r=window.innerHeight-this._marginTop-this._marginBottom;if(o<0&&(o=0),r<0&&(r=0),t&&!this._keepRatio)e=o,i=r;else if(t&&this._keepRatio||e>o||i>r){let u=o/e;i*u>r&&(u=r/i),e*=u,i*=u}this._gameCanvas&&(this._gameCanvas.style.top=this._marginTop+(r-i)/2+"px",this._gameCanvas.style.left=this._marginLeft+(o-e)/2+"px",this._gameCanvas.style.width=e+"px",this._gameCanvas.style.height=i+"px"),this._domElementsContainer.style.top=this._marginTop+(r-i)/2+"px",this._domElementsContainer.style.left=this._marginLeft+(o-e)/2+"px",this._domElementsContainer.style.width=e+"px",this._domElementsContainer.style.height=i+"px",this._canvasWidth=e,this._canvasHeight=i}keepAspectRatio(t){this._keepRatio!==t&&(this._keepRatio=t,this._resizeCanvas())}setMargins(t,e,i,o){this._marginTop===t&&this._marginRight===e&&this._marginBottom===i&&this._marginLeft===o||(this._marginTop=t,this._marginRight=e,this._marginBottom=i,this._marginLeft=o,this._resizeCanvas())}setWindowSize(t,e){const i=this.getElectronRemote();if(i){const o=i.getCurrentWindow();o&&o.setContentSize(t,e)}else d.warn("Window size can't be changed on this platform.")}centerWindow(){const t=this.getElectronRemote();if(t){const e=t.getCurrentWindow();e&&e.center()}}setFullScreen(t){if(!this._forceFullscreen&&this._isFullscreen!==t){this._isFullscreen=!!t;const e=this.getElectronRemote();if(e){const i=e.getCurrentWindow();i&&i.setFullScreen(this._isFullscreen)}else this._isFullscreen?document.documentElement.requestFullscreen?document.documentElement.requestFullscreen():document.documentElement.mozRequestFullScreen?document.documentElement.mozRequestFullScreen():document.documentElement.webkitRequestFullScreen&&document.documentElement.webkitRequestFullScreen():document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen&&document.webkitCancelFullScreen();this._resizeCanvas()}}isFullScreen(){const t=this.getElectronRemote();return t?t.getCurrentWindow().isFullScreen():this._isFullscreen||window.screen.height===window.innerHeight}convertCanvasToDomElementContainerCoords(t,e){const i=e||[0,0];return i[0]=t[0]*this._canvasWidth/this._game.getGameResolutionWidth(),i[1]=t[1]*this._canvasHeight/this._game.getGameResolutionHeight(),i}getCanvasToDomElementContainerHeightScale(){return(this._canvasHeight||1)/this._game.getGameResolutionHeight()}bindStandardEvents(t,e,i){const o=this._gameCanvas;if(!o)return;const r=n=>{const s=[n.pageX-o.offsetLeft,n.pageY-o.offsetTop];return s[0]*=this._game.getGameResolutionWidth()/(this._canvasWidth||1),s[1]*=this._game.getGameResolutionHeight()/(this._canvasHeight||1),s},u=n=>{const s=n.pageX-o.offsetLeft,a=n.pageY-o.offsetTop;return 0<=s&&s<(this._canvasWidth||1)&&0<=a&&a<(this._canvasHeight||1)};(function(){isNaN(o.offsetLeft)&&(o.offsetLeft=0,o.offsetTop=0),isNaN(i.body.scrollLeft)&&(i.body.scrollLeft=0,i.body.scrollTop=0),(i.documentElement===void 0||i.documentElement===null)&&(i.documentElement={}),isNaN(i.documentElement.scrollLeft)&&(i.documentElement.scrollLeft=0,i.documentElement.scrollTop=0),isNaN(o.offsetLeft)&&(o.offsetLeft=0,o.offsetTop=0)})();const m=()=>!(i.activeElement===o||i.activeElement===i.body||i.activeElement===null),c=n=>!(n.target===o||n.target===i.body);i.onkeydown=function(n){m()||(f.includes(n.keyCode)&&n.preventDefault(),t.onKeyPressed(n.keyCode,n.location))},i.onkeyup=function(n){m()||(f.includes(n.keyCode)&&n.preventDefault(),t.onKeyReleased(n.keyCode,n.location))};function g(n){switch(n){case 1:return l.InputManager.MOUSE_MIDDLE_BUTTON;case 2:return l.InputManager.MOUSE_RIGHT_BUTTON}return n}o.onmousemove=function(n){const s=r(n);t.onMouseMove(s[0],s[1])},o.onmousedown=function(n){return t.onMouseButtonPressed(g(n.button)),e.focus!==void 0&&e.focus(),!1},o.onmouseup=function(n){return t.onMouseButtonReleased(g(n.button)),!1},o.onmouseleave=function(n){t.onMouseLeave()},o.onmouseenter=function(n){t.onMouseEnter();const s=[l.InputManager.MOUSE_LEFT_BUTTON,l.InputManager.MOUSE_RIGHT_BUTTON,l.InputManager.MOUSE_MIDDLE_BUTTON,l.InputManager.MOUSE_BACK_BUTTON,l.InputManager.MOUSE_FORWARD_BUTTON];for(let a=0,v=s.length;a<v;++a){const h=s[a],_=(n.buttons&1<<a)!=0,p=t.isMouseButtonPressed(h);_&&!p?t.onMouseButtonPressed(h):!_&&p&&t.onMouseButtonReleased(h)}},e.addEventListener("click",function(n){return e.focus!==void 0&&e.focus(),!1},!1),o.oncontextmenu=function(n){return n.preventDefault(),n.stopPropagation(),!1},o.onwheel=function(n){t.onMouseWheel(-n.deltaY)},e.addEventListener("touchmove",function(n){if(!c(n)&&(n.preventDefault(),n.changedTouches))for(let s=0;s<n.changedTouches.length;++s){const a=r(n.changedTouches[s]);t.onTouchMove(n.changedTouches[s].identifier,a[0],a[1]),t.isSimulatingMouseWithTouch()&&(u(n.changedTouches[s])?t.onMouseEnter():t.onMouseLeave())}},{passive:!1}),e.addEventListener("touchstart",function(n){if(!c(n)){if(n.preventDefault(),n.changedTouches)for(let s=0;s<n.changedTouches.length;++s){const a=r(n.changedTouches[s]);t.onTouchStart(n.changedTouches[s].identifier,a[0],a[1])}return!1}},{passive:!1}),e.addEventListener("touchend",function(n){if(!c(n)){if(n.preventDefault(),n.changedTouches)for(let s=0;s<n.changedTouches.length;++s)t.onTouchEnd(n.changedTouches[s].identifier);return!1}},{passive:!1}),e.addEventListener("touchcancel",function(n){if(!c(n)){if(n.preventDefault(),n.changedTouches)for(let s=0;s<n.changedTouches.length;++s)t.onTouchCancel(n.changedTouches[s].identifier);return!1}},{passive:!1})}setWindowTitle(t){typeof document!="undefined"&&(document.title=t)}getWindowTitle(){return typeof document!="undefined"?document.title:""}startGameLoop(t){let e=0;const i=o=>{this._nextFrameId=requestAnimationFrame(i);const r=e?o-e:0;e=o,t(r)||cancelAnimationFrame(this._nextFrameId)};requestAnimationFrame(i)}getPIXIRenderer(){return this._pixiRenderer}getThreeRenderer(){return this._threeRenderer}getDomElementContainer(){return this._domElementsContainer}openURL(t){if(typeof window!="undefined"){const e=this.getElectron();e?e.shell.openExternal(t):typeof window.cordova!="undefined"&&typeof window.cordova.InAppBrowser!="undefined"?window.cordova.InAppBrowser.open(t,"_system","location=yes"):window.open(t,"_blank")}}stopGame(){const t=this.getElectronRemote();if(t){const e=t.getCurrentWindow();e&&e.close()}else typeof navigator!="undefined"&&navigator.app&&navigator.app.exitApp&&navigator.app.exitApp()}getCanvas(){return this._gameCanvas}isWebGLSupported(){return!!this._pixiRenderer&&this._pixiRenderer.type===PIXI.RENDERER_TYPE.WEBGL}getElectron(){return typeof require=="function"?require("electron"):null}getGame(){return this._game}}l.RuntimeGamePixiRenderer=R,l.RuntimeGameRenderer=R})(gdjs||(gdjs={}));
1
+ var gdjs;(function(l){const u=new l.Logger("PIXI game renderer"),f=[37,38,39,40];class R{constructor(t,e){this._isFullPage=!0;this._isFullscreen=!1;this._pixiRenderer=null;this._threeRenderer=null;this._gameCanvas=null;this._domElementsContainer=null;this._canvasWidth=0;this._canvasHeight=0;this._keepRatio=!0;this._nextFrameId=0;this.getElectronRemote=()=>{if(typeof require=="function"){const t=this._game.getAdditionalOptions(),e=t&&t.electronRemoteRequirePath?t.electronRemoteRequirePath:"@electron/remote";try{return require(e)}catch(i){console.error(`Could not load @electron/remote from "${e}". Error is:`,i)}}return null};this._game=t,this._forceFullscreen=e,this._marginLeft=this._marginTop=this._marginRight=this._marginBottom=0,this._setupOrientation()}createStandardCanvas(t){let e;typeof THREE!="undefined"?(e=document.createElement("canvas"),this._threeRenderer=new THREE.WebGLRenderer({canvas:e,antialias:this._game.getAntialiasingMode()!=="none"&&(this._game.isAntialisingEnabledOnMobile()||!l.evtTools.common.isMobile())}),this._threeRenderer.useLegacyLights=!0,this._threeRenderer.autoClear=!1,this._threeRenderer.setSize(this._game.getGameResolutionWidth(),this._game.getGameResolutionHeight()),this._pixiRenderer=new PIXI.Renderer({width:this._game.getGameResolutionWidth(),height:this._game.getGameResolutionHeight(),view:e,context:this._threeRenderer.getContext(),clearBeforeRender:!1,preserveDrawingBuffer:!0,antialias:!1,backgroundAlpha:0}),e=this._threeRenderer.domElement):(this._pixiRenderer=PIXI.autoDetectRenderer({width:this._game.getGameResolutionWidth(),height:this._game.getGameResolutionHeight(),preserveDrawingBuffer:!0,antialias:!1}),e=this._pixiRenderer.view),this._pixiRenderer.plugins.accessibility.destroy(),delete this._pixiRenderer.plugins.accessibility,t.appendChild(e),this._gameCanvas=e,e.style.position="absolute",e.tabIndex=1,e.style.userSelect="none",e.style.outline="none";const i=document.createElement("div");i.style.position="absolute",i.style.overflow="hidden",i.style.outline="none",i.style.pointerEvents="none",i.addEventListener("scroll",o=>{i.scrollLeft=0,i.scrollTop=0,o.preventDefault()}),e.addEventListener("pointerdown",()=>{e.focus()}),i.style["-webkit-user-select"]="none",t.appendChild(i),this._domElementsContainer=i,this._resizeCanvas(),this._game.getScaleMode()==="nearest"&&(e.style["image-rendering"]="-moz-crisp-edges",e.style["image-rendering"]="-webkit-optimize-contrast",e.style["image-rendering"]="-webkit-crisp-edges",e.style["image-rendering"]="pixelated"),this._game.getPixelsRounding()&&(PIXI.settings.ROUND_PIXELS=!0),window.addEventListener("resize",()=>{this._game.onWindowInnerSizeChanged(),this._resizeCanvas()}),e.focus()}static getWindowInnerWidth(){return typeof window!="undefined"?window.innerWidth:800}static getWindowInnerHeight(){return typeof window!="undefined"?window.innerHeight:800}updateRendererSize(){this._resizeCanvas()}_setupOrientation(){if(typeof window=="undefined"||!window.screen||!window.screen.orientation)return;const t=this._game.getGameData().properties.orientation;try{if(t==="default"){const e=window.screen.orientation.unlock();e&&e.catch(()=>{})}else window.screen.orientation.lock(t).catch(()=>{})}catch(e){u.error("Unexpected error while setting up orientation: ",e)}}_resizeCanvas(){if(!this._pixiRenderer||!this._domElementsContainer)return;(this._pixiRenderer.width!==this._game.getGameResolutionWidth()||this._pixiRenderer.height!==this._game.getGameResolutionHeight())&&(this._pixiRenderer.resize(this._game.getGameResolutionWidth(),this._game.getGameResolutionHeight()),this._threeRenderer&&this._threeRenderer.setSize(this._game.getGameResolutionWidth(),this._game.getGameResolutionHeight()));const t=this._forceFullscreen||this._isFullPage||this._isFullscreen;let e=this._game.getGameResolutionWidth(),i=this._game.getGameResolutionHeight(),o=window.innerWidth-this._marginLeft-this._marginRight,r=window.innerHeight-this._marginTop-this._marginBottom;if(o<0&&(o=0),r<0&&(r=0),t&&!this._keepRatio)e=o,i=r;else if(t&&this._keepRatio||e>o||i>r){let c=o/e;i*c>r&&(c=r/i),e*=c,i*=c}this._gameCanvas&&(this._gameCanvas.style.top=this._marginTop+(r-i)/2+"px",this._gameCanvas.style.left=this._marginLeft+(o-e)/2+"px",this._gameCanvas.style.width=e+"px",this._gameCanvas.style.height=i+"px"),this._domElementsContainer.style.top=this._marginTop+(r-i)/2+"px",this._domElementsContainer.style.left=this._marginLeft+(o-e)/2+"px",this._domElementsContainer.style.width=e+"px",this._domElementsContainer.style.height=i+"px",this._canvasWidth=e,this._canvasHeight=i}keepAspectRatio(t){this._keepRatio!==t&&(this._keepRatio=t,this._resizeCanvas())}setMargins(t,e,i,o){this._marginTop===t&&this._marginRight===e&&this._marginBottom===i&&this._marginLeft===o||(this._marginTop=t,this._marginRight=e,this._marginBottom=i,this._marginLeft=o,this._resizeCanvas())}setWindowSize(t,e){const i=this.getElectronRemote();if(i){const o=i.getCurrentWindow();try{o&&o.setContentSize(t,e)}catch(r){u.error(`Window size setting to width ${t} and height ${e} failed. See error:`,r)}}else u.warn("Window size can't be changed on this platform.")}centerWindow(){const t=this.getElectronRemote();if(t){const e=t.getCurrentWindow();try{e&&e.center()}catch(i){u.error("Window centering failed. See error:",i)}}else u.warn("Window can't be centered on this platform.")}setFullScreen(t){if(!this._forceFullscreen&&this._isFullscreen!==t){this._isFullscreen=!!t;const e=this.getElectronRemote();if(e){const i=e.getCurrentWindow();try{i&&i.setFullScreen(this._isFullscreen)}catch(o){u.error(`Full screen setting to ${this._isFullscreen} failed. See error:`,o)}}else this._isFullscreen?document.documentElement.requestFullscreen?document.documentElement.requestFullscreen():document.documentElement.mozRequestFullScreen?document.documentElement.mozRequestFullScreen():document.documentElement.webkitRequestFullScreen&&document.documentElement.webkitRequestFullScreen():document.exitFullscreen?document.exitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitCancelFullScreen&&document.webkitCancelFullScreen();this._resizeCanvas()}}isFullScreen(){const t=this.getElectronRemote();if(t)try{return t.getCurrentWindow().isFullScreen()}catch(e){return u.error("Full screen detection failed. See error:",e),!1}return this._isFullscreen||window.screen.height===window.innerHeight}convertCanvasToDomElementContainerCoords(t,e){const i=e||[0,0];return i[0]=t[0]*this._canvasWidth/this._game.getGameResolutionWidth(),i[1]=t[1]*this._canvasHeight/this._game.getGameResolutionHeight(),i}getCanvasToDomElementContainerHeightScale(){return(this._canvasHeight||1)/this._game.getGameResolutionHeight()}bindStandardEvents(t,e,i){const o=this._gameCanvas;if(!o)return;const r=n=>{const s=[n.pageX-o.offsetLeft,n.pageY-o.offsetTop];return s[0]*=this._game.getGameResolutionWidth()/(this._canvasWidth||1),s[1]*=this._game.getGameResolutionHeight()/(this._canvasHeight||1),s},c=n=>{const s=n.pageX-o.offsetLeft,a=n.pageY-o.offsetTop;return 0<=s&&s<(this._canvasWidth||1)&&0<=a&&a<(this._canvasHeight||1)};(function(){isNaN(o.offsetLeft)&&(o.offsetLeft=0,o.offsetTop=0),isNaN(i.body.scrollLeft)&&(i.body.scrollLeft=0,i.body.scrollTop=0),(i.documentElement===void 0||i.documentElement===null)&&(i.documentElement={}),isNaN(i.documentElement.scrollLeft)&&(i.documentElement.scrollLeft=0,i.documentElement.scrollTop=0),isNaN(o.offsetLeft)&&(o.offsetLeft=0,o.offsetTop=0)})();const m=()=>!(i.activeElement===o||i.activeElement===i.body||i.activeElement===null),d=n=>!(n.target===o||n.target===i.body);i.onkeydown=function(n){m()||(f.includes(n.keyCode)&&n.preventDefault(),t.onKeyPressed(n.keyCode,n.location))},i.onkeyup=function(n){m()||(f.includes(n.keyCode)&&n.preventDefault(),t.onKeyReleased(n.keyCode,n.location))};function g(n){switch(n){case 1:return l.InputManager.MOUSE_MIDDLE_BUTTON;case 2:return l.InputManager.MOUSE_RIGHT_BUTTON}return n}o.onmousemove=function(n){const s=r(n);t.onMouseMove(s[0],s[1])},o.onmousedown=function(n){return t.onMouseButtonPressed(g(n.button)),e.focus!==void 0&&e.focus(),!1},o.onmouseup=function(n){return t.onMouseButtonReleased(g(n.button)),!1},o.onmouseleave=function(n){t.onMouseLeave()},o.onmouseenter=function(n){t.onMouseEnter();const s=[l.InputManager.MOUSE_LEFT_BUTTON,l.InputManager.MOUSE_RIGHT_BUTTON,l.InputManager.MOUSE_MIDDLE_BUTTON,l.InputManager.MOUSE_BACK_BUTTON,l.InputManager.MOUSE_FORWARD_BUTTON];for(let a=0,v=s.length;a<v;++a){const h=s[a],_=(n.buttons&1<<a)!=0,p=t.isMouseButtonPressed(h);_&&!p?t.onMouseButtonPressed(h):!_&&p&&t.onMouseButtonReleased(h)}},e.addEventListener("click",function(n){return e.focus!==void 0&&e.focus(),!1},!1),o.oncontextmenu=function(n){return n.preventDefault(),n.stopPropagation(),!1},o.onwheel=function(n){t.onMouseWheel(-n.deltaY)},e.addEventListener("touchmove",function(n){if(!d(n)&&(n.preventDefault(),n.changedTouches))for(let s=0;s<n.changedTouches.length;++s){const a=r(n.changedTouches[s]);t.onTouchMove(n.changedTouches[s].identifier,a[0],a[1]),t.isSimulatingMouseWithTouch()&&(c(n.changedTouches[s])?t.onMouseEnter():t.onMouseLeave())}},{passive:!1}),e.addEventListener("touchstart",function(n){if(!d(n)){if(n.preventDefault(),n.changedTouches)for(let s=0;s<n.changedTouches.length;++s){const a=r(n.changedTouches[s]);t.onTouchStart(n.changedTouches[s].identifier,a[0],a[1])}return!1}},{passive:!1}),e.addEventListener("touchend",function(n){if(!d(n)){if(n.preventDefault(),n.changedTouches)for(let s=0;s<n.changedTouches.length;++s)t.onTouchEnd(n.changedTouches[s].identifier);return!1}},{passive:!1}),e.addEventListener("touchcancel",function(n){if(!d(n)){if(n.preventDefault(),n.changedTouches)for(let s=0;s<n.changedTouches.length;++s)t.onTouchCancel(n.changedTouches[s].identifier);return!1}},{passive:!1})}setWindowTitle(t){typeof document!="undefined"&&(document.title=t)}getWindowTitle(){return typeof document!="undefined"?document.title:""}startGameLoop(t){let e=0;const i=o=>{this._nextFrameId=requestAnimationFrame(i);const r=e?o-e:0;e=o,t(r)||cancelAnimationFrame(this._nextFrameId)};requestAnimationFrame(i)}getPIXIRenderer(){return this._pixiRenderer}getThreeRenderer(){return this._threeRenderer}getDomElementContainer(){return this._domElementsContainer}openURL(t){if(typeof window!="undefined"){const e=this.getElectron();e?e.shell.openExternal(t):typeof window.cordova!="undefined"&&typeof window.cordova.InAppBrowser!="undefined"?window.cordova.InAppBrowser.open(t,"_system","location=yes"):window.open(t,"_blank")}}stopGame(){const t=this.getElectronRemote();if(t){const e=t.getCurrentWindow();if(e)try{e.close()}catch(i){u.error("Window closing failed. See error:",i)}}else typeof navigator!="undefined"&&navigator.app&&navigator.app.exitApp&&navigator.app.exitApp()}getCanvas(){return this._gameCanvas}isWebGLSupported(){return!!this._pixiRenderer&&this._pixiRenderer.type===PIXI.RENDERER_TYPE.WEBGL}getElectron(){return typeof require=="function"?require("electron"):null}getGame(){return this._game}}l.RuntimeGamePixiRenderer=R,l.RuntimeGameRenderer=R})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=runtimegame-pixi-renderer.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../GDevelop/GDJS/Runtime/pixi-renderers/runtimegame-pixi-renderer.ts"],
4
- "sourcesContent": ["namespace gdjs {\n const logger = new gdjs.Logger('PIXI game renderer');\n\n /**\n * Codes (as in `event.code`) of keys that should have their event `preventDefault`\n * called. This is used to avoid scrolling in a webpage when these keys are pressed\n * in the game.\n */\n const defaultPreventedKeyCodes = [\n 37, // ArrowLeft\n 38, // ArrowUp\n 39, // ArrowRight\n 40, // ArrowDown\n ];\n\n /**\n * The renderer for a gdjs.RuntimeGame using Pixi.js.\n */\n export class RuntimeGamePixiRenderer {\n _game: gdjs.RuntimeGame;\n _isFullPage: boolean = true;\n\n //Used to track if the canvas is displayed on the full page.\n _isFullscreen: boolean = false;\n\n //Used to track if the window is displayed as fullscreen (see setFullscreen method).\n _forceFullscreen: any;\n\n _pixiRenderer: PIXI.Renderer | null = null;\n private _threeRenderer: THREE.WebGLRenderer | null = null;\n private _gameCanvas: HTMLCanvasElement | null = null;\n private _domElementsContainer: HTMLDivElement | null = null;\n\n // Current width of the canvas (might be scaled down/up compared to renderer)\n _canvasWidth: float = 0;\n // Current height of the canvas (might be scaled down/up compared to renderer)\n _canvasHeight: float = 0;\n\n _keepRatio: boolean = true;\n _marginLeft: any;\n _marginTop: any;\n _marginRight: any;\n _marginBottom: any;\n\n _nextFrameId: integer = 0;\n\n /**\n * @param game The game that is being rendered\n * @param forceFullscreen If fullscreen should be always activated\n */\n constructor(game: gdjs.RuntimeGame, forceFullscreen: boolean) {\n this._game = game;\n this._forceFullscreen = forceFullscreen;\n\n //If set to true, the canvas will always be displayed as fullscreen, even if _isFullscreen == false.\n this._marginLeft = this._marginTop = this._marginRight = this._marginBottom = 0;\n this._setupOrientation();\n }\n\n /**\n * Create a standard canvas inside canvasArea.\n *\n */\n createStandardCanvas(parentElement: HTMLElement) {\n let gameCanvas: HTMLCanvasElement;\n if (typeof THREE !== 'undefined') {\n gameCanvas = document.createElement('canvas');\n this._threeRenderer = new THREE.WebGLRenderer({\n canvas: gameCanvas,\n antialias:\n this._game.getAntialiasingMode() !== 'none' &&\n (this._game.isAntialisingEnabledOnMobile() ||\n !gdjs.evtTools.common.isMobile()),\n });\n this._threeRenderer.useLegacyLights = true;\n this._threeRenderer.autoClear = false;\n this._threeRenderer.setSize(\n this._game.getGameResolutionWidth(),\n this._game.getGameResolutionHeight()\n );\n\n // Create a PixiJS renderer that use the same GL context as Three.js\n // so that both can render to the canvas and even have PixiJS rendering\n // reused in Three.js (by using a RenderTexture and the same internal WebGL texture).\n this._pixiRenderer = new PIXI.Renderer({\n width: this._game.getGameResolutionWidth(),\n height: this._game.getGameResolutionHeight(),\n view: gameCanvas,\n // @ts-ignore - reuse the context from Three.js.\n context: this._threeRenderer.getContext(),\n clearBeforeRender: false,\n preserveDrawingBuffer: true,\n antialias: false,\n backgroundAlpha: 0,\n // TODO (3D): add a setting for pixel ratio (`resolution: window.devicePixelRatio`)\n });\n\n gameCanvas = this._threeRenderer.domElement;\n } else {\n // Create the renderer and setup the rendering area.\n // \"preserveDrawingBuffer: true\" is needed to avoid flickering\n // and background issues on some mobile phones (see #585 #572 #566 #463).\n this._pixiRenderer = PIXI.autoDetectRenderer({\n width: this._game.getGameResolutionWidth(),\n height: this._game.getGameResolutionHeight(),\n preserveDrawingBuffer: true,\n antialias: false,\n }) as PIXI.Renderer;\n\n gameCanvas = this._pixiRenderer.view as HTMLCanvasElement;\n }\n\n // Deactivating accessibility support in PixiJS renderer, as we want to be in control of this.\n // See https://github.com/pixijs/pixijs/issues/5111#issuecomment-420047824\n this._pixiRenderer.plugins.accessibility.destroy();\n delete this._pixiRenderer.plugins.accessibility;\n\n // Add the renderer view element to the DOM\n parentElement.appendChild(gameCanvas);\n this._gameCanvas = gameCanvas;\n\n gameCanvas.style.position = 'absolute';\n\n // Ensure that the canvas has the focus.\n gameCanvas.tabIndex = 1;\n\n // Ensure long press can't create a selection\n gameCanvas.style.userSelect = 'none';\n gameCanvas.style.outline = 'none'; // No selection/focus ring on the canvas.\n\n // Set up the container for HTML elements on top of the game canvas.\n const domElementsContainer = document.createElement('div');\n domElementsContainer.style.position = 'absolute';\n domElementsContainer.style.overflow = 'hidden'; // Never show anything outside the container.\n domElementsContainer.style.outline = 'none'; // No selection/focus ring on this container.\n domElementsContainer.style.pointerEvents = 'none'; // Clicks go through the container.\n\n // The container should *never* scroll.\n // Elements are put inside with the same coordinates (with a scaling factor)\n // as on the game canvas.\n domElementsContainer.addEventListener('scroll', (event) => {\n domElementsContainer.scrollLeft = 0;\n domElementsContainer.scrollTop = 0;\n event.preventDefault();\n });\n\n // When clicking outside an input, (or other HTML element),\n // give back focus to the game canvas so that this element is blurred.\n gameCanvas.addEventListener('pointerdown', () => {\n gameCanvas.focus();\n });\n\n // Prevent magnifying glass on iOS with a long press.\n // Note that there are related bugs on iOS 15 (see https://bugs.webkit.org/show_bug.cgi?id=231161)\n // but it seems not to affect us as the `domElementsContainer` has `pointerEvents` set to `none`.\n domElementsContainer.style['-webkit-user-select'] = 'none';\n\n parentElement.appendChild(domElementsContainer);\n this._domElementsContainer = domElementsContainer;\n\n this._resizeCanvas();\n\n // Handle scale mode.\n if (this._game.getScaleMode() === 'nearest') {\n gameCanvas.style['image-rendering'] = '-moz-crisp-edges';\n gameCanvas.style['image-rendering'] = '-webkit-optimize-contrast';\n gameCanvas.style['image-rendering'] = '-webkit-crisp-edges';\n gameCanvas.style['image-rendering'] = 'pixelated';\n }\n\n // Handle pixels rounding.\n if (this._game.getPixelsRounding()) {\n PIXI.settings.ROUND_PIXELS = true;\n }\n\n // Handle resize: immediately adjust the game canvas (and dom element container)\n // and notify the game (that may want to adjust to the new size of the window).\n window.addEventListener('resize', () => {\n this._game.onWindowInnerSizeChanged();\n this._resizeCanvas();\n });\n\n // Focus the canvas when created.\n gameCanvas.focus();\n }\n\n static getWindowInnerWidth() {\n return typeof window !== 'undefined' ? window.innerWidth : 800;\n }\n\n static getWindowInnerHeight() {\n return typeof window !== 'undefined' ? window.innerHeight : 800;\n }\n\n /**\n * Update the game renderer size according to the \"game resolution\".\n * Called when game resolution changes.\n *\n * Note that if the canvas is fullscreen, it won't be resized, but when going back to\n * non fullscreen mode, the requested size will be used.\n */\n updateRendererSize(): void {\n this._resizeCanvas();\n }\n\n /**\n * Set the proper screen orientation from the project properties.\n */\n private _setupOrientation() {\n if (\n typeof window === 'undefined' ||\n !window.screen ||\n !window.screen.orientation\n ) {\n return;\n }\n const gameOrientation = this._game.getGameData().properties.orientation;\n try {\n // We ignore the error as some platforms may not supporting locking (i.e: desktop).\n if (gameOrientation === 'default') {\n const promise = window.screen.orientation.unlock();\n // @ts-ignore\n if (promise) {\n // @ts-ignore\n promise.catch(() => {});\n }\n } else {\n // @ts-ignore\n window.screen.orientation.lock(gameOrientation).catch(() => {});\n }\n } catch (error) {\n logger.error('Unexpected error while setting up orientation: ', error);\n }\n }\n\n /**\n * Resize the renderer (the \"game resolution\") and the canvas (which can be larger\n * or smaller to fill the page, with optional margins).\n *\n */\n private _resizeCanvas() {\n if (!this._pixiRenderer || !this._domElementsContainer) return;\n\n // Set the Pixi (and/or Three) renderer size to the game size.\n // There is no \"smart\" resizing to be done here: the rendering of the game\n // should be done with the size set on the game.\n if (\n this._pixiRenderer.width !== this._game.getGameResolutionWidth() ||\n this._pixiRenderer.height !== this._game.getGameResolutionHeight()\n ) {\n // TODO (3D): It might be useful to resize pixi view in 3D depending on FOV value\n // to enable a mode where pixi always fills the whole screen.\n this._pixiRenderer.resize(\n this._game.getGameResolutionWidth(),\n this._game.getGameResolutionHeight()\n );\n\n if (this._threeRenderer) {\n this._threeRenderer.setSize(\n this._game.getGameResolutionWidth(),\n this._game.getGameResolutionHeight()\n );\n }\n }\n\n // Set the canvas size.\n // Resizing is done according to the settings. This is a \"CSS\" resize\n // only, so won't create visual artifacts during the rendering.\n const isFullPage =\n this._forceFullscreen || this._isFullPage || this._isFullscreen;\n let canvasWidth = this._game.getGameResolutionWidth();\n let canvasHeight = this._game.getGameResolutionHeight();\n let maxWidth = window.innerWidth - this._marginLeft - this._marginRight;\n let maxHeight = window.innerHeight - this._marginTop - this._marginBottom;\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n if (maxHeight < 0) {\n maxHeight = 0;\n }\n if (isFullPage && !this._keepRatio) {\n canvasWidth = maxWidth;\n canvasHeight = maxHeight;\n } else {\n if (\n (isFullPage && this._keepRatio) ||\n canvasWidth > maxWidth ||\n canvasHeight > maxHeight\n ) {\n let factor = maxWidth / canvasWidth;\n if (canvasHeight * factor > maxHeight) {\n factor = maxHeight / canvasHeight;\n }\n canvasWidth *= factor;\n canvasHeight *= factor;\n }\n }\n\n // Apply the calculations to the canvas element...\n if (this._gameCanvas) {\n this._gameCanvas.style.top =\n this._marginTop + (maxHeight - canvasHeight) / 2 + 'px';\n this._gameCanvas.style.left =\n this._marginLeft + (maxWidth - canvasWidth) / 2 + 'px';\n this._gameCanvas.style.width = canvasWidth + 'px';\n this._gameCanvas.style.height = canvasHeight + 'px';\n }\n\n // ...and to the div on top of it showing DOM elements (like inputs).\n this._domElementsContainer.style.top =\n this._marginTop + (maxHeight - canvasHeight) / 2 + 'px';\n this._domElementsContainer.style.left =\n this._marginLeft + (maxWidth - canvasWidth) / 2 + 'px';\n this._domElementsContainer.style.width = canvasWidth + 'px';\n this._domElementsContainer.style.height = canvasHeight + 'px';\n\n // Store the canvas size for fast access to it.\n this._canvasWidth = canvasWidth;\n this._canvasHeight = canvasHeight;\n }\n\n /**\n * Set if the aspect ratio must be kept when the game canvas is resized to fill\n * the page.\n */\n keepAspectRatio(enable) {\n if (this._keepRatio === enable) {\n return;\n }\n this._keepRatio = enable;\n this._resizeCanvas();\n }\n\n /**\n * Change the margin that must be preserved around the game canvas.\n */\n setMargins(top, right, bottom, left): void {\n if (\n this._marginTop === top &&\n this._marginRight === right &&\n this._marginBottom === bottom &&\n this._marginLeft === left\n ) {\n return;\n }\n this._marginTop = top;\n this._marginRight = right;\n this._marginBottom = bottom;\n this._marginLeft = left;\n this._resizeCanvas();\n }\n\n /**\n * Update the window size, if possible.\n * @param width The new width, in pixels.\n * @param height The new height, in pixels.\n */\n setWindowSize(width: float, height: float): void {\n const remote = this.getElectronRemote();\n if (remote) {\n // Use Electron BrowserWindow API\n const browserWindow = remote.getCurrentWindow();\n if (browserWindow) {\n browserWindow.setContentSize(width, height);\n }\n } else {\n logger.warn(\"Window size can't be changed on this platform.\");\n }\n }\n\n /**\n * Center the window on screen.\n */\n centerWindow() {\n const remote = this.getElectronRemote();\n if (remote) {\n // Use Electron BrowserWindow API\n const browserWindow = remote.getCurrentWindow();\n if (browserWindow) {\n browserWindow.center();\n }\n } else {\n }\n }\n\n // Not supported\n /**\n * De/activate fullscreen for the game.\n */\n setFullScreen(enable): void {\n if (this._forceFullscreen) {\n return;\n }\n if (this._isFullscreen !== enable) {\n this._isFullscreen = !!enable;\n const remote = this.getElectronRemote();\n if (remote) {\n // Use Electron BrowserWindow API\n const browserWindow = remote.getCurrentWindow();\n if (browserWindow) {\n browserWindow.setFullScreen(this._isFullscreen);\n }\n } else {\n // Use HTML5 Fullscreen API\n //TODO: Do this on a user gesture, otherwise most browsers won't activate fullscreen\n if (this._isFullscreen) {\n // @ts-ignore\n if (document.documentElement.requestFullscreen) {\n // @ts-ignore\n document.documentElement.requestFullscreen();\n } else {\n // @ts-ignore\n if (document.documentElement.mozRequestFullScreen) {\n // @ts-ignore\n document.documentElement.mozRequestFullScreen();\n } else {\n // @ts-ignore\n if (document.documentElement.webkitRequestFullScreen) {\n // @ts-ignore\n document.documentElement.webkitRequestFullScreen();\n }\n }\n }\n } else {\n // @ts-ignore\n if (document.exitFullscreen) {\n // @ts-ignore\n document.exitFullscreen();\n } else {\n // @ts-ignore\n if (document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n } else {\n // @ts-ignore\n if (document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n }\n }\n }\n }\n }\n this._resizeCanvas();\n }\n }\n\n /**\n * Checks if the game is in full screen.\n */\n isFullScreen(): boolean {\n const remote = this.getElectronRemote();\n if (remote) {\n return remote.getCurrentWindow().isFullScreen();\n }\n\n // Height check is used to detect user triggered full screen (for example F11 shortcut).\n return this._isFullscreen || window.screen.height === window.innerHeight;\n }\n\n /**\n * Convert a point from the canvas coordinates to the dom element container coordinates.\n *\n * @param canvasCoords The point in the canvas coordinates.\n * @param result The point to return.\n * @returns The point in the dom element container coordinates.\n */\n convertCanvasToDomElementContainerCoords(\n canvasCoords: FloatPoint,\n result: FloatPoint\n ): FloatPoint {\n const pageCoords = result || [0, 0];\n\n // Handle the fact that the game is stretched to fill the canvas.\n pageCoords[0] =\n (canvasCoords[0] * this._canvasWidth) /\n this._game.getGameResolutionWidth();\n pageCoords[1] =\n (canvasCoords[1] * this._canvasHeight) /\n this._game.getGameResolutionHeight();\n\n return pageCoords;\n }\n\n /**\n * Return the scale factor between the renderer height and the actual canvas height,\n * which is also the height of the container for DOM elements to be superimposed on top of it.\n *\n * Useful to scale font sizes of DOM elements so that they follow the size of the game.\n */\n getCanvasToDomElementContainerHeightScale(): float {\n return (this._canvasHeight || 1) / this._game.getGameResolutionHeight();\n }\n\n /**\n * Add the standard events handler.\n */\n bindStandardEvents(\n manager: gdjs.InputManager,\n window: Window,\n document: Document\n ) {\n const canvas = this._gameCanvas;\n if (!canvas) return;\n\n //Translate an event (mouse or touch) made on the canvas on the page\n //to game coordinates.\n const getEventPosition = (e: MouseEvent | Touch) => {\n const pos = [e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop];\n\n // Handle the fact that the game is stretched to fill the canvas.\n pos[0] *=\n this._game.getGameResolutionWidth() / (this._canvasWidth || 1);\n pos[1] *=\n this._game.getGameResolutionHeight() / (this._canvasHeight || 1);\n return pos;\n };\n\n const isInsideCanvas = (e: MouseEvent | Touch) => {\n const x = e.pageX - canvas.offsetLeft;\n const y = e.pageY - canvas.offsetTop;\n\n return (\n 0 <= x &&\n x < (this._canvasWidth || 1) &&\n 0 <= y &&\n y < (this._canvasHeight || 1)\n );\n };\n\n //Some browsers lacks definition of some variables used to do calculations\n //in getEventPosition. They are defined to 0 as they are useless.\n\n (function ensureOffsetsExistence() {\n if (isNaN(canvas.offsetLeft)) {\n // @ts-ignore\n canvas.offsetLeft = 0;\n // @ts-ignore\n canvas.offsetTop = 0;\n }\n if (isNaN(document.body.scrollLeft)) {\n document.body.scrollLeft = 0;\n document.body.scrollTop = 0;\n }\n if (\n document.documentElement === undefined ||\n document.documentElement === null\n ) {\n // @ts-ignore\n document.documentElement = {};\n }\n if (isNaN(document.documentElement.scrollLeft)) {\n document.documentElement.scrollLeft = 0;\n document.documentElement.scrollTop = 0;\n }\n if (isNaN(canvas.offsetLeft)) {\n // @ts-ignore\n canvas.offsetLeft = 0;\n // @ts-ignore\n canvas.offsetTop = 0;\n }\n })();\n\n // Keyboard: listen at the document level to capture even when the canvas\n // is not focused.\n\n const isFocusingDomElement = () => {\n // Fast bailout when the game canvas should receive the inputs (i.e: almost always).\n // Also check the document body or null for activeElement, as all of these should go\n // to the game.\n if (\n document.activeElement === canvas ||\n document.activeElement === document.body ||\n document.activeElement === null\n )\n return false;\n\n return true;\n };\n const isTargetDomElement = (event: TouchEvent) => {\n // Fast bailout when the game canvas should receive the inputs (i.e: almost always).\n // Any event with a target that is not the body or the canvas should\n // not go to the game (<input> or <a> elements for instances).\n if (event.target === canvas || event.target === document.body)\n return false;\n return true;\n };\n document.onkeydown = function (e) {\n if (isFocusingDomElement()) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // arrow keys events.\n return;\n }\n\n if (defaultPreventedKeyCodes.includes(e.keyCode)) {\n // Some keys are \"default prevented\" to avoid scrolling when the game\n // is integrated in a page as an iframe.\n e.preventDefault();\n }\n\n manager.onKeyPressed(e.keyCode, e.location);\n };\n document.onkeyup = function (e) {\n if (isFocusingDomElement()) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // arrow keys events.\n return;\n }\n\n if (defaultPreventedKeyCodes.includes(e.keyCode)) {\n // Some keys are \"default prevented\" to avoid scrolling when the game\n // is integrated in a page as an iframe.\n e.preventDefault();\n }\n\n manager.onKeyReleased(e.keyCode, e.location);\n };\n\n // Mouse:\n\n // Converts HTML mouse button to InputManager mouse button.\n // This function is used to align HTML button values with GDevelop 3 C++ SFML Mouse button enum values,\n // notably the middle and right buttons.\n function convertHtmlMouseButtonToInputManagerMouseButton(button: number) {\n switch (button) {\n case 1: // Middle button\n return gdjs.InputManager.MOUSE_MIDDLE_BUTTON;\n case 2: // Right button\n return gdjs.InputManager.MOUSE_RIGHT_BUTTON;\n }\n return button;\n }\n canvas.onmousemove = function (e) {\n const pos = getEventPosition(e);\n manager.onMouseMove(pos[0], pos[1]);\n };\n canvas.onmousedown = function (e) {\n manager.onMouseButtonPressed(\n convertHtmlMouseButtonToInputManagerMouseButton(e.button)\n );\n if (window.focus !== undefined) {\n window.focus();\n }\n return false;\n };\n canvas.onmouseup = function (e) {\n manager.onMouseButtonReleased(\n convertHtmlMouseButtonToInputManagerMouseButton(e.button)\n );\n return false;\n };\n canvas.onmouseleave = function (e) {\n manager.onMouseLeave();\n };\n canvas.onmouseenter = function (e) {\n manager.onMouseEnter();\n // There is no mouse event when the cursor is outside of the canvas.\n // We catchup what happened.\n const buttons = [\n gdjs.InputManager.MOUSE_LEFT_BUTTON,\n gdjs.InputManager.MOUSE_RIGHT_BUTTON,\n gdjs.InputManager.MOUSE_MIDDLE_BUTTON,\n gdjs.InputManager.MOUSE_BACK_BUTTON,\n gdjs.InputManager.MOUSE_FORWARD_BUTTON,\n ];\n for (let i = 0, len = buttons.length; i < len; ++i) {\n const button = buttons[i];\n const buttonIsPressed = (e.buttons & (1 << i)) !== 0;\n const buttonWasPressed = manager.isMouseButtonPressed(button);\n if (buttonIsPressed && !buttonWasPressed) {\n manager.onMouseButtonPressed(button);\n } else if (!buttonIsPressed && buttonWasPressed) {\n manager.onMouseButtonReleased(button);\n }\n }\n };\n window.addEventListener(\n 'click',\n function (e) {\n if (window.focus !== undefined) {\n window.focus();\n }\n return false;\n },\n false\n );\n canvas.oncontextmenu = function (event) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n };\n // @ts-ignore\n canvas.onwheel = function (event) {\n manager.onMouseWheel(-event.deltaY);\n };\n\n // Touches:\n window.addEventListener(\n 'touchmove',\n function (e) {\n if (isTargetDomElement(e)) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // touch events to move the selection (and do other native gestures).\n return;\n }\n\n e.preventDefault();\n if (e.changedTouches) {\n for (let i = 0; i < e.changedTouches.length; ++i) {\n const pos = getEventPosition(e.changedTouches[i]);\n manager.onTouchMove(\n e.changedTouches[i].identifier,\n pos[0],\n pos[1]\n );\n // This works because touch events are sent\n // when they continue outside of the canvas.\n if (manager.isSimulatingMouseWithTouch()) {\n if (isInsideCanvas(e.changedTouches[i])) {\n manager.onMouseEnter();\n } else {\n manager.onMouseLeave();\n }\n }\n }\n }\n },\n // This is important so that we can use e.preventDefault() and block possible following mouse events.\n { passive: false }\n );\n window.addEventListener(\n 'touchstart',\n function (e) {\n if (isTargetDomElement(e)) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // touch events to move the selection (and do other native gestures).\n return;\n }\n\n e.preventDefault();\n if (e.changedTouches) {\n for (let i = 0; i < e.changedTouches.length; ++i) {\n const pos = getEventPosition(e.changedTouches[i]);\n manager.onTouchStart(\n e.changedTouches[i].identifier,\n pos[0],\n pos[1]\n );\n }\n }\n return false;\n },\n // This is important so that we can use e.preventDefault() and block possible following mouse events.\n { passive: false }\n );\n window.addEventListener(\n 'touchend',\n function (e) {\n if (isTargetDomElement(e)) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // touch events to move the selection (and do other native gestures).\n return;\n }\n\n e.preventDefault();\n if (e.changedTouches) {\n for (let i = 0; i < e.changedTouches.length; ++i) {\n manager.onTouchEnd(e.changedTouches[i].identifier);\n }\n }\n return false;\n },\n // This is important so that we can use e.preventDefault() and block possible following mouse events.\n { passive: false }\n );\n window.addEventListener(\n 'touchcancel',\n function (e) {\n if (isTargetDomElement(e)) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // touch events to move the selection (and do other native gestures).\n return;\n }\n\n e.preventDefault();\n if (e.changedTouches) {\n for (let i = 0; i < e.changedTouches.length; ++i) {\n manager.onTouchCancel(e.changedTouches[i].identifier);\n }\n }\n return false;\n },\n // This is important so that we can use e.preventDefault() and block possible following mouse events.\n { passive: false }\n );\n }\n\n setWindowTitle(title): void {\n if (typeof document !== 'undefined') {\n document.title = title;\n }\n }\n\n getWindowTitle() {\n return typeof document !== 'undefined' ? document.title : '';\n }\n\n startGameLoop(fn) {\n let oldTime = 0;\n const gameLoop = (time: float) => {\n // Schedule the next frame now to be sure it's called as soon\n // as possible after this one is finished.\n this._nextFrameId = requestAnimationFrame(gameLoop);\n\n const dt = oldTime ? time - oldTime : 0;\n oldTime = time;\n if (!fn(dt)) {\n // Stop the game loop if requested.\n cancelAnimationFrame(this._nextFrameId);\n }\n };\n\n requestAnimationFrame(gameLoop);\n }\n\n getPIXIRenderer() {\n return this._pixiRenderer;\n }\n\n /**\n * Get the Three.js renderer for the game - if any.\n */\n getThreeRenderer(): THREE.WebGLRenderer | null {\n return this._threeRenderer;\n }\n\n /**\n * Get the DOM element used as a container for HTML elements to display\n * on top of the game.\n */\n getDomElementContainer() {\n return this._domElementsContainer;\n }\n\n /**\n * Open the given URL in the system browser (or a new tab)\n */\n openURL(url: string) {\n // Try to detect the environment to use the most adapted\n // way of opening an URL.\n\n if (typeof window !== 'undefined') {\n const electron = this.getElectron();\n if (electron) {\n electron.shell.openExternal(url);\n } else if (\n // @ts-ignore\n typeof window.cordova !== 'undefined' &&\n // @ts-ignore\n typeof window.cordova.InAppBrowser !== 'undefined'\n ) {\n // @ts-ignore\n window.cordova.InAppBrowser.open(url, '_system', 'location=yes');\n } else {\n window.open(url, '_blank');\n }\n }\n }\n\n /**\n * Close the game, if applicable\n */\n stopGame() {\n // Try to detect the environment to use the most adapted\n // way of closing the app\n const remote = this.getElectronRemote();\n if (remote) {\n const browserWindow = remote.getCurrentWindow();\n if (browserWindow) {\n browserWindow.close();\n }\n } else {\n if (\n typeof navigator !== 'undefined' &&\n // @ts-ignore\n navigator.app &&\n // @ts-ignore\n navigator.app.exitApp\n ) {\n // @ts-ignore\n navigator.app.exitApp();\n }\n }\n // HTML5 games on mobile/browsers don't have a way to close their window/page.\n }\n\n /**\n * Get the canvas DOM element.\n */\n getCanvas(): HTMLCanvasElement | null {\n return this._gameCanvas;\n }\n\n /**\n * Check if the device supports WebGL.\n * @returns true if WebGL is supported\n */\n isWebGLSupported(): boolean {\n return (\n !!this._pixiRenderer &&\n this._pixiRenderer.type === PIXI.RENDERER_TYPE.WEBGL\n );\n }\n\n /**\n * Get the electron module, if running as a electron renderer process.\n */\n getElectron() {\n if (typeof require === 'function') {\n return require('electron');\n }\n return null;\n }\n\n /**\n * Helper to get the electron remote module, if running on Electron.\n * Note that is not guaranteed to be supported in the future - avoid if possible.\n */\n getElectronRemote = () => {\n if (typeof require === 'function') {\n const runtimeGameOptions = this._game.getAdditionalOptions();\n const moduleId =\n runtimeGameOptions && runtimeGameOptions.electronRemoteRequirePath\n ? runtimeGameOptions.electronRemoteRequirePath\n : '@electron/remote';\n\n try {\n return require(moduleId);\n } catch (requireError) {\n console.error(\n `Could not load @electron/remote from \"${moduleId}\". Error is:`,\n requireError\n );\n }\n }\n\n return null;\n };\n\n getGame() {\n return this._game;\n }\n }\n\n //Register the class to let the engine use it.\n export type RuntimeGameRenderer = RuntimeGamePixiRenderer;\n export const RuntimeGameRenderer = RuntimeGamePixiRenderer;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["namespace gdjs {\n const logger = new gdjs.Logger('PIXI game renderer');\n\n /**\n * Codes (as in `event.code`) of keys that should have their event `preventDefault`\n * called. This is used to avoid scrolling in a webpage when these keys are pressed\n * in the game.\n */\n const defaultPreventedKeyCodes = [\n 37, // ArrowLeft\n 38, // ArrowUp\n 39, // ArrowRight\n 40, // ArrowDown\n ];\n\n /**\n * The renderer for a gdjs.RuntimeGame using Pixi.js.\n */\n export class RuntimeGamePixiRenderer {\n _game: gdjs.RuntimeGame;\n _isFullPage: boolean = true;\n\n //Used to track if the canvas is displayed on the full page.\n _isFullscreen: boolean = false;\n\n //Used to track if the window is displayed as fullscreen (see setFullscreen method).\n _forceFullscreen: any;\n\n _pixiRenderer: PIXI.Renderer | null = null;\n private _threeRenderer: THREE.WebGLRenderer | null = null;\n private _gameCanvas: HTMLCanvasElement | null = null;\n private _domElementsContainer: HTMLDivElement | null = null;\n\n // Current width of the canvas (might be scaled down/up compared to renderer)\n _canvasWidth: float = 0;\n // Current height of the canvas (might be scaled down/up compared to renderer)\n _canvasHeight: float = 0;\n\n _keepRatio: boolean = true;\n _marginLeft: any;\n _marginTop: any;\n _marginRight: any;\n _marginBottom: any;\n\n _nextFrameId: integer = 0;\n\n /**\n * @param game The game that is being rendered\n * @param forceFullscreen If fullscreen should be always activated\n */\n constructor(game: gdjs.RuntimeGame, forceFullscreen: boolean) {\n this._game = game;\n this._forceFullscreen = forceFullscreen;\n\n //If set to true, the canvas will always be displayed as fullscreen, even if _isFullscreen == false.\n this._marginLeft = this._marginTop = this._marginRight = this._marginBottom = 0;\n this._setupOrientation();\n }\n\n /**\n * Create a standard canvas inside canvasArea.\n *\n */\n createStandardCanvas(parentElement: HTMLElement) {\n let gameCanvas: HTMLCanvasElement;\n if (typeof THREE !== 'undefined') {\n gameCanvas = document.createElement('canvas');\n this._threeRenderer = new THREE.WebGLRenderer({\n canvas: gameCanvas,\n antialias:\n this._game.getAntialiasingMode() !== 'none' &&\n (this._game.isAntialisingEnabledOnMobile() ||\n !gdjs.evtTools.common.isMobile()),\n });\n this._threeRenderer.useLegacyLights = true;\n this._threeRenderer.autoClear = false;\n this._threeRenderer.setSize(\n this._game.getGameResolutionWidth(),\n this._game.getGameResolutionHeight()\n );\n\n // Create a PixiJS renderer that use the same GL context as Three.js\n // so that both can render to the canvas and even have PixiJS rendering\n // reused in Three.js (by using a RenderTexture and the same internal WebGL texture).\n this._pixiRenderer = new PIXI.Renderer({\n width: this._game.getGameResolutionWidth(),\n height: this._game.getGameResolutionHeight(),\n view: gameCanvas,\n // @ts-ignore - reuse the context from Three.js.\n context: this._threeRenderer.getContext(),\n clearBeforeRender: false,\n preserveDrawingBuffer: true,\n antialias: false,\n backgroundAlpha: 0,\n // TODO (3D): add a setting for pixel ratio (`resolution: window.devicePixelRatio`)\n });\n\n gameCanvas = this._threeRenderer.domElement;\n } else {\n // Create the renderer and setup the rendering area.\n // \"preserveDrawingBuffer: true\" is needed to avoid flickering\n // and background issues on some mobile phones (see #585 #572 #566 #463).\n this._pixiRenderer = PIXI.autoDetectRenderer({\n width: this._game.getGameResolutionWidth(),\n height: this._game.getGameResolutionHeight(),\n preserveDrawingBuffer: true,\n antialias: false,\n }) as PIXI.Renderer;\n\n gameCanvas = this._pixiRenderer.view as HTMLCanvasElement;\n }\n\n // Deactivating accessibility support in PixiJS renderer, as we want to be in control of this.\n // See https://github.com/pixijs/pixijs/issues/5111#issuecomment-420047824\n this._pixiRenderer.plugins.accessibility.destroy();\n delete this._pixiRenderer.plugins.accessibility;\n\n // Add the renderer view element to the DOM\n parentElement.appendChild(gameCanvas);\n this._gameCanvas = gameCanvas;\n\n gameCanvas.style.position = 'absolute';\n\n // Ensure that the canvas has the focus.\n gameCanvas.tabIndex = 1;\n\n // Ensure long press can't create a selection\n gameCanvas.style.userSelect = 'none';\n gameCanvas.style.outline = 'none'; // No selection/focus ring on the canvas.\n\n // Set up the container for HTML elements on top of the game canvas.\n const domElementsContainer = document.createElement('div');\n domElementsContainer.style.position = 'absolute';\n domElementsContainer.style.overflow = 'hidden'; // Never show anything outside the container.\n domElementsContainer.style.outline = 'none'; // No selection/focus ring on this container.\n domElementsContainer.style.pointerEvents = 'none'; // Clicks go through the container.\n\n // The container should *never* scroll.\n // Elements are put inside with the same coordinates (with a scaling factor)\n // as on the game canvas.\n domElementsContainer.addEventListener('scroll', (event) => {\n domElementsContainer.scrollLeft = 0;\n domElementsContainer.scrollTop = 0;\n event.preventDefault();\n });\n\n // When clicking outside an input, (or other HTML element),\n // give back focus to the game canvas so that this element is blurred.\n gameCanvas.addEventListener('pointerdown', () => {\n gameCanvas.focus();\n });\n\n // Prevent magnifying glass on iOS with a long press.\n // Note that there are related bugs on iOS 15 (see https://bugs.webkit.org/show_bug.cgi?id=231161)\n // but it seems not to affect us as the `domElementsContainer` has `pointerEvents` set to `none`.\n domElementsContainer.style['-webkit-user-select'] = 'none';\n\n parentElement.appendChild(domElementsContainer);\n this._domElementsContainer = domElementsContainer;\n\n this._resizeCanvas();\n\n // Handle scale mode.\n if (this._game.getScaleMode() === 'nearest') {\n gameCanvas.style['image-rendering'] = '-moz-crisp-edges';\n gameCanvas.style['image-rendering'] = '-webkit-optimize-contrast';\n gameCanvas.style['image-rendering'] = '-webkit-crisp-edges';\n gameCanvas.style['image-rendering'] = 'pixelated';\n }\n\n // Handle pixels rounding.\n if (this._game.getPixelsRounding()) {\n PIXI.settings.ROUND_PIXELS = true;\n }\n\n // Handle resize: immediately adjust the game canvas (and dom element container)\n // and notify the game (that may want to adjust to the new size of the window).\n window.addEventListener('resize', () => {\n this._game.onWindowInnerSizeChanged();\n this._resizeCanvas();\n });\n\n // Focus the canvas when created.\n gameCanvas.focus();\n }\n\n static getWindowInnerWidth() {\n return typeof window !== 'undefined' ? window.innerWidth : 800;\n }\n\n static getWindowInnerHeight() {\n return typeof window !== 'undefined' ? window.innerHeight : 800;\n }\n\n /**\n * Update the game renderer size according to the \"game resolution\".\n * Called when game resolution changes.\n *\n * Note that if the canvas is fullscreen, it won't be resized, but when going back to\n * non fullscreen mode, the requested size will be used.\n */\n updateRendererSize(): void {\n this._resizeCanvas();\n }\n\n /**\n * Set the proper screen orientation from the project properties.\n */\n private _setupOrientation() {\n if (\n typeof window === 'undefined' ||\n !window.screen ||\n !window.screen.orientation\n ) {\n return;\n }\n const gameOrientation = this._game.getGameData().properties.orientation;\n try {\n // We ignore the error as some platforms may not supporting locking (i.e: desktop).\n if (gameOrientation === 'default') {\n const promise = window.screen.orientation.unlock();\n // @ts-ignore\n if (promise) {\n // @ts-ignore\n promise.catch(() => {});\n }\n } else {\n // @ts-ignore\n window.screen.orientation.lock(gameOrientation).catch(() => {});\n }\n } catch (error) {\n logger.error('Unexpected error while setting up orientation: ', error);\n }\n }\n\n /**\n * Resize the renderer (the \"game resolution\") and the canvas (which can be larger\n * or smaller to fill the page, with optional margins).\n *\n */\n private _resizeCanvas() {\n if (!this._pixiRenderer || !this._domElementsContainer) return;\n\n // Set the Pixi (and/or Three) renderer size to the game size.\n // There is no \"smart\" resizing to be done here: the rendering of the game\n // should be done with the size set on the game.\n if (\n this._pixiRenderer.width !== this._game.getGameResolutionWidth() ||\n this._pixiRenderer.height !== this._game.getGameResolutionHeight()\n ) {\n // TODO (3D): It might be useful to resize pixi view in 3D depending on FOV value\n // to enable a mode where pixi always fills the whole screen.\n this._pixiRenderer.resize(\n this._game.getGameResolutionWidth(),\n this._game.getGameResolutionHeight()\n );\n\n if (this._threeRenderer) {\n this._threeRenderer.setSize(\n this._game.getGameResolutionWidth(),\n this._game.getGameResolutionHeight()\n );\n }\n }\n\n // Set the canvas size.\n // Resizing is done according to the settings. This is a \"CSS\" resize\n // only, so won't create visual artifacts during the rendering.\n const isFullPage =\n this._forceFullscreen || this._isFullPage || this._isFullscreen;\n let canvasWidth = this._game.getGameResolutionWidth();\n let canvasHeight = this._game.getGameResolutionHeight();\n let maxWidth = window.innerWidth - this._marginLeft - this._marginRight;\n let maxHeight = window.innerHeight - this._marginTop - this._marginBottom;\n if (maxWidth < 0) {\n maxWidth = 0;\n }\n if (maxHeight < 0) {\n maxHeight = 0;\n }\n if (isFullPage && !this._keepRatio) {\n canvasWidth = maxWidth;\n canvasHeight = maxHeight;\n } else {\n if (\n (isFullPage && this._keepRatio) ||\n canvasWidth > maxWidth ||\n canvasHeight > maxHeight\n ) {\n let factor = maxWidth / canvasWidth;\n if (canvasHeight * factor > maxHeight) {\n factor = maxHeight / canvasHeight;\n }\n canvasWidth *= factor;\n canvasHeight *= factor;\n }\n }\n\n // Apply the calculations to the canvas element...\n if (this._gameCanvas) {\n this._gameCanvas.style.top =\n this._marginTop + (maxHeight - canvasHeight) / 2 + 'px';\n this._gameCanvas.style.left =\n this._marginLeft + (maxWidth - canvasWidth) / 2 + 'px';\n this._gameCanvas.style.width = canvasWidth + 'px';\n this._gameCanvas.style.height = canvasHeight + 'px';\n }\n\n // ...and to the div on top of it showing DOM elements (like inputs).\n this._domElementsContainer.style.top =\n this._marginTop + (maxHeight - canvasHeight) / 2 + 'px';\n this._domElementsContainer.style.left =\n this._marginLeft + (maxWidth - canvasWidth) / 2 + 'px';\n this._domElementsContainer.style.width = canvasWidth + 'px';\n this._domElementsContainer.style.height = canvasHeight + 'px';\n\n // Store the canvas size for fast access to it.\n this._canvasWidth = canvasWidth;\n this._canvasHeight = canvasHeight;\n }\n\n /**\n * Set if the aspect ratio must be kept when the game canvas is resized to fill\n * the page.\n */\n keepAspectRatio(enable) {\n if (this._keepRatio === enable) {\n return;\n }\n this._keepRatio = enable;\n this._resizeCanvas();\n }\n\n /**\n * Change the margin that must be preserved around the game canvas.\n */\n setMargins(top, right, bottom, left): void {\n if (\n this._marginTop === top &&\n this._marginRight === right &&\n this._marginBottom === bottom &&\n this._marginLeft === left\n ) {\n return;\n }\n this._marginTop = top;\n this._marginRight = right;\n this._marginBottom = bottom;\n this._marginLeft = left;\n this._resizeCanvas();\n }\n\n /**\n * Update the window size, if possible.\n * @param width The new width, in pixels.\n * @param height The new height, in pixels.\n */\n setWindowSize(width: float, height: float): void {\n const remote = this.getElectronRemote();\n if (remote) {\n const browserWindow = remote.getCurrentWindow();\n try {\n if (browserWindow) {\n browserWindow.setContentSize(width, height);\n }\n } catch (error) {\n logger.error(\n `Window size setting to width ${width} and height ${height} failed. See error:`,\n error\n );\n }\n } else {\n logger.warn(\"Window size can't be changed on this platform.\");\n }\n }\n\n /**\n * Center the window on screen.\n */\n centerWindow() {\n const remote = this.getElectronRemote();\n if (remote) {\n const browserWindow = remote.getCurrentWindow();\n try {\n if (browserWindow) {\n browserWindow.center();\n }\n } catch (error) {\n logger.error('Window centering failed. See error:', error);\n }\n } else {\n logger.warn(\"Window can't be centered on this platform.\");\n }\n }\n\n /**\n * De/activate fullscreen for the game.\n */\n setFullScreen(enable): void {\n if (this._forceFullscreen) {\n return;\n }\n if (this._isFullscreen !== enable) {\n this._isFullscreen = !!enable;\n const remote = this.getElectronRemote();\n if (remote) {\n const browserWindow = remote.getCurrentWindow();\n try {\n if (browserWindow) {\n browserWindow.setFullScreen(this._isFullscreen);\n }\n } catch (error) {\n logger.error(\n `Full screen setting to ${this._isFullscreen} failed. See error:`,\n error\n );\n }\n } else {\n // Use HTML5 Fullscreen API\n //TODO: Do this on a user gesture, otherwise most browsers won't activate fullscreen\n if (this._isFullscreen) {\n // @ts-ignore\n if (document.documentElement.requestFullscreen) {\n // @ts-ignore\n document.documentElement.requestFullscreen();\n } else {\n // @ts-ignore\n if (document.documentElement.mozRequestFullScreen) {\n // @ts-ignore\n document.documentElement.mozRequestFullScreen();\n } else {\n // @ts-ignore\n if (document.documentElement.webkitRequestFullScreen) {\n // @ts-ignore\n document.documentElement.webkitRequestFullScreen();\n }\n }\n }\n } else {\n // @ts-ignore\n if (document.exitFullscreen) {\n // @ts-ignore\n document.exitFullscreen();\n } else {\n // @ts-ignore\n if (document.mozCancelFullScreen) {\n // @ts-ignore\n document.mozCancelFullScreen();\n } else {\n // @ts-ignore\n if (document.webkitCancelFullScreen) {\n // @ts-ignore\n document.webkitCancelFullScreen();\n }\n }\n }\n }\n }\n this._resizeCanvas();\n }\n }\n\n /**\n * Checks if the game is in full screen.\n */\n isFullScreen(): boolean {\n const remote = this.getElectronRemote();\n if (remote) {\n try {\n return remote.getCurrentWindow().isFullScreen();\n } catch (error) {\n logger.error(`Full screen detection failed. See error:`, error);\n return false;\n }\n }\n\n // Height check is used to detect user triggered full screen (for example F11 shortcut).\n return this._isFullscreen || window.screen.height === window.innerHeight;\n }\n\n /**\n * Convert a point from the canvas coordinates to the dom element container coordinates.\n *\n * @param canvasCoords The point in the canvas coordinates.\n * @param result The point to return.\n * @returns The point in the dom element container coordinates.\n */\n convertCanvasToDomElementContainerCoords(\n canvasCoords: FloatPoint,\n result: FloatPoint\n ): FloatPoint {\n const pageCoords = result || [0, 0];\n\n // Handle the fact that the game is stretched to fill the canvas.\n pageCoords[0] =\n (canvasCoords[0] * this._canvasWidth) /\n this._game.getGameResolutionWidth();\n pageCoords[1] =\n (canvasCoords[1] * this._canvasHeight) /\n this._game.getGameResolutionHeight();\n\n return pageCoords;\n }\n\n /**\n * Return the scale factor between the renderer height and the actual canvas height,\n * which is also the height of the container for DOM elements to be superimposed on top of it.\n *\n * Useful to scale font sizes of DOM elements so that they follow the size of the game.\n */\n getCanvasToDomElementContainerHeightScale(): float {\n return (this._canvasHeight || 1) / this._game.getGameResolutionHeight();\n }\n\n /**\n * Add the standard events handler.\n */\n bindStandardEvents(\n manager: gdjs.InputManager,\n window: Window,\n document: Document\n ) {\n const canvas = this._gameCanvas;\n if (!canvas) return;\n\n //Translate an event (mouse or touch) made on the canvas on the page\n //to game coordinates.\n const getEventPosition = (e: MouseEvent | Touch) => {\n const pos = [e.pageX - canvas.offsetLeft, e.pageY - canvas.offsetTop];\n\n // Handle the fact that the game is stretched to fill the canvas.\n pos[0] *=\n this._game.getGameResolutionWidth() / (this._canvasWidth || 1);\n pos[1] *=\n this._game.getGameResolutionHeight() / (this._canvasHeight || 1);\n return pos;\n };\n\n const isInsideCanvas = (e: MouseEvent | Touch) => {\n const x = e.pageX - canvas.offsetLeft;\n const y = e.pageY - canvas.offsetTop;\n\n return (\n 0 <= x &&\n x < (this._canvasWidth || 1) &&\n 0 <= y &&\n y < (this._canvasHeight || 1)\n );\n };\n\n //Some browsers lacks definition of some variables used to do calculations\n //in getEventPosition. They are defined to 0 as they are useless.\n\n (function ensureOffsetsExistence() {\n if (isNaN(canvas.offsetLeft)) {\n // @ts-ignore\n canvas.offsetLeft = 0;\n // @ts-ignore\n canvas.offsetTop = 0;\n }\n if (isNaN(document.body.scrollLeft)) {\n document.body.scrollLeft = 0;\n document.body.scrollTop = 0;\n }\n if (\n document.documentElement === undefined ||\n document.documentElement === null\n ) {\n // @ts-ignore\n document.documentElement = {};\n }\n if (isNaN(document.documentElement.scrollLeft)) {\n document.documentElement.scrollLeft = 0;\n document.documentElement.scrollTop = 0;\n }\n if (isNaN(canvas.offsetLeft)) {\n // @ts-ignore\n canvas.offsetLeft = 0;\n // @ts-ignore\n canvas.offsetTop = 0;\n }\n })();\n\n // Keyboard: listen at the document level to capture even when the canvas\n // is not focused.\n\n const isFocusingDomElement = () => {\n // Fast bailout when the game canvas should receive the inputs (i.e: almost always).\n // Also check the document body or null for activeElement, as all of these should go\n // to the game.\n if (\n document.activeElement === canvas ||\n document.activeElement === document.body ||\n document.activeElement === null\n )\n return false;\n\n return true;\n };\n const isTargetDomElement = (event: TouchEvent) => {\n // Fast bailout when the game canvas should receive the inputs (i.e: almost always).\n // Any event with a target that is not the body or the canvas should\n // not go to the game (<input> or <a> elements for instances).\n if (event.target === canvas || event.target === document.body)\n return false;\n return true;\n };\n document.onkeydown = function (e) {\n if (isFocusingDomElement()) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // arrow keys events.\n return;\n }\n\n if (defaultPreventedKeyCodes.includes(e.keyCode)) {\n // Some keys are \"default prevented\" to avoid scrolling when the game\n // is integrated in a page as an iframe.\n e.preventDefault();\n }\n\n manager.onKeyPressed(e.keyCode, e.location);\n };\n document.onkeyup = function (e) {\n if (isFocusingDomElement()) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // arrow keys events.\n return;\n }\n\n if (defaultPreventedKeyCodes.includes(e.keyCode)) {\n // Some keys are \"default prevented\" to avoid scrolling when the game\n // is integrated in a page as an iframe.\n e.preventDefault();\n }\n\n manager.onKeyReleased(e.keyCode, e.location);\n };\n\n // Mouse:\n\n // Converts HTML mouse button to InputManager mouse button.\n // This function is used to align HTML button values with GDevelop 3 C++ SFML Mouse button enum values,\n // notably the middle and right buttons.\n function convertHtmlMouseButtonToInputManagerMouseButton(button: number) {\n switch (button) {\n case 1: // Middle button\n return gdjs.InputManager.MOUSE_MIDDLE_BUTTON;\n case 2: // Right button\n return gdjs.InputManager.MOUSE_RIGHT_BUTTON;\n }\n return button;\n }\n canvas.onmousemove = function (e) {\n const pos = getEventPosition(e);\n manager.onMouseMove(pos[0], pos[1]);\n };\n canvas.onmousedown = function (e) {\n manager.onMouseButtonPressed(\n convertHtmlMouseButtonToInputManagerMouseButton(e.button)\n );\n if (window.focus !== undefined) {\n window.focus();\n }\n return false;\n };\n canvas.onmouseup = function (e) {\n manager.onMouseButtonReleased(\n convertHtmlMouseButtonToInputManagerMouseButton(e.button)\n );\n return false;\n };\n canvas.onmouseleave = function (e) {\n manager.onMouseLeave();\n };\n canvas.onmouseenter = function (e) {\n manager.onMouseEnter();\n // There is no mouse event when the cursor is outside of the canvas.\n // We catchup what happened.\n const buttons = [\n gdjs.InputManager.MOUSE_LEFT_BUTTON,\n gdjs.InputManager.MOUSE_RIGHT_BUTTON,\n gdjs.InputManager.MOUSE_MIDDLE_BUTTON,\n gdjs.InputManager.MOUSE_BACK_BUTTON,\n gdjs.InputManager.MOUSE_FORWARD_BUTTON,\n ];\n for (let i = 0, len = buttons.length; i < len; ++i) {\n const button = buttons[i];\n const buttonIsPressed = (e.buttons & (1 << i)) !== 0;\n const buttonWasPressed = manager.isMouseButtonPressed(button);\n if (buttonIsPressed && !buttonWasPressed) {\n manager.onMouseButtonPressed(button);\n } else if (!buttonIsPressed && buttonWasPressed) {\n manager.onMouseButtonReleased(button);\n }\n }\n };\n window.addEventListener(\n 'click',\n function (e) {\n if (window.focus !== undefined) {\n window.focus();\n }\n return false;\n },\n false\n );\n canvas.oncontextmenu = function (event) {\n event.preventDefault();\n event.stopPropagation();\n return false;\n };\n // @ts-ignore\n canvas.onwheel = function (event) {\n manager.onMouseWheel(-event.deltaY);\n };\n\n // Touches:\n window.addEventListener(\n 'touchmove',\n function (e) {\n if (isTargetDomElement(e)) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // touch events to move the selection (and do other native gestures).\n return;\n }\n\n e.preventDefault();\n if (e.changedTouches) {\n for (let i = 0; i < e.changedTouches.length; ++i) {\n const pos = getEventPosition(e.changedTouches[i]);\n manager.onTouchMove(\n e.changedTouches[i].identifier,\n pos[0],\n pos[1]\n );\n // This works because touch events are sent\n // when they continue outside of the canvas.\n if (manager.isSimulatingMouseWithTouch()) {\n if (isInsideCanvas(e.changedTouches[i])) {\n manager.onMouseEnter();\n } else {\n manager.onMouseLeave();\n }\n }\n }\n }\n },\n // This is important so that we can use e.preventDefault() and block possible following mouse events.\n { passive: false }\n );\n window.addEventListener(\n 'touchstart',\n function (e) {\n if (isTargetDomElement(e)) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // touch events to move the selection (and do other native gestures).\n return;\n }\n\n e.preventDefault();\n if (e.changedTouches) {\n for (let i = 0; i < e.changedTouches.length; ++i) {\n const pos = getEventPosition(e.changedTouches[i]);\n manager.onTouchStart(\n e.changedTouches[i].identifier,\n pos[0],\n pos[1]\n );\n }\n }\n return false;\n },\n // This is important so that we can use e.preventDefault() and block possible following mouse events.\n { passive: false }\n );\n window.addEventListener(\n 'touchend',\n function (e) {\n if (isTargetDomElement(e)) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // touch events to move the selection (and do other native gestures).\n return;\n }\n\n e.preventDefault();\n if (e.changedTouches) {\n for (let i = 0; i < e.changedTouches.length; ++i) {\n manager.onTouchEnd(e.changedTouches[i].identifier);\n }\n }\n return false;\n },\n // This is important so that we can use e.preventDefault() and block possible following mouse events.\n { passive: false }\n );\n window.addEventListener(\n 'touchcancel',\n function (e) {\n if (isTargetDomElement(e)) {\n // Bail out if the game canvas is not focused. For example,\n // an `<input>` element can be focused, and needs to receive\n // touch events to move the selection (and do other native gestures).\n return;\n }\n\n e.preventDefault();\n if (e.changedTouches) {\n for (let i = 0; i < e.changedTouches.length; ++i) {\n manager.onTouchCancel(e.changedTouches[i].identifier);\n }\n }\n return false;\n },\n // This is important so that we can use e.preventDefault() and block possible following mouse events.\n { passive: false }\n );\n }\n\n setWindowTitle(title): void {\n if (typeof document !== 'undefined') {\n document.title = title;\n }\n }\n\n getWindowTitle() {\n return typeof document !== 'undefined' ? document.title : '';\n }\n\n startGameLoop(fn) {\n let oldTime = 0;\n const gameLoop = (time: float) => {\n // Schedule the next frame now to be sure it's called as soon\n // as possible after this one is finished.\n this._nextFrameId = requestAnimationFrame(gameLoop);\n\n const dt = oldTime ? time - oldTime : 0;\n oldTime = time;\n if (!fn(dt)) {\n // Stop the game loop if requested.\n cancelAnimationFrame(this._nextFrameId);\n }\n };\n\n requestAnimationFrame(gameLoop);\n }\n\n getPIXIRenderer() {\n return this._pixiRenderer;\n }\n\n /**\n * Get the Three.js renderer for the game - if any.\n */\n getThreeRenderer(): THREE.WebGLRenderer | null {\n return this._threeRenderer;\n }\n\n /**\n * Get the DOM element used as a container for HTML elements to display\n * on top of the game.\n */\n getDomElementContainer() {\n return this._domElementsContainer;\n }\n\n /**\n * Open the given URL in the system browser (or a new tab)\n */\n openURL(url: string) {\n // Try to detect the environment to use the most adapted\n // way of opening an URL.\n\n if (typeof window !== 'undefined') {\n const electron = this.getElectron();\n if (electron) {\n electron.shell.openExternal(url);\n } else if (\n // @ts-ignore\n typeof window.cordova !== 'undefined' &&\n // @ts-ignore\n typeof window.cordova.InAppBrowser !== 'undefined'\n ) {\n // @ts-ignore\n window.cordova.InAppBrowser.open(url, '_system', 'location=yes');\n } else {\n window.open(url, '_blank');\n }\n }\n }\n\n /**\n * Close the game, if applicable.\n */\n stopGame() {\n // Try to detect the environment to use the most adapted\n // way of closing the app\n const remote = this.getElectronRemote();\n if (remote) {\n const browserWindow = remote.getCurrentWindow();\n if (browserWindow) {\n try {\n browserWindow.close();\n } catch (error) {\n logger.error('Window closing failed. See error:', error);\n }\n }\n } else {\n if (\n typeof navigator !== 'undefined' &&\n // @ts-ignore\n navigator.app &&\n // @ts-ignore\n navigator.app.exitApp\n ) {\n // @ts-ignore\n navigator.app.exitApp();\n }\n }\n // HTML5 games on mobile/browsers don't have a way to close their window/page.\n }\n\n /**\n * Get the canvas DOM element.\n */\n getCanvas(): HTMLCanvasElement | null {\n return this._gameCanvas;\n }\n\n /**\n * Check if the device supports WebGL.\n * @returns true if WebGL is supported\n */\n isWebGLSupported(): boolean {\n return (\n !!this._pixiRenderer &&\n this._pixiRenderer.type === PIXI.RENDERER_TYPE.WEBGL\n );\n }\n\n /**\n * Get the electron module, if running as a electron renderer process.\n */\n getElectron() {\n if (typeof require === 'function') {\n return require('electron');\n }\n return null;\n }\n\n /**\n * Helper to get the electron remote module, if running on Electron.\n * Note that is not guaranteed to be supported in the future - avoid if possible.\n */\n getElectronRemote = () => {\n if (typeof require === 'function') {\n const runtimeGameOptions = this._game.getAdditionalOptions();\n const moduleId =\n runtimeGameOptions && runtimeGameOptions.electronRemoteRequirePath\n ? runtimeGameOptions.electronRemoteRequirePath\n : '@electron/remote';\n\n try {\n return require(moduleId);\n } catch (requireError) {\n console.error(\n `Could not load @electron/remote from \"${moduleId}\". Error is:`,\n requireError\n );\n }\n }\n\n return null;\n };\n\n getGame() {\n return this._game;\n }\n }\n\n //Register the class to let the engine use it.\n export type RuntimeGameRenderer = RuntimeGamePixiRenderer;\n export const RuntimeGameRenderer = RuntimeGamePixiRenderer;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var gdjs;(function(r){class s{constructor(t,e){this._spriteDirty=!0;this._textureDirty=!0;this._cachedWidth=0;this._cachedHeight=0;this._object=t;const i=e.getGame().getImageManager();this._sprite=new PIXI.Sprite(i.getInvalidPIXITexture());const a=e.getLayer("");a&&a.getRenderer().addRendererObject(this._sprite,t.getZOrder())}reinitialize(t,e){this._object=t,this._spriteDirty=!0,this._textureDirty=!0,this._sprite.tint=16777215;const i=e.getLayer("");i&&i.getRenderer().addRendererObject(this._sprite,t.getZOrder())}getRendererObject(){return this._sprite}_updatePIXISprite(){const t=this._object._animator.getCurrentFrame();if(t!==null){const e=this._object._scaleX*this._object._preScale,i=this._object._scaleY*this._object._preScale;this._sprite.anchor.x=t.center.x/this._sprite.texture.frame.width,this._sprite.anchor.y=t.center.y/this._sprite.texture.frame.height,this._sprite.position.x=this._object.x+(t.center.x-t.origin.x)*Math.abs(e),this._sprite.position.y=this._object.y+(t.center.y-t.origin.y)*Math.abs(i),this._sprite.rotation=r.toRad(this._object.angle),this._sprite.visible=!this._object.hidden,this._sprite.blendMode=this._object._blendMode,this._sprite.alpha=this._object.opacity/255,this._sprite.scale.x=e,this._sprite.scale.y=i,this._cachedWidth=Math.abs(this._sprite.width),this._cachedHeight=Math.abs(this._sprite.height)}else this._sprite.visible=!1,this._sprite.alpha=0,this._cachedWidth=0,this._cachedHeight=0;this._spriteDirty=!1}ensureUpToDate(){this._spriteDirty&&this._updatePIXISprite()}updateFrame(t){this._spriteDirty=!0,this._sprite.texture=t.texture}update(){this._spriteDirty=!0}updateX(){const t=this._object._animator.getCurrentFrame();this._sprite.position.x=this._object.x+(t.center.x-t.origin.x)*Math.abs(this._object._scaleX*this._object._preScale)}updateY(){const t=this._object._animator.getCurrentFrame();this._sprite.position.y=this._object.y+(t.center.y-t.origin.y)*Math.abs(this._object._scaleY*this._object._preScale)}updateAngle(){this._sprite.rotation=r.toRad(this._object.angle)}updateOpacity(){this._sprite.alpha=this._object.opacity/255}updateVisibility(){this._sprite.visible=!this._object.hidden}setColor(t){const e=t.split(";");e.length<3||(this._sprite.tint=r.rgbToHexNumber(parseInt(e[0],10),parseInt(e[1],10),parseInt(e[2],10)))}getColor(){const t=new PIXI.Color(this._sprite.tint).toRgbArray();return Math.floor(t[0]*255)+";"+Math.floor(t[1]*255)+";"+Math.floor(t[2]*255)}getWidth(){return this._spriteDirty&&this._updatePIXISprite(),this._cachedWidth}getHeight(){return this._spriteDirty&&this._updatePIXISprite(),this._cachedHeight}getUnscaledWidth(){return this._sprite.texture.frame.width}getUnscaledHeight(){return this._sprite.texture.frame.height}static getAnimationFrameTextureManager(t){return t._pixiAnimationFrameTextureManager||(t._pixiAnimationFrameTextureManager=new n(t)),t._pixiAnimationFrameTextureManager}}r.SpriteRuntimeObjectPixiRenderer=s;class n{constructor(t){this._imageManager=t}getAnimationFrameTexture(t){return this._imageManager.getPIXITexture(t)}getAnimationFrameWidth(t){return t.width}getAnimationFrameHeight(t){return t.height}}r.SpriteRuntimeObjectRenderer=s})(gdjs||(gdjs={}));
1
+ var gdjs;(function(r){class s{constructor(t,e){this._spriteDirty=!0;this._textureDirty=!0;this._cachedWidth=0;this._cachedHeight=0;this._object=t;const i=e.getGame().getImageManager();this._sprite=new PIXI.Sprite(i.getInvalidPIXITexture());const a=e.getLayer("");a&&a.getRenderer().addRendererObject(this._sprite,t.getZOrder())}reinitialize(t,e){this._object=t,this._spriteDirty=!0,this._textureDirty=!0,this._sprite.tint=16777215;const i=e.getLayer("");i&&i.getRenderer().addRendererObject(this._sprite,t.getZOrder())}getRendererObject(){return this._sprite}_updatePIXISprite(){const t=this._object._animator.getCurrentFrame();if(t!==null){const e=this._object._scaleX*this._object._preScale,i=this._object._scaleY*this._object._preScale;this._sprite.anchor.x=t.center.x/this._sprite.texture.frame.width,this._sprite.anchor.y=t.center.y/this._sprite.texture.frame.height,this._sprite.position.x=this._object.x+(t.center.x-t.origin.x)*Math.abs(e),this._sprite.position.y=this._object.y+(t.center.y-t.origin.y)*Math.abs(i),this._sprite.rotation=r.toRad(this._object.angle),this._sprite.visible=!this._object.hidden,this._sprite.blendMode=this._object._blendMode,this._sprite.alpha=this._object.opacity/255,this._sprite.scale.x=e,this._sprite.scale.y=i,this._cachedWidth=Math.abs(this._sprite.width),this._cachedHeight=Math.abs(this._sprite.height)}else this._sprite.visible=!1,this._sprite.alpha=0,this._cachedWidth=0,this._cachedHeight=0;this._spriteDirty=!1}ensureUpToDate(){this._spriteDirty&&this._updatePIXISprite()}updateFrame(t){this._spriteDirty=!0,this._sprite.texture=t.texture}update(){this._spriteDirty=!0}updateX(){const t=this._object._animator.getCurrentFrame();this._sprite.position.x=this._object.x+(t.center.x-t.origin.x)*Math.abs(this._object._scaleX*this._object._preScale)}updateY(){const t=this._object._animator.getCurrentFrame();this._sprite.position.y=this._object.y+(t.center.y-t.origin.y)*Math.abs(this._object._scaleY*this._object._preScale)}updateAngle(){this._sprite.rotation=r.toRad(this._object.angle)}updateOpacity(){this._sprite.alpha=this._object.opacity/255}updateVisibility(){this._sprite.visible=!this._object.hidden}setColor(t){this._sprite.tint=r.rgbOrHexStringToNumber(t)}getColor(){const t=new PIXI.Color(this._sprite.tint).toRgbArray();return Math.floor(t[0]*255)+";"+Math.floor(t[1]*255)+";"+Math.floor(t[2]*255)}getWidth(){return this._spriteDirty&&this._updatePIXISprite(),this._cachedWidth}getHeight(){return this._spriteDirty&&this._updatePIXISprite(),this._cachedHeight}getUnscaledWidth(){return this._sprite.texture.frame.width}getUnscaledHeight(){return this._sprite.texture.frame.height}static getAnimationFrameTextureManager(t){return t._pixiAnimationFrameTextureManager||(t._pixiAnimationFrameTextureManager=new n(t)),t._pixiAnimationFrameTextureManager}}r.SpriteRuntimeObjectPixiRenderer=s;class n{constructor(t){this._imageManager=t}getAnimationFrameTexture(t){return this._imageManager.getPIXITexture(t)}getAnimationFrameWidth(t){return t.width}getAnimationFrameHeight(t){return t.height}}r.SpriteRuntimeObjectRenderer=s})(gdjs||(gdjs={}));
2
2
  //# sourceMappingURL=spriteruntimeobject-pixi-renderer.js.map