Skip to content

Commit 0e480be

Browse files
committed
visionOS: re-enable dimming mode
1 parent 7f7c162 commit 0e480be

5 files changed

Lines changed: 69 additions & 23 deletions

File tree

src/video/uikit/SDL_CurvedContentHosting.swift

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,16 @@ internal class SDL_CurvedContentHosting: NSObject {
151151
//NSLog("SDL_CurvedContentHosting: Bootstrapping RealityView as hidden child")
152152
}
153153

154+
@objc public func dismiss() {
155+
guard let hc = self.hostingController else { return }
156+
157+
settings.dimmingReady = false
158+
159+
hc.dismiss(animated: false)
160+
161+
hostingController = nil
162+
}
163+
154164
private func updateOrnaments() {
155165
guard let hostingController else { return }
156166
let settings = self.settings
@@ -263,8 +273,8 @@ internal class SDL_CurvedContentSettings {
263273

264274
var inputType: InputType = .eyes
265275
var showHover: Bool = true
266-
var enableDimming: Bool = false // Doesn't seem to be reliable at the moment
267276
var isDimmed: Bool = false
277+
var dimmingReady: Bool = false
268278
var curvatureRadius: Float = 0.0
269279
var sceneState: SceneState = .interactive
270280
var isSnapped: Bool = false
@@ -320,10 +330,8 @@ struct SDL_SettingsPanelView: View {
320330
HStack(spacing: 12) {
321331
Image(systemName: settings.showHover ? "eye" : "eye.slash")
322332

323-
if settings.enableDimming {
324-
Image(systemName: settings.isDimmed ? "moon.fill" : "sun.max")
325-
.foregroundStyle(settings.isDimmed ? .primary : .secondary)
326-
}
333+
Image(systemName: settings.isDimmed ? "moon.fill" : "sun.max")
334+
.foregroundStyle(settings.isDimmed ? .primary : .secondary)
327335

328336
Divider().frame(height: 8)
329337

@@ -344,10 +352,8 @@ struct SDL_SettingsPanelView: View {
344352
VStack(spacing: 12) {
345353
Image(systemName: settings.showHover ? "eye" : "eye.slash")
346354

347-
if settings.enableDimming {
348-
Image(systemName: settings.isDimmed ? "moon.fill" : "sun.max")
349-
.foregroundStyle(settings.isDimmed ? .primary : .secondary)
350-
}
355+
Image(systemName: settings.isDimmed ? "moon.fill" : "sun.max")
356+
.foregroundStyle(settings.isDimmed ? .primary : .secondary)
351357

352358
Divider().frame(height: 8)
353359

@@ -394,21 +400,19 @@ struct SDL_SettingsPanelView: View {
394400
Image(systemName: "eye")
395401
Spacer()
396402

397-
if settings.enableDimming {
398-
Spacer()
399-
Image(systemName: "sun.max")
400-
401-
Toggle(isOn: $settings.isDimmed) {
402-
}
403-
.onChange(of: settings.isDimmed) {
404-
settings.save()
405-
}
406-
.labelsHidden()
407-
.tint(.secondary)
403+
Spacer()
404+
Image(systemName: "sun.max")
408405

409-
Image(systemName: "moon.fill")
410-
Spacer()
406+
Toggle(isOn: $settings.isDimmed) {
407+
}
408+
.onChange(of: settings.isDimmed) {
409+
settings.save()
411410
}
411+
.labelsHidden()
412+
.tint(.secondary)
413+
414+
Image(systemName: "moon.fill")
415+
Spacer()
412416
}
413417

414418
// Curvature slider

src/video/uikit/SDL_CurvedContentView.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ internal struct SDL_CurvedContentView: View {
7171
return curvedUIEntity != nil && helper.collisionShape != nil && !mouseInputEnabled
7272
}
7373

74+
private var shouldEnableDimming: Bool {
75+
return settings.isDimmed && settings.dimmingReady
76+
}
77+
7478
/// Value use to animate the screen radius
7579
@State private var animatedScreenRadius: Float = 1010
7680

@@ -265,6 +269,13 @@ internal struct SDL_CurvedContentView: View {
265269
guard let curvedUIEntity else { return }
266270
if let shape = helper.collisionShape, shouldPopulateCollisionShape {
267271
curvedUIEntity.components.set(CollisionComponent(shapes: [shape]))
272+
273+
// Dimming is possible now that we have a collision component
274+
Task {
275+
try await Task.sleep(nanoseconds: 1_000_000_000 / 4)
276+
277+
settings.dimmingReady = true
278+
}
268279
} else {
269280
curvedUIEntity.components.set(CollisionComponent(shapes: []))
270281
}
@@ -273,7 +284,7 @@ internal struct SDL_CurvedContentView: View {
273284
settings.isSnapped = snappedStatus.isSnapped
274285
helper.updateSnappedStatus(snapped: snappedStatus.isSnapped)
275286
}
276-
.preferredSurroundingsEffect(settings.enableDimming && settings.isDimmed ? .dark : nil)
287+
.preferredSurroundingsEffect(shouldEnableDimming ? .dark : nil)
277288
.frame(depth: 0)
278289
.ignoresSafeArea()
279290
.persistentSystemOverlays(settings.sceneState == .cinematic ? .hidden : .automatic)

src/video/uikit/SDL_UIKitBridge-objc.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ bool SDL_UIKit_HasCurvedWindow();
4242
*/
4343
bool SDL_UIKit_IsCurvedWindow(SDL_Window *window);
4444

45+
/**
46+
* Dismiss the curved content view
47+
*/
48+
void SDL_UIKit_HideCurvedWindow(SDL_Window *window);
49+
4550
/**
4651
* Get the curved content display texture.
4752
*/

src/video/uikit/SDL_UIKitBridge.m

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,28 @@ bool SDL_UIKit_IsCurvedWindow(SDL_Window *window)
152152
return data && data.curvedContentHosting;
153153
}
154154

155+
void SDL_UIKit_HideCurvedWindow(SDL_Window *window)
156+
{
157+
SDL_UIKitWindowData *data = (__bridge SDL_UIKitWindowData *)window->internal;
158+
if (!data || !data.curvedContentHosting) {
159+
return nil;
160+
}
161+
162+
id hosting = data.curvedContentHosting;
163+
SEL dismissSelector = NSSelectorFromString(@"dismiss");
164+
if (![hosting respondsToSelector:dismissSelector]) {
165+
return nil;
166+
}
167+
168+
NSMethodSignature *signature = [hosting methodSignatureForSelector:dismissSelector];
169+
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
170+
[invocation setSelector:dismissSelector];
171+
[invocation setTarget:hosting];
172+
[invocation invoke];
173+
174+
data.curvedContentHosting = nil;
175+
}
176+
155177
id<MTLTexture> SDL_UIKit_GetCurvedDisplayTexture(SDL_Window *window, id<MTLCommandBuffer> commandBuffer, int width, int height, MTLPixelFormat pixelFormat)
156178
{
157179
SDL_UIKitWindowData *data = (__bridge SDL_UIKitWindowData *)window->internal;

src/video/uikit/SDL_uikitwindow.m

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "SDL_uikitappdelegate.h"
3434
#include "SDL_uikitview.h"
3535
#include "SDL_uikitopenglview.h"
36+
#include "SDL_UIKitBridge-objc.h"
3637

3738
#include <Foundation/Foundation.h>
3839

@@ -386,6 +387,9 @@ void UIKit_DestroyWindow(SDL_VideoDevice *_this, SDL_Window *window)
386387

387388
[data.viewcontroller stopAnimation];
388389

390+
#ifdef SDL_PLATFORM_VISIONOS
391+
SDL_UIKit_HideCurvedWindow(window);
392+
#endif
389393
/* Detach all views from this window. We use a copy of the array
390394
* because setSDLWindow will remove the object from the original
391395
* array, which would be undesirable if we were iterating over it. */

0 commit comments

Comments
 (0)