move camera stuff into its own section
This commit is contained in:
parent
cf7b42b95c
commit
2b77ce40b5
|
@ -37,7 +37,7 @@ deps += imgui_dep
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
'graphics-test',
|
'graphics-test',
|
||||||
sources: files('src/main.cpp'),
|
sources: files('src/camera/camera.cpp', 'src/main.cpp'),
|
||||||
include_directories: include_directories('include', is_system: true),
|
include_directories: include_directories('include', is_system: true),
|
||||||
dependencies: deps,
|
dependencies: deps,
|
||||||
)
|
)
|
98
src/camera/camera.cpp
Normal file
98
src/camera/camera.cpp
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
#include "camera.hpp"
|
||||||
|
|
||||||
|
#include "../util/constants.hpp"
|
||||||
|
|
||||||
|
using namespace constants;
|
||||||
|
|
||||||
|
Camera::Camera()
|
||||||
|
: mPosition(2.0, 2.0, 0.5),
|
||||||
|
mFront(glm::normalize(glm::dvec3(0.0, 1.0, 0.0))),
|
||||||
|
mUp(0.0, 0.0, 1.0),
|
||||||
|
mRight(glm::normalize(glm::cross(mFront, glm::dvec3(0.0, 0.0, 1.0)))),
|
||||||
|
mYaw(180.0),
|
||||||
|
mPitch(0.0) {
|
||||||
|
updateCameraVectors();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Camera::getPosition() const -> glm::dvec3 { return mPosition; }
|
||||||
|
|
||||||
|
fn Camera::getFront() const -> glm::dvec3 { return mFront; }
|
||||||
|
|
||||||
|
fn Camera::getYaw() const -> f64 { return mYaw; }
|
||||||
|
|
||||||
|
fn Camera::getPitch() const -> f64 { return mPitch; }
|
||||||
|
|
||||||
|
fn Camera::getViewMatrix() const -> glm::mat4 { return glm::lookAt(mPosition, mPosition + mFront, mUp); }
|
||||||
|
|
||||||
|
fn Camera::moveForward(f64 deltaTime) -> void {
|
||||||
|
// Project front vector onto horizontal plane by zeroing Z component
|
||||||
|
glm::dvec3 horizontalFront = mFront;
|
||||||
|
horizontalFront.z = 0.0;
|
||||||
|
horizontalFront = glm::normalize(horizontalFront);
|
||||||
|
mPosition += horizontalFront * CAMERA_SPEED * deltaTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Camera::moveBackward(f64 deltaTime) -> void {
|
||||||
|
// Project front vector onto horizontal plane by zeroing Z component
|
||||||
|
glm::dvec3 horizontalFront = mFront;
|
||||||
|
horizontalFront.z = 0.0;
|
||||||
|
horizontalFront = glm::normalize(horizontalFront);
|
||||||
|
mPosition -= horizontalFront * CAMERA_SPEED * deltaTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Camera::moveLeft(f64 deltaTime) -> void {
|
||||||
|
// Project right vector onto horizontal plane by zeroing Z component
|
||||||
|
glm::dvec3 horizontalRight = mRight;
|
||||||
|
horizontalRight.z = 0.0;
|
||||||
|
horizontalRight = glm::normalize(horizontalRight);
|
||||||
|
mPosition -= horizontalRight * CAMERA_SPEED * deltaTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Camera::moveRight(f64 deltaTime) -> void {
|
||||||
|
// Project right vector onto horizontal plane by zeroing Z component
|
||||||
|
glm::dvec3 horizontalRight = mRight;
|
||||||
|
horizontalRight.z = 0.0;
|
||||||
|
horizontalRight = glm::normalize(horizontalRight);
|
||||||
|
mPosition += horizontalRight * CAMERA_SPEED * deltaTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Camera::moveUp(f64 deltaTime) -> void {
|
||||||
|
mPosition += glm::dvec3(0.0, 0.0, 1.0) * CAMERA_SPEED * deltaTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Camera::moveDown(f64 deltaTime) -> void {
|
||||||
|
mPosition -= glm::dvec3(0.0, 0.0, 1.0) * CAMERA_SPEED * deltaTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Camera::rotate(f64 xoffset, double yoffset) -> void {
|
||||||
|
const f64 sensitivity = 0.1;
|
||||||
|
mYaw += xoffset * sensitivity;
|
||||||
|
mPitch += yoffset * sensitivity;
|
||||||
|
|
||||||
|
// Clamp yaw to [-180, 180] range
|
||||||
|
if (mYaw > 180.0)
|
||||||
|
mYaw -= 360.0;
|
||||||
|
if (mYaw < -180.0)
|
||||||
|
mYaw += 360.0;
|
||||||
|
|
||||||
|
// Constrain pitch to avoid camera flipping
|
||||||
|
if (mPitch > 89.0)
|
||||||
|
mPitch = 89.0;
|
||||||
|
if (mPitch < -89.0)
|
||||||
|
mPitch = -89.0;
|
||||||
|
|
||||||
|
updateCameraVectors();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn Camera::updateCameraVectors() -> void {
|
||||||
|
// Calculate new front vector
|
||||||
|
glm::dvec3 newFront;
|
||||||
|
newFront.x = cos(glm::radians(mYaw)) * cos(glm::radians(mPitch));
|
||||||
|
newFront.y = sin(glm::radians(mYaw)) * cos(glm::radians(mPitch));
|
||||||
|
newFront.z = sin(glm::radians(mPitch));
|
||||||
|
|
||||||
|
mFront = glm::normalize(newFront);
|
||||||
|
// Recalculate right and up vectors
|
||||||
|
mRight = glm::normalize(glm::cross(mFront, glm::dvec3(0.0, 0.0, 1.0)));
|
||||||
|
mUp = glm::normalize(glm::cross(mRight, mFront));
|
||||||
|
}
|
42
src/camera/camera.hpp
Normal file
42
src/camera/camera.hpp
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
#include <glm/gtc/matrix_transform.hpp>
|
||||||
|
|
||||||
|
#include "../util/types.hpp"
|
||||||
|
|
||||||
|
struct CameraInfo {
|
||||||
|
alignas(16) glm::vec3 position; ///< Camera position
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Camera class for handling 3D camera movement and perspective
|
||||||
|
*/
|
||||||
|
class Camera {
|
||||||
|
public:
|
||||||
|
Camera();
|
||||||
|
|
||||||
|
[[nodiscard]] fn getPosition() const -> glm::dvec3;
|
||||||
|
[[nodiscard]] fn getFront() const -> glm::dvec3;
|
||||||
|
[[nodiscard]] fn getYaw() const -> f64;
|
||||||
|
[[nodiscard]] fn getPitch() const -> f64;
|
||||||
|
[[nodiscard]] fn getViewMatrix() const -> glm::mat4;
|
||||||
|
|
||||||
|
fn moveForward(f64 deltaTime) -> void;
|
||||||
|
fn moveBackward(f64 deltaTime) -> void;
|
||||||
|
fn moveLeft(f64 deltaTime) -> void;
|
||||||
|
fn moveRight(f64 deltaTime) -> void;
|
||||||
|
fn moveUp(f64 deltaTime) -> void;
|
||||||
|
fn moveDown(f64 deltaTime) -> void;
|
||||||
|
fn rotate(f64 xoffset, f64 yoffset) -> void;
|
||||||
|
|
||||||
|
private:
|
||||||
|
fn updateCameraVectors() -> void;
|
||||||
|
|
||||||
|
glm::dvec3 mPosition;
|
||||||
|
glm::dvec3 mFront;
|
||||||
|
glm::dvec3 mUp;
|
||||||
|
glm::dvec3 mRight;
|
||||||
|
f64 mYaw;
|
||||||
|
f64 mPitch;
|
||||||
|
};
|
110
src/main.cpp
110
src/main.cpp
|
@ -23,6 +23,7 @@
|
||||||
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
|
VULKAN_HPP_DEFAULT_DISPATCH_LOADER_DYNAMIC_STORAGE
|
||||||
|
|
||||||
// Include custom utility headers
|
// Include custom utility headers
|
||||||
|
#include "camera/camera.hpp" // Camera class
|
||||||
#include "util/constants.hpp" // Constants definitions
|
#include "util/constants.hpp" // Constants definitions
|
||||||
#include "util/crosshair.hpp" // Crosshair definitions
|
#include "util/crosshair.hpp" // Crosshair definitions
|
||||||
#include "util/shaders.hpp" // Compiled shader code
|
#include "util/shaders.hpp" // Compiled shader code
|
||||||
|
@ -152,6 +153,8 @@ class VulkanApp {
|
||||||
|
|
||||||
std::vector<vk::UniqueCommandBuffer> mCommandBuffers; ///< Command buffers for drawing commands
|
std::vector<vk::UniqueCommandBuffer> mCommandBuffers; ///< Command buffers for drawing commands
|
||||||
|
|
||||||
|
Camera mCamera; ///< Camera object
|
||||||
|
|
||||||
// Light settings
|
// Light settings
|
||||||
struct {
|
struct {
|
||||||
glm::vec3 position = glm::vec3(2.0F, 2.0F, 2.0F);
|
glm::vec3 position = glm::vec3(2.0F, 2.0F, 2.0F);
|
||||||
|
@ -232,113 +235,6 @@ class VulkanApp {
|
||||||
alignas(4) float specular_strength; ///< Specular strength
|
alignas(4) float specular_strength; ///< Specular strength
|
||||||
};
|
};
|
||||||
|
|
||||||
struct CameraInfo {
|
|
||||||
alignas(16) glm::vec3 position; ///< Camera position
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Camera {
|
|
||||||
glm::dvec3 position;
|
|
||||||
glm::dvec3 front;
|
|
||||||
glm::dvec3 up;
|
|
||||||
glm::dvec3 right;
|
|
||||||
f64 yaw;
|
|
||||||
f64 pitch;
|
|
||||||
|
|
||||||
Camera()
|
|
||||||
: position(2.0, 2.0, 0.5),
|
|
||||||
front(glm::normalize(glm::dvec3(0.0, 1.0, 0.0))),
|
|
||||||
up(0.0, 0.0, 1.0),
|
|
||||||
right(glm::normalize(glm::cross(front, glm::dvec3(0.0, 0.0, 1.0)))),
|
|
||||||
yaw(180.0),
|
|
||||||
pitch(0.0) {
|
|
||||||
updateCameraVectors();
|
|
||||||
}
|
|
||||||
|
|
||||||
[[nodiscard]] fn getPosition() const -> glm::dvec3 { return position; }
|
|
||||||
|
|
||||||
[[nodiscard]] fn getFront() const -> glm::dvec3 { return front; }
|
|
||||||
|
|
||||||
[[nodiscard]] fn getYaw() const -> f64 { return yaw; }
|
|
||||||
|
|
||||||
[[nodiscard]] fn getPitch() const -> f64 { return pitch; }
|
|
||||||
|
|
||||||
[[nodiscard]] fn getViewMatrix() const -> glm::mat4 {
|
|
||||||
return glm::lookAt(position, position + front, up);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn moveForward(f64 deltaTime) -> void {
|
|
||||||
// Project front vector onto horizontal plane by zeroing Z component
|
|
||||||
glm::dvec3 horizontalFront = front;
|
|
||||||
horizontalFront.z = 0.0;
|
|
||||||
horizontalFront = glm::normalize(horizontalFront);
|
|
||||||
position += horizontalFront * CAMERA_SPEED * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn moveBackward(f64 deltaTime) -> void {
|
|
||||||
// Project front vector onto horizontal plane by zeroing Z component
|
|
||||||
glm::dvec3 horizontalFront = front;
|
|
||||||
horizontalFront.z = 0.0;
|
|
||||||
horizontalFront = glm::normalize(horizontalFront);
|
|
||||||
position -= horizontalFront * CAMERA_SPEED * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn moveLeft(f64 deltaTime) -> void {
|
|
||||||
// Project right vector onto horizontal plane by zeroing Z component
|
|
||||||
glm::dvec3 horizontalRight = right;
|
|
||||||
horizontalRight.z = 0.0;
|
|
||||||
horizontalRight = glm::normalize(horizontalRight);
|
|
||||||
position -= horizontalRight * CAMERA_SPEED * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn moveRight(f64 deltaTime) -> void {
|
|
||||||
// Project right vector onto horizontal plane by zeroing Z component
|
|
||||||
glm::dvec3 horizontalRight = right;
|
|
||||||
horizontalRight.z = 0.0;
|
|
||||||
horizontalRight = glm::normalize(horizontalRight);
|
|
||||||
position += horizontalRight * CAMERA_SPEED * deltaTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn moveUp(f64 deltaTime) -> void { position += glm::dvec3(0.0, 0.0, 1.0) * CAMERA_SPEED * deltaTime; }
|
|
||||||
|
|
||||||
fn moveDown(f64 deltaTime) -> void { position -= glm::dvec3(0.0, 0.0, 1.0) * CAMERA_SPEED * deltaTime; }
|
|
||||||
|
|
||||||
fn rotate(f64 xoffset, f64 yoffset) -> void {
|
|
||||||
const f64 sensitivity = 0.1;
|
|
||||||
yaw += xoffset * sensitivity;
|
|
||||||
pitch += yoffset * sensitivity;
|
|
||||||
|
|
||||||
// Clamp yaw to [-180, 180] range
|
|
||||||
if (yaw > 180.0)
|
|
||||||
yaw -= 360.0;
|
|
||||||
if (yaw < -180.0)
|
|
||||||
yaw += 360.0;
|
|
||||||
|
|
||||||
// Constrain pitch to avoid camera flipping
|
|
||||||
if (pitch > 89.0)
|
|
||||||
pitch = 89.0;
|
|
||||||
if (pitch < -89.0)
|
|
||||||
pitch = -89.0;
|
|
||||||
|
|
||||||
updateCameraVectors();
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
fn updateCameraVectors() -> void {
|
|
||||||
// Calculate new front vector
|
|
||||||
glm::dvec3 newFront;
|
|
||||||
newFront.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
|
|
||||||
newFront.y = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
|
|
||||||
newFront.z = sin(glm::radians(pitch));
|
|
||||||
|
|
||||||
front = glm::normalize(newFront);
|
|
||||||
// Recalculate right and up vectors
|
|
||||||
right = glm::normalize(glm::cross(front, glm::dvec3(0.0, 0.0, 1.0)));
|
|
||||||
up = glm::normalize(glm::cross(right, front));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Camera mCamera; ///< Camera object
|
|
||||||
|
|
||||||
static fn processInput(vkfw::Window& window, Camera& camera, const f32& deltaTime, const f32& cameraSpeed)
|
static fn processInput(vkfw::Window& window, Camera& camera, const f32& deltaTime, const f32& cameraSpeed)
|
||||||
-> void {
|
-> void {
|
||||||
if (window.getKey(vkfw::Key::eW) == vkfw::eTrue)
|
if (window.getKey(vkfw::Key::eW) == vkfw::eTrue)
|
||||||
|
|
Loading…
Reference in a new issue