diff options
| author | Ian C <ianc@noddybox.co.uk> | 2023-12-14 20:06:19 +0000 | 
|---|---|---|
| committer | Ian C <ianc@noddybox.co.uk> | 2023-12-14 20:06:19 +0000 | 
| commit | 084190b5aed27e167574e0bfa8619d304f64bb39 (patch) | |
| tree | fbfb306496d4aa7442ccda18a2c08a262555ce10 /metal_view.swift | |
| parent | 8fb7fc734f15817e0a3dfe9b14005eb334c2629c (diff) | |
Uodatesmain
Diffstat (limited to 'metal_view.swift')
| -rw-r--r-- | metal_view.swift | 65 | 
1 files changed, 58 insertions, 7 deletions
| diff --git a/metal_view.swift b/metal_view.swift index 7cc8d34..31c2ea8 100644 --- a/metal_view.swift +++ b/metal_view.swift @@ -1,8 +1,59 @@ -// -//  metal_view.swift -//  metal_test -// -//  Created by Ian C on 02/12/2023. -// +import SwiftUI +import MetalKit -import Foundation +struct MetalView: NSViewRepresentable { +    func makeCoordinator() -> Coordinator { +        Coordinator(self) +    } +    func makeNSView(context: NSViewRepresentableContext<MetalView>) -> MTKView { +        let mtkView = MTKView() +        mtkView.delegate = context.coordinator +        mtkView.preferredFramesPerSecond = 60 +        mtkView.enableSetNeedsDisplay = true +        if let metalDevice = MTLCreateSystemDefaultDevice() { +            mtkView.device = metalDevice +        } +        mtkView.framebufferOnly = false +        mtkView.clearColor = MTLClearColor(red: 0, green: 0, blue: 0, alpha: 0) +        mtkView.drawableSize = mtkView.frame.size +        mtkView.enableSetNeedsDisplay = true +        mtkView.isPaused = false +        return mtkView +    } +     +    func updateNSView(_ nsView: MTKView, context: NSViewRepresentableContext<MetalView>) { +    } +     +    class Coordinator : NSObject, MTKViewDelegate { +        var parent: MetalView +        var metalDevice: MTLDevice! +        var metalCommandQueue: MTLCommandQueue! +         +        init(_ parent: MetalView) { +            self.parent = parent +            if let metalDevice = MTLCreateSystemDefaultDevice() { +                self.metalDevice = metalDevice +            } +            self.metalCommandQueue = metalDevice.makeCommandQueue()! +            super.init() +        } +         +        func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) { +        } +         +        func draw(in view: MTKView) { +            guard let drawable = view.currentDrawable else { +                return +            } +            let commandBuffer = metalCommandQueue.makeCommandBuffer() +            let rpd = view.currentRenderPassDescriptor +            rpd?.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 1) +            rpd?.colorAttachments[0].loadAction = .clear +            rpd?.colorAttachments[0].storeAction = .store +            let re = commandBuffer?.makeRenderCommandEncoder(descriptor: rpd!) +            re?.endEncoding() +            commandBuffer?.present(drawable) +            commandBuffer?.commit() +        } +    } +} | 
