bundle parameters for osu object creation
This commit is contained in:
@@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
|
use self::osu_object::ObjectParameters;
|
||||||
|
|
||||||
use super::super::DifficultyAttributes;
|
use super::super::DifficultyAttributes;
|
||||||
|
|
||||||
mod difficulty_object;
|
mod difficulty_object;
|
||||||
@@ -67,26 +69,21 @@ pub fn stars(
|
|||||||
scaling_factor *= 1.0 + small_circle_bonus;
|
scaling_factor *= 1.0 + small_circle_bonus;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut slider_state = SliderState::new(map);
|
let mut params = ObjectParameters {
|
||||||
let mut curve_bufs = CurveBuffers::default();
|
map,
|
||||||
let mut ticks_buf = Vec::new();
|
radius,
|
||||||
|
scaling_factor,
|
||||||
|
attributes: &mut diff_attributes,
|
||||||
|
slider_state: SliderState::new(map),
|
||||||
|
ticks: Vec::new(),
|
||||||
|
curve_bufs: CurveBuffers::default(),
|
||||||
|
};
|
||||||
|
|
||||||
let mut hit_objects = map
|
let mut hit_objects = map
|
||||||
.hit_objects
|
.hit_objects
|
||||||
.iter()
|
.iter()
|
||||||
.take(take)
|
.take(take)
|
||||||
.filter_map(|h| {
|
.filter_map(|h| OsuObject::new(h, &mut params))
|
||||||
OsuObject::new(
|
|
||||||
h,
|
|
||||||
map,
|
|
||||||
radius,
|
|
||||||
scaling_factor,
|
|
||||||
&mut ticks_buf,
|
|
||||||
&mut diff_attributes,
|
|
||||||
&mut slider_state,
|
|
||||||
&mut curve_bufs,
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.map(|mut h| {
|
.map(|mut h| {
|
||||||
h.time /= map_attributes.clock_rate;
|
h.time /= map_attributes.clock_rate;
|
||||||
|
|
||||||
@@ -239,22 +236,20 @@ pub fn strains(map: &Beatmap, mods: impl Mods) -> Strains {
|
|||||||
scaling_factor *= 1.0 + small_circle_bonus;
|
scaling_factor *= 1.0 + small_circle_bonus;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut slider_state = SliderState::new(map);
|
let mut params = ObjectParameters {
|
||||||
let mut ticks_buf = Vec::new();
|
|
||||||
let mut curve_bufs = CurveBuffers::default();
|
|
||||||
|
|
||||||
let mut hit_objects = map.hit_objects.iter().filter_map(|h| {
|
|
||||||
OsuObject::new(
|
|
||||||
h,
|
|
||||||
map,
|
map,
|
||||||
radius,
|
radius,
|
||||||
scaling_factor,
|
scaling_factor,
|
||||||
&mut ticks_buf,
|
attributes: &mut diff_attributes,
|
||||||
&mut diff_attributes,
|
slider_state: SliderState::new(map),
|
||||||
&mut slider_state,
|
ticks: Vec::new(),
|
||||||
&mut curve_bufs,
|
curve_bufs: CurveBuffers::default(),
|
||||||
)
|
};
|
||||||
});
|
|
||||||
|
let mut hit_objects = map
|
||||||
|
.hit_objects
|
||||||
|
.iter()
|
||||||
|
.filter_map(|h| OsuObject::new(h, &mut params));
|
||||||
|
|
||||||
let fl = mods.fl();
|
let fl = mods.fl();
|
||||||
let mut skills = Vec::with_capacity(2 + fl as usize);
|
let mut skills = Vec::with_capacity(2 + fl as usize);
|
||||||
|
|||||||
@@ -26,17 +26,28 @@ pub(crate) enum OsuObjectKind {
|
|||||||
Spinner,
|
Spinner,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) struct ObjectParameters<'a> {
|
||||||
|
pub(crate) map: &'a Beatmap,
|
||||||
|
pub(crate) radius: f32,
|
||||||
|
pub(crate) scaling_factor: f32,
|
||||||
|
pub(crate) attributes: &'a mut DifficultyAttributes,
|
||||||
|
pub(crate) ticks: Vec<f32>,
|
||||||
|
pub(crate) slider_state: SliderState<'a>,
|
||||||
|
pub(crate) curve_bufs: CurveBuffers,
|
||||||
|
}
|
||||||
|
|
||||||
impl OsuObject {
|
impl OsuObject {
|
||||||
pub(crate) fn new(
|
pub(crate) fn new(h: &HitObject, params: &mut ObjectParameters) -> Option<Self> {
|
||||||
h: &HitObject,
|
let ObjectParameters {
|
||||||
map: &Beatmap,
|
map,
|
||||||
radius: f32,
|
radius,
|
||||||
scaling_factor: f32,
|
scaling_factor,
|
||||||
ticks: &mut Vec<f32>,
|
attributes,
|
||||||
attributes: &mut DifficultyAttributes,
|
ticks,
|
||||||
slider_state: &mut SliderState,
|
slider_state,
|
||||||
curve_bufs: &mut CurveBuffers,
|
curve_bufs,
|
||||||
) -> Option<Self> {
|
} = params;
|
||||||
|
|
||||||
attributes.max_combo += 1; // hitcircle, slider head, or spinner
|
attributes.max_combo += 1; // hitcircle, slider head, or spinner
|
||||||
|
|
||||||
let obj = match &h.kind {
|
let obj = match &h.kind {
|
||||||
@@ -59,7 +70,7 @@ impl OsuObject {
|
|||||||
|
|
||||||
let span_count = (*repeats + 1) as f32;
|
let span_count = (*repeats + 1) as f32;
|
||||||
|
|
||||||
let approx_follow_circle_radius = radius * 3.0;
|
let approx_follow_circle_radius = *radius * 3.0;
|
||||||
let mut tick_dist = 100.0 * map.slider_mult / map.tick_rate;
|
let mut tick_dist = 100.0 * map.slider_mult / map.tick_rate;
|
||||||
|
|
||||||
if map.version >= 8 {
|
if map.version >= 8 {
|
||||||
@@ -151,7 +162,7 @@ impl OsuObject {
|
|||||||
ticks.clear();
|
ticks.clear();
|
||||||
|
|
||||||
let end_pos = curve.position_at(1.0); // TODO: what if reversing odd amount?
|
let end_pos = curve.position_at(1.0); // TODO: what if reversing odd amount?
|
||||||
travel_dist *= scaling_factor;
|
travel_dist *= *scaling_factor;
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
time: h.start_time,
|
time: h.start_time,
|
||||||
|
|||||||
Reference in New Issue
Block a user