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