import { Observable } from "../../Misc/observable"; import type { Nullable } from "../../types"; import type { Camera } from "../../Cameras/camera"; import { DeviceOrientationCamera } from "../../Cameras/deviceOrientationCamera"; import { VRDeviceOrientationFreeCamera } from "../../Cameras/VR/vrDeviceOrientationFreeCamera"; import type { Scene } from "../../scene"; import { Vector3 } from "../../Maths/math.vector"; import { Color3 } from "../../Maths/math.color"; import type { AbstractMesh } from "../../Meshes/abstractMesh"; import type { PickingInfo } from "../../Collisions/pickingInfo"; import { EasingFunction } from "../../Animations/easing"; import type { VRCameraMetrics } from "../../Cameras/VR/vrCameraMetrics"; import "../../Gamepads/gamepadSceneComponent"; import "../../Animations/animatable"; import type { WebXRDefaultExperience } from "../../XR/webXRDefaultExperience"; import type { Mesh } from "../../Meshes/mesh.js"; /** * Options to modify the vr teleportation behavior. */ export interface VRTeleportationOptions { /** * The name of the mesh which should be used as the teleportation floor. (default: null) */ floorMeshName?: string; /** * A list of meshes to be used as the teleportation floor. (default: empty) */ floorMeshes?: Mesh[]; /** * The teleportation mode. (default: TELEPORTATIONMODE_CONSTANTTIME) */ teleportationMode?: number; /** * The duration of the animation in ms, apply when animationMode is TELEPORTATIONMODE_CONSTANTTIME. (default 122ms) */ teleportationTime?: number; /** * The speed of the animation in distance/sec, apply when animationMode is TELEPORTATIONMODE_CONSTANTSPEED. (default 20 units / sec) */ teleportationSpeed?: number; /** * The easing function used in the animation or null for Linear. (default CircleEase) */ easingFunction?: EasingFunction; } /** * Options to modify the vr experience helper's behavior. */ export interface VRExperienceHelperOptions { /** * Create a DeviceOrientationCamera to be used as your out of vr camera. (default: true) */ createDeviceOrientationCamera?: boolean; /** * Create a VRDeviceOrientationFreeCamera to be used for VR when no external HMD is found. (default: true) */ createFallbackVRDeviceOrientationFreeCamera?: boolean; /** * Uses the main button on the controller to toggle the laser casted. (default: true) */ laserToggle?: boolean; /** * A list of meshes to be used as the teleportation floor. If specified, teleportation will be enabled (default: undefined) */ floorMeshes?: Mesh[]; /** * Distortion metrics for the fallback vrDeviceOrientationCamera (default: VRCameraMetrics.Default) */ vrDeviceOrientationCameraMetrics?: VRCameraMetrics; /** * Defines if WebXR should be used (if available) */ useXR?: boolean; } /** * Event containing information after VR has been entered */ export declare class OnAfterEnteringVRObservableEvent { /** * If entering vr was successful */ success: boolean; } /** * Helps to quickly add VR support to an existing scene. * See https://doc.babylonjs.com/features/featuresDeepDive/cameras/webVRHelper * @deprecated Use WebXR instead! */ export declare class VRExperienceHelper { /** Options to modify the vr experience helper's behavior. */ webVROptions: VRExperienceHelperOptions; private _scene; private _position; private _btnVR; private _btnVRDisplayed; private _hasEnteredVR; private _fullscreenVRpresenting; private _inputElement; private _vrDeviceOrientationCamera; private _deviceOrientationCamera; private _existingCamera; private _onKeyDown; private _onVrDisplayPresentChangeBind; /** * Gets or sets a boolean indicating that gaze can be enabled even if pointer lock is not engage (useful on iOS where fullscreen mode and pointer lock are not supported) */ enableGazeEvenWhenNoPointerLock: boolean; /** * Gets or sets a boolean indicating that the VREXperienceHelper will exit VR if double tap is detected */ exitVROnDoubleTap: boolean; /** * Observable raised right before entering VR. */ onEnteringVRObservable: Observable; /** * Observable raised when entering VR has completed. */ onAfterEnteringVRObservable: Observable; /** * Observable raised when exiting VR. */ onExitingVRObservable: Observable; /** Return this.onEnteringVRObservable * Note: This one is for backward compatibility. Please use onEnteringVRObservable directly */ get onEnteringVR(): Observable; /** Return this.onExitingVRObservable * Note: This one is for backward compatibility. Please use onExitingVRObservable directly */ get onExitingVR(): Observable; private _useCustomVRButton; private _teleportActive; private _floorMeshName; private _floorMeshesCollection; private _teleportationMode; private _teleportationTime; private _teleportationSpeed; private _teleportationEasing; private _rotationAllowed; private _teleportBackwardsVector; private _teleportationTarget; private _isDefaultTeleportationTarget; private _postProcessMove; private _teleportationFillColor; private _teleportationBorderColor; private _rotationAngle; private _haloCenter; private _cameraGazer; private _padSensibilityUp; private _padSensibilityDown; private _pickedLaserColor; private _pickedGazeColor; /** * Observable raised when a new mesh is selected based on meshSelectionPredicate */ onNewMeshSelected: Observable; /** * Observable raised when a new mesh is picked based on meshSelectionPredicate */ onNewMeshPicked: Observable; private _circleEase; /** * Observable raised before camera teleportation */ onBeforeCameraTeleport: Observable; /** * Observable raised after camera teleportation */ onAfterCameraTeleport: Observable; /** * Observable raised when current selected mesh gets unselected */ onSelectedMeshUnselected: Observable; private _raySelectionPredicate; /** * To be optionally changed by user to define custom ray selection */ raySelectionPredicate: (mesh: AbstractMesh) => boolean; /** * To be optionally changed by user to define custom selection logic (after ray selection) */ meshSelectionPredicate: (mesh: AbstractMesh) => boolean; /** * Set teleportation enabled. If set to false camera teleportation will be disabled but camera rotation will be kept. */ teleportationEnabled: boolean; private _defaultHeight; private _teleportationInitialized; private _interactionsEnabled; private _displayGaze; private _displayLaserPointer; /** * The mesh used to display where the user is going to teleport. */ get teleportationTarget(): Mesh; /** * Sets the mesh to be used to display where the user is going to teleport. */ set teleportationTarget(value: Mesh); /** * The mesh used to display where the user is selecting, this mesh will be cloned and set as the gazeTracker for the left and right controller * when set bakeCurrentTransformIntoVertices will be called on the mesh. * See https://doc.babylonjs.com/features/featuresDeepDive/mesh/transforms/center_origin/bakingTransforms */ get gazeTrackerMesh(): Mesh; set gazeTrackerMesh(value: Mesh); /** * If the gaze trackers scale should be updated to be constant size when pointing at near/far meshes */ updateGazeTrackerScale: boolean; /** * If the gaze trackers color should be updated when selecting meshes */ updateGazeTrackerColor: boolean; /** * If the controller laser color should be updated when selecting meshes */ updateControllerLaserColor: boolean; /** * If the ray of the gaze should be displayed. */ get displayGaze(): boolean; /** * Sets if the ray of the gaze should be displayed. */ set displayGaze(value: boolean); /** * If the ray of the LaserPointer should be displayed. */ get displayLaserPointer(): boolean; /** * Sets if the ray of the LaserPointer should be displayed. */ set displayLaserPointer(value: boolean); /** * The deviceOrientationCamera used as the camera when not in VR. */ get deviceOrientationCamera(): Nullable; /** * Based on the current WebVR support, returns the current VR camera used. */ get currentVRCamera(): Nullable; /** * The deviceOrientationCamera that is used as a fallback when vr device is not connected. */ get vrDeviceOrientationCamera(): Nullable; /** * The html button that is used to trigger entering into VR. */ get vrButton(): Nullable; private get _teleportationRequestInitiated(); /** * Defines whether or not Pointer lock should be requested when switching to * full screen. */ requestPointerLockOnFullScreen: boolean; /** * If asking to force XR, this will be populated with the default xr experience */ xr: WebXRDefaultExperience; /** * Was the XR test done already. If this is true AND this.xr exists, xr is initialized. * If this is true and no this.xr, xr exists but is not supported, using WebVR. */ xrTestDone: boolean; /** * Instantiates a VRExperienceHelper. * Helps to quickly add VR support to an existing scene. * @param scene The scene the VRExperienceHelper belongs to. * @param webVROptions Options to modify the vr experience helper's behavior. */ constructor(scene: Scene, /** Options to modify the vr experience helper's behavior. */ webVROptions?: VRExperienceHelperOptions); private _completeVRInit; private _onResize; private _onFullscreenChange; /** * Gets a value indicating if we are currently in VR mode. */ get isInVRMode(): boolean; private _moveButtonToBottomRight; private _displayVRButton; private _updateButtonVisibility; private _cachedAngularSensibility; /** * Attempt to enter VR. If a headset is connected and ready, will request present on that. * Otherwise, will use the fullscreen API. */ enterVR(): void; /** * Attempt to exit VR, or fullscreen. */ exitVR(): void; /** * The position of the vr experience helper. */ get position(): Vector3; /** * Sets the position of the vr experience helper. */ set position(value: Vector3); /** * Enables controllers and user interactions such as selecting and object or clicking on an object. */ enableInteractions(): void; private _beforeRender; private _isTeleportationFloor; /** * Adds a floor mesh to be used for teleportation. * @param floorMesh the mesh to be used for teleportation. */ addFloorMesh(floorMesh: Mesh): void; /** * Removes a floor mesh from being used for teleportation. * @param floorMesh the mesh to be removed. */ removeFloorMesh(floorMesh: Mesh): void; /** * Enables interactions and teleportation using the VR controllers and gaze. * @param vrTeleportationOptions options to modify teleportation behavior. */ enableTeleportation(vrTeleportationOptions?: VRTeleportationOptions): void; private _onNewGamepadConnected; private _checkTeleportWithRay; private _checkRotate; private _checkTeleportBackwards; private _createTeleportationCircles; private _hideTeleportationTarget; private _rotateCamera; private _workingVector; private _workingQuaternion; private _workingMatrix; /** * Time Constant Teleportation Mode */ static readonly TELEPORTATIONMODE_CONSTANTTIME = 0; /** * Speed Constant Teleportation Mode */ static readonly TELEPORTATIONMODE_CONSTANTSPEED = 1; /** * Teleports the users feet to the desired location * @param location The location where the user's feet should be placed */ teleportCamera(location: Vector3): void; /** * Permanently set new colors for the laser pointer * @param color the new laser color * @param pickedColor the new laser color when picked mesh detected */ setLaserColor(color: Color3, pickedColor?: Color3): void; /** * Set lighting enabled / disabled on the laser pointer of both controllers * @param _enabled should the lighting be enabled on the laser pointer */ setLaserLightingState(_enabled?: boolean): void; /** * Permanently set new colors for the gaze pointer * @param color the new gaze color * @param pickedColor the new gaze color when picked mesh detected */ setGazeColor(color: Color3, pickedColor?: Color3): void; /** * Sets the color of the laser ray from the vr controllers. * @param _color new color for the ray. */ changeLaserColor(_color: Color3): void; /** * Sets the color of the ray from the vr headsets gaze. * @param color new color for the ray. */ changeGazeColor(color: Color3): void; /** * Exits VR and disposes of the vr experience helper */ dispose(): void; /** * Gets the name of the VRExperienceHelper class * @returns "VRExperienceHelper" */ getClassName(): string; }