RavEngine
Loading...
Searching...
No Matches
CameraComponent.hpp
1#pragma once
2#if !RVE_SERVER
3
4#include "Entity.hpp"
5#include "Transform.hpp"
6#include "ComponentWithOwner.hpp"
7#include "PostProcess.hpp"
8#include "Array.hpp"
9#include "Tonemap.hpp"
10
11namespace RavEngine {
12 class RenderEngine;
13 class RenderTexture;
15 protected:
16 friend class RenderEngine;
17 public:
18 CameraComponent(Entity owner, float inFOV = 60, float inNearClip = 0.1, float inFarClip = 100) : FOV(inFOV), nearClip(inNearClip), farClip(inFarClip), ComponentWithOwner(owner){}
19
20 virtual ~CameraComponent() {}
21
22 MOVE_NO_COPY(CameraComponent);
23
28 constexpr inline void SetActive(bool newState){
29 active = newState;
30 }
31
35 constexpr inline bool IsActive() const{
36 return active;
37 }
38
39 enum class Mode {
40 Perspective,
41 Orthographic
42 };
43
47 constexpr inline matrix4 GenerateProjectionMatrix(uint32_t width, uint32_t height) const{
48 switch(projection){
49 case Mode::Perspective:
50 return matrix4(RMath::perspectiveProjection(deg_to_rad(FOV), (float)width / height, nearClip, farClip));
51 break;
52 case Mode::Orthographic:
53 return matrix4(RMath::orthoProjection(0.0f,static_cast<float>(width),static_cast<float>(height),0.0f,nearClip,farClip));
54 break;
55 default:
56 assert(false);
57 return matrix4(1); // this should never happen
58 }
59 }
60
65
66 return glm::inverse(GetOwner().GetTransform().GetWorldMatrix());
67 }
68
74 inline vector3 ScreenPointToWorldPoint(const vector3& point, uint32_t width, uint32_t height) const{
75 auto projmat = GenerateProjectionMatrix(width, height);
77 auto G = glm::inverse(projmat * viewmat);
78 return glm::unProject(point, G, projmat, vector4(0,0,width,height));
79 }
80
86 inline vector3 NormalizedScreenPointToWorldPoint(const vector3& point, uint32_t width, uint32_t height) const {
87 return ScreenPointToWorldPoint(vector3(point.x * width, point.y * height, point.z), width, height);
88 }
89
90 inline std::pair<vector3,vector3> ScreenPointToRay(vector2 point, uint32_t width, uint32_t height) const {
91 vector2 scaledWindowsSize = vector2(width, height);
92 point.y = height - point.y; // invert Y
93 point = (point / scaledWindowsSize ) * 2.0f - vector2(1.0f);
94
97
98 vector4 originClipSpace{ point,-1,1 };
99 vector4 destClipSpace{ point,1,1 };
100 vector4 originClipSpaceWS = invViewProjection * originClipSpace;
101 vector4 destClipSpaceWS = invViewProjection * destClipSpace;
102 vector3 originClipSpaceWS3 = vector3(originClipSpaceWS) / originClipSpaceWS.w;
103 vector3 destClipSpaceWS3 = vector3(destClipSpaceWS) / destClipSpaceWS.w;
104
105 return { originClipSpaceWS3, glm::normalize(destClipSpaceWS3 - originClipSpaceWS3) };
106 }
107
108 //camera details
109 float FOV;
110 float nearClip;
111 float farClip;
112
113 renderlayer_t renderLayers = ALL_LAYERS;
114
115 ViewportOverride viewportOverride;
116
117 Ref<RenderTexture> target; // if unset, renders to the screen
118
119 PostProcessEffectStack postProcessingEffects;
120
121 Ref<TonemapPassInstance> tonemap;
122 IndirectLightingSettings indirectLightingSettings;
123
124
125 protected:
126 Mode projection = Mode::Perspective;
127 bool active = false;
128 };
129}
130#endif
Definition ComponentWithOwner.hpp:17
Definition CameraComponent.hpp:14
vector3 ScreenPointToWorldPoint(const vector3 &point, uint32_t width, uint32_t height) const
Definition CameraComponent.hpp:74
constexpr bool IsActive() const
Definition CameraComponent.hpp:35
matrix4 GenerateViewMatrix() const
Definition CameraComponent.hpp:64
vector3 NormalizedScreenPointToWorldPoint(const vector3 &point, uint32_t width, uint32_t height) const
Definition CameraComponent.hpp:86
constexpr void SetActive(bool newState)
Definition CameraComponent.hpp:28
constexpr matrix4 GenerateProjectionMatrix(uint32_t width, uint32_t height) const
Definition CameraComponent.hpp:47
Definition ComponentWithOwner.hpp:6
Definition RenderEngine.hpp:64
Definition concurrentqueue.h:747
GLM_FUNC_QUALIFIER vec< L, T, Q > normalize(vec< L, T, Q > const &x)
Definition func_geometric.inl:190
GLM_FUNC_QUALIFIER mat< C, R, T, Q > inverse(mat< C, R, T, Q > const &m)
Definition func_matrix.inl:388
GLM_FUNC_DECL vec< 3, T, Q > unProject(vec< 3, T, Q > const &win, mat< 4, 4, T, Q > const &model, mat< 4, 4, T, Q > const &proj, vec< 4, U, Q > const &viewport)
Definition matrix_projection.inl:79
Definition Animation.hpp:6
Definition Entity.hpp:11
Definition qualifier.hpp:36
Definition qualifier.hpp:35