기존에는 RenderDemo에서 직접적으로 _camera, _objs, LightDesc 등을 관리하면서 모든 오브젝트와 조명을 수동으로 Update 및 렌더링했음.
_camera->Update();
RENDER->Update();
RENDER->PushLightData(lightDesc);
INSTANCING->Render(_objs);
이 방식은 기능이 추가될수록 관리 포인트가 늘어나며, 재사용성도 떨어지는 구조.
→ Scene 단위로 관리하고, 컴포넌트 기반 시스템으로 리팩토링이 필요
SceneManager를 통해 씬 전환 및 관리Update, LateUpdate, Render 등 게임 루프 분리 처리기존 LightDesc를 단순 변수로 처리하지 않고, GameObject에 붙이는 방식으로 리팩토링
class Light : public Component
{
public:
virtual void Update() override;
LightDesc& GetLightDesc() { return _desc; }
void SetAmbient(const Color& color);
void SetLightDirection(Vec3 dir);
// ...
private:
LightDesc _desc;
};
void Light::Update()
{
RENDER->PushLightData(_desc);
}
이제 Light도 다른 컴포넌트처럼 GameObject에 붙여서 씬에 배치하면 자동으로 렌더링 시 반영됨.
shared_ptr<Light> GameObject::GetLight()
{
auto component = GetFixedComponent(ComponentType::Light);
return static_pointer_cast<Light>(component);
}
오브젝트 추가/제거, Update/LateUpdate 호출, Instancing 처리까지 담당
class Scene
{
void Add(shared_ptr<GameObject> object);
void Update();
void LateUpdate();
private:
unordered_set<shared_ptr<GameObject>> _objects;
unordered_set<shared_ptr<GameObject>> _cameras;
unordered_set<shared_ptr<GameObject>> _lights;
};
현재 Scene 관리 및 Scene 전환 기능
class SceneManager
{
template<typename T>
void ChangeScene(shared_ptr<T> scene) { _currentScene = scene; scene->Start(); }
void Update() { _currentScene->Update(); _currentScene->LateUpdate(); }
};
SCENE, CUR_SCENE 매크로 등록해서 전역에서 쉽게 접근하도록 설정:
#define SCENE GET_SINGLE(SceneManager)
#define CUR_SCENE SCENE->GetCurrentScene()
SCENE->Update() → Game 루프에 추가Camera::Update() → View/Proj 행렬 Push 책임 분담void Camera::Update()
{
UpdateMatrix();
RENDER->PushGlobalData(Camera::S_MatView, Camera::S_MatProjection);
}
기존 RenderDemo는 삭제하고 SceneDemo에서 모든 객체와 컴포넌트는 CUR_SCENE->Add(...) 방식으로 Scene에 등록
auto obj = make_shared<GameObject>();
obj->AddComponent(...);
CUR_SCENE->Add(obj);
Camera, Light, Animation, Model, Mesh 모두 이 방식으로 처리함