gdcore-tools 2.0.0-beta3 → 2.0.0-beta4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Runtime/AsyncTasksManager.js +2 -2
- package/dist/Runtime/AsyncTasksManager.js.map +2 -2
- package/dist/Runtime/Cordova/config.xml +23 -1
- package/dist/Runtime/Cordova/www/LICENSE.GDevelop.txt +2 -0
- package/dist/Runtime/Cordova/www/index.html +1 -1
- package/dist/Runtime/CustomRuntimeObject.js +1 -1
- package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
- package/dist/Runtime/CustomRuntimeObject2D.js +2 -0
- package/dist/Runtime/CustomRuntimeObject2D.js.map +7 -0
- package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js +1 -1
- package/dist/Runtime/CustomRuntimeObjectInstanceContainer.js.map +2 -2
- package/dist/Runtime/Electron/LICENSE.GDevelop.txt +2 -0
- package/dist/Runtime/Electron/package.json +3 -0
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js +1 -1
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3DRenderer.js +1 -1
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3DRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/3D/AmbientLight.js +1 -1
- package/dist/Runtime/Extensions/3D/AmbientLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Base3DBehavior.js +1 -1
- package/dist/Runtime/Extensions/3D/Base3DBehavior.js.map +2 -2
- package/dist/Runtime/Extensions/3D/BloomEffect.js +1 -1
- package/dist/Runtime/Extensions/3D/BloomEffect.js.map +2 -2
- package/dist/Runtime/Extensions/3D/BrightnessAndContrastEffect.js +1 -1
- package/dist/Runtime/Extensions/3D/BrightnessAndContrastEffect.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js +1 -1
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js +2 -0
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +7 -0
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3DRenderer.js +2 -0
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3DRenderer.js.map +7 -0
- package/dist/Runtime/Extensions/3D/DirectionalLight.js +1 -1
- package/dist/Runtime/Extensions/3D/DirectionalLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/ExponentialFog.js +1 -1
- package/dist/Runtime/Extensions/3D/ExponentialFog.js.map +2 -2
- package/dist/Runtime/Extensions/3D/ExposureEffect.js +1 -1
- package/dist/Runtime/Extensions/3D/ExposureEffect.js.map +2 -2
- package/dist/Runtime/Extensions/3D/HemisphereLight.js +1 -1
- package/dist/Runtime/Extensions/3D/HemisphereLight.js.map +2 -2
- package/dist/Runtime/Extensions/3D/HueAndSaturationEffect.js +1 -1
- package/dist/Runtime/Extensions/3D/HueAndSaturationEffect.js.map +2 -2
- package/dist/Runtime/Extensions/3D/JsExtension.js +56 -24
- package/dist/Runtime/Extensions/3D/LinearFog.js +1 -1
- package/dist/Runtime/Extensions/3D/LinearFog.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js +1 -1
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js +1 -1
- package/dist/Runtime/Extensions/3D/Model3DRuntimeObject3DRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/AdMob/JsExtension.js +11 -10
- package/dist/Runtime/Extensions/AdMob/admobtools.js +1 -1
- package/dist/Runtime/Extensions/AdMob/admobtools.js.map +2 -2
- package/dist/Runtime/Extensions/AnchorBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/BBText/JsExtension.js +20 -11
- package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/BitmapText/JsExtension.js +2 -8
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/CMakeLists.txt +35 -0
- package/dist/Runtime/Extensions/CMakeUtils.txt +81 -0
- package/dist/Runtime/Extensions/DestroyOutsideBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/DestroyOutsideBehavior/destroyoutsideruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/DialogueTree/bondage.js/version.txt +5 -0
- package/dist/Runtime/Extensions/DraggableBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/Effects/adjustment-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/adjustment-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/advanced-bloom-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/advanced-bloom-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/ascii-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/ascii-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/black-and-white-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/black-and-white-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/blending-mode-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/blending-mode-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/brightness-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/brightness-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/bulge-pinch-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/bulge-pinch-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-map-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/color-map-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/crt-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/crt-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/displacement-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/displacement-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/dot-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/dot-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glitch-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/glitch-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/godray-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/godray-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/hsl-adjustment-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/hsl-adjustment-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/light-night-pixi-filter.js +2 -2
- package/dist/Runtime/Extensions/Effects/light-night-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/motion-blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/motion-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/night-pixi-filter.js +2 -2
- package/dist/Runtime/Extensions/Effects/night-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/noise-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/noise-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/old-film-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/old-film-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/pixelate-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/pixelate-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/radial-blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/radial-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/reflection-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/reflection-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/rgb-split-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/rgb-split-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/sepia-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/sepia-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/shockwave-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/shockwave-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/tilt-shift-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/tilt-shift-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/twist-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/twist-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/zoom-blur-pixi-filter.js +1 -1
- package/dist/Runtime/Extensions/Effects/zoom-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/ExampleJsExtension/JsExtension.js +2 -11
- package/dist/Runtime/Extensions/ExampleJsExtension/dummyeffect.js +1 -1
- package/dist/Runtime/Extensions/ExampleJsExtension/dummyeffect.js.map +2 -2
- package/dist/Runtime/Extensions/FileSystem/JsExtension.js +22 -0
- package/dist/Runtime/Extensions/FileSystem/filesystemtools.js +1 -1
- package/dist/Runtime/Extensions/FileSystem/filesystemtools.js.map +2 -2
- package/dist/Runtime/Extensions/Firebase/A_firebasejs/NOTICE.txt +6 -0
- package/dist/Runtime/Extensions/Inventory/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/JsExtensionTypes.d.ts +13 -4
- package/dist/Runtime/Extensions/Leaderboards/JsExtension.js +42 -1
- package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js +1 -1
- package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/JsExtension.js +2 -11
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/LinkedObjects/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/LinkedObjects/linkedobjects.js +1 -1
- package/dist/Runtime/Extensions/LinkedObjects/linkedobjects.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/JsExtension.js +1130 -0
- package/dist/Runtime/Extensions/Multiplayer/messageManager.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/messageManager.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerVariablesManager.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerVariablesManager.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/peer.js +10 -0
- package/dist/Runtime/Extensions/Multiplayer/peer.js.map +1 -0
- package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js +2 -0
- package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js.map +7 -0
- package/dist/Runtime/Extensions/Multiplayer/peerjs.d.ts +509 -0
- package/dist/Runtime/Extensions/P2P/A_peer.js +8 -2
- package/dist/Runtime/Extensions/P2P/A_peer.js.map +1 -1
- package/dist/Runtime/Extensions/P2P/B_p2ptools.js +1 -1
- package/dist/Runtime/Extensions/P2P/B_p2ptools.js.map +2 -2
- package/dist/Runtime/Extensions/P2P/JsExtension.js +27 -0
- package/dist/Runtime/Extensions/PanelSpriteObject/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js +1 -1
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js.map +2 -2
- package/dist/Runtime/Extensions/PathfindingBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Physics2Behavior/JsExtension.js +47 -4
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js +1 -1
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PhysicsBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PlatformBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlayerAuthentication/JsExtension.js +6 -3
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationcomponents.js +4 -4
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationcomponents.js.map +2 -2
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js +1 -1
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/Shopify/CMakeLists.txt +26 -0
- package/dist/Runtime/Extensions/Spine/CMakeLists.txt +20 -0
- package/dist/Runtime/Extensions/Spine/JsExtension.js +11 -2
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-atlas-manager.js +1 -1
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-atlas-manager.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-manager.js +1 -1
- package/dist/Runtime/Extensions/Spine/managers/pixi-spine-manager.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/pixi-spine/Spine-Runtimes-License-Agreement.txt +11 -0
- package/dist/Runtime/Extensions/Spine/pixi-spine/pixi-spine.js +5 -3
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/SystemInfo/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TextEntryObject/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TextInput/JsExtension.js +3 -10
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TextInput/textinputruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TextObject/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TextObject/textruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TextObject/textruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/JsExtension.js +834 -23
- package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js +1 -1
- package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js +1 -1
- package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.d.ts +2 -0
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/TileMapHelper.js.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/CommonTypes.d.ts +12 -0
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/CommonTypes.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts +119 -5
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapManager.d.ts +25 -0
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapManager.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts +16 -1
- package/dist/Runtime/Extensions/TileMap/helper/dts/render/TileMapPixiHelper.d.ts.map +1 -1
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js +2 -0
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +7 -0
- package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TiledSpriteObject/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TopDownMovementBehavior/CMakeLists.txt +23 -0
- package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/TweenBehavior/JsExtension.js +2 -2
- package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Video/JsExtension.js +2 -11
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js +1 -1
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
- package/dist/Runtime/RuntimeInstanceContainer.js +1 -1
- package/dist/Runtime/RuntimeInstanceContainer.js.map +2 -2
- package/dist/Runtime/SpriteAnimator.js +2 -0
- package/dist/Runtime/SpriteAnimator.js.map +7 -0
- package/dist/Runtime/debugger-client/hot-reloader.js +1 -1
- package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
- package/dist/Runtime/events-tools/objecttools.js +1 -1
- package/dist/Runtime/events-tools/objecttools.js.map +2 -2
- package/dist/Runtime/events-tools/runtimescenetools.js +1 -1
- package/dist/Runtime/events-tools/runtimescenetools.js.map +2 -2
- package/dist/Runtime/force.js +1 -1
- package/dist/Runtime/force.js.map +2 -2
- package/dist/Runtime/object-capabilities/TextContainerBehavior.js.map +1 -1
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js +2 -0
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js.map +7 -0
- package/dist/Runtime/pixi-renderers/DebuggerPixiRenderer.js +1 -1
- package/dist/Runtime/pixi-renderers/DebuggerPixiRenderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/layer-pixi-renderer.js +2 -2
- package/dist/Runtime/pixi-renderers/layer-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-filters-tools.js +1 -1
- package/dist/Runtime/pixi-renderers/pixi-filters-tools.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-image-manager.js.map +2 -2
- package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js +1 -1
- package/dist/Runtime/pixi-renderers/runtimegame-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js +1 -1
- package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/polygon.js +1 -1
- package/dist/Runtime/polygon.js.map +2 -2
- package/dist/Runtime/runtimebehavior.js +1 -1
- package/dist/Runtime/runtimebehavior.js.map +2 -2
- package/dist/Runtime/runtimegame.js +1 -1
- package/dist/Runtime/runtimegame.js.map +2 -2
- package/dist/Runtime/runtimeobject.js +1 -1
- package/dist/Runtime/runtimeobject.js.map +2 -2
- package/dist/Runtime/runtimescene.js +1 -1
- package/dist/Runtime/runtimescene.js.map +2 -2
- package/dist/Runtime/scenestack.js +1 -1
- package/dist/Runtime/scenestack.js.map +2 -2
- package/dist/Runtime/spriteruntimeobject.js +1 -1
- package/dist/Runtime/spriteruntimeobject.js.map +2 -2
- package/dist/Runtime/timer.js +1 -1
- package/dist/Runtime/timer.js.map +2 -2
- package/dist/Runtime/types/project-data.d.ts +115 -0
- package/dist/Runtime/variable.js +1 -1
- package/dist/Runtime/variable.js.map +2 -2
- package/dist/Runtime/variablescontainer.js +1 -1
- package/dist/Runtime/variablescontainer.js.map +2 -2
- package/dist/lib/libGD.cjs +2 -1
- package/dist/lib/libGD.d.cts +5 -0
- package/dist/lib/libGD.wasm +0 -0
- package/dist/loaders.cjs +2 -1
- package/dist/loaders.d.cts +2 -0
- package/gd.d.ts +217 -223
- package/package.json +8 -6
- package/src/index.js +2 -0
- package/types/index.d.ts +2 -2
- package/types/open_project.d.ts +4 -4
- package/dist/Runtime/Extensions/Spine/pixi-spine/pixi-spine.js.map +0 -7
- package/dist/Runtime/pixi-renderers/CustomObjectPixiRenderer.js +0 -2
- package/dist/Runtime/pixi-renderers/CustomObjectPixiRenderer.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../GDevelop/Extensions/PlayerAuthentication/playerauthenticationtools.ts"],
|
|
4
|
-
"sourcesContent": ["namespace gdjs {\n declare var cordova: any;\n\n const logger = new gdjs.Logger('Player Authentication');\n const authComponents = gdjs.playerAuthenticationComponents;\n // TODO EBO Replace runtimeScene to instanceContainer.\n export namespace playerAuthentication {\n // Authentication information.\n let _username: string | null = null;\n let _userId: string | null = null;\n let _userToken: string | null = null;\n let _justLoggedIn = false;\n\n let _checkedLocalStorage: boolean = false;\n\n // Authentication display\n let _authenticationWindow: Window | null = null; // For Web.\n let _authenticationInAppWindow: Window | null = null; // For Cordova.\n let _authenticationRootContainer: HTMLDivElement | null = null;\n let _authenticationLoaderContainer: HTMLDivElement | null = null;\n let _authenticationIframeContainer: HTMLDivElement | null = null;\n let _authenticationTextContainer: HTMLDivElement | null = null;\n let _authenticationBanner: HTMLDivElement | null = null;\n let _initialAuthenticationTimeoutId: NodeJS.Timeout | null = null;\n let _authenticationTimeoutId: NodeJS.Timeout | null = null;\n\n // Communication methods.\n let _authenticationMessageCallback:\n | ((event: MessageEvent) => void)\n | null = null;\n let _cordovaAuthenticationMessageCallback:\n | ((event: MessageEvent) => void)\n | null = null;\n let _websocket: WebSocket | null = null;\n\n // Ensure that the condition \"just logged in\" is valid only for one frame.\n gdjs.registerRuntimeScenePostEventsCallback(() => {\n _justLoggedIn = false;\n });\n\n // If the extension is used, register an eventlistener to know if the user is\n // logged in while playing the game on GDevelop games platform.\n // Then send a message to the parent iframe to say that the player auth is ready.\n gdjs.registerFirstRuntimeSceneLoadedCallback(\n (runtimeScene: RuntimeScene) => {\n if (getPlatform(runtimeScene) !== 'web') {\n // Automatic authentication is only valid when the game is hosted on GDevelop games platform.\n return;\n }\n removeAuthenticationCallbacks(); // Remove any callback that could have been registered before.\n _authenticationMessageCallback = (event: MessageEvent) => {\n receiveAuthenticationMessage(runtimeScene, event, {\n checkOrigin: true,\n });\n };\n window.addEventListener(\n 'message',\n _authenticationMessageCallback,\n true\n );\n logger.info(\n 'Notifying parent window that player authentication is ready.'\n );\n window.parent.postMessage(\n {\n id: 'playerAuthReady',\n },\n '*' // We could restrict to GDevelop games platform but it's not necessary as the message is not sensitive, and it allows easy debugging.\n );\n // If no answer after 3 seconds, assume that the game is not embedded in GDevelop games platform, and remove the listener.\n _initialAuthenticationTimeoutId = setTimeout(() => {\n logger.info('Removing initial authentication listener.');\n removeAuthenticationCallbacks();\n }, 3000);\n }\n );\n\n const getLocalStorageKey = (gameId: string) =>\n `${gameId}_authenticatedUser`;\n\n const getAuthWindowUrl = ({\n runtimeGame,\n gameId,\n connectionId,\n }: {\n runtimeGame: gdjs.RuntimeGame;\n gameId: string;\n connectionId?: string;\n }) => {\n // Uncomment to test the case of a failing loading:\n // return 'https://gd.games.wronglink';\n\n return `https://gd.games/auth?gameId=${gameId}${\n connectionId ? `&connectionId=${connectionId}` : ''\n }${\n runtimeGame.isUsingGDevelopDevelopmentEnvironment() ? '&dev=true' : ''\n }`;\n };\n\n /**\n * Helper returning the platform.\n */\n const getPlatform = (\n runtimeScene: RuntimeScene\n ): 'electron' | 'cordova' | 'web' => {\n const runtimeGame = runtimeScene.getGame();\n const electron = runtimeGame.getRenderer().getElectron();\n if (electron) {\n return 'electron';\n }\n if (typeof cordova !== 'undefined') return 'cordova';\n\n return 'web';\n };\n\n /**\n * Check if, in some exceptional cases, we allow authentication\n * to be done through a iframe.\n * This is usually discouraged as the user can't verify that the authentication\n * window is a genuine one. It's only to be used in trusted contexts.\n */\n const shouldAuthenticationUseIframe = (runtimeScene: RuntimeScene) => {\n const runtimeGameOptions = runtimeScene.getGame().getAdditionalOptions();\n return (\n runtimeGameOptions &&\n runtimeGameOptions.isPreview &&\n runtimeGameOptions.allowAuthenticationUsingIframeForPreview\n );\n };\n\n /**\n * Returns true if a user token is present in the local storage.\n */\n export const isAuthenticated = () => {\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n return _userToken !== null;\n };\n\n /**\n * Returns true if the user just logged in.\n * Useful to update username or trigger messages in the game.\n */\n export const hasLoggedIn = () => _justLoggedIn;\n\n /**\n * Returns the username from the local storage.\n */\n export const getUsername = () => {\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n return _username || '';\n };\n\n /**\n * Returns the user token from the local storage.\n */\n export const getUserToken = () => {\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n return _userToken || null;\n };\n\n /**\n * Returns the username from the local storage.\n */\n export const getUserId = () => {\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n return _userId || '';\n };\n\n /**\n * Returns true if the game is registered, false otherwise.\n * Useful to display a message to the user to register the game before logging in.\n */\n const checkIfGameIsRegistered = (\n runtimeGame: gdjs.RuntimeGame,\n gameId: string,\n tries: number = 0\n ): Promise<boolean> => {\n const rootApi = runtimeGame.isUsingGDevelopDevelopmentEnvironment()\n ? 'https://api-dev.gdevelop.io'\n : 'https://api.gdevelop.io';\n const url = `${rootApi}/game/public-game/${gameId}`;\n return fetch(url, { method: 'HEAD' }).then(\n (response) => {\n if (response.status !== 200) {\n logger.warn(\n `Error while fetching the game: ${response.status} ${response.statusText}`\n );\n\n // If the response is not 404, it may be a timeout, so retry a few times.\n if (response.status === 404 || tries > 2) {\n return false;\n }\n\n return checkIfGameIsRegistered(runtimeGame, gameId, tries + 1);\n }\n return true;\n },\n (err) => {\n logger.error('Error while fetching game:', err);\n return false;\n }\n );\n };\n\n /**\n * Remove the user information from the local storage.\n */\n export const logout = (runtimeScene: RuntimeScene) => {\n _username = null;\n _userToken = null;\n _userId = null;\n\n const gameId = gdjs.projectData.properties.projectUuid;\n if (!gameId) {\n logger.error('Missing game id in project properties.');\n return;\n }\n window.localStorage.removeItem(getLocalStorageKey(gameId));\n cleanUpAuthWindowAndCallbacks(runtimeScene);\n removeAuthenticationBanner(runtimeScene);\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n authComponents.displayLoggedOutNotification(domElementContainer);\n };\n\n /**\n * Retrieves the user information from the local storage, and store\n * them in the extension variables.\n */\n const readAuthenticatedUserFromLocalStorage = () => {\n const gameId = gdjs.projectData.properties.projectUuid;\n if (!gameId) {\n logger.error('Missing game id in project properties.');\n return;\n }\n try {\n const authenticatedUserStorageItem = window.localStorage.getItem(\n getLocalStorageKey(gameId)\n );\n if (!authenticatedUserStorageItem) {\n _checkedLocalStorage = true;\n return;\n }\n const authenticatedUser = JSON.parse(authenticatedUserStorageItem);\n\n _username = authenticatedUser.username;\n _userId = authenticatedUser.userId;\n _userToken = authenticatedUser.userToken;\n _checkedLocalStorage = true;\n } catch (err) {\n logger.warn(\n 'Unable to read authentication details from localStorage. Player authentication will not be available.',\n err\n );\n }\n };\n\n /**\n * Helper to be called on login or error.\n * Removes all the UI and callbacks.\n */\n const cleanUpAuthWindowAndCallbacks = (runtimeScene: RuntimeScene) => {\n removeAuthenticationContainer(runtimeScene);\n clearAuthenticationWindowTimeout();\n if (_websocket) {\n _websocket.close();\n _websocket = null;\n }\n // If a new window was opened (web), close it.\n if (_authenticationWindow) {\n _authenticationWindow.close();\n _authenticationWindow = null;\n }\n // If an in-app browser was used (cordova), close it.\n if (_authenticationInAppWindow) {\n _authenticationInAppWindow.close();\n _authenticationInAppWindow = null;\n }\n };\n\n const saveAuthKeyToStorage = ({\n username,\n userId,\n userToken,\n }: {\n username: string | null;\n userId: string;\n userToken: string;\n }) => {\n if (!username) {\n logger.warn('The authenticated player does not have a username');\n }\n _username = username;\n _userId = userId;\n _userToken = userToken;\n _justLoggedIn = true;\n\n const gameId = gdjs.projectData.properties.projectUuid;\n if (!gameId) {\n logger.error('Missing game id in project properties.');\n return;\n }\n try {\n window.localStorage.setItem(\n getLocalStorageKey(gameId),\n JSON.stringify({\n username: _username,\n userId: _userId,\n userToken: _userToken,\n })\n );\n } catch (err) {\n logger.warn(\n 'Unable to save the authentication details to localStorage. Player authentication will not be available.',\n err\n );\n }\n };\n\n /**\n * When the game receives the authentication result, close all the\n * authentication windows, display the notification and focus on the game.\n */\n const handleLoggedInEvent = function (\n runtimeScene: gdjs.RuntimeScene,\n userId: string,\n username: string | null,\n userToken: string\n ) {\n saveAuthKeyToStorage({ userId, username, userToken });\n cleanUpAuthWindowAndCallbacks(runtimeScene);\n removeAuthenticationBanner(runtimeScene);\n\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n authComponents.displayLoggedInNotification(\n domElementContainer,\n _username || 'Anonymous'\n );\n focusOnGame(runtimeScene);\n };\n\n /**\n * Reads the event sent by the authentication window and\n * display the appropriate banner.\n */\n const receiveAuthenticationMessage = function (\n runtimeScene: gdjs.RuntimeScene,\n event: MessageEvent,\n { checkOrigin }: { checkOrigin: boolean }\n ) {\n const allowedOrigins = ['https://liluo.io', 'https://gd.games'];\n\n // Check origin of message.\n if (checkOrigin && !allowedOrigins.includes(event.origin)) {\n // Automatic authentication message ignored: wrong origin. Return silently.\n return;\n }\n // Check that message is not malformed.\n if (!event.data.id) {\n throw new Error('Malformed message');\n }\n\n // Handle message.\n switch (event.data.id) {\n case 'authenticationResult': {\n if (!(event.data.body && event.data.body.token)) {\n throw new Error('Malformed message.');\n }\n\n handleLoggedInEvent(\n runtimeScene,\n event.data.body.userId,\n event.data.body.username,\n event.data.body.token\n );\n break;\n }\n case 'alreadyAuthenticated': {\n if (!(event.data.body && event.data.body.token)) {\n throw new Error('Malformed message.');\n }\n\n saveAuthKeyToStorage({\n userId: event.data.body.userId,\n username: event.data.body.username,\n userToken: event.data.body.token,\n });\n removeAuthenticationCallbacks();\n refreshAuthenticationBannerIfAny(runtimeScene);\n break;\n }\n }\n };\n\n /**\n * Handle any error that can occur as part of the authentication process.\n */\n const handleAuthenticationError = function (\n runtimeScene: gdjs.RuntimeScene,\n message: string\n ) {\n logger.error(message);\n cleanUpAuthWindowAndCallbacks(runtimeScene);\n\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n authComponents.displayErrorNotification(domElementContainer);\n focusOnGame(runtimeScene);\n };\n\n /**\n * If after 5min, no message has been received from the authentication window,\n * show a notification and remove the authentication container.\n */\n const startAuthenticationWindowTimeout = (\n runtimeScene: gdjs.RuntimeScene\n ) => {\n clearAuthenticationWindowTimeout();\n const time = 12 * 60 * 1000; // 12 minutes, in case the user needs time to authenticate.\n _authenticationTimeoutId = setTimeout(() => {\n logger.info(\n 'Authentication window did not send message in time. Closing it.'\n );\n cleanUpAuthWindowAndCallbacks(runtimeScene);\n focusOnGame(runtimeScene);\n }, time);\n };\n\n /**\n * Clear all existing authentication timeouts.\n * Useful when:\n * - a new authentication starts\n * - the authentication succeeded\n * - the authentication window is closed\n */\n const clearAuthenticationWindowTimeout = () => {\n if (_initialAuthenticationTimeoutId)\n clearTimeout(_initialAuthenticationTimeoutId);\n if (_authenticationTimeoutId) clearTimeout(_authenticationTimeoutId);\n };\n\n /**\n * Helper to create the authentication banner based on the authentication status.\n */\n const createAuthenticationBanner = function (\n runtimeScene: gdjs.RuntimeScene\n ): HTMLDivElement {\n const onDismissBanner = () => {\n removeAuthenticationBanner(runtimeScene);\n };\n const onOpenAuthenticationWindow = () => {\n openAuthenticationWindow(runtimeScene);\n };\n return _userToken\n ? authComponents.computeAuthenticatedBanner(\n onOpenAuthenticationWindow,\n onDismissBanner,\n _username\n )\n : authComponents.computeNotAuthenticatedBanner(\n onOpenAuthenticationWindow,\n onDismissBanner\n );\n };\n\n /**\n * Action to display the banner to the user, depending on their authentication status.\n */\n export const displayAuthenticationBanner = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n if (_authenticationBanner) {\n // Banner already displayed, ensure it's visible.\n _authenticationBanner.style.opacity = '1';\n return;\n }\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n\n _authenticationBanner = createAuthenticationBanner(runtimeScene);\n domElementContainer.appendChild(_authenticationBanner);\n };\n\n /**\n * Helper to recompute the authentication banner.\n * This is useful if the user is already logged on GDevelop games platform\n * and we want to display the banner with the username.\n */\n const refreshAuthenticationBannerIfAny = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n if (!_authenticationBanner) return;\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n const oldAuthenticationBanner = _authenticationBanner;\n _authenticationBanner = createAuthenticationBanner(runtimeScene);\n domElementContainer.replaceChild(\n _authenticationBanner,\n oldAuthenticationBanner\n );\n };\n\n /**\n * Helper to handle authentication window on Electron.\n * We open a new window, and create a websocket to know when the user is logged in.\n */\n const openAuthenticationWindowForElectron = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string\n ) => {\n const wsPlayApi = runtimeScene\n .getGame()\n .isUsingGDevelopDevelopmentEnvironment()\n ? 'wss://api-ws-dev.gdevelop.io/play'\n : 'wss://api-ws.gdevelop.io/play';\n _websocket = new WebSocket(wsPlayApi);\n _websocket.onopen = () => {\n // When socket is open, ask for the connectionId, so that we can open the authentication window.\n if (_websocket) {\n _websocket.send(JSON.stringify({ action: 'getConnectionId' }));\n }\n };\n _websocket.onerror = () => {\n handleAuthenticationError(\n runtimeScene,\n 'Error while connecting to the authentication server.'\n );\n };\n _websocket.onmessage = (event) => {\n if (event.data) {\n const messageContent = JSON.parse(event.data);\n switch (messageContent.type) {\n case 'authenticationResult': {\n const messageData = messageContent.data;\n handleLoggedInEvent(\n runtimeScene,\n messageData.userId,\n messageData.username,\n messageData.token\n );\n break;\n }\n case 'connectionId': {\n const messageData = messageContent.data;\n const connectionId = messageData.connectionId;\n if (!connectionId) {\n logger.error('No connectionId received');\n return;\n }\n\n const targetUrl = getAuthWindowUrl({\n runtimeGame: runtimeScene.getGame(),\n gameId,\n connectionId,\n });\n\n const electron = runtimeScene\n .getGame()\n .getRenderer()\n .getElectron();\n const openWindow = () => electron.shell.openExternal(targetUrl);\n\n openWindow();\n\n // Add the link to the window in case a popup blocker is preventing the window from opening.\n if (_authenticationTextContainer) {\n authComponents.addAuthenticationUrlToTextsContainer(\n openWindow,\n _authenticationTextContainer\n );\n }\n\n break;\n }\n }\n }\n };\n };\n\n /**\n * Helper to handle authentication window on Cordova.\n * We open an InAppBrowser window, and listen to messages posted on this window.\n */\n const openAuthenticationWindowForCordova = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string\n ) => {\n const targetUrl = getAuthWindowUrl({\n runtimeGame: runtimeScene.getGame(),\n gameId,\n });\n\n _authenticationInAppWindow = cordova.InAppBrowser.open(\n targetUrl,\n 'authentication',\n 'location=yes' // location=yes is important to show the URL bar to the user.\n );\n // Listen to messages posted on the authentication window, so that we can\n // know when the user is authenticated.\n if (_authenticationInAppWindow) {\n _cordovaAuthenticationMessageCallback = (event: MessageEvent) => {\n receiveAuthenticationMessage(runtimeScene, event, {\n checkOrigin: false, // For Cordova we don't check the origin, as the message is read from the InAppBrowser directly.\n });\n };\n _authenticationInAppWindow.addEventListener(\n 'message',\n _cordovaAuthenticationMessageCallback,\n true\n );\n }\n };\n\n /**\n * Helper to handle authentication window on web.\n * We open a new window, and listen to messages posted back to the game window.\n */\n const openAuthenticationWindowForWeb = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string\n ) => {\n // If we're on a browser, open a new window.\n const targetUrl = getAuthWindowUrl({\n runtimeGame: runtimeScene.getGame(),\n gameId,\n });\n\n // Listen to messages posted by the authentication window, so that we can\n // know when the user is authenticated.\n _authenticationMessageCallback = (event: MessageEvent) => {\n receiveAuthenticationMessage(runtimeScene, event, {\n checkOrigin: true,\n });\n };\n window.addEventListener('message', _authenticationMessageCallback, true);\n\n const left = screen.width / 2 - 500 / 2;\n const top = screen.height / 2 - 600 / 2;\n const windowFeatures = `left=${left},top=${top},width=500,height=600`;\n const openWindow = () =>\n window.open(targetUrl, 'authentication', windowFeatures);\n _authenticationWindow = openWindow();\n\n // Add the link to the window in case a popup blocker is preventing the window from opening.\n if (_authenticationTextContainer) {\n authComponents.addAuthenticationUrlToTextsContainer(\n openWindow,\n _authenticationTextContainer\n );\n }\n };\n\n /**\n * Helper to handle authentication iframe on web.\n * We open an iframe, and listen to messages posted back to the game window.\n */\n const openAuthenticationIframeForWeb = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string\n ) => {\n if (\n !_authenticationIframeContainer ||\n !_authenticationLoaderContainer ||\n !_authenticationTextContainer\n ) {\n console.error(\n \"Can't open an authentication iframe - no iframe container, loader container or text container was opened for it.\"\n );\n return;\n }\n\n const targetUrl = getAuthWindowUrl({\n runtimeGame: runtimeScene.getGame(),\n gameId,\n });\n\n // Listen to messages posted by the authentication window, so that we can\n // know when the user is authenticated.\n _authenticationMessageCallback = (event: MessageEvent) => {\n receiveAuthenticationMessage(runtimeScene, event, {\n checkOrigin: true,\n });\n };\n window.addEventListener('message', _authenticationMessageCallback, true);\n\n authComponents.displayIframeInsideAuthenticationContainer(\n _authenticationIframeContainer,\n _authenticationLoaderContainer,\n _authenticationTextContainer,\n targetUrl\n );\n };\n\n /**\n * Action to display the authentication window to the user.\n */\n export const openAuthenticationWindow = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n // Create the authentication container for the player to wait.\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication window cannot be displayed.\"\n );\n return;\n }\n\n const onAuthenticationContainerDismissed = () => {\n cleanUpAuthWindowAndCallbacks(runtimeScene);\n displayAuthenticationBanner(runtimeScene);\n };\n\n const _gameId = gdjs.projectData.properties.projectUuid;\n if (!_gameId) {\n handleAuthenticationError(\n runtimeScene,\n 'The game ID is missing, the authentication window cannot be opened.'\n );\n return;\n }\n\n // If the banner is displayed, hide it, so that it can be shown again if the user closes the window.\n if (_authenticationBanner) _authenticationBanner.style.opacity = '0';\n\n const platform = getPlatform(runtimeScene);\n const {\n rootContainer,\n loaderContainer,\n iframeContainer,\n } = authComponents.computeAuthenticationContainer(\n onAuthenticationContainerDismissed\n );\n _authenticationRootContainer = rootContainer;\n _authenticationLoaderContainer = loaderContainer;\n _authenticationIframeContainer = iframeContainer;\n\n // Display the authentication window right away, to show a loader\n // while the call for game registration is happening.\n domElementContainer.appendChild(_authenticationRootContainer);\n\n // If the game is registered, open the authentication window.\n // Otherwise, open the window indicating that the game is not registered.\n checkIfGameIsRegistered(runtimeScene.getGame(), _gameId)\n .then((isGameRegistered) => {\n if (_authenticationLoaderContainer) {\n const electron = runtimeScene.getGame().getRenderer().getElectron();\n const wikiOpenAction = electron\n ? () =>\n electron.shell.openExternal(\n 'https://wiki.gdevelop.io/gdevelop5/publishing/web'\n )\n : null; // Only show a link if we're on electron.\n\n _authenticationTextContainer = authComponents.addAuthenticationTextsToLoadingContainer(\n _authenticationLoaderContainer,\n platform,\n isGameRegistered,\n wikiOpenAction\n );\n }\n if (isGameRegistered) {\n startAuthenticationWindowTimeout(runtimeScene);\n\n // Based on which platform the game is running, we open the authentication window\n // with a different window, with or without a websocket.\n switch (platform) {\n case 'electron':\n openAuthenticationWindowForElectron(runtimeScene, _gameId);\n break;\n case 'cordova':\n openAuthenticationWindowForCordova(runtimeScene, _gameId);\n break;\n case 'web':\n default:\n if (shouldAuthenticationUseIframe(runtimeScene)) {\n openAuthenticationIframeForWeb(runtimeScene, _gameId);\n } else {\n openAuthenticationWindowForWeb(runtimeScene, _gameId);\n }\n break;\n }\n }\n })\n .catch((error) => {\n handleAuthenticationError(\n runtimeScene,\n 'Error while checking if the game is registered.'\n );\n logger.error(error);\n });\n };\n\n /**\n * Condition to check if the window is open, so that the game can be paused in the background.\n */\n export const isAuthenticationWindowOpen = function (): boolean {\n return !!_authenticationRootContainer;\n };\n\n /**\n * Remove the container displaying the authentication window and the callback.\n */\n export const removeAuthenticationContainer = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n removeAuthenticationCallbacks();\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n logger.info(\n \"The div element covering the game couldn't be found, the authentication must be already closed.\"\n );\n return;\n }\n\n // Remove the authentication root container.\n if (_authenticationRootContainer) {\n domElementContainer.removeChild(_authenticationRootContainer);\n }\n\n _authenticationRootContainer = null;\n _authenticationLoaderContainer = null;\n _authenticationIframeContainer = null;\n _authenticationTextContainer = null;\n };\n\n /*\n * Remove the authentication callbacks from web or cordova.\n */\n const removeAuthenticationCallbacks = function () {\n // Remove the authentication callbacks.\n if (_authenticationMessageCallback) {\n window.removeEventListener(\n 'message',\n _authenticationMessageCallback,\n true\n );\n _authenticationMessageCallback = null;\n // No need to detach the callback from the InAppBrowser, as it's destroyed when the window is closed.\n _cordovaAuthenticationMessageCallback = null;\n }\n };\n\n /**\n * Remove the banner displaying the authentication status.\n */\n export const removeAuthenticationBanner = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n if (!_authenticationBanner) {\n logger.info(\n \"The authentication banner couldn't be found, the authentication banner must be already closed.\"\n );\n return;\n }\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n logger.info(\n \"The div element covering the game couldn't be found, the authentication must be already closed.\"\n );\n return;\n }\n\n domElementContainer.removeChild(_authenticationBanner);\n _authenticationBanner = null;\n };\n\n /**\n * Focus on game canvas to allow user to interact with it.\n */\n const focusOnGame = function (runtimeScene: gdjs.RuntimeScene) {\n const gameCanvas = runtimeScene.getGame().getRenderer().getCanvas();\n if (gameCanvas) gameCanvas.focus();\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,GAAU,MAAV,UAAU,EAAV,
|
|
4
|
+
"sourcesContent": ["namespace gdjs {\n declare var cordova: any;\n declare var SafariViewController: any;\n\n const logger = new gdjs.Logger('Player Authentication');\n const authComponents = gdjs.playerAuthenticationComponents;\n // TODO EBO Replace runtimeScene to instanceContainer.\n export namespace playerAuthentication {\n // Authentication information.\n let _username: string | null = null;\n let _userId: string | null = null;\n let _userToken: string | null = null;\n let _justLoggedIn = false;\n\n let _checkedLocalStorage: boolean = false;\n\n // Authentication display\n let _authenticationWindow: Window | null = null; // For Web.\n let _authenticationRootContainer: HTMLDivElement | null = null;\n let _authenticationLoaderContainer: HTMLDivElement | null = null;\n let _authenticationIframeContainer: HTMLDivElement | null = null;\n let _authenticationTextContainer: HTMLDivElement | null = null;\n let _authenticationBanner: HTMLDivElement | null = null;\n let _automaticGamesPlatformAuthenticationTimeoutId: NodeJS.Timeout | null = null;\n let _authenticationTimeoutId: NodeJS.Timeout | null = null;\n\n // Communication methods.\n let _automaticGamesPlatformAuthenticationCallback:\n | ((event: MessageEvent) => void)\n | null = null;\n let _authenticationMessageCallback:\n | ((event: MessageEvent) => void)\n | null = null;\n let _websocket: WebSocket | null = null;\n\n type AuthenticationWindowStatus = 'logged' | 'errored' | 'dismissed';\n\n const handleAutomaticGamesPlatformAuthentication = (\n runtimeScene: gdjs.RuntimeScene\n ) => {\n if (getPlayerAuthPlatform(runtimeScene) !== 'web') {\n // Automatic authentication is only valid when the game is hosted on GDevelop games platform.\n return;\n }\n\n removeAutomaticGamesPlatformAuthenticationCallback(); // Remove any callback that could have been registered before.\n _automaticGamesPlatformAuthenticationCallback = (event: MessageEvent) => {\n receiveAuthenticationMessage({\n runtimeScene,\n event,\n checkOrigin: true,\n });\n };\n window.addEventListener(\n 'message',\n _automaticGamesPlatformAuthenticationCallback,\n true\n );\n logger.info(\n 'Notifying parent window that player authentication is ready.'\n );\n window.parent.postMessage(\n {\n id: 'playerAuthReady',\n },\n '*' // We could restrict to GDevelop games platform but it's not necessary as the message is not sensitive, and it allows easy debugging.\n );\n // If no answer after 3 seconds, assume that the game is not embedded in GDevelop games platform, and remove the listener.\n _automaticGamesPlatformAuthenticationTimeoutId = setTimeout(() => {\n logger.info(\n 'Removing automatic games platform authentication listener.'\n );\n removeAutomaticGamesPlatformAuthenticationCallback();\n }, 3000);\n };\n\n const handleAutomaticPreviewAuthentication = (\n runtimeScene: gdjs.RuntimeScene\n ) => {\n const runtimeGameOptions = runtimeScene.getGame().getAdditionalOptions();\n if (runtimeGameOptions && runtimeGameOptions.isPreview) {\n // If the game is a preview, and the user is already authenticated, we can log them in automatically.\n const playerId = runtimeGameOptions.playerId;\n const playerToken = runtimeGameOptions.playerToken;\n const playerUsername = runtimeGameOptions.playerUsername;\n if (playerId && playerToken) {\n logger.info(\n `Automatically logging in the player with ID ${playerId} as it's a preview.`\n );\n saveAuthKeyToStorage({\n userId: playerId,\n username: playerUsername || null,\n userToken: playerToken,\n });\n refreshAuthenticationBannerIfAny(runtimeScene);\n }\n }\n };\n\n // Ensure that the condition \"just logged in\" is valid only for one frame.\n gdjs.registerRuntimeScenePostEventsCallback(() => {\n _justLoggedIn = false;\n });\n\n // If the extension is used, register an eventlistener to know if the user is\n // logged in while playing the game on GDevelop games platform.\n // Then send a message to the parent iframe to say that the player auth is ready.\n gdjs.registerFirstRuntimeSceneLoadedCallback(\n (runtimeScene: RuntimeScene) => {\n handleAutomaticPreviewAuthentication(runtimeScene);\n handleAutomaticGamesPlatformAuthentication(runtimeScene);\n }\n );\n\n const getLocalStorageKey = (gameId: string) =>\n `${gameId}_authenticatedUser`;\n\n const getAuthWindowUrl = ({\n runtimeGame,\n gameId,\n connectionId,\n }: {\n runtimeGame: gdjs.RuntimeGame;\n gameId: string;\n connectionId?: string;\n }) => {\n // Uncomment to test the case of a failing loading:\n // return 'https://gd.games.wronglink';\n\n return `https://gd.games/auth?gameId=${gameId}${\n connectionId ? `&connectionId=${connectionId}` : ''\n }${\n runtimeGame.isUsingGDevelopDevelopmentEnvironment() ? '&dev=true' : ''\n }&allowLoginProviders=true`;\n };\n\n /**\n * Get the platform running the game, which changes how the authentication\n * window is opened.\n */\n const getPlayerAuthPlatform = (\n runtimeScene: RuntimeScene\n ): 'electron' | 'cordova-websocket' | 'web-iframe' | 'web' => {\n const runtimeGame = runtimeScene.getGame();\n const electron = runtimeGame.getRenderer().getElectron();\n if (electron) {\n // This can be a:\n // - Preview in GDevelop desktop app.\n // - Desktop game running on Electron.\n return 'electron';\n }\n\n // This can be a:\n // - Preview in GDevelop mobile app (iOS only)\n if (shouldAuthenticationUseIframe(runtimeScene)) return 'web-iframe';\n\n if (typeof cordova !== 'undefined') {\n // The game is an Android or an iOS app.\n return 'cordova-websocket';\n }\n\n // This can be a:\n // - Preview in GDevelop web-app\n // - Preview in Gdevelop mobile app (Android only)\n // - Web game (gd.games or any website/server) accessed via a desktop browser...\n // - Or a web game accessed via a mobile browser (Android/iOS).\n return 'web';\n };\n\n /**\n * Check if, in some exceptional cases, we allow authentication\n * to be done through a iframe.\n * This is usually discouraged as the user can't verify that the authentication\n * window is a genuine one. It's only to be used in trusted contexts (e.g:\n * preview in the GDevelop mobile app).\n */\n const shouldAuthenticationUseIframe = (runtimeScene: RuntimeScene) => {\n const runtimeGameOptions = runtimeScene.getGame().getAdditionalOptions();\n return (\n runtimeGameOptions &&\n runtimeGameOptions.isPreview &&\n runtimeGameOptions.allowAuthenticationUsingIframeForPreview\n );\n };\n\n /**\n * Returns true if a user token is present in the local storage.\n */\n export const isAuthenticated = () => {\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n return _userToken !== null;\n };\n\n /**\n * Returns true if the user just logged in.\n * Useful to update username or trigger messages in the game.\n */\n export const hasLoggedIn = () => _justLoggedIn;\n\n /**\n * Returns the username from the local storage.\n */\n export const getUsername = () => {\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n return _username || '';\n };\n\n /**\n * Returns the user token from the local storage.\n */\n export const getUserToken = () => {\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n return _userToken || null;\n };\n\n /**\n * Returns the username from the local storage.\n */\n export const getUserId = () => {\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n return _userId || '';\n };\n\n /**\n * Returns true if the game is registered, false otherwise.\n * Useful to display a message to the user to register the game before logging in.\n */\n const checkIfGameIsRegistered = (\n runtimeGame: gdjs.RuntimeGame,\n gameId: string,\n tries: number = 0\n ): Promise<boolean> => {\n const rootApi = runtimeGame.isUsingGDevelopDevelopmentEnvironment()\n ? 'https://api-dev.gdevelop.io'\n : 'https://api.gdevelop.io';\n const url = `${rootApi}/game/public-game/${gameId}`;\n return fetch(url, { method: 'HEAD' }).then(\n (response) => {\n if (response.status !== 200) {\n logger.warn(\n `Error while fetching the game: ${response.status} ${response.statusText}`\n );\n\n // If the response is not 404, it may be a timeout, so retry a few times.\n if (response.status === 404 || tries > 2) {\n return false;\n }\n\n return checkIfGameIsRegistered(runtimeGame, gameId, tries + 1);\n }\n return true;\n },\n (err) => {\n logger.error('Error while fetching game:', err);\n return false;\n }\n );\n };\n\n /**\n * Remove the user information from the local storage.\n */\n export const logout = (runtimeScene: RuntimeScene) => {\n _username = null;\n _userToken = null;\n _userId = null;\n\n const gameId = gdjs.projectData.properties.projectUuid;\n if (!gameId) {\n logger.error('Missing game id in project properties.');\n return;\n }\n window.localStorage.removeItem(getLocalStorageKey(gameId));\n cleanUpAuthWindowAndTimeouts(runtimeScene);\n removeAuthenticationBanner(runtimeScene);\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n authComponents.displayLoggedOutNotification(domElementContainer);\n };\n\n /**\n * Retrieves the user information from the local storage, and store\n * them in the extension variables.\n */\n const readAuthenticatedUserFromLocalStorage = () => {\n const gameId = gdjs.projectData.properties.projectUuid;\n if (!gameId) {\n logger.error('Missing game id in project properties.');\n return;\n }\n try {\n const authenticatedUserStorageItem = window.localStorage.getItem(\n getLocalStorageKey(gameId)\n );\n if (!authenticatedUserStorageItem) {\n _checkedLocalStorage = true;\n return;\n }\n const authenticatedUser = JSON.parse(authenticatedUserStorageItem);\n\n _username = authenticatedUser.username;\n _userId = authenticatedUser.userId;\n _userToken = authenticatedUser.userToken;\n _checkedLocalStorage = true;\n } catch (err) {\n logger.warn(\n 'Unable to read authentication details from localStorage. Player authentication will not be available.',\n err\n );\n }\n };\n\n /**\n * Helper to be called on login or error.\n * Removes all the UI and timeouts.\n */\n const cleanUpAuthWindowAndTimeouts = (runtimeScene: RuntimeScene) => {\n removeAuthenticationContainer(runtimeScene);\n clearAuthenticationWindowTimeout();\n\n // If there is a websocket communication (electron, cordova), close it.\n if (_websocket) {\n logger.info('Closing authentication websocket connection.');\n _websocket.close();\n _websocket = null;\n }\n // If a new window was opened (web), close it.\n if (_authenticationWindow) {\n _authenticationWindow.close();\n _authenticationWindow = null;\n }\n\n // If cordova (native mobile app), hide external window.\n // TODO: calling hide does nothing on Android, the plugin should be updated to handle the action `hide`.\n if (typeof SafariViewController !== 'undefined') {\n try {\n SafariViewController.hide();\n } catch (error) {\n logger.info(\n 'Could not hide login window. Waiting for user to do it.'\n );\n }\n }\n };\n\n const saveAuthKeyToStorage = ({\n username,\n userId,\n userToken,\n }: {\n username: string | null;\n userId: string;\n userToken: string;\n }) => {\n if (!username) {\n logger.warn('The authenticated player does not have a username');\n }\n _username = username;\n _userId = userId;\n _userToken = userToken;\n _justLoggedIn = true;\n\n const gameId = gdjs.projectData.properties.projectUuid;\n if (!gameId) {\n logger.error('Missing game id in project properties.');\n return;\n }\n try {\n window.localStorage.setItem(\n getLocalStorageKey(gameId),\n JSON.stringify({\n username: _username,\n userId: _userId,\n userToken: _userToken,\n })\n );\n } catch (err) {\n logger.warn(\n 'Unable to save the authentication details to localStorage. Player authentication will not be available.',\n err\n );\n }\n };\n\n export const login = ({\n runtimeScene,\n userId,\n username,\n userToken,\n }: {\n runtimeScene: gdjs.RuntimeScene;\n userId: string;\n username: string | null;\n userToken: string;\n }) => {\n saveAuthKeyToStorage({ userId, username, userToken });\n cleanUpAuthWindowAndTimeouts(runtimeScene);\n removeAuthenticationBanner(runtimeScene);\n\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n authComponents.displayLoggedInNotification(\n domElementContainer,\n _username || 'Anonymous'\n );\n };\n\n /**\n * Reads the event sent by the authentication window and\n * display the appropriate banner.\n */\n const receiveAuthenticationMessage = function ({\n runtimeScene,\n event,\n checkOrigin,\n onDone,\n }: {\n runtimeScene: gdjs.RuntimeScene;\n event: MessageEvent;\n checkOrigin: boolean;\n onDone?: (status: 'logged' | 'errored' | 'dismissed') => void;\n }) {\n const allowedOrigins = ['https://liluo.io', 'https://gd.games'];\n\n // Check origin of message.\n if (checkOrigin && !allowedOrigins.includes(event.origin)) {\n // Automatic authentication message ignored: wrong origin. Return silently.\n return;\n }\n // Check that message is not malformed.\n if (!event.data.id) {\n throw new Error('Malformed message');\n }\n\n // Handle message.\n switch (event.data.id) {\n case 'authenticationResult': {\n if (!(event.data.body && event.data.body.token)) {\n throw new Error('Malformed message.');\n }\n\n login({\n runtimeScene,\n userId: event.data.body.userId,\n username: event.data.body.username,\n userToken: event.data.body.token,\n });\n focusOnGame(runtimeScene);\n if (onDone) onDone('logged');\n break;\n }\n case 'alreadyAuthenticated': {\n if (!(event.data.body && event.data.body.token)) {\n throw new Error('Malformed message.');\n }\n\n saveAuthKeyToStorage({\n userId: event.data.body.userId,\n username: event.data.body.username,\n userToken: event.data.body.token,\n });\n removeAutomaticGamesPlatformAuthenticationCallback();\n refreshAuthenticationBannerIfAny(runtimeScene);\n break;\n }\n }\n };\n\n /**\n * Handle any error that can occur as part of the authentication process.\n */\n const handleAuthenticationError = function (\n runtimeScene: gdjs.RuntimeScene,\n message: string\n ) {\n logger.error(message);\n cleanUpAuthWindowAndTimeouts(runtimeScene);\n\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n authComponents.displayErrorNotification(domElementContainer);\n focusOnGame(runtimeScene);\n };\n\n /**\n * If after 5min, no message has been received from the authentication window,\n * show a notification and remove the authentication container.\n */\n const startAuthenticationWindowTimeout = (\n runtimeScene: gdjs.RuntimeScene\n ) => {\n clearAuthenticationWindowTimeout();\n const time = 15 * 60 * 1000; // 15 minutes, in case the user needs time to authenticate.\n _authenticationTimeoutId = setTimeout(() => {\n logger.info(\n 'Authentication window did not send message in time. Closing it.'\n );\n cleanUpAuthWindowAndTimeouts(runtimeScene);\n focusOnGame(runtimeScene);\n }, time);\n };\n\n /**\n * Clear all existing authentication timeouts.\n * Useful when:\n * - a new authentication starts\n * - the authentication succeeded\n * - the authentication window is closed\n */\n const clearAuthenticationWindowTimeout = () => {\n if (_authenticationTimeoutId) clearTimeout(_authenticationTimeoutId);\n };\n\n /**\n * Helper to create the authentication banner based on the authentication status.\n */\n const createAuthenticationBanner = function (\n runtimeScene: gdjs.RuntimeScene\n ): HTMLDivElement {\n const onDismissBanner = () => {\n removeAuthenticationBanner(runtimeScene);\n };\n const onOpenAuthenticationWindow = () => {\n openAuthenticationWindow(runtimeScene);\n };\n\n return _userToken\n ? authComponents.computeAuthenticatedBanner(\n onOpenAuthenticationWindow,\n onDismissBanner,\n _username\n )\n : authComponents.computeNotAuthenticatedBanner(\n onOpenAuthenticationWindow,\n onDismissBanner\n );\n };\n\n /**\n * Action to display the banner to the user, depending on their authentication status.\n */\n export const displayAuthenticationBanner = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n if (_authenticationBanner) {\n // Banner already displayed, ensure it's visible.\n _authenticationBanner.style.opacity = '1';\n return;\n }\n if (!_checkedLocalStorage) {\n readAuthenticatedUserFromLocalStorage();\n }\n\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n\n _authenticationBanner = createAuthenticationBanner(runtimeScene);\n domElementContainer.appendChild(_authenticationBanner);\n };\n\n /**\n * Helper to recompute the authentication banner.\n * This is useful if the user is already logged on GDevelop games platform\n * and we want to display the banner with the username.\n */\n const refreshAuthenticationBannerIfAny = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n if (!_authenticationBanner) return;\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication banner cannot be displayed.\"\n );\n return;\n }\n const oldAuthenticationBanner = _authenticationBanner;\n _authenticationBanner = createAuthenticationBanner(runtimeScene);\n domElementContainer.replaceChild(\n _authenticationBanner,\n oldAuthenticationBanner\n );\n };\n\n const setupWebsocketForAuthenticationWindow = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string,\n onOpenAuthenticationWindow: (options: {\n connectionId: string;\n resolve: (AuthenticationWindowStatus) => void;\n }) => void\n ) =>\n new Promise<AuthenticationWindowStatus>((resolve) => {\n let hasFinishedAlready = false;\n const wsPlayApi = runtimeScene\n .getGame()\n .isUsingGDevelopDevelopmentEnvironment()\n ? `wss://api-ws-dev.gdevelop.io/play?gameId=${gameId}&connectionType=login`\n : `wss://api-ws.gdevelop.io/play?gameId=${gameId}&connectionType=login`;\n _websocket = new WebSocket(wsPlayApi);\n _websocket.onopen = () => {\n logger.info('Opened authentication websocket connection.');\n // When socket is open, ask for the connectionId, so that we can open the authentication window.\n if (_websocket) {\n _websocket.send(JSON.stringify({ action: 'getConnectionId' }));\n }\n };\n _websocket.onerror = () => {\n logger.info('Error in authentication websocket connection.');\n if (!hasFinishedAlready) {\n hasFinishedAlready = true;\n resolve('errored');\n }\n handleAuthenticationError(\n runtimeScene,\n 'Error while connecting to the authentication server.'\n );\n };\n _websocket.onclose = () => {\n logger.info('Closing authentication websocket connection.');\n if (!hasFinishedAlready) {\n hasFinishedAlready = true;\n resolve('dismissed');\n }\n };\n _websocket.onmessage = (event) => {\n if (event.data) {\n const messageContent = JSON.parse(event.data);\n switch (messageContent.type) {\n case 'authenticationResult': {\n const messageData = messageContent.data;\n\n login({\n runtimeScene,\n userId: messageData.userId,\n username: messageData.username,\n userToken: messageData.token,\n });\n focusOnGame(runtimeScene);\n\n hasFinishedAlready = true;\n resolve('logged');\n break;\n }\n case 'connectionId': {\n const messageData = messageContent.data;\n const connectionId = messageData.connectionId;\n if (!connectionId) {\n logger.error('No WebSocket connectionId received');\n hasFinishedAlready = true;\n resolve('errored');\n return;\n }\n\n logger.info('WebSocket connectionId received.');\n onOpenAuthenticationWindow({ connectionId, resolve });\n break;\n }\n }\n }\n };\n });\n\n /**\n * Helper to handle authentication window on Electron.\n * We open a new window, and create a websocket to know when the user is logged in.\n */\n const openAuthenticationWindowForElectron = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string\n ) =>\n setupWebsocketForAuthenticationWindow(\n runtimeScene,\n gameId,\n ({ connectionId }) => {\n const targetUrl = getAuthWindowUrl({\n runtimeGame: runtimeScene.getGame(),\n gameId,\n connectionId,\n });\n\n const electron = runtimeScene.getGame().getRenderer().getElectron();\n const openWindow = () => electron.shell.openExternal(targetUrl);\n\n openWindow();\n\n // Add the link to the window in case a popup blocker is preventing the window from opening.\n if (_authenticationTextContainer) {\n authComponents.addAuthenticationUrlToTextsContainer(\n openWindow,\n _authenticationTextContainer\n );\n }\n }\n );\n\n /**\n * Helper to handle authentication window on Cordova on iOS and Android.\n * We open an external window, and listen to the websocket to know when the user is logged in.\n */\n const openAuthenticationWindowForCordovaWithWebSocket = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string\n ) =>\n setupWebsocketForAuthenticationWindow(\n runtimeScene,\n gameId,\n ({ connectionId, resolve }) => {\n const targetUrl = getAuthWindowUrl({\n runtimeGame: runtimeScene.getGame(),\n gameId,\n connectionId,\n });\n\n SafariViewController.isAvailable(function (available: boolean) {\n if (available) {\n SafariViewController.show(\n {\n url: targetUrl,\n hidden: false,\n animated: true,\n transition: 'slide',\n enterReaderModeIfAvailable: false,\n barColor: '#000000',\n tintColor: '#ffffff',\n controlTintColor: '#ffffff',\n },\n function (result: any) {\n // Other events are `opened` and `loaded`.\n if (result.event === 'closed') {\n resolve('dismissed');\n }\n },\n function (error: any) {\n logger.log('Error opening webview: ' + JSON.stringify(error));\n resolve('errored');\n }\n );\n } else {\n logger.error('Plugin SafariViewController is not available');\n resolve('errored');\n }\n });\n }\n );\n\n /**\n * Helper to handle authentication window on web.\n * We open a new window, and listen to messages posted back to the game window.\n */\n const openAuthenticationWindowForWeb = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string\n ) =>\n new Promise<AuthenticationWindowStatus>((resolve) => {\n // If we're on a browser, open a new window.\n const targetUrl = getAuthWindowUrl({\n runtimeGame: runtimeScene.getGame(),\n gameId,\n });\n\n // Listen to messages posted by the authentication window, so that we can\n // know when the user is authenticated.\n let isDoneAlready = false;\n _authenticationMessageCallback = (event: MessageEvent) => {\n receiveAuthenticationMessage({\n runtimeScene,\n event,\n checkOrigin: true,\n onDone: (status) => {\n if (isDoneAlready) return;\n isDoneAlready = true;\n resolve(status);\n },\n });\n };\n window.addEventListener(\n 'message',\n _authenticationMessageCallback,\n true\n );\n\n const left = screen.width / 2 - 500 / 2;\n const top = screen.height / 2 - 600 / 2;\n const windowFeatures = `left=${left},top=${top},width=500,height=600`;\n const openWindow = () => {\n _authenticationWindow = window.open(\n targetUrl,\n 'authentication',\n windowFeatures\n );\n };\n\n openWindow();\n\n // Add the link to the window in case a popup blocker is preventing the window from opening.\n if (_authenticationTextContainer) {\n authComponents.addAuthenticationUrlToTextsContainer(\n openWindow,\n _authenticationTextContainer\n );\n }\n });\n\n /**\n * Helper to handle authentication iframe on web.\n * We open an iframe, and listen to messages posted back to the game window.\n */\n const openAuthenticationIframeForWeb = (\n runtimeScene: gdjs.RuntimeScene,\n gameId: string\n ) =>\n new Promise<AuthenticationWindowStatus>((resolve) => {\n if (\n !_authenticationIframeContainer ||\n !_authenticationLoaderContainer ||\n !_authenticationTextContainer\n ) {\n logger.error(\n \"Can't open an authentication iframe - no iframe container, loader container or text container was opened for it.\"\n );\n return;\n }\n\n const targetUrl = getAuthWindowUrl({\n runtimeGame: runtimeScene.getGame(),\n gameId,\n });\n\n // Listen to messages posted by the authentication window, so that we can\n // know when the user is authenticated.\n _authenticationMessageCallback = (event: MessageEvent) => {\n receiveAuthenticationMessage({\n runtimeScene,\n event,\n checkOrigin: true,\n onDone: resolve,\n });\n };\n window.addEventListener(\n 'message',\n _authenticationMessageCallback,\n true\n );\n\n authComponents.displayIframeInsideAuthenticationContainer(\n _authenticationIframeContainer,\n _authenticationLoaderContainer,\n _authenticationTextContainer,\n targetUrl\n );\n });\n\n /**\n * Action to display the authentication window to the user.\n */\n export const openAuthenticationWindow = (\n runtimeScene: gdjs.RuntimeScene\n ): gdjs.PromiseTask<{ status: 'logged' | 'errored' | 'dismissed' }> =>\n new gdjs.PromiseTask(\n new Promise((resolve) => {\n // Create the authentication container for the player to wait.\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n handleAuthenticationError(\n runtimeScene,\n \"The div element covering the game couldn't be found, the authentication window cannot be displayed.\"\n );\n resolve({ status: 'errored' });\n return;\n }\n\n const _gameId = gdjs.projectData.properties.projectUuid;\n if (!_gameId) {\n handleAuthenticationError(\n runtimeScene,\n 'The game ID is missing, the authentication window cannot be opened.'\n );\n resolve({ status: 'errored' });\n return;\n }\n\n let isDismissedAlready = false;\n const onAuthenticationContainerDismissed = () => {\n cleanUpAuthWindowAndTimeouts(runtimeScene);\n displayAuthenticationBanner(runtimeScene);\n\n isDismissedAlready = true;\n resolve({ status: 'dismissed' });\n };\n\n // If the banner is displayed, hide it, so that it can be shown again if the user closes the window.\n if (_authenticationBanner) _authenticationBanner.style.opacity = '0';\n\n const playerAuthPlatform = getPlayerAuthPlatform(runtimeScene);\n const {\n rootContainer,\n loaderContainer,\n iframeContainer,\n } = authComponents.computeAuthenticationContainer(\n onAuthenticationContainerDismissed\n );\n _authenticationRootContainer = rootContainer;\n _authenticationLoaderContainer = loaderContainer;\n _authenticationIframeContainer = iframeContainer;\n\n // Display the authentication window right away, to show a loader\n // while the call for game registration is happening.\n domElementContainer.appendChild(_authenticationRootContainer);\n\n // If the game is registered, open the authentication window.\n // Otherwise, open the window indicating that the game is not registered.\n (async () => {\n const isGameRegistered = await checkIfGameIsRegistered(\n runtimeScene.getGame(),\n _gameId\n );\n\n if (_authenticationLoaderContainer) {\n const electron = runtimeScene\n .getGame()\n .getRenderer()\n .getElectron();\n const wikiOpenAction = electron\n ? () =>\n electron.shell.openExternal(\n 'https://wiki.gdevelop.io/gdevelop5/publishing/web'\n )\n : null; // Only show a link if we're on electron.\n\n _authenticationTextContainer = authComponents.addAuthenticationTextsToLoadingContainer(\n _authenticationLoaderContainer,\n playerAuthPlatform,\n isGameRegistered,\n wikiOpenAction\n );\n }\n if (!isGameRegistered) return;\n\n startAuthenticationWindowTimeout(runtimeScene);\n\n // Based on which platform the game is running, we open the authentication window\n // with a different window, with or without a websocket.\n let status: AuthenticationWindowStatus;\n switch (playerAuthPlatform) {\n case 'electron':\n // This can be a:\n // - Preview in GDevelop desktop app.\n // - Desktop game running on Electron.\n status = await openAuthenticationWindowForElectron(\n runtimeScene,\n _gameId\n );\n break;\n case 'cordova-websocket':\n // The game is an iOS app.\n status = await openAuthenticationWindowForCordovaWithWebSocket(\n runtimeScene,\n _gameId\n );\n break;\n case 'web-iframe':\n // This can be a:\n // - Preview in GDevelop mobile app (iOS only)\n status = await openAuthenticationIframeForWeb(\n runtimeScene,\n _gameId\n );\n break;\n case 'web':\n default:\n // This can be a:\n // - Preview in GDevelop web-app\n // - Preview in Gdevelop mobile app (Android only)\n // - Web game (gd.games or any website/server) accessed via a desktop browser...\n // - Or a web game accessed via a mobile browser (Android/iOS).\n status = await openAuthenticationWindowForWeb(\n runtimeScene,\n _gameId\n );\n break;\n }\n\n if (isDismissedAlready) return;\n if (status === 'dismissed') {\n onAuthenticationContainerDismissed();\n }\n\n resolve({ status });\n })();\n })\n );\n\n /**\n * Condition to check if the window is open, so that the game can be paused in the background.\n */\n export const isAuthenticationWindowOpen = function (): boolean {\n return !!_authenticationRootContainer;\n };\n\n /**\n * Remove the container displaying the authentication window and the callback.\n */\n export const removeAuthenticationContainer = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n removeAuthenticationCallbacks();\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n logger.info(\n \"The div element covering the game couldn't be found, the authentication must be already closed.\"\n );\n return;\n }\n\n // Remove the authentication root container.\n if (_authenticationRootContainer) {\n domElementContainer.removeChild(_authenticationRootContainer);\n }\n\n _authenticationRootContainer = null;\n _authenticationLoaderContainer = null;\n _authenticationIframeContainer = null;\n _authenticationTextContainer = null;\n };\n\n /*\n * Remove the authentication callbacks from web or cordova.\n */\n const removeAuthenticationCallbacks = function () {\n // Remove the authentication callbacks.\n if (_authenticationMessageCallback) {\n window.removeEventListener(\n 'message',\n _authenticationMessageCallback,\n true\n );\n _authenticationMessageCallback = null;\n }\n };\n\n /*\n * Remove the automatic authentication callback when running on web.\n */\n const removeAutomaticGamesPlatformAuthenticationCallback = function () {\n if (_automaticGamesPlatformAuthenticationCallback) {\n window.removeEventListener(\n 'message',\n _automaticGamesPlatformAuthenticationCallback,\n true\n );\n _automaticGamesPlatformAuthenticationCallback = null;\n }\n if (_automaticGamesPlatformAuthenticationTimeoutId) {\n clearTimeout(_automaticGamesPlatformAuthenticationTimeoutId);\n _automaticGamesPlatformAuthenticationTimeoutId = null;\n }\n };\n\n /**\n * Remove the banner displaying the authentication status.\n */\n export const removeAuthenticationBanner = function (\n runtimeScene: gdjs.RuntimeScene\n ) {\n if (!_authenticationBanner) {\n logger.info(\n \"The authentication banner couldn't be found, the authentication banner must be already closed.\"\n );\n return;\n }\n const domElementContainer = runtimeScene\n .getGame()\n .getRenderer()\n .getDomElementContainer();\n if (!domElementContainer) {\n logger.info(\n \"The div element covering the game couldn't be found, the authentication must be already closed.\"\n );\n return;\n }\n\n domElementContainer.removeChild(_authenticationBanner);\n _authenticationBanner = null;\n };\n\n /**\n * Focus on game canvas to allow user to interact with it.\n */\n const focusOnGame = function (runtimeScene: gdjs.RuntimeScene) {\n const gameCanvas = runtimeScene.getGame().getRenderer().getCanvas();\n if (gameCanvas) gameCanvas.focus();\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.5)
|
|
2
|
+
|
|
3
|
+
project(PrimitiveDrawing)
|
|
4
|
+
gd_add_extension_includes()
|
|
5
|
+
|
|
6
|
+
# Defines
|
|
7
|
+
#
|
|
8
|
+
gd_add_extension_definitions(PrimitiveDrawing)
|
|
9
|
+
|
|
10
|
+
# The targets
|
|
11
|
+
#
|
|
12
|
+
include_directories(.)
|
|
13
|
+
file(
|
|
14
|
+
GLOB
|
|
15
|
+
source_files
|
|
16
|
+
*.cpp
|
|
17
|
+
*.h)
|
|
18
|
+
gd_add_clang_utils(PrimitiveDrawing "${source_files}")
|
|
19
|
+
gd_add_extension_target(PrimitiveDrawing "${source_files}")
|
|
20
|
+
|
|
21
|
+
# Linker files for the IDE extension
|
|
22
|
+
#
|
|
23
|
+
gd_extension_link_libraries(PrimitiveDrawing)
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var gdjs;(function(l){const n=class{constructor(t,i){this._positionXIsUpToDate=!1;this._positionYIsUpToDate=!1;this._transformationIsUpToDate=!1;this._antialiasingFilter=null;this._object=t,this._graphics=new PIXI.Graphics,i.getLayer("").getRenderer().addRendererObject(this._graphics,t.getZOrder()),this.updateAntialiasing()}getRendererObject(){return this._graphics}clear(){this._graphics.clear(),this.invalidateBounds()}drawRectangle(t,i,a,s){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawRect(t,i,a-t,s-i),this._graphics.endFill(),this.invalidateBounds()}drawCircle(t,i,a){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawCircle(t,i,a),this._graphics.endFill(),this.invalidateBounds()}drawLine(t,i,a,s,e){if(this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),s===i)this._graphics.drawRect(t,i-e/2,a-t,e);else{const o=Math.atan2(s-i,a-t),h=Math.sin(o)*e,r=Math.cos(o)*e;this._graphics.drawPolygon(t+h,i-r,t-h,i+r,a-h,s+r,a+h,s-r)}this._graphics.endFill(),this.invalidateBounds()}drawLineV2(t,i,a,s,e){this._graphics.lineStyle(e,this._object._outlineColor,this._object._outlineOpacity/255),this._graphics.moveTo(t,i),this._graphics.lineTo(a,s),this._graphics.endFill(),this.invalidateBounds()}drawEllipse(t,i,a,s){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawEllipse(t,i,a/2,s/2),this._graphics.endFill(),this.invalidateBounds()}drawRoundedRectangle(t,i,a,s,e){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawRoundedRect(t,i,a-t,s-i,e),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawChamferRectangle(t,i,a,s,e){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawChamferRect(t,i,a-t,s-i,e),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawTorus(t,i,a,s,e,o){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawTorus(t,i,a,s,e?l.toRad(e):0,o?l.toRad(o):0),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawRegularPolygon(t,i,a,s,e){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawRegularPolygon(t,i,s,a,e?l.toRad(e):0),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawStar(t,i,a,s,e,o){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawStar(t,i,a,s,e||s/2,o?l.toRad(o):0),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawArc(t,i,a,s,e,o,h){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.moveTo(t+a*Math.cos(l.toRad(s)),i+a*Math.sin(l.toRad(s))),this._graphics.arc(t,i,a,l.toRad(s),l.toRad(e),!!o),h&&this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawBezierCurve(t,i,a,s,e,o,h,r){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.moveTo(t,i),this._graphics.bezierCurveTo(a,s,e,o,h,r),this._graphics.endFill(),this.invalidateBounds()}drawQuadraticCurve(t,i,a,s,e,o){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.moveTo(t,i),this._graphics.quadraticCurveTo(a,s,e,o),this._graphics.endFill(),this.invalidateBounds()}beginFillPath(){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255)}endFillPath(){this._graphics.endFill(),this.invalidateBounds()}drawPathMoveTo(t,i){this._graphics.moveTo(t,i)}drawPathLineTo(t,i){this._graphics.lineTo(t,i),this.invalidateBounds()}drawPathBezierCurveTo(t,i,a,s,e,o){this._graphics.bezierCurveTo(t,i,a,s,e,o),this.invalidateBounds()}drawPathArc(t,i,a,s,e,o){this._graphics.arc(t,i,a,l.toRad(s),l.toRad(e),!!o),this.invalidateBounds()}drawPathQuadraticCurveTo(t,i,a,s){this._graphics.quadraticCurveTo(t,i,a,s),this.invalidateBounds()}closePath(){this._graphics.closePath(),this.invalidateBounds()}updateOutline(){this._graphics.lineStyle(this._object._outlineSize,this._object._outlineColor,this._object._outlineOpacity/255)}invalidateBounds(){this._object.invalidateBounds(),this._positionXIsUpToDate=!1,this._positionYIsUpToDate=!1}updatePreRender(){this.updatePositionIfNeeded()}updatePositionX(){this._object._useAbsoluteCoordinates?(this._graphics.pivot.x=0,this._graphics.position.x=0):(this._graphics.pivot.x=this._object.getRotationCenterX(),this._graphics.position.x=this._object.x+this._graphics.pivot.x*Math.abs(this._graphics.scale.x)),this._transformationIsUpToDate=!1}updatePositionY(){this._object._useAbsoluteCoordinates?(this._graphics.pivot.y=0,this._graphics.position.y=0):(this._graphics.pivot.y=this._object.getRotationCenterY(),this._graphics.position.y=this._object.y+this._graphics.pivot.y*Math.abs(this._graphics.scale.y)),this._transformationIsUpToDate=!1}updatePositionIfNeeded(){this._positionXIsUpToDate||(this.updatePositionX(),this._positionXIsUpToDate=!0),this._positionYIsUpToDate||(this.updatePositionY(),this._positionYIsUpToDate=!0)}updateTransformationIfNeeded(){this._transformationIsUpToDate||(this.updatePositionIfNeeded(),this._graphics.updateTransform()),this._transformationIsUpToDate=!0}updateRotationCenter(){this._positionXIsUpToDate=!1,this._positionYIsUpToDate=!1,this._transformationIsUpToDate=!1}updateAngle(){this._object._useAbsoluteCoordinates?this._graphics.angle=0:this._graphics.angle=this._object.angle,this._transformationIsUpToDate=!1}updateScaleX(){this._object._useAbsoluteCoordinates?this._graphics.scale.x=1:this._graphics.scale.x=this._object._scaleX,this._positionXIsUpToDate=!1,this._transformationIsUpToDate=!1}updateScaleY(){this._object._useAbsoluteCoordinates?this._graphics.scale.y=1:this._graphics.scale.y=this._object._scaleY,this._positionYIsUpToDate=!1,this._transformationIsUpToDate=!1}getDrawableX(){if(this._object._useAbsoluteCoordinates)return this._graphics.getLocalBounds().left;let t=this._graphics.getLocalBounds().left;if(this._object._flippedX){const i=this._object.getRotationCenterX();t=2*i-t}return this._object.getX()+t*Math.abs(this._graphics.scale.x)}getDrawableY(){if(this._object._useAbsoluteCoordinates)return this._graphics.getLocalBounds().top;let t=this._graphics.getLocalBounds().top;if(this._object._flippedY){const i=this._object.getRotationCenterY();t=2*i-t}return this._object.getY()+t*Math.abs(this._graphics.scale.y)}getWidth(){return this._graphics.width}getHeight(){return this._graphics.height}getUnscaledWidth(){return this._graphics.getLocalBounds().width}getUnscaledHeight(){return this._graphics.getLocalBounds().height}getFrameRelativeOriginX(){return-this._graphics.getLocalBounds().left}getFrameRelativeOriginY(){return-this._graphics.getLocalBounds().top}transformToDrawing(t){this.updateTransformationIfNeeded();const i=n._positionForTransformation;return i.x=t[0],i.y=t[1],this._graphics.localTransform.applyInverse(i,i),t[0]=i.x,t[1]=i.y,t}transformToScene(t){this.updateTransformationIfNeeded();const i=n._positionForTransformation;return i.x=t[0],i.y=t[1],this._graphics.localTransform.apply(i,i),t[0]=i.x,t[1]=i.y,t}updateAntialiasing(){if(this._object.getAntialiasing()!=="none"){this._antialiasingFilter||(this._antialiasingFilter=new PIXI.FXAAFilter);const t=this._antialiasingFilter;t.enabled=!0,t.multisample=PIXI.MSAA_QUALITY[this._object.getAntialiasing().toUpperCase()]||PIXI.MSAA_QUALITY.LOW,this._graphics.filters||(this._graphics.filters=[]),this._graphics.filters.indexOf(t)===-1&&this._graphics.filters.push(t)}else if(this._antialiasingFilter!==null){if(!this._graphics.filters)return;const t=this._graphics.filters.indexOf(this._antialiasingFilter);t!==-1&&this._graphics.filters.splice(t,1)}}destroy(){this._graphics.destroy()}};let c=n;c._positionForTransformation={x:0,y:0},l.ShapePainterRuntimeObjectRenderer=c})(gdjs||(gdjs={}));
|
|
1
|
+
var gdjs;(function(l){const n=class{constructor(t,i){this._positionXIsUpToDate=!1;this._positionYIsUpToDate=!1;this._transformationIsUpToDate=!1;this._antialiasingFilter=null;this._object=t,this._graphics=new PIXI.Graphics,i.getLayer("").getRenderer().addRendererObject(this._graphics,t.getZOrder()),this.updateAntialiasing()}getRendererObject(){return this._graphics}clear(){this._graphics.clear(),this.invalidateBounds()}drawRectangle(t,i,a,s){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawRect(t,i,a-t,s-i),this._graphics.endFill(),this.invalidateBounds()}drawCircle(t,i,a){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawCircle(t,i,a),this._graphics.endFill(),this.invalidateBounds()}drawLine(t,i,a,s,e){if(this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),s===i)this._graphics.drawRect(t,i-e/2,a-t,e);else{const o=Math.atan2(s-i,a-t),h=Math.sin(o)*e,r=Math.cos(o)*e;this._graphics.drawPolygon(t+h,i-r,t-h,i+r,a-h,s+r,a+h,s-r)}this._graphics.endFill(),this.invalidateBounds()}drawLineV2(t,i,a,s,e){this._graphics.lineStyle(e,this._object._outlineColor,this._object._outlineOpacity/255),this._graphics.moveTo(t,i),this._graphics.lineTo(a,s),this._graphics.endFill(),this.invalidateBounds()}drawEllipse(t,i,a,s){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawEllipse(t,i,a/2,s/2),this._graphics.endFill(),this.invalidateBounds()}drawRoundedRectangle(t,i,a,s,e){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawRoundedRect(t,i,a-t,s-i,e),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawFilletRectangle(t,i,a,s,e){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawFilletRect(t,i,a-t,s-i,e),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawChamferRectangle(t,i,a,s,e){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawChamferRect(t,i,a-t,s-i,e),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawTorus(t,i,a,s,e,o){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawTorus(t,i,a,s,e?l.toRad(e):0,o?l.toRad(o):0),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawRegularPolygon(t,i,a,s,e){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawRegularPolygon(t,i,s,a,e?l.toRad(e):0),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawStar(t,i,a,s,e,o){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.drawStar(t,i,a,s,e||s/2,o?l.toRad(o):0),this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawArc(t,i,a,s,e,o,h){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.moveTo(t+a*Math.cos(l.toRad(s)),i+a*Math.sin(l.toRad(s))),this._graphics.arc(t,i,a,l.toRad(s),l.toRad(e),!!o),h&&this._graphics.closePath(),this._graphics.endFill(),this.invalidateBounds()}drawBezierCurve(t,i,a,s,e,o,h,r){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.moveTo(t,i),this._graphics.bezierCurveTo(a,s,e,o,h,r),this._graphics.endFill(),this.invalidateBounds()}drawQuadraticCurve(t,i,a,s,e,o){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255),this._graphics.moveTo(t,i),this._graphics.quadraticCurveTo(a,s,e,o),this._graphics.endFill(),this.invalidateBounds()}beginFillPath(){this.updateOutline(),this._graphics.beginFill(this._object._fillColor,this._object._fillOpacity/255)}endFillPath(){this._graphics.endFill(),this.invalidateBounds()}drawPathMoveTo(t,i){this._graphics.moveTo(t,i)}drawPathLineTo(t,i){this._graphics.lineTo(t,i),this.invalidateBounds()}drawPathBezierCurveTo(t,i,a,s,e,o){this._graphics.bezierCurveTo(t,i,a,s,e,o),this.invalidateBounds()}drawPathArc(t,i,a,s,e,o){this._graphics.arc(t,i,a,l.toRad(s),l.toRad(e),!!o),this.invalidateBounds()}drawPathQuadraticCurveTo(t,i,a,s){this._graphics.quadraticCurveTo(t,i,a,s),this.invalidateBounds()}closePath(){this._graphics.closePath(),this.invalidateBounds()}updateOutline(){this._graphics.lineStyle(this._object._outlineSize,this._object._outlineColor,this._object._outlineOpacity/255)}invalidateBounds(){this._object.invalidateBounds(),this._positionXIsUpToDate=!1,this._positionYIsUpToDate=!1}updatePreRender(){this.updatePositionIfNeeded()}updatePositionX(){this._object._useAbsoluteCoordinates?(this._graphics.pivot.x=0,this._graphics.position.x=0):(this._graphics.pivot.x=this._object.getRotationCenterX(),this._graphics.position.x=this._object.x+this._graphics.pivot.x*Math.abs(this._graphics.scale.x)),this._transformationIsUpToDate=!1}updatePositionY(){this._object._useAbsoluteCoordinates?(this._graphics.pivot.y=0,this._graphics.position.y=0):(this._graphics.pivot.y=this._object.getRotationCenterY(),this._graphics.position.y=this._object.y+this._graphics.pivot.y*Math.abs(this._graphics.scale.y)),this._transformationIsUpToDate=!1}updatePositionIfNeeded(){this._positionXIsUpToDate||(this.updatePositionX(),this._positionXIsUpToDate=!0),this._positionYIsUpToDate||(this.updatePositionY(),this._positionYIsUpToDate=!0)}updateTransformationIfNeeded(){this._transformationIsUpToDate||(this.updatePositionIfNeeded(),this._graphics.updateTransform()),this._transformationIsUpToDate=!0}updateRotationCenter(){this._positionXIsUpToDate=!1,this._positionYIsUpToDate=!1,this._transformationIsUpToDate=!1}updateAngle(){this._object._useAbsoluteCoordinates?this._graphics.angle=0:this._graphics.angle=this._object.angle,this._transformationIsUpToDate=!1}updateScaleX(){this._object._useAbsoluteCoordinates?this._graphics.scale.x=1:this._graphics.scale.x=this._object._scaleX,this._positionXIsUpToDate=!1,this._transformationIsUpToDate=!1}updateScaleY(){this._object._useAbsoluteCoordinates?this._graphics.scale.y=1:this._graphics.scale.y=this._object._scaleY,this._positionYIsUpToDate=!1,this._transformationIsUpToDate=!1}getDrawableX(){if(this._object._useAbsoluteCoordinates)return this._graphics.getLocalBounds().left;let t=this._graphics.getLocalBounds().left;if(this._object._flippedX){const i=this._object.getRotationCenterX();t=2*i-t}return this._object.getX()+t*Math.abs(this._graphics.scale.x)}getDrawableY(){if(this._object._useAbsoluteCoordinates)return this._graphics.getLocalBounds().top;let t=this._graphics.getLocalBounds().top;if(this._object._flippedY){const i=this._object.getRotationCenterY();t=2*i-t}return this._object.getY()+t*Math.abs(this._graphics.scale.y)}getWidth(){return this._graphics.width}getHeight(){return this._graphics.height}getUnscaledWidth(){return this._graphics.getLocalBounds().width}getUnscaledHeight(){return this._graphics.getLocalBounds().height}getFrameRelativeOriginX(){return-this._graphics.getLocalBounds().left}getFrameRelativeOriginY(){return-this._graphics.getLocalBounds().top}transformToDrawing(t){this.updateTransformationIfNeeded();const i=n._positionForTransformation;return i.x=t[0],i.y=t[1],this._graphics.localTransform.applyInverse(i,i),t[0]=i.x,t[1]=i.y,t}transformToScene(t){this.updateTransformationIfNeeded();const i=n._positionForTransformation;return i.x=t[0],i.y=t[1],this._graphics.localTransform.apply(i,i),t[0]=i.x,t[1]=i.y,t}updateAntialiasing(){if(this._object.getAntialiasing()!=="none"){this._antialiasingFilter||(this._antialiasingFilter=new PIXI.FXAAFilter);const t=this._antialiasingFilter;t.enabled=!0,t.multisample=PIXI.MSAA_QUALITY[this._object.getAntialiasing().toUpperCase()]||PIXI.MSAA_QUALITY.LOW,this._graphics.filters||(this._graphics.filters=[]),this._graphics.filters.indexOf(t)===-1&&this._graphics.filters.push(t)}else if(this._antialiasingFilter!==null){if(!this._graphics.filters)return;const t=this._graphics.filters.indexOf(this._antialiasingFilter);t!==-1&&this._graphics.filters.splice(t,1)}}destroy(){this._graphics.destroy()}};let c=n;c._positionForTransformation={x:0,y:0},l.ShapePainterRuntimeObjectRenderer=c})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=shapepainterruntimeobject-pixi-renderer.js.map
|
package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../GDevelop/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.ts"],
|
|
4
|
-
"sourcesContent": ["namespace gdjs {\n class ShapePainterRuntimeObjectPixiRenderer {\n _object: gdjs.ShapePainterRuntimeObject;\n _graphics: PIXI.Graphics;\n /**\n * Graphics positions can need updates when shapes are added,\n * this avoids to do it each time.\n */\n _positionXIsUpToDate = false;\n /**\n * Graphics positions can need updates when shapes are added,\n * this avoids to do it each time.\n */\n _positionYIsUpToDate = false;\n /**\n * This allows to use the transformation of the renderer\n * and compute it only when necessary.\n */\n _transformationIsUpToDate = false;\n\n _antialiasingFilter: null | PIXI.Filter = null;\n\n private static readonly _positionForTransformation: PIXI.IPointData = {\n x: 0,\n y: 0,\n };\n\n constructor(\n runtimeObject: gdjs.ShapePainterRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n this._object = runtimeObject;\n this._graphics = new PIXI.Graphics();\n instanceContainer\n .getLayer('')\n .getRenderer()\n .addRendererObject(this._graphics, runtimeObject.getZOrder());\n this.updateAntialiasing();\n }\n\n getRendererObject() {\n return this._graphics;\n }\n\n clear() {\n this._graphics.clear();\n this.invalidateBounds();\n }\n\n drawRectangle(x1: float, y1: float, x2: float, y2: float) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.drawRect(x1, y1, x2 - x1, y2 - y1);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawCircle(x: float, y: float, radius: float) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.drawCircle(x, y, radius);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawLine(x1: float, y1: float, x2: float, y2: float, thickness: float) {\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n if (y2 === y1) {\n this._graphics.drawRect(x1, y1 - thickness / 2, x2 - x1, thickness);\n } else {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const xIncrement = Math.sin(angle) * thickness;\n const yIncrement = Math.cos(angle) * thickness;\n this._graphics.drawPolygon(\n x1 + xIncrement,\n y1 - yIncrement,\n x1 - xIncrement,\n y1 + yIncrement,\n x2 - xIncrement,\n y2 + yIncrement,\n x2 + xIncrement,\n y2 - yIncrement\n );\n }\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawLineV2(x1: float, y1: float, x2: float, y2: float, thickness: float) {\n this._graphics.lineStyle(\n thickness,\n this._object._outlineColor,\n this._object._outlineOpacity / 255\n );\n this._graphics.moveTo(x1, y1);\n this._graphics.lineTo(x2, y2);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawEllipse(x1: float, y1: float, width: float, height: float) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.drawEllipse(x1, y1, width / 2, height / 2);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawRoundedRectangle(\n x1: float,\n y1: float,\n x2: float,\n y2: float,\n radius: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.drawRoundedRect(x1, y1, x2 - x1, y2 - y1, radius);\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawChamferRectangle(\n x1: float,\n y1: float,\n x2: float,\n y2: float,\n chamfer: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawChamferRect(x1, y1, x2 - x1, y2 - y1, chamfer);\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawTorus(\n x1: float,\n y1: float,\n innerRadius: float,\n outerRadius: float,\n startArc: float,\n endArc: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawTorus(\n x1,\n y1,\n innerRadius,\n outerRadius,\n startArc ? gdjs.toRad(startArc) : 0,\n endArc ? gdjs.toRad(endArc) : 0\n );\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawRegularPolygon(\n x1: float,\n y1: float,\n sides: float,\n radius: float,\n rotation: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawRegularPolygon(\n x1,\n y1,\n radius,\n sides,\n rotation ? gdjs.toRad(rotation) : 0\n );\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawStar(\n x1: float,\n y1: float,\n points: float,\n radius: float,\n innerRadius: float,\n rotation: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawStar(\n x1,\n y1,\n points,\n radius,\n innerRadius ? innerRadius : radius / 2,\n rotation ? gdjs.toRad(rotation) : 0\n );\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawArc(\n x1: float,\n y1: float,\n radius: float,\n startAngle: float,\n endAngle: float,\n anticlockwise: boolean,\n closePath: boolean\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.moveTo(\n x1 + radius * Math.cos(gdjs.toRad(startAngle)),\n y1 + radius * Math.sin(gdjs.toRad(startAngle))\n );\n this._graphics.arc(\n x1,\n y1,\n radius,\n gdjs.toRad(startAngle),\n gdjs.toRad(endAngle),\n anticlockwise ? true : false\n );\n if (closePath) {\n this._graphics.closePath();\n }\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawBezierCurve(\n x1: float,\n y1: float,\n cpX: float,\n cpY: float,\n cpX2: float,\n cpY2: float,\n x2: float,\n y2: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.moveTo(x1, y1);\n this._graphics.bezierCurveTo(cpX, cpY, cpX2, cpY2, x2, y2);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawQuadraticCurve(\n x1: float,\n y1: float,\n cpX: float,\n cpY: float,\n x2: float,\n y2: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.moveTo(x1, y1);\n this._graphics.quadraticCurveTo(cpX, cpY, x2, y2);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n beginFillPath() {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n }\n\n endFillPath() {\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawPathMoveTo(x1: float, y1: float) {\n this._graphics.moveTo(x1, y1);\n }\n\n drawPathLineTo(x1: float, y1: float) {\n this._graphics.lineTo(x1, y1);\n this.invalidateBounds();\n }\n\n drawPathBezierCurveTo(\n cpX: float,\n cpY: float,\n cpX2: float,\n cpY2: float,\n toX: float,\n toY: float\n ) {\n this._graphics.bezierCurveTo(cpX, cpY, cpX2, cpY2, toX, toY);\n this.invalidateBounds();\n }\n\n drawPathArc(\n x1: float,\n y1: float,\n radius: float,\n startAngle: float,\n endAngle: float,\n anticlockwise: boolean\n ) {\n this._graphics.arc(\n x1,\n y1,\n radius,\n gdjs.toRad(startAngle),\n gdjs.toRad(endAngle),\n anticlockwise ? true : false\n );\n this.invalidateBounds();\n }\n\n drawPathQuadraticCurveTo(cpX: float, cpY: float, toX: float, toY: float) {\n this._graphics.quadraticCurveTo(cpX, cpY, toX, toY);\n this.invalidateBounds();\n }\n\n closePath() {\n this._graphics.closePath();\n this.invalidateBounds();\n }\n\n updateOutline(): void {\n this._graphics.lineStyle(\n this._object._outlineSize,\n this._object._outlineColor,\n this._object._outlineOpacity / 255\n );\n }\n\n invalidateBounds() {\n this._object.invalidateBounds();\n this._positionXIsUpToDate = false;\n this._positionYIsUpToDate = false;\n }\n\n updatePreRender(): void {\n this.updatePositionIfNeeded();\n }\n\n updatePositionX(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.pivot.x = 0;\n this._graphics.position.x = 0;\n } else {\n // Make the drawing rotate around the rotation center.\n this._graphics.pivot.x = this._object.getRotationCenterX();\n // Multiply by the scale to have the scale anchor\n // at the object position instead of the center.\n this._graphics.position.x =\n this._object.x +\n this._graphics.pivot.x * Math.abs(this._graphics.scale.x);\n }\n this._transformationIsUpToDate = false;\n }\n\n updatePositionY(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.pivot.y = 0;\n this._graphics.position.y = 0;\n } else {\n this._graphics.pivot.y = this._object.getRotationCenterY();\n this._graphics.position.y =\n this._object.y +\n this._graphics.pivot.y * Math.abs(this._graphics.scale.y);\n }\n this._transformationIsUpToDate = false;\n }\n\n updatePositionIfNeeded() {\n if (!this._positionXIsUpToDate) {\n this.updatePositionX();\n this._positionXIsUpToDate = true;\n }\n if (!this._positionYIsUpToDate) {\n this.updatePositionY();\n this._positionYIsUpToDate = true;\n }\n }\n\n updateTransformationIfNeeded() {\n if (!this._transformationIsUpToDate) {\n this.updatePositionIfNeeded();\n this._graphics.updateTransform();\n }\n this._transformationIsUpToDate = true;\n }\n\n updateRotationCenter(): void {\n // The pivot and position depends on the rotation center point.\n this._positionXIsUpToDate = false;\n this._positionYIsUpToDate = false;\n // The whole transformation changes based on the rotation center point.\n this._transformationIsUpToDate = false;\n }\n\n updateAngle(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.angle = 0;\n } else {\n this._graphics.angle = this._object.angle;\n }\n this._transformationIsUpToDate = false;\n }\n\n updateScaleX(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.scale.x = 1;\n } else {\n this._graphics.scale.x = this._object._scaleX;\n }\n // updatePositionX() uses scale.x\n this._positionXIsUpToDate = false;\n this._transformationIsUpToDate = false;\n }\n\n updateScaleY(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.scale.y = 1;\n } else {\n this._graphics.scale.y = this._object._scaleY;\n }\n // updatePositionY() uses scale.y\n this._positionYIsUpToDate = false;\n this._transformationIsUpToDate = false;\n }\n\n getDrawableX(): float {\n if (this._object._useAbsoluteCoordinates) {\n return this._graphics.getLocalBounds().left;\n }\n let localBound = this._graphics.getLocalBounds().left;\n if (this._object._flippedX) {\n const rotationCenterX = this._object.getRotationCenterX();\n localBound = 2 * rotationCenterX - localBound;\n }\n // When new shape are drawn, the bounds of the object can extend.\n // The object position stays the same but (drawableX; drawableY) can change.\n return (\n this._object.getX() + localBound * Math.abs(this._graphics.scale.x)\n );\n }\n\n getDrawableY(): float {\n if (this._object._useAbsoluteCoordinates) {\n return this._graphics.getLocalBounds().top;\n }\n let localBound = this._graphics.getLocalBounds().top;\n if (this._object._flippedY) {\n const rotationCenterY = this._object.getRotationCenterY();\n localBound = 2 * rotationCenterY - localBound;\n }\n return (\n this._object.getY() + localBound * Math.abs(this._graphics.scale.y)\n );\n }\n\n getWidth(): float {\n return this._graphics.width;\n }\n\n getHeight(): float {\n return this._graphics.height;\n }\n\n getUnscaledWidth(): float {\n return this._graphics.getLocalBounds().width;\n }\n\n getUnscaledHeight(): float {\n return this._graphics.getLocalBounds().height;\n }\n\n /**\n * @returns The drawing origin relatively to the drawable top left corner.\n */\n getFrameRelativeOriginX() {\n return -this._graphics.getLocalBounds().left;\n }\n\n /**\n * @returns The drawing origin relatively to the drawable top left corner.\n */\n getFrameRelativeOriginY() {\n return -this._graphics.getLocalBounds().top;\n }\n\n transformToDrawing(point: FloatPoint): FloatPoint {\n this.updateTransformationIfNeeded();\n const position =\n ShapePainterRuntimeObjectPixiRenderer._positionForTransformation;\n position.x = point[0];\n position.y = point[1];\n this._graphics.localTransform.applyInverse(position, position);\n point[0] = position.x;\n point[1] = position.y;\n return point;\n }\n\n transformToScene(point: FloatPoint): FloatPoint {\n this.updateTransformationIfNeeded();\n const position =\n ShapePainterRuntimeObjectPixiRenderer._positionForTransformation;\n position.x = point[0];\n position.y = point[1];\n this._graphics.localTransform.apply(position, position);\n point[0] = position.x;\n point[1] = position.y;\n return point;\n }\n\n updateAntialiasing(): void {\n if (this._object.getAntialiasing() !== 'none') {\n if (!this._antialiasingFilter) {\n this._antialiasingFilter = new PIXI.FXAAFilter();\n }\n\n const antialiasingFilter = this._antialiasingFilter;\n antialiasingFilter.enabled = true;\n antialiasingFilter.multisample =\n PIXI.MSAA_QUALITY[this._object.getAntialiasing().toUpperCase()] ||\n PIXI.MSAA_QUALITY.LOW;\n\n if (!this._graphics.filters) {\n this._graphics.filters = [];\n }\n // Do not apply the filter if it is already present on the object.\n if (this._graphics.filters.indexOf(antialiasingFilter) === -1) {\n this._graphics.filters.push(antialiasingFilter);\n }\n } else if (this._antialiasingFilter !== null) {\n if (!this._graphics.filters) {\n return;\n }\n const antialiasingFilterIndex = this._graphics.filters.indexOf(\n this._antialiasingFilter\n );\n\n if (antialiasingFilterIndex !== -1) {\n this._graphics.filters.splice(antialiasingFilterIndex, 1);\n }\n }\n }\n\n destroy(): void {\n this._graphics.destroy();\n }\n }\n\n export const ShapePainterRuntimeObjectRenderer = ShapePainterRuntimeObjectPixiRenderer;\n export type ShapePainterRuntimeObjectRenderer = ShapePainterRuntimeObjectPixiRenderer;\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["namespace gdjs {\n class ShapePainterRuntimeObjectPixiRenderer {\n _object: gdjs.ShapePainterRuntimeObject;\n _graphics: PIXI.Graphics;\n /**\n * Graphics positions can need updates when shapes are added,\n * this avoids to do it each time.\n */\n _positionXIsUpToDate = false;\n /**\n * Graphics positions can need updates when shapes are added,\n * this avoids to do it each time.\n */\n _positionYIsUpToDate = false;\n /**\n * This allows to use the transformation of the renderer\n * and compute it only when necessary.\n */\n _transformationIsUpToDate = false;\n\n _antialiasingFilter: null | PIXI.Filter = null;\n\n private static readonly _positionForTransformation: PIXI.IPointData = {\n x: 0,\n y: 0,\n };\n\n constructor(\n runtimeObject: gdjs.ShapePainterRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n this._object = runtimeObject;\n this._graphics = new PIXI.Graphics();\n instanceContainer\n .getLayer('')\n .getRenderer()\n .addRendererObject(this._graphics, runtimeObject.getZOrder());\n this.updateAntialiasing();\n }\n\n getRendererObject() {\n return this._graphics;\n }\n\n clear() {\n this._graphics.clear();\n this.invalidateBounds();\n }\n\n drawRectangle(x1: float, y1: float, x2: float, y2: float) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.drawRect(x1, y1, x2 - x1, y2 - y1);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawCircle(x: float, y: float, radius: float) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.drawCircle(x, y, radius);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawLine(x1: float, y1: float, x2: float, y2: float, thickness: float) {\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n if (y2 === y1) {\n this._graphics.drawRect(x1, y1 - thickness / 2, x2 - x1, thickness);\n } else {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const xIncrement = Math.sin(angle) * thickness;\n const yIncrement = Math.cos(angle) * thickness;\n this._graphics.drawPolygon(\n x1 + xIncrement,\n y1 - yIncrement,\n x1 - xIncrement,\n y1 + yIncrement,\n x2 - xIncrement,\n y2 + yIncrement,\n x2 + xIncrement,\n y2 - yIncrement\n );\n }\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawLineV2(x1: float, y1: float, x2: float, y2: float, thickness: float) {\n this._graphics.lineStyle(\n thickness,\n this._object._outlineColor,\n this._object._outlineOpacity / 255\n );\n this._graphics.moveTo(x1, y1);\n this._graphics.lineTo(x2, y2);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawEllipse(x1: float, y1: float, width: float, height: float) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.drawEllipse(x1, y1, width / 2, height / 2);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawRoundedRectangle(\n x1: float,\n y1: float,\n x2: float,\n y2: float,\n radius: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.drawRoundedRect(x1, y1, x2 - x1, y2 - y1, radius);\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawFilletRectangle(\n x1: float,\n y1: float,\n x2: float,\n y2: float,\n fillet: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawFilletRect(x1, y1, x2 - x1, y2 - y1, fillet);\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawChamferRectangle(\n x1: float,\n y1: float,\n x2: float,\n y2: float,\n chamfer: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawChamferRect(x1, y1, x2 - x1, y2 - y1, chamfer);\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawTorus(\n x1: float,\n y1: float,\n innerRadius: float,\n outerRadius: float,\n startArc: float,\n endArc: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawTorus(\n x1,\n y1,\n innerRadius,\n outerRadius,\n startArc ? gdjs.toRad(startArc) : 0,\n endArc ? gdjs.toRad(endArc) : 0\n );\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawRegularPolygon(\n x1: float,\n y1: float,\n sides: float,\n radius: float,\n rotation: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawRegularPolygon(\n x1,\n y1,\n radius,\n sides,\n rotation ? gdjs.toRad(rotation) : 0\n );\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawStar(\n x1: float,\n y1: float,\n points: float,\n radius: float,\n innerRadius: float,\n rotation: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n //@ts-ignore from @pixi/graphics-extras\n this._graphics.drawStar(\n x1,\n y1,\n points,\n radius,\n innerRadius ? innerRadius : radius / 2,\n rotation ? gdjs.toRad(rotation) : 0\n );\n this._graphics.closePath();\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawArc(\n x1: float,\n y1: float,\n radius: float,\n startAngle: float,\n endAngle: float,\n anticlockwise: boolean,\n closePath: boolean\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.moveTo(\n x1 + radius * Math.cos(gdjs.toRad(startAngle)),\n y1 + radius * Math.sin(gdjs.toRad(startAngle))\n );\n this._graphics.arc(\n x1,\n y1,\n radius,\n gdjs.toRad(startAngle),\n gdjs.toRad(endAngle),\n anticlockwise ? true : false\n );\n if (closePath) {\n this._graphics.closePath();\n }\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawBezierCurve(\n x1: float,\n y1: float,\n cpX: float,\n cpY: float,\n cpX2: float,\n cpY2: float,\n x2: float,\n y2: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.moveTo(x1, y1);\n this._graphics.bezierCurveTo(cpX, cpY, cpX2, cpY2, x2, y2);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawQuadraticCurve(\n x1: float,\n y1: float,\n cpX: float,\n cpY: float,\n x2: float,\n y2: float\n ) {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n this._graphics.moveTo(x1, y1);\n this._graphics.quadraticCurveTo(cpX, cpY, x2, y2);\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n beginFillPath() {\n this.updateOutline();\n this._graphics.beginFill(\n this._object._fillColor,\n this._object._fillOpacity / 255\n );\n }\n\n endFillPath() {\n this._graphics.endFill();\n this.invalidateBounds();\n }\n\n drawPathMoveTo(x1: float, y1: float) {\n this._graphics.moveTo(x1, y1);\n }\n\n drawPathLineTo(x1: float, y1: float) {\n this._graphics.lineTo(x1, y1);\n this.invalidateBounds();\n }\n\n drawPathBezierCurveTo(\n cpX: float,\n cpY: float,\n cpX2: float,\n cpY2: float,\n toX: float,\n toY: float\n ) {\n this._graphics.bezierCurveTo(cpX, cpY, cpX2, cpY2, toX, toY);\n this.invalidateBounds();\n }\n\n drawPathArc(\n x1: float,\n y1: float,\n radius: float,\n startAngle: float,\n endAngle: float,\n anticlockwise: boolean\n ) {\n this._graphics.arc(\n x1,\n y1,\n radius,\n gdjs.toRad(startAngle),\n gdjs.toRad(endAngle),\n anticlockwise ? true : false\n );\n this.invalidateBounds();\n }\n\n drawPathQuadraticCurveTo(cpX: float, cpY: float, toX: float, toY: float) {\n this._graphics.quadraticCurveTo(cpX, cpY, toX, toY);\n this.invalidateBounds();\n }\n\n closePath() {\n this._graphics.closePath();\n this.invalidateBounds();\n }\n\n updateOutline(): void {\n this._graphics.lineStyle(\n this._object._outlineSize,\n this._object._outlineColor,\n this._object._outlineOpacity / 255\n );\n }\n\n invalidateBounds() {\n this._object.invalidateBounds();\n this._positionXIsUpToDate = false;\n this._positionYIsUpToDate = false;\n }\n\n updatePreRender(): void {\n this.updatePositionIfNeeded();\n }\n\n updatePositionX(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.pivot.x = 0;\n this._graphics.position.x = 0;\n } else {\n // Make the drawing rotate around the rotation center.\n this._graphics.pivot.x = this._object.getRotationCenterX();\n // Multiply by the scale to have the scale anchor\n // at the object position instead of the center.\n this._graphics.position.x =\n this._object.x +\n this._graphics.pivot.x * Math.abs(this._graphics.scale.x);\n }\n this._transformationIsUpToDate = false;\n }\n\n updatePositionY(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.pivot.y = 0;\n this._graphics.position.y = 0;\n } else {\n this._graphics.pivot.y = this._object.getRotationCenterY();\n this._graphics.position.y =\n this._object.y +\n this._graphics.pivot.y * Math.abs(this._graphics.scale.y);\n }\n this._transformationIsUpToDate = false;\n }\n\n updatePositionIfNeeded() {\n if (!this._positionXIsUpToDate) {\n this.updatePositionX();\n this._positionXIsUpToDate = true;\n }\n if (!this._positionYIsUpToDate) {\n this.updatePositionY();\n this._positionYIsUpToDate = true;\n }\n }\n\n updateTransformationIfNeeded() {\n if (!this._transformationIsUpToDate) {\n this.updatePositionIfNeeded();\n this._graphics.updateTransform();\n }\n this._transformationIsUpToDate = true;\n }\n\n updateRotationCenter(): void {\n // The pivot and position depends on the rotation center point.\n this._positionXIsUpToDate = false;\n this._positionYIsUpToDate = false;\n // The whole transformation changes based on the rotation center point.\n this._transformationIsUpToDate = false;\n }\n\n updateAngle(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.angle = 0;\n } else {\n this._graphics.angle = this._object.angle;\n }\n this._transformationIsUpToDate = false;\n }\n\n updateScaleX(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.scale.x = 1;\n } else {\n this._graphics.scale.x = this._object._scaleX;\n }\n // updatePositionX() uses scale.x\n this._positionXIsUpToDate = false;\n this._transformationIsUpToDate = false;\n }\n\n updateScaleY(): void {\n if (this._object._useAbsoluteCoordinates) {\n this._graphics.scale.y = 1;\n } else {\n this._graphics.scale.y = this._object._scaleY;\n }\n // updatePositionY() uses scale.y\n this._positionYIsUpToDate = false;\n this._transformationIsUpToDate = false;\n }\n\n getDrawableX(): float {\n if (this._object._useAbsoluteCoordinates) {\n return this._graphics.getLocalBounds().left;\n }\n let localBound = this._graphics.getLocalBounds().left;\n if (this._object._flippedX) {\n const rotationCenterX = this._object.getRotationCenterX();\n localBound = 2 * rotationCenterX - localBound;\n }\n // When new shape are drawn, the bounds of the object can extend.\n // The object position stays the same but (drawableX; drawableY) can change.\n return (\n this._object.getX() + localBound * Math.abs(this._graphics.scale.x)\n );\n }\n\n getDrawableY(): float {\n if (this._object._useAbsoluteCoordinates) {\n return this._graphics.getLocalBounds().top;\n }\n let localBound = this._graphics.getLocalBounds().top;\n if (this._object._flippedY) {\n const rotationCenterY = this._object.getRotationCenterY();\n localBound = 2 * rotationCenterY - localBound;\n }\n return (\n this._object.getY() + localBound * Math.abs(this._graphics.scale.y)\n );\n }\n\n getWidth(): float {\n return this._graphics.width;\n }\n\n getHeight(): float {\n return this._graphics.height;\n }\n\n getUnscaledWidth(): float {\n return this._graphics.getLocalBounds().width;\n }\n\n getUnscaledHeight(): float {\n return this._graphics.getLocalBounds().height;\n }\n\n /**\n * @returns The drawing origin relatively to the drawable top left corner.\n */\n getFrameRelativeOriginX() {\n return -this._graphics.getLocalBounds().left;\n }\n\n /**\n * @returns The drawing origin relatively to the drawable top left corner.\n */\n getFrameRelativeOriginY() {\n return -this._graphics.getLocalBounds().top;\n }\n\n transformToDrawing(point: FloatPoint): FloatPoint {\n this.updateTransformationIfNeeded();\n const position =\n ShapePainterRuntimeObjectPixiRenderer._positionForTransformation;\n position.x = point[0];\n position.y = point[1];\n this._graphics.localTransform.applyInverse(position, position);\n point[0] = position.x;\n point[1] = position.y;\n return point;\n }\n\n transformToScene(point: FloatPoint): FloatPoint {\n this.updateTransformationIfNeeded();\n const position =\n ShapePainterRuntimeObjectPixiRenderer._positionForTransformation;\n position.x = point[0];\n position.y = point[1];\n this._graphics.localTransform.apply(position, position);\n point[0] = position.x;\n point[1] = position.y;\n return point;\n }\n\n updateAntialiasing(): void {\n if (this._object.getAntialiasing() !== 'none') {\n if (!this._antialiasingFilter) {\n this._antialiasingFilter = new PIXI.FXAAFilter();\n }\n\n const antialiasingFilter = this._antialiasingFilter;\n antialiasingFilter.enabled = true;\n antialiasingFilter.multisample =\n PIXI.MSAA_QUALITY[this._object.getAntialiasing().toUpperCase()] ||\n PIXI.MSAA_QUALITY.LOW;\n\n if (!this._graphics.filters) {\n this._graphics.filters = [];\n }\n // Do not apply the filter if it is already present on the object.\n if (this._graphics.filters.indexOf(antialiasingFilter) === -1) {\n this._graphics.filters.push(antialiasingFilter);\n }\n } else if (this._antialiasingFilter !== null) {\n if (!this._graphics.filters) {\n return;\n }\n const antialiasingFilterIndex = this._graphics.filters.indexOf(\n this._antialiasingFilter\n );\n\n if (antialiasingFilterIndex !== -1) {\n this._graphics.filters.splice(antialiasingFilterIndex, 1);\n }\n }\n }\n\n destroy(): void {\n this._graphics.destroy();\n }\n }\n\n export const ShapePainterRuntimeObjectRenderer = ShapePainterRuntimeObjectPixiRenderer;\n export type ShapePainterRuntimeObjectRenderer = ShapePainterRuntimeObjectPixiRenderer;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var gdjs;(function(
|
|
1
|
+
var gdjs;(function(a){const n=class extends a.RuntimeObject{constructor(e,t){super(e,t);this._scaleX=1;this._scaleY=1;this._blendMode=0;this._flippedX=!1;this._flippedY=!1;this._customCenter=null;this._customCollisionMask=null;this._fillColor=parseInt(a.rgbToHex(t.fillColor.r,t.fillColor.g,t.fillColor.b),16),this._outlineColor=parseInt(a.rgbToHex(t.outlineColor.r,t.outlineColor.g,t.outlineColor.b),16),this._fillOpacity=t.fillOpacity,this._outlineOpacity=t.outlineOpacity,this._outlineSize=t.outlineSize,this._useAbsoluteCoordinates=t.absoluteCoordinates,this._clearBetweenFrames=t.clearBetweenFrames,this._antialiasing=t.antialiasing,this._renderer=new a.ShapePainterRuntimeObjectRenderer(this,e),this.onCreated()}getRendererObject(){return this._renderer.getRendererObject()}updateFromObjectData(e,t){return(e.fillColor.r!==t.fillColor.r||e.fillColor.g!==t.fillColor.g||e.fillColor.b!==t.fillColor.b)&&this.setFillColor(""+t.fillColor.r+";"+t.fillColor.g+";"+t.fillColor.b),(e.outlineColor.r!==t.outlineColor.r||e.outlineColor.g!==t.outlineColor.g||e.outlineColor.b!==t.outlineColor.b)&&this.setOutlineColor(""+t.outlineColor.r+";"+t.outlineColor.g+";"+t.outlineColor.b),e.fillOpacity!==t.fillOpacity&&this.setFillOpacity(t.fillOpacity),e.outlineOpacity!==t.outlineOpacity&&this.setOutlineOpacity(t.outlineOpacity),e.outlineSize!==t.outlineSize&&this.setOutlineSize(t.outlineSize),e.absoluteCoordinates!==t.absoluteCoordinates&&(this._useAbsoluteCoordinates=t.absoluteCoordinates,this._renderer.updatePositionX(),this._renderer.updatePositionY(),this._renderer.updateAngle(),this._renderer.updateScaleX(),this._renderer.updateScaleY()),e.clearBetweenFrames!==t.clearBetweenFrames&&(this._clearBetweenFrames=t.clearBetweenFrames),!0}stepBehaviorsPreEvents(e){this._clearBetweenFrames&&this.clear(),super.stepBehaviorsPreEvents(e)}onDestroyed(){super.onDestroyed(),this._renderer.destroy()}clear(){this._renderer.clear()}getVisibilityAABB(){return this._useAbsoluteCoordinates?null:this.getAABB()}drawRectangle(e,t,r,o){this._renderer.drawRectangle(e,t,r,o)}drawCircle(e,t,r){this._renderer.drawCircle(e,t,r)}drawLine(e,t,r,o,i){this._renderer.drawLine(e,t,r,o,i)}drawLineV2(e,t,r,o,i){this._renderer.drawLineV2(e,t,r,o,i)}drawEllipse(e,t,r,o){this._renderer.drawEllipse(e,t,r,o)}drawFilletRectangle(e,t,r,o,i){this._renderer.drawFilletRectangle(e,t,r,o,i)}drawRoundedRectangle(e,t,r,o,i){this._renderer.drawRoundedRectangle(e,t,r,o,i)}drawChamferRectangle(e,t,r,o,i){this._renderer.drawChamferRectangle(e,t,r,o,i)}drawTorus(e,t,r,o,i,l){this._renderer.drawTorus(e,t,r,o,i,l)}drawRegularPolygon(e,t,r,o,i){this._renderer.drawRegularPolygon(e,t,r,o,i)}drawStar(e,t,r,o,i,l){this._renderer.drawStar(e,t,r,o,i,l)}drawArc(e,t,r,o,i,l,s){this._renderer.drawArc(e,t,r,o,i,l,s)}drawBezierCurve(e,t,r,o,i,l,s,h){this._renderer.drawBezierCurve(e,t,r,o,i,l,s,h)}drawQuadraticCurve(e,t,r,o,i,l){this._renderer.drawQuadraticCurve(e,t,r,o,i,l)}beginFillPath(e,t){this._renderer.beginFillPath(),this._renderer.drawPathMoveTo(e,t)}endFillPath(){this._renderer.endFillPath()}drawPathMoveTo(e,t){this._renderer.drawPathMoveTo(e,t)}drawPathLineTo(e,t){this._renderer.drawPathLineTo(e,t)}drawPathBezierCurveTo(e,t,r,o,i,l){this._renderer.drawPathBezierCurveTo(e,t,r,o,i,l)}drawPathArc(e,t,r,o,i,l){this._renderer.drawPathArc(e,t,r,o,i,l)}drawPathQuadraticCurveTo(e,t,r,o){this._renderer.drawPathQuadraticCurveTo(e,t,r,o)}closePath(){this._renderer.closePath()}setClearBetweenFrames(e){this._clearBetweenFrames=e}isClearedBetweenFrames(){return this._clearBetweenFrames}setAntialiasing(e){this._antialiasing=e,this._renderer.updateAntialiasing()}getAntialiasing(){return this._antialiasing}checkAntialiasing(e){return this._antialiasing===e}setCoordinatesRelative(e){this._useAbsoluteCoordinates=!e}areCoordinatesRelative(){return!this._useAbsoluteCoordinates}setFillColor(e){const t=e.split(";");t.length<3||(this._fillColor=parseInt(a.rgbToHex(parseInt(t[0],10),parseInt(t[1],10),parseInt(t[2],10)),16))}getFillColorR(){return a.hexNumberToRGB(this._fillColor).r}getFillColorG(){return a.hexNumberToRGB(this._fillColor).g}getFillColorB(){return a.hexNumberToRGB(this._fillColor).b}setOutlineColor(e){const t=e.split(";");t.length<3||(this._outlineColor=parseInt(a.rgbToHex(parseInt(t[0],10),parseInt(t[1],10),parseInt(t[2],10)),16),this._renderer.updateOutline())}getOutlineColorR(){return a.hexNumberToRGB(this._outlineColor).r}getOutlineColorG(){return a.hexNumberToRGB(this._outlineColor).g}getOutlineColorB(){return a.hexNumberToRGB(this._outlineColor).b}setOutlineSize(e){this._outlineSize=e,this._renderer.updateOutline()}getOutlineSize(){return this._outlineSize}setFillOpacity(e){this._fillOpacity=e}getFillOpacity(){return this._fillOpacity}setOutlineOpacity(e){this._outlineOpacity=e,this._renderer.updateOutline()}getOutlineOpacity(){return this._outlineOpacity}setX(e){e!==this.x&&(super.setX(e),this._renderer.updatePositionX())}setY(e){e!==this.y&&(super.setY(e),this._renderer.updatePositionY())}setAngle(e){e!==this.angle&&(super.setAngle(e),this._renderer.updateAngle(),this.invalidateHitboxes())}setRotationCenter(e,t){this._customCenter||(this._customCenter=[0,0]),this._customCenter[0]=e,this._customCenter[1]=t,this._renderer.updateRotationCenter()}getRotationCenterX(){return this._customCenter?this._customCenter[0]:this._renderer.getUnscaledWidth()/2-this._renderer.getFrameRelativeOriginX()}getRotationCenterY(){return this._customCenter?this._customCenter[1]:this._renderer.getUnscaledHeight()/2-this._renderer.getFrameRelativeOriginY()}getCenterX(){return this._customCenter?this._customCenter[0]*Math.abs(this._scaleX)+this.getX()-this.getDrawableX():super.getCenterX()}getCenterY(){return this._customCenter?this._customCenter[1]*Math.abs(this._scaleY)+this.getY()-this.getDrawableY():super.getCenterY()}setWidth(e){const t=this._renderer.getUnscaledWidth();t!==0&&this.setScaleX(e/t)}setHeight(e){const t=this._renderer.getUnscaledHeight();t!==0&&this.setScaleY(e/t)}setSize(e,t){this.setWidth(e),this.setHeight(t)}setScale(e){this.setScaleX(e),this.setScaleY(e)}setScaleX(e){e<0&&(e=0),e!==Math.abs(this._scaleX)&&(this._scaleX=e*(this._flippedX?-1:1),this._renderer.updateScaleX(),this.invalidateHitboxes())}setScaleY(e){e<0&&(e=0),e!==Math.abs(this._scaleY)&&(this._scaleY=e*(this._flippedY?-1:1),this._renderer.updateScaleY(),this.invalidateHitboxes())}flipX(e){e!==this._flippedX&&(this._scaleX*=-1,this._flippedX=e,this._renderer.updateScaleX(),this.invalidateHitboxes())}flipY(e){e!==this._flippedY&&(this._scaleY*=-1,this._flippedY=e,this._renderer.updateScaleY(),this.invalidateHitboxes())}isFlippedX(){return this._flippedX}isFlippedY(){return this._flippedY}getScale(){const e=Math.abs(this._scaleX),t=Math.abs(this._scaleY);return e===t?e:Math.sqrt(e*t)}getScaleY(){return Math.abs(this._scaleY)}getScaleX(){return Math.abs(this._scaleX)}invalidateBounds(){this.invalidateHitboxes()}getDrawableX(){return this._renderer.getDrawableX()}getDrawableY(){return this._renderer.getDrawableY()}getWidth(){return this._renderer.getWidth()}getHeight(){return this._renderer.getHeight()}updatePreRender(e){this._renderer.updatePreRender()}transformToDrawing(e,t){const r=n._pointForTransformation;return r[0]=e,r[1]=t,this._renderer.transformToDrawing(r)}transformToScene(e,t){const r=n._pointForTransformation;return r[0]=e,r[1]=t,this._renderer.transformToScene(r)}transformToDrawingX(e,t){return this.transformToDrawing(e,t)[0]}transformToDrawingY(e,t){return this.transformToDrawing(e,t)[1]}transformToSceneX(e,t){return this.transformToScene(e,t)[0]}transformToSceneY(e,t){return this.transformToScene(e,t)[1]}setRectangularCollisionMask(e,t,r,o){if(!this._customCollisionMask){const l=new a.Polygon;l.vertices.push([0,0]),l.vertices.push([0,0]),l.vertices.push([0,0]),l.vertices.push([0,0]),this._customCollisionMask=[l]}const i=this._customCollisionMask[0].vertices;i[0][0]=e,i[0][1]=t,i[1][0]=r,i[1][1]=t,i[2][0]=r,i[2][1]=o,i[3][0]=e,i[3][1]=o,this.invalidateHitboxes()}updateHitBoxes(){this.hitBoxes=this._defaultHitBoxes;const e=this.getWidth(),t=this.getHeight(),r=this.getCenterX(),o=this.getCenterY(),i=this.hitBoxes[0].vertices;if(this._customCollisionMask){const l=this._customCollisionMask[0].vertices;for(let s=0;s<4;s++){const h=this.transformToScene(l[s][0],l[s][1]);i[s][0]=h[0],i[s][1]=h[1]}}else r===e/2&&o===t/2?(i[0][0]=-r,i[0][1]=-o,i[1][0]=+r,i[1][1]=-o,i[2][0]=+r,i[2][1]=+o,i[3][0]=-r,i[3][1]=+o):(i[0][0]=0-r,i[0][1]=0-o,i[1][0]=e-r,i[1][1]=0-o,i[2][0]=e-r,i[2][1]=t-o,i[3][0]=0-r,i[3][1]=t-o),this._useAbsoluteCoordinates||this.hitBoxes[0].rotate(a.toRad(this.getAngle())),this.hitBoxes[0].move(this.getDrawableX()+r,this.getDrawableY()+o)}};let f=n;f._pointForTransformation=[0,0],a.ShapePainterRuntimeObject=f,a.registerObject("PrimitiveDrawing::Drawer",a.ShapePainterRuntimeObject),f.supportsReinitialization=!1})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=shapepainterruntimeobject.js.map
|