2016-10-06 18 views
1

私は、アップルのサンプルコードであるGLEssentials from obj-cからSwift 2に強制してきた由緒正しいアプリケーションを手に入れました。今はSwift 3に移行しようとしています。NSOpenGLViewそれは中核であり、主レンダラーはSwiftにまだいません(私は知っています:私はすぐに弾を噛んでMetalなどに移行しなければなりません)。Swift 3でOpenGLを設定する

現在、OSX 10.12では、Xcode 8ではウィンドウが空白になっています。私はSwift 3でコンパイルして正常に動作させるために、メイン(Swift)OpenGLViewクラスに対してコンパイラが提案した変更を加えなければなりませんでした。レンダラークラスがうまく動いているように見えます;私は60のFPSを報告することができ、フレームごとにコードを停止するブレークポイントを配置することができます。マイOpenGLViewクラスは以下のように設定して、ほとんどの新しいスウィフト3変更が行われているところである:

class BQSOpenGLView: NSOpenGLView { 
    var m_renderer: OpenGLRenderer = OpenGLRenderer() 
    var have_setup_renderer: Bool = false 
    var displayLink: CVDisplayLink? 
    var has_setup = false 
    var is_fullscreen: Bool = false 
    var grid_size: QSGridSize = QSMakeGridSize(1, 1) 
    var backing_scalar_changed: Bool = false 
    var backing_scalar: GLfloat = 0.0 

override func awakeFromNib() { 
     backing_scalar = GLfloat((self.window?.backingScaleFactor)!) 
     NotificationCenter.default.addObserver(self, selector: #selector(BQSOpenGLView.willEnterFullscreen(_:)), name: NSNotification.Name.NSWindowWillEnterFullScreen, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(BQSOpenGLView.willExitFullscreen(_:)), name: NSNotification.Name.NSWindowWillExitFullScreen, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(BQSOpenGLView.backingScaleChange(_:)), name: NSNotification.Name.NSWindowDidChangeBackingProperties, object: nil) 
     let attributes : [NSOpenGLPixelFormatAttribute] = [ 
      NSOpenGLPixelFormatAttribute(NSOpenGLPFADoubleBuffer), 
      NSOpenGLPixelFormatAttribute(NSOpenGLPFADepthSize), 
      NSOpenGLPixelFormatAttribute(24), 
      NSOpenGLPixelFormatAttribute(NSOpenGLPFASampleBuffers), 
      NSOpenGLPixelFormatAttribute(1), 
      NSOpenGLPixelFormatAttribute(NSOpenGLPFASamples), 
      NSOpenGLPixelFormatAttribute(2), 
      NSOpenGLPixelFormatAttribute(NSOpenGLPFAOpenGLProfile), 
      NSOpenGLPixelFormatAttribute(NSOpenGLProfileVersion3_2Core), 
      NSOpenGLPixelFormatAttribute(0) 
     ] 
     self.pixelFormat = NSOpenGLPixelFormat(attributes: attributes) 
     self.wantsBestResolutionOpenGLSurface = true 
     let context:NSOpenGLContext = NSOpenGLContext.init(format: self.pixelFormat!, share: nil)! 
     CGLEnable(context.cglContextObj!, kCGLCECrashOnRemovedFunctions) 
     self.openGLContext = context 
    } 

override func prepareOpenGL() { 
super.prepareOpenGL() 

// The callback function is called everytime CVDisplayLink says its time to get a new frame. 
     func displayLinkOutputCallback(_ displayLink: CVDisplayLink, _ inNow: UnsafePointer<CVTimeStamp>, _ inOutputTime: UnsafePointer<CVTimeStamp>, _ flagsIn: CVOptionFlags, _ flagsOut: UnsafeMutablePointer<CVOptionFlags>, _ displayLinkContext: UnsafeMutableRawPointer?) -> CVReturn { 
      unsafeBitCast(displayLinkContext, to: BQSOpenGLView.self).renderFrame() 
      return kCVReturnSuccess 
     } 
     self.wantsLayer = true 
     self.wantsBestResolutionOpenGLSurface = true 
     CVDisplayLinkCreateWithActiveCGDisplays(&displayLink) 
     let success = CVDisplayLinkSetOutputCallback(displayLink!, displayLinkOutputCallback, Unmanaged.passUnretained(self).toOpaque()) 
     if success != kCVReturnSuccess { 
      Swift.print ("No opengl") 
     } 
     CVDisplayLinkStart(displayLink!) 
     has_setup = true 
     NotificationCenter.default.post(name: Notification.Name(rawValue: kOPENGL_SETUP_NOTE), object: nil) 
     self.backingScaleChange(nil) 
    } 
//.. 
} 

renderメソッドは次のとおりです。

func renderFrame() { 
    self.openGLContext?.makeCurrentContext() 
    CGLLockContext((self.openGLContext?.cglContextObj)!) 
    if !have_setup_renderer { //init only when locked all the context 
      self.backingScaleChange(nil) 
      m_renderer = OpenGLRenderer.init(defaultFBO: 0, screenSize: (self.window?.screen?.frame.size)!, backingScalar: self.backing_scalar) 
      have_setup_renderer = true 
    } 
    m_renderer.render() 
    CGLFlushDrawable((self.openGLContext?.cglContextObj)!) 
    CGLUnlockContext((self.openGLContext?.cglContextObj)!) 
} 

の新しいスウィフト3の方法がありますOpenGLを設定するか、上記のコードは正しいですか、どこか別の問題ですか?

答えて

1

微妙に壊れたXcodeプロジェクトになっています。唯一動作しなかったのはOpenGLビューでした。たぶんペン先は悪かったかもしれません。

私は新しいプロジェクトを開始し、新しいファイルにコードをペースト&ペーストし、面倒なUIを再構築して、うまくいった。それは私にプログラムでウィンドウをセットアップしないよう教えてくれるでしょう!

関連する問題