// // Created by kj16609 on 7/23/24. // #include "CameraManager.hpp" #include "GBufferRenderer.hpp" #include "RenderCamera.hpp" #include "engine/debug/DEBUG_NAMES.hpp" #include "engine/math/literals/size.hpp" namespace fgl::engine { using namespace fgl::literals::size_literals; inline static CameraManager* camera_manager_instance { nullptr }; CameraManager::CameraManager() : m_renderer( std::make_shared< GBufferRenderer >() ), m_data_buffer( 4_KiB, vk::BufferUsageFlagBits::eUniformBuffer, vk::MemoryPropertyFlagBits::eHostVisible ) { FGL_ASSERT( camera_manager_instance == nullptr, "CameraManager already initialized" ); camera_manager_instance = this; m_data_buffer->setDebugName( "Camera data buffer" ); } CameraManager::~CameraManager() { m_primary_camera.reset(); camera_manager_instance = nullptr; } std::vector< std::weak_ptr< RenderCamera > >& CameraManager::getCameras() { return cameras; } std::shared_ptr< RenderCamera >& CameraManager::getPrimary() { return m_primary_camera; } void CameraManager::createPrimary() { m_primary_camera = createCamera( { 1920, 1080 } ); m_primary_camera->setName( CAMERA_EDITOR_NAME ); } CameraManager& CameraManager::instance() { FGL_ASSERT( camera_manager_instance, "CameraManager not initialized" ); return *camera_manager_instance; } std::shared_ptr< RenderCamera > CameraManager::createCamera( const vk::Extent2D extent ) { auto& instance = CameraManager::instance(); std::shared_ptr< RenderCamera > camera { new RenderCamera( extent, instance.m_data_buffer, instance.m_renderer ) }; instance.cameras.emplace_back( camera ); return camera; } std::shared_ptr< CameraViewpoint > CameraManager::createViewpoint( const vk::Extent2D extent ) { auto& instance = CameraManager::instance(); std::shared_ptr< CameraViewpoint > camera_viewpoint { new CameraViewpoint( instance.m_data_buffer, extent ) }; return camera_viewpoint; } } // namespace fgl::engine