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_onResize = conf.onResize;
59
60 QSize newSz = m_renderSize;
61 if(newSz.width() <= 0 || newSz.height() <= 0)
62 newSz = m_size;
63 if(newSz.width() <= 0 || newSz.height() <= 0)
64 newSz = QSize{1024, 1024};
65
66 m_renderState = score::gfx::createRenderState(conf.graphicsApi, newSz, nullptr);
67 m_renderState->outputSize = m_renderState->renderSize;
68
69 auto rhi = m_renderState->rhi;
70 m_texture = rhi->newTexture(
71 QRhiTexture::RGBA8, m_renderState->renderSize, 1,
72 QRhiTexture::RenderTarget | QRhiTexture::UsedAsTransferSource);
73 m_texture->create();
74 m_renderTarget = rhi->newTextureRenderTarget({m_texture});
75 m_renderState->renderPassDescriptor
76 = m_renderTarget->newCompatibleRenderPassDescriptor();
77 m_renderTarget->setRenderPassDescriptor(m_renderState->renderPassDescriptor);
78 m_renderTarget->create();
79
80 conf.onReady();
81 }
82
83 void destroyOutput() override { }
84 void updateGraphicsAPI(GraphicsApi) override { }
85
86 void setSize(QSize newSz)
87 {
88 if(m_size != newSz)
89 {
90 m_size = newSz;
91 resize();
92 }
93 }
94 void setRenderSize(QSize newSz)
95 {
96 if(m_renderSize != newSz)
97 {
98 m_renderSize = newSz;
99 resize();
100 }
101 }
102
103 void resize()
104 {
105 QSize newSz = m_renderSize;
106 if(newSz.width() <= 0 || newSz.height() <= 0)
107 newSz = m_size;
108 if(newSz.width() <= 0 || newSz.height() <= 0)
109 newSz = QSize{1024, 1024};
110
111 if(m_renderState)
112 {
113 m_renderState->renderSize = newSz;
114 m_renderState->outputSize = newSz;
115
116 auto rhi = m_renderState->rhi;
117
118 m_renderTarget->destroy();
119 m_texture->destroy();
120 m_texture->setPixelSize(newSz);
121 m_texture->create();
122 m_renderTarget = rhi->newTextureRenderTarget({m_texture});
123 m_renderState->renderPassDescriptor
124 = m_renderTarget->newCompatibleRenderPassDescriptor();
125 m_renderTarget->setRenderPassDescriptor(m_renderState->renderPassDescriptor);
126 m_renderTarget->create();
127 }
128
129 if(m_onResize)
130 m_onResize();
131 }
132
133 std::shared_ptr<RenderState> renderState() const override { return m_renderState; }
134
136 {
138 m_texture, nullptr, nullptr, m_renderState->renderPassDescriptor,
139 m_renderTarget};
140 return new Gfx::InvertYRenderer{
141 *this, rt, const_cast<QRhiReadbackResult&>(*shared_readback)};
142 }
143
144 OutputNode::Configuration configuration() const noexcept override { return m_conf; }
145
146 std::shared_ptr<QRhiReadbackResult> shared_readback;
147
148private:
149 Configuration m_conf;
150
151 std::weak_ptr<score::gfx::RenderList> m_renderer{};
152 QRhiTexture* m_texture{};
153 QRhiTextureRenderTarget* m_renderTarget{};
154 std::shared_ptr<score::gfx::RenderState> m_renderState{};
155
156 std::function<void()> m_onResize;
157 QSize m_size{1024, 1024};
158 QSize m_renderSize{};
159};
160}
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:135
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