budnhead/NHEngine/OpenGLWindow.cs

257 lines
6.3 KiB
C#

using System;
using System.Drawing;
using System.Collections.Generic;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK;
using org.niclasundharald.engine;
using org.niclasundharald.engine.graphics;
using org.niclasundharald.engine.graphics.primitives;
namespace nhengine
{
public class OpenGLWindow : GameWindow
{
private Point mouseCapturePosition;
private bool mouseCaptured;
private float arcUpDown,
arcLeftRight;
private Vector3 lookAt;
private float lookDistance;
private Cube cube,
c1, c2, c3;
GLCamera sceneCamera;
GLScene scene;
public OpenGLWindow()
:base(800, 600,
GraphicsMode.Default,
"nhEngine",
GameWindowFlags.Default,
DisplayDevice.Default,
3, 3,
GraphicsContextFlags.ForwardCompatible)
{
VSync = VSyncMode.On;
sceneCamera = new GLCamera();
scene = new GLScene(sceneCamera);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
GL.ClearColor(0.05f, 0.05f, 0.05f, 0.0f);
GL.Enable(EnableCap.DepthTest);
GL.Enable(EnableCap.Normalize);
GL.Enable(EnableCap.Blend);
GL.BlendFunc(BlendingFactorSrc.SrcAlpha,BlendingFactorDest.OneMinusSrcAlpha);
cube = new Cube(new Vector3(0,0,150), 16.0f);
c1 = new Cube(new Vector3(16,0,150), 8.0f);
c2 = new Cube(new Vector3(0,150,150), 8.0f);
c3 = new Cube(new Vector3(175,175,150), 8.0f);
lookAt = new Vector3(0,0,128.0f);
lookDistance = 2048;
arcUpDown = MathHelper.PiOver6;
arcLeftRight = MathHelper.PiOver4;
// sceneCamera.Position = new Vector3(1000,-1000,1000);
// sceneCamera.View = new Vector3(0f,1.0f,0.0f);
sceneCamera.Top = new Vector3(0,0,1);
sceneCamera.setFoV(MathHelper.PiOver4);
setupCamera();
scene.RootObject.addChild( cube );
scene.RootObject.addChild( c1 );
scene.RootObject.addChild( c2 );
scene.RootObject.addChild( c3 );
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);
sceneCamera.setViewport(ClientRectangle.Width, ClientRectangle.Height);
}
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
scene.draw();
SwapBuffers();
Title = string.Format("{0:F}/s {1:F}/s [{2:F}s]", RenderFrequency,UpdateFrequency,UpdatePeriod);
}
protected override void OnUpdateFrame(FrameEventArgs e)
{
base.OnUpdateFrame(e);
Matrix4 m4 = Matrix4.CreateRotationZ(MathHelper.Pi / 90.0f);
cube.Rotation = m4 * cube.Rotation;
c1.Position = (m4.Inverted() * new Vector4(c1.Position)).Xyz;
c2.Rotation = (m4 * c2.Rotation);
c3.Position = (m4 * new Vector4(c3.Position)).Xyz;
Actor.updateAll( (float)UpdatePeriod );
}
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){
rotateLeftRight(((float)delta.X) / 20.0f);
rotateUpDown(((float)delta.Y) / 20.0f);
}
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)
{
lookDistance *= 1.0f - ( e.DeltaPrecise / 16 );
MathHelper.Clamp( lookDistance, 512, 8192 );
setupCamera();
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
}
protected override void OnKeyDown(OpenTK.Input.KeyboardKeyEventArgs e)
{
switch (e.Key){
case OpenTK.Input.Key.Up:
rotateUpDown(-MathHelper.Pi / 180.0f);
break;
case OpenTK.Input.Key.Down:
rotateUpDown(MathHelper.Pi / 180.0f);
break;
case OpenTK.Input.Key.Left:
rotateLeftRight(MathHelper.Pi / 90.0f);
break;
case OpenTK.Input.Key.Right:
rotateLeftRight(-MathHelper.Pi / 90.0f);
break;
case OpenTK.Input.Key.W:
walk(e.Shift ? 50.0f : 5.0f);
break;
case OpenTK.Input.Key.S:
walk(e.Shift ? -50.0f : -5.0f);
break;
case OpenTK.Input.Key.A:
strafe(e.Shift ? -50.0f : -5.0f);
break;
case OpenTK.Input.Key.D:
strafe(e.Shift ? 50.0f : 5.0f);
break;
case OpenTK.Input.Key.Space:
fireBallistic();
break;
}
}
private void fireBallistic(){
Console.WriteLine("Fire Ballistic...");
BallisticActor ba = new BallisticActor(0);
ba.Position = BootStrap.instance().SquaredMap.ground(new Vector2(10,10));
ba.Velocity = new Vector3(1,1,1);// + (Matrix4.CreateRotationZ(arcLeftRight) * Vector4.UnitY).Xyz;
ba.Velocity.Normalize();
ba.Velocity *= 50;
}
public void rotateUpDown(float arc)
{
arcUpDown += arc;
arcUpDown = MathHelper.Clamp(arcUpDown,MathHelper.Pi / 8,MathHelper.PiOver2-0.00001f);
setupCamera();
}
public void rotateLeftRight(float arc)
{
arcLeftRight += arc;
arcLeftRight %= MathHelper.TwoPi;
setupCamera();
}
public void walk(float distance){
lookAt += (new Vector3(sceneCamera.View.Xy)).Normalized() * distance;
setupCamera();
}
public void strafe(float distance){
lookAt += Vector3.Cross(new Vector3(sceneCamera.View.Xy),Vector3.UnitZ).Normalized() * distance;
setupCamera();
}
protected override void OnKeyUp(OpenTK.Input.KeyboardKeyEventArgs e)
{
}
private void setupCamera(){
Vector3 view = (Matrix4.CreateRotationZ(arcLeftRight) * Matrix4.CreateRotationX(arcUpDown) * Vector4.UnitY).Xyz;
view.Normalize();
Vector3 pos = lookAt - (view * lookDistance);
sceneCamera.View = view;
sceneCamera.Position = pos;
}
public GLScene Scene {
get { return this.scene; }
}
}
}