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);
20 virtual BufferView bufferForInput(const Port& input);
21 virtual BufferView bufferForOutput(const Port& output);
22
27 virtual QRhiTexture* textureForOutput(const Port& output);
28
31 virtual void updateInputTexture(const Port& input, QRhiTexture* tex);
32
35 virtual void
36 inputAboutToFinish(RenderList& renderer, const Port& p, QRhiResourceUpdateBatch*&);
37
38 virtual void init(RenderList& renderer, QRhiResourceUpdateBatch& res) = 0;
39 virtual void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge)
40 = 0;
41
42 virtual void runInitialPasses(
43 RenderList&, QRhiCommandBuffer& commands, QRhiResourceUpdateBatch*& res,
44 Edge& edge);
45
46 virtual void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge);
47
48 virtual void release(RenderList&) = 0;
49
50 void checkForChanges()
51 {
52 materialChanged = node.hasMaterialChanged(materialChangedIndex);
53 renderTargetSpecsChanged
54 = node.hasRenderTargetChanged(renderTargetSpecsChangedIndex);
55 }
56
57 // FIXME this will change when we have a proper scene node
58 void process(int32_t port, const ossia::geometry_spec& v);
59 virtual void process(int32_t port, const ossia::transform3d& v);
60
61 const Node& node;
62
73 ossia::geometry_spec geometry;
74
77 ossia::small_flat_map<int32_t, ossia::geometry_spec, 4> m_portGeometries;
78
79 int32_t nodeId{-1};
80 bool materialChanged{false};
81 bool geometryChanged{false};
82 bool renderTargetSpecsChanged{false};
83
84private:
85 int64_t materialChangedIndex{-1};
86 int64_t renderTargetSpecsChangedIndex{-1};
87};
88
89using PassMap = ossia::small_vector<std::pair<Edge*, Pipeline>, 2>;
90SCORE_PLUGIN_GFX_EXPORT
91void defaultPassesInit(
92 PassMap& passes, const std::vector<Edge*>& edges, RenderList& renderer,
93 const Mesh& mesh, const QShader& v, const QShader& f, QRhiBuffer* processUBO,
94 QRhiBuffer* matUBO, std::span<const Sampler> samplers,
95 std::span<QRhiShaderResourceBinding> additionalBindings = {});
96
97SCORE_PLUGIN_GFX_EXPORT
98void defaultRenderPass(
99 RenderList& renderer, const Mesh& mesh, const MeshBuffers& bufs,
100 QRhiCommandBuffer& cb, Edge& edge, PassMap& passes);
101
102SCORE_PLUGIN_GFX_EXPORT
103void quadRenderPass(
104 RenderList& renderer, const MeshBuffers& bufs, QRhiCommandBuffer& cb, Edge& edge,
105 PassMap& passes);
106
113class SCORE_PLUGIN_GFX_EXPORT GenericNodeRenderer : public score::gfx::NodeRenderer
114{
115public:
116 GenericNodeRenderer(const NodeModel& node) noexcept
117 : NodeRenderer{node}
118 {
119 }
120
121 virtual ~GenericNodeRenderer() { }
122
123 ossia::small_vector<Sampler, 8> m_samplers;
124
125 QShader m_vertexS;
126 QShader m_fragmentS;
127
128 // Pipeline
129 PassMap m_p;
130
131 MeshBuffers m_meshbufs;
132
133 QRhiBuffer* m_processUBO{};
134
135 DefaultShaderMaterial m_material;
136
137 const score::gfx::Mesh* m_mesh{};
138
139 // Render loop
140 void
141 defaultMeshInit(RenderList& renderer, const Mesh& mesh, QRhiResourceUpdateBatch& res);
142 void processUBOInit(RenderList& renderer);
143 void defaultPassesInit(RenderList& renderer, const Mesh& mesh);
144 void defaultPassesInit(
145 RenderList& renderer, const Mesh& mesh, const QShader& v, const QShader& f,
146 std::span<QRhiShaderResourceBinding> additionalBindings = {});
147
148 void init(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
149
150 void defaultUBOUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
151 void defaultMeshUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
152 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge) override;
153
154 void defaultRelease(RenderList&);
155 void release(RenderList&) override;
156
157 void defaultRenderPass(
158 RenderList&, const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge);
159
160 void defaultRenderPass(
161 RenderList&, const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge,
162 PassMap& passes);
163
164 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge) override;
165
166 void updateInputTexture(const Port& input, QRhiTexture* tex) override;
167};
168
169}
Generic renderer.
Definition NodeRenderer.hpp:114
Root data model for visual nodes.
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:74
Common base class for most single-pass, simple nodes.
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:203
Renderer for a given node.
Definition NodeRenderer.hpp:11
ossia::small_flat_map< int32_t, ossia::geometry_spec, 4 > m_portGeometries
Definition NodeRenderer.hpp:77
ossia::geometry_spec geometry
The geometry to use.
Definition NodeRenderer.hpp:73
List of nodes to be rendered to an output.
Definition RenderList.hpp:19
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:12
Definition Mesh.hpp:15
Utility to represent a shader material following score conventions.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:328
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:75
Definition Mesh.hpp:33
Data model for meshes.
Definition Mesh.hpp:46
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:54
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:122