Example #1
0
    protected override void OnMainWindowLoad(object sender, EventArgs args)
    {
        base.RenderDevice.MouseMoveWithLeftBtnDown += (s, e) =>
                                                      FirstPoint += new DVector2(e.MovDeltaX, e.MovDeltaY);

        RenderDevice.HotkeyRegister(Keys.PageUp, (s, e) => ++ Length);
        RenderDevice.HotkeyRegister(Keys.PageDown, (s, e) => -- Length);
    }
Example #2
0
    protected override void OnMainWindowLoad(object sender, EventArgs args)
    {
        // Пример изменения внешниго вида элементов управления (необязательный код)
        base.RenderDevice.BufferBackCol = 0xB0;
        base.ValueStorage.Font          = new Font("Arial", 12f);
        //base.ValueStorage.ForeColor = Color.Firebrick;
        base.ValueStorage.RowHeight = 30;
        //base.ValueStorage.BackColor = Color.BlanchedAlmond;
        //base.MainWindow.BackColor = Color.DarkGoldenrod;
        base.ValueStorage.RightColWidth = 50;
        base.VSPanelWidth = 350;
        //base.VSPanelLeft = true;
        base.MainWindow.Size = new Size(960, 640);

        // Реализация управления мышкой с зажатыми левой и правой кнопкой мыши
        base.RenderDevice.MouseMoveWithLeftBtnDown += (s, e) =>
        {
            ShiftX += e.MovDeltaX;
            ShiftY -= e.MovDeltaY;
        };
        base.RenderDevice.MouseMoveWithRightBtnDown += (s, e) =>
        {
            //Rotation.X -= e.MovDeltaY;
            //Rotation.Y += e.MovDeltaX;
            Rotation = new DVector3(Rotation.X - e.MovDeltaY, Rotation.Y + e.MovDeltaX, Rotation.Z);
        };

        // Реализация управления клавиатурой
        RenderDevice.HotkeyRegister(Keys.Up, (s, e) => ++ ShiftY);
        RenderDevice.HotkeyRegister(Keys.Down, (s, e) => -- ShiftY);
        RenderDevice.HotkeyRegister(Keys.Left, (s, e) => -- ShiftX);
        RenderDevice.HotkeyRegister(Keys.Right, (s, e) => ++ ShiftX);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Up, (s, e) => ShiftY    += 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Down, (s, e) => ShiftY  -= 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Left, (s, e) => ShiftX  -= 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Right, (s, e) => ShiftX += 10);

        InitialWidth  = base.RenderDevice.Width;
        InitialHeight = base.RenderDevice.Height;

        ComputeObject();
        //Cube();
        //Tetrahedron();
        //Prism();
    }
Example #3
0
    // ---------------------------------------------------------------------------------
    // ---------------------------------------------------------------------------------
    // --- Часть 2: Инициализация данных, управления и поведения приложения
    // ---------------------------------------------------------------------------------


    // Если нужна какая-то инициализация данных при запуске приложения, можно реализовать ее
    // в перегрузке данного события, вызываемого единожды перед отображением окна приложения
    protected override void OnMainWindowLoad(object sender, EventArgs args)
    {
        // Созданное приложение имеет два основных элемента управления:
        // base.RenderDevice - левая часть экрана для рисования
        // base.ValueStorage - правая панель для отображения и редактирования свойств

        // Пример изменения внешниго вида элементов управления (необязательный код)
        base.RenderDevice.BufferBackCol = 0xB0;
        base.ValueStorage.Font          = new Font("Arial", 12f);
        base.ValueStorage.ForeColor     = Color.Firebrick;
        base.ValueStorage.RowHeight     = 30;
        base.ValueStorage.BackColor     = Color.BlanchedAlmond;
        base.MainWindow.BackColor       = Color.DarkGoldenrod;
        base.ValueStorage.RightColWidth = 50;
        base.VSPanelWidth    = 300;
        base.VSPanelLeft     = true;
        base.MainWindow.Size = new Size(960, 640);


        // Реализация управления мышкой с зажатыми левой и правой кнопкой мыши
        base.RenderDevice.MouseMoveWithRightBtnDown += (s, e) => {
            ShiftX += e.MovDeltaX;
            ShiftY -= e.MovDeltaY;
        };
        base.RenderDevice.MouseMoveWithLeftBtnDown += (s, e) => {
            ShiftX += 10 * e.MovDeltaX;
            ShiftY -= 10 * e.MovDeltaY;
        };

        // Реализация управления клавиатурой
        RenderDevice.HotkeyRegister(Keys.Up, (s, e) => ++ ShiftY);
        RenderDevice.HotkeyRegister(Keys.Down, (s, e) => -- ShiftY);
        RenderDevice.HotkeyRegister(Keys.Left, (s, e) => -- ShiftX);
        RenderDevice.HotkeyRegister(Keys.Right, (s, e) => ++ ShiftX);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Up, (s, e) => ShiftY    += 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Down, (s, e) => ShiftY  -= 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Left, (s, e) => ShiftX  -= 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Right, (s, e) => ShiftX += 10);

        // ... расчет каких-то параметров или инициализация ещё чего-то, если нужно
    }
