diff --git a/Engine/Graphics/3DRenderer.cpp b/Engine/Graphics/3DRenderer.cpp index c8dabb5..a3b2d4e 100644 --- a/Engine/Graphics/3DRenderer.cpp +++ b/Engine/Graphics/3DRenderer.cpp @@ -46,6 +46,27 @@ Graphic3DRenderer::Graphic3DRenderer() { Graphic3DRenderer::~Graphic3DRenderer() {} +void Graphic3DRenderer::UpdateCamera(CAMERA_MOVE type, const float value) { + switch (type) { + case CAMERA_MOVE_WALK: + mMainCamera->Walk(value); + break; + + case CAMERA_MOVE_STRAFE: + mMainCamera->Strafe(value); + break; + + case CAMERA_MOVE_FLY: + mMainCamera->Fly(value); + break; + + default: + break; + } + + mMainCamera->UpdateCamView(); +} + void Graphic3DRenderer::Draw(sf::RenderTexture& context) { sf::BlendMode sBM = sf::BlendNone; sf::RenderStates sRS(sBM); diff --git a/Engine/Graphics/3DRenderer.hpp b/Engine/Graphics/3DRenderer.hpp index 7df9038..242b8fd 100644 --- a/Engine/Graphics/3DRenderer.hpp +++ b/Engine/Graphics/3DRenderer.hpp @@ -7,6 +7,12 @@ #include "../World/WorldObject.hpp" +typedef enum eCameraMovementType { + CAMERA_MOVE_WALK, + CAMERA_MOVE_STRAFE, + CAMERA_MOVE_FLY +} CAMERA_MOVE; + class Graphic3DRenderer final { public: Graphic3DRenderer(); @@ -17,6 +23,7 @@ public: Graphic3DRenderer(Graphic3DRenderer const&) = delete; Graphic3DRenderer& operator= (Graphic3DRenderer const&) = delete; + void UpdateCamera(CAMERA_MOVE type, const float value); void Draw(sf::RenderTexture& context); private: diff --git a/Engine/Graphics/Camera.cpp b/Engine/Graphics/Camera.cpp index 0964ff1..7c06acb 100644 --- a/Engine/Graphics/Camera.cpp +++ b/Engine/Graphics/Camera.cpp @@ -36,4 +36,28 @@ void Camera::LookAt(const M3D_F3& pos, const M3D_F3& target, const M3D_F3& up) { M3D_VECTOR U = M3D_V4LoadF3(&up); LookAt(P, T, U); +} + +void Camera::Strafe(float d) { + // mPosition += d*mRight + M3D_VECTOR s = M3D_V4Replicate(d); + M3D_VECTOR r = M3D_V4LoadF3(&mRight); + M3D_VECTOR p = M3D_V4LoadF3(&mPos); + M3D_V4StoreF3(&mPos, M3D_V4MultiplyAdd(s, r, p)); +} + +void Camera::Walk(float d) { + // mPosition += d*mLook + M3D_VECTOR s = M3D_V4Replicate(d); + M3D_VECTOR l = M3D_V4LoadF3(&mLook); + M3D_VECTOR p = M3D_V4LoadF3(&mPos); + M3D_V4StoreF3(&mPos, M3D_V4MultiplyAdd(s, l, p)); +} + +void Camera::Fly(float d) { + // mPosition += d*mRight + M3D_VECTOR s = M3D_V4Replicate(d); + M3D_VECTOR u = M3D_V4LoadF3(&mUp); + M3D_VECTOR p = M3D_V4LoadF3(&mPos); + M3D_V4StoreF3(&mPos, M3D_V4MultiplyAdd(s, u, p)); } \ No newline at end of file diff --git a/Engine/Graphics/Camera.hpp b/Engine/Graphics/Camera.hpp index 862f866..3ef8d70 100644 --- a/Engine/Graphics/Camera.hpp +++ b/Engine/Graphics/Camera.hpp @@ -28,6 +28,10 @@ public: void LookAt(M3D_VECTOR pos, M3D_VECTOR target, M3D_VECTOR worldUp); void LookAt(const M3D_F3& pos, const M3D_F3& target, const M3D_F3& up); + void Strafe(float d); + void Walk(float d); + void Fly(float d); + private: M3D_F4X4 mProjMat = M3D_MIdentity4x4(); M3D_F4X4 mViewMat = M3D_MIdentity4x4();