7 glm::vec2 visible_extent,
8 glm::vec2 viewport_size_pixels)
noexcept
10 return (pixel_delta / viewport_size_pixels) * visible_extent;
15 glm::vec2 viewport_extent,
16 AABB2D content_bounds)
noexcept
18 const float max_x = std::max(0.F, content_bounds.width() - viewport_extent.x);
19 const float max_y = std::max(0.F, content_bounds.height() - viewport_extent.y);
21 return { std::clamp(
offset.x, 0.F, max_x), std::clamp(
offset.y, 0.F, max_y) };
28 glm::vec2(state.viewport_bounds.width(), state.viewport_bounds.height()),
29 state.content_bounds);
34 apply_scroll(state, glm::vec2(
static_cast<float>(dx),
static_cast<float>(dy)) *
speed);
40 .
view = glm::translate(glm::mat4(1.0F), glm::vec3(state.offset, 0.F)),
41 .projection = glm::mat4(1.0F),
ViewTransform scroll_view_transform(const ScrollState &state) noexcept
Build an orthographic ViewTransform that translates by +offset.
void apply_wheel_scroll(ScrollState &state, double dx, double dy, float speed) noexcept
Apply a wheel-tick delta, scaled by speed, and clamp.
void apply_scroll(NavigationState &st, float ticks)
Dolly eye along the current forward vector.
double speed(const Memory::HistoryBuffer< double > &history, double dt) noexcept
Absolute value of a scalar first difference.
glm::vec2 drag_to_offset_delta(glm::vec2 pixel_delta, glm::vec2 visible_extent, glm::vec2 viewport_size_pixels) noexcept
Convert a pixel-space drag delta into a content-space delta.
glm::vec2 clamp_offset_to_content(glm::vec2 offset, glm::vec2 viewport_extent, AABB2D content_bounds) noexcept
Clamp a content-space offset so a viewport of the given extent never scrolls past the edges of a cont...
Axis-aligned bounding rectangle in a 2D coordinate space.