@@ -14,7 +14,7 @@ struct GfxRenderer<Node_T> final : score::gfx::GenericNodeRenderer
1414{
1515 using texture_inputs = avnd::texture_input_introspection<Node_T>;
1616 using texture_outputs = avnd::texture_output_introspection<Node_T>;
17- Node_T state;
17+ std::shared_ptr< Node_T> state;
1818 score::gfx::Message m_last_message{};
1919 ossia::small_flat_map<const score::gfx::Port*, score::gfx::TextureRenderTarget, 2 >
2020 m_rts;
@@ -29,9 +29,10 @@ struct GfxRenderer<Node_T> final : score::gfx::GenericNodeRenderer
2929
3030 GfxRenderer (const GfxNode<Node_T>& p)
3131 : score::gfx::GenericNodeRenderer{p}
32+ , state{std::make_shared<Node_T>()}
3233 , m_readbacks(texture_inputs::size)
3334 {
34- prepareNewState (state, p);
35+ prepareNewState<Node_T> (state, p);
3536 }
3637
3738 score::gfx::TextureRenderTarget
@@ -165,11 +166,11 @@ struct GfxRenderer<Node_T> final : score::gfx::GenericNodeRenderer
165166 void init (score::gfx::RenderList& renderer, QRhiResourceUpdateBatch& res) override
166167 {
167168 auto & parent = node ();
168- if constexpr (requires { state. prepare (); })
169+ if constexpr (requires { state-> prepare (); })
169170 {
170171 parent.processControlIn (
171- *this , state, m_last_message, parent.last_message , parent.m_ctx );
172- state. prepare ();
172+ *this , * state, m_last_message, parent.last_message , parent.m_ctx );
173+ state-> prepare ();
173174 }
174175
175176 const auto & mesh = renderer.defaultTriangle ();
@@ -185,7 +186,8 @@ struct GfxRenderer<Node_T> final : score::gfx::GenericNodeRenderer
185186 // Init input render targets
186187 int k = 0 ;
187188 avnd::cpu_texture_input_introspection<Node_T>::for_all (
188- avnd::get_inputs<Node_T>(state), [&]<typename F>(F& t) {
189+ avnd::get_inputs<Node_T>(*state),
190+ [&]<typename F>(F& t) {
189191 // FIXME k isn't the port index, it's the texture port index
190192 auto spec = this ->node ().resolveRenderTargetSpecs (k, renderer);
191193 if constexpr (requires {
@@ -203,13 +205,13 @@ struct GfxRenderer<Node_T> final : score::gfx::GenericNodeRenderer
203205 t.texture .height = spec.size .height ();
204206 }
205207 k++;
206- });
208+ });
207209 }
208210
209211 {
210212 // Init textures for the outputs
211213 avnd::cpu_texture_output_introspection<Node_T>::for_all (
212- avnd::get_outputs<Node_T>(state), [&](auto & t) {
214+ avnd::get_outputs<Node_T>(* state), [&](auto & t) {
213215 createOutput (renderer, t.texture , QSize{t.texture .width , t.texture .height });
214216 });
215217 }
@@ -282,23 +284,23 @@ struct GfxRenderer<Node_T> final : score::gfx::GenericNodeRenderer
282284 // "completed" callback.
283285 int k = 0 ;
284286 avnd::cpu_texture_input_introspection<Node_T>::for_all (
285- avnd::get_inputs<Node_T>(state), [&](auto & t) {
286- loadInputTexture (rhi, t.texture , k);
287- k++;
288- });
287+ avnd::get_inputs<Node_T>(* state), [&](auto & t) {
288+ loadInputTexture (rhi, t.texture , k);
289+ k++;
290+ });
289291 }
290292
291293 parent.processControlIn (
292- *this , state, m_last_message, parent.last_message , parent.m_ctx );
294+ *this , * state, m_last_message, parent.last_message , parent.m_ctx );
293295
294296 // Run the processor
295- state ();
297+ (* state) ();
296298
297299 // Upload output textures
298300 {
299301 int k = 0 ;
300302 avnd::cpu_texture_output_introspection<Node_T>::for_all (
301- avnd::get_outputs<Node_T>(state), [&](auto & t) {
303+ avnd::get_outputs<Node_T>(* state), [&](auto & t) {
302304 uploadOutputTexture (renderer, k, t.texture , res);
303305 k++;
304306 });
@@ -308,7 +310,7 @@ struct GfxRenderer<Node_T> final : score::gfx::GenericNodeRenderer
308310 }
309311
310312 // Copy the data to the model node
311- parent.processControlOut (this ->state );
313+ parent.processControlOut (* this ->state );
312314 }
313315};
314316
0 commit comments