using Yw.Untity;
namespace Yw.WinFrmUI.HydroL3d
{
public partial class NetworkPanel : DevExpress.XtraEditors.XtraUserControl
{
public NetworkPanel()
{
InitializeComponent();
this.openGLControl1.MouseWheel += openGLControl1_MouseWheel;
this.propertyGridControl1.CellValueChanged += PropertyGridControl1_CellValueChanged;
}
private Network _network = null;//管网
private NetworkParas _paras = null;//参数
private float _zoom = 1f;//缩放
private float _rotationX = 0.0f;//x旋转角度
private float _rotationY = 0.0f;//y旋转角度
private float _viewPortX = 0f;//
private float _viewPortY = 0f;//
///
/// 是否初始化
///
public bool Initialized => _network != null;
///
/// 初始化
///
public virtual void Initial(Network network)
{
_network = network;
_paras = _network.GetParas();
InitialParas();
this.propertyGridControl1.SelectedObject = _paras;
}
//初始化参数
private void InitialParas()
{
_zoom = _paras.Scale.X;
_rotationX = _paras.Rotation.X;
_rotationY = _paras.Rotation.Y;
_viewPortX = 0f;
_viewPortY = 0f;
}
private void PropertyGridControl1_CellValueChanged(object sender, DevExpress.XtraVerticalGrid.Events.CellValueChangedEventArgs e)
{
InitialParas();
this.openGLControl1.Refresh();
}
//OpenGL 初始化
private void openGLControl1_OpenGLInitialized(object sender, EventArgs e)
{
OpenGL gl = openGLControl1.OpenGL;
gl.ClearColor(214 / 255f, 224 / 255f, 235 / 255f, 0);
}
//OpenGL 绘制
private void openGLControl1_OpenGLDraw(object sender, RenderEventArgs args)
{
if (!Initialized)
{
return;
}
OpenGL gl = openGLControl1.OpenGL;
//启用深度测试
gl.Enable(OpenGL.GL_DEPTH_TEST);
//清除深度缓存
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
// 设置视口
gl.Viewport((int)_viewPortX, (int)_viewPortY, this.openGLControl1.Width, this.openGLControl1.Height);
// 设置当前矩阵模式,对投影矩阵应用随后的矩阵操作
gl.MatrixMode(OpenGL.GL_PROJECTION);
// 重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
gl.LoadIdentity();
// 创建透视投影变换
gl.Perspective(_paras.Perspective.Fovy, _paras.Perspective.Aspect, _paras.Perspective.Near, _paras.Perspective.Far);
//gl.LoadIdentity();
//gl.Ortho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
gl.LookAt(_paras.LookAt.Eye.X, _paras.LookAt.Eye.Y, _paras.LookAt.Eye.Z,
_paras.LookAt.Center.X, _paras.LookAt.Center.Y, _paras.LookAt.Center.Z,
_paras.LookAt.Up.X, _paras.LookAt.Up.Y, _paras.LookAt.Up.Z);
// 设置当前矩阵为模型视图矩阵
gl.MatrixMode(OpenGL.GL_MODELVIEW);
//重置当前指定的矩阵为单位矩阵,将当前的用户坐标系的原点移到了屏幕中心
gl.LoadIdentity();
//平移
gl.Translate(_paras.Translation.X, _paras.Translation.Y, _paras.Translation.Z);
//将z轴向上
//gl.Rotate(90f, 1f, 0f, 0f);
//旋转
gl.Rotate(_rotationX, 1, 0, 0);
gl.Rotate(_rotationY, 0, 1, 0);
//缩放
gl.Scale(_zoom, _zoom, _zoom);
_network.Draw(gl);
//float[] minCorner = { _paras.BoundingBox.Min.X, _paras.BoundingBox.Min.Y, _paras.BoundingBox.Min.Z };
//float[] maxCorner = { _paras.BoundingBox.Max.X, _paras.BoundingBox.Max.Y, _paras.BoundingBox.Max.Z };
//gl.Begin(OpenGL.GL_POINT);
//gl.Vertex(minCorner[0], minCorner[1], minCorner[2]);
//gl.End();
//gl.Begin(OpenGL.GL_POINT);
//gl.Vertex(maxCorner[0], maxCorner[1], maxCorner[2]);
//gl.End();
//gl.Begin(OpenGL.GL_LINE_LOOP);
//// 绘制底面
//gl.Vertex(minCorner[0], minCorner[1], minCorner[2]);
//gl.Vertex(maxCorner[0], minCorner[1], minCorner[2]);
//gl.Vertex(maxCorner[0], maxCorner[1], minCorner[2]);
//gl.Vertex(minCorner[0], maxCorner[1], minCorner[2]);
//// 绘制顶面
//gl.Vertex(minCorner[0], minCorner[1], maxCorner[2]);
//gl.Vertex(maxCorner[0], minCorner[1], maxCorner[2]);
//gl.Vertex(maxCorner[0], maxCorner[1], maxCorner[2]);
//gl.Vertex(minCorner[0], maxCorner[1], maxCorner[2]);
//// 连接底面和顶面的边
//gl.Vertex(minCorner[0], minCorner[1], minCorner[2]);
//gl.Vertex(minCorner[0], minCorner[1], maxCorner[2]);
//gl.Vertex(maxCorner[0], minCorner[1], minCorner[2]);
//gl.Vertex(maxCorner[0], minCorner[1], maxCorner[2]);
//gl.Vertex(maxCorner[0], maxCorner[1], minCorner[2]);
//gl.Vertex(maxCorner[0], maxCorner[1], maxCorner[2]);
//gl.Vertex(minCorner[0], maxCorner[1], minCorner[2]);
//gl.Vertex(minCorner[0], maxCorner[1], maxCorner[2]);
//gl.End();
gl.Flush(); //强制刷新
}
//Resize
private void openGLControl1_Resized(object sender, EventArgs e)
{
if (!Initialized)
{
return;
}
_paras.Perspective.Aspect = (float)this.openGLControl1.Width / (float)this.openGLControl1.Height;
_viewPortX = 0f;
_viewPortY = 0f;
}
#region 鼠标左键按下旋转
///
/// 当鼠标左键按下时允许旋转
///
[Browsable(true)]
[Description("当鼠标左键按下时允许旋转")]
[DefaultValue(true)]
public bool AllowRotateWhenMouseLeftDown
{
get => _allowRotateWhenMouseLeftDown;
set => _allowRotateWhenMouseLeftDown = value;
}
private bool _allowRotateWhenMouseLeftDown = true;
protected bool _hasMouseLeftDown = false;//鼠标左键是否按下
protected Point _mouseLeftDownRotatePoint;//鼠标左键按下旋转点
///
/// 判断鼠标左键是否按下
///
protected virtual bool HasMouseLeftDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_hasMouseLeftDown = true;
_mouseLeftDownRotatePoint = e.Location;
return true;
}
return false;
}
///
/// 鼠标左键按下旋转
///
protected virtual bool MouseLeftDownRotate(MouseEventArgs e)
{
if (_hasMouseLeftDown)
{
if (this.AllowRotateWhenMouseLeftDown)
{
if (this.Initialized)
{
int deltaX = e.X - _mouseLeftDownRotatePoint.X;
int deltaY = e.Y - _mouseLeftDownRotatePoint.Y;
_rotationX += deltaY * 0.1f;
_rotationY += deltaX * 0.1f;
_mouseLeftDownRotatePoint = e.Location;
return true;
}
}
}
return false;
}
///
/// 判断鼠标左键是否弹起
///
protected virtual bool HasMouseLeftUp(MouseEventArgs e)
{
if (_hasMouseLeftDown)
{
_hasMouseLeftDown = false;
return true;
}
return false;
}
#endregion
#region 鼠标右键按下拖动
///
/// 当鼠标右键按下时允许拖动
///
[Browsable(true)]
[Description("当鼠标右键按下时允许拖动")]
[DefaultValue(true)]
public bool AllowMoveWhenMouseRightDown
{
get => _allowMoveWhenMouseRightDown;
set => _allowMoveWhenMouseRightDown = value;
}
private bool _allowMoveWhenMouseRightDown = true;
protected bool _hasMouseRightDown = false;//鼠标右键是否按下
protected Point _mouseRightDownMovePoint;//鼠标右键按下移动点
///
/// 判断鼠标右键是否按下
///
protected virtual bool HasMouseRightDown(MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
_hasMouseRightDown = true;
_mouseRightDownMovePoint = e.Location;
return true;
}
return false;
}
///
/// 鼠标右键按下移动
///
protected virtual bool MouseRightDownMove(MouseEventArgs e)
{
if (_hasMouseRightDown)
{
if (this.AllowMoveWhenMouseRightDown)
{
if (this.Initialized)
{
int deltaX = e.X - _mouseRightDownMovePoint.X;
int deltaY = e.Y - _mouseRightDownMovePoint.Y;
_viewPortX += deltaX;
_viewPortY -= deltaY;
_mouseRightDownMovePoint = e.Location;
return true;
}
}
}
return false;
}
///
/// 判断鼠标左键是否弹起
///
protected virtual bool HasMouseRightUp(MouseEventArgs e)
{
if (_hasMouseRightDown)
{
_hasMouseRightDown = false;
return true;
}
return false;
}
#endregion
#region 鼠标事件
private void openGLControl1_MouseDown(object sender, MouseEventArgs e)
{
HasMouseLeftDown(e);
HasMouseRightDown(e);
}
private void openGLControl1_MouseMove(object sender, MouseEventArgs e)
{
var list = this.openGLControl1.OpenGL.UnProject(e.X, e.Y, 0);
this.labelControl1.Text = DoubleListHelper.ToString(list);
var hasMouseLeftDownRotate = MouseLeftDownRotate(e);
var hasMouseRightDownMove = MouseRightDownMove(e);
if (hasMouseLeftDownRotate || hasMouseRightDownMove)
{
this.openGLControl1.Invalidate();
}
}
private void openGLControl1_MouseUp(object sender, MouseEventArgs e)
{
var hasMouseLeftUp = HasMouseLeftUp(e);
var hasMouseRightUp = HasMouseRightUp(e);
if (hasMouseLeftUp || hasMouseRightUp)
{
this.openGLControl1.Invalidate();
}
}
private void openGLControl1_MouseHover(object sender, EventArgs e)
{
if (!Initialized)
{
return;
}
var pt = this.openGLControl1.PointToClient(MousePosition);
var list = this.openGLControl1.OpenGL.UnProject(pt.X, this.openGLControl1.Height - pt.Y, 0);
var wpt = new Point3d(list[0], list[1], list[2]);
var list1 = _network.Hover(wpt);
if (list1 != null && list1.Count > 0)
{
}
}
private void openGLControl1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (!Initialized)
{
return;
}
if (e.Button == MouseButtons.Left)
{
InitialParas();
this.openGLControl1.Invalidate();
}
}
private void openGLControl1_MouseClick(object sender, MouseEventArgs e)
{
}
private void openGLControl1_MouseWheel(object sender, MouseEventArgs e)
{
if (e.Delta > 0)
{
_zoom *= 1.1f;
}
else
{
_zoom /= 1.1f;
}
this.openGLControl1.Refresh();
}
#endregion
}
}