diff --git a/GLLara/GLLItemDrawer.swift b/GLLara/GLLItemDrawer.swift index ee04ef2..36f87d6 100644 --- a/GLLara/GLLItemDrawer.swift +++ b/GLLara/GLLItemDrawer.swift @@ -80,7 +80,7 @@ class GLLItemDrawer { } func propertiesChanged() { - sceneDrawer?.notifyRedraw() + sceneDrawer?.needsUpdate = true } private func permutationTableColumn(for assignment: GLLItemChannelAssignment) -> vector_float4 { diff --git a/GLLara/GLLNotifications.h b/GLLara/GLLNotifications.h index 12f33ed..6009fda 100644 --- a/GLLara/GLLNotifications.h +++ b/GLLara/GLLNotifications.h @@ -8,8 +8,6 @@ #include -extern NSString *GLLSceneDrawerNeedsUpdateNotification; - // Sent when bound textures or similar change outside of normal execution, to // indicate that the draw state needs to be reset for the next frame. extern NSString *GLLDrawStateChangedNotification; diff --git a/GLLara/GLLNotifications.m b/GLLara/GLLNotifications.m index 5c12239..e786926 100644 --- a/GLLara/GLLNotifications.m +++ b/GLLara/GLLNotifications.m @@ -8,7 +8,4 @@ #import - -NSString *GLLSceneDrawerNeedsUpdateNotification = @"GLLSceneDrawerNeedsUpdateNotification"; - NSString *GLLDrawStateChangedNotification = @"GLLDrawStateChangedNotification"; diff --git a/GLLara/GLLSceneDrawer.swift b/GLLara/GLLSceneDrawer.swift index a3c9024..f6f84e4 100644 --- a/GLLara/GLLSceneDrawer.swift +++ b/GLLara/GLLSceneDrawer.swift @@ -8,8 +8,9 @@ import Cocoa import CoreData +import Combine -@objc class GLLSceneDrawer: NSObject { +@objc class GLLSceneDrawer: NSObject, ObservableObject { @objc init(document: GLLDocument) { self.document = document @@ -40,11 +41,11 @@ import CoreData } } } - self.notifyRedraw() + self.needsUpdate = true } drawStateNotificationObserver = NotificationCenter.default.addObserver(forName: Notification.Name.GLLDrawStateChanged, object: nil, queue: OperationQueue.main) { [weak self] notification in - self?.notifyRedraw() + self?.needsUpdate = true } // Load existing items @@ -78,7 +79,7 @@ import CoreData @objc var selectedBones: [GLLItemBone] { set { skeletonDrawer.selectedBones = newValue - notifyRedraw() + needsUpdate = true } get { return skeletonDrawer.selectedBones @@ -95,9 +96,7 @@ import CoreData skeletonDrawer.draw(into: commandEncoder) } - func notifyRedraw() { - NotificationCenter.default.post(name: NSNotification.Name.GLLSceneDrawerNeedsUpdate, object: self) - } + @Published var needsUpdate = false private var itemDrawers: [GLLItemDrawer] = [] private let skeletonDrawer: GLLSkeletonDrawer diff --git a/GLLara/GLLView.swift b/GLLara/GLLView.swift index 1536c00..a326a8b 100644 --- a/GLLara/GLLView.swift +++ b/GLLara/GLLView.swift @@ -9,6 +9,7 @@ import Cocoa import MetalKit import GameController +import Combine @objc class GLLView: MTKView { @@ -27,9 +28,6 @@ import GameController notificationObservers.append(NotificationCenter.default.addObserver(forName: UserDefaults.didChangeNotification, object: nil, queue: OperationQueue.main) { [weak self] notification in self?.showSelection = UserDefaults.standard.bool(forKey: GLLPrefShowSkeleton) }) - notificationObservers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.GLLSceneDrawerNeedsUpdate, object: nil, queue: OperationQueue.main) { [weak self] notification in - self?.unpause() - }) notificationObservers.append(NotificationCenter.default.addObserver(forName: NSNotification.Name.GCControllerDidBecomeCurrent, object: nil, queue: OperationQueue.main) { [weak self] notification in self?.unpause() }) @@ -57,13 +55,20 @@ import GameController @objc func set(camera: GLLCamera, sceneDrawer: GLLSceneDrawer) { self.camera = camera + sceneDrawerUpdateRegistration?.cancel() self.sceneDrawer = sceneDrawer + sceneDrawerUpdateRegistration = sceneDrawer.$needsUpdate.sink { [weak self] value in + if value { + self?.unpause() + } + } self.viewDrawer = GLLViewDrawer(sceneDrawer: sceneDrawer, camera: camera, view: self) } var camera: GLLCamera? = nil @objc weak var document: GLLDocument? = nil var sceneDrawer: GLLSceneDrawer? = nil + var sceneDrawerUpdateRegistration: AnyCancellable? = nil @objc var viewDrawer: GLLViewDrawer? = nil var showSelection: Bool = false var keysDown = CharacterSet() diff --git a/GLLara/GLLViewDrawer.swift b/GLLara/GLLViewDrawer.swift index 652138d..4655738 100644 --- a/GLLara/GLLViewDrawer.swift +++ b/GLLara/GLLViewDrawer.swift @@ -290,6 +290,8 @@ import UniformTypeIdentifiers private func draw(commandBuffer: MTLCommandBuffer, viewRenderPassDescriptor: MTLRenderPassDescriptor, surface: Surface, includeUI: Bool = true, screenScale: Double = 2.0) { + sceneDrawer.needsUpdate = false + var viewProjection = camera.viewProjectionMatrix(forAspectRatio: Float(surface.width) / Float(surface.height)) if needsUpdateLights {