56 ossia::net::parameter_base* scaled_win{};
57 ossia::net::parameter_base* gl_win{};
58 ossia::net::parameter_base* abs_win{};
59 ossia::net::parameter_base* abs_tablet_win{};
60 ossia::net::parameter_base* size_param{};
61 ossia::net::parameter_base* rendersize_param{};
63 void update_viewport()
65 auto v = rendersize_param->value();
66 if(
auto val = v.target<ossia::vec2f>())
68 auto dom = abs_win->get_domain();
69 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
71 ossia::set_max(dom, *val);
72 abs_win->set_domain(std::move(dom));
73 abs_tablet_win->set_domain(std::move(dom));
78 v = size_param->value();
79 if(
auto val = v.target<ossia::vec2f>())
81 auto dom = abs_win->get_domain();
82 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
84 ossia::set_max(dom, *val);
85 abs_win->set_domain(std::move(dom));
86 abs_tablet_win->set_domain(std::move(dom));
93 v = size_param->value();
94 if(
auto val = v.target<ossia::vec2f>())
96 auto dom = abs_win->get_domain();
97 if((*val)[0] >= 1.f && (*val)[1] >= 1.f)
99 ossia::set_max(dom, *val);
100 abs_win->set_domain(std::move(dom));
101 abs_tablet_win->set_domain(std::move(dom));
110 if(
auto w = m_screen->window())
113 m_screen->onWindowMove = [](QPointF) { };
114 m_screen->onMouseMove = [](QPointF, QPointF) { };
115 m_screen->onTabletMove = [](QTabletEvent*) { };
116 m_screen->onKey = [](int,
const QString&) { };
117 m_screen->onKeyRelease = [](int,
const QString&) { };
118 m_screen->onFps = [](float) { };
121 m_root.clear_children();
127 std::unique_ptr<gfx_protocol_base> proto, std::string name,
128 SwapchainFlag swapFlag = SwapchainFlag::NoFlag,
129 SwapchainFormat swapFormat = SwapchainFormat::SDR)
130 : ossia::net::device_base{std::move(proto)}
131 , m_screen{createScreenNode(swapFlag, swapFormat)}
132 , m_root{*
this, *
static_cast<gfx_protocol_base*
>(m_protocol.get()), m_screen, name}
134 this->m_capabilities.change_tree =
true;
135 m_screen->setTitle(QString::fromStdString(name));
139 = std::make_unique<ossia::net::generic_node>(
"screen", *
this, m_root);
140 auto screen_param = screen_node->create_parameter(ossia::val_type::STRING);
141 screen_param->set_domain(ossia::make_domain(
int(0),
int(100)));
142 screen_param->add_callback([
this](
const ossia::value& v) {
143 if(
auto val = v.target<
int>())
145 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, scr = *val] {
146 const auto& cur_screens = qGuiApp->screens();
147 if(ossia::valid_index(scr, cur_screens))
149 screen->setScreen(cur_screens[scr]);
153 else if(
auto val = v.target<std::string>())
155 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, scr = *val] {
156 const auto& cur_screens = qGuiApp->screens();
157 for(
auto s : cur_screens)
159 if(s->name() == scr.c_str())
161 screen->setScreen(s);
168 m_root.add_child(std::move(screen_node));
172 struct move_window_lock
176 auto lock = std::make_shared<move_window_lock>();
179 = std::make_unique<ossia::net::generic_node>(
"position", *
this, m_root);
180 auto pos_param = pos_node->create_parameter(ossia::val_type::VEC2F);
181 pos_param->push_value(
182 ossia::vec2f{100.f, 100.f});
183 pos_param->add_callback([
this, lock](
const ossia::value& v) {
186 if(
auto val = v.target<ossia::vec2f>())
188 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val, lock] {
189 screen->setPosition({(int)v[0], (
int)v[1]});
194 m_screen->onWindowMove = [
this, pos_param, lock](QPointF pos) {
197 if(
const auto& w = m_screen->window())
200 pos_param->set_value(ossia::vec2f{float(pos.x()), float(pos.y())});
201 lock->locked =
false;
204 m_root.add_child(std::move(pos_node));
209 auto node = std::make_unique<ossia::net::generic_node>(
"cursor", *
this, m_root);
212 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
213 scaled_win = scale_node->create_parameter(ossia::val_type::VEC2F);
214 scaled_win->set_domain(ossia::make_domain(0.f, 1.f));
215 scaled_win->push_value(ossia::vec2f{0.f, 0.f});
216 node->add_child(std::move(scale_node));
220 auto scale_node = std::make_unique<ossia::net::generic_node>(
"gl", *
this, *node);
221 gl_win = scale_node->create_parameter(ossia::val_type::VEC2F);
222 gl_win->set_domain(ossia::make_domain(0.f, 1.f));
223 gl_win->push_value(ossia::vec2f{0.f, 0.f});
224 node->add_child(std::move(scale_node));
228 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
229 abs_win = abs_node->create_parameter(ossia::val_type::VEC2F);
231 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
232 abs_win->push_value(ossia::vec2f{0.f, 0.f});
233 node->add_child(std::move(abs_node));
237 = std::make_unique<ossia::net::generic_node>(
"visible", *
this, *node);
238 auto param = visible->create_parameter(ossia::val_type::BOOL);
239 param->add_callback([
this](
const ossia::value& v) {
240 if(
auto val = v.target<
bool>())
242 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
243 screen->setCursor(v);
247 node->add_child(std::move(visible));
250 m_screen->onMouseMove = [
this](
const QPointF screen,
const QPointF win) {
251 if(
const auto& w = m_screen->window())
253 const auto sz = w->size();
254 scaled_win->push_value(
255 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
258 float(win.x() / sz.width()), 1.f - float(win.y() / sz.height())});
259 abs_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
263 m_root.add_child(std::move(node));
267 ossia::net::parameter_base* scaled_tablet_win{};
269 auto node = std::make_unique<ossia::net::generic_node>(
"tablet", *
this, m_root);
270 ossia::net::parameter_base* tablet_pressure{};
271 ossia::net::parameter_base* tablet_z{};
272 ossia::net::parameter_base* tablet_tan{};
273 ossia::net::parameter_base* tablet_rot{};
274 ossia::net::parameter_base* tablet_tilt_x{};
275 ossia::net::parameter_base* tablet_tilt_y{};
278 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
279 scaled_tablet_win = scale_node->create_parameter(ossia::val_type::VEC2F);
280 scaled_tablet_win->set_domain(ossia::make_domain(0.f, 1.f));
281 scaled_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
282 node->add_child(std::move(scale_node));
286 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
287 abs_tablet_win = abs_node->create_parameter(ossia::val_type::VEC2F);
288 abs_tablet_win->set_domain(
289 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
290 abs_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
291 node->add_child(std::move(abs_node));
294 auto scale_node = std::make_unique<ossia::net::generic_node>(
"z", *
this, *node);
295 tablet_z = scale_node->create_parameter(ossia::val_type::INT);
296 node->add_child(std::move(scale_node));
300 = std::make_unique<ossia::net::generic_node>(
"pressure", *
this, *node);
301 tablet_pressure = scale_node->create_parameter(ossia::val_type::FLOAT);
304 node->add_child(std::move(scale_node));
308 = std::make_unique<ossia::net::generic_node>(
"tangential", *
this, *node);
309 tablet_tan = scale_node->create_parameter(ossia::val_type::FLOAT);
310 tablet_tan->set_domain(ossia::make_domain(-1.f, 1.f));
312 node->add_child(std::move(scale_node));
316 = std::make_unique<ossia::net::generic_node>(
"rotation", *
this, *node);
317 tablet_rot = scale_node->create_parameter(ossia::val_type::FLOAT);
318 tablet_rot->set_unit(ossia::degree_u{});
319 tablet_rot->set_domain(ossia::make_domain(-180.f, 180.f));
320 node->add_child(std::move(scale_node));
324 = std::make_unique<ossia::net::generic_node>(
"tilt_x", *
this, *node);
325 tablet_tilt_x = scale_node->create_parameter(ossia::val_type::FLOAT);
326 tablet_tilt_x->set_domain(ossia::make_domain(-60.f, 60.f));
327 tablet_tilt_x->set_unit(ossia::degree_u{});
328 node->add_child(std::move(scale_node));
332 = std::make_unique<ossia::net::generic_node>(
"tilt_y", *
this, *node);
333 tablet_tilt_y = scale_node->create_parameter(ossia::val_type::FLOAT);
334 tablet_tilt_y->set_domain(ossia::make_domain(-60.f, 60.f));
335 tablet_tilt_y->set_unit(ossia::degree_u{});
336 node->add_child(std::move(scale_node));
339 m_screen->onTabletMove = [=,
this](QTabletEvent* ev) {
340 if(
const auto& w = m_screen->window())
342 const auto sz = w->size();
343 const auto win = ev->position();
344 scaled_tablet_win->push_value(
345 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
346 abs_tablet_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
347 tablet_pressure->push_value(ev->pressure());
348 tablet_tan->push_value(ev->tangentialPressure());
349 tablet_rot->push_value(ev->rotation());
350 tablet_z->push_value(ev->z());
351 tablet_tilt_x->push_value(ev->xTilt());
352 tablet_tilt_y->push_value(ev->yTilt());
356 m_root.add_child(std::move(node));
360 auto size_node = std::make_unique<ossia::net::generic_node>(
"size", *
this, m_root);
361 size_param = size_node->create_parameter(ossia::val_type::VEC2F);
362 size_param->push_value(ossia::vec2f{1280.f, 720.f});
363 size_param->add_callback([
this](
const ossia::value& v) {
364 if(
auto val = v.target<ossia::vec2f>())
366 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
367 screen->setSize({(int)v[0], (int)v[1]});
374 m_root.add_child(std::move(size_node));
379 = std::make_unique<ossia::net::generic_node>(
"rendersize", *
this, m_root);
380 ossia::net::set_description(
381 *size_node,
"Set to [0, 0] to use the viewport's size");
383 rendersize_param = size_node->create_parameter(ossia::val_type::VEC2F);
384 rendersize_param->push_value(ossia::vec2f{0.f, 0.f});
385 rendersize_param->add_callback([
this](
const ossia::value& v) {
386 if(
auto val = v.target<ossia::vec2f>())
388 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
389 screen->setRenderSize({(int)v[0], (int)v[1]});
396 m_root.add_child(std::move(size_node));
401 auto node = std::make_unique<ossia::net::generic_node>(
"key", *
this, m_root);
404 = std::make_unique<ossia::net::generic_node>(
"press", *
this, *node);
405 ossia::net::parameter_base* press_param{};
406 ossia::net::parameter_base* text_param{};
409 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *press_node);
410 press_param = code_node->create_parameter(ossia::val_type::INT);
411 press_param->push_value(ossia::vec2f{0.f, 0.f});
412 press_node->add_child(std::move(code_node));
416 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *press_node);
417 text_param = text_node->create_parameter(ossia::val_type::STRING);
418 press_node->add_child(std::move(text_node));
421 m_screen->onKey = [press_param, text_param](
int key,
const QString& text) {
422 press_param->push_value(key);
423 text_param->push_value(text.toStdString());
425 node->add_child(std::move(press_node));
429 = std::make_unique<ossia::net::generic_node>(
"release", *
this, *node);
430 ossia::net::parameter_base* press_param{};
431 ossia::net::parameter_base* text_param{};
434 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *release_node);
435 press_param = code_node->create_parameter(ossia::val_type::INT);
436 press_param->push_value(ossia::vec2f{0.f, 0.f});
437 release_node->add_child(std::move(code_node));
441 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *release_node);
442 text_param = text_node->create_parameter(ossia::val_type::STRING);
443 release_node->add_child(std::move(text_node));
446 m_screen->onKeyRelease
447 = [press_param, text_param](
int key,
const QString& text) {
448 press_param->push_value(key);
449 text_param->push_value(text.toStdString());
451 node->add_child(std::move(release_node));
454 m_root.add_child(std::move(node));
459 = std::make_unique<ossia::net::generic_node>(
"fullscreen", *
this, m_root);
460 auto fs_param = fs_node->create_parameter(ossia::val_type::BOOL);
461 fs_param->add_callback([
this](
const ossia::value& v) {
462 if(
auto val = v.target<
bool>())
464 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
465 screen->setFullScreen(v);
469 m_root.add_child(std::move(fs_node));
473 auto fps_node = std::make_unique<ossia::net::generic_node>(
"fps", *
this, m_root);
474 auto fps_param = fps_node->create_parameter(ossia::val_type::FLOAT);
475 m_screen->onFps = [fps_param](
float fps) { fps_param->push_value(fps); };
476 m_root.add_child(std::move(fps_node));
480 const gfx_node_base& get_root_node()
const override {
return m_root; }
481 gfx_node_base& get_root_node()
override {
return m_root; }