#pragma once #include "Base/Structs.h" class PostProcessingMaterial; class BaseMaterial; class PhysxProxy; class CameraComponent; class GameObject; class GameScene { public: GameScene(std::wstring sceneName); GameScene(const GameScene& other) = delete; GameScene(GameScene&& other) noexcept = delete; GameScene& operator=(const GameScene& other) = delete; GameScene& operator=(GameScene&& other) noexcept = delete; virtual ~GameScene(); template std::enable_if_t, T*> AddChild(T* pObject) { AddChild_(pObject); return pObject; } void AddChild_(GameObject* pObject); void RemoveChild(GameObject* pObject, bool deleteObject = false); void LateRemoveChild(GameObject* pObject) { m_pLateRemoveChildren.emplace_back(pObject); } void DeleteAllChildren(); const SceneContext& GetSceneContext() const { return m_SceneContext; } SceneSettings& GetSceneSettings() { return m_SceneContext.settings; } CameraComponent* GetActiveCamera() const { return m_pActiveCamera; } void AddPostProcessingEffect(PostProcessingMaterial* pMaterial); void AddPostProcessingEffect(UINT materialId); void RemovePostProcessingEffect(PostProcessingMaterial* pMaterial); void RemovePostProcessingEffect(UINT materialId); PhysxProxy* GetPhysxProxy() const { return m_pPhysxProxy; } void SetActiveCamera(CameraComponent* pCameraComponent); protected: virtual void Initialize() = 0; virtual void PostInitialize() {}; virtual void Update() {}; virtual void Draw() {}; virtual void PostDraw() {}; virtual void ShadowDraw() {}; virtual void OnGUI(){} virtual void OnSceneActivated() {} virtual void OnSceneDeactivated() {} SceneContext m_SceneContext{}; std::vector m_pLateRemoveChildren{}; private: friend class SceneManager; void RootInitialize(const GameContext& /*gameContext*/); void RootPostInitialize(); void RootUpdate(); void RootDraw(); void RootOnSceneActivated(); void RootOnSceneDeactivated(); void RootOnGUI(); void RootWindowStateChanged(int state, bool active) const; std::vector m_pChildren{}; bool m_IsInitialized{}; std::wstring m_SceneName{}; CameraComponent* m_pDefaultCamera{}, * m_pActiveCamera{}; PhysxProxy* m_pPhysxProxy{}; std::vector m_PostProcessingMaterials{}; OverlordGame* m_pGame{}; };