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

◆ bind_viewport_preset() [1/2]

MAYAFLUX_API void MayaFlux::bind_viewport_preset ( const std::shared_ptr< Core::Window > &  window,
const std::shared_ptr< Buffers::RenderProcessor > &  processor,
ViewportPresetMode  mode = ViewportPresetMode::Fly,
const ViewportPresetConfig config = {},
const std::string &  name = "default" 
)

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

Parameters
windowWindow supplying input events
processorRenderProcessor that receives the ViewTransform source
modeNavigation controller to install, defaults to Fly preset
configTuning parameters
nameUnique prefix for registered events; must be unique per window

Definition at line 35 of file ViewportPreset.cpp.

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 /*x*/, double /*y*/) {
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 /*x*/, double /*y*/) { 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
75 on_mouse_move(window, [st](double x, double y) {
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 /*dx*/, 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.
Definition Chronie.cpp:209
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:225
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:142
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.
Definition Chronie.cpp:192
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:125

References MayaFlux::IO::A, MayaFlux::Journal::API, MayaFlux::Kinesis::apply_mouse_delta(), MayaFlux::Kinesis::apply_scroll(), MayaFlux::Kinesis::compute_view_transform(), MayaFlux::IO::D, MayaFlux::IO::E, MayaFlux::Journal::EventDispatch, Fly, MayaFlux::IO::KP1, MayaFlux::IO::KP3, MayaFlux::IO::KP7, MayaFlux::IO::KP9, MayaFlux::Kinesis::make_navigation_state(), MF_RT_ERROR, on_key_pressed(), on_key_released(), on_mouse_move(), on_mouse_pressed(), on_mouse_released(), on_scroll(), MayaFlux::IO::Q, MayaFlux::IO::Right, MayaFlux::IO::S, MayaFlux::Kinesis::snap_ortho(), and MayaFlux::IO::W.

Referenced by bind_viewport_preset().

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