예제 #1
0
        internal ILOGLPanel() : base(GraphicDeviceType.OpenGL)
        {
#if TRACE
            Trace.TraceInformation("{0},{1} ILOGLPanel.ctor(mode) start", DateTime.Now, Environment.TickCount);
            Trace.Indent();
#endif

            this.SetStyle(ControlStyles.Opaque, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            m_format = GraphicsMode.Default;

            if (Configuration.RunningOnWindows)
            {
                m_implementation = new OpenTK.Platform.Windows.WinGLControl(m_format, this);
            }
            else if (Configuration.RunningOnX11)
            {
                m_implementation = new OpenTK.Platform.X11.X11GLControl(m_format, this);
            }
            else if (Configuration.RunningOnOSX)
            {
                throw new PlatformNotSupportedException("Refer to http://www.opentk.com for more information.");
            }

            this.CreateControl();

#if TRACE
            Trace.Unindent();
            Trace.TraceInformation("{0},{1} ILPanel.ctor(mode) end", DateTime.Now, Environment.TickCount);
#endif
        }
        /// <summary>
        /// Raises the HandleCreated event.
        /// </summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleCreated(EventArgs e)
        {
            if (!(_implementation is DummyGLControl))
            {
                // No need to recreate our DummyGLControl
                _context?.Dispose();
                _implementation?.WindowInfo.Dispose();

                if (_designMode)
                {
                    _implementation = new DummyGLControl();
                    _context        = _implementation.CreateContext(_major, _minor, _flags);
                    HasValidContext = false;
                }
                else
                {
                    try
                    {
                        _implementation = new GLControlFactory().CreateGLControl(_format, this);
                        _context        = _implementation.CreateContext(_major, _minor, _flags);
                        HasValidContext = true;
                    }
                    catch (GraphicsModeException)
                    {
                        _implementation = new DummyGLControl();
                        _context        = _implementation.CreateContext(_major, _minor, _flags);
                        HasValidContext = false;
                    }
                }

                MakeCurrent();

                if (HasValidContext)
                {
                    ((IGraphicsContextInternal)_context).LoadAll();
                }

                // Deferred setting of vsync mode. See VSync property for more information.
                if (_initialVsyncValue.HasValue)
                {
                    _context.SwapInterval = _initialVsyncValue.Value ? 1 : 0;
                    _initialVsyncValue    = null;
                }
            }

            base.OnHandleCreated(e);

            if (_resizeEventSuppressed)
            {
                OnResize(EventArgs.Empty);
                _resizeEventSuppressed = false;
            }
        }
예제 #3
0
파일: GLControl.cs 프로젝트: hawking44/test
        /// <summary>Raises the HandleCreated event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleCreated(EventArgs e)
        {
            if (UseOpenGL)
            {
                if (context != null)
                {
                    context.Dispose();
                }

                if (implementation != null)
                {
                    implementation.WindowInfo.Dispose();
                }

                if (design_mode)
                {
                    implementation = new DummyGLControl();
                }
                else
                {
                    implementation = new GLControlFactory().CreateGLControl(format, this);
                }

                context = implementation.CreateContext(major, minor, flags);
                MakeCurrent();

                if (!design_mode)
                {
                    ((IGraphicsContextInternal)Context).LoadAll();
                }

                // Deferred setting of vsync mode. See VSync property for more information.
                if (initial_vsync_value.HasValue)
                {
                    Context.VSync       = initial_vsync_value.Value;
                    initial_vsync_value = null;
                }
            }

            base.OnHandleCreated(e);

            if (UseOpenGL)
            {
                if (resize_event_suppressed)
                {
                    OnResize(EventArgs.Empty);
                    resize_event_suppressed = false;
                }
            }
        }
예제 #4
0
        /// <summary>Raises the HandleDestroyed event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleDestroyed(EventArgs e)
        {
            if (context != null)
            {
                context.Dispose();
                context = null;
            }

            if (implementation != null)
            {
                implementation.WindowInfo.Dispose();
                implementation = null;
            }

            base.OnHandleDestroyed(e);
        }
예제 #5
0
        /// <summary>Raises the HandleCreated event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleCreated(EventArgs e)
        {
            context?.Dispose();
            implementation?.WindowInfo?.Dispose();

            // Test the current flags
            flags = GetUsableContextFlags(flags);

            if ((flags & GraphicsContextFlags.AngleD3D9) > 0)
            {
                if (ConfigManager.sFullscreen)
                {
                    ForcedWindowed = false;
                    flags         |= GraphicsContextFlags.AngleFullscreen;
                }
                else
                {
                    ForcedWindowed = true;
                }
            }

            implementation = design_mode ? new DummyGLControl() : new GLControlFactory().CreateGLControl(format, this, flags);
            context        = implementation.CreateContext(major, minor, flags);

            MakeCurrent();

            if (!design_mode)
            {
                ((IGraphicsContextInternal)context).LoadAll();
            }

            // Deferred setting of vsync mode. See VSync property for more information.
            if (initial_vsync_value.HasValue)
            {
                Context.SwapInterval = initial_vsync_value.Value ? 1 : 0;
                initial_vsync_value  = null;
            }

            base.OnHandleCreated(e);

            if (resize_event_suppressed)
            {
                OnResize(EventArgs.Empty);
                resize_event_suppressed = false;
            }
        }
예제 #6
0
        /// <summary>Raises the HandleCreated event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleCreated(EventArgs e)
        {
            if (_dummyContext != null)
            {
                _dummyContext.Dispose();
            }

            if (implementation != null)
            {
                implementation.WindowInfo.Dispose();
            }

            if (Configuration.RunningOnWindows)
            {
                implementation = new WinGLControl(_graphics.Mode, this);
            }
            //else if (Configuration.RunningOnMacOS) return new CarbonGLControl(mode, control);
            //else if (Configuration.RunningOnX11) return new X11GLControl(mode, control);
            else
            {
                throw new PlatformNotSupportedException();
            }

            _dummyContext = implementation.CreateContext(1, 1, GraphicsContextFlags.Default);
            MakeCurrent();

            if (!design_mode)
            {
                ((IGraphicsContextInternal)Context).LoadAll();
            }

            // Deferred setting of vsync mode. See VSync property for more information.
            if (initial_vsync_value.HasValue)
            {
                _graphics.GraphicsContext.SwapInterval = initial_vsync_value.Value ? 1 : 0;
                initial_vsync_value = null;
            }

            base.OnHandleCreated(e);

            if (resize_event_suppressed)
            {
                OnResize(EventArgs.Empty);
                resize_event_suppressed = false;
            }
        }
예제 #7
0
        /// <summary>Raises the HandleDestroyed event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleDestroyed(EventArgs e)
        {
            // Ensure that context is still alive when passing to events
            // => This allows to perform cleanup operations in OnHandleDestroyed handlers
            base.OnHandleDestroyed(e);

            if (context != null)
            {
                context.Dispose();
                context = null;
            }

            if (implementation != null)
            {
                implementation.WindowInfo.Dispose();
                implementation = null;
            }
        }
예제 #8
0
        /// <summary>Raises the HandleDestroyed event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleDestroyed(EventArgs e)
        {
            // Ensure that context is still alive when passing to events
            // => This allows to perform cleanup operations in OnHandleDestroyed handlers
            base.OnHandleDestroyed(e);

            if (_implementation is DummyGLControl)
            {
                // No need to destroy our DummyGLControl
                return;
            }

            if (_context != null)
            {
                _context.Dispose();
                _context = null;
            }

            if (_implementation != null)
            {
                _implementation.WindowInfo.Dispose();
                _implementation = null;
            }
        }
예제 #9
0
        /// <summary>Raises the HandleDestroyed event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleDestroyed(EventArgs e)
        {
            if (context != null)
            {
                context.Dispose();
                context = null;
            }

            if (implementation != null)
            {
                implementation.WindowInfo.Dispose();
                implementation = null;
            }

            base.OnHandleDestroyed(e);
        }
예제 #10
0
        /// <summary>Raises the HandleCreated event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleCreated(EventArgs e)
        {
            if (context != null)
                context.Dispose();
            if (implementation != null)
                implementation.WindowInfo.Dispose();
            if (DesignMode)
                implementation = new DummyGLControl();
            else
                implementation = GLControlFactory.CreateGLControl(format, this);
            context = implementation.CreateContext(major, minor, flags);
            MakeCurrent();
            if (!DesignMode)
                ((IGraphicsContextInternal)Context).LoadAll();
            // Deferred setting of vsync mode. See VSync property for more information.
            if (initial_vsync_value.HasValue)
            {
                Context.VSync = initial_vsync_value.Value;
                initial_vsync_value = null;
            }

            base.OnHandleCreated(e);
            if (resize_event_suppressed)
            {
                OnResize(EventArgs.Empty);
                resize_event_suppressed = false;
            }
        }
예제 #11
0
        internal ILOGLPanel() : base( GraphicDeviceType.OpenGL ) {
#if TRACE 
            Trace.TraceInformation("{0},{1} ILOGLPanel.ctor(mode) start",DateTime.Now, Environment.TickCount); 
            Trace.Indent(); 
#endif

            this.SetStyle(ControlStyles.Opaque, true);
            this.SetStyle(ControlStyles.UserPaint, true);
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            m_format = GraphicsMode.Default;

            if (Configuration.RunningOnWindows)
                m_implementation = new OpenTK.Platform.Windows.WinGLControl(m_format, this);
            else if (Configuration.RunningOnX11)
                m_implementation = new OpenTK.Platform.X11.X11GLControl(m_format, this);
            else if (Configuration.RunningOnOSX)
                throw new PlatformNotSupportedException("Refer to http://www.opentk.com for more information.");

            this.CreateControl();

#if TRACE 
            Trace.Unindent(); 
            Trace.TraceInformation("{0},{1} ILPanel.ctor(mode) end",DateTime.Now, Environment.TickCount); 
#endif
        }
예제 #12
0
        /// <summary>Raises the HandleCreated event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleCreated(EventArgs e)
        {
            if (_dummyContext != null)
                _dummyContext.Dispose();

            if (implementation != null)
                implementation.WindowInfo.Dispose();

            if (Configuration.RunningOnWindows)
                implementation = new WinGLControl(_graphics.Mode, this);
            //else if (Configuration.RunningOnMacOS) return new CarbonGLControl(mode, control);
            //else if (Configuration.RunningOnX11) return new X11GLControl(mode, control);
            else throw new PlatformNotSupportedException();

            _dummyContext = implementation.CreateContext(1, 1, GraphicsContextFlags.Default);
            MakeCurrent();

            if (!design_mode)
                ((IGraphicsContextInternal)Context).LoadAll();

            // Deferred setting of vsync mode. See VSync property for more information.
            if (initial_vsync_value.HasValue)
            {
                _graphics.GraphicsContext.SwapInterval = initial_vsync_value.Value ? 1 : 0;
                initial_vsync_value = null;
            }

            base.OnHandleCreated(e);

            if (resize_event_suppressed)
            {
                OnResize(EventArgs.Empty);
                resize_event_suppressed = false;
            }
        }
예제 #13
0
        /// <summary>Raises the HandleDestroyed event.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnHandleDestroyed(EventArgs e)
        {
            // Ensure that context is still alive when passing to events
            // => This allows to perform cleanup operations in OnHandleDestroyed handlers
            base.OnHandleDestroyed(e);

            if (context != null)
            {
                context.Dispose();
                context = null;
            }

            if (implementation != null)
            {
                implementation.WindowInfo.Dispose();
                implementation = null;
            }

        }
예제 #14
0
        GraphicsContextFlags GetUsableContextFlags(GraphicsContextFlags flags)
        {
            Control          temp_control        = null;
            IGraphicsContext temp_context        = null;
            IGLControl       temp_implementation = null;

            Exception exc = null;

            switch (flags)
            {
            default:
            {
                return(GetUsableContextFlags(GraphicsContextFlags.Default));
            }

            case GraphicsContextFlags.Angle:
            {
                return(GetUsableContextFlags(GraphicsContextFlags.AngleD3D9));
            }

            case GraphicsContextFlags.Default:
            case GraphicsContextFlags.AngleD3D11:
            case GraphicsContextFlags.AngleD3D9:
            {
                try
                {
                    temp_control = new Control();
                    temp_control.CreateControl();

                    if (flags == GraphicsContextFlags.AngleD3D11)
                    {
                        major = 3;
                    }
                    if (flags == GraphicsContextFlags.AngleD3D9)
                    {
                        major = 2;
                    }

                    temp_implementation = design_mode ? new DummyGLControl() : new GLControlFactory().CreateGLControl(format, temp_control, flags);
                    temp_context        = temp_implementation.CreateContext(major, minor, flags);

                    temp_context.MakeCurrent(temp_implementation.WindowInfo);

                    if (!design_mode)
                    {
                        ((IGraphicsContextInternal)temp_context).LoadAll();
                    }

                    // Enforce a minimum version for default renderer for maximum compatibility
                    if (flags == GraphicsContextFlags.Default && new Version(GL.GetString(StringName.Version).Split(' ')[0]) < new Version(major, minor))
                    {
                        throw new Exception("Unsupported version, using ANGLE.");
                    }
                }
                catch (Exception e)
                {
                    exc = e;
                }
            }
            break;
            }

            temp_control?.Dispose();
            temp_context?.Dispose();
            temp_implementation?.WindowInfo?.Dispose();

            if (exc != null)
            {
                switch (flags)
                {
                case GraphicsContextFlags.Default:
                    return(GetUsableContextFlags(GraphicsContextFlags.Angle));

                case GraphicsContextFlags.AngleD3D11:
                    return(GetUsableContextFlags(GraphicsContextFlags.AngleD3D9));

                case GraphicsContextFlags.AngleD3D9:
                    throw new NoGLContextAvailable(exc);
                }
            }

            return(flags);
        }
예제 #15
0
        IGraphicsContext GetContext()
        {
            if (context != null)
            {
                context.Dispose();
            }

            if (implementation == null)
            {
                Log.AppendLine("Attempting to create native OpenGL context.");

                implementation = design_mode ? new DummyGLControl() : new GLControlFactory().CreateGLControl(format, this, GraphicsContextFlags.Default);

                try
                {
                    context = implementation.CreateContext(major, minor, GraphicsContextFlags.Default);
                    MakeCurrent();
                }
                catch (Exception e)
                {
                    Log.AppendLine("Failed to create native OpenGL context.");
                    Log.AppendLine(e.ToString());
                    Log.AppendLine("Reverting to ANGLE.");

                    flags = GraphicsContextFlags.Angle;
                    return(GetContext());
                }

                if (!design_mode)
                {
                    ((IGraphicsContextInternal)Context).LoadAll();

                    Log.AppendLine("Loaded all endpoints.");
                }

                // Check if version < required version
                if (new Version(GL.GetString(StringName.Version).Split(' ')[0]) < new Version(major, minor))
                {
                    Log.AppendLine("Native OpenGL context version is incompatible, reverting to ANGLE.");

                    flags = GraphicsContextFlags.Angle;
                    return(GetContext());
                }

                Log.AppendLine("Successfully created native OpenGL context.");


                if (flags == GraphicsContextFlags.Default)
                {
                    Log.AppendLine("Using native OpenGL context.");

                    // We're using the default OpenGL renderer, exit early
                    return(context);
                }
            }

            // If we reach this point, we need to use Angle
            if (flags == GraphicsContextFlags.Angle)
            {
                try
                {
                    Log.AppendLine("Attempting to create ANGLED3D11 context.");

                    // Try D3D11
                    major = 3;
                    minor = 0;
                    flags = GraphicsContextFlags.AngleD3D11;
                    return(GetContext());
                }
                catch (Exception e)
                {
                    Log.AppendLine("Failed to create ANGLED3D11 context.");
                    Log.AppendLine(e.ToString());
                    Log.AppendLine("Reverting to ANGLED3D9.");

                    try
                    {
                        Log.AppendLine("Attempting to create ANGLED3D9 context.");

                        // Default to D3D9 (this should never fail)
                        major = 2;
                        minor = 0;
                        flags = GraphicsContextFlags.AngleD3D9;
                        return(GetContext());
                    }
                    catch (Exception e2)
                    {
                        Log.AppendLine("Failed to create ANGLED3D9 context. Oops.");
                        Log.AppendLine(e.ToString());

                        return(null);
                    }
                }
            }

            implementation = design_mode ? new DummyGLControl() : new GLControlFactory().CreateGLControl(format, this, flags);

            context = implementation.CreateContext(major, minor, flags);
            MakeCurrent();
            if (!design_mode)
            {
                ((IGraphicsContextInternal)Context).LoadAll();

                Log.AppendLine("Loaded all endpoints.");
            }

            Log.AppendLine($"Using {(flags == GraphicsContextFlags.AngleD3D11 ? "ANGLED3D11" : "ANGLED3D9")} context.");

            return(context);
        }