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); }
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(); }
// --------------------------------------------------------------------------------- // --------------------------------------------------------------------------------- // --- Часть 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); // ... расчет каких-то параметров или инициализация ещё чего-то, если нужно }
// --------------------------------------------------------------------------------- // --------------------------------------------------------------------------------- // --- Часть 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; // ... расчет каких-то параметров или инициализация ещё чего-то, если нужно }
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 }