diff --git a/bnhdemo/BootStrap.cs b/bnhdemo/BootStrap.cs index 4907e7c..a36e3ad 100644 --- a/bnhdemo/BootStrap.cs +++ b/bnhdemo/BootStrap.cs @@ -15,6 +15,7 @@ using ImageSharp.Processing; using org.budnhead.graphics; using org.budnhead.audio; using org.budnhead.core; +using org.budnhead.tools; namespace bnhdemo { @@ -34,6 +35,7 @@ namespace bnhdemo Engine.SceneWindows[0].Scene = new Scene(); primaryCamera = new GLCamera(); + primaryCamera.CameraController.SceneWindow = Engine.SceneWindows[0]; Engine.SceneWindows[0].PrimaryViewport.SceneOrientation = primaryCamera; primaryCamera.Position = new Vector3(600,550,200); @@ -123,7 +125,7 @@ namespace bnhdemo trackingCamera.Position = trackedActor.Position.BufferedValue - (nv * 5) + (Vector3.UnitZ * 2);; trackingCamera.View = trackedActor.Velocity.BufferedValue; - primaryCamera.lookAt(trackedActor.Position.BufferedValue); + //primaryCamera.lookAt(trackedActor.Position.BufferedValue); if ((trackedActor.Velocity.BufferedValue.Z > 0) && (trackedActor.Velocity.Value.Z < 0)){ Engine.UpdatesPaused = true; @@ -133,7 +135,7 @@ namespace bnhdemo ballisticViewport.Visible = false; } } - }; + }; Engine.run(); } diff --git a/org.budnhead/graphics/GLCamera.cs b/org.budnhead/graphics/GLCamera.cs index 93e614a..5c0254e 100644 --- a/org.budnhead/graphics/GLCamera.cs +++ b/org.budnhead/graphics/GLCamera.cs @@ -17,10 +17,12 @@ namespace org.budnhead.graphics vView, vTop; - + GLCameraController controller; public GLCamera() { + controller = new GLCameraController(this); + fov = MathHelper.PiOver2; width = 100; height = 100; @@ -57,6 +59,11 @@ namespace org.budnhead.graphics ); } + public GLCameraController CameraController { + get { return this.controller; } + set { this.controller = value; } + } + public Vector3 Position { get { return new Vector3(vPosition); } diff --git a/org.budnhead/graphics/GLCameraController.cs b/org.budnhead/graphics/GLCameraController.cs new file mode 100644 index 0000000..829843a --- /dev/null +++ b/org.budnhead/graphics/GLCameraController.cs @@ -0,0 +1,181 @@ +/** + * GLCameraController + * + * Default camera controller using mouse dragging + * + **/ + +using System; + +using System.Drawing; +using OpenTK; +using System.Drawing.Drawing2D; + +using org.budnhead.core; + +namespace org.budnhead.graphics +{ + public class GLCameraController + { + private SceneWindow sceneWindow; + private GLCamera camera; + + private Point mouseCapturePosition; + private bool mouseCaptured; + + public Limits LimitUpDown { get; set; } = new Limits(-MathHelper.PiOver2,-MathHelper.Pi / 16); + public Limits LimitLeftRight { get; set; } = new Limits(-Math.PI, Math.PI); + + + public GLCameraController(GLCamera camera, SceneWindow sceneWindow){ + this.sceneWindow = sceneWindow; + this.camera = camera; + } + public GLCameraController(GLCamera camera){ + this.sceneWindow = null; + this.camera = camera; + } + + public SceneWindow SceneWindow { + get { return sceneWindow; } + set { + releaseSceneWindow(); + sceneWindow = value; + allocSceneWindow(); + } + } + + public GLCamera Camera { + get { return this.camera; } + set { this.camera = value; } + } + + + private void releaseSceneWindow(){ + if (sceneWindow != null){ + sceneWindow.MouseWheel -= SceneWindow_MouseWheel; + sceneWindow.MouseDown -= SceneWindow_MouseDown; + sceneWindow.MouseUp -= SceneWindow_MouseUp; + sceneWindow.MouseMove -= SceneWindow_MouseMove; + } + } + private void allocSceneWindow(){ + if (sceneWindow != null){ + sceneWindow.MouseWheel += SceneWindow_MouseWheel; + sceneWindow.MouseDown += SceneWindow_MouseDown; + sceneWindow.MouseUp += SceneWindow_MouseUp; + sceneWindow.MouseMove += SceneWindow_MouseMove; + } + } + + private void captureMouse() + { + mouseCapturePosition = new Point(sceneWindow.Mouse.X, sceneWindow.Mouse.Y); + mouseCaptured = true; + SceneWindow.CursorVisible = false; + } + + private void releaseMouse() + { + mouseCaptured = false; + SceneWindow.CursorVisible = true; + } + + + + void SceneWindow_MouseWheel(object sender, OpenTK.Input.MouseWheelEventArgs e) + { + Vector3 p, // Camera position + v; // Camera viewing direction + + p = camera.Position; + v = camera.View; + + p += v * e.Delta; + + camera.Position = p; + } + + void SceneWindow_MouseDown(object sender, OpenTK.Input.MouseButtonEventArgs e) + { + switch (e.Button) + { + case OpenTK.Input.MouseButton.Left: + //markMouse(e.X,e.Y); + break; + case OpenTK.Input.MouseButton.Right: + captureMouse(); + break; + } + } + + void SceneWindow_MouseUp(object sender, OpenTK.Input.MouseButtonEventArgs e) + { + releaseMouse(); + } + + void SceneWindow_MouseMove(object sender, OpenTK.Input.MouseMoveEventArgs e) + { + if (mouseCaptured) + { + Point delta = new Point(e.X - mouseCapturePosition.X, e.Y - mouseCapturePosition.Y); + onMouseCapturedMove(delta); + mouseCapturePosition = e.Position; + } + else { + } + } + + + protected virtual void onMouseCapturedMove(Point delta) + { + rotateLeftRight(((float)delta.X) / -50.0f); + rotateUpDown(((float)delta.Y) / -50.0f); + } + + public void rotateUpDown(float arc) + { + Vector3 v, // view direction + t, // top direction + r; // rotation axis + + v = camera.View; + t = camera.Top; + r = Vector3.Cross(v, t); + + Matrix3 mrot = Matrix3.CreateFromAxisAngle(r, arc); + + v *= mrot; + t *= mrot; + + camera.View = v; + camera.Top = t; + } + public void rotateLeftRight(float arc) + { + Vector3 v, // view direction + t, // top direction + r; // rotation axis + + v = camera.View; + t = camera.Top; + r = Vector3.UnitZ; + + Matrix3 mrot = Matrix3.CreateFromAxisAngle(r, arc); + + v *= mrot; + t *= mrot; + + camera.View = v; + camera.Top = t; + } + + public void walk(float distance) + { + } + + public void strafe(float distance) + { + } + } +} diff --git a/org.budnhead/org.budnhead.csproj b/org.budnhead/org.budnhead.csproj index 7b28bd5..fc0a95e 100644 --- a/org.budnhead/org.budnhead.csproj +++ b/org.budnhead/org.budnhead.csproj @@ -93,6 +93,7 @@ +