Bind a navigation preset to a window and render processor.
Registers event handlers under the prefix "vp_<name>_". The specific handlers installed depend on mode; see ViewportPresetMode.
Currently only Fly mode is implemented, which does the following: Registers event handlers under the prefix "vp_<name>_": W/S/A/D forward, backward, strafe left, strafe right Q/E move down, move up along world Y RMB drag yaw and pitch (inverted) Scroll dolly along view direction KP1 front view KP3 right view KP7 top view KP9 flip to opposite view
41{
42 if (mode != ViewportPresetMode::Fly) {
43 MF_RT_ERROR(Journal::Component::API, Journal::Context::EventDispatch,
44 "ViewportPresetMode {} is not yet implemented",
45 static_cast<int>(mode));
46 return;
47 }
48
49 auto& record = s_registry[make_key(window, name)];
50 record.saved_config = window->get_input_config();
51 record.registered_events.clear();
52
53 auto st = std::make_shared<Kinesis::NavigationState>(
54 Kinesis::make_navigation_state(config));
55
56 on_mouse_pressed(window, IO::MouseButtons::Right, [st](double , double ) {
57 st->rmb_held = true;
58 st->first_mouse = true; }, event_name(name, "rmb_dn"));
59
60 on_mouse_released(window, IO::MouseButtons::Right, [st](
double ,
double ) { st->rmb_held =
false; }, event_name(name,
"rmb_up"));
61
62 on_key_pressed(window, IO::Keys::W, [st] { st->forward_held =
true; }, event_name(name,
"w_dn"));
63 on_key_released(window, IO::Keys::W, [st] { st->forward_held =
false; }, event_name(name,
"w_up"));
64 on_key_pressed(window, IO::Keys::S, [st] { st->back_held =
true; }, event_name(name,
"s_dn"));
65 on_key_released(window, IO::Keys::S, [st] { st->back_held =
false; }, event_name(name,
"s_up"));
66 on_key_pressed(window, IO::Keys::A, [st] { st->left_held =
true; }, event_name(name,
"a_dn"));
67 on_key_released(window, IO::Keys::A, [st] { st->left_held =
false; }, event_name(name,
"a_up"));
68 on_key_pressed(window, IO::Keys::D, [st] { st->right_held =
true; }, event_name(name,
"d_dn"));
69 on_key_released(window, IO::Keys::D, [st] { st->right_held =
false; }, event_name(name,
"d_up"));
70 on_key_pressed(window, IO::Keys::Q, [st] { st->down_held =
true; }, event_name(name,
"q_dn"));
71 on_key_released(window, IO::Keys::Q, [st] { st->down_held =
false; }, event_name(name,
"q_up"));
72 on_key_pressed(window, IO::Keys::E, [st] { st->up_held =
true; }, event_name(name,
"e_dn"));
73 on_key_released(window, IO::Keys::E, [st] { st->up_held =
false; }, event_name(name,
"e_up"));
74
76 if (!st->rmb_held) {
77 st->first_mouse = true;
78 return;
79 }
80 if (st->first_mouse) {
81 st->last_x = x;
82 st->last_y = y;
83 st->first_mouse = false;
84 return;
85 }
86 Kinesis::apply_mouse_delta(*st,
87 static_cast<float>(x - st->last_x),
88 static_cast<float>(y - st->last_y));
89 st->last_x = x;
90 st->last_y = y; }, event_name(name, "mouse"));
91
92 on_scroll(window, [st](
double ,
double dy) { Kinesis::apply_scroll(*st,
static_cast<float>(dy)); }, event_name(name,
"scroll"));
93
94 on_key_pressed(window, IO::Keys::KP1, [st] { Kinesis::snap_ortho(*st, 0); }, event_name(name,
"kp1"));
95 on_key_pressed(window, IO::Keys::KP3, [st] { Kinesis::snap_ortho(*st, 1); }, event_name(name,
"kp3"));
96 on_key_pressed(window, IO::Keys::KP7, [st] { Kinesis::snap_ortho(*st, 2); }, event_name(name,
"kp7"));
97 on_key_pressed(window, IO::Keys::KP9, [st] { Kinesis::snap_ortho(*st, 3); }, event_name(name,
"kp9"));
98
99 processor->set_view_transform_source(
100 [st, window_weak = std::weak_ptr<Core::Window>(window)]() -> Kinesis::ViewTransform {
101 auto win = window_weak.lock();
102 if (!win) {
103 return {};
104 }
105 const auto& ws = win->get_state();
106 const float aspect = (ws.current_height > 0)
107 ? static_cast<float>(ws.current_width) / static_cast<float>(ws.current_height)
108 : 1.0F;
109 return Kinesis::compute_view_transform(*st, aspect);
110 });
111}
#define MF_RT_ERROR(comp, ctx,...)
void on_mouse_move(const std::shared_ptr< Core::Window > &window, std::function< void(double, double)> callback, std::string name)
Schedule a mouse movement handler.
void on_scroll(const std::shared_ptr< Core::Window > &window, std::function< void(double, double)> callback, std::string name)
Schedule a mouse scroll handler.
void on_key_released(const std::shared_ptr< Core::Window > &window, IO::Keys key, std::function< void()> callback, std::string name)
Schedule a key release handler.
void on_mouse_released(const std::shared_ptr< Core::Window > &window, IO::MouseButtons button, std::function< void(double, double)> callback, std::string name)
Schedule a mouse button release handler.
void on_key_pressed(const std::shared_ptr< Core::Window > &window, IO::Keys key, std::function< void()> callback, std::string name)
Schedule a key press handler.