ADD: Camera mode
This commit is contained in:
124
src/scene/camera/camera_rig.h
Normal file
124
src/scene/camera/camera_rig.h
Normal file
@@ -0,0 +1,124 @@
|
||||
#pragma once
|
||||
|
||||
#include <core/world.h>
|
||||
|
||||
#include <glm/gtc/quaternion.hpp>
|
||||
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class Camera;
|
||||
class InputSystem;
|
||||
class SceneManager;
|
||||
|
||||
enum class CameraMode : uint8_t
|
||||
{
|
||||
Free = 0,
|
||||
Orbit = 1,
|
||||
Follow = 2,
|
||||
Chase = 3,
|
||||
Fixed = 4
|
||||
};
|
||||
|
||||
enum class CameraTargetType : uint8_t
|
||||
{
|
||||
None = 0,
|
||||
WorldPoint = 1,
|
||||
MeshInstance = 2,
|
||||
GLTFInstance = 3
|
||||
};
|
||||
|
||||
struct CameraTarget
|
||||
{
|
||||
CameraTargetType type{CameraTargetType::None};
|
||||
std::string name{};
|
||||
WorldVec3 world_point{0.0, 0.0, 0.0};
|
||||
};
|
||||
|
||||
struct FreeCameraSettings
|
||||
{
|
||||
float move_speed{1.8f}; // world units / second
|
||||
float look_sensitivity{0.0020f};
|
||||
float roll_speed{1.0f}; // radians / second
|
||||
};
|
||||
|
||||
struct OrbitCameraSettings
|
||||
{
|
||||
CameraTarget target{};
|
||||
double distance{10.0};
|
||||
float yaw{0.0f}; // radians
|
||||
float pitch{0.0f}; // radians
|
||||
float look_sensitivity{0.0020f};
|
||||
};
|
||||
|
||||
struct FollowCameraSettings
|
||||
{
|
||||
CameraTarget target{};
|
||||
glm::vec3 position_offset_local{0.0f, 2.0f, 6.0f};
|
||||
glm::quat rotation_offset{1.0f, 0.0f, 0.0f, 0.0f};
|
||||
};
|
||||
|
||||
struct ChaseCameraSettings
|
||||
{
|
||||
CameraTarget target{};
|
||||
glm::vec3 position_offset_local{0.0f, 2.0f, 6.0f};
|
||||
glm::quat rotation_offset{1.0f, 0.0f, 0.0f, 0.0f};
|
||||
float position_lag{8.0f}; // smoothing rate (1/sec), higher = snappier
|
||||
float rotation_lag{10.0f}; // smoothing rate (1/sec)
|
||||
};
|
||||
|
||||
struct FixedCameraSettings
|
||||
{
|
||||
};
|
||||
|
||||
class CameraRig
|
||||
{
|
||||
public:
|
||||
CameraRig();
|
||||
~CameraRig();
|
||||
|
||||
CameraRig(const CameraRig &) = delete;
|
||||
CameraRig &operator=(const CameraRig &) = delete;
|
||||
|
||||
void init(SceneManager &scene, Camera &camera);
|
||||
|
||||
CameraMode mode() const { return _mode; }
|
||||
void set_mode(CameraMode mode, SceneManager &scene, Camera &camera);
|
||||
|
||||
const char *mode_name() const;
|
||||
|
||||
FreeCameraSettings &free_settings() { return _free; }
|
||||
OrbitCameraSettings &orbit_settings() { return _orbit; }
|
||||
FollowCameraSettings &follow_settings() { return _follow; }
|
||||
ChaseCameraSettings &chase_settings() { return _chase; }
|
||||
FixedCameraSettings &fixed_settings() { return _fixed; }
|
||||
|
||||
const FreeCameraSettings &free_settings() const { return _free; }
|
||||
const OrbitCameraSettings &orbit_settings() const { return _orbit; }
|
||||
const FollowCameraSettings &follow_settings() const { return _follow; }
|
||||
const ChaseCameraSettings &chase_settings() const { return _chase; }
|
||||
const FixedCameraSettings &fixed_settings() const { return _fixed; }
|
||||
|
||||
void process_input(InputSystem &input, bool ui_capture_keyboard, bool ui_capture_mouse);
|
||||
void update(SceneManager &scene, Camera &camera, float dt);
|
||||
|
||||
bool resolve_target(SceneManager &scene,
|
||||
const CameraTarget &target,
|
||||
WorldVec3 &out_position_world,
|
||||
glm::quat &out_rotation) const;
|
||||
|
||||
private:
|
||||
void recreate_mode(SceneManager &scene, Camera &camera);
|
||||
|
||||
CameraMode _mode{CameraMode::Free};
|
||||
std::unique_ptr<class ICameraMode> _mode_impl;
|
||||
SceneManager *_scene = nullptr;
|
||||
Camera *_camera = nullptr;
|
||||
|
||||
FreeCameraSettings _free{};
|
||||
OrbitCameraSettings _orbit{};
|
||||
FollowCameraSettings _follow{};
|
||||
ChaseCameraSettings _chase{};
|
||||
FixedCameraSettings _fixed{};
|
||||
};
|
||||
Reference in New Issue
Block a user