#include #include #include "CWallpaper.h" #include "RenderContext.h" #include "WallpaperEngine/Data/Model/Project.h" namespace WallpaperEngine::Render { RenderContext::RenderContext ( Drivers::VideoDriver& driver, WallpaperApplication& app, Media::MediaSource& mediaSource ) : m_driver (driver), m_app (app), m_mediaSource (mediaSource), m_textureCache (std::make_unique (*this)) { } void RenderContext::render (Drivers::Output::OutputViewport* viewport) { viewport->makeCurrent (); #if !NDEBUG const std::string str = "Rendering to output " + viewport->name; glPushDebugGroup (GL_DEBUG_SOURCE_APPLICATION, 0, -1, str.c_str ()); #endif /* DEBUG */ // search the background in the viewport selection // render the background if (const auto ref = this->m_wallpapers.find (viewport->name); ref != this->m_wallpapers.end ()) { ref->second->render ( viewport->viewport, this->getOutput ().renderVFlip (), viewport->globalPosition, viewport->logicalSize ); } #if !NDEBUG glPopDebugGroup (); #endif /* DEBUG */ viewport->swapOutput (); } void RenderContext::setWallpaper (const std::string& display, std::shared_ptr wallpaper) { wallpaper->setDestinationFramebuffer (this->m_app.getDestinationFramebuffer ()); this->m_wallpapers.insert_or_assign (display, wallpaper); } void RenderContext::setPause (const bool newState) const { for (const auto& wallpaper : this->m_wallpapers | std::views::values) { wallpaper->setPause (newState); } } void RenderContext::setPause (const std::set& pausedDisplays) const { const auto& viewports = this->getOutput ().getViewports (); // per wallpaper: if any of its displays is connected, and if every connected one is paused std::map> state; for (const auto& [display, wallpaper] : this->m_wallpapers) { auto& [connected, paused] = state.try_emplace (wallpaper.get (), false, true).first->second; // a disconnected display can't be covered, so it doesn't keep a spanned wallpaper running if (!viewports.contains (display)) { continue; } connected = true; paused = paused && pausedDisplays.contains (display); } for (const auto& [wallpaper, value] : state) { wallpaper->setPause (value.first && value.second); } } Input::InputContext& RenderContext::getInputContext () const { return this->m_driver.getInputContext (); } const WallpaperApplication& RenderContext::getApp () const { return this->m_app; } const Drivers::VideoDriver& RenderContext::getDriver () const { return this->m_driver; } const Drivers::Output::Output& RenderContext::getOutput () const { return this->m_driver.getOutput (); } std::shared_ptr RenderContext::resolveTexture (const std::string& name) const { return this->m_textureCache->resolve (name); } const std::map>& RenderContext::getWallpapers () const { return this->m_wallpapers; } Media::MediaSource& RenderContext::getMediaSource () const { return this->m_mediaSource; } } // namespace WallpaperEngine::Render