MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ bind_orbit_preset() [2/2]

MAYAFLUX_API void MayaFlux::bind_orbit_preset ( const std::shared_ptr< Core::Window > &  window,
const std::shared_ptr< Buffers::RenderProcessor > &  processor,
const Kinesis::OrbitConfig config = {},
const Kinesis::OrbitKeyMap key_map = {},
const std::string &  name = "default" 
)

Bind the orbit navigation controller to a window and render processor.

Registers event handlers under the prefix "vp_<name>_". MMB drag rotates around the focal point; holding key_map.pan_modifier during MMB drag pans the focal point instead. Scroll dollies the distance. Ortho snap slots set to std::nullopt are silently skipped.

Parameters
windowWindow supplying input events
processorRenderProcessor that receives the ViewTransform source
configOrbit tuning parameters
key_mapKey assignments; defaults to Shift pan modifier + KP snaps
nameUnique prefix for registered events; must be unique per window

Definition at line 162 of file ViewportPreset.cpp.

168{
169 auto& record = s_registry[make_key(window, name)];
170 record.saved_config = window->get_input_config();
171 record.registered_events.clear();
172
173 auto st = std::make_shared<Kinesis::OrbitState>(Kinesis::make_orbit_state(config));
174
175 on_mouse_pressed(window, IO::MouseButtons::Middle, [st](double /*x*/, double /*y*/) {
176 st->mmb_held = true;
177 st->first_mouse = true; }, event_name(name, "mmb_dn"));
178
179 on_mouse_released(window, IO::MouseButtons::Middle, [st](double /*x*/, double /*y*/) { st->mmb_held = false; }, event_name(name, "mmb_up"));
180
181 on_key_pressed(window, key_map.pan_modifier, [st] { st->pan_held = true; }, event_name(name, "pan_mod_dn"));
182 on_key_released(window, key_map.pan_modifier, [st] { st->pan_held = false; }, event_name(name, "pan_mod_up"));
183
184 on_mouse_move(window, [st](double x, double y) {
185 if (!st->mmb_held) {
186 st->first_mouse = true;
187 return;
188 }
189 if (st->first_mouse) {
190 st->last_x = x;
191 st->last_y = y;
192 st->first_mouse = false;
193 return;
194 }
195 const auto dx = static_cast<float>(x - st->last_x);
196 const auto dy = static_cast<float>(y - st->last_y);
197 st->last_x = x;
198 st->last_y = y;
199
200 if (st->pan_held) {
201 Kinesis::apply_orbit_pan(*st, dx, dy);
202 } else {
203 Kinesis::apply_orbit_rotate(*st, dx, dy);
204} }, event_name(name, "mouse"));
205
206 on_scroll(window, [st](double /*dx*/, double dy) { Kinesis::apply_orbit_scroll(*st, static_cast<float>(dy)); }, event_name(name, "scroll"));
207
208 if (key_map.ortho_front)
209 on_key_pressed(window, *key_map.ortho_front, [st] { Kinesis::snap_orbit_ortho(*st, 0); }, event_name(name, "kp_front"));
210 if (key_map.ortho_right)
211 on_key_pressed(window, *key_map.ortho_right, [st] { Kinesis::snap_orbit_ortho(*st, 1); }, event_name(name, "kp_right"));
212 if (key_map.ortho_top)
213 on_key_pressed(window, *key_map.ortho_top, [st] { Kinesis::snap_orbit_ortho(*st, 2); }, event_name(name, "kp_top"));
214 if (key_map.ortho_flip)
215 on_key_pressed(window, *key_map.ortho_flip, [st] { Kinesis::snap_orbit_ortho(*st, 3); }, event_name(name, "kp_flip"));
216
217 processor->set_view_transform_source(
218 [st, window_weak = std::weak_ptr<Core::Window>(window)]() -> Kinesis::ViewTransform {
219 auto win = window_weak.lock();
220 if (!win)
221 return {};
222 const auto& ws = win->get_state();
223 const float aspect = (ws.current_height > 0)
224 ? static_cast<float>(ws.current_width) / static_cast<float>(ws.current_height)
225 : 1.0F;
226 return Kinesis::compute_orbit_view_transform(*st, aspect);
227 });
228}
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.
Definition Chronie.cpp:217
void on_scroll(const std::shared_ptr< Core::Window > &window, std::function< void(double, double)> callback, std::string name)
Schedule a mouse scroll handler.
Definition Chronie.cpp:250
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.
Definition Chronie.cpp:183
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.
Definition Chronie.cpp:150
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.
Definition Chronie.cpp:133
std::optional< IO::Keys > ortho_right
IO::Keys pan_modifier
Held during MMB drag to pan instead of rotate.
std::optional< IO::Keys > ortho_flip
std::optional< IO::Keys > ortho_front
std::optional< IO::Keys > ortho_top

References MayaFlux::Kinesis::apply_orbit_pan(), MayaFlux::Kinesis::apply_orbit_rotate(), MayaFlux::Kinesis::apply_orbit_scroll(), MayaFlux::Kinesis::compute_orbit_view_transform(), MayaFlux::Kinesis::make_orbit_state(), MayaFlux::IO::Middle, on_key_pressed(), on_key_released(), on_mouse_move(), on_mouse_pressed(), on_mouse_released(), on_scroll(), MayaFlux::Kinesis::OrbitKeyMap::ortho_flip, MayaFlux::Kinesis::OrbitKeyMap::ortho_front, MayaFlux::Kinesis::OrbitKeyMap::ortho_right, MayaFlux::Kinesis::OrbitKeyMap::ortho_top, and MayaFlux::Kinesis::OrbitKeyMap::pan_modifier.

Referenced by bind_orbit_preset(), and bind_viewport_preset().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: