diff --git a/FNA b/FNA index 9a8a84c..c665d2e 160000 --- a/FNA +++ b/FNA @@ -1 +1 @@ -Subproject commit 9a8a84c3d427f47759a92342aaa8f7f08e751a64 +Subproject commit c665d2e08c25fb63e58e987b7c1af75af22aa010 diff --git a/Kav b/Kav index d156fbc..55b1555 160000 --- a/Kav +++ b/Kav @@ -1 +1 @@ -Subproject commit d156fbc39a771ac990cbb809b82ba771464785a5 +Subproject commit 55b1555df2ded543e623c8b5eb60d3a3fff9e32c diff --git a/KavTest/Components/ArcballTransformComponent.cs b/KavTest/Components/ArcballTransformComponent.cs new file mode 100644 index 0000000..6361100 --- /dev/null +++ b/KavTest/Components/ArcballTransformComponent.cs @@ -0,0 +1,14 @@ +using Encompass; + +namespace KavTest +{ + public struct ArcballTransformComponent : IComponent + { + public ArcballTransform ArcballTransform { get; } + + public ArcballTransformComponent(ArcballTransform arcballTransform) + { + ArcballTransform = arcballTransform; + } + } +} diff --git a/KavTest/Engines/CameraEngine.cs b/KavTest/Engines/CameraEngine.cs index 064c7c7..b946c90 100644 --- a/KavTest/Engines/CameraEngine.cs +++ b/KavTest/Engines/CameraEngine.cs @@ -4,9 +4,9 @@ using KavTest.Messages; namespace KavTest.Engines { - [Reads(typeof(CameraComponent))] - [Receives(typeof(MoveCameraMessage))] - [Sends(typeof(LocalTranslationMessage))] + [Reads(typeof(CameraComponent), typeof(ArcballTransformComponent))] + [Receives(typeof(MoveCameraMessage), typeof(RotateCameraMessage))] + [Writes(typeof(ArcballTransformComponent))] public class CameraEngine : Engine { public override void Update(double dt) @@ -14,11 +14,21 @@ namespace KavTest.Engines if (SomeComponent()) { var cameraEntity = ReadEntity(); + var arcballTransformComponent = GetComponent(cameraEntity); + + var transform = arcballTransformComponent.ArcballTransform; foreach (var moveMessage in ReadMessages()) { - SendMessage(new LocalTranslationMessage(cameraEntity, moveMessage.Translation * (float)dt)); + transform = transform.TranslateLocal(moveMessage.Translation * (float)dt); } + + foreach (var rotateMessage in ReadMessages()) + { + transform = transform.RotateLocal(-rotateMessage.Yaw * 0.25f * (float)dt, rotateMessage.Pitch * 0.25f * (float)dt); + } + + SetComponent(cameraEntity, new ArcballTransformComponent(transform)); } } } diff --git a/KavTest/Engines/InputEngine.cs b/KavTest/Engines/InputEngine.cs index 94b31ec..fd8c248 100644 --- a/KavTest/Engines/InputEngine.cs +++ b/KavTest/Engines/InputEngine.cs @@ -1,16 +1,35 @@ using Encompass; +using KavTest.Components; using KavTest.Messages; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; namespace KavTest.Engines { - [Sends(typeof(MoveCameraMessage))] + [Reads(typeof(CameraComponent))] + [Sends( + typeof(MoveCameraMessage), + typeof(RotateCameraMessage) + )] public class InputEngine : Engine { + private int centerX; + private int centerY; + + public InputEngine(int centerX, int centerY) + { + System.Console.WriteLine(centerX); + System.Console.WriteLine(centerY); + this.centerX = centerX; + this.centerY = centerY; + Mouse.SetPosition(centerX, centerY); + System.Console.WriteLine(Mouse.GetState().X); + } + public override void Update(double dt) { var keyboardState = Keyboard.GetState(); + var mouseState = Mouse.GetState(); if (keyboardState.IsKeyDown(Keys.W)) { @@ -31,6 +50,15 @@ namespace KavTest.Engines { SendMessage(new MoveCameraMessage(new Vector3(5, 0, 0))); } + + var mouseMovement = new Vector2(centerX - mouseState.X, centerY - mouseState.Y); + Mouse.SetPosition(centerX, centerY); + + if (SomeComponent()) + { + var cameraEntity = ReadEntity(); + SendMessage(new RotateCameraMessage(cameraEntity, mouseMovement.X, mouseMovement.Y)); + } } } } diff --git a/KavTest/KavTestGame.cs b/KavTest/KavTestGame.cs index bc18d9b..95023e8 100644 --- a/KavTest/KavTestGame.cs +++ b/KavTest/KavTestGame.cs @@ -36,7 +36,7 @@ namespace KavTest Smuggler.Importer.ImportGLB(GraphicsDevice, File.OpenRead("Content/rustysphere.glb")) ); - WorldBuilder.AddEngine(new InputEngine()); + WorldBuilder.AddEngine(new InputEngine(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2)); WorldBuilder.AddEngine(new AngularVelocityEngine()); WorldBuilder.AddEngine(new MotionEngine()); WorldBuilder.AddEngine(new CameraEngine()); @@ -65,15 +65,13 @@ namespace KavTest 300f )); - var cameraTransform = new Transform3D( - new Vector3(0, 0, -10), - Quaternion.CreateFromAxisAngle(Vector3.Up, MathHelper.Pi), - Vector3.One - ); - var cameraEntity = WorldBuilder.CreateEntity(); - WorldBuilder.SetComponent(cameraEntity, new Transform3DComponent( - cameraTransform + WorldBuilder.SetComponent(cameraEntity, new ArcballTransformComponent( + new ArcballTransform( + new Vector3(0, 0, -10), + MathHelper.Pi, + 0 + ) )); WorldBuilder.SetComponent(cameraEntity, new CameraComponent( Matrix.CreatePerspectiveFieldOfView( diff --git a/KavTest/Messages/RotateCameraMessage.cs b/KavTest/Messages/RotateCameraMessage.cs new file mode 100644 index 0000000..971b39a --- /dev/null +++ b/KavTest/Messages/RotateCameraMessage.cs @@ -0,0 +1,18 @@ +using Encompass; + +namespace KavTest +{ + public struct RotateCameraMessage : IMessage, IHasEntity + { + public Entity Entity { get; } + public float Yaw { get; } + public float Pitch { get; } + + public RotateCameraMessage(Entity entity, float yaw, float pitch) + { + Entity = entity; + Yaw = yaw; + Pitch = pitch; + } + } +} diff --git a/KavTest/Renderers/SceneRenderer.cs b/KavTest/Renderers/SceneRenderer.cs index c85a5b1..f662dbb 100644 --- a/KavTest/Renderers/SceneRenderer.cs +++ b/KavTest/Renderers/SceneRenderer.cs @@ -54,11 +54,11 @@ namespace KavTest.Renderers if (SomeComponent()) { var cameraEntity = ReadEntity(); - var transformComponent = GetComponent(cameraEntity); + var transformComponent = GetComponent(cameraEntity); var cameraComponent = GetComponent(cameraEntity); var camera = new Kav.Camera( - transformComponent.Transform.TransformMatrix, + transformComponent.ArcballTransform.TransformMatrix, cameraComponent.Projection ); diff --git a/KavTest/Utility/ArcballTransform.cs b/KavTest/Utility/ArcballTransform.cs new file mode 100644 index 0000000..866c89a --- /dev/null +++ b/KavTest/Utility/ArcballTransform.cs @@ -0,0 +1,51 @@ +using Microsoft.Xna.Framework; + +namespace KavTest +{ + public struct ArcballTransform + { + public Vector3 Position { get; } + public float Yaw { get; } + public float Pitch { get; } + + private Matrix RotationMatrix { get; } + public Matrix TransformMatrix { get; } + public Vector3 Forward { get { return TransformMatrix.Forward; } } + public Vector3 Right { get { return TransformMatrix.Right; } } + public Vector3 Up { get { return TransformMatrix.Up; } } + + public ArcballTransform(Vector3 position, float yaw, float pitch) + { + Position = position; + Yaw = yaw; + Pitch = pitch; + RotationMatrix = CreateRotationMatrix(Yaw, Pitch); + TransformMatrix = CreateTransformMatrix(Position, RotationMatrix); + } + + public ArcballTransform RotateLocal(float deltaYaw, float deltaPitch) + { + return new ArcballTransform(Position, Yaw + deltaYaw, Pitch + deltaPitch); + } + + public ArcballTransform TranslateLocal(Vector3 localTranslation) + { + var worldTranslation = Vector3.Transform(localTranslation, RotationMatrix); + return new ArcballTransform(Position + worldTranslation, Yaw, Pitch); + } + + private static Matrix CreateRotationMatrix(float yaw, float pitch) + { + return + Matrix.CreateRotationX(pitch) * + Matrix.CreateRotationY(yaw); + } + + private static Matrix CreateTransformMatrix(Vector3 position, Matrix rotation) + { + return + rotation * + Matrix.CreateTranslation(position); + } + } +} diff --git a/encompass-cs b/encompass-cs index 0a30dab..bdd9f59 160000 --- a/encompass-cs +++ b/encompass-cs @@ -1 +1 @@ -Subproject commit 0a30dab3c2a8ef4ce435af8123bcb64efe4926d8 +Subproject commit bdd9f595493609444d8ebb31b9d07b7ef320eafb