Example #4
0
    // ---------------------------------------------------------------------------------
    // ---------------------------------------------------------------------------------
    // --- Часть 2: Инициализация данных, управления и поведения приложения
    // ---------------------------------------------------------------------------------


    // Если нужна какая-то инициализация данных при запуске приложения, можно реализовать ее
    // в перегрузке данного события, вызываемого единожды перед отображением окна приложения
    protected override void OnMainWindowLoad(object sender, EventArgs args)
    {
        // Созданное приложение имеет два основных элемента управления:
        // base.RenderDevice - левая часть экрана для рисования
        // base.ValueStorage - правая панель для отображения и редактирования свойств

        // Пример изменения внешниго вида элементов управления (необязательный код)
        base.RenderDevice.BufferBackCol = 0xB0;
        base.ValueStorage.Font          = new Font("Arial", 12f);
        base.ValueStorage.ForeColor     = Color.Firebrick;
        base.ValueStorage.RowHeight     = 30;
        base.ValueStorage.BackColor     = Color.BlanchedAlmond;
        base.MainWindow.BackColor       = Color.DarkGoldenrod;
        base.ValueStorage.RightColWidth = 50;
        base.VSPanelWidth    = 300;
        base.VSPanelLeft     = true;
        base.MainWindow.Size = new Size(960, 640);

        // Реализация управления мышкой с зажатыми левой и правой кнопкой мыши
        base.RenderDevice.MouseMoveWithLeftBtnDown += (s, e) => {
            ShiftX += e.MovDeltaX;
            ShiftY -= e.MovDeltaY;
        };

        base.RenderDevice.MouseMoveWithRightBtnDown += (s, e) => {
            double centerX = Width / 2 + Offset.X + ShiftX;
            double centerY = Height / 2 - Offset.Y - ShiftY;

            double dx = e.MovDeltaX;
            double dy = e.MovDeltaY;

            double startX = e.X - dx;
            double startY = e.Y - dy;

            double curX = e.X;
            double curY = e.Y;

            double centerStartVecX = startX - centerX;
            double centerStartVecY = startY - centerY;

            double centerCurVecX = curX - centerX;
            double centerCurVecY = curY - centerY;

            // invert Oy axis
            centerCurVecY   = -centerCurVecY;
            centerStartVecY = -centerStartVecY;
            dy = -dy;

            double centerStartVecMod = Math.Sqrt(centerStartVecX * centerStartVecX + centerStartVecY * centerStartVecY);
            double centerCurVecMod   = Math.Sqrt(centerCurVecX * centerCurVecX + centerCurVecY * centerCurVecY);

            double denum = centerStartVecMod * centerCurVecMod;
            double cos;

            if (denum < Double.Epsilon)
            {
                cos = 1.0;
                Console.WriteLine("denum ~= 0");
            }
            else
            {
                cos = (centerStartVecX * centerCurVecX + centerStartVecY * centerCurVecY) / denum;
            }

            if (cos > 1.0)
            {
                cos = 1.0;
            }

            if (cos < -1.0)
            {
                cos = -1.0;
            }

            double deltaAngle = Math.Acos(cos) * 180.0 / Math.PI;

            double ResultAngle = deltaAngle + RotationAngle;

            if (centerStartVecY * dx + (-centerStartVecX) * dy < 0) // dot product of perpendicular center-start vector and delta vector
            {
                ResultAngle = RotationAngle - deltaAngle;
            }
            else
            {
                ResultAngle = RotationAngle + deltaAngle;
            }

            if (ResultAngle > 360.0)
            {
                ResultAngle -= 360.0;
            }

            if (ResultAngle < 0.0)
            {
                ResultAngle += 360.0;
            }

            RotationAngle = ResultAngle;
        };

        // Реализация управления клавиатурой
        RenderDevice.HotkeyRegister(Keys.Up, (s, e) => ++ ShiftY);
        RenderDevice.HotkeyRegister(Keys.Down, (s, e) => -- ShiftY);
        RenderDevice.HotkeyRegister(Keys.Left, (s, e) => -- ShiftX);
        RenderDevice.HotkeyRegister(Keys.Right, (s, e) => ++ ShiftX);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Up, (s, e) => ShiftY    += 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Down, (s, e) => ShiftY  -= 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Left, (s, e) => ShiftX  -= 10);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Right, (s, e) => ShiftX += 10);

        InitialWidth  = base.RenderDevice.Width;
        InitialHeight = base.RenderDevice.Height;

        PrevApproxLevel = ApproxLevel;
        PrevAmplitude   = Amplitude;

        // ... расчет каких-то параметров или инициализация ещё чего-то, если нужно
    }
