#include "Rendering/SceneRenderRequestPlanner.h" #include "Rendering/SceneRenderRequestUtils.h" #include "Scene/Scene.h" #include namespace XCEngine { namespace Rendering { std::vector SceneRenderRequestPlanner::CollectCameras( const Components::Scene& scene, Components::CameraComponent* overrideCamera) const { std::vector cameras; if (SceneRenderRequestUtils::IsUsableCamera(overrideCamera)) { cameras.push_back(overrideCamera); return cameras; } cameras = scene.FindObjectsOfType(); cameras.erase( std::remove_if( cameras.begin(), cameras.end(), [](const Components::CameraComponent* camera) { return !SceneRenderRequestUtils::IsUsableCamera(camera); }), cameras.end()); SceneRenderRequestUtils::SortSceneCamerasForRendering(cameras); return cameras; } std::vector SceneRenderRequestPlanner::BuildRequests( const Components::Scene& scene, Components::CameraComponent* overrideCamera, const RenderContext& context, const RenderSurface& surface) const { std::vector requests; const std::vector cameras = CollectCameras(scene, overrideCamera); size_t renderedBaseCameraCount = 0; for (Components::CameraComponent* camera : cameras) { CameraRenderRequest request; if (!SceneRenderRequestUtils::BuildCameraRenderRequest( scene, *camera, context, surface, renderedBaseCameraCount, requests.size(), request)) { continue; } requests.push_back(request); if (camera->GetStackType() == Components::CameraStackType::Base) { ++renderedBaseCameraCount; } } return requests; } } // namespace Rendering } // namespace XCEngine