summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/Renderers/OpenGLViewRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Renderers/OpenGLViewRenderer.cs')
-rw-r--r--Xamarin.Forms.Platform.Android/Renderers/OpenGLViewRenderer.cs102
1 files changed, 102 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/Renderers/OpenGLViewRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/OpenGLViewRenderer.cs
new file mode 100644
index 00000000..5c787b76
--- /dev/null
+++ b/Xamarin.Forms.Platform.Android/Renderers/OpenGLViewRenderer.cs
@@ -0,0 +1,102 @@
+using System;
+using System.ComponentModel;
+using Android.Opengl;
+using Javax.Microedition.Khronos.Opengles;
+using EGLConfig = Javax.Microedition.Khronos.Egl.EGLConfig;
+using Object = Java.Lang.Object;
+
+namespace Xamarin.Forms.Platform.Android
+{
+ internal class OpenGLViewRenderer : ViewRenderer<OpenGLView, GLSurfaceView>
+ {
+ bool _disposed;
+
+ public OpenGLViewRenderer()
+ {
+ AutoPackage = false;
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if (!_disposed && disposing)
+ {
+ _disposed = true;
+
+ if (Element != null)
+ ((IOpenGlViewController)Element).DisplayRequested -= Display;
+ }
+ base.Dispose(disposing);
+ }
+
+ protected override void OnElementChanged(ElementChangedEventArgs<OpenGLView> e)
+ {
+ base.OnElementChanged(e);
+
+ if (e.OldElement != null)
+ ((IOpenGlViewController)Element).DisplayRequested -= Display;
+
+ if (e.NewElement != null)
+ {
+ GLSurfaceView surfaceView = Control;
+ if (surfaceView == null)
+ {
+ surfaceView = new GLSurfaceView(Context);
+ surfaceView.SetEGLContextClientVersion(2);
+ SetNativeControl(surfaceView);
+ }
+
+ ((IOpenGlViewController)Element).DisplayRequested += Display;
+ surfaceView.SetRenderer(new Renderer(Element));
+ SetRenderMode();
+ }
+ }
+
+ protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ base.OnElementPropertyChanged(sender, e);
+
+ if (e.PropertyName == OpenGLView.HasRenderLoopProperty.PropertyName)
+ SetRenderMode();
+ }
+
+ void Display(object sender, EventArgs eventArgs)
+ {
+ if (Element.HasRenderLoop)
+ return;
+ Control.RequestRender();
+ }
+
+ void SetRenderMode()
+ {
+ Control.RenderMode = Element.HasRenderLoop ? Rendermode.Continuously : Rendermode.WhenDirty;
+ }
+
+ class Renderer : Object, GLSurfaceView.IRenderer
+ {
+ readonly OpenGLView _model;
+ Rectangle _rect;
+
+ public Renderer(OpenGLView model)
+ {
+ _model = model;
+ }
+
+ public void OnDrawFrame(IGL10 gl)
+ {
+ Action<Rectangle> onDisplay = _model.OnDisplay;
+ if (onDisplay == null)
+ return;
+ onDisplay(_rect);
+ }
+
+ public void OnSurfaceChanged(IGL10 gl, int width, int height)
+ {
+ _rect = new Rectangle(0.0, 0.0, width, height);
+ }
+
+ public void OnSurfaceCreated(IGL10 gl, EGLConfig config)
+ {
+ }
+ }
+ }
+} \ No newline at end of file