Loading...
Searching...
No Matches
BackgroundNode.hpp
1#pragma once
2
3#include <Gfx/GfxParameter.hpp>
4#include <Gfx/Graph/RenderList.hpp>
5#include <Gfx/Graph/Window.hpp>
6#include <Gfx/InvertYRenderer.hpp>
7#include <Gfx/Settings/Model.hpp>
8
9namespace score::gfx
10{
12{
13 explicit BackgroundNode()
14 {
15 input.push_back(new Port{this, {}, Types::Image, {}});
16 auto& ctx = score::GUIAppContext();
17 auto& settings = ctx.settings<Gfx::Settings::Model>();
18 double settings_rate = settings.getRate();
19 if(settings_rate <= 0.)
20 settings_rate = 60.;
21 m_conf = {.manualRenderingRate = 1000. / settings_rate};
22 }
23
24 virtual ~BackgroundNode() { }
25
26 void startRendering() override { }
27 void render() override
28 {
29 auto renderer = m_renderer.lock();
30 if(renderer && m_renderState)
31 {
32 if(renderer->renderers.size() > 1)
33 {
34 auto rhi = m_renderState->rhi;
35 QRhiCommandBuffer* cb{};
36 if(rhi->beginOffscreenFrame(&cb) != QRhi::FrameOpSuccess)
37 return;
38
39 renderer->render(*cb);
40 rhi->endOffscreenFrame();
41 }
42 else
43 {
44 shared_readback->data.clear();
45 shared_readback->pixelSize = {};
46 }
47 }
48 }
49 void onRendererChange() override { }
50 bool canRender() const override { return true; }
51 void stopRendering() override { }
52
53 void setRenderer(std::shared_ptr<RenderList> r) override { m_renderer = r; }
54 RenderList* renderer() const override { return m_renderer.lock().get(); }
55
56 void createOutput(score::gfx::OutputConfiguration conf) override
57 {
58 m_renderState
59 = score::gfx::createRenderState(conf.graphicsApi, QSize{1024, 1024}, nullptr);
60
61 m_renderState->outputSize = m_renderState->renderSize;
62
63 auto rhi = m_renderState->rhi;
64 m_texture = rhi->newTexture(
65 QRhiTexture::RGBA8, m_renderState->renderSize, 1,
66 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
67 m_texture->create();
68 m_renderTarget = rhi->newTextureRenderTarget({m_texture});
69 m_renderState->renderPassDescriptor
70 = m_renderTarget->newCompatibleRenderPassDescriptor();
71 m_renderTarget->setRenderPassDescriptor(m_renderState->renderPassDescriptor);
72 m_renderTarget->create();
73
74 conf.onReady();
75 }
76
77 void destroyOutput() override { }
78 void updateGraphicsAPI(GraphicsApi) override { }
79
80 std::shared_ptr<RenderState> renderState() const override { return m_renderState; }
81
83 {
85 m_texture, nullptr, nullptr, m_renderState->renderPassDescriptor,
86 m_renderTarget};
87 return new Gfx::InvertYRenderer{
88 *this, rt, const_cast<QRhiReadbackResult&>(*shared_readback)};
89 }
90
91 OutputNode::Configuration configuration() const noexcept override { return m_conf; }
92
93 std::shared_ptr<QRhiReadbackResult> shared_readback;
94
95private:
96 Configuration m_conf;
97
98 std::weak_ptr<score::gfx::RenderList> m_renderer{};
99 QRhiTexture* m_texture{};
100 QRhiTextureRenderTarget* m_renderTarget{};
101 std::shared_ptr<score::gfx::RenderState> m_renderState{};
102};
103}
Definition InvertYRenderer.hpp:10
Definition score-plugin-gfx/Gfx/Settings/Model.hpp:38
std::vector< Port * > input
Input ports of that node.
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:103
Base class for sink nodes (QWindow, spout, syphon, NDI output, ...)
Definition OutputNode.hpp:31
Definition OutputNode.hpp:18
List of nodes to be rendered to an output.
Definition RenderList.hpp:19
std::vector< score::gfx::NodeRenderer * > renderers
Renderers - one per node.
Definition RenderList.hpp:109
void render(QRhiCommandBuffer &commands, bool force=false)
Render every node in order.
Definition RenderList.cpp:400
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:12
GraphicsApi
Available graphics APIs to use.
Definition RenderState.hpp:20
Definition BackgroundNode.hpp:12
score::gfx::OutputNodeRenderer * createRenderer(RenderList &r) const noexcept override
Create a renderer in a given context for this node.
Definition BackgroundNode.hpp:82
Definition OutputNode.hpp:11
Definition OutputNode.hpp:61
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:53
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:116