void DrawGL(int renderWidth, int renderHeight)
        {
            ICamera cam;
            //Draw Model
            var     lookAtCam = new LookAtCamera();
            Matrix4 rot       = Matrix4.CreateRotationX(modelViewport.CameraRotation.Y) *
                                Matrix4.CreateRotationY(modelViewport.CameraRotation.X);
            var dir = rot.Transform(Vector3.Forward);
            var to  = modelViewport.CameraOffset + (dir * 10);

            lookAtCam.Update(renderWidth, renderHeight, modelViewport.CameraOffset, to, rot);
            ThnCamera tcam  = null;
            float     znear = 0;
            float     zfar  = 0;

            if (doCockpitCam)
            {
                var vp = new Viewport(0, 0, renderWidth, renderHeight);
                tcam = new ThnCamera(vp);
                tcam.Transform.AspectRatio = renderWidth / (float)renderHeight;
                var tr = cameraPart.GetTransform(Matrix4.Identity);
                tcam.Transform.Orientation = Matrix4.CreateFromQuaternion(tr.ExtractRotation());
                tcam.Transform.Position    = tr.Transform(Vector3.Zero);
                znear = cameraPart.Camera.Znear;
                zfar  = cameraPart.Camera.Zfar;
                tcam.Transform.Znear = 0.001f;
                tcam.Transform.Zfar  = 1000;
                tcam.Transform.FovH  = MathHelper.RadiansToDegrees(cameraPart.Camera.Fovx);
                tcam.frameNo         = fR++;
                tcam.Update();
                cam = tcam;
            }
            else
            {
                cam = lookAtCam;
            }
            _window.DebugRender.StartFrame(cam, rstate);

            drawable.Update(cam, TimeSpan.Zero, TimeSpan.FromSeconds(_window.TotalTime));
            if (viewMode != M_NONE)
            {
                int drawCount = doCockpitCam ? 2 : 1;
                for (int i = 0; i < drawCount; i++)
                {
                    buffer.StartFrame(rstate);
                    if (i == 1)
                    {
                        rstate.ClearDepth();
                        tcam.Transform.Zfar  = zfar;
                        tcam.Transform.Znear = znear;
                        tcam.frameNo         = fR++;
                        tcam.Update();
                    }
                    if (drawable is CmpFile)
                    {
                        DrawCmp(cam, false);
                    }
                    else
                    {
                        DrawSimple(cam, false);
                    }
                    buffer.DrawOpaque(rstate);
                    rstate.DepthWrite = false;
                    buffer.DrawTransparent(rstate);
                    rstate.DepthWrite = true;
                }
            }
            if (doWireframe)
            {
                buffer.StartFrame(rstate);
                GL.PolygonOffset(1, 1);
                rstate.Wireframe = true;
                if (drawable is CmpFile)
                {
                    DrawCmp(cam, true);
                }
                else
                {
                    DrawSimple(cam, true);
                }
                GL.PolygonOffset(0, 0);
                buffer.DrawOpaque(rstate);
                rstate.Wireframe = false;
            }
            if (drawVMeshWire)
            {
                if (drawable is CmpFile)
                {
                    WireCmp();
                }
                else if (drawable is ModelFile)
                {
                    Wire3db();
                }
            }
            //Draw VMeshWire (if used)
            _window.DebugRender.Render();
            //Draw Sur
            if (surs != null)
            {
                RenderSurs(cam);
            }
            //Draw hardpoints
            DrawHardpoints(cam);
            // if (drawSkeleton) DrawSkeleton(cam);
        }
        void DrawGL(int renderWidth, int renderHeight, bool viewport)
        {
            if (_window.Config.BackgroundGradient && viewport && doBackground)
            {
                _window.Renderer2D.Start(renderWidth, renderHeight);
                _window.Renderer2D.DrawVerticalGradient(new Rectangle(0, 0, renderWidth, renderHeight), _window.Config.Background, _window.Config.Background2);
                _window.Renderer2D.Finish();
            }
            rstate.DepthEnabled = true;
            rstate.Cull         = true;
            ICamera cam;
            //Draw Model
            var lookAtCam = new LookAtCamera();
            var rot       = Matrix4x4.CreateRotationX(modelViewport.CameraRotation.Y) *
                            Matrix4x4.CreateRotationY(modelViewport.CameraRotation.X);
            var dir = Vector3.Transform(-Vector3.UnitZ, rot);
            var to  = modelViewport.CameraOffset + (dir * 10);

            if (modelViewport.Mode == CameraModes.Arcball)
            {
                to = Vector3.Zero;
            }
            lookAtCam.Update(renderWidth, renderHeight, modelViewport.CameraOffset, to, rot);
            ThnCamera tcam  = null;
            float     znear = 0;
            float     zfar  = 0;

            if (modelViewport.Mode == CameraModes.Cockpit)
            {
                var vp = new Viewport(0, 0, renderWidth, renderHeight);
                tcam = new ThnCamera(vp);
                tcam.Transform.AspectRatio = renderWidth / (float)renderHeight;
                var tr = Matrix4x4.Identity;
                if (!string.IsNullOrEmpty(cameraPart.Construct?.ParentName))
                {
                    tr = cameraPart.Construct.LocalTransform *
                         vmsModel.Parts[cameraPart.Construct.ParentName].LocalTransform;
                }
                else if (cameraPart.Construct != null)
                {
                    tr = cameraPart.Construct.LocalTransform;
                }
                tcam.Transform.Orientation = Matrix4x4.CreateFromQuaternion(tr.ExtractRotation());
                tcam.Transform.Position    = Vector3.Transform(Vector3.Zero, tr);
                znear = cameraPart.Camera.Znear;
                zfar  = cameraPart.Camera.Zfar;
                tcam.Transform.Znear = 0.001f;
                tcam.Transform.Zfar  = 1000;
                tcam.Transform.FovH  = MathHelper.RadiansToDegrees(cameraPart.Camera.Fovx);
                tcam.frameNo         = fR++;
                tcam.Update();
                cam = tcam;
            }
            else
            {
                cam = lookAtCam;
            }
            if (showGrid && viewport &&
                !(drawable is SphFile) &&
                modelViewport.Mode != CameraModes.Starsphere)
            {
                GridRender.Draw(rstate, cam, _window.Config.GridColor);
            }
            _window.DebugRender.StartFrame(cam, rstate);
            if (drawable is DF.DfmFile dfm)
            {
                skel.UploadBoneData(buffer.BonesBuffer);
                dfm.SetSkinning(skel.BodySkinning);
                dfm.Update(cam, TimeSpan.Zero, TimeSpan.FromSeconds(_window.TotalTime));
            }
            if (vmsModel != null)
            {
                vmsModel.UpdateTransform();
                vmsModel.Update(cam, TimeSpan.FromSeconds(_window.TotalTime), _window.Resources);
            }
            if (viewMode != M_NONE)
            {
                int drawCount = (modelViewport.Mode == CameraModes.Cockpit) ? 2 : 1;
                for (int i = 0; i < drawCount; i++)
                {
                    buffer.StartFrame(rstate);
                    if (i == 1)
                    {
                        rstate.ClearDepth();
                        tcam.Transform.Zfar  = zfar;
                        tcam.Transform.Znear = znear;
                        tcam.frameNo         = fR++;
                        tcam.Update();
                    }
                    DrawSimple(cam, false);
                    buffer.DrawOpaque(rstate);
                    rstate.DepthWrite = false;
                    buffer.DrawTransparent(rstate);
                    rstate.DepthWrite = true;
                }
            }
            if (doWireframe)
            {
                buffer.StartFrame(rstate);
                GL.PolygonOffset(1, 1);
                rstate.Wireframe = true;
                DrawSimple(cam, true);
                GL.PolygonOffset(0, 0);
                buffer.DrawOpaque(rstate);
                rstate.Wireframe = false;
            }
            if (drawVMeshWire)
            {
                DrawWires();
            }
            //Draw VMeshWire (if used)
            _window.DebugRender.Render();
            //Draw Sur
            if (surs != null)
            {
                RenderSurs(cam);
            }
            //Draw hardpoints
            DrawHardpoints(cam);
            if (drawSkeleton)
            {
                DrawSkeleton(cam);
            }
        }