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 BufferView bufferForInput(const Port& input);
21 virtual BufferView bufferForOutput(const Port& output);
22
27 virtual QRhiTexture* textureForOutput(const Port& output);
28
31 virtual void
32 inputAboutToFinish(RenderList& renderer, const Port& p, QRhiResourceUpdateBatch*&);
33
34 virtual void init(RenderList& renderer, QRhiResourceUpdateBatch& res) = 0;
35 virtual void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge)
36 = 0;
37
38 virtual void runInitialPasses(
39 RenderList&, QRhiCommandBuffer& commands, QRhiResourceUpdateBatch*& res,
40 Edge& edge);
41
42 virtual void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge);
43
44 virtual void release(RenderList&) = 0;
45
46 void checkForChanges()
47 {
48 materialChanged = node.hasMaterialChanged(materialChangedIndex);
49 renderTargetSpecsChanged
50 = node.hasRenderTargetChanged(renderTargetSpecsChangedIndex);
51 }
52
53 // FIXME this will change when we have a proper scene node
54 void process(int32_t port, const ossia::geometry_spec& v);
55 virtual void process(int32_t port, const ossia::transform3d& v);
56
57 const Node& node;
58
65 ossia::geometry_spec geometry;
66
67 int32_t nodeId{-1};
68 bool materialChanged{false};
69 bool geometryChanged{false};
70 bool renderTargetSpecsChanged{false};
71
72private:
73 int64_t materialChangedIndex{-1};
74 int64_t renderTargetSpecsChangedIndex{-1};
75};
76
77using PassMap = ossia::small_vector<std::pair<Edge*, Pipeline>, 2>;
78SCORE_PLUGIN_GFX_EXPORT
79void defaultPassesInit(
80 PassMap& passes, const std::vector<Edge*>& edges, RenderList& renderer,
81 const Mesh& mesh, const QShader& v, const QShader& f, QRhiBuffer* processUBO,
82 QRhiBuffer* matUBO, std::span<const Sampler> samplers,
83 std::span<QRhiShaderResourceBinding> additionalBindings = {});
84
85SCORE_PLUGIN_GFX_EXPORT
86void defaultRenderPass(
87 RenderList& renderer, const Mesh& mesh, const MeshBuffers& bufs,
88 QRhiCommandBuffer& cb, Edge& edge, PassMap& passes);
89
90SCORE_PLUGIN_GFX_EXPORT
91void quadRenderPass(
92 RenderList& renderer, const MeshBuffers& bufs, QRhiCommandBuffer& cb, Edge& edge,
93 PassMap& passes);
94
101class SCORE_PLUGIN_GFX_EXPORT GenericNodeRenderer : public score::gfx::NodeRenderer
102{
103public:
104 GenericNodeRenderer(const NodeModel& node) noexcept
105 : NodeRenderer{node}
106 {
107 }
108
109 TextureRenderTarget renderTargetForInput(const Port& p) override;
110 virtual ~GenericNodeRenderer() { }
111
112 ossia::small_vector<Sampler, 8> m_samplers;
113
114 QShader m_vertexS;
115 QShader m_fragmentS;
116
117 // Pipeline
118 PassMap m_p;
119
120 MeshBuffers m_meshbufs;
121
122 QRhiBuffer* m_processUBO{};
123
124 DefaultShaderMaterial m_material;
125
126 const score::gfx::Mesh* m_mesh{};
127
128 // Render loop
129 void
130 defaultMeshInit(RenderList& renderer, const Mesh& mesh, QRhiResourceUpdateBatch& res);
131 void processUBOInit(RenderList& renderer);
132 void defaultPassesInit(RenderList& renderer, const Mesh& mesh);
133 void defaultPassesInit(
134 RenderList& renderer, const Mesh& mesh, const QShader& v, const QShader& f,
135 std::span<QRhiShaderResourceBinding> additionalBindings = {});
136
137 void init(RenderList& renderer, QRhiResourceUpdateBatch& res) override;
138
139 void defaultUBOUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
140 void defaultMeshUpdate(RenderList& renderer, QRhiResourceUpdateBatch& res);
141 void update(RenderList& renderer, QRhiResourceUpdateBatch& res, Edge* edge) override;
142
143 void defaultRelease(RenderList&);
144 void release(RenderList&) override;
145
146 void defaultRenderPass(
147 RenderList&, const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge);
148
149 void defaultRenderPass(
150 RenderList&, const Mesh& mesh, QRhiCommandBuffer& commands, Edge& edge,
151 PassMap& passes);
152
153 void runRenderPass(RenderList&, QRhiCommandBuffer& commands, Edge& edge) override;
154};
155
156}
Generic renderer.
Definition NodeRenderer.hpp:102
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::geometry_spec geometry
The geometry to use.
Definition NodeRenderer.hpp:65
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:263
Connection between two score::gfx::Port.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:74
Definition Mesh.hpp:23
Data model for meshes.
Definition Mesh.hpp:30
Port of a score::gfx::Node.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:53
Useful abstraction for storing all the data related to a render target.
Definition score-plugin-gfx/Gfx/Graph/Utils.hpp:119