Пример #1
0
 protected override void OnOpenGlDeinit(GlInterface gl, int fb)
 {
     game?.DisposeGame();
     engine.Dispose();
     engine = null !;
     base.OnOpenGlDeinit(gl, fb);
 }
Пример #2
0
        public GlPlatformFeature(IAvnGlDisplay display)
        {
            _display = display;
            var immediate = display.CreateContext(null);
            var deferred  = display.CreateContext(immediate);


            int         major, minor;
            GlInterface glInterface;

            using (immediate.MakeCurrent())
            {
                var basic = new GlBasicInfoInterface(display.GetProcAddress);
                basic.GetIntegerv(GlConsts.GL_MAJOR_VERSION, out major);
                basic.GetIntegerv(GlConsts.GL_MINOR_VERSION, out minor);
                _version    = new GlVersion(GlProfileType.OpenGL, major, minor);
                glInterface = new GlInterface(_version, (name) =>
                {
                    var rv = _display.GetProcAddress(name);
                    return(rv);
                });
            }

            GlDisplay = new GlDisplay(display, glInterface, immediate.SampleCount, immediate.StencilSize);

            ImmediateContext = new GlContext(GlDisplay, immediate, _version);
            DeferredContext  = new GlContext(GlDisplay, deferred, _version);
        }
Пример #3
0
 private LayerFbo(EAGLContext context, GlInterface gl, CAEAGLLayer layer, int framebuffer, int renderbuffer, int depthBuffer)
 {
     _context      = context;
     _gl           = gl;
     _layer        = layer;
     _framebuffer  = framebuffer;
     _renderbuffer = renderbuffer;
     _depthBuffer  = depthBuffer;
 }
