4#include <Crousti/GfxNode.hpp>
8template <
typename Node_T>
10 (avnd::texture_output_introspection<Node_T>::size + avnd::buffer_output_introspection<Node_T>::size + avnd::geometry_output_introspection<Node_T>::size + scene_output_introspection<Node_T>::size) == 0
11 && (avnd::gpu_render_target_output_port_output_introspection<Node_T>::size == 0)
13struct GfxRenderer<Node_T>
final
14 :
score::gfx::OutputNodeRenderer
15 , GpuRendererFiles<Node_T>
17 std::shared_ptr<Node_T> state;
18 GpuMessageState m_last_message{};
19 ossia::time_value m_last_time{-1};
21 AVND_NO_UNIQUE_ADDRESS texture_inputs_storage<Node_T> texture_ins;
22 AVND_NO_UNIQUE_ADDRESS buffer_inputs_storage<Node_T> buffer_ins;
23 AVND_NO_UNIQUE_ADDRESS geometry_inputs_storage<Node_T> geometry_ins;
24 AVND_NO_UNIQUE_ADDRESS scene_inputs_storage<Node_T> scene_ins;
26 const GfxNode<Node_T>& node() const noexcept
28 return static_cast<const GfxNode<Node_T>&
>(score::gfx::NodeRenderer::node);
31 GfxRenderer(
const GfxNode<Node_T>& p)
32 :
score::gfx::OutputNodeRenderer{p}
33 , state{
std::make_shared<Node_T>()}
35 prepareNewState<Node_T>(state, p);
38 using score::gfx::NodeRenderer::process;
39 void process(int32_t port,
const ossia::transform3d& v)
override
41 if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
42 geometry_ins.setTransform(port, v, *state);
43 score::gfx::OutputNodeRenderer::process(port, v);
49 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
51 auto it = texture_ins.m_rts.find(&p);
52 if(it == texture_ins.m_rts.end())
69 if constexpr(
requires { state->renderlist = &renderer; })
70 state->renderlist = &renderer;
72 if constexpr(
requires { state->prepare(); })
74 this->node().processControlIn(
75 *
this, *state, m_last_message, this->node().last_message, this->node().m_ctx);
80 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
81 texture_ins.init(*
this, renderer);
83 if_possible(state->init(renderer, res));
90 initState(renderer, res);
97 auto& parent = node();
98 parent.processControlIn(
99 *
this, *state, m_last_message, parent.last_message, parent.m_ctx);
101 bool updated =
false;
102 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
104 updated |= texture_ins.update(*
this, renderer, res);
106 if_possible(state->update(renderer, res, e));
119 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
120 texture_ins.release();
122 if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
123 geometry_ins.release(r);
125 if constexpr(scene_input_introspection<Node_T>::size > 0)
126 scene_ins.release(r);
129 avnd::texture_input_introspection<Node_T>::size > 0
130 || avnd::texture_output_introspection<Node_T>::size > 0)
145 if_possible(state->release(r));
149 if constexpr(
requires { state->renderlist =
nullptr; })
150 state->renderlist =
nullptr;
152 m_initialized =
false;
160 void inputAboutToFinish(
162 QRhiResourceUpdateBatch*& res)
override
173 avnd::texture_input_introspection<Node_T>::size > 0
174 || avnd::buffer_input_introspection<Node_T>::size > 0
175 || avnd::geometry_input_introspection<Node_T>::size > 0
176 || scene_input_introspection<Node_T>::size > 0)
178 res = renderer.state.rhi->nextResourceUpdateBatch();
180 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
181 texture_ins.inputAboutToFinish(*
this, renderer, p, res);
182 if constexpr(avnd::buffer_input_introspection<Node_T>::size > 0)
183 buffer_ins.inputAboutToFinish(renderer, res, *state, this->node());
184 if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
185 geometry_ins.inputAboutToFinish(
186 renderer, res, this->geometry, *state, this->node());
191 if_possible(state->inputAboutToFinish(renderer, p, res));
194 void runInitialPasses(
198 auto& parent = this->node();
199 auto& rhi = *renderer.state.rhi;
205 if(parent.last_message.message.token.date == m_last_time)
207 m_last_time = parent.last_message.message.token.date;
209 if constexpr(avnd::texture_input_introspection<Node_T>::size > 0)
210 texture_ins.runInitialPasses(*
this, renderer);
211 if constexpr(avnd::buffer_input_introspection<Node_T>::size > 0)
212 buffer_ins.readInputBuffers(renderer, parent, *state);
213 if constexpr(avnd::geometry_input_introspection<Node_T>::size > 0)
214 geometry_ins.readInputGeometries(renderer, this->geometry, parent, *state);
215 if constexpr(scene_input_introspection<Node_T>::size > 0)
216 scene_ins.readInputScenes(*
this, *state);
218 parent.processControlIn(
219 *
this, *state, m_last_message, parent.last_message, parent.m_ctx);
222 parent.drainWorker(renderer.dateFromStepClock);
223 if_possible(state->runInitialPasses(renderer, commands, res, edge));
224 if_possible((*state)());
225 parent.clearControlIn(*state);
228 parent.processControlOut(*this->state, renderer, parent);
232template <
typename Node_T>
233 requires((avnd::texture_output_introspection<Node_T>::size
234 + avnd::buffer_output_introspection<Node_T>::size
235 + avnd::geometry_output_introspection<Node_T>::size
236 + scene_output_introspection<Node_T>::size)
238 && (avnd::gpu_render_target_output_port_output_introspection<Node_T>::size
240struct GfxNode<Node_T>
final
241 : CustomGpuOutputNodeBase
242 , GpuNodeElements<Node_T>
245 QPointer<oscr::ProcessModel<Node_T>> processModel;
248 std::weak_ptr<Execution::ExecutionCommandQueue> q, Gfx::exec_controls ctls,
250 : CustomGpuOutputNodeBase{
std::move(q),
std::move(ctls), ctx}
251 , processModel{&element}
255 initGfxPorts<Node_T>(
this, this->input, this->output);
261 return new GfxRenderer<Node_T>{*
this};
Definition score-plugin-avnd/Crousti/ProcessModel.hpp:122
Definition OutputNode.hpp:38
List of nodes to be rendered to an output.
Definition RenderList.hpp:36
Definition Controls.hpp:30
Base toolkit upon which the software is built.
Definition Application.cpp:83
Definition DocumentContext.hpp:18
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:236
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:215
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:307