AnimEngine
CameraEntities.hpp
1 #pragma once
2 #ifndef KJY_ANIM_ENGINE_CAMERAS_HPP_
3 #define KJY_ANIM_ENGINE_CAMERAS_HPP_
4 
5 #include "components/inheritable/camera.hpp"
6 #include "components/attachable/Pose.hpp"
7 #include "EntitiesBase.hpp"
8 #include "util/common.h"
9 #include <glm/glm.hpp>
10 #include <glm/gtc/matrix_transform.hpp>
11 
12 using namespace glm;
13 #define ENABLE_WORLD_GLFW_UTILITIES
14 #ifdef ENABLE_WORLD_GLFW_UTILITIES
15 #define GLFW_INCLUDE_NONE
16 #include <GLFW/glfw3.h>
17 #endif
18 
19 #pragma warning(disable: 4250) // Disable warnings about dominance in MSVC
20 
21 class BaseCameraEntity : virtual public CameraInterface, virtual public PoseableWorldEntity, virtual public CachedFinalPose
22 {
23 public:
24  BaseCameraEntity() : fov(45.0f), near_plane(.01f), far_plane(100.0f), pose(glm::vec3(0.0f)) {}
25  BaseCameraEntity(float fov, const glm::vec3 &loc) : fov(fov), near_plane(.01f), far_plane(100.0f), pose(loc){}
26  BaseCameraEntity(float fov, const glm::vec3 &loc, float near_plane, float far_plane) : fov(fov), near_plane(near_plane), far_plane(far_plane), pose(loc){}
27 
28  virtual glm::vec3 getLocation() const override{
29  return(pose.getCenterOfSpace());
30  }
31 
32  virtual const Pose& getPose() const override {return(pose);}
33 
34  virtual void setPose(const Pose& pose) override {this->pose = pose;}
35 
36  virtual glm::mat4 getPerspective(float aspect) const override{
37  return(glm::perspective(glm::radians(fov), aspect, near_plane, far_plane));
38  }
39 
40  virtual glm::mat4 getOrthographic() const override{
41  return(glm::ortho(-1.0f, 1.0f, -1.0f, 1.0f, near_plane, far_plane));
42  }
43 
44  glm::mat4 getOrthographic(float left, float right, float bottom, float top, float near_plane, float far_plane){
45  return(glm::ortho(left, right, bottom, top, near_plane, far_plane));
46  }
47 
48  virtual glm::mat4 getView() const override;
49  virtual glm::vec3 getViewDir() const override;
50  virtual glm::vec3 getViewDir(const Pose& aPoseOverride) const override;
51  virtual glm::mat4 getView(const Pose& aPoseOverride) const override;
52 
53  virtual void setNearPlane(float near_plane){this->near_plane = near_plane;}
54  virtual void setFarPlane(float far_plane){this->far_plane = far_plane;}
55 
56  float fov;
57  float near_plane;
58  float far_plane;
59 
60  Pose pose;
61 };
62 
64 public:
66  LookAtCamera(float fov, const glm::vec3 &loc) : BaseCameraEntity(fov, loc) {}
67  LookAtCamera(float fov, const glm::vec3 &loc, float near_plane, float far_plane) : BaseCameraEntity(fov, loc, near_plane, far_plane) {}
68  LookAtCamera(float fov, const glm::vec3 &loc, float near_plane, float far_plane, const glm::vec3& lookat) : BaseCameraEntity(fov, loc, near_plane, far_plane), lookat(lookat) {}
69 
70  virtual glm::mat4 getView() const override;
71  virtual glm::vec3 getViewDir() const override;
72 
73 
74  glm::vec3 lookat = vec3(0.0);
75  glm::vec3 updir = vec3(0.0, 1.0, 0.0);
76 };
77 
79 public:
81  FreeLookCamera(float fov, const glm::vec3 &loc) : BaseCameraEntity(fov, loc) {}
82  FreeLookCamera(float fov, const glm::vec3 &loc, float near_plane, float far_plane) : BaseCameraEntity(fov, loc, near_plane, far_plane) {}
83 
85  public:
86  void updateLookWithMouse(const glm::dvec2& mouse, double width, double height);
87 
88  inline void resetFactors() {
89  forward_factor = right_strafe_factor = elevate_factor = 0.0;
90  }
91 
92  double mouse_sensitivity = 1.0;
93  double forward_factor = 0.0;
94  double right_strafe_factor = 0.0;
95  double elevate_factor = 0.0;
96  glm::dvec2 look_factor = glm::dvec2(0.0,0.0);
97 
98  private:
99  glm::dvec2 lastmouse = glm::dvec2(std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN());
100  };
101 
102  virtual glm::mat4 getView() const override;
103  virtual glm::vec3 getViewDir() const override;
104  virtual glm::vec3 getViewDir(const Pose& aPoseOverride) const override;
105  virtual glm::mat4 getView(const Pose& aPoseOverride) const override;
106 
107  virtual double getSpeed() const {return(speed);}
108  virtual double getBoostedSpeed() const {return(boosted_speed);}
109  virtual void setSpeed(double speed) {this->speed = speed;}
110  virtual void setBoostedSpeed(double speed) {boosted_speed = speed;}
111 
112  virtual void driveCamera(const NavigationParameters& parameters);
113 
114 #ifdef ENABLE_WORLD_GLFW_UTILITIES
115  virtual void collectAndDrive(GLFWwindow* window);
116  static void collect_camera_controls(GLFWwindow* window, NavigationParameters& params, double speed = 2.0, double boosted_speed = 8.0, double crawl_speed = 0.5);
117 #endif
118 
119 protected:
120  double azimuth = 0.0;
121  double angle = 0.0;
122  double speed = 2.0;
123  double boosted_speed = 8.0;
124  double crawl_speed = 0.5;
125  glm::vec3 updir = vec3(0.0, 1.0, 0.0);
126 };
127 
128 
130  public:
132  FollowCamera(float fov, vec3 start_pos, float linear_acceleration_factor = 3.0f, float base_velocity_factor = .6f, float follow_distance = 2.0f, float distance_exponent = 2.0f)
133  : BaseCameraEntity(fov, start_pos), linear_acceleration_factor(linear_acceleration_factor), base_velocity_factor(base_velocity_factor), follow_distance(follow_distance), distance_exponent(distance_exponent) {}
134 
135 
136  virtual void follow_explicit(
137  double frametime, vec3 target, vec3 offset, vec3 viewtarget,
138  float linear_acceleration_parameter, float base_velocity_parameter,
139  float follow_distance_parameter, float distance_exponent_parameter
140  );
141  virtual void follow(double frametime, vec3 target, vec3 offset, vec3 viewtarget);
142  virtual void reset(const vec3& start_pos);
143  virtual glm::mat4 getView() const {return(look);}
144  virtual vec3 getViewDir() const{return(vec3(look*vec4(0.0,0.0,1.0,1.0)));}
145 
146  float getMaximumDistance() const {return(max_distance);}
147  void setMaximumDistance(float max_distance) {this->max_distance = max_distance;}
148  float getAccelerationFactor() {return(linear_acceleration_factor);}
149  void setAccelerationFactor(float linear_acceleration_factor) {this->linear_acceleration_factor = linear_acceleration_factor;}
150  float getFollowLength() {return(follow_distance);}
151  void setFollowLength(float follow_distance) {follow_distance = follow_distance;}
152 
153  protected:
154  vec3 velocity = vec3(0.0);
155  float linear_acceleration_factor = 3.0f;
156  float base_velocity_factor = .1f;
157  float follow_distance = 2.0f;
158  float distance_exponent = 2.5f;
159  float max_distance = 500.0f;
160 
161  mat4 look;
162 };
163 
164 #endif
Definition: CameraEntities.hpp:78
Definition: CameraEntities.hpp:84
Definition: CameraEntities.hpp:21
Definition: EntitiesBase.hpp:82
Definition: EntitiesBase.hpp:59
Definition: CameraEntities.hpp:63
Definition: Pose.hpp:11
Definition: CameraEntities.hpp:129
Definition: camera.hpp:7