// @lint-ignore-every LICENSELINT // Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "OculusXRHMDTypes.h" #include "UObject/ObjectMacros.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "IOculusXRHMDModule.h" #include "OculusXRFunctionLibrary.generated.h" namespace OculusXRHMD { class FOculusXRHMD; } UCLASS() class OCULUSXRHMD_API UOculusXRFunctionLibrary : public UBlueprintFunctionLibrary { GENERATED_UCLASS_BODY() /** * Grabs the current orientation and position for the HMD. If positional tracking is not available, DevicePosition will be a zero vector * * @param DeviceRotation (out) The device's current rotation * @param DevicePosition (out) The device's current position, in its own tracking space * @param NeckPosition (out) The estimated neck position, calculated using NeckToEye vector from User Profile. Same coordinate space as DevicePosition. * @param bUseOrienationForPlayerCamera (in) Should be set to 'true' if the orientation is going to be used to update orientation of the camera manually. * @param bUsePositionForPlayerCamera (in) Should be set to 'true' if the position is going to be used to update position of the camera manually. * @param PositionScale (in) The 3D scale that will be applied to position. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static void GetPose(FRotator& DeviceRotation, FVector& DevicePosition, FVector& NeckPosition, bool bUseOrienationForPlayerCamera = false, bool bUsePositionForPlayerCamera = false, const FVector PositionScale = FVector::ZeroVector); /** * Reports raw sensor data. If HMD doesn't support any of the parameters then it will be set to zero. * * @param AngularAcceleration (out) Angular acceleration in radians per second per second. * @param LinearAcceleration (out) Acceleration in meters per second per second. * @param AngularVelocity (out) Angular velocity in radians per second. * @param LinearVelocity (out) Velocity in meters per second. * @param TimeInSeconds (out) Time when the reported IMU reading took place, in seconds. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static void GetRawSensorData(FVector& AngularAcceleration, FVector& LinearAcceleration, FVector& AngularVelocity, FVector& LinearVelocity, float& TimeInSeconds, EOculusXRTrackedDeviceType DeviceType = EOculusXRTrackedDeviceType::HMD); /** * Returns if the device is currently tracked by the runtime or not. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static bool IsDeviceTracked(EOculusXRTrackedDeviceType DeviceType); /** * Set the CPU and GPU levels as hints to the Oculus device (Deprecated). */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary", meta = (DeprecatedFunction, DeprecatedMessage = "Deprecated. Please use Get/SetSuggestedCpuAndGpuPerformanceLevels instead")) static void SetCPUAndGPULevels(int CPULevel, int GPULevel); /** * Get the suggested CPU and GPU levels to the Oculus device. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void GetSuggestedCpuAndGpuPerformanceLevels(EOculusXRProcessorPerformanceLevel& CpuPerfLevel, EOculusXRProcessorPerformanceLevel& GpuPerfLevel); /** * Set the suggested CPU and GPU levels to the Oculus device. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetSuggestedCpuAndGpuPerformanceLevels(EOculusXRProcessorPerformanceLevel CpuPerfLevel, EOculusXRProcessorPerformanceLevel GpuPerfLevel); /** * Returns current user profile. * * @param Profile (out) Structure to hold current user profile. * @return (boolean) True, if user profile was acquired. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static bool GetUserProfile(FOculusXRHmdUserProfile& Profile); /** * Sets 'base rotation' - the rotation that will be subtracted from * the actual HMD orientation. * Sets base position offset (in meters). The base position offset is the distance from the physical (0, 0, 0) position * to current HMD position (bringing the (0, 0, 0) point to the current HMD position) * Note, this vector is set by ResetPosition call; use this method with care. * The axis of the vector are the same as in Unreal: X - forward, Y - right, Z - up. * * @param Rotation (in) Rotator object with base rotation * @param BaseOffsetInMeters (in) the vector to be set as base offset, in meters. * @param Options (in) specifies either position, orientation or both should be set. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetBaseRotationAndBaseOffsetInMeters(FRotator Rotation, FVector BaseOffsetInMeters, EOrientPositionSelector::Type Options); /** * Returns current base rotation and base offset. * The base offset is currently used base position offset, previously set by the * ResetPosition or SetBasePositionOffset calls. It represents a vector that translates the HMD's position * into (0,0,0) point, in meters. * The axis of the vector are the same as in Unreal: X - forward, Y - right, Z - up. * * @param OutRotation (out) Rotator object with base rotation * @param OutBaseOffsetInMeters (out) base position offset, vector, in meters. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static void GetBaseRotationAndBaseOffsetInMeters(FRotator& OutRotation, FVector& OutBaseOffsetInMeters); /** * Scales the HMD position that gets added to the virtual camera position. * * @param PosScale3D (in) the scale to apply to the HMD position. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary", meta = (DeprecatedFunction, DeprecationMessage = "This feature is no longer supported.")) static void SetPositionScale3D(FVector PosScale3D) {} /** * Sets 'base rotation' - the rotation that will be subtracted from * the actual HMD orientation. * The position offset might be added to current HMD position, * effectively moving the virtual camera by the specified offset. The addition * occurs after the HMD orientation and position are applied. * * @param BaseRot (in) Rotator object with base rotation * @param PosOffset (in) the vector to be added to HMD position. * @param Options (in) specifies either position, orientation or both should be set. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary", meta = (DeprecatedFunction, DeprecationMessage = "A hack, proper camera positioning should be used")) static void SetBaseRotationAndPositionOffset(FRotator BaseRot, FVector PosOffset, EOrientPositionSelector::Type Options); /** * Returns current base rotation and position offset. * * @param OutRot (out) Rotator object with base rotation * @param OutPosOffset (out) the vector with previously set position offset. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary", meta = (DeprecatedFunction, DeprecationMessage = "A hack, proper camera positioning should be used")) static void GetBaseRotationAndPositionOffset(FRotator& OutRot, FVector& OutPosOffset); /** * Adds loading splash screen with parameters * * @param Texture (in) A texture asset to be used for the splash. * @param TranslationInMeters (in) Initial translation of the center of the splash screen (in meters). * @param Rotation (in) Initial rotation of the splash screen, with the origin at the center of the splash screen. * @param SizeInMeters (in) Size, in meters, of the quad with the splash screen. * @param DeltaRotation (in) Incremental rotation, that is added each 2nd frame to the quad transform. The quad is rotated around the center of the quad. * @param bClearBeforeAdd (in) If true, clears splashes before adding a new one. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary", meta = (DeprecatedFunction, DeprecationMessage = "Use Add Loading Screen Splash from the Head Mounted Display Loading Screen functions instead.")) static void AddLoadingSplashScreen(class UTexture2D* Texture, FVector TranslationInMeters, FRotator Rotation, FVector2D SizeInMeters = FVector2D(1.0f, 1.0f), FRotator DeltaRotation = FRotator::ZeroRotator, bool bClearBeforeAdd = false); /** * Removes all the splash screens. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary", meta = (DeprecatedFunction, DeprecationMessage = "Use Clear Loading Screen Splashes from the Head Mounted Display Loading Screen functions instead.")) static void ClearLoadingSplashScreens(); /** * Returns true, if the app has input focus. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static bool HasInputFocus(); /** * Returns true, if the system overlay is present. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static bool HasSystemOverlayPresent(); /** * Returns the GPU utilization availability and value */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static void GetGPUUtilization(bool& IsGPUAvailable, float& GPUUtilization); /** * Returns the GPU frame time on supported mobile platforms (Go for now) */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static float GetGPUFrameTime(); /** * Returns the foveated rendering method currently being used */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static EOculusXRFoveatedRenderingMethod GetFoveatedRenderingMethod(); /** * Set the requested foveated rendering method */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetFoveatedRenderingMethod(EOculusXRFoveatedRenderingMethod Method); /** * Returns the current multiresolution level */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static EOculusXRFoveatedRenderingLevel GetFoveatedRenderingLevel(); /** * Set the requested foveated rendering level for the next frame, and whether FFR's level is now dynamic or not. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetFoveatedRenderingLevel(EOculusXRFoveatedRenderingLevel level, bool isDynamic); /** * Returns whether eye-tracked foveated rendering is supported or not */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static bool GetEyeTrackedFoveatedRenderingSupported(); /** * Returns the current device's name */ UE_DEPRECATED(4.22, "UOculusXRFunctionLibrary::GetDeviceName has been deprecated and no longer functions as before. Please use the enum-based GetDeviceType instead.") UFUNCTION(BlueprintPure, Category = "OculusLibrary", meta = (DeprecatedFunction, DeprecationMessage = "UOculusXRFunctionLibrary::GetDeviceName has been deprecated and no longer functions as before. Please use the enum-based GetDeviceType instead.")) static FString GetDeviceName(); UFUNCTION(BlueprintPure, Category = "OculusLibrary") static EOculusXRDeviceType GetDeviceType(); /** * Returns the current controller's type * @param deviceHand (in) The hand to get the position from */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static EOculusXRControllerType GetControllerType(EControllerHand deviceHand); /** * Returns the current available frequencies */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static TArray GetAvailableDisplayFrequencies(); /** * Returns the current display frequency */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static float GetCurrentDisplayFrequency(); /** * Sets the requested display frequency */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetDisplayFrequency(float RequestedFrequency); /** * Enables/disables positional tracking on devices that support it. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void EnablePositionTracking(bool bPositionTracking); /** * Enables/disables orientation tracking on devices that support it. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void EnableOrientationTracking(bool bOrientationTracking); /** * Set the Color Scale/Offset */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetColorScaleAndOffset(FLinearColor ColorScale, FLinearColor ColorOffset, bool bApplyToAllLayers = false); /** * Returns true if system headset is in 3dof mode */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static bool GetSystemHmd3DofModeEnabled(); /** * Returns the color space of the target HMD */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static EOculusXRColorSpace GetHmdColorDesc(); /** * Sets the target HMD to do color space correction to a specific color space */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetClientColorDesc(EOculusXRColorSpace ColorSpace); /** * Turns on or off local dimming */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetLocalDimmingOn(bool LocalDimmingOn); /** * Checks if passthrough is supported */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static bool IsPassthroughSupported(); /** * Checks if color passthrough is supported */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static bool IsColorPassthroughSupported(); /** * Create the environment depth texture swap chain and start receiving * depth texture every frame until stopped. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void StartEnvironmentDepth(); /** * Destroy the environment depth texture swap chain and stop receiving * new depth textures every frame. Call this when environment depth is * no longer needed to free up resources. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void StopEnvironmentDepth(); /** * Returns true if StartEnvironmentDepth() has been called and is currently running. * If called right after calling StartEnvironmentDepth() it'll return false as it needs some time for EnvironmentDepth to start */ UFUNCTION(BlueprintPure, Category = "OculusLibrary") static bool IsEnvironmentDepthStarted(); /** * When hands removal is enabled and hand tracking is active, the region * of the depth texture which contains the hands will be replaced with * the best estimate for depth behind the hands. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetEnvironmentDepthHandRemoval(bool RemoveHands); /** * Sets the occlusions mode using environment depth. When occlusions are enabled * virtual objects that are behind physical objects will be occluded so that * the sense of immersion is preserved. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary", meta = (WorldContext = "WorldContextObject")) static void SetXROcclusionsMode(UObject* WorldContextObject, EOculusXROcclusionsMode Mode); /** * Sets the eyebuffer sharpen type. This amplifies contrast and fine details. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static void SetEyeBufferSharpenType(EOculusXREyeBufferSharpenType EyeBufferSharpenType); /** * Get a system recommendation on whether Passthrough should be active. * When set, it is recommended for apps which optionally support an MR experience * with Passthrough to default to that mode. * Currently, this is determined based on whether the user has Passthrough active in the home environment. */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary") static bool IsPassthroughRecommended(); /** * Returns IStereoLayers interface to work with overlays. */ static class IStereoLayers* GetStereoLayers(); /* GUARDIAN API */ /** * Returns true if the Guardian Outer Boundary is being displayed */ UFUNCTION(BlueprintPure, Category = "OculusLibrary|Guardian") static bool IsGuardianDisplayed(); /* GUARDIAN API */ /** * Returns true if the Guardian has been set up by the user, false if the user is in "seated" mode and has not set up a play space. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary|Guardian") static bool IsGuardianConfigured(); /** * Returns the list of points in UE world space of the requested Boundary Type * @param BoundaryType (in) An enum representing the boundary type requested, either Outer Boundary (exact guardian bounds) or PlayArea (rectangle inside the Outer Boundary) * @param UsePawnSpace (in) Boolean indicating to return the points in world space or pawn space */ UFUNCTION(BlueprintPure, Category = "OculusLibrary|Guardian") static TArray GetGuardianPoints(EOculusXRBoundaryType BoundaryType, bool UsePawnSpace = false); /** * Returns the dimensions in UE world space of the requested Boundary Type * @param BoundaryType (in) An enum representing the boundary type requested, either Outer Boundary (exact guardian bounds) or PlayArea (rectangle inside the Outer Boundary) */ UFUNCTION(BlueprintPure, Category = "OculusLibrary|Guardian") static FVector GetGuardianDimensions(EOculusXRBoundaryType BoundaryType); /** * Returns the transform of the play area rectangle, defining its position, rotation and scale to apply to a unit cube to match it with the play area. */ UFUNCTION(BlueprintPure, Category = "OculusLibrary|Guardian") static FTransform GetPlayAreaTransform(); /** * Get the intersection result between a UE4 coordinate and a guardian boundary * @param Point (in) Point in UE space to test against guardian boundaries * @param BoundaryType (in) An enum representing the boundary type requested, either Outer Boundary (exact guardian bounds) or PlayArea (rectangle inside the Outer Boundary) */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary|Guardian") static FOculusXRGuardianTestResult GetPointGuardianIntersection(const FVector Point, EOculusXRBoundaryType BoundaryType); /** * Get the intersection result between a tracked device (HMD or controllers) and a guardian boundary * @param DeviceType (in) Tracked Device type to test against guardian boundaries * @param BoundaryType (in) An enum representing the boundary type requested, either Outer Boundary (exact guardian bounds) or PlayArea (rectangle inside the Outer Boundary) */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary|Guardian") static FOculusXRGuardianTestResult GetNodeGuardianIntersection(EOculusXRTrackedDeviceType DeviceType, EOculusXRBoundaryType BoundaryType); /** * Forces the runtime to render guardian at all times or not * @param GuardianVisible (in) True will display guardian, False will hide it */ UFUNCTION(BlueprintCallable, Category = "OculusLibrary|Guardian") static void SetGuardianVisibility(bool GuardianVisible); /** When player triggers the Guardian boundary */ DECLARE_MULTICAST_DELEGATE_OneParam(FOculusGuardianTriggeredEvent, FOculusXRGuardianTestResult); /** When player returns within outer bounds */ DECLARE_MULTICAST_DELEGATE(FOculusGuardianReturnedEvent); /** * For outer boundary only. Devs can bind delegates via something like: BoundaryComponent->OnOuterBoundaryTriggered.AddDynamic(this, &UCameraActor::PauseGameForBoundarySystem) where * PauseGameForBoundarySystem() takes a TArray parameter. */ //UPROPERTY(BlueprintAssignable, Category = "Input|OculusLibrary|Guardian") //static FOculusGuardianTriggeredEvent OnGuardianTriggered; /** For outer boundary only. Devs can bind delegates via something like: BoundaryComponent->OnOuterBoundaryReturned.AddDynamic(this, &UCameraActor::ResumeGameForBoundarySystem) */ //UPROPERTY(BlueprintAssignable, Category = "OculusLibrary|Guardian") //FOculusGuardianReturnedEvent OnGuardianReturned; protected: static class OculusXRHMD::FOculusXRHMD* GetOculusXRHMD(); };