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));
111 if(
auto w = m_screen->window())
114 m_screen->onWindowMove = [](QPointF) { };
115 m_screen->onMouseMove = [](QPointF, QPointF) { };
116 m_screen->onTabletMove = [](QTabletEvent*) { };
117 m_screen->onKey = [](int,
const QString&) { };
118 m_screen->onKeyRelease = [](int,
const QString&) { };
119 m_screen->onFps = [](float) { };
122 m_root.clear_children();
128 std::unique_ptr<gfx_protocol_base> proto, std::string name,
129 SwapchainFlag swapFlag = SwapchainFlag::NoFlag,
130 SwapchainFormat swapFormat = SwapchainFormat::SDR)
131 : ossia::net::device_base{std::move(proto)}
132 , m_screen{createScreenNode(swapFlag, swapFormat)}
133 , m_root{*
this, *
static_cast<gfx_protocol_base*
>(m_protocol.get()), m_screen, name}
135 this->m_capabilities.change_tree =
true;
136 m_screen->setTitle(QString::fromStdString(name));
140 = std::make_unique<ossia::net::generic_node>(
"screen", *
this, m_root);
141 auto screen_param = screen_node->create_parameter(ossia::val_type::STRING);
142 screen_param->set_domain(ossia::make_domain(
int(0),
int(100)));
143 screen_param->add_callback([
this](
const ossia::value& v) {
144 if(
auto val = v.target<
int>())
146 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, scr = *val] {
147 const auto& cur_screens = qGuiApp->screens();
148 if(ossia::valid_index(scr, cur_screens))
150 screen->setScreen(cur_screens[scr]);
154 else if(
auto val = v.target<std::string>())
156 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, scr = *val] {
157 const auto& cur_screens = qGuiApp->screens();
158 for(
auto s : cur_screens)
160 if(s->name() == scr.c_str())
162 screen->setScreen(s);
169 m_root.add_child(std::move(screen_node));
173 struct move_window_lock
177 auto lock = std::make_shared<move_window_lock>();
180 = std::make_unique<ossia::net::generic_node>(
"position", *
this, m_root);
181 auto pos_param = pos_node->create_parameter(ossia::val_type::VEC2F);
182 pos_param->push_value(
183 ossia::vec2f{100.f, 100.f});
184 pos_param->add_callback([
this, lock](
const ossia::value& v) {
187 if(
auto val = v.target<ossia::vec2f>())
189 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val, lock] {
190 screen->setPosition({(int)v[0], (
int)v[1]});
195 m_screen->onWindowMove = [
this, pos_param, lock](QPointF pos) {
198 if(
const auto& w = m_screen->window())
201 pos_param->set_value(ossia::vec2f{float(pos.x()), float(pos.y())});
202 lock->locked =
false;
205 m_root.add_child(std::move(pos_node));
210 auto node = std::make_unique<ossia::net::generic_node>(
"cursor", *
this, m_root);
213 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
214 scaled_win = scale_node->create_parameter(ossia::val_type::VEC2F);
215 scaled_win->set_domain(ossia::make_domain(0.f, 1.f));
216 scaled_win->push_value(ossia::vec2f{0.f, 0.f});
217 node->add_child(std::move(scale_node));
221 auto scale_node = std::make_unique<ossia::net::generic_node>(
"gl", *
this, *node);
222 gl_win = scale_node->create_parameter(ossia::val_type::VEC2F);
223 gl_win->set_domain(ossia::make_domain(0.f, 1.f));
224 gl_win->push_value(ossia::vec2f{0.f, 0.f});
225 node->add_child(std::move(scale_node));
229 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
230 abs_win = abs_node->create_parameter(ossia::val_type::VEC2F);
232 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
233 abs_win->push_value(ossia::vec2f{0.f, 0.f});
234 node->add_child(std::move(abs_node));
238 = std::make_unique<ossia::net::generic_node>(
"visible", *
this, *node);
239 auto param = visible->create_parameter(ossia::val_type::BOOL);
240 param->add_callback([
this](
const ossia::value& v) {
241 if(
auto val = v.target<
bool>())
243 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
244 screen->setCursor(v);
248 node->add_child(std::move(visible));
251 m_screen->onMouseMove = [
this](
const QPointF screen,
const QPointF win) {
252 if(
const auto& w = m_screen->window())
254 const auto sz = w->size();
255 scaled_win->push_value(
256 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
259 float(win.x() / sz.width()), 1.f - float(win.y() / sz.height())});
260 abs_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
264 m_root.add_child(std::move(node));
268 ossia::net::parameter_base* scaled_tablet_win{};
270 auto node = std::make_unique<ossia::net::generic_node>(
"tablet", *
this, m_root);
271 ossia::net::parameter_base* tablet_pressure{};
272 ossia::net::parameter_base* tablet_z{};
273 ossia::net::parameter_base* tablet_tan{};
274 ossia::net::parameter_base* tablet_rot{};
275 ossia::net::parameter_base* tablet_tilt_x{};
276 ossia::net::parameter_base* tablet_tilt_y{};
279 = std::make_unique<ossia::net::generic_node>(
"scaled", *
this, *node);
280 scaled_tablet_win = scale_node->create_parameter(ossia::val_type::VEC2F);
281 scaled_tablet_win->set_domain(ossia::make_domain(0.f, 1.f));
282 scaled_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
283 node->add_child(std::move(scale_node));
287 = std::make_unique<ossia::net::generic_node>(
"absolute", *
this, *node);
288 abs_tablet_win = abs_node->create_parameter(ossia::val_type::VEC2F);
289 abs_tablet_win->set_domain(
290 ossia::make_domain(ossia::vec2f{0.f, 0.f}, ossia::vec2f{1280, 270.f}));
291 abs_tablet_win->push_value(ossia::vec2f{0.f, 0.f});
292 node->add_child(std::move(abs_node));
295 auto scale_node = std::make_unique<ossia::net::generic_node>(
"z", *
this, *node);
296 tablet_z = scale_node->create_parameter(ossia::val_type::INT);
297 node->add_child(std::move(scale_node));
301 = std::make_unique<ossia::net::generic_node>(
"pressure", *
this, *node);
302 tablet_pressure = scale_node->create_parameter(ossia::val_type::FLOAT);
305 node->add_child(std::move(scale_node));
309 = std::make_unique<ossia::net::generic_node>(
"tangential", *
this, *node);
310 tablet_tan = scale_node->create_parameter(ossia::val_type::FLOAT);
311 tablet_tan->set_domain(ossia::make_domain(-1.f, 1.f));
313 node->add_child(std::move(scale_node));
317 = std::make_unique<ossia::net::generic_node>(
"rotation", *
this, *node);
318 tablet_rot = scale_node->create_parameter(ossia::val_type::FLOAT);
319 tablet_rot->set_unit(ossia::degree_u{});
320 tablet_rot->set_domain(ossia::make_domain(-180.f, 180.f));
321 node->add_child(std::move(scale_node));
325 = std::make_unique<ossia::net::generic_node>(
"tilt_x", *
this, *node);
326 tablet_tilt_x = scale_node->create_parameter(ossia::val_type::FLOAT);
327 tablet_tilt_x->set_domain(ossia::make_domain(-60.f, 60.f));
328 tablet_tilt_x->set_unit(ossia::degree_u{});
329 node->add_child(std::move(scale_node));
333 = std::make_unique<ossia::net::generic_node>(
"tilt_y", *
this, *node);
334 tablet_tilt_y = scale_node->create_parameter(ossia::val_type::FLOAT);
335 tablet_tilt_y->set_domain(ossia::make_domain(-60.f, 60.f));
336 tablet_tilt_y->set_unit(ossia::degree_u{});
337 node->add_child(std::move(scale_node));
340 m_screen->onTabletMove = [=,
this](QTabletEvent* ev) {
341 if(
const auto& w = m_screen->window())
343 const auto sz = w->size();
344 const auto win = ev->position();
345 scaled_tablet_win->push_value(
346 ossia::vec2f{float(win.x() / sz.width()), float(win.y() / sz.height())});
347 abs_tablet_win->push_value(ossia::vec2f{float(win.x()), float(win.y())});
348 tablet_pressure->push_value(ev->pressure());
349 tablet_tan->push_value(ev->tangentialPressure());
350 tablet_rot->push_value(ev->rotation());
351 tablet_z->push_value(ev->z());
352 tablet_tilt_x->push_value(ev->xTilt());
353 tablet_tilt_y->push_value(ev->yTilt());
357 m_root.add_child(std::move(node));
361 auto size_node = std::make_unique<ossia::net::generic_node>(
"size", *
this, m_root);
362 size_param = size_node->create_parameter(ossia::val_type::VEC2F);
363 size_param->push_value(ossia::vec2f{1280.f, 720.f});
364 size_param->add_callback([
this](
const ossia::value& v) {
365 if(
auto val = v.target<ossia::vec2f>())
367 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
368 screen->setSize({(int)v[0], (int)v[1]});
375 m_root.add_child(std::move(size_node));
380 = std::make_unique<ossia::net::generic_node>(
"rendersize", *
this, m_root);
381 ossia::net::set_description(
382 *size_node,
"Set to [0, 0] to use the viewport's size");
384 rendersize_param = size_node->create_parameter(ossia::val_type::VEC2F);
385 rendersize_param->push_value(ossia::vec2f{0.f, 0.f});
386 rendersize_param->add_callback([
this](
const ossia::value& v) {
387 if(
auto val = v.target<ossia::vec2f>())
389 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
390 screen->setRenderSize({(int)v[0], (int)v[1]});
397 m_root.add_child(std::move(size_node));
402 auto node = std::make_unique<ossia::net::generic_node>(
"key", *
this, m_root);
405 = std::make_unique<ossia::net::generic_node>(
"press", *
this, *node);
406 ossia::net::parameter_base* press_param{};
407 ossia::net::parameter_base* text_param{};
410 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *press_node);
411 press_param = code_node->create_parameter(ossia::val_type::INT);
412 press_param->push_value(ossia::vec2f{0.f, 0.f});
413 press_node->add_child(std::move(code_node));
417 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *press_node);
418 text_param = text_node->create_parameter(ossia::val_type::STRING);
419 press_node->add_child(std::move(text_node));
422 m_screen->onKey = [press_param, text_param](
int key,
const QString& text) {
423 press_param->push_value(key);
424 text_param->push_value(text.toStdString());
426 node->add_child(std::move(press_node));
430 = std::make_unique<ossia::net::generic_node>(
"release", *
this, *node);
431 ossia::net::parameter_base* press_param{};
432 ossia::net::parameter_base* text_param{};
435 = std::make_unique<ossia::net::generic_node>(
"code", *
this, *release_node);
436 press_param = code_node->create_parameter(ossia::val_type::INT);
437 press_param->push_value(ossia::vec2f{0.f, 0.f});
438 release_node->add_child(std::move(code_node));
442 = std::make_unique<ossia::net::generic_node>(
"text", *
this, *release_node);
443 text_param = text_node->create_parameter(ossia::val_type::STRING);
444 release_node->add_child(std::move(text_node));
447 m_screen->onKeyRelease
448 = [press_param, text_param](
int key,
const QString& text) {
449 press_param->push_value(key);
450 text_param->push_value(text.toStdString());
452 node->add_child(std::move(release_node));
455 m_root.add_child(std::move(node));
460 = std::make_unique<ossia::net::generic_node>(
"fullscreen", *
this, m_root);
461 auto fs_param = fs_node->create_parameter(ossia::val_type::BOOL);
462 fs_param->add_callback([
this](
const ossia::value& v) {
463 if(
auto val = v.target<
bool>())
465 ossia::qt::run_async(&m_qtContext, [screen = this->m_screen, v = *val] {
466 screen->setFullScreen(v);
470 m_root.add_child(std::move(fs_node));
474 auto fps_node = std::make_unique<ossia::net::generic_node>(
"fps", *
this, m_root);
475 auto fps_param = fps_node->create_parameter(ossia::val_type::FLOAT);
476 m_screen->onFps = [fps_param](
float fps) { fps_param->push_value(fps); };
477 m_root.add_child(std::move(fps_node));
481 const gfx_node_base& get_root_node()
const override {
return m_root; }
482 gfx_node_base& get_root_node()
override {
return m_root; }