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);
127 void checkForChanges()
132 materialChanged |= node.hasMaterialChanged(materialChangedIndex);
133 renderTargetSpecsChanged |= node.hasRenderTargetChanged(renderTargetSpecsChangedIndex);
141 node.hasRenderTargetChanged(renderTargetSpecsChangedIndex);
142 renderTargetSpecsChanged =
false;
145 void process(int32_t port,
const ossia::geometry_spec& v);
146 void process(int32_t port,
const ossia::scene_spec& v);
147 virtual void process(int32_t port,
const ossia::transform3d& v);
155 void process(int32_t port,
const ossia::geometry_spec& v,
const void* source_key);
156 void process(int32_t port,
const ossia::scene_spec& v,
const void* source_key);
163 for(
const auto& [k, v] : m_portGeometries)
175 template <
typename F>
178 for(
const auto* kv : portScenesInEdgeOrder())
179 if(kv->first.first == port && kv->second.state)
186 void rebuildMergedScene();
193 ossia::small_vector<const std::pair<std::pair<int32_t, const void*>, ossia::scene_spec>*, 4>
194 portScenesInEdgeOrder()
const;
218 ossia::small_flat_map<PortSourceKey, ossia::geometry_spec, 4> m_portGeometries;
230 ossia::small_flat_map<PortSourceKey, ossia::scene_spec, 4>
m_portScenes;
241 ossia::small_vector<MergeCacheKey, 4> m_mergeCacheInputs;
242 ossia::scene_spec m_mergeCacheOutput;
248 ossia::small_flat_map<
249 PortSourceKey, std::pair<ossia::geometry_spec, ossia::scene_spec>, 4>
253 bool materialChanged{
false};
254 bool geometryChanged{
false};
255 bool sceneChanged{
false};
256 bool renderTargetSpecsChanged{
false};
260 bool m_initialized{
false};
263 int64_t materialChangedIndex{-1};
264 int64_t renderTargetSpecsChangedIndex{-1};
274 : renderTarget{std::move(rt)}, p{pi}, processUBO{ubo} {}
283 QRhiBuffer* processUBO{};
290 processUBO->deleteLater();
291 processUBO =
nullptr;
297using PassMap = ossia::small_vector<std::pair<Edge*, Pass>, 2>;
298SCORE_PLUGIN_GFX_EXPORT
299void defaultPassesInit(
300 PassMap& passes,
const std::vector<Edge*>& edges,
RenderList& renderer,
301 const Mesh& mesh,
const QShader& v,
const QShader& f, QRhiBuffer* processUBO,
302 QRhiBuffer* matUBO, std::span<const Sampler> samplers,
303 std::span<QRhiShaderResourceBinding> additionalBindings = {});
305SCORE_PLUGIN_GFX_EXPORT
306void defaultPassesInit(
307 PassMap& passes,
const std::vector<Edge*>& edges, RenderList& renderer,
308 const Mesh& mesh,
const QShader& v,
const QShader& f, QRhiBuffer* processUBO,
309 QRhiBuffer* matUBO, std::span<const Sampler> samplers,
310 const QRhiGraphicsPipeline::TargetBlend& blend,
311 std::span<QRhiShaderResourceBinding> additionalBindings = {});
313SCORE_PLUGIN_GFX_EXPORT
314void defaultRenderPass(
315 RenderList& renderer,
const Mesh& mesh,
const MeshBuffers& bufs,
316 QRhiCommandBuffer& cb, Edge& edge, PassMap& passes);
318SCORE_PLUGIN_GFX_EXPORT
320 RenderList& renderer,
const MeshBuffers& bufs, QRhiCommandBuffer& cb, Edge& edge,
352 ossia::small_vector<Sampler, 8> m_samplers;
361 bool m_outputPremultiplied{
false};
380 std::pair<QVector<quint32>, QRhiGraphicsPipeline*>, 2>
391 QRhiBuffer* m_processUBO{};
393 DefaultShaderMaterial m_material;
402 defaultMeshInit(
RenderList& renderer,
const Mesh& mesh, QRhiResourceUpdateBatch& res);
405 void defaultPassesInit(
406 RenderList& renderer,
const Mesh& mesh,
const QShader& v,
const QShader& f,
407 std::span<QRhiShaderResourceBinding> additionalBindings = {});
409 void init(RenderList& renderer, QRhiResourceUpdateBatch& res)
override;
411 void initState(RenderList& renderer, QRhiResourceUpdateBatch& res)
override;
412 void releaseState(RenderList& renderer)
override;
414 RenderList& renderer, Edge& edge, QRhiResourceUpdateBatch& res)
override;
415 void removeOutputPass(RenderList& renderer, Edge& edge)
override;
416 bool hasOutputPassForEdge(Edge& edge)
const override;
418 void defaultUBOUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
419 void defaultMeshUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
420 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge)
override;
422 void defaultRelease(RenderList&);
423 void release(RenderList&)
override;
425 void defaultRenderPass(
426 RenderList&,
const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge);
428 void defaultRenderPass(
429 RenderList&,
const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge,
432 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge)
override;
434 void updateInputTexture(
const Port& input, QRhiTexture* tex, QRhiTexture* depthTex =
nullptr)
override;
Generic renderer.
Definition NodeRenderer.hpp:330
virtual std::span< const Sampler > samplersForOutputEdge(const Edge &edge) const noexcept
Definition NodeRenderer.hpp:347
const Mesh * currentMesh() const noexcept override
Definition NodeRenderer.hpp:398
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:240
ossia::small_flat_map< PortSourceKey, ossia::scene_spec, 4 > m_portScenes
Per-(port, source) scene storage. See m_portGeometries comment.
Definition NodeRenderer.hpp:230
ossia::scene_spec scene
The scene to use (when receiving scene_spec data).
Definition NodeRenderer.hpp:227
ossia::geometry_spec geometry
The geometry to use.
Definition NodeRenderer.hpp:210
std::pair< int32_t, const void * > PortSourceKey
Definition NodeRenderer.hpp:217
virtual const Mesh * currentMesh() const noexcept
Definition NodeRenderer.hpp:123
ossia::small_flat_map< PortSourceKey, std::pair< ossia::geometry_spec, ossia::scene_spec >, 4 > m_wrapCache
Definition NodeRenderer.hpp:250
void syncRenderTargetIndex()
Definition NodeRenderer.hpp:139
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:176
const ossia::geometry_spec * findGeometryByPort(int32_t port) const
Definition NodeRenderer.hpp:161
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:1849
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:268
Useful abstraction for storing a graphics pipeline and associated resource bindings.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:262
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:291