Example #5
0
    protected override void OnMainWindowLoad(object sender, EventArgs args)
    {
        base.VSPanelWidth = 260;
        base.ValueStorage.RightColWidth = 60;
        base.RenderDevice.VSync         = 1;

        #region Обработчики событий мыши и клавиатуры -------------------------------------------------------
        RenderDevice.MouseMoveWithLeftBtnDown  += (s, e) => { };
        RenderDevice.MouseMoveWithRightBtnDown += (s, e) => { };
        RenderDevice.MouseLeftBtnDown          += (s, e) => {
            DVector2 norm = NormalizeCoords(e.Location.X, e.Location.Y);

            double X = (norm.X - ShiftX) * Scale;
            double Y = (norm.Y - ShiftY) * Scale;

            text = $"{X}  {Y}";
            lock (locker)
            {
                vertices.Add(new Vertex2(X, Y));
            }
        };
        RenderDevice.MouseLeftBtnUp    += (s, e) => { };
        RenderDevice.MouseRightBtnDown += (s, e) => {
            DVector2 norm = NormalizeCoords(e.Location.X, e.Location.Y);

            double X = (norm.X - ShiftX) * Scale;
            double Y = (norm.Y - ShiftY) * Scale;

            foreach (Vertex2 v in vertices)
            {
                double dx = v.Point.X - X;
                double dy = v.Point.Y - Y;

                double r = Math.Sqrt(dx * dx + dy * dy);

                double radius = NormalizeDistance(VertexSize) * Scale;

                if (r < radius)
                {
                    ActiveVertex = v;
                    return;
                }
            }
        };

        RenderDevice.MouseRightBtnUp += (s, e) => {
            ActiveVertex = null;
            Pos          = new DVector2(0.0, 0.0);
        };
        RenderDevice.MouseMove += (s, e) => {
            MousePosition = new DVector2(e.Location.X + e.MovDeltaX, e.Location.Y + e.MovDeltaY);

            if (ActiveVertex != null)
            {
                double dx = NormalizeDistance(e.MovDeltaX) * Scale;
                double dy = NormalizeDistance(e.MovDeltaY) * Scale;

                if (e.MovDeltaX < 0)
                {
                    dx = -dx;
                }
                if (e.MovDeltaY > 0)
                {
                    dy = -dy;
                }

                double newX = ActiveVertex.Point.X + dx;
                double newY = ActiveVertex.Point.Y + dy;
                ActiveVertex.Point = new DVector2(newX, newY);

                Pos = ActiveVertex.Point;
            }
        };

        // Реализация управления клавиатурой
        RenderDevice.HotkeyRegister(Keys.Up, (s, e) => ShiftY                  += 0.05);
        RenderDevice.HotkeyRegister(Keys.Down, (s, e) => ShiftY                -= 0.05);
        RenderDevice.HotkeyRegister(Keys.Left, (s, e) => ShiftX                -= 0.05);
        RenderDevice.HotkeyRegister(Keys.Right, (s, e) => ShiftX               += 0.05);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Up, (s, e) => ShiftY    += 0.1);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Down, (s, e) => ShiftY  -= 0.1);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Left, (s, e) => ShiftX  -= 0.1);
        RenderDevice.HotkeyRegister(KeyMod.Shift, Keys.Right, (s, e) => ShiftX += 0.1);

        RenderDevice.HotkeyRegister(Keys.C, (s, e) => {
            DVector2 vec = NormalizeCoords(MousePosition.X, MousePosition.Y);

            ShiftX = -vec.X + ShiftX;
            ShiftY = -vec.Y + ShiftY;
        });


        RenderDevice.MouseWheel += (s, e) => {
            float DeltaScale = -e.Delta / 10000.0f;
            Scale += DeltaScale;
        };
        RenderDevice.MouseMoveWithMiddleBtnDown += (s, e) => {
            double dx = NormalizeDistance(e.MovDeltaX);
            double dy = NormalizeDistance(e.MovDeltaY);

            if (e.MovDeltaX < 0)
            {
                dx = -dx;
            }
            if (e.MovDeltaY > 0)
            {
                dy = -dy;
            }

            ShiftX += dx;
            ShiftY += dy;
        };

        #endregion

        spline = new CatmullRomSpline(vertices, false, 1.0 / ApproxLevel);

        #region  Инициализация OGL и параметров рендера -----------------------------------------------------
        RenderDevice.AddScheduleTask((gl, s) =>
        {
            gl.FrontFace(OpenGL.GL_CCW);
            gl.Enable(OpenGL.GL_CULL_FACE);
            gl.CullFace(OpenGL.GL_BACK);

            gl.ClearColor(0, 0, 0, 0);

            gl.Enable(OpenGL.GL_DEPTH_TEST);
            gl.DepthFunc(OpenGL.GL_LEQUAL);
            gl.ClearDepth(1.0f);    // 0 - ближе, 1 - далеко
            gl.ClearStencil(0);
        });
        #endregion

        #region Обновление матрицы проекции при изменении размеров окна и запуске приложения ----------------
        RenderDevice.Resized += (s, e) =>
        {
            var gl = e.gl;

            UpdateProjectionMatrix(gl);
        };
        #endregion
    }