Пример #4
0
        protected override void OnOpenGlRender(GlInterface gl, int fb)
        {
            if (engine == null || delayedDispose)
            {
                return;
            }

            engine.statsManager.PixelSize = new Vector2(PixelSize.Item1, PixelSize.Item2);
            engine.statsManager.Counters.PresentTime.Add(PresentTime);
            renderStopwatch.Restart();
            try
            {
                engine.Device.device.CheckError("start OnOpenGlRender");
                engine.Device.device.Begin();
                engine.inputManager.Update();
                engine.renderManager.BeginFrame();

                var delta = (float)sw.Elapsed.TotalMilliseconds;
                Tick(delta);
                engine.statsManager.Counters.FrameTime.Add(delta);
                sw.Restart();
                Dispatcher.UIThread.Post(() => RaisePropertyChanged(FrameRateProperty, Optional <float> .Empty, FrameRate), DispatcherPriority.Render);

                Update(delta);

                // render pass
                engine.renderManager.PrepareRendering(fb);
                engine.renderManager.RenderWorld(fb);
                Render(delta);
                engine.renderManager.FinalizeRendering(fb);

                if (engine.inputManager.Keyboard.JustPressed(Key.R))
                {
                    if (engine.Device.device is DebugDevice debug)
                    {
                        var file = new FileInfo("render_debug.txt");
                        File.WriteAllLines(file.FullName, debug.commands);
                        Console.WriteLine("Log written to " + file.FullName);
                    }
                }
                engine.inputManager.PostUpdate();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
            finally
            {
                // important! we need to restore Avalonia status
                engine.Device.device.ActiveTextureUnit(0);
                engine.Device.device.CheckError("post render");
            }
            renderStopwatch.Stop();
            engine.statsManager.Counters.TotalRender.Add(renderStopwatch.Elapsed.Milliseconds);
            frame++;
        }
Пример #5
0
        protected override void OnOpenGlDeinit(GlInterface gl, int fb)
        {
            DisposeRenderer();
            m_gl.BindVertexArray(0);
            m_gl.DeleteVertexArrays(1, m_vao);

            m_vao = null;
            m_gl  = null;
        }
 public GlDisplay(IAvnGlDisplay display)
 {
     _display    = display;
     GlInterface = new GlInterface((name, optional) =>
     {
         var rv = _display.GetProcAddress(name);
         if (rv == IntPtr.Zero && !optional)
         {
             throw new OpenGlException($"{name} not found in system OpenGL");
         }
         return(rv);
     });
 }
Пример #7
0
 public GlDisplay(IAvnGlDisplay display, int sampleCount, int stencilSize)
 {
     _display    = display;
     SampleCount = sampleCount;
     StencilSize = stencilSize;
     GlInterface = new GlInterface((name, optional) =>
     {
         var rv = _display.GetProcAddress(name);
         if (rv == IntPtr.Zero && !optional)
         {
             throw new OpenGlException($"{name} not found in system OpenGL");
         }
         return(rv);
     });
 }
        private bool CheckFramebufferStatus(GlInterface gl)
        {
            var status = gl.CheckFramebufferStatus(GL_FRAMEBUFFER);

            if (status != GL_FRAMEBUFFER_COMPLETE)
            {
                int code;
                while ((code = gl.GetError()) != 0)
                {
                    Logger.TryGet(LogEventLevel.Error, "OpenGL")?.Log("OpenGlControlBase",
                                                                      "Unable to initialize OpenGL FBO: {code}", code);
                }
                return(false);
            }

            return(true);
        }
Пример #9
0
        public static LayerFbo TryCreate(EAGLContext context, GlInterface gl, CAEAGLLayer layer)
        {
            if (context != EAGLContext.CurrentContext)
            {
                return(null);
            }

            var fb = new int[2];
            var rb = new int[2];
            var db = new int[2];

            gl.GenRenderbuffers(1, rb);
            gl.BindRenderbuffer(GlConsts.GL_RENDERBUFFER, rb[0]);
            context.RenderBufferStorage(GlConsts.GL_RENDERBUFFER, layer);

            gl.GenFramebuffers(1, fb);
            gl.BindFramebuffer(GlConsts.GL_FRAMEBUFFER, fb[0]);
            gl.FramebufferRenderbuffer(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_COLOR_ATTACHMENT0, GlConsts.GL_RENDERBUFFER, rb[0]);

            int[] w = new int[1];
            int[] h = new int[1];
            gl.GetRenderbufferParameteriv(GlConsts.GL_RENDERBUFFER, GlConsts.GL_RENDERBUFFER_WIDTH, w);
            gl.GetRenderbufferParameteriv(GlConsts.GL_RENDERBUFFER, GlConsts.GL_RENDERBUFFER_HEIGHT, h);

            gl.GenRenderbuffers(1, db);

            //GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, depthBuffer);
            //GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferInternalFormat.DepthComponent16, w, h);
            gl.FramebufferRenderbuffer(GlConsts.GL_FRAMEBUFFER, GlConsts.GL_DEPTH_ATTACHMENT, GlConsts.GL_RENDERBUFFER, db[0]);

            var frameBufferError = gl.CheckFramebufferStatus(GlConsts.GL_FRAMEBUFFER);

            if (frameBufferError != GlConsts.GL_FRAMEBUFFER_COMPLETE)
            {
                gl.DeleteFramebuffers(1, fb);
                gl.DeleteRenderbuffers(1, db);
                gl.DeleteRenderbuffers(1, rb);
                return(null);
            }

            return(new LayerFbo(context, gl, layer, fb, rb, db)
            {
                Width = w[0],
                Height = h[0]
            });
        }
Пример #10
0
 public GlxContext(GlxInterface glx, IntPtr handle, GlxDisplay display,
                   GlVersion version, int sampleCount, int stencilSize,
                   X11Info x11, IntPtr defaultXid,
                   bool ownsPBuffer)
 {
     Handle       = handle;
     Glx          = glx;
     _x11         = x11;
     _defaultXid  = defaultXid;
     _ownsPBuffer = ownsPBuffer;
     Display      = display;
     Version      = version;
     SampleCount  = sampleCount;
     StencilSize  = stencilSize;
     using (MakeCurrent())
         GlInterface = new GlInterface(version, GlxInterface.SafeGetProcAddress);
 }
Пример #11
0
        protected unsafe override void OnOpenGlInit(GlInterface gl, int fb)
        {
            m_gl = new GlInterfaceEx(gl);

            // hook up debug handler
            //m_debugProc = OnGlDebugMessage;
            //gl.Enable(GL_DEBUG_OUTPUT);
            //m_gl.DebugMessageCallback(m_debugProc, null);

            // allocate vertex array object (VAO)
            m_vao = new int[1];
            m_gl.GenVertexArrays(1, m_vao);
            m_gl.BindVertexArray(m_vao[0]);

            // initialize Cubism renderer
            TryUpdateRenderer();
            m_time.Restart();
        }
Пример #12
0
        protected override void OnOpenGlRender(GlInterface gl, int fb)
        {
            if (m_asset == null)
            {
                return;
            }

            if ((m_lastmotion == null) || (m_lastmotion.Finished == true))
            {
                var motion_group = m_asset.MotionGroups[""];
                int number       = new Random().Next() % motion_group.Length;
                var motion       = (CubismMotion)motion_group[number];
                m_lastmotion = m_asset.StartMotion(MotionType.Base, motion, false);
            }

            m_asset.Update(m_time.ElapsedMilliseconds / 1000.0);
            m_time.Restart();
            double controlScaling = VisualRoot.RenderScaling;
            int    w = (int)(Bounds.Width * controlScaling);
            int    h = (int)(Bounds.Height * controlScaling);
            double r = Math.Sqrt(((float)w) / h);

            gl.Viewport(0, 0, w, h);
            gl.Clear(GL_COLOR_BUFFER_BIT);

            Matrix4x4 mvp_matrix = Matrix4x4.Identity;

            if (h >= w)
            {
                mvp_matrix.M11 = 1.5f;
                mvp_matrix.M22 = -1.5f * w / h;
            }
            else
            {
                mvp_matrix.M11 = 1.5f * h / w;
                mvp_matrix.M22 = -1.5f;
            }

            m_rendermgr.Draw(mvp_matrix);

            Dispatcher.UIThread.Post(InvalidateVisual, DispatcherPriority.Background);
        }
Пример #13
0
 public WglContext(WglContext sharedWith, GlVersion version, IntPtr context, IntPtr hWnd, IntPtr dc, int pixelFormat,
                   PixelFormatDescriptor formatDescriptor)
 {
     Version           = version;
     _sharedWith       = sharedWith;
     _context          = context;
     _hWnd             = hWnd;
     _dc               = dc;
     _pixelFormat      = pixelFormat;
     _formatDescriptor = formatDescriptor;
     StencilSize       = formatDescriptor.StencilBits;
     using (MakeCurrent())
         GlInterface = new GlInterface(version, proc =>
         {
             var ext = wglGetProcAddress(proc);
             if (ext != IntPtr.Zero)
             {
                 return(ext);
             }
             return(GetProcAddress(WglDisplay.OpenGl32Handle, proc));
         });
 }
Пример #14
0
        protected override void OnOpenGlInit(GlInterface gl, int fb)
        {
            try
            {
#if USE_OPENTK
                engine = new Engine(new OpenTKDevice(), new Configuration(), this);
#else
                IDevice device;
                var     real = new RealDevice(gl);
#if DEBUG && DEBUG_OPENGL
                device = new DebugDevice(real);
#else
                device = new RealDeviceWrapper(real);
#endif
                engine = new Engine(device, new Configuration(), this);
#endif
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }