Use ..= range arguments to remap functions

This commit is contained in:
Emil Ernerfeldt 2020-04-25 11:11:44 +02:00
parent 663fbda90c
commit 4cc6ca7236
6 changed files with 38 additions and 45 deletions

View file

@ -99,18 +99,16 @@ impl CollapsingHeader {
let max_height = if state.open { let max_height = if state.open {
remap( remap(
time_since_toggle, time_since_toggle,
0.0, 0.0..=animation_time,
animation_time, // Get instant feedback, and we don't expect to get bigger than this
50.0, // Get instant feedback 50.0..=1500.0,
1500.0, // We don't expect to get bigger than this
) )
} else { } else {
remap_clamp( remap_clamp(
time_since_toggle, time_since_toggle,
0.0, 0.0..=animation_time,
animation_time, // TODO: state.open_height
50.0, // TODO: state.open_height 50.0..=0.0,
0.0,
) )
}; };

View file

@ -1,4 +1,4 @@
use std::ops::{Add, AddAssign, Div, Mul, MulAssign, Neg, Sub, SubAssign}; use std::ops::{Add, AddAssign, Div, Mul, MulAssign, Neg, RangeInclusive, Sub, SubAssign};
#[derive(Clone, Copy, Default, Deserialize, Serialize)] #[derive(Clone, Copy, Default, Deserialize, Serialize)]
pub struct Vec2 { pub struct Vec2 {
@ -387,6 +387,14 @@ impl Rect {
self.max.y - self.min.y self.max.y - self.min.y
} }
pub fn range_x(&self) -> RangeInclusive<f32> {
self.min.x..=self.max.x
}
pub fn range_y(&self) -> RangeInclusive<f32> {
self.min.y..=self.max.y
}
pub fn is_empty(&self) -> bool { pub fn is_empty(&self) -> bool {
self.max.x < self.min.x || self.max.y < self.min.y self.max.x < self.min.x || self.max.y < self.min.y
} }
@ -450,20 +458,20 @@ where
(1.0 - t) * min + t * max (1.0 - t) * min + t * max
} }
pub fn remap(from: f32, from_min: f32, from_max: f32, to_min: f32, to_max: f32) -> f32 { pub fn remap(x: f32, from: RangeInclusive<f32>, to: RangeInclusive<f32>) -> f32 {
let t = (from - from_min) / (from_max - from_min); let t = (x - from.start()) / (from.end() - from.start());
lerp(to_min, to_max, t) lerp(*to.start(), *to.end(), t)
} }
pub fn remap_clamp(from: f32, from_min: f32, from_max: f32, to_min: f32, to_max: f32) -> f32 { pub fn remap_clamp(x: f32, from: RangeInclusive<f32>, to: RangeInclusive<f32>) -> f32 {
let t = if from <= from_min { let t = if x <= *from.start() {
0.0 0.0
} else if from >= from_max { } else if x >= *from.end() {
1.0 1.0
} else { } else {
(from - from_min) / (from_max - from_min) (x - from.start()) / (from.end() - from.start())
}; };
lerp(to_min, to_max, t) lerp(*to.start(), *to.end(), t)
} }
pub fn clamp(x: f32, min: f32, max: f32) -> f32 { pub fn clamp(x: f32, min: f32, max: f32) -> f32 {

View file

@ -154,7 +154,7 @@ impl Path {
pub fn add_circle(&mut self, center: Pos2, radius: f32) { pub fn add_circle(&mut self, center: Pos2, radius: f32) {
let n = 32; // TODO: parameter let n = 32; // TODO: parameter
for i in 0..n { for i in 0..n {
let angle = remap(i as f32, 0.0, n as f32, 0.0, TAU); let angle = remap(i as f32, 0.0..=n as f32, 0.0..=TAU);
let normal = vec2(angle.cos(), angle.sin()); let normal = vec2(angle.cos(), angle.sin());
self.add_point(center + radius * normal, normal); self.add_point(center + radius * normal, normal);
} }
@ -222,10 +222,8 @@ impl Path {
for i in 0..=n { for i in 0..=n {
let angle = remap( let angle = remap(
i as f32, i as f32,
0.0, 0.0..=n as f32,
n as f32, quadrant * RIGHT_ANGLE..=(quadrant + 1.0) * RIGHT_ANGLE,
quadrant * RIGHT_ANGLE,
(quadrant + 1.0) * RIGHT_ANGLE,
); );
let normal = vec2(angle.cos(), angle.sin()); let normal = vec2(angle.cos(), angle.sin());
self.add_point(center + radius * normal, normal); self.add_point(center + radius * normal, normal);

View file

@ -85,7 +85,8 @@ impl ScrollArea {
pos2(right, inner_rect.bottom()), pos2(right, inner_rect.bottom()),
); );
let from_content = |content_y| remap_clamp(content_y, 0.0, content_size.y, top, bottom); let from_content =
|content_y| remap_clamp(content_y, 0.0..=content_size.y, top..=bottom);
let handle_rect = Rect::from_min_max( let handle_rect = Rect::from_min_max(
pos2(left, from_content(state.offset.y)), pos2(left, from_content(state.offset.y)),
@ -110,7 +111,7 @@ impl ScrollArea {
if scroll_bg_interact.active { if scroll_bg_interact.active {
// Center scroll at mouse pos: // Center scroll at mouse pos:
let mpos_top = mouse_pos.y - handle_rect.height() / 2.0; let mpos_top = mouse_pos.y - handle_rect.height() / 2.0;
state.offset.y = remap(mpos_top, top, bottom, 0.0, content_size.y); state.offset.y = remap(mpos_top, top..=bottom, 0.0..=content_size.y);
} }
} }
} }

View file

@ -126,22 +126,11 @@ impl Texture {
if interact.hovered { if interact.hovered {
show_popup(region.ctx(), mouse_pos, |region| { show_popup(region.ctx(), mouse_pos, |region| {
let zoom_rect = region.reserve_space(vec2(128.0, 128.0), None).rect; let zoom_rect = region.reserve_space(vec2(128.0, 128.0), None).rect;
let u = remap_clamp( let u = remap_clamp(mouse_pos.x, rect.range_x(), 0.0..=self.width as f32 - 1.0)
mouse_pos.x, .round();
rect.min().x, let v =
rect.max().x, remap_clamp(mouse_pos.y, rect.range_y(), 0.0..=self.height as f32 - 1.0)
0.0, .round();
self.width as f32 - 1.0,
)
.round();
let v = remap_clamp(
mouse_pos.y,
rect.min().y,
rect.max().y,
0.0,
self.height as f32 - 1.0,
)
.round();
let texel_radius = 32.0; let texel_radius = 32.0;
let u = clamp(u, texel_radius, self.width as f32 - 1.0 - texel_radius); let u = clamp(u, texel_radius, self.width as f32 - 1.0 - texel_radius);

View file

@ -457,13 +457,12 @@ impl<'a> Widget for Slider<'a> {
let left = interact.rect.left() + handle_radius; let left = interact.rect.left() + handle_radius;
let right = interact.rect.right() - handle_radius; let right = interact.rect.right() - handle_radius;
let min = *self.range.start(); let range = self.range.clone();
let max = *self.range.end(); debug_assert!(range.start() <= range.end());
debug_assert!(min <= max);
if let Some(mouse_pos) = region.input().mouse_pos { if let Some(mouse_pos) = region.input().mouse_pos {
if interact.active { if interact.active {
self.set_value_f32(remap_clamp(mouse_pos.x, left, right, min, max)); self.set_value_f32(remap_clamp(mouse_pos.x, left..=right, range.clone()));
} }
} }
@ -477,7 +476,7 @@ impl<'a> Widget for Slider<'a> {
pos2(interact.rect.left(), rect.center().y - rail_radius), pos2(interact.rect.left(), rect.center().y - rail_radius),
pos2(interact.rect.right(), rect.center().y + rail_radius), pos2(interact.rect.right(), rect.center().y + rail_radius),
); );
let marker_center_x = remap_clamp(value, min, max, left, right); let marker_center_x = remap_clamp(value, range, left..=right);
region.add_paint_cmd(PaintCmd::Rect { region.add_paint_cmd(PaintCmd::Rect {
rect: rail_rect, rect: rail_rect,