Loading...
Searching...
No Matches
GfxInputDevice.hpp
1#pragma once
2#include <Gfx/GfxDevice.hpp>
3#include <Gfx/GfxExecContext.hpp>
4#include <ossia/gfx/texture_parameter.hpp>
5#include <ossia/network/base/device.hpp>
6#include <ossia/network/base/protocol.hpp>
7namespace Video
8{
9class ExternalInput;
10}
11namespace score::gfx {
12class CameraNode;
13}
14namespace Gfx
15{
16
17class simple_texture_input_protocol : public ossia::net::protocol_base
18{
19public:
21 : protocol_base{flags{}}
22 {
23 }
24
25 bool pull(ossia::net::parameter_base&) override { return false; }
26 bool push(const ossia::net::parameter_base&, const ossia::value& v) override
27 {
28 return false;
29 }
30 bool push_raw(const ossia::net::full_parameter_data&) override { return false; }
31 bool observe(ossia::net::parameter_base&, bool) override { return false; }
32 bool update(ossia::net::node_base& node_base) override { return false; }
33
34 void start_execution() override { }
35 void stop_execution() override { }
36};
37
38class simple_texture_input_parameter : public ossia::gfx::texture_parameter
39{
40 GfxExecutionAction* context{};
41
42 std::shared_ptr<bool> context_alive;
43
44public:
45 int32_t node_id{score::gfx::invalid_node_index};
46 score::gfx::Node* node{};
47
49 score::gfx::Node* gfx_n, GfxExecutionAction* ctx, ossia::net::node_base& n)
50 : ossia::gfx::texture_parameter{n}
51 , context{ctx}
52 , context_alive{ctx ? ctx->alive : nullptr}
53 , node{gfx_n}
54 {
55 node_id = context->ui->register_node(std::unique_ptr<score::gfx::Node>{gfx_n});
56 }
57
58 void pull_texture(ossia::gfx::port_index idx) override
59 {
60 context->setEdge(
61 port_index{this->node_id, 0}, idx, Process::CableType::ImmediateGlutton);
62
64 m.node_id = node_id;
65 context->ui->send_message(std::move(m));
66 }
67
69 {
70 if(context_alive && *context_alive)
71 context->ui->unregister_node(node_id);
72 }
73};
74
76class simple_texture_input_node : public ossia::net::node_base
77{
78 ossia::net::device_base& m_device;
79 node_base* m_parent{};
80 std::unique_ptr<simple_texture_input_parameter> m_parameter;
81
82public:
84 score::gfx::Node* gfx_n, GfxExecutionAction* context, ossia::net::device_base& dev,
85 std::string name)
86 : m_device{dev}
87 , m_parameter{
88 std::make_unique<simple_texture_input_parameter>(gfx_n, context, *this)}
89 {
90 m_name = std::move(name);
91 }
92
93 simple_texture_input_parameter* get_parameter() const override
94 {
95 return m_parameter.get();
96 }
97
98private:
99 ossia::net::device_base& get_device() const override { return m_device; }
100 ossia::net::node_base* get_parent() const override { return m_parent; }
101 ossia::net::node_base& set_name(std::string) override { return *this; }
102 ossia::net::parameter_base* create_parameter(ossia::val_type) override
103 {
104 return m_parameter.get();
105 }
106 bool remove_parameter() override { return false; }
107
108 std::unique_ptr<ossia::net::node_base> make_child(const std::string& name) override
109 {
110 return {};
111 }
112 void removing_child(ossia::net::node_base& node_base) override { }
113};
114
115class simple_texture_input_device : public ossia::net::device_base
116{
118
119public:
121 score::gfx::Node* gfx_n, GfxExecutionAction* context,
122 std::unique_ptr<ossia::net::protocol_base> proto, std::string name)
123 : ossia::net::device_base{std::move(proto)}
124 , root{gfx_n, context, *this, name}
125 {
126 }
127
128 const simple_texture_input_node& get_root_node() const override { return root; }
129 simple_texture_input_node& get_root_node() override { return root; }
130};
131
140class texture_input_stream_node final : public ossia::net::node_base
141{
142 ossia::net::device_base& m_device;
143 ossia::net::node_base* m_parent{};
144 std::unique_ptr<simple_texture_input_parameter> m_parameter;
145
146public:
148 score::gfx::Node* gfx_n, GfxExecutionAction* context,
149 ossia::net::device_base& dev, ossia::net::node_base& parent, std::string name)
150 : m_device{dev}
151 , m_parent{&parent}
152 , m_parameter{
153 std::make_unique<simple_texture_input_parameter>(gfx_n, context, *this)}
154 {
155 m_name = std::move(name);
156 }
157
158 simple_texture_input_parameter* get_parameter() const override
159 {
160 return m_parameter.get();
161 }
162
163private:
164 ossia::net::device_base& get_device() const override { return m_device; }
165 ossia::net::node_base* get_parent() const override { return m_parent; }
166 ossia::net::node_base& set_name(std::string) override { return *this; }
167 ossia::net::parameter_base* create_parameter(ossia::val_type) override
168 {
169 return m_parameter.get();
170 }
171 bool remove_parameter() override { return false; }
172 std::unique_ptr<ossia::net::node_base> make_child(const std::string&) override
173 {
174 return {};
175 }
176 void removing_child(ossia::net::node_base&) override { }
177};
178
186class multi_texture_input_node final : public ossia::net::node_base
187{
188 ossia::net::device_base& m_device;
189
190public:
191 multi_texture_input_node(ossia::net::device_base& dev, std::string name)
192 : m_device{dev}
193 {
194 m_name = std::move(name);
195 }
196
197 ossia::net::node_base*
198 add_stream(score::gfx::Node* gfx_n, GfxExecutionAction* context, std::string name)
199 {
200 return add_child(std::make_unique<texture_input_stream_node>(
201 gfx_n, context, m_device, *this, std::move(name)));
202 }
203
204 ossia::net::parameter_base* get_parameter() const override { return nullptr; }
205
206private:
207 ossia::net::device_base& get_device() const override { return m_device; }
208 ossia::net::node_base* get_parent() const override { return nullptr; }
209 ossia::net::node_base& set_name(std::string) override { return *this; }
210 ossia::net::parameter_base* create_parameter(ossia::val_type) override
211 {
212 return nullptr;
213 }
214 bool remove_parameter() override { return false; }
215 std::unique_ptr<ossia::net::node_base> make_child(const std::string&) override
216 {
217 return {};
218 }
219 void removing_child(ossia::net::node_base&) override { }
220};
221
222class multi_texture_input_device final : public ossia::net::device_base
223{
225
226public:
228 std::unique_ptr<ossia::net::protocol_base> proto, std::string name)
229 : ossia::net::device_base{std::move(proto)}
230 , root{*this, std::move(name)}
231 {
232 }
233
234 ossia::net::node_base*
235 add_stream(score::gfx::Node* gfx_n, GfxExecutionAction* context, std::string name)
236 {
237 return root.add_stream(gfx_n, context, std::move(name));
238 }
239
240 const multi_texture_input_node& get_root_node() const override { return root; }
241 multi_texture_input_node& get_root_node() override { return root; }
242};
243
244class SCORE_PLUGIN_GFX_EXPORT video_texture_input_protocol
245 : public ossia::net::protocol_base
246{
247public:
248 std::shared_ptr<::Video::ExternalInput> camera;
250 std::shared_ptr<::Video::ExternalInput> cam, GfxExecutionAction& ctx);
252
253 GfxExecutionAction* context{};
254 bool pull(ossia::net::parameter_base&) override;
255 bool push(const ossia::net::parameter_base&, const ossia::value& v) override;
256 bool push_raw(const ossia::net::full_parameter_data&) override;
257 bool observe(ossia::net::parameter_base&, bool) override;
258 bool update(ossia::net::node_base& node_base) override;
259
260 void start_execution() override;
261 void stop_execution() override;
262
263 score::gfx::CameraNode* camera_node{};
264};
265
266class SCORE_PLUGIN_GFX_EXPORT video_texture_input_parameter
267 : public ossia::gfx::texture_parameter
268{
270 GfxExecutionAction* context{};
271 std::shared_ptr<bool> context_alive;
272
273public:
274 std::shared_ptr<::Video::ExternalInput> camera;
275 int32_t node_id{};
276 score::gfx::CameraNode* node{};
277
279 ossia::net::node_base& n, video_texture_input_protocol& proto);
280 void pull_texture(ossia::gfx::port_index idx) override;
281
283};
284
286class SCORE_PLUGIN_GFX_EXPORT video_texture_input_node : public ossia::net::node_base
287{
288 ossia::net::device_base& m_device;
289 node_base* m_parent{};
290 std::unique_ptr<video_texture_input_parameter> m_parameter;
291
292public:
293 video_texture_input_node(ossia::net::device_base& dev, std::string name);
295
296 video_texture_input_parameter* get_parameter() const override;
297
298private:
299 ossia::net::device_base& get_device() const override;
300 ossia::net::node_base* get_parent() const override;
301 ossia::net::node_base& set_name(std::string) override;
302 ossia::net::parameter_base* create_parameter(ossia::val_type) override;
303 bool remove_parameter() override;
304
305 std::unique_ptr<ossia::net::node_base> make_child(const std::string& name) override;
306 void removing_child(ossia::net::node_base& node_base) override;
307};
308
309class SCORE_PLUGIN_GFX_EXPORT video_texture_input_device : public ossia::net::device_base
310{
312
313public:
315 std::unique_ptr<ossia::net::protocol_base> proto, std::string name)
316 : ossia::net::device_base{std::move(proto)}
317 , root{*this, name}
318 {
319 }
321
322 const video_texture_input_node& get_root_node() const override { return root; }
323 video_texture_input_node& get_root_node() override { return root; }
324};
325
326}
Definition GfxExecContext.hpp:18
Definition GfxInputDevice.hpp:223
Root of a device exposing several texture streams.
Definition GfxInputDevice.hpp:187
Definition GfxInputDevice.hpp:116
Definition GfxInputDevice.hpp:77
Definition GfxInputDevice.hpp:39
Definition GfxInputDevice.hpp:18
One stream of a device that exposes several.
Definition GfxInputDevice.hpp:141
Definition GfxInputDevice.hpp:310
Definition GfxInputDevice.hpp:287
Definition GfxInputDevice.hpp:268
Definition GfxInputDevice.hpp:246
Root data model for visual nodes.
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:74
Binds the rendering pipeline to ossia processes.
Definition AssetTable.cpp:7
Graphics rendering pipeline for ossia score.
Definition Filter/PreviewWidget.hpp:11
Definition score-plugin-gfx/Gfx/Graph/Node.hpp:49