CSEngine
Loading...
Searching...
No Matches
RenderComponent.cpp
1#include "RenderComponent.h"
2#include "../Manager/Render/RenderMgr.h"
3#include "../Manager/LightMgr.h"
4#include "../Manager/EngineCore.h"
5#include "../Util/Render/ShaderUtil.h"
6#include "../Util/Render/SMaterial.h"
7#include "../Util/Settings.h"
8#include "TransformComponent.h"
9#include "DrawableSkinnedMeshComponent.h"
10
11using namespace CSE;
12
13COMPONENT_CONSTRUCTOR(RenderComponent) {
14 m_renderMgr = CORE->GetCore(RenderMgr);
15 SetMaterial(nullptr);
16}
17
18RenderComponent::~RenderComponent() = default;
19
20void RenderComponent::Exterminate() {
21 if (material != nullptr) {
22 const auto& mode = material->GetMode();
23 if (m_renderMgr != nullptr) {
24 m_renderMgr->Remove(this, (RenderContainer::RenderGroupMode) mode);
25 m_renderMgr->Remove(this, RenderContainer::DEPTH_ONLY);
26 }
27 }
28 SAFE_DELETE(m_material_clone);
29 material = nullptr;
30}
31
32void RenderComponent::Init() {
33
34 if (!m_disableShadow) {
35 m_renderMgr->Register(this, RenderContainer::DEPTH_ONLY);
36 }
37
38 m_mesh = gameObject->GetComponent<DrawableStaticMeshComponent>();
39 //TODO: 반드시 리플렉션 시스템에서 상속 문제도 해결할 수 있도록! 2222
40 if (m_mesh == nullptr) m_mesh = gameObject->GetComponent<DrawableSkinnedMeshComponent>();
41 if (m_mesh != nullptr) {
42 m_skinningMesh = dynamic_cast<DrawableSkinnedMeshComponent*>(m_mesh);
43 }
44
45 if (material == nullptr) {
46 isEnable = isRenderActive = false;
47 }
48
49 isRenderActive = isEnable;
50}
51
52void RenderComponent::Tick(float elapsedTime) {
53
54 if (m_mesh == nullptr) {
55 m_mesh = gameObject->GetComponent<DrawableStaticMeshComponent>();
56 //TODO: 반드시 리플렉션 시스템에서 상속 문제도 해결할 수 있도록!
57 if (m_mesh == nullptr) m_mesh = gameObject->GetComponent<DrawableSkinnedMeshComponent>();
58 if (m_mesh != nullptr) {
59 m_skinningMesh = dynamic_cast<DrawableSkinnedMeshComponent*>(m_mesh);
60 }
61 }
62}
63
64void
65RenderComponent::SetMatrix(const CameraMatrixStruct& cameraMatrixStruct, const GLProgramHandle* handle) {
66 ShaderUtil::BindCameraToShader(*handle, cameraMatrixStruct.camera, cameraMatrixStruct.cameraPosition,
67 cameraMatrixStruct.projection,
68 static_cast<const TransformComponent*>(gameObject->GetTransform())->GetMatrix());
69}
70
71void RenderComponent::Render(const GLProgramHandle* handle) const {
72
73 if (m_mesh == nullptr || m_material_clone == nullptr || gameObject->isPrefab()) return;
74
75 SetJointMatrix(handle);
76 ShaderUtil::BindAttributeToShader(*handle, m_mesh->GetMeshID());
77}
78
79void RenderComponent::SetIsEnable(bool is_enable) {
80 SComponent::SetIsEnable(is_enable);
81
82 isRenderActive = isEnable;
83}
84
85SComponent* RenderComponent::Clone(SGameObject* object) {
86 INIT_COMPONENT_CLONE(RenderComponent, clone);
87
88 clone->isRenderActive = isRenderActive;
89 clone->SetMaterial(material);
90
91 return clone;
92}
93
94void RenderComponent::SetJointMatrix(const GLProgramHandle* handle) const {
95 ShaderUtil::BindSkinningDataToShader(*handle, m_mesh->GetMeshID(),
96 m_skinningMesh != nullptr ?
97 m_skinningMesh->GetJointMatrix() : std::vector<mat4>());
98}
99
100SMaterial* RenderComponent::GetMaterial() const {
101 return m_material_clone;
102}
103
104void RenderComponent::SetMaterial(SMaterial* material) {
105 auto renderMgr = CORE->GetCore(RenderMgr);
106 if (this->material == nullptr)
107 this->material = SResource::Create<SMaterial>(Settings::GetDefaultDeferredMaterialId());
108 else {
109 const auto& mode = this->material->GetMode();
110 renderMgr->Remove(this, (RenderContainer::RenderGroupMode) mode);
111 this->material = material;
112 }
113
114 const auto& mode = this->material->GetMode();
115 renderMgr->Register(this, (RenderContainer::RenderGroupMode) mode);
116
117 SAFE_DELETE(m_material_clone)
118 m_material_clone = new SMaterial(this->material);
119}
120
121void RenderComponent::SetValue(std::string name_str, VariableBinder::Arguments value) {
122 if (name_str == "material") {
123 SetMaterial(SResource::Create<SMaterial>(value[0]));
124 }
125}
126
127std::string RenderComponent::PrintValue() const {
128 PRINT_START("component");
129
130 PRINT_RES(material);
131
132 PRINT_END("component");
133}
void SetValue(std::string name_str, Arguments value) override
Class for managing rendering operations.
Definition RenderMgr.h:24
static void BindAttributeToShader(const GLProgramHandle &handle, const GLMeshID &meshId)
Binds the attributes to the shader.
static void BindSkinningDataToShader(const GLProgramHandle &handle, const GLMeshID &meshId, const std::vector< mat4 > &jointMatrix)
Binds the skinning data to the shader.
static void BindCameraToShader(const GLProgramHandle &handle, const mat4 &camera, const vec3 &cameraPosition, const mat4 &projection, const mat4 &transform)
Binds the camera data to the shader.