Loading...
Searching...
No Matches
NodeRenderer.hpp
1#pragma once
2#include <Gfx/Graph/Node.hpp>
3
4namespace score::gfx
5{
6
10class SCORE_PLUGIN_GFX_EXPORT NodeRenderer
11{
12public:
13 explicit NodeRenderer(const Node& node)
14 : node{node}
15 {
16 }
17 virtual ~NodeRenderer();
18
19 virtual TextureRenderTarget renderTargetForInput(const Port& input) = 0;
20
23 virtual void
24 inputAboutToFinish(RenderList& renderer, const Port& p, QRhiResourceUpdateBatch*&);
25
26 virtual void init(RenderList& renderer, QRhiResourceUpdateBatch& res) = 0;
27 virtual void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge)
28 = 0;
29
30 virtual void runInitialPasses(
31 RenderList&, QRhiCommandBuffer& commands, QRhiResourceUpdateBatch*& res,
32 Edge& edge);
33
34 virtual void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge);
35
36 virtual void release(RenderList&) = 0;
37
38 void checkForChanges()
39 {
40 materialChanged = node.hasMaterialChanged(materialChangedIndex);
41 geometryChanged = node.hasGeometryChanged(geometryChangedIndex);
42 renderTargetSpecsChanged
43 = node.hasRenderTargetChanged(renderTargetSpecsChangedIndex);
44 }
45
46 const Node& node;
47
48 int32_t id{-1};
49 bool materialChanged{false};
50 bool geometryChanged{false};
51 bool renderTargetSpecsChanged{false};
52
53private:
54 int64_t materialChangedIndex{-1};
55 int64_t geometryChangedIndex{-1};
56 int64_t renderTargetSpecsChangedIndex{-1};
57};
58
59using PassMap = ossia::small_vector<std::pair<Edge*, Pipeline>, 2>;
60SCORE_PLUGIN_GFX_EXPORT
61void defaultPassesInit(
62 PassMap& passes, const std::vector<Edge*>& edges, RenderList& renderer,
63 const Mesh& mesh, const QShader& v, const QShader& f, QRhiBuffer* processUBO,
64 QRhiBuffer* matUBO, const std::vector<Sampler>& samplers,
65 std::span<QRhiShaderResourceBinding> additionalBindings = {});
66
67SCORE_PLUGIN_GFX_EXPORT
68void defaultRenderPass(
69 RenderList& renderer, const Mesh& mesh, const MeshBuffers& bufs,
70 QRhiCommandBuffer& cb, Edge& edge, PassMap& passes);
71
72SCORE_PLUGIN_GFX_EXPORT
73void quadRenderPass(
74 RenderList& renderer, const MeshBuffers& bufs, QRhiCommandBuffer& cb, Edge& edge,
75 PassMap& passes);
76
83class SCORE_PLUGIN_GFX_EXPORT GenericNodeRenderer : public score::gfx::NodeRenderer
84{
85public:
86 GenericNodeRenderer(const NodeModel& node) noexcept
87 : NodeRenderer{node}
88 {
89 }
90
91 TextureRenderTarget renderTargetForInput(const Port& p) override;
92 virtual ~GenericNodeRenderer() { }
93
94 std::vector<Sampler> m_samplers;
95
96 QShader m_vertexS;
97 QShader m_fragmentS;
98
99 // Pipeline
100 PassMap m_p;
101
102 MeshBuffers m_meshbufs;
103
104 QRhiBuffer* m_processUBO{};
105
106 DefaultShaderMaterial m_material;
107
108 const score::gfx::Mesh* m_mesh{};
109
110 // Render loop
111 void
112 defaultMeshInit(RenderList& renderer, const Mesh& mesh, QRhiResourceUpdateBatch& res);
113 void processUBOInit(RenderList& renderer);
114 void defaultPassesInit(RenderList& renderer, const Mesh& mesh);
115 void defaultPassesInit(
116 RenderList& renderer, const Mesh& mesh, const QShader& v, const QShader& f,
117 std::span<QRhiShaderResourceBinding> additionalBindings = {});
118
119 void init(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
120
121 void defaultUBOUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
122 void defaultMeshUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
123 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge) override;
124
125 void defaultRelease(RenderList&);
126 void release(RenderList&) override;
127
128 void defaultRenderPass(
129 RenderList&, const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge);
130
131 void defaultRenderPass(
132 RenderList&, const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge,
133 PassMap& passes);
134
135 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge) override;
136};
137
138}
Generic renderer.
Definition NodeRenderer.hpp:84
Root data model for visual nodes.
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:75
Common base class for most single-pass, simple nodes.
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:227
Renderer for a given node.
Definition NodeRenderer.hpp:11
List of nodes to be rendered to an output.
Definition RenderList.hpp:19
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:12
Utility to represent a shader material following score conventions.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:255
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:66
Definition Mesh.hpp:15
Data model for meshes.
Definition Mesh.hpp:23
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:48
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:111