diff --git a/sources/engine/Stride.Engine/Rendering/Compositing/VRDeviceDescription.cs b/sources/engine/Stride.Engine/Rendering/Compositing/VRDeviceDescription.cs index 1190f47401..4c93117653 100644 --- a/sources/engine/Stride.Engine/Rendering/Compositing/VRDeviceDescription.cs +++ b/sources/engine/Stride.Engine/Rendering/Compositing/VRDeviceDescription.cs @@ -14,6 +14,14 @@ public class VRDeviceDescription [DataMember(10)] public VRApi Api { get; set; } + /// + /// Scales the render resolution, + /// note that this compounds with the user-specified resolution multiplier + /// + /// + /// Scales the render resolution, + /// note that this compounds with the user-specified resolution multiplier + /// [DataMember(20)] public float ResolutionScale { get; set; } = 1.0f; } diff --git a/sources/engine/Stride.VirtualReality/OpenVR/OpenVR.cs b/sources/engine/Stride.VirtualReality/OpenVR/OpenVR.cs index 16a3caadb1..90b1aaf700 100644 --- a/sources/engine/Stride.VirtualReality/OpenVR/OpenVR.cs +++ b/sources/engine/Stride.VirtualReality/OpenVR/OpenVR.cs @@ -435,6 +435,12 @@ public static Texture GetMirrorTexture(GraphicsDevice device, int eyeIndex) return tex; } + public static void GetRecommendedRenderTargetSize(out (uint x, uint y) size) + { + size = default; + Valve.VR.OpenVR.System.GetRecommendedRenderTargetSize(ref size.x, ref size.y); + } + public static ulong CreateOverlay() { var layerKeyName = Guid.NewGuid().ToString(); diff --git a/sources/engine/Stride.VirtualReality/OpenVR/OpenVrHmd.cs b/sources/engine/Stride.VirtualReality/OpenVR/OpenVrHmd.cs index 96dd9d50b8..d286b9faf2 100644 --- a/sources/engine/Stride.VirtualReality/OpenVR/OpenVrHmd.cs +++ b/sources/engine/Stride.VirtualReality/OpenVR/OpenVrHmd.cs @@ -25,6 +25,8 @@ internal class OpenVRHmd : VRDevice private Vector3 currentHeadLinearVelocity; private Vector3 currentHeadAngularVelocity; private Quaternion currentHeadRot; + private (uint x, uint y) recommendedSize; + private GraphicsDevice device; public override bool CanInitialize => OpenVR.InitDone || OpenVR.Init(); @@ -32,34 +34,46 @@ public OpenVRHmd() { VRApi = VRApi.OpenVR; SupportsOverlays = true; + recommendedSize = (2160, 1200); } public override void Enable(GraphicsDevice device, GraphicsDeviceManager graphicsDeviceManager, bool requireMirror, int mirrorWidth, int mirrorHeight) { - var width = (int)(OptimalRenderFrameSize.Width * RenderFrameScaling); + this.device = device; + needsMirror = requireMirror; + OpenVR.GetRecommendedRenderTargetSize(out recommendedSize); + RebuildRenderTargets(); + leftEyeMirror = OpenVR.GetMirrorTexture(device, 0); + rightEyeMirror = OpenVR.GetMirrorTexture(device, 1); + + leftHandController = new OpenVRTouchController(TouchControllerHand.Left); + rightHandController = new OpenVRTouchController(TouchControllerHand.Right); + + trackedDevices = new OpenVRTrackedDevice[Valve.VR.OpenVR.k_unMaxTrackedDeviceCount]; + for (int i=0; i new Size2(2160, 1200); + public override Size2 OptimalRenderFrameSize => new Size2((int)recommendedSize.x, (int)recommendedSize.y); public override void Dispose() {