Bind the fly navigation controller to a window and render processor.
Registers event handlers under the prefix "vp_<name>_". Key assignments default to WASD/QE translation with KP ortho snaps; pass a FlyKeyMap to override any or all bindings. Ortho snap slots set to std::nullopt are silently skipped.
78{
79 auto& record = s_registry[make_key(window, name)];
80 record.saved_config = window->get_input_config();
81 record.registered_events.clear();
82
83 auto st = std::make_shared<Kinesis::NavigationState>(
84 Kinesis::make_navigation_state(config));
85
87 st->rmb_held = true;
88 st->first_mouse = true; }, event_name(name, "rmb_dn"));
89
90 on_mouse_released(window, IO::MouseButtons::Right, [st](double , double ) { st->rmb_held = false; }, event_name(name, "rmb_up"));
91
92 on_key_pressed(window, key_map.
forward, [st] { st->forward_held = true; }, event_name(name,
"fwd_dn"));
94 on_key_pressed(window, key_map.
back, [st] { st->back_held = true; }, event_name(name,
"bck_dn"));
95 on_key_released(window, key_map.
back, [st] { st->back_held = false; }, event_name(name,
"bck_up"));
96 on_key_pressed(window, key_map.
left, [st] { st->left_held = true; }, event_name(name,
"lft_dn"));
97 on_key_released(window, key_map.
left, [st] { st->left_held = false; }, event_name(name,
"lft_up"));
98 on_key_pressed(window, key_map.
right, [st] { st->right_held = true; }, event_name(name,
"rgt_dn"));
99 on_key_released(window, key_map.
right, [st] { st->right_held = false; }, event_name(name,
"rgt_up"));
100 on_key_pressed(window, key_map.
down, [st] { st->down_held = true; }, event_name(name,
"dwn_dn"));
101 on_key_released(window, key_map.
down, [st] { st->down_held = false; }, event_name(name,
"dwn_up"));
102 on_key_pressed(window, key_map.
up, [st] { st->up_held = true; }, event_name(name,
"up_dn"));
103 on_key_released(window, key_map.
up, [st] { st->up_held = false; }, event_name(name,
"up_up"));
104
113
115 if (!st->rmb_held) {
116 st->first_mouse = true;
117 return;
118 }
119 if (st->first_mouse) {
120 st->last_x = x;
121 st->last_y = y;
122 st->first_mouse = false;
123 return;
124 }
125 Kinesis::apply_mouse_delta(*st,
126 static_cast<float>(x - st->last_x),
127 static_cast<float>(y - st->last_y));
128 st->last_x = x;
129 st->last_y = y; }, event_name(name, "mouse"));
130
131 on_scroll(window, [st](
double ,
double dy) { Kinesis::apply_scroll(*st,
static_cast<float>(dy)); }, event_name(name,
"scroll"));
132
133 processor->set_view_transform_source(
134 [st, window_weak = std::weak_ptr<Core::Window>(window)]() -> Kinesis::ViewTransform {
135 auto win = window_weak.lock();
136 if (!win) {
137 return {};
138 }
139 const auto& ws = win->get_state();
140 const float aspect = (ws.current_height > 0)
141 ? static_cast<float>(ws.current_width) / static_cast<float>(ws.current_height)
142 : 1.0F;
143 return Kinesis::compute_view_transform(*st, aspect);
144 });
145}
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_mouse_pressed(const std::shared_ptr< Core::Window > &window, IO::MouseButtons button, std::function< void(double, double)> callback, std::string name)
Schedule a mouse button press 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_key_pressed(const std::shared_ptr< Core::Window > &window, IO::Keys key, std::function< void()> callback, std::string name)
Schedule a key press handler.
std::optional< IO::Keys > ortho_top
Snap to top (+Y) view.
std::optional< IO::Keys > ortho_right
Snap to right (+X) view.
std::optional< IO::Keys > ortho_flip
Flip to opposite view.
std::optional< IO::Keys > ortho_front
Snap to front (+Z) view.