CSEngine
Loading...
Searching...
No Matches
CameraComponent.h
1#pragma once
2
3#include "SComponent.h"
4#include "../Util/Vector.h"
5#include "../Util/Render/CameraBase.h"
6
7namespace CSE {
9 mat4 camera;
10 mat4 projection;
11 vec3 cameraPosition;
12 bool isCube;
13
14 CameraMatrixStruct(const mat4& camera, const mat4& projection, const vec3& cameraPosition, bool isCube = false)
15 : camera(camera), projection(projection), cameraPosition(cameraPosition), isCube(isCube) {}
16 };
17
18 static mat4 CubeCameraMatrix[] = {
19 mat4::LookAt(vec3(0.0f, 0.0f, 0.0f), vec3(1.0f, 0.0f, 0.0f), vec3(0.0f, -1.0f, 0.0f)),
20 mat4::LookAt(vec3(0.0f, 0.0f, 0.0f), vec3(-1.0f, 0.0f, 0.0f), vec3(0.0f, -1.0f, 0.0f)),
21 mat4::LookAt(vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f), vec3(0.0f, 0.0f, 1.0f)),
22 mat4::LookAt(vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, -1.0f, 0.0f), vec3(0.0f, 0.0f, -1.0f)),
23 mat4::LookAt(vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, 1.0f), vec3(0.0f, -1.0f, 0.0f)),
24 mat4::LookAt(vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 0.0f, -1.0f), vec3(0.0f, -1.0f, 0.0f))
25 };
26
27 class SFrameBuffer;
28 class STexture;
29 class GLProgramHandle;
30
31 class CameraComponent : public SComponent, public CameraBase {
32 public:
33 enum CAMERATYPE {
34 PERSPECTIVE = 1, ORTHO = 2, CUBE = 3
35 };
36 public:
37 COMPONENT_DEFINE_CONSTRUCTOR(CameraComponent);
38
39 ~CameraComponent() override;
40
41 void Exterminate() override;
42
43 void Init() override;
44
45 void Tick(float elapsedTime) override;
46
47 SComponent* Clone(SGameObject* object) override;
48
49 void CopyReference(SComponent* src, std::map<SGameObject*, SGameObject*> lists_obj,
50 std::map<SComponent*, SComponent*> lists_comp) override;
51
52 void SetValue(std::string name_str, Arguments value) override;
53
54 std::string PrintValue() const override;
55
56 mat4 GetCameraMatrix() const;
57
58 vec3 GetCameraPosition() const;
59
60 mat4 GetProjectionMatrix() const {
61 if (!m_isProjectionInited) {
62 SetProjectionMatrix();
63 }
64 return m_projectionMatrix;
65 }
66
67 CameraMatrixStruct GetCameraMatrixStruct() const override;
68
69 void SetTargetVector(const vec3& target);
70
71 void SetTarget(SGameObject* gameObject);
72
73 void SetUp(const vec3& up);
74
75 void SetCameraType(CAMERATYPE type);
76
77 void SetPerspectiveFov(float fov);
78
79 void SetZDepthRange(float near, float far);
80
81 void SetPerspective(float fov, float near, float far);
82
83 void SetOrtho(float left, float right, float top, float bottom);
84
85 void SetCubeCamera();
86
87 void SetProjectionMatrix() const;
88
89 SFrameBuffer* GetFrameBuffer() const override;
90
91 void SetFrameBuffer(SFrameBuffer* frameBuffer);
92
93 BackgroundType GetBackgroundType() override;
94
95 void RenderBackground() const override;
96
97 void SetBackgroundSkybox(STexture* skyboxTexture = nullptr);
98
99 void SetBackgroundColor(vec3&& color);
100
101 void SetBackgroundType(BackgroundType type);
102
103 private:
104 struct BackgroundMapStruct {
105 STexture* map = nullptr;
106 unsigned short mapId = 0;
107 unsigned short viewId = 0;
108 unsigned short projectionId = 0;
109 };
110
111 private:
112 void SetCameraMatrix();
113
114 private:
115 vec3* m_eye;
116 vec3 m_target = vec3(0, 0, -1);
117 vec3 m_up = vec3(0, 1, 0);
118 SGameObject* m_targetObject;
119
120 mutable mat4 m_cameraMatrix;
121 mutable mat4 m_projectionMatrix;
122 vec3 m_resultTarget;
123 SFrameBuffer* m_frameBuffer = nullptr;
124
125 CAMERATYPE m_type = PERSPECTIVE;
126 mutable bool m_isProjectionInited = false;
127
128 //perspective
129 float m_pFov = 45.f;
130 float* m_pRatio;
131
132 //Orthographic
133 float m_oLeft = -1.f;
134 float m_oRight = 1.f;
135 float m_oBottom = -1.f;
136 float m_oTop = 1.f;
137
138 float m_Near = 0.1f;
139 float m_Far = 100.f;
140
141 //Background
142 BackgroundType m_backgroundType = SOLID;
143 vec3 m_backgroundColor = vec3(0.4f, 0.4f, 0.4f);
144 BackgroundMapStruct* m_backgroundMap = nullptr;
145 GLProgramHandle* m_globalSkyboxHandle = nullptr;
146 };
147}
void SetValue(std::string name_str, Arguments value) override