2#include <Gfx/Graph/Node.hpp>
27 virtual QRhiTexture* textureForOutput(
const Port& output);
33 virtual void updateInputTexture(
const Port& input, QRhiTexture* tex, QRhiTexture* depthTex =
nullptr);
43 inputAboutToFinish(
RenderList& renderer,
const Port& p, QRhiResourceUpdateBatch*&);
45 virtual void init(
RenderList& renderer, QRhiResourceUpdateBatch& res) = 0;
46 virtual void update(
RenderList& renderer, QRhiResourceUpdateBatch& res,
Edge* edge)
49 virtual void runInitialPasses(
50 RenderList&, QRhiCommandBuffer& commands, QRhiResourceUpdateBatch*& res,
53 virtual void runRenderPass(
RenderList&, QRhiCommandBuffer& commands,
Edge& edge);
56 virtual QRhiGraphicsPipeline::CompareOp
depthCompare() const noexcept
58 return QRhiGraphicsPipeline::Greater;
79 virtual void initState(
RenderList& renderer, QRhiResourceUpdateBatch& res);
83 virtual void releaseState(
RenderList& renderer);
86 virtual void addOutputPass(
98 addInputEdge(
RenderList& renderer,
Edge& edge, QRhiResourceUpdateBatch& res);
104 virtual bool hasOutputPassForEdge(
Edge& edge)
const;
114 virtual void seedInitialOutputs(
RenderList& renderer);
123 void checkForChanges()
128 materialChanged |= node.hasMaterialChanged(materialChangedIndex);
129 renderTargetSpecsChanged |= node.hasRenderTargetChanged(renderTargetSpecsChangedIndex);
137 node.hasRenderTargetChanged(renderTargetSpecsChangedIndex);
138 renderTargetSpecsChanged =
false;
141 void process(int32_t port,
const ossia::geometry_spec& v);
142 void process(int32_t port,
const ossia::scene_spec& v);
143 virtual void process(int32_t port,
const ossia::transform3d& v);
151 void process(int32_t port,
const ossia::geometry_spec& v,
const void* source_key);
152 void process(int32_t port,
const ossia::scene_spec& v,
const void* source_key);
159 for(
const auto& [k, v] : m_portGeometries)
171 template <
typename F>
174 for(
const auto& [k, v] : m_portScenes)
175 if(k.first == port && v.state)
182 void rebuildMergedScene();
206 ossia::small_flat_map<PortSourceKey, ossia::geometry_spec, 4> m_portGeometries;
218 ossia::small_flat_map<PortSourceKey, ossia::scene_spec, 4>
m_portScenes;
229 ossia::small_vector<MergeCacheKey, 4> m_mergeCacheInputs;
230 ossia::scene_spec m_mergeCacheOutput;
236 ossia::small_flat_map<
237 PortSourceKey, std::pair<ossia::geometry_spec, ossia::scene_spec>, 4>
241 bool materialChanged{
false};
242 bool geometryChanged{
false};
243 bool sceneChanged{
false};
244 bool renderTargetSpecsChanged{
false};
248 bool m_initialized{
false};
251 int64_t materialChangedIndex{-1};
252 int64_t renderTargetSpecsChangedIndex{-1};
262 : renderTarget{std::move(rt)}, p{pi}, processUBO{ubo} {}
271 QRhiBuffer* processUBO{};
278 processUBO->deleteLater();
279 processUBO =
nullptr;
285using PassMap = ossia::small_vector<std::pair<Edge*, Pass>, 2>;
286SCORE_PLUGIN_GFX_EXPORT
287void defaultPassesInit(
288 PassMap& passes,
const std::vector<Edge*>& edges,
RenderList& renderer,
289 const Mesh& mesh,
const QShader& v,
const QShader& f, QRhiBuffer* processUBO,
290 QRhiBuffer* matUBO, std::span<const Sampler> samplers,
291 std::span<QRhiShaderResourceBinding> additionalBindings = {});
293SCORE_PLUGIN_GFX_EXPORT
294void defaultPassesInit(
295 PassMap& passes,
const std::vector<Edge*>& edges, RenderList& renderer,
296 const Mesh& mesh,
const QShader& v,
const QShader& f, QRhiBuffer* processUBO,
297 QRhiBuffer* matUBO, std::span<const Sampler> samplers,
298 const QRhiGraphicsPipeline::TargetBlend& blend,
299 std::span<QRhiShaderResourceBinding> additionalBindings = {});
301SCORE_PLUGIN_GFX_EXPORT
302void defaultRenderPass(
303 RenderList& renderer,
const Mesh& mesh,
const MeshBuffers& bufs,
304 QRhiCommandBuffer& cb, Edge& edge, PassMap& passes);
306SCORE_PLUGIN_GFX_EXPORT
308 RenderList& renderer,
const MeshBuffers& bufs, QRhiCommandBuffer& cb, Edge& edge,
340 ossia::small_vector<Sampler, 8> m_samplers;
349 bool m_outputPremultiplied{
false};
368 std::pair<QVector<quint32>, QRhiGraphicsPipeline*>, 2>
379 QRhiBuffer* m_processUBO{};
381 DefaultShaderMaterial m_material;
387 defaultMeshInit(RenderList& renderer,
const Mesh& mesh, QRhiResourceUpdateBatch& res);
388 void processUBOInit(RenderList& renderer);
389 void defaultPassesInit(RenderList& renderer,
const Mesh& mesh);
390 void defaultPassesInit(
391 RenderList& renderer,
const Mesh& mesh,
const QShader& v,
const QShader& f,
392 std::span<QRhiShaderResourceBinding> additionalBindings = {});
394 void init(RenderList& renderer, QRhiResourceUpdateBatch& res)
override;
396 void initState(RenderList& renderer, QRhiResourceUpdateBatch& res)
override;
397 void releaseState(RenderList& renderer)
override;
399 RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res)
override;
400 void removeOutputPass(RenderList& renderer, Edge& edge)
override;
401 bool hasOutputPassForEdge(Edge& edge)
const override;
403 void defaultUBOUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
404 void defaultMeshUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
405 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge)
override;
407 void defaultRelease(RenderList&);
408 void release(RenderList&)
override;
410 void defaultRenderPass(
411 RenderList&,
const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge);
413 void defaultRenderPass(
414 RenderList&,
const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge,
417 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge)
override;
419 void updateInputTexture(
const Port& input, QRhiTexture* tex, QRhiTexture* depthTex =
nullptr)
override;
Generic renderer.
Definition NodeRenderer.hpp:318
virtual std::span< const Sampler > samplersForOutputEdge(const Edge &edge) const noexcept
Definition NodeRenderer.hpp:335
Root data model for visual nodes.
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:76
Common base class for most single-pass, simple nodes.
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:279
Renderer for a given node.
Definition NodeRenderer.hpp:11
virtual void removeOutputPass(RenderList &renderer, Edge &edge)=0
std::pair< const ossia::scene_state *, int64_t > MergeCacheKey
Definition NodeRenderer.hpp:228
ossia::small_flat_map< PortSourceKey, ossia::scene_spec, 4 > m_portScenes
Per-(port, source) scene storage. See m_portGeometries comment.
Definition NodeRenderer.hpp:218
ossia::scene_spec scene
The scene to use (when receiving scene_spec data).
Definition NodeRenderer.hpp:215
ossia::geometry_spec geometry
The geometry to use.
Definition NodeRenderer.hpp:198
std::pair< int32_t, const void * > PortSourceKey
Definition NodeRenderer.hpp:205
ossia::small_flat_map< PortSourceKey, std::pair< ossia::geometry_spec, ossia::scene_spec >, 4 > m_wrapCache
Definition NodeRenderer.hpp:238
void syncRenderTargetIndex()
Definition NodeRenderer.hpp:135
virtual bool followsRenderSize() const noexcept
Definition NodeRenderer.hpp:119
virtual QRhiGraphicsPipeline::CompareOp depthCompare() const noexcept
The depth compare this renderer's pipeline was built with.
Definition NodeRenderer.hpp:56
void forEachSceneOnPort(int32_t port, F &&fn) const
Definition NodeRenderer.hpp:172
const ossia::geometry_spec * findGeometryByPort(int32_t port) const
Definition NodeRenderer.hpp:157
List of nodes to be rendered to an output.
Definition RenderList.hpp:33
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:11
void updateInputSamplerFilter(std::span< const Sampler > samplers, const score::gfx::Node &node, const Port &input, const RenderTargetSpecs &spec)
Give the sampler initInputSamplers() created for input, one of node's input ports,...
Definition score-plugin-gfx/Gfx/Graph/Utils.cpp:1831
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:220
Definition VertexFallbackPlan.hpp:27
Data model for meshes.
Definition Mesh.hpp:182
Definition NodeRenderer.hpp:256
Useful abstraction for storing a graphics pipeline and associated resource bindings.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:250
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:199
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:58
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:279