diff options
Diffstat (limited to 'Xamarin.Forms.Platform.MacOS/Renderers/OpenGLViewRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.MacOS/Renderers/OpenGLViewRenderer.cs | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.MacOS/Renderers/OpenGLViewRenderer.cs b/Xamarin.Forms.Platform.MacOS/Renderers/OpenGLViewRenderer.cs new file mode 100644 index 00000000..dda6ac50 --- /dev/null +++ b/Xamarin.Forms.Platform.MacOS/Renderers/OpenGLViewRenderer.cs @@ -0,0 +1,104 @@ +using System; +using System.ComponentModel; +using CoreVideo; + +namespace Xamarin.Forms.Platform.MacOS +{ + // ReSharper disable once InconsistentNaming + internal class OpenGLViewRenderer : ViewRenderer<OpenGLView, MacOSOpenGLView> + { + CVDisplayLink _displayLink; + + public void Display(object sender, EventArgs eventArgs) + { + if (Element.HasRenderLoop) + return; + SetupRenderLoop(true); + } + + protected override void Dispose(bool disposing) + { + if (_displayLink != null) + { + _displayLink.Dispose(); + _displayLink = null; + + if (Element != null) + ((IOpenGlViewController)Element).DisplayRequested -= Display; + } + + base.Dispose(disposing); + } + + protected override void OnElementChanged(ElementChangedEventArgs<OpenGLView> e) + { + if (e.OldElement != null) + ((IOpenGlViewController)e.OldElement).DisplayRequested -= Display; + + if (e.NewElement != null) + { + //var context = new EAGLContext(EAGLRenderingAPI.OpenGLES2); + //var glkView = new GLKView(RectangleF.Empty) { Context = context, DrawableDepthFormat = GLKViewDrawableDepthFormat.Format24, Delegate = new Delegate(e.NewElement) }; + var glkView = new MacOSOpenGLView(); + SetNativeControl(glkView); + + ((IOpenGlViewController)e.NewElement).DisplayRequested += Display; + + SetupRenderLoop(false); + } + + base.OnElementChanged(e); + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == OpenGLView.HasRenderLoopProperty.PropertyName) + SetupRenderLoop(false); + } + + void SetupRenderLoop(bool oneShot) + { + if (_displayLink != null) + return; + if (!oneShot && !Element.HasRenderLoop) + return; + + _displayLink = new CVDisplayLink(); + + //.Create(() => + //{ + // var control = Control; + // var model = Element; + // if (control != null) + // control.Display(); + // if (control == null || model == null || !model.HasRenderLoop) + // { + // _displayLink.Invalidate(); + // _displayLink.Dispose(); + // _displayLink = null; + // } + //}); + //_displayLink.(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode); + } + + //class Delegate : GLKViewDelegate + //{ + // readonly OpenGLView _model; + + // public Delegate(OpenGLView model) + // { + // _model = model; + // } + + // public override void DrawInRect(GLKView view, RectangleF rect) + // { + // var onDisplay = _model.OnDisplay; + // if (onDisplay == null) + // return; + // onDisplay(rect.ToRectangle()); + // } + //} + } +}
\ No newline at end of file |