1#include "CameraComponent.h"
2#include "TransformComponent.h"
3#include "../Manager/CameraMgr.h"
4#include "../Manager/EngineCore.h"
5#include "../Util/Render/SFrameBuffer.h"
6#include "../Util/Render/STexture.h"
7#include "../Util/Render/ShaderUtil.h"
13COMPONENT_CONSTRUCTOR(
CameraComponent), m_eye(
nullptr), m_targetObject(
nullptr) {
14 auto cameraMgr = CORE->GetCore(
CameraMgr);
15 cameraMgr->Register(
this);
16 m_pRatio =
const_cast<float*
>(cameraMgr->GetProjectionRatio());
17 m_globalSkyboxHandle = cameraMgr->GetSkyboxProgram();
20CameraComponent::~CameraComponent() =
default;
22void CameraComponent::Exterminate() {
23 SAFE_DELETE(m_backgroundMap);
27void CameraComponent::Init() {
30 m_resultTarget =
vec3();
31 m_pRatio =
const_cast<float*
>(CORE->GetCore(
CameraMgr)->GetProjectionRatio());
35void CameraComponent::Tick(
float elapsedTime) {
36 if(m_type == CUBE)
return;
38 if (m_targetObject ==
nullptr)
39 m_resultTarget = *m_eye + m_target;
41 m_resultTarget = *
static_cast<TransformComponent*
>(m_targetObject->GetTransform())->GetPosition();
50 comp->m_target = m_target;
53 comp->m_cameraMatrix = m_cameraMatrix;
54 comp->m_projectionMatrix = m_projectionMatrix;
55 comp->m_resultTarget = m_resultTarget;
56 comp->m_frameBuffer = m_frameBuffer;
58 comp->m_type = m_type;
59 comp->m_isProjectionInited = m_isProjectionInited;
62 comp->m_pFov = m_pFov;
63 comp->m_pRatio = m_pRatio;
66 comp->m_oLeft = m_oLeft;
67 comp->m_oRight = m_oRight;
68 comp->m_oBottom = m_oBottom;
69 comp->m_oTop = m_oTop;
71 comp->m_Near = m_Near;
75 comp->m_backgroundType = m_backgroundType;
76 comp->m_backgroundColor = m_backgroundColor;
77 if(comp->m_backgroundMap ==
nullptr) comp->m_backgroundMap =
new BackgroundMapStruct();
78 comp->m_backgroundMap->map = m_backgroundMap->map;
79 comp->m_backgroundMap->mapId = m_backgroundMap->mapId;
80 comp->m_backgroundMap->viewId = m_backgroundMap->viewId;
81 comp->m_backgroundMap->projectionId = m_backgroundMap->projectionId;
86void CameraComponent::CopyReference(
SComponent* src, std::map<SGameObject*, SGameObject*> lists_obj,
87 std::map<SComponent*, SComponent*> lists_comp) {
88 if (src ==
nullptr)
return;
92 FIND_OBJ_REFERENCE(m_targetObject, convert);
96void CameraComponent::SetTargetVector(
const vec3& target) {
100void CameraComponent::SetTarget(
SGameObject* gameObject) {
101 m_targetObject = gameObject;
104void CameraComponent::SetUp(
const vec3& up) {
108void CameraComponent::SetCameraType(CAMERATYPE type) {
112void CameraComponent::SetPerspectiveFov(
float fov) {
116void CameraComponent::SetZDepthRange(
float near,
float far) {
122void CameraComponent::SetPerspective(
float fov,
float near,
float far) {
123 m_type = PERSPECTIVE;
130void CameraComponent::SetOrtho(
float left,
float right,
float top,
float bottom) {
138void CameraComponent::SetCubeCamera() {
142void CameraComponent::SetCameraMatrix() {
143 m_cameraMatrix = mat4::LookAt(*m_eye, m_resultTarget, m_up);
146mat4 CameraComponent::GetCameraMatrix()
const {
147 return m_cameraMatrix;
150vec3 CameraComponent::GetCameraPosition()
const {
152 return vec3{ matrix.w.x, matrix.w.y, matrix.w.z };
155void CameraComponent::SetProjectionMatrix()
const {
161 m_projectionMatrix = mat4::Perspective(m_pFov, *m_pRatio, m_Near, m_Far);
164 m_projectionMatrix = mat4::Ortho(m_oLeft, m_oRight, m_oTop, m_oBottom, m_Near, m_Far);
167 m_projectionMatrix = mat4::Perspective(90.0f, 1.0f, 0.1f, 10.0f);
171 m_isProjectionInited =
true;
176 if (name_str ==
"m_target") {
178 }
else if (name_str ==
"m_up") {
180 }
else if (name_str ==
"m_targetObject") {
181 if(value.size() <= 0)
return;
182 m_targetObject = SGameObject::FindByHash(value[0]);
183 }
else if (name_str ==
"m_cameraMatrix") {
184 SET_MAT4(m_cameraMatrix);
185 }
else if (name_str ==
"m_projectionMatrix") {
186 SET_MAT4(m_projectionMatrix);
187 }
else if (name_str ==
"m_type") {
188 m_type =
static_cast<CAMERATYPE
>(std::stoi(value[0]));
189 }
else if (name_str ==
"m_pFov") {
190 m_pFov = std::stof(value[0]);
191 }
else if (name_str ==
"m_orthoValue") {
192 m_oLeft = std::stof(value[0]);
193 m_oRight = std::stof(value[1]);
194 m_oBottom = std::stof(value[2]);
195 m_oTop = std::stof(value[3]);
197 }
else if (name_str ==
"m_distance") {
198 m_Near = std::stof(value[0]);
199 m_Far = std::stof(value[1]);
200 }
else if (name_str ==
"m_frameBuffer") {
201 m_frameBuffer = SResource::Create<SFrameBuffer>(value[0]);
202 }
else if (name_str ==
"m_backgroundType") {
203 m_backgroundType =
static_cast<BackgroundType
>(std::stoi(value[0]));
204 }
else if (name_str ==
"m_backgroundColor") {
205 SET_VEC3(m_backgroundColor);
206 }
else if (name_str ==
"m_backgroundMap.map") {
207 SetBackgroundSkybox(SResource::Create<STexture>(value[0]));
212std::string CameraComponent::PrintValue()
const {
213 PRINT_START(
"component");
215 PRINT_VALUE_VEC3(m_target);
216 PRINT_VALUE_VEC3(m_up);
217 PRINT_VALUE(
"obj", m_targetObject, m_targetObject ==
nullptr ?
"" : ConvertSpaceStr(m_targetObject->GetHash()));
218 PRINT_VALUE_MAT4(m_cameraMatrix);
219 PRINT_VALUE_MAT4(m_projectionMatrix);
220 PRINT_VALUE(
"int", m_type,
static_cast<int>(m_type));
221 PRINT_VALUE(
"float", m_pFov, m_pFov);
222 PRINT_VALUE(
"vec4", m_orthoValue, m_oLeft,
' ', m_oRight,
' ', m_oBottom,
' ', m_oTop);
223 PRINT_VALUE(
"vec2", m_distance, m_Near,
' ', m_Far);
224 if (m_frameBuffer !=
nullptr) PRINT_RES_NAME(m_frameBuffer, m_frameBuffer);
226 PRINT_VALUE(
"int", m_backgroundType,
static_cast<int>(m_backgroundType));
227 PRINT_VALUE_COLOR3(m_backgroundColor);
228 if (m_backgroundMap !=
nullptr && m_backgroundMap->map !=
nullptr)
229 PRINT_RES_NAME(m_backgroundMap.map, m_backgroundMap->map);
231 PRINT_END(
"component");
235 return { m_cameraMatrix, GetProjectionMatrix(), GetCameraPosition() };
239 return m_frameBuffer;
242void CameraComponent::SetFrameBuffer(
SFrameBuffer* frameBuffer) {
243 m_frameBuffer = frameBuffer;
246CameraBase::BackgroundType CameraComponent::GetBackgroundType() {
247 return m_backgroundType;
250void CameraComponent::RenderBackground()
const {
251 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
253 switch (m_backgroundType) {
255 glClearColor(m_backgroundColor.x, m_backgroundColor.y, m_backgroundColor.z, 1.0f);
256 glClear(GL_COLOR_BUFFER_BIT);
259 const auto& mapStruct = m_backgroundMap;
260 if (mapStruct->map ==
nullptr)
return;
262 glUseProgram(m_globalSkyboxHandle->Program);
263 m_globalSkyboxHandle->SetUniformMat4(
"PROJECTION_MATRIX", m_projectionMatrix);
264 auto viewMatrix =
mat4(m_cameraMatrix.ToMat3());
265 m_globalSkyboxHandle->SetUniformMat4(
"VIEW_MATRIX", viewMatrix);
266 mapStruct->map->Bind(mapStruct->mapId, 0);
268 glDisable(GL_CULL_FACE);
269 glDisable(GL_DEPTH_TEST);
270 ShaderUtil::BindAttributeToCubeMap();
271 glEnable(GL_DEPTH_TEST);
272 glEnable(GL_CULL_FACE);
277void CameraComponent::SetBackgroundSkybox(
STexture* skyboxTexture) {
278 if (skyboxTexture ==
nullptr) {
279 skyboxTexture = SResource::Get<STexture>(
"envCubemap.textureCubeMap");
281 if (m_backgroundMap ==
nullptr) m_backgroundMap =
new BackgroundMapStruct();
283 m_backgroundMap->map = skyboxTexture;
284 m_backgroundMap->mapId =
static_cast<unsigned short>(m_globalSkyboxHandle->UniformLocation(
"ENV_MAP")->
id);
285 m_backgroundMap->viewId =
static_cast<unsigned short>(m_globalSkyboxHandle->UniformLocation(
"VIEW_MATRIX")->
id);
286 m_backgroundMap->projectionId =
static_cast<unsigned short>(m_globalSkyboxHandle->UniformLocation(
287 "PROJECTION_MATRIX")->
id);
290void CameraComponent::SetBackgroundColor(
vec3&& color) {
291 m_backgroundColor = color;
294void CameraComponent::SetBackgroundType(CameraBase::BackgroundType type) {
295 m_backgroundType = type;
void SetValue(std::string name_str, Arguments value) override