fixed stack offset for lazy_end_pos
This commit is contained in:
@@ -18,6 +18,7 @@ impl<'h> DifficultyObject<'h> {
|
||||
prev: &OsuObject,
|
||||
prev_vals: Option<(f32, f32)>, // (jump_dist, strain_time)
|
||||
prev_prev: Option<OsuObject>,
|
||||
scale_factor: f32,
|
||||
scaling_factor: f32,
|
||||
) -> Self {
|
||||
let delta = base.time - prev.time;
|
||||
@@ -27,7 +28,7 @@ impl<'h> DifficultyObject<'h> {
|
||||
|
||||
let pos = base.pos; // stacked position
|
||||
let travel_dist = prev.travel_dist();
|
||||
let prev_cursor_pos = prev.lazy_end_pos();
|
||||
let prev_cursor_pos = prev.lazy_end_pos(scale_factor);
|
||||
|
||||
// We don't need to calculate either angle or distance
|
||||
// when one of the last->curr objects is a spinner
|
||||
@@ -37,7 +38,7 @@ impl<'h> DifficultyObject<'h> {
|
||||
let jump_dist = ((pos - prev_cursor_pos) * scaling_factor).length();
|
||||
|
||||
let angle = prev_prev.map(|prev_prev| {
|
||||
let prev_prev_cursor_pos = prev_prev.lazy_end_pos();
|
||||
let prev_prev_cursor_pos = prev_prev.lazy_end_pos(scale_factor);
|
||||
|
||||
let v1 = prev_prev_cursor_pos - prev.pos;
|
||||
let v2 = pos - prev_cursor_pos;
|
||||
|
||||
@@ -113,10 +113,7 @@ pub fn stars(
|
||||
let stack_offset = h.stack_height * scale_factor;
|
||||
|
||||
h.time /= map_attributes.clock_rate;
|
||||
h.pos += Pos2 {
|
||||
x: stack_offset,
|
||||
y: stack_offset,
|
||||
};
|
||||
h.pos += Pos2::new(stack_offset);
|
||||
|
||||
h
|
||||
});
|
||||
@@ -140,7 +137,14 @@ pub fn stars(
|
||||
|
||||
// Handle second object separately to remove later if-branching
|
||||
let curr = hit_objects.next().unwrap();
|
||||
let h = DifficultyObject::new(&curr, &prev, prev_vals, prev_prev, scaling_factor);
|
||||
let h = DifficultyObject::new(
|
||||
&curr,
|
||||
&prev,
|
||||
prev_vals,
|
||||
prev_prev,
|
||||
scale_factor,
|
||||
scaling_factor,
|
||||
);
|
||||
|
||||
while h.base.time > current_section_end {
|
||||
for skill in skills.iter_mut() {
|
||||
@@ -160,7 +164,14 @@ pub fn stars(
|
||||
|
||||
// Handle all other objects
|
||||
for curr in hit_objects {
|
||||
let h = DifficultyObject::new(&curr, &prev, prev_vals, prev_prev, scaling_factor);
|
||||
let h = DifficultyObject::new(
|
||||
&curr,
|
||||
&prev,
|
||||
prev_vals,
|
||||
prev_prev,
|
||||
scale_factor,
|
||||
scaling_factor,
|
||||
);
|
||||
|
||||
while h.base.time > current_section_end {
|
||||
for skill in skills.iter_mut() {
|
||||
@@ -309,10 +320,7 @@ pub fn strains(map: &Beatmap, mods: impl Mods) -> Strains {
|
||||
let stack_offset = h.stack_height * scale_factor;
|
||||
|
||||
h.time /= map_attributes.clock_rate;
|
||||
h.pos += Pos2 {
|
||||
x: stack_offset,
|
||||
y: stack_offset,
|
||||
};
|
||||
h.pos += Pos2::new(stack_offset);
|
||||
|
||||
h
|
||||
});
|
||||
@@ -336,7 +344,14 @@ pub fn strains(map: &Beatmap, mods: impl Mods) -> Strains {
|
||||
|
||||
// Handle second object separately to remove later if-branching
|
||||
let curr = hit_objects.next().unwrap();
|
||||
let h = DifficultyObject::new(&curr, &prev, prev_vals, prev_prev, scaling_factor);
|
||||
let h = DifficultyObject::new(
|
||||
&curr,
|
||||
&prev,
|
||||
prev_vals,
|
||||
prev_prev,
|
||||
scale_factor,
|
||||
scaling_factor,
|
||||
);
|
||||
|
||||
while h.base.time > current_section_end {
|
||||
for skill in skills.iter_mut() {
|
||||
@@ -356,7 +371,14 @@ pub fn strains(map: &Beatmap, mods: impl Mods) -> Strains {
|
||||
|
||||
// Handle all other objects
|
||||
for curr in hit_objects {
|
||||
let h = DifficultyObject::new(&curr, &prev, prev_vals, prev_prev, scaling_factor);
|
||||
let h = DifficultyObject::new(
|
||||
&curr,
|
||||
&prev,
|
||||
prev_vals,
|
||||
prev_prev,
|
||||
scale_factor,
|
||||
scaling_factor,
|
||||
);
|
||||
|
||||
while h.base.time > current_section_end {
|
||||
for skill in skills.iter_mut() {
|
||||
|
||||
@@ -238,10 +238,14 @@ impl OsuObject {
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub(crate) fn lazy_end_pos(&self) -> Pos2 {
|
||||
pub(crate) fn lazy_end_pos(&self, scale_factor: f32) -> Pos2 {
|
||||
match &self.kind {
|
||||
OsuObjectKind::Circle | OsuObjectKind::Spinner { .. } => self.pos,
|
||||
OsuObjectKind::Slider { lazy_end_pos, .. } => *lazy_end_pos,
|
||||
OsuObjectKind::Slider { lazy_end_pos, .. } => {
|
||||
let stack_offset = scale_factor * self.stack_height;
|
||||
|
||||
*lazy_end_pos + Pos2::new(stack_offset)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,11 @@ impl Pos2 {
|
||||
Self::default()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn new(value: f32) -> Self {
|
||||
Self { x: value, y: value }
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn length_squared(&self) -> f32 {
|
||||
self.dot(*self)
|
||||
|
||||
Reference in New Issue
Block a user