@@ -55,9 +55,15 @@ struct BackgroundNode : OutputNode
5555
5656 void createOutput (score::gfx::OutputConfiguration conf) override
5757 {
58- m_renderState
59- = score::gfx::createRenderState (conf.graphicsApi , QSize{1024 , 1024 }, nullptr );
58+ m_onResize = conf.onResize ;
6059
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 );
6167 m_renderState->outputSize = m_renderState->renderSize ;
6268
6369 auto rhi = m_renderState->rhi ;
@@ -77,6 +83,53 @@ struct BackgroundNode : OutputNode
7783 void destroyOutput () override { }
7884 void updateGraphicsAPI (GraphicsApi) override { }
7985
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+
80133 std::shared_ptr<RenderState> renderState () const override { return m_renderState; }
81134
82135 score::gfx::OutputNodeRenderer* createRenderer (RenderList& r) const noexcept override
@@ -99,5 +152,9 @@ struct BackgroundNode : OutputNode
99152 QRhiTexture* m_texture{};
100153 QRhiTextureRenderTarget* m_renderTarget{};
101154 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{};
102159};
103160}
0 commit comments