budnhead/OpenGLWindow.cs

125 lines
2.6 KiB
C#

using System;
using System.Drawing;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK;
namespace nhengine
{
public class OpenGLWindow : GameWindow
{
private GLCamera camera;
private Point mouseCapturePosition;
private bool mouseCaptured;
public OpenGLWindow()
:base(800, 600,
GraphicsMode.Default,
"nhEngine",
GameWindowFlags.Default,
DisplayDevice.Default,
3, 3,
GraphicsContextFlags.ForwardCompatible)
{
VSync = VSyncMode.On;
camera = new GLCamera();
camera.ArcX = -MathHelper.PiOver3;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
GL.ClearColor(0.1f, 0.2f, 0.5f, 0.0f);
GL.Enable(EnableCap.DepthTest);
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
camera.setViewport(ClientRectangle.Width, ClientRectangle.Height);
}
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
BootStrap boot = BootStrap.instance();
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
//camera.ArcX = -MathHelper.PiOver2 * 0.8f;
//camera.ArcZ += MathHelper.Pi / 180;
camera.setup();
boot.SquaredMap.paint(camera);
SwapBuffers();
}
private void captureMouse(){
mouseCapturePosition = new Point(Mouse.X, Mouse.Y);
mouseCaptured = true;
CursorVisible = false;
}
private void releaseMouse(){
mouseCaptured = false;
CursorVisible = true;
}
protected override void OnMouseMove(OpenTK.Input.MouseMoveEventArgs e)
{
if (mouseCaptured){
Point delta = new Point(e.X - mouseCapturePosition.X, e.Y - mouseCapturePosition.Y);
onMouseCapturedMove(delta);
mouseCapturePosition = e.Position;
}
}
protected virtual void onMouseCapturedMove(Point delta){
camera.ArcZ += ((float)delta.X) / 100.0f;
camera.ArcX += ((float)delta.Y) / 100.0f;
if (camera.ArcX > 0.0f){
camera.ArcX = 0.0f;
}
if (camera.ArcX < -MathHelper.PiOver2){
camera.ArcX = -MathHelper.PiOver2;
}
}
protected override void OnMouseDown(OpenTK.Input.MouseButtonEventArgs e)
{
switch (e.Button){
case OpenTK.Input.MouseButton.Left:
break;
case OpenTK.Input.MouseButton.Right:
captureMouse();
break;
}
}
protected override void OnMouseUp(OpenTK.Input.MouseButtonEventArgs e)
{
releaseMouse();
}
protected override void OnMouseWheel(OpenTK.Input.MouseWheelEventArgs e)
{
camera.Distance += e.DeltaPrecise * 16.0f;
}
}
}