1 |
- {"ast":null,"code":"import _asyncToGenerator from \"F:/workspace/202226701027/huinongbao-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\nimport { Tools } from \"../Misc/tools.js\";\n/**\n * A list of the currently available features without referencing them\n */\nexport class WebXRFeatureName {}\n/**\n * The name of the anchor system feature\n */\nWebXRFeatureName.ANCHOR_SYSTEM = \"xr-anchor-system\";\n/**\n * The name of the background remover feature\n */\nWebXRFeatureName.BACKGROUND_REMOVER = \"xr-background-remover\";\n/**\n * The name of the hit test feature\n */\nWebXRFeatureName.HIT_TEST = \"xr-hit-test\";\n/**\n * The name of the mesh detection feature\n */\nWebXRFeatureName.MESH_DETECTION = \"xr-mesh-detection\";\n/**\n * physics impostors for xr controllers feature\n */\nWebXRFeatureName.PHYSICS_CONTROLLERS = \"xr-physics-controller\";\n/**\n * The name of the plane detection feature\n */\nWebXRFeatureName.PLANE_DETECTION = \"xr-plane-detection\";\n/**\n * The name of the pointer selection feature\n */\nWebXRFeatureName.POINTER_SELECTION = \"xr-controller-pointer-selection\";\n/**\n * The name of the teleportation feature\n */\nWebXRFeatureName.TELEPORTATION = \"xr-controller-teleportation\";\n/**\n * The name of the feature points feature.\n */\nWebXRFeatureName.FEATURE_POINTS = \"xr-feature-points\";\n/**\n * The name of the hand tracking feature.\n */\nWebXRFeatureName.HAND_TRACKING = \"xr-hand-tracking\";\n/**\n * The name of the image tracking feature\n */\nWebXRFeatureName.IMAGE_TRACKING = \"xr-image-tracking\";\n/**\n * The name of the near interaction feature\n */\nWebXRFeatureName.NEAR_INTERACTION = \"xr-near-interaction\";\n/**\n * The name of the DOM overlay feature\n */\nWebXRFeatureName.DOM_OVERLAY = \"xr-dom-overlay\";\n/**\n * The name of the movement feature\n */\nWebXRFeatureName.MOVEMENT = \"xr-controller-movement\";\n/**\n * The name of the light estimation feature\n */\nWebXRFeatureName.LIGHT_ESTIMATION = \"xr-light-estimation\";\n/**\n * The name of the eye tracking feature\n */\nWebXRFeatureName.EYE_TRACKING = \"xr-eye-tracking\";\n/**\n * The name of the walking locomotion feature\n */\nWebXRFeatureName.WALKING_LOCOMOTION = \"xr-walking-locomotion\";\n/**\n * The name of the composition layers feature\n */\nWebXRFeatureName.LAYERS = \"xr-layers\";\n/**\n * The name of the depth sensing feature\n */\nWebXRFeatureName.DEPTH_SENSING = \"xr-depth-sensing\";\n/**\n * The name of the WebXR Space Warp feature\n */\nWebXRFeatureName.SPACE_WARP = \"xr-space-warp\";\n/**\n * The name of the WebXR Raw Camera Access feature\n */\nWebXRFeatureName.RAW_CAMERA_ACCESS = \"xr-raw-camera-access\";\n/**\n * The WebXR features manager is responsible of enabling or disabling features required for the current XR session.\n * It is mainly used in AR sessions.\n *\n * A feature can have a version that is defined by Babylon (and does not correspond with the webxr version).\n */\nexport class WebXRFeaturesManager {\n /**\n * constructs a new features manages.\n *\n * @param _xrSessionManager an instance of WebXRSessionManager\n */\n constructor(_xrSessionManager) {\n this._xrSessionManager = _xrSessionManager;\n this._features = {};\n // when session starts / initialized - attach\n this._xrSessionManager.onXRSessionInit.add(() => {\n this.getEnabledFeatures().forEach(featureName => {\n const feature = this._features[featureName];\n if (feature.enabled && !feature.featureImplementation.attached && !feature.featureImplementation.disableAutoAttach) {\n this.attachFeature(featureName);\n }\n });\n });\n // when session ends - detach\n this._xrSessionManager.onXRSessionEnded.add(() => {\n this.getEnabledFeatures().forEach(featureName => {\n const feature = this._features[featureName];\n if (feature.enabled && feature.featureImplementation.attached) {\n // detach, but don't disable!\n this.detachFeature(featureName);\n }\n });\n });\n }\n /**\n * Used to register a module. After calling this function a developer can use this feature in the scene.\n * Mainly used internally.\n *\n * @param featureName the name of the feature to register\n * @param constructorFunction the function used to construct the module\n * @param version the (babylon) version of the module\n * @param stable is that a stable version of this module\n */\n static AddWebXRFeature(featureName, constructorFunction, version = 1, stable = false) {\n this._AvailableFeatures[featureName] = this._AvailableFeatures[featureName] || {\n latest: version\n };\n if (version > this._AvailableFeatures[featureName].latest) {\n this._AvailableFeatures[featureName].latest = version;\n }\n if (stable) {\n this._AvailableFeatures[featureName].stable = version;\n }\n this._AvailableFeatures[featureName][version] = constructorFunction;\n }\n /**\n * Returns a constructor of a specific feature.\n *\n * @param featureName the name of the feature to construct\n * @param version the version of the feature to load\n * @param xrSessionManager the xrSessionManager. Used to construct the module\n * @param options optional options provided to the module.\n * @returns a function that, when called, will return a new instance of this feature\n */\n static ConstructFeature(featureName, version = 1, xrSessionManager, options) {\n const constructorFunction = this._AvailableFeatures[featureName][version];\n if (!constructorFunction) {\n // throw an error? return nothing?\n throw new Error(\"feature not found\");\n }\n return constructorFunction(xrSessionManager, options);\n }\n /**\n * Can be used to return the list of features currently registered\n *\n * @returns an Array of available features\n */\n static GetAvailableFeatures() {\n return Object.keys(this._AvailableFeatures);\n }\n /**\n * Gets the versions available for a specific feature\n * @param featureName the name of the feature\n * @returns an array with the available versions\n */\n static GetAvailableVersions(featureName) {\n return Object.keys(this._AvailableFeatures[featureName]);\n }\n /**\n * Return the latest unstable version of this feature\n * @param featureName the name of the feature to search\n * @returns the version number. if not found will return -1\n */\n static GetLatestVersionOfFeature(featureName) {\n return this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].latest || -1;\n }\n /**\n * Return the latest stable version of this feature\n * @param featureName the name of the feature to search\n * @returns the version number. if not found will return -1\n */\n static GetStableVersionOfFeature(featureName) {\n return this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].stable || -1;\n }\n /**\n * Attach a feature to the current session. Mainly used when session started to start the feature effect.\n * Can be used during a session to start a feature\n * @param featureName the name of feature to attach\n */\n attachFeature(featureName) {\n const feature = this._features[featureName];\n if (feature && feature.enabled && !feature.featureImplementation.attached) {\n const attached = feature.featureImplementation.attach();\n if (!attached) {\n Tools.Warn(`Feature ${featureName} failed to attach`);\n }\n }\n }\n /**\n * Can be used inside a session or when the session ends to detach a specific feature\n * @param featureName the name of the feature to detach\n */\n detachFeature(featureName) {\n const feature = this._features[featureName];\n if (feature && feature.featureImplementation.attached) {\n const detached = feature.featureImplementation.detach();\n if (!detached) {\n Tools.Warn(`Feature ${featureName} failed to detach`);\n }\n }\n }\n /**\n * Used to disable an already-enabled feature\n * The feature will be disposed and will be recreated once enabled.\n * @param featureName the feature to disable\n * @returns true if disable was successful\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n disableFeature(featureName) {\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\n const feature = this._features[name];\n if (feature && feature.enabled) {\n feature.enabled = false;\n this.detachFeature(name);\n feature.featureImplementation.dispose();\n delete this._features[name];\n return true;\n }\n return false;\n }\n /**\n * dispose this features manager\n */\n dispose() {\n this.getEnabledFeatures().forEach(feature => {\n this.disableFeature(feature);\n });\n }\n /**\n * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts.\n * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration.\n *\n * @param featureName the name of the feature to load or the class of the feature\n * @param version optional version to load. if not provided the latest version will be enabled\n * @param moduleOptions options provided to the module. Ses the module documentation / constructor\n * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible\n * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available.\n * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature.\n */\n enableFeature(\n // eslint-disable-next-line @typescript-eslint/naming-convention\n featureName, version = \"latest\", moduleOptions = {}, attachIfPossible = true, required = true) {\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\n let versionToLoad = 0;\n if (typeof version === \"string\") {\n if (!version) {\n throw new Error(`Error in provided version - ${name} (${version})`);\n }\n if (version === \"stable\") {\n versionToLoad = WebXRFeaturesManager.GetStableVersionOfFeature(name);\n } else if (version === \"latest\") {\n versionToLoad = WebXRFeaturesManager.GetLatestVersionOfFeature(name);\n } else {\n // try loading the number the string represents\n versionToLoad = +version;\n }\n if (versionToLoad === -1 || isNaN(versionToLoad)) {\n throw new Error(`feature not found - ${name} (${version})`);\n }\n } else {\n versionToLoad = version;\n }\n // check if there is a feature conflict\n const conflictingFeature = WebXRFeaturesManager._ConflictingFeatures[name];\n if (conflictingFeature !== undefined && this.getEnabledFeatures().indexOf(conflictingFeature) !== -1) {\n throw new Error(`Feature ${name} cannot be enabled while ${conflictingFeature} is enabled.`);\n }\n // check if already initialized\n const feature = this._features[name];\n const constructFunction = WebXRFeaturesManager.ConstructFeature(name, versionToLoad, this._xrSessionManager, moduleOptions);\n if (!constructFunction) {\n // report error?\n throw new Error(`feature not found - ${name}`);\n }\n /* If the feature is already enabled, detach and dispose it, and create a new one */\n if (feature) {\n this.disableFeature(name);\n }\n const constructed = constructFunction();\n if (constructed.dependsOn) {\n const dependentsFound = constructed.dependsOn.every(featureName => !!this._features[featureName]);\n if (!dependentsFound) {\n throw new Error(`Dependant features missing. Make sure the following features are enabled - ${constructed.dependsOn.join(\", \")}`);\n }\n }\n if (constructed.isCompatible()) {\n this._features[name] = {\n featureImplementation: constructed,\n enabled: true,\n version: versionToLoad,\n required\n };\n if (attachIfPossible) {\n // if session started already, request and enable\n if (this._xrSessionManager.session && !this._features[name].featureImplementation.attached) {\n // enable feature\n this.attachFeature(name);\n }\n } else {\n // disable auto-attach when session starts\n this._features[name].featureImplementation.disableAutoAttach = true;\n }\n return this._features[name].featureImplementation;\n } else {\n if (required) {\n throw new Error(\"required feature not compatible\");\n } else {\n Tools.Warn(`Feature ${name} not compatible with the current environment/browser and was not enabled.`);\n return constructed;\n }\n }\n }\n /**\n * get the implementation of an enabled feature.\n * @param featureName the name of the feature to load\n * @returns the feature class, if found\n */\n getEnabledFeature(featureName) {\n return this._features[featureName] && this._features[featureName].featureImplementation;\n }\n /**\n * Get the list of enabled features\n * @returns an array of enabled features\n */\n getEnabledFeatures() {\n return Object.keys(this._features);\n }\n /**\n * This function will extend the session creation configuration object with enabled features.\n * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list,\n * according to the defined \"required\" variable, provided during enableFeature call\n * @param xrSessionInit the xr Session init object to extend\n *\n * @returns an extended XRSessionInit object\n */\n _extendXRSessionInitObject(xrSessionInit) {\n var _this = this;\n return _asyncToGenerator(function* () {\n const enabledFeatures = _this.getEnabledFeatures();\n for (const featureName of enabledFeatures) {\n const feature = _this._features[featureName];\n const nativeName = feature.featureImplementation.xrNativeFeatureName;\n if (nativeName) {\n if (feature.required) {\n xrSessionInit.requiredFeatures = xrSessionInit.requiredFeatures || [];\n if (xrSessionInit.requiredFeatures.indexOf(nativeName) === -1) {\n xrSessionInit.requiredFeatures.push(nativeName);\n }\n } else {\n xrSessionInit.optionalFeatures = xrSessionInit.optionalFeatures || [];\n if (xrSessionInit.optionalFeatures.indexOf(nativeName) === -1) {\n xrSessionInit.optionalFeatures.push(nativeName);\n }\n }\n }\n if (feature.featureImplementation.getXRSessionInitExtension) {\n const extended = yield feature.featureImplementation.getXRSessionInitExtension();\n xrSessionInit = {\n ...xrSessionInit,\n ...extended\n };\n }\n }\n return xrSessionInit;\n })();\n }\n}\nWebXRFeaturesManager._AvailableFeatures = {};\n/**\n * The key is the feature to check and the value is the feature that conflicts.\n */\nWebXRFeaturesManager._ConflictingFeatures = {\n [WebXRFeatureName.TELEPORTATION]: WebXRFeatureName.MOVEMENT,\n [WebXRFeatureName.MOVEMENT]: WebXRFeatureName.TELEPORTATION\n};","map":{"version":3,"names":["Tools","WebXRFeatureName","ANCHOR_SYSTEM","BACKGROUND_REMOVER","HIT_TEST","MESH_DETECTION","PHYSICS_CONTROLLERS","PLANE_DETECTION","POINTER_SELECTION","TELEPORTATION","FEATURE_POINTS","HAND_TRACKING","IMAGE_TRACKING","NEAR_INTERACTION","DOM_OVERLAY","MOVEMENT","LIGHT_ESTIMATION","EYE_TRACKING","WALKING_LOCOMOTION","LAYERS","DEPTH_SENSING","SPACE_WARP","RAW_CAMERA_ACCESS","WebXRFeaturesManager","constructor","_xrSessionManager","_features","onXRSessionInit","add","getEnabledFeatures","forEach","featureName","feature","enabled","featureImplementation","attached","disableAutoAttach","attachFeature","onXRSessionEnded","detachFeature","AddWebXRFeature","constructorFunction","version","stable","_AvailableFeatures","latest","ConstructFeature","xrSessionManager","options","Error","GetAvailableFeatures","Object","keys","GetAvailableVersions","GetLatestVersionOfFeature","GetStableVersionOfFeature","attach","Warn","detached","detach","disableFeature","name","Name","dispose","enableFeature","moduleOptions","attachIfPossible","required","versionToLoad","isNaN","conflictingFeature","_ConflictingFeatures","undefined","indexOf","constructFunction","constructed","dependsOn","dependentsFound","every","join","isCompatible","session","getEnabledFeature","_extendXRSessionInitObject","xrSessionInit","_this","_asyncToGenerator","enabledFeatures","nativeName","xrNativeFeatureName","requiredFeatures","push","optionalFeatures","getXRSessionInitExtension","extended"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/XR/webXRFeaturesManager.js"],"sourcesContent":["import { Tools } from \"../Misc/tools.js\";\n/**\n * A list of the currently available features without referencing them\n */\nexport class WebXRFeatureName {\n}\n/**\n * The name of the anchor system feature\n */\nWebXRFeatureName.ANCHOR_SYSTEM = \"xr-anchor-system\";\n/**\n * The name of the background remover feature\n */\nWebXRFeatureName.BACKGROUND_REMOVER = \"xr-background-remover\";\n/**\n * The name of the hit test feature\n */\nWebXRFeatureName.HIT_TEST = \"xr-hit-test\";\n/**\n * The name of the mesh detection feature\n */\nWebXRFeatureName.MESH_DETECTION = \"xr-mesh-detection\";\n/**\n * physics impostors for xr controllers feature\n */\nWebXRFeatureName.PHYSICS_CONTROLLERS = \"xr-physics-controller\";\n/**\n * The name of the plane detection feature\n */\nWebXRFeatureName.PLANE_DETECTION = \"xr-plane-detection\";\n/**\n * The name of the pointer selection feature\n */\nWebXRFeatureName.POINTER_SELECTION = \"xr-controller-pointer-selection\";\n/**\n * The name of the teleportation feature\n */\nWebXRFeatureName.TELEPORTATION = \"xr-controller-teleportation\";\n/**\n * The name of the feature points feature.\n */\nWebXRFeatureName.FEATURE_POINTS = \"xr-feature-points\";\n/**\n * The name of the hand tracking feature.\n */\nWebXRFeatureName.HAND_TRACKING = \"xr-hand-tracking\";\n/**\n * The name of the image tracking feature\n */\nWebXRFeatureName.IMAGE_TRACKING = \"xr-image-tracking\";\n/**\n * The name of the near interaction feature\n */\nWebXRFeatureName.NEAR_INTERACTION = \"xr-near-interaction\";\n/**\n * The name of the DOM overlay feature\n */\nWebXRFeatureName.DOM_OVERLAY = \"xr-dom-overlay\";\n/**\n * The name of the movement feature\n */\nWebXRFeatureName.MOVEMENT = \"xr-controller-movement\";\n/**\n * The name of the light estimation feature\n */\nWebXRFeatureName.LIGHT_ESTIMATION = \"xr-light-estimation\";\n/**\n * The name of the eye tracking feature\n */\nWebXRFeatureName.EYE_TRACKING = \"xr-eye-tracking\";\n/**\n * The name of the walking locomotion feature\n */\nWebXRFeatureName.WALKING_LOCOMOTION = \"xr-walking-locomotion\";\n/**\n * The name of the composition layers feature\n */\nWebXRFeatureName.LAYERS = \"xr-layers\";\n/**\n * The name of the depth sensing feature\n */\nWebXRFeatureName.DEPTH_SENSING = \"xr-depth-sensing\";\n/**\n * The name of the WebXR Space Warp feature\n */\nWebXRFeatureName.SPACE_WARP = \"xr-space-warp\";\n/**\n * The name of the WebXR Raw Camera Access feature\n */\nWebXRFeatureName.RAW_CAMERA_ACCESS = \"xr-raw-camera-access\";\n/**\n * The WebXR features manager is responsible of enabling or disabling features required for the current XR session.\n * It is mainly used in AR sessions.\n *\n * A feature can have a version that is defined by Babylon (and does not correspond with the webxr version).\n */\nexport class WebXRFeaturesManager {\n /**\n * constructs a new features manages.\n *\n * @param _xrSessionManager an instance of WebXRSessionManager\n */\n constructor(_xrSessionManager) {\n this._xrSessionManager = _xrSessionManager;\n this._features = {};\n // when session starts / initialized - attach\n this._xrSessionManager.onXRSessionInit.add(() => {\n this.getEnabledFeatures().forEach((featureName) => {\n const feature = this._features[featureName];\n if (feature.enabled && !feature.featureImplementation.attached && !feature.featureImplementation.disableAutoAttach) {\n this.attachFeature(featureName);\n }\n });\n });\n // when session ends - detach\n this._xrSessionManager.onXRSessionEnded.add(() => {\n this.getEnabledFeatures().forEach((featureName) => {\n const feature = this._features[featureName];\n if (feature.enabled && feature.featureImplementation.attached) {\n // detach, but don't disable!\n this.detachFeature(featureName);\n }\n });\n });\n }\n /**\n * Used to register a module. After calling this function a developer can use this feature in the scene.\n * Mainly used internally.\n *\n * @param featureName the name of the feature to register\n * @param constructorFunction the function used to construct the module\n * @param version the (babylon) version of the module\n * @param stable is that a stable version of this module\n */\n static AddWebXRFeature(featureName, constructorFunction, version = 1, stable = false) {\n this._AvailableFeatures[featureName] = this._AvailableFeatures[featureName] || { latest: version };\n if (version > this._AvailableFeatures[featureName].latest) {\n this._AvailableFeatures[featureName].latest = version;\n }\n if (stable) {\n this._AvailableFeatures[featureName].stable = version;\n }\n this._AvailableFeatures[featureName][version] = constructorFunction;\n }\n /**\n * Returns a constructor of a specific feature.\n *\n * @param featureName the name of the feature to construct\n * @param version the version of the feature to load\n * @param xrSessionManager the xrSessionManager. Used to construct the module\n * @param options optional options provided to the module.\n * @returns a function that, when called, will return a new instance of this feature\n */\n static ConstructFeature(featureName, version = 1, xrSessionManager, options) {\n const constructorFunction = this._AvailableFeatures[featureName][version];\n if (!constructorFunction) {\n // throw an error? return nothing?\n throw new Error(\"feature not found\");\n }\n return constructorFunction(xrSessionManager, options);\n }\n /**\n * Can be used to return the list of features currently registered\n *\n * @returns an Array of available features\n */\n static GetAvailableFeatures() {\n return Object.keys(this._AvailableFeatures);\n }\n /**\n * Gets the versions available for a specific feature\n * @param featureName the name of the feature\n * @returns an array with the available versions\n */\n static GetAvailableVersions(featureName) {\n return Object.keys(this._AvailableFeatures[featureName]);\n }\n /**\n * Return the latest unstable version of this feature\n * @param featureName the name of the feature to search\n * @returns the version number. if not found will return -1\n */\n static GetLatestVersionOfFeature(featureName) {\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].latest) || -1;\n }\n /**\n * Return the latest stable version of this feature\n * @param featureName the name of the feature to search\n * @returns the version number. if not found will return -1\n */\n static GetStableVersionOfFeature(featureName) {\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].stable) || -1;\n }\n /**\n * Attach a feature to the current session. Mainly used when session started to start the feature effect.\n * Can be used during a session to start a feature\n * @param featureName the name of feature to attach\n */\n attachFeature(featureName) {\n const feature = this._features[featureName];\n if (feature && feature.enabled && !feature.featureImplementation.attached) {\n const attached = feature.featureImplementation.attach();\n if (!attached) {\n Tools.Warn(`Feature ${featureName} failed to attach`);\n }\n }\n }\n /**\n * Can be used inside a session or when the session ends to detach a specific feature\n * @param featureName the name of the feature to detach\n */\n detachFeature(featureName) {\n const feature = this._features[featureName];\n if (feature && feature.featureImplementation.attached) {\n const detached = feature.featureImplementation.detach();\n if (!detached) {\n Tools.Warn(`Feature ${featureName} failed to detach`);\n }\n }\n }\n /**\n * Used to disable an already-enabled feature\n * The feature will be disposed and will be recreated once enabled.\n * @param featureName the feature to disable\n * @returns true if disable was successful\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n disableFeature(featureName) {\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\n const feature = this._features[name];\n if (feature && feature.enabled) {\n feature.enabled = false;\n this.detachFeature(name);\n feature.featureImplementation.dispose();\n delete this._features[name];\n return true;\n }\n return false;\n }\n /**\n * dispose this features manager\n */\n dispose() {\n this.getEnabledFeatures().forEach((feature) => {\n this.disableFeature(feature);\n });\n }\n /**\n * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts.\n * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration.\n *\n * @param featureName the name of the feature to load or the class of the feature\n * @param version optional version to load. if not provided the latest version will be enabled\n * @param moduleOptions options provided to the module. Ses the module documentation / constructor\n * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible\n * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available.\n * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature.\n */\n enableFeature(\n // eslint-disable-next-line @typescript-eslint/naming-convention\n featureName, version = \"latest\", moduleOptions = {}, attachIfPossible = true, required = true) {\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\n let versionToLoad = 0;\n if (typeof version === \"string\") {\n if (!version) {\n throw new Error(`Error in provided version - ${name} (${version})`);\n }\n if (version === \"stable\") {\n versionToLoad = WebXRFeaturesManager.GetStableVersionOfFeature(name);\n }\n else if (version === \"latest\") {\n versionToLoad = WebXRFeaturesManager.GetLatestVersionOfFeature(name);\n }\n else {\n // try loading the number the string represents\n versionToLoad = +version;\n }\n if (versionToLoad === -1 || isNaN(versionToLoad)) {\n throw new Error(`feature not found - ${name} (${version})`);\n }\n }\n else {\n versionToLoad = version;\n }\n // check if there is a feature conflict\n const conflictingFeature = WebXRFeaturesManager._ConflictingFeatures[name];\n if (conflictingFeature !== undefined && this.getEnabledFeatures().indexOf(conflictingFeature) !== -1) {\n throw new Error(`Feature ${name} cannot be enabled while ${conflictingFeature} is enabled.`);\n }\n // check if already initialized\n const feature = this._features[name];\n const constructFunction = WebXRFeaturesManager.ConstructFeature(name, versionToLoad, this._xrSessionManager, moduleOptions);\n if (!constructFunction) {\n // report error?\n throw new Error(`feature not found - ${name}`);\n }\n /* If the feature is already enabled, detach and dispose it, and create a new one */\n if (feature) {\n this.disableFeature(name);\n }\n const constructed = constructFunction();\n if (constructed.dependsOn) {\n const dependentsFound = constructed.dependsOn.every((featureName) => !!this._features[featureName]);\n if (!dependentsFound) {\n throw new Error(`Dependant features missing. Make sure the following features are enabled - ${constructed.dependsOn.join(\", \")}`);\n }\n }\n if (constructed.isCompatible()) {\n this._features[name] = {\n featureImplementation: constructed,\n enabled: true,\n version: versionToLoad,\n required,\n };\n if (attachIfPossible) {\n // if session started already, request and enable\n if (this._xrSessionManager.session && !this._features[name].featureImplementation.attached) {\n // enable feature\n this.attachFeature(name);\n }\n }\n else {\n // disable auto-attach when session starts\n this._features[name].featureImplementation.disableAutoAttach = true;\n }\n return this._features[name].featureImplementation;\n }\n else {\n if (required) {\n throw new Error(\"required feature not compatible\");\n }\n else {\n Tools.Warn(`Feature ${name} not compatible with the current environment/browser and was not enabled.`);\n return constructed;\n }\n }\n }\n /**\n * get the implementation of an enabled feature.\n * @param featureName the name of the feature to load\n * @returns the feature class, if found\n */\n getEnabledFeature(featureName) {\n return this._features[featureName] && this._features[featureName].featureImplementation;\n }\n /**\n * Get the list of enabled features\n * @returns an array of enabled features\n */\n getEnabledFeatures() {\n return Object.keys(this._features);\n }\n /**\n * This function will extend the session creation configuration object with enabled features.\n * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list,\n * according to the defined \"required\" variable, provided during enableFeature call\n * @param xrSessionInit the xr Session init object to extend\n *\n * @returns an extended XRSessionInit object\n */\n async _extendXRSessionInitObject(xrSessionInit) {\n const enabledFeatures = this.getEnabledFeatures();\n for (const featureName of enabledFeatures) {\n const feature = this._features[featureName];\n const nativeName = feature.featureImplementation.xrNativeFeatureName;\n if (nativeName) {\n if (feature.required) {\n xrSessionInit.requiredFeatures = xrSessionInit.requiredFeatures || [];\n if (xrSessionInit.requiredFeatures.indexOf(nativeName) === -1) {\n xrSessionInit.requiredFeatures.push(nativeName);\n }\n }\n else {\n xrSessionInit.optionalFeatures = xrSessionInit.optionalFeatures || [];\n if (xrSessionInit.optionalFeatures.indexOf(nativeName) === -1) {\n xrSessionInit.optionalFeatures.push(nativeName);\n }\n }\n }\n if (feature.featureImplementation.getXRSessionInitExtension) {\n const extended = await feature.featureImplementation.getXRSessionInitExtension();\n xrSessionInit = {\n ...xrSessionInit,\n ...extended,\n };\n }\n }\n return xrSessionInit;\n }\n}\nWebXRFeaturesManager._AvailableFeatures = {};\n/**\n * The key is the feature to check and the value is the feature that conflicts.\n */\nWebXRFeaturesManager._ConflictingFeatures = {\n [WebXRFeatureName.TELEPORTATION]: WebXRFeatureName.MOVEMENT,\n [WebXRFeatureName.MOVEMENT]: WebXRFeatureName.TELEPORTATION,\n};\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}
|