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 virtual QRhiBuffer* bufferForInput(const Port& input);
21 virtual QRhiBuffer* bufferForOutput(const Port& output);
22
25 virtual void
26 inputAboutToFinish(RenderList& renderer, const Port& p, QRhiResourceUpdateBatch*&);
27
28 virtual void init(RenderList& renderer, QRhiResourceUpdateBatch& res) = 0;
29 virtual void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge)
30 = 0;
31
32 virtual void runInitialPasses(
33 RenderList&, QRhiCommandBuffer& commands, QRhiResourceUpdateBatch*& res,
34 Edge& edge);
35
36 virtual void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge);
37
38 virtual void release(RenderList&) = 0;
39
40 void checkForChanges()
41 {
42 materialChanged = node.hasMaterialChanged(materialChangedIndex);
43 renderTargetSpecsChanged
44 = node.hasRenderTargetChanged(renderTargetSpecsChangedIndex);
45 }
46
47 void process(int32_t port, const ossia::geometry_spec& v)
48 {
49 if(this->geometry != v)
50 {
51 this->geometry = v;
52 geometryChanged = true;
53 }
54 else
55 {
56 if(this->geometry.meshes)
57 {
58 for(auto& mesh : this->geometry.meshes->meshes)
59 {
60 for(auto& buf : mesh.buffers)
61 {
62 if(buf.dirty)
63 {
64 geometryChanged = true;
65 break;
66 }
67 }
68 if(geometryChanged)
69 break;
70 }
71 }
72 }
73 }
74
75 const Node& node;
76
83 ossia::geometry_spec geometry;
84
85 int32_t id{-1};
86 bool materialChanged{false};
87 bool geometryChanged{false};
88 bool renderTargetSpecsChanged{false};
89
90private:
91 int64_t materialChangedIndex{-1};
92 int64_t renderTargetSpecsChangedIndex{-1};
93};
94
95using PassMap = ossia::small_vector<std::pair<Edge*, Pipeline>, 2>;
96SCORE_PLUGIN_GFX_EXPORT
97void defaultPassesInit(
98 PassMap& passes, const std::vector<Edge*>& edges, RenderList& renderer,
99 const Mesh& mesh, const QShader& v, const QShader& f, QRhiBuffer* processUBO,
100 QRhiBuffer* matUBO, std::span<const Sampler> samplers,
101 std::span<QRhiShaderResourceBinding> additionalBindings = {});
102
103SCORE_PLUGIN_GFX_EXPORT
104void defaultRenderPass(
105 RenderList& renderer, const Mesh& mesh, const MeshBuffers& bufs,
106 QRhiCommandBuffer& cb, Edge& edge, PassMap& passes);
107
108SCORE_PLUGIN_GFX_EXPORT
109void quadRenderPass(
110 RenderList& renderer, const MeshBuffers& bufs, QRhiCommandBuffer& cb, Edge& edge,
111 PassMap& passes);
112
119class SCORE_PLUGIN_GFX_EXPORT GenericNodeRenderer : public score::gfx::NodeRenderer
120{
121public:
122 GenericNodeRenderer(const NodeModel& node) noexcept
123 : NodeRenderer{node}
124 {
125 }
126
127 TextureRenderTarget renderTargetForInput(const Port& p) override;
128 virtual ~GenericNodeRenderer() { }
129
130 ossia::small_vector<Sampler, 8> m_samplers;
131
132 QShader m_vertexS;
133 QShader m_fragmentS;
134
135 // Pipeline
136 PassMap m_p;
137
138 MeshBuffers m_meshbufs;
139
140 QRhiBuffer* m_processUBO{};
141
142 DefaultShaderMaterial m_material;
143
144 const score::gfx::Mesh* m_mesh{};
145
146 // Render loop
147 void
148 defaultMeshInit(RenderList& renderer, const Mesh& mesh, QRhiResourceUpdateBatch& res);
149 void processUBOInit(RenderList& renderer);
150 void defaultPassesInit(RenderList& renderer, const Mesh& mesh);
151 void defaultPassesInit(
152 RenderList& renderer, const Mesh& mesh, const QShader& v, const QShader& f,
153 std::span<QRhiShaderResourceBinding> additionalBindings = {});
154
155 void init(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
156
157 void defaultUBOUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
158 void defaultMeshUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
159 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge) override;
160
161 void defaultRelease(RenderList&);
162 void release(RenderList&) override;
163
164 void defaultRenderPass(
165 RenderList&, const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge);
166
167 void defaultRenderPass(
168 RenderList&, const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge,
169 PassMap& passes);
170
171 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge) override;
172};
173
174}
Generic renderer.
Definition NodeRenderer.hpp:120
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:204
Renderer for a given node.
Definition NodeRenderer.hpp:11
ossia::geometry_spec geometry
The geometry to use.
Definition NodeRenderer.hpp:83
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:259
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:70
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:52
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:115
Definition Uniforms.hpp:8