-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5 from Tornado-Technology/camera-system
Camera system WIP
- Loading branch information
Showing
36 changed files
with
1,247 additions
and
368 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,12 @@ | ||
namespace Hypercube.Client.Graphics.Shading; | ||
using Hypercube.Shared.Math.Matrix; | ||
|
||
namespace Hypercube.Client.Graphics.Shading; | ||
|
||
public interface IShader | ||
{ | ||
void Use(); | ||
int GetUniformLocation(string name); | ||
void SetUniform(string name, int value); | ||
void SetUniform(string name, Matrix4X4 value, bool transpose = false); | ||
void SetUniform(int index, Matrix4X4 value, bool transpose = false); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,37 +1,64 @@ | ||
using Hypercube.Shared.Math.Box; | ||
using Hypercube.Shared.Math.Matrix; | ||
using Hypercube.Shared.Math.Matrix; | ||
using Hypercube.Shared.Math.Vector; | ||
|
||
namespace Hypercube.Client.Graphics.Viewports; | ||
|
||
public class Camera2D : ICamera | ||
{ | ||
public float ZFar { get; private set; } | ||
public float ZNear { get; private set; } | ||
public Vector2 Position { get; private set; } | ||
public float Zoom { get; private set; } | ||
public Vector3 Position { get; private set; } | ||
public Vector3 Rotation { get; private set; } | ||
public Vector3 Scale { get; private set; } = Vector3.One; | ||
|
||
private readonly float _zFar; | ||
private readonly float _zNear; | ||
private Vector2Int Size { get; set; } | ||
|
||
public Matrix4X4 Projection; | ||
|
||
private Vector2 HalfSize => Size / 2f; | ||
public Matrix4X4 Projection { get; private set; } | ||
|
||
public void SetPosition(Vector2 position) | ||
public Camera2D(Vector2Int size, Vector2 position, float zNear, float zFar) | ||
{ | ||
Size = size; | ||
Position = new Vector3(position); | ||
_zNear = zNear; | ||
_zFar = zFar; | ||
|
||
UpdateProjection(); | ||
} | ||
|
||
public void SetSize(Vector2Int size) | ||
{ | ||
Size = size; | ||
UpdateProjection(); | ||
} | ||
|
||
public void SetPosition(Vector3 position) | ||
{ | ||
Position = position; | ||
UpdateProjection(); | ||
} | ||
|
||
public void SetZoom(float zoom) | ||
public void SetRotation(Vector3 rotation) | ||
{ | ||
Rotation = Rotation.WithZ(rotation.Z); | ||
UpdateProjection(); | ||
} | ||
|
||
public void SetScale(Vector3 scale) | ||
{ | ||
Zoom = zoom; | ||
Scale = scale; | ||
UpdateProjection(); | ||
} | ||
|
||
private void UpdateProjection() | ||
{ | ||
var size = new Box2(); | ||
var projection = Matrix4X4.CreateOrthographic(Size, _zNear, _zFar); | ||
|
||
var projection = Matrix4X4.CreateOrthographic(size, ZNear, ZFar); | ||
var scale = Matrix4X4.CreateScale(Zoom); | ||
|
||
Projection = projection * scale; | ||
var translate = Matrix4X4.CreateTranslation(Position); | ||
var rotation = Matrix4X4.CreateRotationZ(Rotation.Z); | ||
var scale = Matrix4X4.CreateScale(Scale); | ||
|
||
Projection = projection * translate * rotation * scale; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,20 +1,71 @@ | ||
using Hypercube.Shared.Dependency; | ||
using Hypercube.Shared.EventBus; | ||
using Hypercube.Shared.Runtimes.Loop.Event; | ||
using Hypercube.Client.Input; | ||
using Hypercube.Client.Input.Handler; | ||
using Hypercube.Shared.Dependency; | ||
using Hypercube.Shared.Math.Matrix; | ||
using Hypercube.Shared.Math.Vector; | ||
|
||
namespace Hypercube.Client.Graphics.Viewports; | ||
|
||
public class CameraManager : ICameraManager, IPostInject | ||
public class CameraManager : ICameraManager | ||
{ | ||
[Dependency] private readonly IEventBus _eventBus = default!; | ||
[Dependency] private readonly IInputHandler _inputHandler = default!; | ||
|
||
public void PostInject() | ||
public ICamera? MainCamera { get; private set; } | ||
public Matrix4X4 Projection => MainCamera?.Projection ?? Matrix4X4.Identity; | ||
|
||
public void UpdateInput(ICamera? camera, float delta) | ||
{ | ||
_eventBus.Subscribe<UpdateFrameEvent>(OnUpdate); | ||
if (camera is null) | ||
return; | ||
|
||
// Debug camera controls | ||
var position = camera.Position; | ||
var rotation = camera.Rotation; | ||
var scale = camera.Scale; | ||
|
||
var speed = 20f; | ||
|
||
if (_inputHandler.IsKeyDown(Key.W)) | ||
position -= Vector3.UnitY * speed * delta; | ||
|
||
if (_inputHandler.IsKeyDown(Key.S)) | ||
position += Vector3.UnitY * speed * delta; | ||
|
||
if (_inputHandler.IsKeyDown(Key.A)) | ||
position += Vector3.UnitX * speed * delta; | ||
|
||
if (_inputHandler.IsKeyDown(Key.D)) | ||
position -= Vector3.UnitX * speed * delta; | ||
|
||
if (_inputHandler.IsKeyDown(Key.Q)) | ||
rotation -= Vector3.UnitZ * delta; | ||
|
||
if (_inputHandler.IsKeyDown(Key.E)) | ||
rotation += Vector3.UnitZ * delta; | ||
|
||
if (_inputHandler.IsKeyDown(Key.T)) | ||
scale -= Vector3.One * delta; | ||
|
||
if (_inputHandler.IsKeyDown(Key.Y)) | ||
scale += Vector3.One * delta; | ||
|
||
camera.SetPosition(position); | ||
camera.SetRotation(rotation); | ||
camera.SetScale(scale); | ||
} | ||
|
||
private void OnUpdate(UpdateFrameEvent args) | ||
public void SetMainCamera(ICamera camera) | ||
{ | ||
|
||
MainCamera = camera; | ||
} | ||
|
||
public ICamera CreateCamera2D(Vector2Int size) | ||
{ | ||
return CreateCamera2D(size, Vector2.Zero); | ||
} | ||
|
||
public ICamera CreateCamera2D(Vector2Int size, Vector2 position, float zNear = 0.1f, float zFar = 100f) | ||
{ | ||
return new Camera2D(size, position, zNear, zFar); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,17 @@ | ||
namespace Hypercube.Client.Graphics.Viewports; | ||
using Hypercube.Shared.Math.Matrix; | ||
using Hypercube.Shared.Math.Vector; | ||
|
||
namespace Hypercube.Client.Graphics.Viewports; | ||
|
||
public interface ICamera | ||
{ | ||
Matrix4X4 Projection { get; } | ||
|
||
Vector3 Position { get; } | ||
Vector3 Rotation { get; } | ||
Vector3 Scale { get; } | ||
|
||
void SetPosition(Vector3 position); | ||
void SetRotation(Vector3 rotation); | ||
void SetScale(Vector3 scale); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,13 @@ | ||
namespace Hypercube.Client.Graphics.Viewports; | ||
using Hypercube.Shared.Math.Matrix; | ||
using Hypercube.Shared.Math.Vector; | ||
|
||
namespace Hypercube.Client.Graphics.Viewports; | ||
|
||
public interface ICameraManager | ||
{ | ||
|
||
ICamera? MainCamera { get; } | ||
Matrix4X4 Projection { get; } | ||
void SetMainCamera(ICamera camera); | ||
ICamera CreateCamera2D(Vector2Int size); | ||
void UpdateInput(ICamera? camera, float delta); | ||
} |
Oops, something went wrong.