osu & fruits: fixed catmull sliders
This commit is contained in:
+24
-18
@@ -79,33 +79,39 @@ impl Curve {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let order = points.len();
|
let order = points.len();
|
||||||
let step = 2.5 / SLIDER_QUALITY;
|
|
||||||
let target = step + 1.0;
|
|
||||||
|
|
||||||
let mut resulting_points = Vec::with_capacity(4);
|
let mut resulting_points =
|
||||||
|
Vec::with_capacity(((order - 1) as f32 * SLIDER_QUALITY * 2.0) as usize);
|
||||||
|
|
||||||
for x in 0..order - 1 {
|
for i in 0..order - 1 {
|
||||||
let mut t = 0.0;
|
let v1 = points[i.saturating_sub(1)];
|
||||||
|
let v2 = points[i];
|
||||||
|
|
||||||
while t < target {
|
let v3 = if i < order - 1 {
|
||||||
let v1 = if x >= 1 { points[x - 1] } else { points[x] };
|
points[i + 1]
|
||||||
let v2 = points[x];
|
|
||||||
|
|
||||||
let v3 = if x + 1 < order {
|
|
||||||
points[x + 1]
|
|
||||||
} else {
|
} else {
|
||||||
v2.add_scaled(v2.add_scaled(v1, -1.0), 1.0)
|
v2 * 2.0 - v1
|
||||||
};
|
};
|
||||||
|
|
||||||
let v4 = if x + 2 < order {
|
let v4 = if i < order - 2 {
|
||||||
points[x + 2]
|
points[i + 2]
|
||||||
} else {
|
} else {
|
||||||
v3.add_scaled(v3.add_scaled(v2, -1.0), 1.0)
|
v3 * 2.0 - v2
|
||||||
};
|
};
|
||||||
|
|
||||||
let point = Self::catmull_point(v1, v2, v3, v4, t);
|
let mut c = 0.0;
|
||||||
resulting_points.push(point);
|
|
||||||
t += step;
|
while c < SLIDER_QUALITY {
|
||||||
|
resulting_points.push(Self::catmull_point(v1, v2, v3, v4, c / SLIDER_QUALITY));
|
||||||
|
resulting_points.push(Self::catmull_point(
|
||||||
|
v1,
|
||||||
|
v2,
|
||||||
|
v3,
|
||||||
|
v4,
|
||||||
|
(c + 1.0) / SLIDER_QUALITY,
|
||||||
|
));
|
||||||
|
|
||||||
|
c += 1.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -23,10 +23,10 @@ pub(crate) fn cpn(mut p: i32, n: i32) -> f32 {
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub(crate) fn catmull(p0: f32, p1: f32, p2: f32, p3: f32, t: f32) -> f32 {
|
pub(crate) fn catmull(p0: f32, p1: f32, p2: f32, p3: f32, t: f32) -> f32 {
|
||||||
0.5 * ((2.0 * p1)
|
0.5 * (2.0 * p1
|
||||||
+ (-p0 + p2) * t
|
+ (-p0 + p2) * t
|
||||||
+ (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3) * t.powi(2)
|
+ (2.0 * p0 - 5.0 * p1 + 4.0 * p2 - p3) * t * t
|
||||||
+ (-p0 + 3.0 * p1 - 3.0 * p2 + p3 * t.powi(3)))
|
+ (-p0 + 3.0 * p1 - 3.0 * p2 + p3) * t * t * t)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|||||||
@@ -449,7 +449,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
// #[ignore]
|
// #[ignore]
|
||||||
fn all_included_single() {
|
fn all_included_single() {
|
||||||
let file = match File::open("./maps/2514909.osu") {
|
let file = match File::open("./maps/100.osu") {
|
||||||
Ok(file) => file,
|
Ok(file) => file,
|
||||||
Err(why) => panic!("Could not open file: {}", why),
|
Err(why) => panic!("Could not open file: {}", why),
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user