bundle parameters for osu object creation

This commit is contained in:
MaxOhn
2021-11-06 17:08:15 +01:00
parent 4b58c7466a
commit f1264601ef
2 changed files with 48 additions and 42 deletions
+23 -28
View File
@@ -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);
+23 -12
View File
@@ -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,