Beatsaber Rust Utilities: A Beatsaber V3 parsing library.
beatsaber beatmap
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Added `get_beat_offset` and `get_brightness_offset` to `ColorEventGroup`.

+270
+270
src/difficulty/lightshow/color.rs
··· 38 38 pub data: Vec<ColorEventData>, 39 39 } 40 40 41 + impl ColorEventGroup { 42 + pub fn get_beat_offset(&self, light_id: i32, group_size: i32) -> f32 { 43 + let filtered_size = self.filter.count_filtered(group_size) as f32; 44 + let filtered_id = self.filter.get_relative_index(light_id, group_size) as f32; 45 + 46 + match self.beat_dist_type { 47 + DistributionType::Wave => { 48 + let mut modified_value = self.beat_dist_value; 49 + 50 + if let Some(data) = self.data.last() { 51 + modified_value -= data.beat_offset; 52 + } 53 + 54 + let fraction = filtered_id / filtered_size; 55 + fraction * modified_value.max(0.0) 56 + } 57 + DistributionType::Step => self.beat_dist_value * filtered_id, 58 + DistributionType::Unknown(_) => 0.0, 59 + } 60 + } 61 + 62 + pub fn get_brightness_offset(&self, light_id: i32, group_size: i32) -> f32 { 63 + let filtered_size = self.filter.count_filtered(group_size) as f32; 64 + let filtered_id = self.filter.get_relative_index(light_id, group_size) as f32; 65 + 66 + match self.bright_dist_type { 67 + DistributionType::Wave => { 68 + let mut modified_value = self.bright_dist_value; 69 + 70 + if let Some(data) = self.data.last() { 71 + modified_value -= data.beat_offset; 72 + } 73 + 74 + let fraction = match self.bright_dist_easing { 75 + Some(easing) => easing.ease(filtered_id / filtered_size), 76 + None => filtered_id / filtered_size, 77 + }; 78 + 79 + fraction * modified_value.max(0.0) 80 + } 81 + DistributionType::Step => self.bright_dist_value * filtered_id, 82 + DistributionType::Unknown(_) => 0.0, 83 + } 84 + } 85 + } 86 + 41 87 #[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] 42 88 pub struct ColorEventData { 43 89 #[serde(rename = "b")] ··· 72 118 White = 2, 73 119 } 74 120 } 121 + 122 + #[cfg(test)] 123 + mod tests { 124 + use super::*; 125 + use crate::difficulty::lightshow::filter::FilterType; 126 + 127 + #[test] 128 + fn beat_wave() { 129 + let group = ColorEventGroup { 130 + beat_dist_type: DistributionType::Wave, 131 + beat_dist_value: 12.0, 132 + ..Default::default() 133 + }; 134 + 135 + assert!((0..12).all(|i| group.get_beat_offset(i, 12) == i as f32)); 136 + } 137 + 138 + #[test] 139 + fn beat_step() { 140 + let group = ColorEventGroup { 141 + beat_dist_type: DistributionType::Step, 142 + beat_dist_value: 1.0, 143 + ..Default::default() 144 + }; 145 + 146 + assert!((0..12).all(|i| group.get_beat_offset(i, 12) == i as f32)); 147 + } 148 + 149 + #[test] 150 + fn beat_wave_with_division_filter() { 151 + let group = ColorEventGroup { 152 + filter: Filter { 153 + filter_type: FilterType::Division, 154 + parameter1: 2, 155 + parameter2: 1, 156 + ..Default::default() 157 + }, 158 + beat_dist_type: DistributionType::Wave, 159 + beat_dist_value: 6.0, 160 + ..Default::default() 161 + }; 162 + 163 + assert!((0..6).all(|i| group.get_beat_offset(i + 6, 12) == i as f32)); 164 + } 165 + 166 + #[test] 167 + fn brightness_wave_with_division_filter() { 168 + let group = ColorEventGroup { 169 + filter: Filter { 170 + filter_type: FilterType::Division, 171 + parameter1: 2, 172 + parameter2: 1, 173 + ..Default::default() 174 + }, 175 + bright_dist_type: DistributionType::Wave, 176 + bright_dist_value: 6.0, 177 + ..Default::default() 178 + }; 179 + 180 + assert!((0..6).all(|i| group.get_brightness_offset(i + 6, 12) == i as f32)); 181 + } 182 + 183 + #[test] 184 + fn beat_step_with_division_filter() { 185 + let group = ColorEventGroup { 186 + filter: Filter { 187 + filter_type: FilterType::Division, 188 + parameter1: 2, 189 + parameter2: 1, 190 + ..Default::default() 191 + }, 192 + beat_dist_type: DistributionType::Step, 193 + beat_dist_value: 1.0, 194 + ..Default::default() 195 + }; 196 + 197 + assert!((0..6).all(|i| group.get_beat_offset(i + 6, 12) == i as f32)); 198 + } 199 + 200 + #[test] 201 + fn brightness_step_with_division_filter() { 202 + let group = ColorEventGroup { 203 + filter: Filter { 204 + filter_type: FilterType::Division, 205 + parameter1: 2, 206 + parameter2: 1, 207 + ..Default::default() 208 + }, 209 + bright_dist_type: DistributionType::Step, 210 + bright_dist_value: 1.0, 211 + ..Default::default() 212 + }; 213 + 214 + assert!((0..6).all(|i| group.get_brightness_offset(i + 6, 12) == i as f32)); 215 + } 216 + 217 + #[test] 218 + fn beat_wave_with_step_filter() { 219 + let group = ColorEventGroup { 220 + filter: Filter { 221 + filter_type: FilterType::StepAndOffset, 222 + parameter1: 0, 223 + parameter2: 2, 224 + ..Default::default() 225 + }, 226 + beat_dist_type: DistributionType::Wave, 227 + beat_dist_value: 6.0, 228 + ..Default::default() 229 + }; 230 + 231 + assert!((0..6).all(|i| group.get_beat_offset(i * 2, 12) == i as f32)); 232 + } 233 + 234 + #[test] 235 + fn brightness_wave_with_step_filter() { 236 + let group = ColorEventGroup { 237 + filter: Filter { 238 + filter_type: FilterType::StepAndOffset, 239 + parameter1: 0, 240 + parameter2: 2, 241 + ..Default::default() 242 + }, 243 + bright_dist_type: DistributionType::Wave, 244 + bright_dist_value: 6.0, 245 + ..Default::default() 246 + }; 247 + 248 + assert!((0..6).all(|i| group.get_brightness_offset(i * 2, 12) == i as f32)); 249 + } 250 + 251 + #[test] 252 + fn beat_step_with_step_filter() { 253 + let group = ColorEventGroup { 254 + filter: Filter { 255 + filter_type: FilterType::StepAndOffset, 256 + parameter1: 0, 257 + parameter2: 2, 258 + ..Default::default() 259 + }, 260 + beat_dist_type: DistributionType::Step, 261 + beat_dist_value: 1.0, 262 + ..Default::default() 263 + }; 264 + 265 + assert!((0..6).all(|i| group.get_beat_offset(i * 2, 12) == i as f32)); 266 + } 267 + 268 + #[test] 269 + fn brightness_step_with_step_filter() { 270 + let group = ColorEventGroup { 271 + filter: Filter { 272 + filter_type: FilterType::StepAndOffset, 273 + parameter1: 0, 274 + parameter2: 2, 275 + ..Default::default() 276 + }, 277 + bright_dist_type: DistributionType::Step, 278 + bright_dist_value: 1.0, 279 + ..Default::default() 280 + }; 281 + 282 + assert!((0..6).all(|i| group.get_brightness_offset(i * 2, 12) == i as f32)); 283 + } 284 + 285 + #[test] 286 + fn beat_wave_with_reverse_filter() { 287 + let group = ColorEventGroup { 288 + filter: Filter { 289 + reverse: LooseBool::True, 290 + ..Default::default() 291 + }, 292 + beat_dist_type: DistributionType::Wave, 293 + beat_dist_value: 12.0, 294 + ..Default::default() 295 + }; 296 + 297 + assert!((0..12).all(|i| group.get_beat_offset(i, 12) == 12.0 - i as f32)); 298 + } 299 + 300 + #[test] 301 + fn brightness_wave_with_reverse_filter() { 302 + let group = ColorEventGroup { 303 + filter: Filter { 304 + reverse: LooseBool::True, 305 + ..Default::default() 306 + }, 307 + bright_dist_type: DistributionType::Wave, 308 + bright_dist_value: 12.0, 309 + ..Default::default() 310 + }; 311 + 312 + assert!((0..12).all(|i| group.get_brightness_offset(i, 12) == 12.0 - i as f32)); 313 + } 314 + 315 + #[test] 316 + fn beat_step_with_reverse_filter() { 317 + let group = ColorEventGroup { 318 + filter: Filter { 319 + reverse: LooseBool::True, 320 + ..Default::default() 321 + }, 322 + beat_dist_type: DistributionType::Step, 323 + beat_dist_value: 1.0, 324 + ..Default::default() 325 + }; 326 + 327 + assert!((0..12).all(|i| group.get_beat_offset(i, 12) == 12.0 - i as f32)); 328 + } 329 + 330 + #[test] 331 + fn brightness_step_with_reverse_filter() { 332 + let group = ColorEventGroup { 333 + filter: Filter { 334 + reverse: LooseBool::True, 335 + ..Default::default() 336 + }, 337 + bright_dist_type: DistributionType::Step, 338 + bright_dist_value: 1.0, 339 + ..Default::default() 340 + }; 341 + 342 + assert!((0..12).all(|i| group.get_brightness_offset(i, 12) == 12.0 - i as f32)); 343 + } 344 + }