MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
OrbitState.cpp
Go to the documentation of this file.
1#include "OrbitState.hpp"
2
3namespace MayaFlux::Kinesis {
4
6{
7 OrbitState st;
8 st.focal = config.focal_point;
9 st.azimuth = config.initial_azimuth;
10 st.elevation = config.initial_elevation;
11 st.distance = config.initial_distance;
12 st.fov_radians = config.fov_radians;
13 st.near_plane = config.near_plane;
14 st.far_plane = config.far_plane;
17 st.scroll_speed = config.scroll_speed;
18 st.min_distance = config.min_distance;
19 st.max_distance = config.max_distance;
20 return st;
21}
22
23glm::vec3 orbit_eye(const OrbitState& st)
24{
25 return st.focal + glm::vec3(std::cos(st.elevation) * std::sin(st.azimuth), std::sin(st.elevation), std::cos(st.elevation) * std::cos(st.azimuth)) * st.distance;
26}
27
29{
30 const glm::vec3 eye = orbit_eye(st);
31 return {
32 .view = glm::lookAt(eye, st.focal, glm::vec3(0.0F, 1.0F, 0.0F)),
33 .projection = glm::perspective(st.fov_radians, aspect, st.near_plane, st.far_plane)
34 };
35}
36
37void apply_orbit_rotate(OrbitState& st, float dx, float dy)
38{
39 st.azimuth += dx * st.rotate_sensitivity;
40 st.elevation += dy * st.rotate_sensitivity;
41
42 static constexpr float k_limit = glm::radians(89.0F);
43 st.elevation = glm::clamp(st.elevation, -k_limit, k_limit);
44}
45
46void apply_orbit_scroll(OrbitState& st, float ticks)
47{
48 st.distance *= (1.0F - ticks * st.scroll_speed);
49 st.distance = glm::clamp(st.distance, st.min_distance, st.max_distance);
50}
51
52void apply_orbit_pan(OrbitState& st, float dx, float dy)
53{
54 const glm::vec3 forward = glm::normalize(st.focal - orbit_eye(st));
55 const glm::vec3 right = glm::normalize(glm::cross(forward, glm::vec3(0.0F, 1.0F, 0.0F)));
56 const glm::vec3 up = glm::normalize(glm::cross(right, forward));
57
58 const float scale = st.distance * st.pan_sensitivity;
59 st.focal -= right * (dx * scale);
60 st.focal += up * (dy * scale);
61}
62
63void snap_orbit_ortho(OrbitState& st, int view)
64{
65 switch (view) {
66 case 0:
67 st.azimuth = 0.0F;
68 st.elevation = 0.0F;
69 break;
70 case 1:
71 st.azimuth = glm::radians(-90.0F);
72 st.elevation = 0.0F;
73 break;
74 case 2:
75 st.azimuth = 0.0F;
76 st.elevation = glm::radians(-89.0F);
77 break;
78 case 3:
79 st.azimuth += glm::pi<float>();
80 st.elevation = -st.elevation;
81 break;
82 default:
83 break;
84 }
85}
86
87} // namespace MayaFlux::Kinesis
void apply_orbit_rotate(OrbitState &st, float dx, float dy)
Apply a mouse delta to azimuth and elevation.
glm::vec3 orbit_eye(const OrbitState &st)
Derive eye position from the current orbit state.
void snap_orbit_ortho(OrbitState &st, int view)
Snap to a named ortho view, preserving distance and focal point.
void apply_orbit_scroll(OrbitState &st, float ticks)
Dolly the camera toward or away from the focal point.
ViewTransform compute_orbit_view_transform(const OrbitState &st, float aspect)
Build a ViewTransform from the current OrbitState.
void apply_orbit_pan(OrbitState &st, float dx, float dy)
Pan the focal point in the camera's local right/up plane.
OrbitState make_orbit_state(const OrbitConfig &config)
Construct an OrbitState from an OrbitConfig.
Definition OrbitState.cpp:5
Tendency< D, float > scale(const Tendency< D, float > &t, float factor)
Uniform scaling of a scalar-output tendency.
Definition Tendency.hpp:97
float pan_sensitivity
World units per pixel, scaled by distance.
glm::vec3 focal_point
World-space point the camera orbits around.
float initial_distance
Initial radius from focal point.
float min_distance
Minimum dolly distance.
float initial_azimuth
Initial horizontal angle in radians.
float initial_elevation
Initial vertical angle in radians.
float scroll_speed
Fractional distance change per scroll tick.
float max_distance
Maximum dolly distance.
float rotate_sensitivity
Radians per pixel for MMB drag.
Construction parameters for an orbit navigation controller.
float distance
Radius from focal point.
glm::vec3 focal
World-space orbit target.
float elevation
Vertical angle in radians, clamped away from poles.
float azimuth
Horizontal angle in radians.
Mutable orbit navigation state.
View and projection matrices as a named push constant slot.