gdcore-tools 2.0.0-gd-v5.5.224-autobuild → 2.0.0-gd-v5.5.225-autobuild
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/CustomRuntimeObject.js +1 -1
- package/dist/Runtime/CustomRuntimeObject.js.map +2 -2
- package/dist/Runtime/CustomRuntimeObject2D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/A_RuntimeObject3D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Base3DBehavior.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js +1 -1
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObject.js.map +2 -2
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObjectPixiRenderer.js +1 -1
- package/dist/Runtime/Extensions/3D/Cube3DRuntimeObjectPixiRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3D.js.map +2 -2
- package/dist/Runtime/Extensions/3D/CustomRuntimeObject3DRenderer.js.map +2 -2
- package/dist/Runtime/Extensions/3D/JsExtension.js +219 -108
- 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 +63 -1
- package/dist/Runtime/Extensions/AdMob/admobtools.js +1 -1
- package/dist/Runtime/Extensions/AdMob/admobtools.js.map +2 -2
- package/dist/Runtime/Extensions/AdvancedWindow/electron-advancedwindowtools.js.map +2 -2
- package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js +1 -1
- package/dist/Runtime/Extensions/AnchorBehavior/anchorruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/BBText/JsExtension.js +10 -9
- package/dist/Runtime/Extensions/BBText/bbtextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/BitmapText/JsExtension.js +4 -6
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/BitmapText/bitmaptextruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/DialogueTree/dialoguetools.js.map +2 -2
- package/dist/Runtime/Extensions/DraggableBehavior/draggableruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/adjustment-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/advanced-bloom-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/ascii-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/bevel-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/black-and-white-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/blending-mode-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/brightness-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/bulge-pinch-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-map-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/color-replace-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/crt-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/displacement-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/dot-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/drop-shadow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glitch-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/glow-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/godray-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/kawase-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/noise-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/old-film-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/outline-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/pixelate-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/pixi-filters/types/drop-shadow/types.d.ts +10 -4
- package/dist/Runtime/Extensions/Effects/radial-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/reflection-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/rgb-split-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/sepia-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/shockwave-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/tilt-shift-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/twist-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/Effects/zoom-blur-pixi-filter.js.map +2 -2
- package/dist/Runtime/Extensions/ExampleJsExtension/dummyeffect.js.map +2 -2
- package/dist/Runtime/Extensions/FacebookInstantGames/facebookinstantgamestools.js.map +2 -2
- package/dist/Runtime/Extensions/Firebase/A_firebasejs/firebase.d.ts +5 -4
- package/dist/Runtime/Extensions/Firebase/B_firebasetools/D_cloudfirestoretools.js.map +2 -2
- package/dist/Runtime/Extensions/Firebase/B_firebasetools/D_remoteconfigtools.js.map +2 -2
- package/dist/Runtime/Extensions/Firebase/JsExtension.js +21 -21
- package/dist/Runtime/Extensions/JsExtensionTypes.d.ts +1 -0
- package/dist/Runtime/Extensions/Leaderboards/leaderboardstools.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/JsExtension.js +2 -2
- package/dist/Runtime/Extensions/Lighting/lightobstacleruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Lighting/lightruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/LinkedObjects/linkedobjects.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/JsExtension.js +122 -0
- package/dist/Runtime/Extensions/Multiplayer/messageManager.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayerVariablesManager.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/multiplayercomponents.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayerobjectruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/multiplayertools.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js +1 -1
- package/dist/Runtime/Extensions/Multiplayer/peerJsHelper.js.map +2 -2
- package/dist/Runtime/Extensions/Multiplayer/peerjs.d.ts +8 -10
- package/dist/Runtime/Extensions/P2P/peerjs.d.ts +8 -10
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/PanelSpriteObject/panelspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/particleemitterobject.js.map +2 -2
- package/dist/Runtime/Extensions/ParticleSystem/pixi-particles-pixi-renderer.d.ts +2 -1
- package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingobstacleruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PathfindingBehavior/pathfindingruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Physics2Behavior/JsExtension.js +106 -106
- package/dist/Runtime/Extensions/Physics2Behavior/box2d.d.ts +13 -7
- package/dist/Runtime/Extensions/Physics2Behavior/physics2runtimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Physics3DBehavior/Physics3DRuntimeBehavior.js.map +2 -2
- package/dist/Runtime/Extensions/Physics3DBehavior/PhysicsCharacter3DRuntimeBehavior.js +1 -1
- package/dist/Runtime/Extensions/Physics3DBehavior/PhysicsCharacter3DRuntimeBehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PhysicsBehavior/physicsruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlatformBehavior/platformerobjectruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlatformBehavior/platformruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationcomponents.js.map +1 -1
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js +1 -1
- package/dist/Runtime/Extensions/PlayerAuthentication/playerauthenticationtools.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/PrimitiveDrawing/shapepainterruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/SpatialSound/spatialsoundtools.js +1 -1
- package/dist/Runtime/Extensions/SpatialSound/spatialsoundtools.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/JsExtension.js +5 -4
- 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/spineruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Spine/spineruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/Steamworks/JsExtension.js +12 -12
- package/dist/Runtime/Extensions/Steamworks/Z_steamworksinputtools.js.map +2 -2
- package/dist/Runtime/Extensions/Steamworks/steamworkstools.js.map +2 -2
- package/dist/Runtime/Extensions/TextEntryObject/textentryruntimeobject-pixi-renderer.js.map +2 -2
- 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.map +2 -2
- package/dist/Runtime/Extensions/TextObject/textruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TextObject/textruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/JsExtension.js +20 -18
- package/dist/Runtime/Extensions/TileMap/TileMapRuntimeManager.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/collision/TransformedTileMap.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/helper/dts/model/TileMapModel.d.ts +1 -3
- package/dist/Runtime/Extensions/TileMap/simpletilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapcollisionmaskruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject-pixi-renderer.js.map +1 -1
- package/dist/Runtime/Extensions/TileMap/tilemapruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/TiledSpriteObject/tiledspriteruntimeobject.js.map +2 -2
- package/dist/Runtime/Extensions/TopDownMovementBehavior/topdownmovementruntimebehavior.js.map +2 -2
- package/dist/Runtime/Extensions/TweenBehavior/tweenruntimebehavior.js.map +1 -1
- package/dist/Runtime/Extensions/Video/JsExtension.js +2 -1
- package/dist/Runtime/Extensions/Video/videoruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/Extensions/Video/videoruntimeobject.js.map +2 -2
- package/dist/Runtime/InAppTutorialMessage.js +6 -0
- package/dist/Runtime/InAppTutorialMessage.js.map +7 -0
- package/dist/Runtime/Model3DManager.js.map +2 -2
- package/dist/Runtime/ResourceLoader.js.map +2 -2
- package/dist/Runtime/RuntimeCustomObjectLayer.js +1 -1
- package/dist/Runtime/RuntimeCustomObjectLayer.js.map +2 -2
- package/dist/Runtime/RuntimeInstanceContainer.js.map +1 -1
- package/dist/Runtime/RuntimeLayer.js.map +2 -2
- package/dist/Runtime/SpriteAnimator.js.map +2 -2
- package/dist/Runtime/affinetransformation.js.map +1 -1
- package/dist/Runtime/debugger-client/abstract-debugger-client.js.map +2 -2
- package/dist/Runtime/debugger-client/hot-reloader.js +2 -2
- package/dist/Runtime/debugger-client/hot-reloader.js.map +2 -2
- package/dist/Runtime/debugger-client/websocket-debugger-client.js +1 -1
- package/dist/Runtime/debugger-client/websocket-debugger-client.js.map +2 -2
- package/dist/Runtime/events-tools/networktools.js +1 -1
- package/dist/Runtime/events-tools/networktools.js.map +2 -2
- package/dist/Runtime/fontfaceobserver-font-manager/fontfaceobserver-font-manager.js.map +2 -2
- package/dist/Runtime/gd.js.map +2 -2
- package/dist/Runtime/howler-sound-manager/howler-sound-manager.js +1 -1
- package/dist/Runtime/howler-sound-manager/howler-sound-manager.js.map +2 -2
- package/dist/Runtime/inputmanager.js.map +2 -2
- package/dist/Runtime/jsonmanager.js.map +2 -2
- package/dist/Runtime/layer.js.map +2 -2
- package/dist/Runtime/libs/nanomarkdown.js +5 -0
- package/dist/Runtime/libs/nanomarkdown.js.map +7 -0
- package/dist/Runtime/object-capabilities/AnimatableBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/EffectBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/FlippableBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/OpacityBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/ResizableBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/ScalableBehavior.js.map +2 -2
- package/dist/Runtime/object-capabilities/TextContainerBehavior.js.map +2 -2
- package/dist/Runtime/pixi-renderers/CustomRuntimeObject2DPixiRenderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/DebuggerPixiRenderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/layer-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/loadingscreen-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-bitmapfont-manager.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-filters-tools.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi-image-manager.js +1 -1
- package/dist/Runtime/pixi-renderers/pixi-image-manager.js.map +2 -2
- package/dist/Runtime/pixi-renderers/pixi.js +123 -177
- 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/runtimescene-pixi-renderer.js.map +2 -2
- package/dist/Runtime/pixi-renderers/spriteruntimeobject-pixi-renderer.js.map +2 -2
- package/dist/Runtime/profiler.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.map +2 -2
- package/dist/Runtime/runtimewatermark.js.map +2 -2
- package/dist/Runtime/scenestack.js.map +2 -2
- package/dist/Runtime/spriteruntimeobject.js.map +2 -2
- package/dist/Runtime/variable.js.map +2 -2
- package/dist/Runtime/variablescontainer.js.map +2 -2
- package/dist/lib/libGD.cjs +1 -1
- package/dist/lib/libGD.wasm +0 -0
- package/gd.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../GDevelop/Extensions/3D/Model3DRuntimeObject.ts"],
|
|
4
|
-
"sourcesContent": ["namespace gdjs {\n type Model3DAnimation = { name: string; source: string; loop: boolean };\n\n type Model3DObjectNetworkSyncDataType = {\n mt: number;\n op: FloatPoint3D | null;\n cp: FloatPoint3D | null;\n anis: Model3DAnimation[];\n ai: integer;\n ass: float;\n ap: boolean;\n };\n\n type Model3DObjectNetworkSyncData = Object3DNetworkSyncData &\n Model3DObjectNetworkSyncDataType;\n\n /** Base parameters for {@link gdjs.Cube3DRuntimeObject} */\n export interface Model3DObjectData extends Object3DData {\n /** The base parameters of the Model3D object */\n content: Object3DDataContent & {\n modelResourceName: string;\n rotationX: number;\n rotationY: number;\n rotationZ: number;\n keepAspectRatio: boolean;\n materialType: 'Basic' | 'StandardWithoutMetalness' | 'KeepOriginal';\n originLocation:\n | 'ModelOrigin'\n | 'ObjectCenter'\n | 'BottomCenterZ'\n | 'BottomCenterY'\n | 'TopLeft';\n centerLocation:\n | 'ModelOrigin'\n | 'ObjectCenter'\n | 'BottomCenterZ'\n | 'BottomCenterY';\n animations: Model3DAnimation[];\n };\n }\n\n type FloatPoint3D = [float, float, float];\n\n const getPointForLocation = (location: string): FloatPoint3D | null => {\n switch (location) {\n case 'ModelOrigin':\n return null;\n case 'ObjectCenter':\n return [0.5, 0.5, 0.5];\n case 'BottomCenterZ':\n return [0.5, 0.5, 0];\n case 'BottomCenterY':\n return [0.5, 1, 0.5];\n case 'TopLeft':\n return [0, 0, 0];\n default:\n return null;\n }\n };\n\n /**\n * A 3D object which displays a 3D model.\n */\n export class Model3DRuntimeObject\n extends gdjs.RuntimeObject3D\n implements gdjs.Animatable {\n _renderer: gdjs.Model3DRuntimeObjectRenderer;\n\n _modelResourceName: string;\n _materialType: gdjs.Model3DRuntimeObject.MaterialType =\n gdjs.Model3DRuntimeObject.MaterialType.Basic;\n\n /**\n * The local point of the model that will be at the object position.\n *\n * Coordinates are between 0 and 1.\n *\n * Its value is `null` when the point is configured to `\"ModelOrigin\"`\n * because the model origin needs to be evaluated according to the object\n * configuration.\n * @see gdjs.Model3DRuntimeObject3DRenderer.getOriginPoint\n */\n _originPoint: FloatPoint3D | null;\n /**\n * The local point of the model that is used as rotation center.\n *\n * Coordinates are between 0 and 1.\n *\n * Its value is `null` when the point is configured to `\"ModelOrigin\"`\n * because the model origin needs to be evaluated according to the object\n * configuration.\n * @see gdjs.Model3DRuntimeObject3DRenderer.getCenterPoint\n */\n _centerPoint: FloatPoint3D | null;\n\n _animations: Model3DAnimation[];\n _currentAnimationIndex: integer = 0;\n _animationSpeedScale: float = 1;\n _animationPaused: boolean = false;\n\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n objectData: Model3DObjectData\n ) {\n super(instanceContainer, objectData);\n this._modelResourceName = objectData.content.modelResourceName;\n this._animations = objectData.content.animations;\n this._originPoint = getPointForLocation(\n objectData.content.originLocation\n );\n this._centerPoint = getPointForLocation(\n objectData.content.centerLocation\n );\n this._renderer = new gdjs.Model3DRuntimeObjectRenderer(\n this,\n instanceContainer\n );\n this._materialType = this._convertMaterialType(\n objectData.content.materialType\n );\n\n this.onModelChanged(objectData);\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n /**\n * To be called after the renderer loaded a Model resource:\n * - After the renderer was instantiated\n * - After reloading the model\n */\n private onModelChanged(objectData) {\n this._updateModel(objectData);\n if (this._animations.length > 0) {\n this._renderer.playAnimation(\n this._animations[0].source,\n this._animations[0].loop\n );\n }\n }\n\n updateFromObjectData(\n oldObjectData: Model3DObjectData,\n newObjectData: Model3DObjectData\n ): boolean {\n super.updateFromObjectData(oldObjectData, newObjectData);\n\n if (\n oldObjectData.content.materialType !==\n newObjectData.content.materialType\n ) {\n this._materialType = this._convertMaterialType(\n newObjectData.content.materialType\n );\n }\n if (\n oldObjectData.content.modelResourceName !==\n newObjectData.content.modelResourceName\n ) {\n this._reloadModel(newObjectData);\n } else if (\n oldObjectData.content.width !== newObjectData.content.width ||\n oldObjectData.content.height !== newObjectData.content.height ||\n oldObjectData.content.depth !== newObjectData.content.depth ||\n oldObjectData.content.rotationX !== newObjectData.content.rotationX ||\n oldObjectData.content.rotationY !== newObjectData.content.rotationY ||\n oldObjectData.content.rotationZ !== newObjectData.content.rotationZ ||\n oldObjectData.content.keepAspectRatio !==\n newObjectData.content.keepAspectRatio ||\n oldObjectData.content.materialType !==\n newObjectData.content.materialType\n ) {\n this._updateModel(newObjectData);\n }\n if (\n oldObjectData.content.originLocation !==\n newObjectData.content.originLocation\n ) {\n this._originPoint = getPointForLocation(\n newObjectData.content.originLocation\n );\n }\n if (\n oldObjectData.content.centerLocation !==\n newObjectData.content.centerLocation\n ) {\n this._centerPoint = getPointForLocation(\n newObjectData.content.centerLocation\n );\n }\n return true;\n }\n\n getNetworkSyncData(): Model3DObjectNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n mt: this._materialType,\n op: this._originPoint,\n cp: this._centerPoint,\n anis: this._animations,\n ai: this._currentAnimationIndex,\n ass: this._animationSpeedScale,\n ap: this._animationPaused,\n };\n }\n\n updateFromNetworkSyncData(\n networkSyncData: Model3DObjectNetworkSyncData\n ): void {\n super.updateFromNetworkSyncData(networkSyncData);\n\n if (networkSyncData.mt !== undefined) {\n this._materialType = networkSyncData.mt;\n }\n if (networkSyncData.op !== undefined) {\n this._originPoint = networkSyncData.op;\n }\n if (networkSyncData.cp !== undefined) {\n this._centerPoint = networkSyncData.cp;\n }\n if (networkSyncData.anis !== undefined) {\n this._animations = networkSyncData.anis;\n }\n if (networkSyncData.ai !== undefined) {\n this.setAnimationIndex(networkSyncData.ai);\n }\n if (networkSyncData.ass !== undefined) {\n this.setAnimationSpeedScale(networkSyncData.ass);\n }\n if (networkSyncData.ap !== undefined) {\n if (networkSyncData.ap !== this.isAnimationPaused()) {\n networkSyncData.ap ? this.pauseAnimation() : this.resumeAnimation();\n }\n }\n }\n\n _reloadModel(objectData: Model3DObjectData) {\n this._modelResourceName = objectData.content.modelResourceName;\n this._renderer._reloadModel(this, this._runtimeScene);\n this.onModelChanged(objectData);\n }\n\n _updateModel(objectData: Model3DObjectData) {\n const rotationX = objectData.content.rotationX || 0;\n const rotationY = objectData.content.rotationY || 0;\n const rotationZ = objectData.content.rotationZ || 0;\n const keepAspectRatio = objectData.content.keepAspectRatio;\n this._renderer._updateModel(\n rotationX,\n rotationY,\n rotationZ,\n this._getOriginalWidth(),\n this._getOriginalHeight(),\n this._getOriginalDepth(),\n keepAspectRatio\n );\n }\n\n getRenderer(): RuntimeObject3DRenderer {\n return this._renderer;\n }\n\n _convertMaterialType(\n materialTypeString: string\n ): gdjs.Model3DRuntimeObject.MaterialType {\n if (materialTypeString === 'KeepOriginal') {\n return gdjs.Model3DRuntimeObject.MaterialType.KeepOriginal;\n } else if (materialTypeString === 'StandardWithoutMetalness') {\n return gdjs.Model3DRuntimeObject.MaterialType.StandardWithoutMetalness;\n } else {\n return gdjs.Model3DRuntimeObject.MaterialType.Basic;\n }\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n const elapsedTime = this.getElapsedTime() / 1000;\n this._renderer.updateAnimation(elapsedTime * this._animationSpeedScale);\n }\n\n /**\n * Get the index of the animation being played.\n * @return The index of the new animation being played\n */\n getAnimationIndex(): number {\n return this._currentAnimationIndex;\n }\n\n /**\n * Change the animation being played.\n * @param animationIndex The index of the new animation to be played\n */\n setAnimationIndex(animationIndex: number): void {\n animationIndex = animationIndex | 0;\n if (\n animationIndex < this._animations.length &&\n this._currentAnimationIndex !== animationIndex &&\n animationIndex >= 0\n ) {\n const animation = this._animations[animationIndex];\n this._currentAnimationIndex = animationIndex;\n this._renderer.playAnimation(animation.source, animation.loop);\n if (this._animationPaused) {\n this._renderer.pauseAnimation();\n }\n }\n }\n\n /**\n * Get the name of the animation being played.\n * @return The name of the new animation being played\n */\n getAnimationName(): string {\n if (this._currentAnimationIndex >= this._animations.length) {\n return '';\n }\n return this._animations[this._currentAnimationIndex].name;\n }\n\n /**\n * Change the animation being played.\n * @param newAnimationName The name of the new animation to be played\n */\n setAnimationName(newAnimationName: string): void {\n if (!newAnimationName) {\n return;\n }\n const animationIndex = this._animations.findIndex(\n (animation) => animation.name === newAnimationName\n );\n if (animationIndex >= 0) {\n this.setAnimationIndex(animationIndex);\n }\n }\n\n isCurrentAnimationName(name: string): boolean {\n return this.getAnimationName() === name;\n }\n\n /**\n * Return true if animation has ended.\n * The animation had ended if:\n * - it's not configured as a loop;\n * - the current frame is the last frame;\n * - the last frame has been displayed long enough.\n */\n hasAnimationEnded(): boolean {\n return this._renderer.hasAnimationEnded();\n }\n\n isAnimationPaused() {\n return this._animationPaused;\n }\n\n pauseAnimation() {\n this._animationPaused = true;\n this._renderer.pauseAnimation();\n }\n\n resumeAnimation() {\n this._animationPaused = false;\n this._renderer.resumeAnimation();\n }\n\n getAnimationSpeedScale() {\n return this._animationSpeedScale;\n }\n\n setAnimationSpeedScale(ratio: float): void {\n this._animationSpeedScale = ratio;\n }\n\n getAnimationElapsedTime(): float {\n return this._renderer.getAnimationElapsedTime();\n }\n\n setAnimationElapsedTime(time: float): void {\n this._renderer.setAnimationElapsedTime(time);\n if (!this._animationPaused) {\n this._renderer.resumeAnimation();\n }\n }\n\n getAnimationDuration(): float {\n return this._renderer.getAnimationDuration(\n this._animations[this._currentAnimationIndex].source\n );\n }\n\n getCenterX(): float {\n const centerPoint = this._renderer.getCenterPoint();\n return this.getWidth() * centerPoint[0];\n }\n\n getCenterY(): float {\n const centerPoint = this._renderer.getCenterPoint();\n return this.getHeight() * centerPoint[1];\n }\n\n getCenterZ(): float {\n const centerPoint = this._renderer.getCenterPoint();\n return this.getDepth() * centerPoint[2];\n }\n\n getDrawableX(): float {\n const originPoint = this._renderer.getOriginPoint();\n return this.getX() - this.getWidth() * originPoint[0];\n }\n\n getDrawableY(): float {\n const originPoint = this._renderer.getOriginPoint();\n return this.getY() - this.getHeight() * originPoint[1];\n }\n\n getDrawableZ(): float {\n const originPoint = this._renderer.getOriginPoint();\n return this.getZ() - this.getDepth() * originPoint[2];\n }\n }\n\n export namespace Model3DRuntimeObject {\n export enum MaterialType {\n Basic,\n StandardWithoutMetalness,\n KeepOriginal,\n }\n }\n gdjs.registerObject('Scene3D::Model3DObject', gdjs.Model3DRuntimeObject);\n}\n"],
|
|
5
|
-
"mappings": "AAAA,GAAU,MAAV,UAAU,EAAV,
|
|
4
|
+
"sourcesContent": ["namespace gdjs {\n type Model3DAnimation = { name: string; source: string; loop: boolean };\n\n type Model3DObjectNetworkSyncDataType = {\n mt: number;\n op: FloatPoint3D | null;\n cp: FloatPoint3D | null;\n anis: Model3DAnimation[];\n ai: integer;\n ass: float;\n ap: boolean;\n cfd: float;\n };\n\n type Model3DObjectNetworkSyncData = Object3DNetworkSyncData &\n Model3DObjectNetworkSyncDataType;\n\n /** Base parameters for {@link gdjs.Cube3DRuntimeObject} */\n export interface Model3DObjectData extends Object3DData {\n /** The base parameters of the Model3D object */\n content: Object3DDataContent & {\n modelResourceName: string;\n rotationX: number;\n rotationY: number;\n rotationZ: number;\n keepAspectRatio: boolean;\n materialType: 'Basic' | 'StandardWithoutMetalness' | 'KeepOriginal';\n originLocation:\n | 'ModelOrigin'\n | 'ObjectCenter'\n | 'BottomCenterZ'\n | 'BottomCenterY'\n | 'TopLeft';\n centerLocation:\n | 'ModelOrigin'\n | 'ObjectCenter'\n | 'BottomCenterZ'\n | 'BottomCenterY';\n animations: Model3DAnimation[];\n crossfadeDuration: float;\n };\n }\n\n type FloatPoint3D = [float, float, float];\n\n const getPointForLocation = (location: string): FloatPoint3D | null => {\n switch (location) {\n case 'ModelOrigin':\n return null;\n case 'ObjectCenter':\n return [0.5, 0.5, 0.5];\n case 'BottomCenterZ':\n return [0.5, 0.5, 0];\n case 'BottomCenterY':\n return [0.5, 1, 0.5];\n case 'TopLeft':\n return [0, 0, 0];\n default:\n return null;\n }\n };\n\n /**\n * A 3D object which displays a 3D model.\n */\n export class Model3DRuntimeObject\n extends gdjs.RuntimeObject3D\n implements gdjs.Animatable\n {\n _renderer: gdjs.Model3DRuntimeObjectRenderer;\n\n _modelResourceName: string;\n _materialType: gdjs.Model3DRuntimeObject.MaterialType =\n gdjs.Model3DRuntimeObject.MaterialType.Basic;\n\n /**\n * The local point of the model that will be at the object position.\n *\n * Coordinates are between 0 and 1.\n *\n * Its value is `null` when the point is configured to `\"ModelOrigin\"`\n * because the model origin needs to be evaluated according to the object\n * configuration.\n * @see gdjs.Model3DRuntimeObject3DRenderer.getOriginPoint\n */\n _originPoint: FloatPoint3D | null;\n /**\n * The local point of the model that is used as rotation center.\n *\n * Coordinates are between 0 and 1.\n *\n * Its value is `null` when the point is configured to `\"ModelOrigin\"`\n * because the model origin needs to be evaluated according to the object\n * configuration.\n * @see gdjs.Model3DRuntimeObject3DRenderer.getCenterPoint\n */\n _centerPoint: FloatPoint3D | null;\n\n _animations: Model3DAnimation[];\n _currentAnimationIndex: integer = 0;\n _animationSpeedScale: float = 1;\n _animationPaused: boolean = false;\n _crossfadeDuration: float = 0;\n\n constructor(\n instanceContainer: gdjs.RuntimeInstanceContainer,\n objectData: Model3DObjectData\n ) {\n super(instanceContainer, objectData);\n this._modelResourceName = objectData.content.modelResourceName;\n this._animations = objectData.content.animations;\n this._originPoint = getPointForLocation(\n objectData.content.originLocation\n );\n this._centerPoint = getPointForLocation(\n objectData.content.centerLocation\n );\n this._renderer = new gdjs.Model3DRuntimeObjectRenderer(\n this,\n instanceContainer\n );\n this._materialType = this._convertMaterialType(\n objectData.content.materialType\n );\n\n this.onModelChanged(objectData);\n\n this._crossfadeDuration = objectData.content.crossfadeDuration || 0;\n\n // *ALWAYS* call `this.onCreated()` at the very end of your object constructor.\n this.onCreated();\n }\n\n /**\n * To be called after the renderer loaded a Model resource:\n * - After the renderer was instantiated\n * - After reloading the model\n */\n private onModelChanged(objectData) {\n this._updateModel(objectData);\n if (this._animations.length > 0) {\n this._renderer.playAnimation(\n this._animations[0].source,\n this._animations[0].loop\n );\n }\n }\n\n updateFromObjectData(\n oldObjectData: Model3DObjectData,\n newObjectData: Model3DObjectData\n ): boolean {\n super.updateFromObjectData(oldObjectData, newObjectData);\n\n if (\n oldObjectData.content.materialType !==\n newObjectData.content.materialType\n ) {\n this._materialType = this._convertMaterialType(\n newObjectData.content.materialType\n );\n }\n if (\n oldObjectData.content.modelResourceName !==\n newObjectData.content.modelResourceName\n ) {\n this._reloadModel(newObjectData);\n } else if (\n oldObjectData.content.width !== newObjectData.content.width ||\n oldObjectData.content.height !== newObjectData.content.height ||\n oldObjectData.content.depth !== newObjectData.content.depth ||\n oldObjectData.content.rotationX !== newObjectData.content.rotationX ||\n oldObjectData.content.rotationY !== newObjectData.content.rotationY ||\n oldObjectData.content.rotationZ !== newObjectData.content.rotationZ ||\n oldObjectData.content.keepAspectRatio !==\n newObjectData.content.keepAspectRatio ||\n oldObjectData.content.materialType !==\n newObjectData.content.materialType\n ) {\n this._updateModel(newObjectData);\n }\n if (\n oldObjectData.content.originLocation !==\n newObjectData.content.originLocation\n ) {\n this._originPoint = getPointForLocation(\n newObjectData.content.originLocation\n );\n }\n if (\n oldObjectData.content.centerLocation !==\n newObjectData.content.centerLocation\n ) {\n this._centerPoint = getPointForLocation(\n newObjectData.content.centerLocation\n );\n }\n return true;\n }\n\n getNetworkSyncData(): Model3DObjectNetworkSyncData {\n return {\n ...super.getNetworkSyncData(),\n mt: this._materialType,\n op: this._originPoint,\n cp: this._centerPoint,\n anis: this._animations,\n ai: this._currentAnimationIndex,\n ass: this._animationSpeedScale,\n ap: this._animationPaused,\n cfd: this._crossfadeDuration,\n };\n }\n\n updateFromNetworkSyncData(\n networkSyncData: Model3DObjectNetworkSyncData\n ): void {\n super.updateFromNetworkSyncData(networkSyncData);\n\n if (networkSyncData.mt !== undefined) {\n this._materialType = networkSyncData.mt;\n }\n if (networkSyncData.op !== undefined) {\n this._originPoint = networkSyncData.op;\n }\n if (networkSyncData.cp !== undefined) {\n this._centerPoint = networkSyncData.cp;\n }\n if (networkSyncData.anis !== undefined) {\n this._animations = networkSyncData.anis;\n }\n if (networkSyncData.ai !== undefined) {\n this.setAnimationIndex(networkSyncData.ai);\n }\n if (networkSyncData.ass !== undefined) {\n this.setAnimationSpeedScale(networkSyncData.ass);\n }\n if (networkSyncData.ap !== undefined) {\n if (networkSyncData.ap !== this.isAnimationPaused()) {\n networkSyncData.ap ? this.pauseAnimation() : this.resumeAnimation();\n }\n }\n if (networkSyncData.cfd !== undefined) {\n this._crossfadeDuration = networkSyncData.cfd;\n }\n }\n\n _reloadModel(objectData: Model3DObjectData) {\n this._modelResourceName = objectData.content.modelResourceName;\n this._renderer._reloadModel(this, this._runtimeScene);\n this.onModelChanged(objectData);\n }\n\n _updateModel(objectData: Model3DObjectData) {\n const rotationX = objectData.content.rotationX || 0;\n const rotationY = objectData.content.rotationY || 0;\n const rotationZ = objectData.content.rotationZ || 0;\n const keepAspectRatio = objectData.content.keepAspectRatio;\n this._renderer._updateModel(\n rotationX,\n rotationY,\n rotationZ,\n this._getOriginalWidth(),\n this._getOriginalHeight(),\n this._getOriginalDepth(),\n keepAspectRatio\n );\n }\n\n getRenderer(): RuntimeObject3DRenderer {\n return this._renderer;\n }\n\n _convertMaterialType(\n materialTypeString: string\n ): gdjs.Model3DRuntimeObject.MaterialType {\n if (materialTypeString === 'KeepOriginal') {\n return gdjs.Model3DRuntimeObject.MaterialType.KeepOriginal;\n } else if (materialTypeString === 'StandardWithoutMetalness') {\n return gdjs.Model3DRuntimeObject.MaterialType.StandardWithoutMetalness;\n } else {\n return gdjs.Model3DRuntimeObject.MaterialType.Basic;\n }\n }\n\n update(instanceContainer: gdjs.RuntimeInstanceContainer): void {\n const elapsedTime = this.getElapsedTime() / 1000;\n this._renderer.updateAnimation(elapsedTime * this._animationSpeedScale);\n }\n\n /**\n * Get the index of the animation being played.\n * @return The index of the new animation being played\n */\n getAnimationIndex(): number {\n return this._currentAnimationIndex;\n }\n\n /**\n * Change the animation being played.\n * @param animationIndex The index of the new animation to be played\n */\n setAnimationIndex(animationIndex: number): void {\n animationIndex = animationIndex | 0;\n if (\n animationIndex < this._animations.length &&\n this._currentAnimationIndex !== animationIndex &&\n animationIndex >= 0\n ) {\n const animation = this._animations[animationIndex];\n this._currentAnimationIndex = animationIndex;\n this._renderer.playAnimation(animation.source, animation.loop);\n if (this._animationPaused) {\n this._renderer.pauseAnimation();\n }\n }\n }\n\n /**\n * Get the name of the animation being played.\n * @return The name of the new animation being played\n */\n getAnimationName(): string {\n if (this._currentAnimationIndex >= this._animations.length) {\n return '';\n }\n return this._animations[this._currentAnimationIndex].name;\n }\n\n /**\n * Change the animation being played.\n * @param newAnimationName The name of the new animation to be played\n */\n setAnimationName(newAnimationName: string): void {\n if (!newAnimationName) {\n return;\n }\n const animationIndex = this._animations.findIndex(\n (animation) => animation.name === newAnimationName\n );\n if (animationIndex >= 0) {\n this.setAnimationIndex(animationIndex);\n }\n }\n\n isCurrentAnimationName(name: string): boolean {\n return this.getAnimationName() === name;\n }\n\n /**\n * Return true if animation has ended.\n * The animation had ended if:\n * - it's not configured as a loop;\n * - the current frame is the last frame;\n * - the last frame has been displayed long enough.\n */\n hasAnimationEnded(): boolean {\n return this._renderer.hasAnimationEnded();\n }\n\n setCrossfadeDuration(duration: number): void {\n if (this._crossfadeDuration === duration) return;\n this._crossfadeDuration = duration;\n }\n\n isAnimationPaused() {\n return this._animationPaused;\n }\n\n pauseAnimation() {\n this._animationPaused = true;\n this._renderer.pauseAnimation();\n }\n\n resumeAnimation() {\n this._animationPaused = false;\n this._renderer.resumeAnimation();\n }\n\n getAnimationSpeedScale() {\n return this._animationSpeedScale;\n }\n\n setAnimationSpeedScale(ratio: float): void {\n this._animationSpeedScale = ratio;\n }\n\n getAnimationElapsedTime(): float {\n return this._renderer.getAnimationElapsedTime();\n }\n\n setAnimationElapsedTime(time: float): void {\n this._renderer.setAnimationElapsedTime(time);\n if (!this._animationPaused) {\n this._renderer.resumeAnimation();\n }\n }\n\n getAnimationDuration(): float {\n return this._renderer.getAnimationDuration(\n this._animations[this._currentAnimationIndex].source\n );\n }\n\n getCenterX(): float {\n const centerPoint = this._renderer.getCenterPoint();\n return this.getWidth() * centerPoint[0];\n }\n\n getCenterY(): float {\n const centerPoint = this._renderer.getCenterPoint();\n return this.getHeight() * centerPoint[1];\n }\n\n getCenterZ(): float {\n const centerPoint = this._renderer.getCenterPoint();\n return this.getDepth() * centerPoint[2];\n }\n\n getDrawableX(): float {\n const originPoint = this._renderer.getOriginPoint();\n return this.getX() - this.getWidth() * originPoint[0];\n }\n\n getDrawableY(): float {\n const originPoint = this._renderer.getOriginPoint();\n return this.getY() - this.getHeight() * originPoint[1];\n }\n\n getDrawableZ(): float {\n const originPoint = this._renderer.getOriginPoint();\n return this.getZ() - this.getDepth() * originPoint[2];\n }\n }\n\n export namespace Model3DRuntimeObject {\n export enum MaterialType {\n Basic,\n StandardWithoutMetalness,\n KeepOriginal,\n }\n }\n gdjs.registerObject('Scene3D::Model3DObject', gdjs.Model3DRuntimeObject);\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 s=1/(1<<16),g=i=>{i.metalness&&(i.metalness=0)},O=i=>{const t=i;if(!!t.material)if(Array.isArray(t.material))for(let e=0;e<t.material.length;e++)g(t.material[e]);else g(t.material)},T=i=>i.traverse(O),M=i=>{const t=new THREE.MeshBasicMaterial;return i.color&&(t.color=i.color),i.map&&(t.map=i.map),t},b=i=>{const t=i;if(!!t.material)if(Array.isArray(t.material))for(let e=0;e<t.material.length;e++)t.material[e]=M(t.material[e]);else t.material=M(t.material)},D=i=>i.traverse(b);class j extends a.RuntimeObject3DRenderer{constructor(t,e){const r=e.getGame().getModel3DManager().getModel(t._modelResourceName),o=new THREE.Group,h=new THREE.Group;h.rotation.order="ZYX",h.add(o);super(t,e,h);this._model3DRuntimeObject=t,this._threeObject=o,this._originalModel=r,this._modelOriginPoint=[0,0,0],this.updateSize(),this.updatePosition(),this.updateRotation(),this._animationMixer=new THREE.AnimationMixer(o),this._action=null}updateAnimation(t){this._animationMixer.update(t)}updatePosition(){const t=this.getOriginPoint(),e=this.getCenterPoint();this.get3DRendererObject().position.set(this._object.getX()-this._object.getWidth()*(t[0]-e[0]),this._object.getY()-this._object.getHeight()*(t[1]-e[1]),this._object.getZ()-this._object.getDepth()*(t[2]-e[2]))}getOriginPoint(){return this._model3DRuntimeObject._originPoint||this._modelOriginPoint}getCenterPoint(){return this._model3DRuntimeObject._centerPoint||this._modelOriginPoint}_updateDefaultTransformation(t,e,r,o,h,R,p,l){t.rotation.set(a.toRad(e),a.toRad(r),a.toRad(o)),t.updateMatrixWorld(!0);const n=new THREE.Box3().setFromObject(t);!this._model3DRuntimeObject._originPoint&&n.expandByPoint(new THREE.Vector3(0,0,0));const m=n.max.x-n.min.x,c=n.max.y-n.min.y,d=n.max.z-n.min.z;this._modelOriginPoint[0]=m<s?0:-n.min.x/m,this._modelOriginPoint[1]=c<s?0:-n.min.y/c,this._modelOriginPoint[2]=d<s?0:-n.min.z/d,this._modelOriginPoint[1]=1-this._modelOriginPoint[1];const u=this._model3DRuntimeObject._centerPoint;u&&t.position.set(-(n.min.x+m*u[0]),-(n.min.y+c*(1-u[1])),-(n.min.z+d*u[2])),t.scale.set(1,1,1),t.rotation.set(a.toRad(e),a.toRad(r),a.toRad(o));const H=m<s?1:1/m,P=c<s?1:1/c,x=d<s?1:1/d,f=new THREE.Matrix4;if(f.makeScale(H,-P,x),t.updateMatrix(),t.applyMatrix4(f),l){const A=m<s?Number.POSITIVE_INFINITY:h/m,I=c<s?Number.POSITIVE_INFINITY:R/c,v=d<s?Number.POSITIVE_INFINITY:p/d;let _=Math.min(A,I,v);Number.isFinite(_)||(_=1),this._object._setOriginalWidth(_*m),this._object._setOriginalHeight(_*c),this._object._setOriginalDepth(_*d)}}_reloadModel(t,e){this._originalModel=e.getGame().getModel3DManager().getModel(t._modelResourceName)}_updateModel(t,e,r,o,h,R,p){const l=new THREE.Group;l.rotation.order="ZYX";const n=THREE_ADDONS.SkeletonUtils.clone(this._originalModel.scene);l.add(n),this._replaceMaterials(l),this._updateDefaultTransformation(l,t,e,r,o,h,R,p),this.get3DRendererObject().remove(this._threeObject),this.get3DRendererObject().add(l),this._threeObject=l,this._animationMixer=new THREE.AnimationMixer(n);const E=this._model3DRuntimeObject.isAnimationPaused();this._model3DRuntimeObject.setAnimationIndex(this._model3DRuntimeObject.getAnimationIndex()),E&&this.pauseAnimation()}_replaceMaterials(t){this._model3DRuntimeObject._materialType===a.Model3DRuntimeObject.MaterialType.StandardWithoutMetalness?T(t):this._model3DRuntimeObject._materialType===a.Model3DRuntimeObject.MaterialType.Basic&&D(t)}getAnimationCount(){return this._originalModel.animations.length}getAnimationName(t){return this._originalModel.animations[t].name}hasAnimationEnded(){return this._action?!this._action.isRunning():!0}animationPaused(){if(!!this._action)return this._action.paused}pauseAnimation(){!this._action||(this._action.paused=!0)}resumeAnimation(){!this._action||(this._action.paused=!1)}playAnimation(t,e){const r=THREE.AnimationClip.findByName(this._originalModel.animations,t);if(!r){console.error(`The GLB file: ${this._model3DRuntimeObject._modelResourceName} doesn't have any animation named: ${t}`);return}const o=this._action;this._action=this._animationMixer.clipAction(r),this._action.setLoop(e?THREE.LoopRepeat:THREE.LoopOnce,Number.POSITIVE_INFINITY),this._action.clampWhenFinished=!0,o&&o!==this._action&&(this._action.enabled=!0,this._action.crossFadeFrom(o,this._model3DRuntimeObject._crossfadeDuration,!1)),this._action.play(),this._animationMixer.update(0)}getAnimationElapsedTime(){return this._action?this._action.time:0}setAnimationElapsedTime(t){this._action&&(this._action.time=t)}getAnimationDuration(t){const e=THREE.AnimationClip.findByName(this._originalModel.animations,t);return e?e.duration:0}}a.Model3DRuntimeObjectRenderer=j})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=Model3DRuntimeObject3DRenderer.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../GDevelop/Extensions/3D/Model3DRuntimeObject3DRenderer.ts"],
|
|
4
|
-
"sourcesContent": ["namespace gdjs {\n type FloatPoint3D = [float, float, float];\n\n const epsilon = 1 / (1 << 16);\n\n const removeMetalness = (material: THREE.Material): void => {\n //@ts-ignore\n if (material.metalness) {\n //@ts-ignore\n material.metalness = 0;\n }\n };\n\n const removeMetalnessFromMesh = (node: THREE.Object3D) => {\n const mesh = node as THREE.Mesh;\n if (!mesh.material) {\n return;\n }\n if (Array.isArray(mesh.material)) {\n for (let index = 0; index < mesh.material.length; index++) {\n removeMetalness(mesh.material[index]);\n }\n } else {\n removeMetalness(mesh.material);\n }\n };\n\n const traverseToRemoveMetalnessFromMeshes = (node: THREE.Object3D) =>\n node.traverse(removeMetalnessFromMesh);\n\n const convertToBasicMaterial = (\n material: THREE.Material\n ): THREE.MeshBasicMaterial => {\n const basicMaterial = new THREE.MeshBasicMaterial();\n //@ts-ignore\n if (material.color) {\n //@ts-ignore\n basicMaterial.color = material.color;\n }\n //@ts-ignore\n if (material.map) {\n //@ts-ignore\n basicMaterial.map = material.map;\n }\n return basicMaterial;\n };\n\n const setBasicMaterialTo = (node: THREE.Object3D): void => {\n const mesh = node as THREE.Mesh;\n if (!mesh.material) {\n return;\n }\n\n if (Array.isArray(mesh.material)) {\n for (let index = 0; index < mesh.material.length; index++) {\n mesh.material[index] = convertToBasicMaterial(mesh.material[index]);\n }\n } else {\n mesh.material = convertToBasicMaterial(mesh.material);\n }\n };\n\n const traverseToSetBasicMaterialFromMeshes = (node: THREE.Object3D) =>\n node.traverse(setBasicMaterialTo);\n\n class Model3DRuntimeObject3DRenderer extends gdjs.RuntimeObject3DRenderer {\n private _model3DRuntimeObject: gdjs.Model3DRuntimeObject;\n /**\n * The 3D model stretched in a 1x1x1 cube.\n */\n private _threeObject: THREE.Object3D;\n private _originalModel: THREE_ADDONS.GLTF;\n private _animationMixer: THREE.AnimationMixer;\n private _action: THREE.AnimationAction | null;\n\n /**\n * The model origin evaluated according to the object configuration.\n *\n * Coordinates are between 0 and 1.\n */\n private _modelOriginPoint: FloatPoint3D;\n\n constructor(\n runtimeObject: gdjs.Model3DRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n // GLB files with skeleton must not have any transformation to work properly.\n const originalModel = instanceContainer\n .getGame()\n .getModel3DManager()\n .getModel(runtimeObject._modelResourceName);\n // _updateModel will actually add a clone of the model.\n const model = new THREE.Group();\n\n // Create a group to transform the object according to\n // position, angle and dimensions.\n const group = new THREE.Group();\n group.rotation.order = 'ZYX';\n group.add(model);\n super(runtimeObject, instanceContainer, group);\n\n this._model3DRuntimeObject = runtimeObject;\n this._threeObject = model;\n this._originalModel = originalModel;\n this._modelOriginPoint = [0, 0, 0];\n\n this.updateSize();\n this.updatePosition();\n this.updateRotation();\n\n this._animationMixer = new THREE.AnimationMixer(model);\n this._action = null;\n }\n\n updateAnimation(timeDelta: float) {\n this._animationMixer.update(timeDelta);\n }\n\n updatePosition() {\n const originPoint = this.getOriginPoint();\n const centerPoint = this.getCenterPoint();\n this.get3DRendererObject().position.set(\n this._object.getX() -\n this._object.getWidth() * (originPoint[0] - centerPoint[0]),\n this._object.getY() -\n this._object.getHeight() * (originPoint[1] - centerPoint[1]),\n this._object.getZ() -\n this._object.getDepth() * (originPoint[2] - centerPoint[2])\n );\n }\n\n getOriginPoint() {\n return this._model3DRuntimeObject._originPoint || this._modelOriginPoint;\n }\n\n getCenterPoint() {\n return this._model3DRuntimeObject._centerPoint || this._modelOriginPoint;\n }\n\n private _updateDefaultTransformation(\n threeObject: THREE.Object3D,\n rotationX: float,\n rotationY: float,\n rotationZ: float,\n originalWidth: float,\n originalHeight: float,\n originalDepth: float,\n keepAspectRatio: boolean\n ) {\n // These formulas are also used in:\n // - Model3DEditor.modelSize\n // - Model3DRendered2DInstance\n threeObject.rotation.set(\n gdjs.toRad(rotationX),\n gdjs.toRad(rotationY),\n gdjs.toRad(rotationZ)\n );\n threeObject.updateMatrixWorld(true);\n const boundingBox = new THREE.Box3().setFromObject(threeObject);\n\n const shouldKeepModelOrigin = !this._model3DRuntimeObject._originPoint;\n if (shouldKeepModelOrigin) {\n // Keep the origin as part of the model.\n // For instance, a model can be 1 face of a cube and we want to keep the\n // inside as part of the object even if it's just void.\n // It also avoids to have the origin outside of the object box.\n boundingBox.expandByPoint(new THREE.Vector3(0, 0, 0));\n }\n\n const modelWidth = boundingBox.max.x - boundingBox.min.x;\n const modelHeight = boundingBox.max.y - boundingBox.min.y;\n const modelDepth = boundingBox.max.z - boundingBox.min.z;\n this._modelOriginPoint[0] =\n modelWidth < epsilon ? 0 : -boundingBox.min.x / modelWidth;\n this._modelOriginPoint[1] =\n modelHeight < epsilon ? 0 : -boundingBox.min.y / modelHeight;\n this._modelOriginPoint[2] =\n modelDepth < epsilon ? 0 : -boundingBox.min.z / modelDepth;\n\n // The model is flipped on Y axis.\n this._modelOriginPoint[1] = 1 - this._modelOriginPoint[1];\n\n // Center the model.\n const centerPoint = this._model3DRuntimeObject._centerPoint;\n if (centerPoint) {\n threeObject.position.set(\n -(boundingBox.min.x + modelWidth * centerPoint[0]),\n // The model is flipped on Y axis.\n -(boundingBox.min.y + modelHeight * (1 - centerPoint[1])),\n -(boundingBox.min.z + modelDepth * centerPoint[2])\n );\n }\n\n // Rotate the model.\n threeObject.scale.set(1, 1, 1);\n threeObject.rotation.set(\n gdjs.toRad(rotationX),\n gdjs.toRad(rotationY),\n gdjs.toRad(rotationZ)\n );\n\n // Stretch the model in a 1x1x1 cube.\n const scaleX = modelWidth < epsilon ? 1 : 1 / modelWidth;\n const scaleY = modelHeight < epsilon ? 1 : 1 / modelHeight;\n const scaleZ = modelDepth < epsilon ? 1 : 1 / modelDepth;\n\n const scaleMatrix = new THREE.Matrix4();\n // Flip on Y because the Y axis is on the opposite side of direct basis.\n // It avoids models to be like a mirror refection.\n scaleMatrix.makeScale(scaleX, -scaleY, scaleZ);\n threeObject.updateMatrix();\n threeObject.applyMatrix4(scaleMatrix);\n\n if (keepAspectRatio) {\n // Reduce the object dimensions to keep aspect ratio.\n const widthRatio =\n modelWidth < epsilon\n ? Number.POSITIVE_INFINITY\n : originalWidth / modelWidth;\n const heightRatio =\n modelHeight < epsilon\n ? Number.POSITIVE_INFINITY\n : originalHeight / modelHeight;\n const depthRatio =\n modelDepth < epsilon\n ? Number.POSITIVE_INFINITY\n : originalDepth / modelDepth;\n let scaleRatio = Math.min(widthRatio, heightRatio, depthRatio);\n if (!Number.isFinite(scaleRatio)) {\n scaleRatio = 1;\n }\n\n this._object._setOriginalWidth(scaleRatio * modelWidth);\n this._object._setOriginalHeight(scaleRatio * modelHeight);\n this._object._setOriginalDepth(scaleRatio * modelDepth);\n }\n }\n\n /**\n * `_updateModel` should always be called after this method.\n * Ideally, use `Model3DRuntimeObject#_reloadModel` instead.\n */\n _reloadModel(\n runtimeObject: Model3DRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n this._originalModel = instanceContainer\n .getGame()\n .getModel3DManager()\n .getModel(runtimeObject._modelResourceName);\n }\n\n _updateModel(\n rotationX: float,\n rotationY: float,\n rotationZ: float,\n originalWidth: float,\n originalHeight: float,\n originalDepth: float,\n keepAspectRatio: boolean\n ) {\n // Start from the original model because:\n // - _replaceMaterials is destructive\n // - _updateDefaultTransformation may need to work with meshes in local space\n\n // This group hold the rotation defined by properties.\n const threeObject = new THREE.Group();\n threeObject.rotation.order = 'ZYX';\n const root = THREE_ADDONS.SkeletonUtils.clone(this._originalModel.scene);\n threeObject.add(root);\n\n this._replaceMaterials(threeObject);\n\n this._updateDefaultTransformation(\n threeObject,\n rotationX,\n rotationY,\n rotationZ,\n originalWidth,\n originalHeight,\n originalDepth,\n keepAspectRatio\n );\n\n // Replace the 3D object.\n this.get3DRendererObject().remove(this._threeObject);\n this.get3DRendererObject().add(threeObject);\n this._threeObject = threeObject;\n\n // Start the current animation on the new 3D object.\n this._animationMixer = new THREE.AnimationMixer(root);\n const isAnimationPaused = this._model3DRuntimeObject.isAnimationPaused();\n this._model3DRuntimeObject.setAnimationIndex(\n this._model3DRuntimeObject.getAnimationIndex()\n );\n if (isAnimationPaused) {\n this.pauseAnimation();\n }\n }\n\n /**\n * Replace materials to better work with lights (or no light).\n */\n private _replaceMaterials(threeObject: THREE.Object3D) {\n if (\n this._model3DRuntimeObject._materialType ===\n gdjs.Model3DRuntimeObject.MaterialType.StandardWithoutMetalness\n ) {\n traverseToRemoveMetalnessFromMeshes(threeObject);\n } else if (\n this._model3DRuntimeObject._materialType ===\n gdjs.Model3DRuntimeObject.MaterialType.Basic\n ) {\n traverseToSetBasicMaterialFromMeshes(threeObject);\n }\n }\n\n getAnimationCount() {\n return this._originalModel.animations.length;\n }\n\n getAnimationName(animationIndex: integer) {\n return this._originalModel.animations[animationIndex].name;\n }\n\n /**\n * Return true if animation has ended.\n * The animation had ended if:\n * - it's not configured as a loop;\n * - the current frame is the last frame;\n * - the last frame has been displayed long enough.\n */\n hasAnimationEnded(): boolean {\n if (!this._action) {\n return true;\n }\n return !this._action.isRunning();\n }\n\n animationPaused() {\n if (!this._action) {\n return;\n }\n return this._action.paused;\n }\n\n pauseAnimation() {\n if (!this._action) {\n return;\n }\n this._action.paused = true;\n }\n\n resumeAnimation() {\n if (!this._action) {\n return;\n }\n this._action.paused = false;\n }\n\n playAnimation(animationName: string, shouldLoop: boolean) {\n this._animationMixer.stopAllAction();\n const clip = THREE.AnimationClip.findByName(\n this._originalModel.animations,\n animationName\n );\n if (!clip) {\n console.error(\n `The GLB file: ${this._model3DRuntimeObject._modelResourceName} doesn't have any animation named: ${animationName}`\n );\n return;\n }\n this._action = this._animationMixer.clipAction(clip);\n this._action.setLoop(\n shouldLoop ? THREE.LoopRepeat : THREE.LoopOnce,\n Number.POSITIVE_INFINITY\n );\n this._action.clampWhenFinished = true;\n this._action.play();\n // Make sure the first frame is displayed.\n this._animationMixer.update(0);\n }\n\n getAnimationElapsedTime(): float {\n return this._action ? this._action.time : 0;\n }\n\n setAnimationElapsedTime(time: float): void {\n if (this._action) {\n this._action.time = time;\n }\n }\n\n getAnimationDuration(animationName: string): float {\n const clip = THREE.AnimationClip.findByName(\n this._originalModel.animations,\n animationName\n );\n return clip ? clip.duration : 0;\n }\n }\n\n export const Model3DRuntimeObjectRenderer = Model3DRuntimeObject3DRenderer;\n export type Model3DRuntimeObjectRenderer = Model3DRuntimeObject3DRenderer;\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["namespace gdjs {\n type FloatPoint3D = [float, float, float];\n\n const epsilon = 1 / (1 << 16);\n\n const removeMetalness = (material: THREE.Material): void => {\n //@ts-ignore\n if (material.metalness) {\n //@ts-ignore\n material.metalness = 0;\n }\n };\n\n const removeMetalnessFromMesh = (node: THREE.Object3D) => {\n const mesh = node as THREE.Mesh;\n if (!mesh.material) {\n return;\n }\n if (Array.isArray(mesh.material)) {\n for (let index = 0; index < mesh.material.length; index++) {\n removeMetalness(mesh.material[index]);\n }\n } else {\n removeMetalness(mesh.material);\n }\n };\n\n const traverseToRemoveMetalnessFromMeshes = (node: THREE.Object3D) =>\n node.traverse(removeMetalnessFromMesh);\n\n const convertToBasicMaterial = (\n material: THREE.Material\n ): THREE.MeshBasicMaterial => {\n const basicMaterial = new THREE.MeshBasicMaterial();\n //@ts-ignore\n if (material.color) {\n //@ts-ignore\n basicMaterial.color = material.color;\n }\n //@ts-ignore\n if (material.map) {\n //@ts-ignore\n basicMaterial.map = material.map;\n }\n return basicMaterial;\n };\n\n const setBasicMaterialTo = (node: THREE.Object3D): void => {\n const mesh = node as THREE.Mesh;\n if (!mesh.material) {\n return;\n }\n\n if (Array.isArray(mesh.material)) {\n for (let index = 0; index < mesh.material.length; index++) {\n mesh.material[index] = convertToBasicMaterial(mesh.material[index]);\n }\n } else {\n mesh.material = convertToBasicMaterial(mesh.material);\n }\n };\n\n const traverseToSetBasicMaterialFromMeshes = (node: THREE.Object3D) =>\n node.traverse(setBasicMaterialTo);\n\n class Model3DRuntimeObject3DRenderer extends gdjs.RuntimeObject3DRenderer {\n private _model3DRuntimeObject: gdjs.Model3DRuntimeObject;\n /**\n * The 3D model stretched in a 1x1x1 cube.\n */\n private _threeObject: THREE.Object3D;\n private _originalModel: THREE_ADDONS.GLTF;\n private _animationMixer: THREE.AnimationMixer;\n private _action: THREE.AnimationAction | null;\n\n /**\n * The model origin evaluated according to the object configuration.\n *\n * Coordinates are between 0 and 1.\n */\n private _modelOriginPoint: FloatPoint3D;\n\n constructor(\n runtimeObject: gdjs.Model3DRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n // GLB files with skeleton must not have any transformation to work properly.\n const originalModel = instanceContainer\n .getGame()\n .getModel3DManager()\n .getModel(runtimeObject._modelResourceName);\n // _updateModel will actually add a clone of the model.\n const model = new THREE.Group();\n\n // Create a group to transform the object according to\n // position, angle and dimensions.\n const group = new THREE.Group();\n group.rotation.order = 'ZYX';\n group.add(model);\n super(runtimeObject, instanceContainer, group);\n\n this._model3DRuntimeObject = runtimeObject;\n this._threeObject = model;\n this._originalModel = originalModel;\n this._modelOriginPoint = [0, 0, 0];\n\n this.updateSize();\n this.updatePosition();\n this.updateRotation();\n\n this._animationMixer = new THREE.AnimationMixer(model);\n this._action = null;\n }\n\n updateAnimation(timeDelta: float) {\n this._animationMixer.update(timeDelta);\n }\n\n updatePosition() {\n const originPoint = this.getOriginPoint();\n const centerPoint = this.getCenterPoint();\n this.get3DRendererObject().position.set(\n this._object.getX() -\n this._object.getWidth() * (originPoint[0] - centerPoint[0]),\n this._object.getY() -\n this._object.getHeight() * (originPoint[1] - centerPoint[1]),\n this._object.getZ() -\n this._object.getDepth() * (originPoint[2] - centerPoint[2])\n );\n }\n\n getOriginPoint() {\n return this._model3DRuntimeObject._originPoint || this._modelOriginPoint;\n }\n\n getCenterPoint() {\n return this._model3DRuntimeObject._centerPoint || this._modelOriginPoint;\n }\n\n private _updateDefaultTransformation(\n threeObject: THREE.Object3D,\n rotationX: float,\n rotationY: float,\n rotationZ: float,\n originalWidth: float,\n originalHeight: float,\n originalDepth: float,\n keepAspectRatio: boolean\n ) {\n // These formulas are also used in:\n // - Model3DEditor.modelSize\n // - Model3DRendered2DInstance\n threeObject.rotation.set(\n gdjs.toRad(rotationX),\n gdjs.toRad(rotationY),\n gdjs.toRad(rotationZ)\n );\n threeObject.updateMatrixWorld(true);\n const boundingBox = new THREE.Box3().setFromObject(threeObject);\n\n const shouldKeepModelOrigin = !this._model3DRuntimeObject._originPoint;\n if (shouldKeepModelOrigin) {\n // Keep the origin as part of the model.\n // For instance, a model can be 1 face of a cube and we want to keep the\n // inside as part of the object even if it's just void.\n // It also avoids to have the origin outside of the object box.\n boundingBox.expandByPoint(new THREE.Vector3(0, 0, 0));\n }\n\n const modelWidth = boundingBox.max.x - boundingBox.min.x;\n const modelHeight = boundingBox.max.y - boundingBox.min.y;\n const modelDepth = boundingBox.max.z - boundingBox.min.z;\n this._modelOriginPoint[0] =\n modelWidth < epsilon ? 0 : -boundingBox.min.x / modelWidth;\n this._modelOriginPoint[1] =\n modelHeight < epsilon ? 0 : -boundingBox.min.y / modelHeight;\n this._modelOriginPoint[2] =\n modelDepth < epsilon ? 0 : -boundingBox.min.z / modelDepth;\n\n // The model is flipped on Y axis.\n this._modelOriginPoint[1] = 1 - this._modelOriginPoint[1];\n\n // Center the model.\n const centerPoint = this._model3DRuntimeObject._centerPoint;\n if (centerPoint) {\n threeObject.position.set(\n -(boundingBox.min.x + modelWidth * centerPoint[0]),\n // The model is flipped on Y axis.\n -(boundingBox.min.y + modelHeight * (1 - centerPoint[1])),\n -(boundingBox.min.z + modelDepth * centerPoint[2])\n );\n }\n\n // Rotate the model.\n threeObject.scale.set(1, 1, 1);\n threeObject.rotation.set(\n gdjs.toRad(rotationX),\n gdjs.toRad(rotationY),\n gdjs.toRad(rotationZ)\n );\n\n // Stretch the model in a 1x1x1 cube.\n const scaleX = modelWidth < epsilon ? 1 : 1 / modelWidth;\n const scaleY = modelHeight < epsilon ? 1 : 1 / modelHeight;\n const scaleZ = modelDepth < epsilon ? 1 : 1 / modelDepth;\n\n const scaleMatrix = new THREE.Matrix4();\n // Flip on Y because the Y axis is on the opposite side of direct basis.\n // It avoids models to be like a mirror refection.\n scaleMatrix.makeScale(scaleX, -scaleY, scaleZ);\n threeObject.updateMatrix();\n threeObject.applyMatrix4(scaleMatrix);\n\n if (keepAspectRatio) {\n // Reduce the object dimensions to keep aspect ratio.\n const widthRatio =\n modelWidth < epsilon\n ? Number.POSITIVE_INFINITY\n : originalWidth / modelWidth;\n const heightRatio =\n modelHeight < epsilon\n ? Number.POSITIVE_INFINITY\n : originalHeight / modelHeight;\n const depthRatio =\n modelDepth < epsilon\n ? Number.POSITIVE_INFINITY\n : originalDepth / modelDepth;\n let scaleRatio = Math.min(widthRatio, heightRatio, depthRatio);\n if (!Number.isFinite(scaleRatio)) {\n scaleRatio = 1;\n }\n\n this._object._setOriginalWidth(scaleRatio * modelWidth);\n this._object._setOriginalHeight(scaleRatio * modelHeight);\n this._object._setOriginalDepth(scaleRatio * modelDepth);\n }\n }\n\n /**\n * `_updateModel` should always be called after this method.\n * Ideally, use `Model3DRuntimeObject#_reloadModel` instead.\n */\n _reloadModel(\n runtimeObject: Model3DRuntimeObject,\n instanceContainer: gdjs.RuntimeInstanceContainer\n ) {\n this._originalModel = instanceContainer\n .getGame()\n .getModel3DManager()\n .getModel(runtimeObject._modelResourceName);\n }\n\n _updateModel(\n rotationX: float,\n rotationY: float,\n rotationZ: float,\n originalWidth: float,\n originalHeight: float,\n originalDepth: float,\n keepAspectRatio: boolean\n ) {\n // Start from the original model because:\n // - _replaceMaterials is destructive\n // - _updateDefaultTransformation may need to work with meshes in local space\n\n // This group hold the rotation defined by properties.\n const threeObject = new THREE.Group();\n threeObject.rotation.order = 'ZYX';\n const root = THREE_ADDONS.SkeletonUtils.clone(this._originalModel.scene);\n threeObject.add(root);\n\n this._replaceMaterials(threeObject);\n\n this._updateDefaultTransformation(\n threeObject,\n rotationX,\n rotationY,\n rotationZ,\n originalWidth,\n originalHeight,\n originalDepth,\n keepAspectRatio\n );\n\n // Replace the 3D object.\n this.get3DRendererObject().remove(this._threeObject);\n this.get3DRendererObject().add(threeObject);\n this._threeObject = threeObject;\n\n // Start the current animation on the new 3D object.\n this._animationMixer = new THREE.AnimationMixer(root);\n const isAnimationPaused = this._model3DRuntimeObject.isAnimationPaused();\n this._model3DRuntimeObject.setAnimationIndex(\n this._model3DRuntimeObject.getAnimationIndex()\n );\n if (isAnimationPaused) {\n this.pauseAnimation();\n }\n }\n\n /**\n * Replace materials to better work with lights (or no light).\n */\n private _replaceMaterials(threeObject: THREE.Object3D) {\n if (\n this._model3DRuntimeObject._materialType ===\n gdjs.Model3DRuntimeObject.MaterialType.StandardWithoutMetalness\n ) {\n traverseToRemoveMetalnessFromMeshes(threeObject);\n } else if (\n this._model3DRuntimeObject._materialType ===\n gdjs.Model3DRuntimeObject.MaterialType.Basic\n ) {\n traverseToSetBasicMaterialFromMeshes(threeObject);\n }\n }\n\n getAnimationCount() {\n return this._originalModel.animations.length;\n }\n\n getAnimationName(animationIndex: integer) {\n return this._originalModel.animations[animationIndex].name;\n }\n\n /**\n * Return true if animation has ended.\n * The animation had ended if:\n * - it's not configured as a loop;\n * - the current frame is the last frame;\n * - the last frame has been displayed long enough.\n */\n hasAnimationEnded(): boolean {\n if (!this._action) {\n return true;\n }\n return !this._action.isRunning();\n }\n\n animationPaused() {\n if (!this._action) {\n return;\n }\n return this._action.paused;\n }\n\n pauseAnimation() {\n if (!this._action) {\n return;\n }\n this._action.paused = true;\n }\n\n resumeAnimation() {\n if (!this._action) {\n return;\n }\n this._action.paused = false;\n }\n\n playAnimation(animationName: string, shouldLoop: boolean) {\n const clip = THREE.AnimationClip.findByName(\n this._originalModel.animations,\n animationName\n );\n if (!clip) {\n console.error(\n `The GLB file: ${this._model3DRuntimeObject._modelResourceName} doesn't have any animation named: ${animationName}`\n );\n return;\n }\n const previousAction = this._action;\n this._action = this._animationMixer.clipAction(clip);\n this._action.setLoop(\n shouldLoop ? THREE.LoopRepeat : THREE.LoopOnce,\n Number.POSITIVE_INFINITY\n );\n this._action.clampWhenFinished = true;\n\n if (previousAction && previousAction !== this._action) {\n this._action.enabled = true;\n this._action.crossFadeFrom(\n previousAction,\n this._model3DRuntimeObject._crossfadeDuration,\n false\n );\n }\n this._action.play();\n // Make sure the first frame is displayed.\n this._animationMixer.update(0);\n }\n\n getAnimationElapsedTime(): float {\n return this._action ? this._action.time : 0;\n }\n\n setAnimationElapsedTime(time: float): void {\n if (this._action) {\n this._action.time = time;\n }\n }\n\n getAnimationDuration(animationName: string): float {\n const clip = THREE.AnimationClip.findByName(\n this._originalModel.animations,\n animationName\n );\n return clip ? clip.duration : 0;\n }\n }\n\n export const Model3DRuntimeObjectRenderer = Model3DRuntimeObject3DRenderer;\n export type Model3DRuntimeObjectRenderer = Model3DRuntimeObject3DRenderer;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -38,7 +38,7 @@ module.exports = {
|
|
|
38
38
|
.setName('Consent Cordova plugin')
|
|
39
39
|
.setDependencyType('cordova')
|
|
40
40
|
.setExportName('cordova-plugin-consent')
|
|
41
|
-
.setVersion('3.0.0-alpha.
|
|
41
|
+
.setVersion('3.0.0-alpha.9')
|
|
42
42
|
.onlyIfOtherDependencyIsExported('AdMob Cordova plugin');
|
|
43
43
|
|
|
44
44
|
extension
|
|
@@ -93,6 +93,68 @@ module.exports = {
|
|
|
93
93
|
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
|
94
94
|
.setFunctionName('gdjs.adMob.setTestMode');
|
|
95
95
|
|
|
96
|
+
extension
|
|
97
|
+
.addAction(
|
|
98
|
+
'PreventAdmobAutoInitialization',
|
|
99
|
+
_('Prevent AdMob auto initialization'),
|
|
100
|
+
_(
|
|
101
|
+
'Prevent AdMob from initializing automatically. You will need to call "Initialize AdMob" action manually.\n' +
|
|
102
|
+
'This is useful if you want to control when the consent dialog will be shown (for example, after the user has accepted your game terms).'
|
|
103
|
+
),
|
|
104
|
+
_('Prevent AdMob auto initialization'),
|
|
105
|
+
'',
|
|
106
|
+
'JsPlatform/Extensions/admobicon24.png',
|
|
107
|
+
'JsPlatform/Extensions/admobicon16.png'
|
|
108
|
+
)
|
|
109
|
+
.getCodeExtraInformation()
|
|
110
|
+
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
|
111
|
+
.setFunctionName('gdjs.adMob.preventAdmobAutoInitialization');
|
|
112
|
+
|
|
113
|
+
extension
|
|
114
|
+
.addAction(
|
|
115
|
+
'InitializeAdmob',
|
|
116
|
+
_('Initialize AdMob manually'),
|
|
117
|
+
_(
|
|
118
|
+
'Initialize AdMob manually. This will trigger the consent dialog if needed, and then load the ads.\n' +
|
|
119
|
+
'Use this action if you have disabled the auto init and want to control when the consent dialog will be shown.'
|
|
120
|
+
),
|
|
121
|
+
_('Initialize AdMob'),
|
|
122
|
+
'',
|
|
123
|
+
'JsPlatform/Extensions/admobicon24.png',
|
|
124
|
+
'JsPlatform/Extensions/admobicon16.png'
|
|
125
|
+
)
|
|
126
|
+
.getCodeExtraInformation()
|
|
127
|
+
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
|
128
|
+
.setFunctionName('gdjs.adMob.initializeAdmob');
|
|
129
|
+
|
|
130
|
+
extension
|
|
131
|
+
.addCondition(
|
|
132
|
+
'AdmobInitializing',
|
|
133
|
+
_('AdMob initializing'),
|
|
134
|
+
_('Check if AdMob is initializing.'),
|
|
135
|
+
_('AdMob is initializing'),
|
|
136
|
+
'',
|
|
137
|
+
'JsPlatform/Extensions/admobicon24.png',
|
|
138
|
+
'JsPlatform/Extensions/admobicon16.png'
|
|
139
|
+
)
|
|
140
|
+
.getCodeExtraInformation()
|
|
141
|
+
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
|
142
|
+
.setFunctionName('gdjs.adMob.isAdmobInitializing');
|
|
143
|
+
|
|
144
|
+
extension
|
|
145
|
+
.addCondition(
|
|
146
|
+
'AdmobInitialized',
|
|
147
|
+
_('AdMob initialized'),
|
|
148
|
+
_('Check if AdMob has been initialized.'),
|
|
149
|
+
_('AdMob has been initialized'),
|
|
150
|
+
'',
|
|
151
|
+
'JsPlatform/Extensions/admobicon24.png',
|
|
152
|
+
'JsPlatform/Extensions/admobicon16.png'
|
|
153
|
+
)
|
|
154
|
+
.getCodeExtraInformation()
|
|
155
|
+
.setIncludeFile('Extensions/AdMob/admobtools.js')
|
|
156
|
+
.setFunctionName('gdjs.adMob.isAdmobInitialized');
|
|
157
|
+
|
|
96
158
|
// App Open
|
|
97
159
|
extension
|
|
98
160
|
.addCondition(
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var gdjs;(function(
|
|
1
|
+
var gdjs;(function(J){let X;(function(r){const e=new J.Logger("AdMob"),H={appOpen:{android:"ca-app-pub-3940256099942544/9257395921",ios:"ca-app-pub-3940256099942544/5575463023"},banner:{android:"ca-app-pub-3940256099942544/6300978111",ios:"ca-app-pub-3940256099942544/2934735716"},interstitial:{android:"ca-app-pub-3940256099942544/1033173712",ios:"ca-app-pub-3940256099942544/4411468910"},interstitialVideo:{android:"ca-app-pub-3940256099942544/8691691433",ios:"ca-app-pub-3940256099942544/5135589807"},rewarded:{android:"ca-app-pub-3940256099942544/5224354917",ios:"ca-app-pub-3940256099942544/1712485313"},rewardedInterstitial:{android:"ca-app-pub-3940256099942544/5354046379",ios:"ca-app-pub-3940256099942544/6978759866"},native:{android:"ca-app-pub-3940256099942544/2247696110",ios:"ca-app-pub-3940256099942544/3986624511"},nativeVideo:{android:"ca-app-pub-3940256099942544/1044960115",ios:"ca-app-pub-3940256099942544/2521693316"}};let d;(function(s){s[s.BANNER=0]="BANNER",s[s.LARGE_BANNER=1]="LARGE_BANNER",s[s.MEDIUM_RECTANGLE=2]="MEDIUM_RECTANGLE",s[s.FULL_BANNER=3]="FULL_BANNER",s[s.LEADERBOARD=4]="LEADERBOARD",s[s.SMART_BANNER=5]="SMART_BANNER"})(d||(d={}));const Y={BANNER:0,LARGE_BANNER:1,MEDIUM_RECTANGLE:2,FULL_BANNER:3,LEADERBOARD:4,SMART_BANNER:5};let G;(function(n){n[n.Portrait=1]="Portrait",n[n.PortraitUpsideDown=2]="PortraitUpsideDown",n[n.LandscapeRight=3]="LandscapeRight",n[n.LandscapeLeft=4]="LandscapeLeft"})(G||(G={}));let A=!1,w=!1,W=!1,h,K=5,z=!1,k=!1,u=!1,O=!1,p,E=!1,g=!1,V=!1,y=!1,R,I=!1,m=!1,U=!1,x=!1,f,N=!1,L=!1,_=!1,q=!1,b=!1,c,B=!1,v=!1,D=!1,F=!1,S=!1,C="0",P=null;const Q=async()=>{if(A){e.warn("AdMob is already started.");return}if(w){e.warn("AdMob is already starting.");return}try{if(e.info("Starting AdMob."),w=!0,cordova.platformId==="ios")try{let t=await consent.trackingAuthorizationStatus();t===0&&(t=await consent.requestTrackingAuthorization()),(t===1||t===2)&&(C="1"),C="0"}catch(t){e.error("Error while asking for tracking authorization, continuing:",t)}try{await consent.getConsentStatus()===consent.ConsentStatus.Required&&await consent.requestInfoUpdate(),await consent.loadAndShowIfRequired()}catch(t){e.error("Error while asking for consent, continuing:",t)}await admob.start(),e.info("AdMob successfully started."),w=!1,A=!0}catch(t){e.error("Error while starting AdMob:",t),w=!1,A=!1}};document.addEventListener("deviceready",async()=>{w=!0,P=setTimeout(async()=>{w=!1,await Q()},2e3)},!1),r.preventAdmobAutoInitialization=()=>{P&&(w=!1,clearTimeout(P),P=null)},r.initializeAdmob=async()=>{r.preventAdmobAutoInitialization(),await Q()},r.isAdmobInitialized=()=>A,r.isAdmobInitializing=()=>w;const l=async()=>{if(typeof cordova=="undefined")return e.warn("We are not on mobile, AdMob will not be available."),!1;if(typeof admob=="undefined")return e.warn("AdMob has not been configured properly."),!1;if(!A){if(w){let t=0;for(;!A&&t<5e3;)await new Promise(a=>setTimeout(a,100)),t+=100}if(!A)return e.warn("AdMob is not started."),!1}return!0},T=(t,a,o)=>{if(typeof cordova=="undefined"){e.warn("Cordova is not available.");return}return cordova.platformId==="android"?W?H[o].android:t:cordova.platformId==="ios"?W?H[o].ios:a:(e.error("Unsupported platform: ",cordova.platformId),null)};r.setTestMode=async t=>{!await l()||(e.info("Setting AdMob test mode to:",t),W=t)},r.isAppOpenLoading=()=>I,r.isAppOpenReady=()=>m,r.isAppOpenShowing=()=>U,r.isAppOpenErrored=()=>x,r.loadAppOpen=async(t,a,o,i)=>{if(!await l()||I||U)return;const n=T(t,a,"appOpen");if(!!n){I=!0,m=!1,x=!1,R=new admob.AppOpenAd({adUnitId:n,orientation:o?4:1}),R.on("load",()=>{m=!0,I=!1}),R.on("loadfail",()=>{I=!1,x=!0}),R.on("show",()=>{U=!0,m=!1}),R.on("showfail",()=>{U=!1,x=!0}),R.on("dismiss",()=>{U=!1});try{e.info("Loading Admob App Open."),await R.load(),e.info("AdMob App Open successfully loaded."),I=!1,m=!0,i&&r.showAppOpen()}catch(te){e.error("Error while loading an App Open:",te),I=!1,m=!1,x=!0}}},r.showAppOpen=async()=>{if(!!await l()){if(!R){e.warn("App Open has not been set up, call loadAppOpen first.");return}if(!m){e.info("App Open not loaded yet, cannot display it.");return}x=!1;try{e.info("Showing AdMob App Open."),await R.show()}catch(t){e.error("Error while showing an AdMob App Open:",t),U=!1,x=!0}}},r.isBannerConfigured=()=>z,r.isBannerLoaded=()=>k,r.isBannerShowing=()=>u,r.isBannerErrored=()=>O,r.setBannerAdSizeType=t=>{K=Y[t]||5},r.setupBanner=async(t,a,o)=>{if(!await l())return;const i=T(t,a,"banner");!i||(h&&u&&(e.info("Banner already visible, hiding it to display new one."),await r.hideBanner()),z=!1,k=!1,h=new admob.BannerAd({adUnitId:i,position:o?"top":"bottom",size:K,offset:0,npa:C}),h.on("load",()=>{u=!0,k=!0}),h.on("loadfail",()=>{u=!1,k=!1,O=!0}),z=!0)},r.showBanner=async()=>{if(!h){e.info("Banner not configured, use setupBanner first.");return}if(u){e.info("Banner already visible. Ignoring.");return}O=!1;try{e.info("Showing AdMob banner."),await h.show(),k&&(u=!0)}catch(t){u=!1,O=!0,e.error("Error while showing an AdMob banner:",t)}},r.hideBanner=async()=>{if(!!await l()){if(!h||!u){e.warn("No banner is being shown.");return}await h.hide(),u=!1}},r.isInterstitialLoading=()=>E,r.isInterstitialReady=()=>g,r.isInterstitialShowing=()=>V,r.isInterstitialErrored=()=>y,r.loadInterstitial=async(t,a,o)=>{if(!await l()||E||V)return;const i=T(t,a,"interstitial");if(!!i){E=!0,g=!1,y=!1,p=new admob.InterstitialAd({adUnitId:i,npa:C}),p.on("load",()=>{g=!0,E=!1}),p.on("loadfail",()=>{E=!1,y=!0}),p.on("show",()=>{V=!0,g=!1}),p.on("showfail",()=>{V=!1,y=!0}),p.on("dismiss",()=>{V=!1});try{e.info("Loading Admob interstitial."),await p.load(),e.info("AdMob interstitial successfully loaded."),E=!1,g=!0,o&&r.showInterstitial()}catch(n){e.error("Error while loading a interstitial:",n),E=!1,g=!1,y=!0}}},r.showInterstitial=async()=>{if(!!await l()){if(!p){e.warn("Interstitial has not been set up, call loadInterstitial first.");return}if(!g){e.info("Interstitial not loaded yet, cannot display it.");return}y=!1;try{e.info("Showing AdMob interstitial."),await p.show()}catch(t){e.error("Error while showing an AdMob interstitial:",t),V=!1,y=!0}}},r.isRewardedInterstitialLoading=()=>N,r.isRewardedInterstitialReady=()=>L,r.isRewardedInterstitialShowing=()=>_,r.isRewardedInterstitialErrored=()=>b,r.wasRewardedInterstitialRewardReceived=function(t){const a=q;return t&&(q=!1),a},r.loadRewardedInterstitial=async(t,a,o)=>{if(!await l()||N||_)return;const i=T(t,a,"rewardedInterstitial");if(!!i){N=!0,L=!1,b=!1,f=new admob.RewardedInterstitialAd({adUnitId:i,npa:C}),f.on("load",()=>{L=!0,N=!1}),f.on("loadfail",()=>{N=!1,b=!0}),f.on("show",()=>{_=!0,L=!1}),f.on("showfail",()=>{_=!1,b=!0}),f.on("dismiss",()=>{_=!1}),f.on("reward",()=>{q=!0});try{e.info("Loading AdMob rewarded interstitial."),await f.load(),e.info("AdMob rewarded interstitial successfully loaded."),N=!1,L=!0,o&&r.showRewardedInterstitial()}catch(n){N=!1,L=!1,b=!0,e.error("Error while loading a rewarded interstitial:",n)}}},r.showRewardedInterstitial=async()=>{if(!!await l()){if(!f){e.warn("interstitial has not been set up, call loadRewardedInterstitial first.");return}L||e.info("Rewarded interstitial not loaded yet, cannot display it."),b=!1;try{e.info("Showing AdMob rewarded interstitial."),await f.show()}catch(t){e.error("Error while showing an AdMob rewarded interstitial:",t),_=!1,b=!0}}},r.markRewardedInterstitialRewardAsClaimed=()=>{q=!1},r.isRewardedVideoLoading=()=>B,r.isRewardedVideoReady=()=>v,r.isRewardedVideoShowing=()=>D,r.isRewardedVideoErrored=()=>S,r.wasRewardedVideoRewardReceived=function(t){const a=F;return t&&(F=!1),a},r.loadRewardedVideo=async(t,a,o)=>{if(!await l()||B||D)return;const i=T(t,a,"rewarded");if(!!i){B=!0,v=!1,S=!1,c=new admob.RewardedAd({adUnitId:i,npa:C}),c.on("load",()=>{v=!0,B=!1}),c.on("loadfail",()=>{B=!1,S=!0}),c.on("show",()=>{D=!0,v=!1}),c.on("showfail",()=>{D=!1,S=!0}),c.on("dismiss",()=>{D=!1}),c.on("reward",()=>{F=!0});try{e.info("Loading AdMob rewarded video."),await c.load(),e.info("AdMob rewarded video successfully loaded."),B=!1,v=!0,o&&r.showRewardedVideo()}catch(n){B=!1,v=!1,S=!0,e.error("Error while loading a rewarded video:",n)}}},r.showRewardedVideo=async()=>{if(!!await l()){if(!c){e.warn("Video has not been set up, call loadRewardedVideo first.");return}v||e.info("Rewarded video not loaded yet, cannot display it."),S=!1;try{e.info("Showing AdMob rewarded video."),await c.show()}catch(t){e.error("Error while showing an AdMob rewarded video:",t),D=!1,S=!0}}},r.markRewardedVideoRewardAsClaimed=()=>{F=!1}})(X=J.adMob||(J.adMob={}))})(gdjs||(gdjs={}));
|
|
2
2
|
//# sourceMappingURL=admobtools.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../GDevelop/Extensions/AdMob/admobtools.ts"],
|
|
4
|
-
"sourcesContent": ["namespace gdjs {\n declare var admob: any;\n declare var cordova: any;\n\n export namespace adMob {\n const logger = new gdjs.Logger('AdMob');\n\n const testAdIds = {\n appOpen: {\n android: 'ca-app-pub-3940256099942544/9257395921',\n ios: 'ca-app-pub-3940256099942544/5575463023',\n },\n banner: {\n android: 'ca-app-pub-3940256099942544/6300978111',\n ios: 'ca-app-pub-3940256099942544/2934735716',\n },\n interstitial: {\n android: 'ca-app-pub-3940256099942544/1033173712',\n ios: 'ca-app-pub-3940256099942544/4411468910',\n },\n interstitialVideo: {\n android: 'ca-app-pub-3940256099942544/8691691433',\n ios: 'ca-app-pub-3940256099942544/5135589807',\n },\n rewarded: {\n android: 'ca-app-pub-3940256099942544/5224354917',\n ios: 'ca-app-pub-3940256099942544/1712485313',\n },\n rewardedInterstitial: {\n android: 'ca-app-pub-3940256099942544/5354046379',\n ios: 'ca-app-pub-3940256099942544/6978759866',\n },\n native: {\n android: 'ca-app-pub-3940256099942544/2247696110',\n ios: 'ca-app-pub-3940256099942544/3986624511',\n },\n nativeVideo: {\n android: 'ca-app-pub-3940256099942544/1044960115',\n ios: 'ca-app-pub-3940256099942544/2521693316',\n },\n };\n\n enum AdSizeType {\n BANNER,\n LARGE_BANNER,\n MEDIUM_RECTANGLE,\n FULL_BANNER,\n LEADERBOARD,\n SMART_BANNER,\n }\n\n const adSizeTypes = {\n BANNER: AdSizeType.BANNER,\n LARGE_BANNER: AdSizeType.LARGE_BANNER,\n MEDIUM_RECTANGLE: AdSizeType.MEDIUM_RECTANGLE,\n FULL_BANNER: AdSizeType.FULL_BANNER,\n LEADERBOARD: AdSizeType.LEADERBOARD,\n SMART_BANNER: AdSizeType.SMART_BANNER,\n };\n\n enum AppOpenAdOrientation {\n Portrait = 1,\n PortraitUpsideDown = 2,\n LandscapeRight = 3,\n LandscapeLeft = 4,\n }\n\n // Admob does not initialize automatically, so we store a flag to know if it's initialized.\n let admobStarted = false;\n let isStarting = false;\n let isUsingTestAds = false;\n\n // Banner\n let banner;\n let bannerRequestedAdSizeType: AdSizeType = AdSizeType.SMART_BANNER;\n let bannerConfigured = false; // Becomes true when the user configures the ad id and the position of the banner.\n let bannerLoaded = false; // Becomes true when the banner is loaded by loaded.\n let bannerShowing = false; // Becomes true when loaded or when the user shows/hides the banner.\n let bannerErrored = false; // Becomes true when the banner fails to load.\n\n // Interstitial\n let interstitial;\n let interstitialLoading = false; // Becomes true when the interstitial is loading.\n let interstitialReady = false; // Becomes true when the interstitial is loaded and ready to be shown.\n let interstitialShowing = false; // Becomes true when the interstitial is showing.\n let interstitialErrored = false; // Becomes true when the interstitial fails to load.\n\n // App Open\n let appOpen;\n let appOpenLoading = false; // Becomes true when the appOpen is loading.\n let appOpenReady = false; // Becomes true when the appOpen is loaded and ready to be shown.\n let appOpenShowing = false; // Becomes true when the appOpen is showing.\n let appOpenErrored = false; // Becomes true when the appOpen fails to load.\n\n // Rewarded interstitial\n let rewardedInterstitial;\n let rewardedInterstitialLoading = false; // Becomes true when the interstitial is loading.\n let rewardedInterstitialReady = false; // Becomes true when the interstitial is loaded and ready to be shown.\n let rewardedInterstitialShowing = false; // Becomes true when the interstitial is showing.\n let rewardedInterstitialRewardReceived = false; // Becomes true when the interstitial is closed and the reward is received.\n let rewardedInterstitialErrored = false; // Becomes true when the interstitial fails to load.\n\n // Rewarded video\n let rewardedVideo;\n let rewardedVideoLoading = false; // Becomes true when the video is loading.\n let rewardedVideoReady = false; // Becomes true when the video is loaded and ready to be shown.\n let rewardedVideoShowing = false; // Becomes true when the video is showing.\n let rewardedVideoRewardReceived = false; // Becomes true when the video is closed and the reward is received.\n let rewardedVideoErrored = false; // Becomes true when the video fails to load.\n\n let npaValue = '0'; // TODO: expose an API to change this and also an automatic way using the consent SDK.\n\n // Admob initialization listener\n document.addEventListener(\n 'deviceready',\n async () => {\n // Obtain user consent ?\n\n logger.info('Starting AdMob.');\n isStarting = true;\n\n await admob.start();\n\n logger.info('AdMob successfully started.');\n isStarting = false;\n admobStarted = true;\n },\n false\n );\n\n /**\n * Helper to know if we are on mobile and admob is correctly initialized.\n */\n const checkIfAdMobIsAvailable = async () => {\n if (typeof cordova === 'undefined') {\n logger.warn('We are not on mobile, AdMob will not be available.');\n return false;\n }\n if (typeof admob === 'undefined') {\n logger.warn('AdMob has not been configured properly.');\n return false;\n }\n\n if (!admobStarted) {\n if (isStarting) {\n // Delay the call until AdMob is started, up to 5 seconds.\n let time = 0;\n while (!admobStarted && time < 5000) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n time += 100;\n }\n }\n\n if (!admobStarted) {\n logger.warn('AdMob is not started.');\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * Helper to get the correct ad id depending on the platform. Android and iOS use different ids.\n */\n const getAdUnitId = (androidAdUnitId, iosAdUnitId, type) => {\n if (typeof cordova === 'undefined') {\n logger.warn('Cordova is not available.');\n return;\n }\n if (cordova.platformId === 'android') {\n return isUsingTestAds ? testAdIds[type].android : androidAdUnitId;\n } else if (cordova.platformId === 'ios') {\n return isUsingTestAds ? testAdIds[type].ios : iosAdUnitId;\n }\n\n logger.error('Unsupported platform: ', cordova.platformId);\n return null;\n };\n\n /**\n * Activate or deactivate the test mode (\"development\" mode).\n * When activated, tests ads will be served instead of real ones.\n *\n * It is important to enable test ads during development so that you can click on them without\n * charging advertisers. If you click on too many ads without being in test mode, you risk your\n * account being flagged for invalid activity.\n */\n export const setTestMode = async (enable: boolean) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n logger.info('Setting AdMob test mode to:', enable);\n\n isUsingTestAds = enable;\n };\n\n // -------------------\n // ---- App Open -----\n // -------------------\n export const isAppOpenLoading = () => appOpenLoading;\n export const isAppOpenReady = () => appOpenReady;\n export const isAppOpenShowing = () => appOpenShowing;\n export const isAppOpenErrored = () => appOpenErrored;\n\n /** Load an AppOpen. */\n export const loadAppOpen = async (\n androidAdUnitId,\n iosAdUnitId,\n displayLandscape,\n displayWhenLoaded\n ) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n // If an appOpen is already loading or showing, we don't stop it.\n if (appOpenLoading || appOpenShowing) {\n return;\n }\n\n const adUnitId = getAdUnitId(androidAdUnitId, iosAdUnitId, 'appOpen');\n if (!adUnitId) return;\n\n appOpenLoading = true;\n appOpenReady = false;\n appOpenErrored = false;\n\n appOpen = new admob.AppOpenAd({\n adUnitId,\n orientation: displayLandscape\n ? AppOpenAdOrientation.LandscapeLeft\n : AppOpenAdOrientation.Portrait,\n });\n\n appOpen.on('load', () => {\n appOpenReady = true;\n appOpenLoading = false;\n });\n appOpen.on('loadfail', () => {\n appOpenLoading = false;\n appOpenErrored = true;\n });\n appOpen.on('show', () => {\n appOpenShowing = true;\n appOpenReady = false;\n });\n appOpen.on('showfail', () => {\n appOpenShowing = false;\n appOpenErrored = true;\n });\n appOpen.on('dismiss', () => {\n appOpenShowing = false;\n });\n\n try {\n logger.info('Loading Admob App Open.');\n await appOpen.load();\n logger.info('AdMob App Open successfully loaded.');\n appOpenLoading = false;\n appOpenReady = true;\n if (displayWhenLoaded) showAppOpen();\n } catch (error) {\n logger.error('Error while loading an App Open:', error);\n appOpenLoading = false;\n appOpenReady = false;\n appOpenErrored = true;\n }\n };\n\n /** Show the loaded appOpen. */\n export const showAppOpen = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!appOpen) {\n logger.warn('App Open has not been set up, call loadAppOpen first.');\n return;\n }\n if (!appOpenReady) {\n logger.info('App Open not loaded yet, cannot display it.');\n return;\n }\n appOpenErrored = false;\n\n try {\n logger.info('Showing AdMob App Open.');\n await appOpen.show();\n // AppOpen will be shown and\n // `appOpenShowing` will be updated thanks to events\n // (but it's too early to change it now).\n } catch (error) {\n logger.error('Error while showing an AdMob App Open:', error);\n appOpenShowing = false;\n appOpenErrored = true;\n }\n };\n\n // -----------------\n // ---- Banner -----\n // -----------------\n export const isBannerConfigured = () => bannerConfigured;\n export const isBannerLoaded = () => bannerLoaded;\n export const isBannerShowing = () => bannerShowing;\n export const isBannerErrored = () => bannerErrored;\n\n export const setBannerAdSizeType = (\n bannerAdSizeType:\n | 'BANNER'\n | 'LARGE_BANNER'\n | 'MEDIUM_RECTANGLE'\n | 'FULL_BANNER'\n | 'LEADERBOARD'\n | 'SMART_BANNER'\n ) => {\n bannerRequestedAdSizeType =\n adSizeTypes[bannerAdSizeType] || AdSizeType.SMART_BANNER;\n };\n\n /**\n * Set up a banner that can then be displayed by calling `showBanner`.\n * If a banner is already set up, it will be hidden and replaced by the new one.\n */\n export const setupBanner = async (androidAdUnitId, iosAdUnitId, atTop) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n const adUnitId = getAdUnitId(androidAdUnitId, iosAdUnitId, 'banner');\n if (!adUnitId) return;\n\n if (banner && bannerShowing) {\n logger.info('Banner already visible, hiding it to display new one.');\n await hideBanner();\n }\n\n bannerConfigured = false;\n bannerLoaded = false;\n\n banner = new admob.BannerAd({\n adUnitId,\n position: atTop ? 'top' : 'bottom',\n size: bannerRequestedAdSizeType,\n offset: 0,\n });\n\n banner.on('load', () => {\n bannerShowing = true;\n bannerLoaded = true;\n });\n banner.on('loadfail', () => {\n bannerShowing = false;\n bannerLoaded = false;\n bannerErrored = true;\n });\n\n bannerConfigured = true;\n };\n\n /**\n * Display a banner that was set up with `setupBanner` (and `setBannerAdSizeType`).\n */\n export const showBanner = async () => {\n if (!banner) {\n logger.info('Banner not configured, use setupBanner first.');\n return;\n }\n if (bannerShowing) {\n logger.info('Banner already visible. Ignoring.');\n return;\n }\n bannerErrored = false;\n\n try {\n logger.info('Showing AdMob banner.');\n await banner.show();\n if (bannerLoaded) {\n // Banner is already loaded, so it will be shown immediately.\n bannerShowing = true;\n }\n } catch (error) {\n bannerShowing = false;\n bannerErrored = true;\n logger.error('Error while showing an AdMob banner:', error);\n }\n };\n\n /** Hide the banner shown on screen. */\n export const hideBanner = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!banner || !bannerShowing) {\n logger.warn('No banner is being shown.');\n return;\n }\n\n await banner.hide();\n bannerShowing = false;\n // Note that the banner is still loaded, which is why bannerLoaded is not set to false.\n // We hide the banner, but keep it configured to display it again if needed.\n };\n\n // -----------------------\n // ---- Interstitial -----\n // -----------------------\n export const isInterstitialLoading = () => interstitialLoading;\n export const isInterstitialReady = () => interstitialReady;\n export const isInterstitialShowing = () => interstitialShowing;\n export const isInterstitialErrored = () => interstitialErrored;\n\n /** Load an interstitial. */\n export const loadInterstitial = async (\n androidAdUnitId,\n iosAdUnitId,\n displayWhenLoaded\n ) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n // If an interstitial is already loading or showing, we don't stop it.\n if (interstitialLoading || interstitialShowing) {\n return;\n }\n\n const adUnitId = getAdUnitId(\n androidAdUnitId,\n iosAdUnitId,\n 'interstitial'\n );\n if (!adUnitId) return;\n\n interstitialLoading = true;\n interstitialReady = false;\n interstitialErrored = false;\n\n interstitial = new admob.InterstitialAd({\n adUnitId,\n npa: npaValue,\n });\n\n interstitial.on('load', () => {\n interstitialReady = true;\n interstitialLoading = false;\n });\n interstitial.on('loadfail', () => {\n interstitialLoading = false;\n interstitialErrored = true;\n });\n interstitial.on('show', () => {\n interstitialShowing = true;\n interstitialReady = false;\n });\n interstitial.on('showfail', () => {\n interstitialShowing = false;\n interstitialErrored = true;\n });\n interstitial.on('dismiss', () => {\n interstitialShowing = false;\n });\n\n try {\n logger.info('Loading Admob interstitial.');\n await interstitial.load();\n logger.info('AdMob interstitial successfully loaded.');\n interstitialLoading = false;\n interstitialReady = true;\n if (displayWhenLoaded) showInterstitial();\n } catch (error) {\n logger.error('Error while loading a interstitial:', error);\n interstitialLoading = false;\n interstitialReady = false;\n interstitialErrored = true;\n }\n };\n\n /** Show the loaded interstitial. */\n export const showInterstitial = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!interstitial) {\n logger.warn(\n 'Interstitial has not been set up, call loadInterstitial first.'\n );\n return;\n }\n if (!interstitialReady) {\n logger.info('Interstitial not loaded yet, cannot display it.');\n return;\n }\n interstitialErrored = false;\n\n try {\n logger.info('Showing AdMob interstitial.');\n await interstitial.show();\n // Interstitial will be shown and\n // `interstitialShowing` will be updated thanks to events\n // (but it's too early to change it now).\n } catch (error) {\n logger.error('Error while showing an AdMob interstitial:', error);\n interstitialShowing = false;\n interstitialErrored = true;\n }\n };\n\n // --------------------------------\n // ---- Rewarded Interstitial -----\n // --------------------------------\n export const isRewardedInterstitialLoading = () =>\n rewardedInterstitialLoading;\n export const isRewardedInterstitialReady = () => rewardedInterstitialReady;\n export const isRewardedInterstitialShowing = () =>\n rewardedInterstitialShowing;\n export const isRewardedInterstitialErrored = () =>\n rewardedInterstitialErrored;\n\n /** Check if the reward of the rewarded interstitial was received. */\n export const wasRewardedInterstitialRewardReceived = function (\n markAsClaimed\n ) {\n const reward = rewardedInterstitialRewardReceived;\n if (markAsClaimed) {\n rewardedInterstitialRewardReceived = false;\n }\n return reward;\n };\n\n /** Load a rewarded interstitial. */\n export const loadRewardedInterstitial = async (\n androidAdUnitID,\n iosAdUnitID,\n displayWhenLoaded\n ) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n if (rewardedInterstitialLoading || rewardedInterstitialShowing) {\n return;\n }\n\n const adUnitId = getAdUnitId(\n androidAdUnitID,\n iosAdUnitID,\n 'rewardedInterstitial'\n );\n if (!adUnitId) return;\n\n rewardedInterstitialLoading = true;\n rewardedInterstitialReady = false;\n rewardedInterstitialErrored = false;\n\n rewardedInterstitial = new admob.RewardedInterstitialAd({\n adUnitId,\n npa: npaValue,\n });\n\n // Rewarded video event listeners\n rewardedInterstitial.on('load', () => {\n rewardedInterstitialReady = true;\n rewardedInterstitialLoading = false;\n });\n rewardedInterstitial.on('loadfail', () => {\n rewardedInterstitialLoading = false;\n rewardedInterstitialErrored = true;\n });\n rewardedInterstitial.on('show', () => {\n rewardedInterstitialShowing = true;\n rewardedInterstitialReady = false;\n });\n rewardedInterstitial.on('showfail', () => {\n rewardedInterstitialShowing = false;\n rewardedInterstitialErrored = true;\n });\n rewardedInterstitial.on('dismiss', () => {\n rewardedInterstitialShowing = false;\n });\n rewardedInterstitial.on('reward', () => {\n rewardedInterstitialRewardReceived = true;\n });\n\n try {\n logger.info('Loading AdMob rewarded interstitial.');\n await rewardedInterstitial.load();\n logger.info('AdMob rewarded interstitial successfully loaded.');\n rewardedInterstitialLoading = false;\n rewardedInterstitialReady = true;\n if (displayWhenLoaded) showRewardedInterstitial();\n } catch (error) {\n rewardedInterstitialLoading = false;\n rewardedInterstitialReady = false;\n rewardedInterstitialErrored = true;\n logger.error('Error while loading a rewarded interstitial:', error);\n }\n };\n\n /** Show the loaded reward interstitial. */\n export const showRewardedInterstitial = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!rewardedInterstitial) {\n logger.warn(\n 'interstitial has not been set up, call loadRewardedInterstitial first.'\n );\n return;\n }\n if (!rewardedInterstitialReady) {\n logger.info('Rewarded interstitial not loaded yet, cannot display it.');\n }\n rewardedInterstitialErrored = false;\n\n try {\n logger.info('Showing AdMob rewarded interstitial.');\n await rewardedInterstitial.show();\n // Rewarded interstitial will be shown and\n // `rewardedInterstitialShowing` will be updated thanks to events\n // (but it's too early to change it now).\n } catch (error) {\n logger.error(\n 'Error while showing an AdMob rewarded interstitial:',\n error\n );\n rewardedInterstitialShowing = false;\n rewardedInterstitialErrored = true;\n }\n };\n\n /** Mark the reward of the interstitial as claimed. */\n export const markRewardedInterstitialRewardAsClaimed = () => {\n rewardedInterstitialRewardReceived = false;\n };\n\n // -------------------------\n // ---- Rewarded Video -----\n // -------------------------\n export const isRewardedVideoLoading = () => rewardedVideoLoading;\n export const isRewardedVideoReady = () => rewardedVideoReady;\n export const isRewardedVideoShowing = () => rewardedVideoShowing;\n export const isRewardedVideoErrored = () => rewardedVideoErrored;\n\n /** Check if the reward of the rewarded video was received. */\n export const wasRewardedVideoRewardReceived = function (markAsClaimed) {\n const reward = rewardedVideoRewardReceived;\n if (markAsClaimed) {\n rewardedVideoRewardReceived = false;\n }\n return reward;\n };\n\n /** Load a rewarded video. */\n export const loadRewardedVideo = async (\n androidAdUnitID,\n iosAdUnitID,\n displayWhenLoaded\n ) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n if (rewardedVideoLoading || rewardedVideoShowing) {\n return;\n }\n\n const adUnitId = getAdUnitId(androidAdUnitID, iosAdUnitID, 'rewarded');\n if (!adUnitId) return;\n\n rewardedVideoLoading = true;\n rewardedVideoReady = false;\n rewardedVideoErrored = false;\n\n rewardedVideo = new admob.RewardedAd({\n adUnitId,\n npa: npaValue,\n });\n\n // Rewarded video event listeners\n rewardedVideo.on('load', () => {\n rewardedVideoReady = true;\n rewardedVideoLoading = false;\n });\n rewardedVideo.on('loadfail', () => {\n rewardedVideoLoading = false;\n rewardedVideoErrored = true;\n });\n rewardedVideo.on('show', () => {\n rewardedVideoShowing = true;\n rewardedVideoReady = false;\n });\n rewardedVideo.on('showfail', () => {\n rewardedVideoShowing = false;\n rewardedVideoErrored = true;\n });\n rewardedVideo.on('dismiss', () => {\n rewardedVideoShowing = false;\n });\n rewardedVideo.on('reward', () => {\n rewardedVideoRewardReceived = true;\n });\n\n try {\n logger.info('Loading AdMob rewarded video.');\n await rewardedVideo.load();\n logger.info('AdMob rewarded video successfully loaded.');\n rewardedVideoLoading = false;\n rewardedVideoReady = true;\n if (displayWhenLoaded) showRewardedVideo();\n } catch (error) {\n rewardedVideoLoading = false;\n rewardedVideoReady = false;\n rewardedVideoErrored = true;\n logger.error('Error while loading a rewarded video:', error);\n }\n };\n\n /** Show the loaded reward video. */\n export const showRewardedVideo = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!rewardedVideo) {\n logger.warn('Video has not been set up, call loadRewardedVideo first.');\n return;\n }\n if (!rewardedVideoReady) {\n logger.info('Rewarded video not loaded yet, cannot display it.');\n }\n rewardedVideoErrored = false;\n\n try {\n logger.info('Showing AdMob rewarded video.');\n await rewardedVideo.show();\n // Rewarded video will be shown and\n // `rewardedVideoShowing` will be updated thanks to events\n // (but it's too early to change it now).\n } catch (error) {\n logger.error('Error while showing an AdMob rewarded video:', error);\n rewardedVideoShowing = false;\n rewardedVideoErrored = true;\n }\n };\n\n /** Mark the reward of the video as claimed. */\n export const markRewardedVideoRewardAsClaimed = () => {\n rewardedVideoRewardReceived = false;\n };\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,GAAU,MAAV,UAAU,EAAV,
|
|
4
|
+
"sourcesContent": ["namespace gdjs {\n declare var admob: any;\n declare var cordova: any;\n declare var consent: any;\n\n export namespace adMob {\n const logger = new gdjs.Logger('AdMob');\n\n const testAdIds = {\n appOpen: {\n android: 'ca-app-pub-3940256099942544/9257395921',\n ios: 'ca-app-pub-3940256099942544/5575463023',\n },\n banner: {\n android: 'ca-app-pub-3940256099942544/6300978111',\n ios: 'ca-app-pub-3940256099942544/2934735716',\n },\n interstitial: {\n android: 'ca-app-pub-3940256099942544/1033173712',\n ios: 'ca-app-pub-3940256099942544/4411468910',\n },\n interstitialVideo: {\n android: 'ca-app-pub-3940256099942544/8691691433',\n ios: 'ca-app-pub-3940256099942544/5135589807',\n },\n rewarded: {\n android: 'ca-app-pub-3940256099942544/5224354917',\n ios: 'ca-app-pub-3940256099942544/1712485313',\n },\n rewardedInterstitial: {\n android: 'ca-app-pub-3940256099942544/5354046379',\n ios: 'ca-app-pub-3940256099942544/6978759866',\n },\n native: {\n android: 'ca-app-pub-3940256099942544/2247696110',\n ios: 'ca-app-pub-3940256099942544/3986624511',\n },\n nativeVideo: {\n android: 'ca-app-pub-3940256099942544/1044960115',\n ios: 'ca-app-pub-3940256099942544/2521693316',\n },\n };\n\n enum AdSizeType {\n BANNER,\n LARGE_BANNER,\n MEDIUM_RECTANGLE,\n FULL_BANNER,\n LEADERBOARD,\n SMART_BANNER,\n }\n\n const adSizeTypes = {\n BANNER: AdSizeType.BANNER,\n LARGE_BANNER: AdSizeType.LARGE_BANNER,\n MEDIUM_RECTANGLE: AdSizeType.MEDIUM_RECTANGLE,\n FULL_BANNER: AdSizeType.FULL_BANNER,\n LEADERBOARD: AdSizeType.LEADERBOARD,\n SMART_BANNER: AdSizeType.SMART_BANNER,\n };\n\n enum AppOpenAdOrientation {\n Portrait = 1,\n PortraitUpsideDown = 2,\n LandscapeRight = 3,\n LandscapeLeft = 4,\n }\n\n // Admob does not initialize automatically, so we store a flag to know if it's initialized.\n let admobStarted = false;\n let isStarting = false;\n let isUsingTestAds = false;\n\n // Banner\n let banner;\n let bannerRequestedAdSizeType: AdSizeType = AdSizeType.SMART_BANNER;\n let bannerConfigured = false; // Becomes true when the user configures the ad id and the position of the banner.\n let bannerLoaded = false; // Becomes true when the banner is loaded by loaded.\n let bannerShowing = false; // Becomes true when loaded or when the user shows/hides the banner.\n let bannerErrored = false; // Becomes true when the banner fails to load.\n\n // Interstitial\n let interstitial;\n let interstitialLoading = false; // Becomes true when the interstitial is loading.\n let interstitialReady = false; // Becomes true when the interstitial is loaded and ready to be shown.\n let interstitialShowing = false; // Becomes true when the interstitial is showing.\n let interstitialErrored = false; // Becomes true when the interstitial fails to load.\n\n // App Open\n let appOpen;\n let appOpenLoading = false; // Becomes true when the appOpen is loading.\n let appOpenReady = false; // Becomes true when the appOpen is loaded and ready to be shown.\n let appOpenShowing = false; // Becomes true when the appOpen is showing.\n let appOpenErrored = false; // Becomes true when the appOpen fails to load.\n\n // Rewarded interstitial\n let rewardedInterstitial;\n let rewardedInterstitialLoading = false; // Becomes true when the interstitial is loading.\n let rewardedInterstitialReady = false; // Becomes true when the interstitial is loaded and ready to be shown.\n let rewardedInterstitialShowing = false; // Becomes true when the interstitial is showing.\n let rewardedInterstitialRewardReceived = false; // Becomes true when the interstitial is closed and the reward is received.\n let rewardedInterstitialErrored = false; // Becomes true when the interstitial fails to load.\n\n // Rewarded video\n let rewardedVideo;\n let rewardedVideoLoading = false; // Becomes true when the video is loading.\n let rewardedVideoReady = false; // Becomes true when the video is loaded and ready to be shown.\n let rewardedVideoShowing = false; // Becomes true when the video is showing.\n let rewardedVideoRewardReceived = false; // Becomes true when the video is closed and the reward is received.\n let rewardedVideoErrored = false; // Becomes true when the video fails to load.\n\n let npaValue = '0'; // 0 means that the user has consented to personalized ads, 1 means that the user has not consented to personalized ads.\n\n let setupTimeoutId: NodeJS.Timeout | null = null;\n\n const askForConsentAndInitializeAdmob = async () => {\n if (admobStarted) {\n logger.warn('AdMob is already started.');\n return;\n }\n\n if (isStarting) {\n logger.warn('AdMob is already starting.');\n return;\n }\n\n try {\n logger.info('Starting AdMob.');\n isStarting = true;\n\n if (cordova.platformId === 'ios') {\n try {\n /*\n trackingStatus:\n 0 = notDetermined\n 1 = restricted\n 2 = denied\n 3 = authorized\n */\n let trackingStatus = await consent.trackingAuthorizationStatus();\n\n // If tracking is not determined, we ask the user for tracking authorization.\n if (trackingStatus === 0) {\n trackingStatus = await consent.requestTrackingAuthorization();\n }\n\n // If tracking is restricted or denied, we set npaValue to 1.\n if (trackingStatus === 1 || trackingStatus === 2) {\n npaValue = '1';\n }\n\n // otherwise, we set npaValue to 0.\n npaValue = '0';\n } catch (error) {\n logger.error(\n 'Error while asking for tracking authorization, continuing:',\n error\n );\n }\n }\n\n try {\n // ConsentStatus:\n // Unknown = 0,\n // Required = 1,\n // NotRequired = 2,\n // Obtained = 3,\n const consentStatus = await consent.getConsentStatus();\n if (consentStatus === consent.ConsentStatus.Required) {\n await consent.requestInfoUpdate();\n }\n await consent.loadAndShowIfRequired();\n } catch (error) {\n logger.error('Error while asking for consent, continuing:', error);\n }\n\n // We should be looking at canRequestAds to know if we can request ads or not.\n // But as we want to be able to test ads in debug or if the consent didn't work,\n // we ignore this value for now.\n // const canRequestAds = await consent.canRequestAds();\n if (true) {\n await admob.start();\n\n logger.info('AdMob successfully started.');\n isStarting = false;\n admobStarted = true;\n }\n } catch (error) {\n logger.error('Error while starting AdMob:', error);\n isStarting = false;\n admobStarted = false;\n }\n };\n\n // Admob initialization listener\n document.addEventListener(\n 'deviceready',\n async () => {\n isStarting = true;\n setupTimeoutId = setTimeout(async () => {\n isStarting = false; // Reset to false, as it will be set to true in askForConsentAndInitializeAdmob.\n await askForConsentAndInitializeAdmob();\n // Wait a bit before starting admob, to avoid the consent appearing too soon.\n }, 2000);\n },\n false\n );\n\n export const preventAdmobAutoInitialization = () => {\n if (setupTimeoutId) {\n isStarting = false;\n clearTimeout(setupTimeoutId);\n setupTimeoutId = null;\n }\n };\n\n export const initializeAdmob = async () => {\n preventAdmobAutoInitialization();\n await askForConsentAndInitializeAdmob();\n };\n\n export const isAdmobInitialized = () => admobStarted;\n export const isAdmobInitializing = () => isStarting;\n\n /**\n * Helper to know if we are on mobile and admob is correctly initialized.\n */\n const checkIfAdMobIsAvailable = async () => {\n if (typeof cordova === 'undefined') {\n logger.warn('We are not on mobile, AdMob will not be available.');\n return false;\n }\n if (typeof admob === 'undefined') {\n logger.warn('AdMob has not been configured properly.');\n return false;\n }\n\n if (!admobStarted) {\n if (isStarting) {\n // Delay the call until AdMob is started, up to 5 seconds.\n let time = 0;\n while (!admobStarted && time < 5000) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n time += 100;\n }\n }\n\n if (!admobStarted) {\n logger.warn('AdMob is not started.');\n return false;\n }\n }\n\n return true;\n };\n\n /**\n * Helper to get the correct ad id depending on the platform. Android and iOS use different ids.\n */\n const getAdUnitId = (androidAdUnitId, iosAdUnitId, type) => {\n if (typeof cordova === 'undefined') {\n logger.warn('Cordova is not available.');\n return;\n }\n if (cordova.platformId === 'android') {\n return isUsingTestAds ? testAdIds[type].android : androidAdUnitId;\n } else if (cordova.platformId === 'ios') {\n return isUsingTestAds ? testAdIds[type].ios : iosAdUnitId;\n }\n\n logger.error('Unsupported platform: ', cordova.platformId);\n return null;\n };\n\n /**\n * Activate or deactivate the test mode (\"development\" mode).\n * When activated, tests ads will be served instead of real ones.\n *\n * It is important to enable test ads during development so that you can click on them without\n * charging advertisers. If you click on too many ads without being in test mode, you risk your\n * account being flagged for invalid activity.\n */\n export const setTestMode = async (enable: boolean) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n logger.info('Setting AdMob test mode to:', enable);\n\n isUsingTestAds = enable;\n };\n\n // -------------------\n // ---- App Open -----\n // -------------------\n export const isAppOpenLoading = () => appOpenLoading;\n export const isAppOpenReady = () => appOpenReady;\n export const isAppOpenShowing = () => appOpenShowing;\n export const isAppOpenErrored = () => appOpenErrored;\n\n /** Load an AppOpen. */\n export const loadAppOpen = async (\n androidAdUnitId,\n iosAdUnitId,\n displayLandscape,\n displayWhenLoaded\n ) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n // If an appOpen is already loading or showing, we don't stop it.\n if (appOpenLoading || appOpenShowing) {\n return;\n }\n\n const adUnitId = getAdUnitId(androidAdUnitId, iosAdUnitId, 'appOpen');\n if (!adUnitId) return;\n\n appOpenLoading = true;\n appOpenReady = false;\n appOpenErrored = false;\n\n appOpen = new admob.AppOpenAd({\n adUnitId,\n orientation: displayLandscape\n ? AppOpenAdOrientation.LandscapeLeft\n : AppOpenAdOrientation.Portrait,\n });\n\n appOpen.on('load', () => {\n appOpenReady = true;\n appOpenLoading = false;\n });\n appOpen.on('loadfail', () => {\n appOpenLoading = false;\n appOpenErrored = true;\n });\n appOpen.on('show', () => {\n appOpenShowing = true;\n appOpenReady = false;\n });\n appOpen.on('showfail', () => {\n appOpenShowing = false;\n appOpenErrored = true;\n });\n appOpen.on('dismiss', () => {\n appOpenShowing = false;\n });\n\n try {\n logger.info('Loading Admob App Open.');\n await appOpen.load();\n logger.info('AdMob App Open successfully loaded.');\n appOpenLoading = false;\n appOpenReady = true;\n if (displayWhenLoaded) showAppOpen();\n } catch (error) {\n logger.error('Error while loading an App Open:', error);\n appOpenLoading = false;\n appOpenReady = false;\n appOpenErrored = true;\n }\n };\n\n /** Show the loaded appOpen. */\n export const showAppOpen = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!appOpen) {\n logger.warn('App Open has not been set up, call loadAppOpen first.');\n return;\n }\n if (!appOpenReady) {\n logger.info('App Open not loaded yet, cannot display it.');\n return;\n }\n appOpenErrored = false;\n\n try {\n logger.info('Showing AdMob App Open.');\n await appOpen.show();\n // AppOpen will be shown and\n // `appOpenShowing` will be updated thanks to events\n // (but it's too early to change it now).\n } catch (error) {\n logger.error('Error while showing an AdMob App Open:', error);\n appOpenShowing = false;\n appOpenErrored = true;\n }\n };\n\n // -----------------\n // ---- Banner -----\n // -----------------\n export const isBannerConfigured = () => bannerConfigured;\n export const isBannerLoaded = () => bannerLoaded;\n export const isBannerShowing = () => bannerShowing;\n export const isBannerErrored = () => bannerErrored;\n\n export const setBannerAdSizeType = (\n bannerAdSizeType:\n | 'BANNER'\n | 'LARGE_BANNER'\n | 'MEDIUM_RECTANGLE'\n | 'FULL_BANNER'\n | 'LEADERBOARD'\n | 'SMART_BANNER'\n ) => {\n bannerRequestedAdSizeType =\n adSizeTypes[bannerAdSizeType] || AdSizeType.SMART_BANNER;\n };\n\n /**\n * Set up a banner that can then be displayed by calling `showBanner`.\n * If a banner is already set up, it will be hidden and replaced by the new one.\n */\n export const setupBanner = async (androidAdUnitId, iosAdUnitId, atTop) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n const adUnitId = getAdUnitId(androidAdUnitId, iosAdUnitId, 'banner');\n if (!adUnitId) return;\n\n if (banner && bannerShowing) {\n logger.info('Banner already visible, hiding it to display new one.');\n await hideBanner();\n }\n\n bannerConfigured = false;\n bannerLoaded = false;\n\n banner = new admob.BannerAd({\n adUnitId,\n position: atTop ? 'top' : 'bottom',\n size: bannerRequestedAdSizeType,\n offset: 0,\n npa: npaValue,\n });\n\n banner.on('load', () => {\n bannerShowing = true;\n bannerLoaded = true;\n });\n banner.on('loadfail', () => {\n bannerShowing = false;\n bannerLoaded = false;\n bannerErrored = true;\n });\n\n bannerConfigured = true;\n };\n\n /**\n * Display a banner that was set up with `setupBanner` (and `setBannerAdSizeType`).\n */\n export const showBanner = async () => {\n if (!banner) {\n logger.info('Banner not configured, use setupBanner first.');\n return;\n }\n if (bannerShowing) {\n logger.info('Banner already visible. Ignoring.');\n return;\n }\n bannerErrored = false;\n\n try {\n logger.info('Showing AdMob banner.');\n await banner.show();\n if (bannerLoaded) {\n // Banner is already loaded, so it will be shown immediately.\n bannerShowing = true;\n }\n } catch (error) {\n bannerShowing = false;\n bannerErrored = true;\n logger.error('Error while showing an AdMob banner:', error);\n }\n };\n\n /** Hide the banner shown on screen. */\n export const hideBanner = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!banner || !bannerShowing) {\n logger.warn('No banner is being shown.');\n return;\n }\n\n await banner.hide();\n bannerShowing = false;\n // Note that the banner is still loaded, which is why bannerLoaded is not set to false.\n // We hide the banner, but keep it configured to display it again if needed.\n };\n\n // -----------------------\n // ---- Interstitial -----\n // -----------------------\n export const isInterstitialLoading = () => interstitialLoading;\n export const isInterstitialReady = () => interstitialReady;\n export const isInterstitialShowing = () => interstitialShowing;\n export const isInterstitialErrored = () => interstitialErrored;\n\n /** Load an interstitial. */\n export const loadInterstitial = async (\n androidAdUnitId,\n iosAdUnitId,\n displayWhenLoaded\n ) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n // If an interstitial is already loading or showing, we don't stop it.\n if (interstitialLoading || interstitialShowing) {\n return;\n }\n\n const adUnitId = getAdUnitId(\n androidAdUnitId,\n iosAdUnitId,\n 'interstitial'\n );\n if (!adUnitId) return;\n\n interstitialLoading = true;\n interstitialReady = false;\n interstitialErrored = false;\n\n interstitial = new admob.InterstitialAd({\n adUnitId,\n npa: npaValue,\n });\n\n interstitial.on('load', () => {\n interstitialReady = true;\n interstitialLoading = false;\n });\n interstitial.on('loadfail', () => {\n interstitialLoading = false;\n interstitialErrored = true;\n });\n interstitial.on('show', () => {\n interstitialShowing = true;\n interstitialReady = false;\n });\n interstitial.on('showfail', () => {\n interstitialShowing = false;\n interstitialErrored = true;\n });\n interstitial.on('dismiss', () => {\n interstitialShowing = false;\n });\n\n try {\n logger.info('Loading Admob interstitial.');\n await interstitial.load();\n logger.info('AdMob interstitial successfully loaded.');\n interstitialLoading = false;\n interstitialReady = true;\n if (displayWhenLoaded) showInterstitial();\n } catch (error) {\n logger.error('Error while loading a interstitial:', error);\n interstitialLoading = false;\n interstitialReady = false;\n interstitialErrored = true;\n }\n };\n\n /** Show the loaded interstitial. */\n export const showInterstitial = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!interstitial) {\n logger.warn(\n 'Interstitial has not been set up, call loadInterstitial first.'\n );\n return;\n }\n if (!interstitialReady) {\n logger.info('Interstitial not loaded yet, cannot display it.');\n return;\n }\n interstitialErrored = false;\n\n try {\n logger.info('Showing AdMob interstitial.');\n await interstitial.show();\n // Interstitial will be shown and\n // `interstitialShowing` will be updated thanks to events\n // (but it's too early to change it now).\n } catch (error) {\n logger.error('Error while showing an AdMob interstitial:', error);\n interstitialShowing = false;\n interstitialErrored = true;\n }\n };\n\n // --------------------------------\n // ---- Rewarded Interstitial -----\n // --------------------------------\n export const isRewardedInterstitialLoading = () =>\n rewardedInterstitialLoading;\n export const isRewardedInterstitialReady = () => rewardedInterstitialReady;\n export const isRewardedInterstitialShowing = () =>\n rewardedInterstitialShowing;\n export const isRewardedInterstitialErrored = () =>\n rewardedInterstitialErrored;\n\n /** Check if the reward of the rewarded interstitial was received. */\n export const wasRewardedInterstitialRewardReceived = function (\n markAsClaimed\n ) {\n const reward = rewardedInterstitialRewardReceived;\n if (markAsClaimed) {\n rewardedInterstitialRewardReceived = false;\n }\n return reward;\n };\n\n /** Load a rewarded interstitial. */\n export const loadRewardedInterstitial = async (\n androidAdUnitID,\n iosAdUnitID,\n displayWhenLoaded\n ) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n if (rewardedInterstitialLoading || rewardedInterstitialShowing) {\n return;\n }\n\n const adUnitId = getAdUnitId(\n androidAdUnitID,\n iosAdUnitID,\n 'rewardedInterstitial'\n );\n if (!adUnitId) return;\n\n rewardedInterstitialLoading = true;\n rewardedInterstitialReady = false;\n rewardedInterstitialErrored = false;\n\n rewardedInterstitial = new admob.RewardedInterstitialAd({\n adUnitId,\n npa: npaValue,\n });\n\n // Rewarded video event listeners\n rewardedInterstitial.on('load', () => {\n rewardedInterstitialReady = true;\n rewardedInterstitialLoading = false;\n });\n rewardedInterstitial.on('loadfail', () => {\n rewardedInterstitialLoading = false;\n rewardedInterstitialErrored = true;\n });\n rewardedInterstitial.on('show', () => {\n rewardedInterstitialShowing = true;\n rewardedInterstitialReady = false;\n });\n rewardedInterstitial.on('showfail', () => {\n rewardedInterstitialShowing = false;\n rewardedInterstitialErrored = true;\n });\n rewardedInterstitial.on('dismiss', () => {\n rewardedInterstitialShowing = false;\n });\n rewardedInterstitial.on('reward', () => {\n rewardedInterstitialRewardReceived = true;\n });\n\n try {\n logger.info('Loading AdMob rewarded interstitial.');\n await rewardedInterstitial.load();\n logger.info('AdMob rewarded interstitial successfully loaded.');\n rewardedInterstitialLoading = false;\n rewardedInterstitialReady = true;\n if (displayWhenLoaded) showRewardedInterstitial();\n } catch (error) {\n rewardedInterstitialLoading = false;\n rewardedInterstitialReady = false;\n rewardedInterstitialErrored = true;\n logger.error('Error while loading a rewarded interstitial:', error);\n }\n };\n\n /** Show the loaded reward interstitial. */\n export const showRewardedInterstitial = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!rewardedInterstitial) {\n logger.warn(\n 'interstitial has not been set up, call loadRewardedInterstitial first.'\n );\n return;\n }\n if (!rewardedInterstitialReady) {\n logger.info('Rewarded interstitial not loaded yet, cannot display it.');\n }\n rewardedInterstitialErrored = false;\n\n try {\n logger.info('Showing AdMob rewarded interstitial.');\n await rewardedInterstitial.show();\n // Rewarded interstitial will be shown and\n // `rewardedInterstitialShowing` will be updated thanks to events\n // (but it's too early to change it now).\n } catch (error) {\n logger.error(\n 'Error while showing an AdMob rewarded interstitial:',\n error\n );\n rewardedInterstitialShowing = false;\n rewardedInterstitialErrored = true;\n }\n };\n\n /** Mark the reward of the interstitial as claimed. */\n export const markRewardedInterstitialRewardAsClaimed = () => {\n rewardedInterstitialRewardReceived = false;\n };\n\n // -------------------------\n // ---- Rewarded Video -----\n // -------------------------\n export const isRewardedVideoLoading = () => rewardedVideoLoading;\n export const isRewardedVideoReady = () => rewardedVideoReady;\n export const isRewardedVideoShowing = () => rewardedVideoShowing;\n export const isRewardedVideoErrored = () => rewardedVideoErrored;\n\n /** Check if the reward of the rewarded video was received. */\n export const wasRewardedVideoRewardReceived = function (markAsClaimed) {\n const reward = rewardedVideoRewardReceived;\n if (markAsClaimed) {\n rewardedVideoRewardReceived = false;\n }\n return reward;\n };\n\n /** Load a rewarded video. */\n export const loadRewardedVideo = async (\n androidAdUnitID,\n iosAdUnitID,\n displayWhenLoaded\n ) => {\n if (!(await checkIfAdMobIsAvailable())) return;\n if (rewardedVideoLoading || rewardedVideoShowing) {\n return;\n }\n\n const adUnitId = getAdUnitId(androidAdUnitID, iosAdUnitID, 'rewarded');\n if (!adUnitId) return;\n\n rewardedVideoLoading = true;\n rewardedVideoReady = false;\n rewardedVideoErrored = false;\n\n rewardedVideo = new admob.RewardedAd({\n adUnitId,\n npa: npaValue,\n });\n\n // Rewarded video event listeners\n rewardedVideo.on('load', () => {\n rewardedVideoReady = true;\n rewardedVideoLoading = false;\n });\n rewardedVideo.on('loadfail', () => {\n rewardedVideoLoading = false;\n rewardedVideoErrored = true;\n });\n rewardedVideo.on('show', () => {\n rewardedVideoShowing = true;\n rewardedVideoReady = false;\n });\n rewardedVideo.on('showfail', () => {\n rewardedVideoShowing = false;\n rewardedVideoErrored = true;\n });\n rewardedVideo.on('dismiss', () => {\n rewardedVideoShowing = false;\n });\n rewardedVideo.on('reward', () => {\n rewardedVideoRewardReceived = true;\n });\n\n try {\n logger.info('Loading AdMob rewarded video.');\n await rewardedVideo.load();\n logger.info('AdMob rewarded video successfully loaded.');\n rewardedVideoLoading = false;\n rewardedVideoReady = true;\n if (displayWhenLoaded) showRewardedVideo();\n } catch (error) {\n rewardedVideoLoading = false;\n rewardedVideoReady = false;\n rewardedVideoErrored = true;\n logger.error('Error while loading a rewarded video:', error);\n }\n };\n\n /** Show the loaded reward video. */\n export const showRewardedVideo = async () => {\n if (!(await checkIfAdMobIsAvailable())) return;\n\n if (!rewardedVideo) {\n logger.warn('Video has not been set up, call loadRewardedVideo first.');\n return;\n }\n if (!rewardedVideoReady) {\n logger.info('Rewarded video not loaded yet, cannot display it.');\n }\n rewardedVideoErrored = false;\n\n try {\n logger.info('Showing AdMob rewarded video.');\n await rewardedVideo.show();\n // Rewarded video will be shown and\n // `rewardedVideoShowing` will be updated thanks to events\n // (but it's too early to change it now).\n } catch (error) {\n logger.error('Error while showing an AdMob rewarded video:', error);\n rewardedVideoShowing = false;\n rewardedVideoErrored = true;\n }\n };\n\n /** Mark the reward of the video as claimed. */\n export const markRewardedVideoRewardAsClaimed = () => {\n rewardedVideoRewardReceived = false;\n };\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|