@@ -12,8 +12,6 @@ class CharterBackdropGroup extends FlxTypedGroup<CharterBackdrop> {
12
12
13
13
public var conductorSprY : Float = 0 ;
14
14
public var bottomLimitY : Float = 0 ;
15
- public var sectionsVisible : Bool = true ;
16
- public var beatsVisible : Bool = true ;
17
15
18
16
// Just here so you can update display sprites all dat and above
19
17
public var strumlinesAmount : Int = 0 ;
@@ -61,8 +59,6 @@ class CharterBackdropGroup extends FlxTypedGroup<CharterBackdrop> {
61
59
62
60
grid .conductorFollowerSpr .y = conductorSprY ;
63
61
grid .bottomSeparator .y = (grid .bottomLimit .y = bottomLimitY )- 2 ;
64
- grid .sectionSeparator .visible = sectionsVisible ;
65
- grid .beatSeparator .visible = beatsVisible ;
66
62
67
63
grid .waveformSprite .shader = strumLine .waveformShader ;
68
64
@@ -119,8 +115,7 @@ class CharterBackdrop extends FlxTypedGroup<Dynamic> {
119
115
public var waveformSprite : FlxSprite ;
120
116
121
117
public var conductorFollowerSpr : FlxSprite ;
122
- public var beatSeparator : FlxBackdrop ;
123
- public var sectionSeparator : FlxBackdrop ;
118
+ public var beatSeparator : CharterGridSeperator ;
124
119
125
120
public var notesGroup : FlxTypedGroup <CharterNote > = new FlxTypedGroup <CharterNote >();
126
121
public var strumLine : CharterStrumline ;
@@ -136,23 +131,14 @@ class CharterBackdrop extends FlxTypedGroup<Dynamic> {
136
131
waveformSprite .updateHitbox ();
137
132
add (waveformSprite );
138
133
139
- sectionSeparator = new FlxBackdrop (null , Y , 0 , 0 );
140
- sectionSeparator .y = - 2 ;
141
- sectionSeparator .visible = Options .charterShowSections ;
142
-
143
- beatSeparator = new FlxBackdrop (null , Y , 0 , 0 );
144
- beatSeparator .y = - 1 ;
145
- beatSeparator .visible = Options .charterShowBeats ;
146
-
147
- for (sep in [sectionSeparator , beatSeparator ]) {
148
- sep .makeSolid (1 , 1 , - 1 );
149
- sep .alpha = 0.5 ;
150
- sep .scrollFactor .set (1 , 1 );
151
- sep .scale .set ((4 * 40 ), sep == sectionSeparator ? 4 : 2 );
152
- sep .updateHitbox ();
153
- }
134
+ beatSeparator = new CharterGridSeperator ();
135
+ beatSeparator .makeSolid (1 , 1 , - 1 );
136
+ beatSeparator .alpha = 0.5 ;
137
+ beatSeparator .scrollFactor .set (1 , 1 );
138
+ beatSeparator .scale .set ((4 * 40 ), 2 );
139
+ beatSeparator .updateHitbox ();
154
140
add (beatSeparator );
155
- add ( sectionSeparator );
141
+
156
142
add (notesGroup );
157
143
158
144
bottomSeparator = new FlxSprite (0 ,- 2 );
@@ -200,15 +186,12 @@ class CharterBackdrop extends FlxTypedGroup<Dynamic> {
200
186
alpha = strumLine .strumLine .visible ? 0.9 : 0.4 ;
201
187
} else alpha = 0.9 ;
202
188
203
- for (spr in [gridBackDrop , sectionSeparator , beatSeparator , topLimit , bottomLimit ,
189
+ for (spr in [gridBackDrop , beatSeparator , topLimit , bottomLimit ,
204
190
topSeparator , bottomSeparator , conductorFollowerSpr , waveformSprite ]) {
205
191
spr .x = x ; if (spr != waveformSprite ) spr .alpha = alpha ;
206
192
spr .cameras = this .cameras ;
207
193
}
208
194
209
- sectionSeparator .spacing .y = (10 * Conductor .beatsPerMeasure * Conductor .stepsPerBeat ) - 1 ;
210
- beatSeparator .spacing .y = (20 * Conductor .stepsPerBeat ) - 1 ;
211
-
212
195
topLimit .scale .set (4 * 40 , Math .ceil (FlxG .height / cameras [0 ].zoom ));
213
196
topLimit .updateHitbox ();
214
197
topLimit .y = - topLimit .height ;
@@ -237,6 +220,159 @@ class CharterBackdrop extends FlxTypedGroup<Dynamic> {
237
220
}
238
221
}
239
222
223
+ class CharterGridSeperatorBase extends FlxSprite {
224
+
225
+ private static var minStep : Float = 0 ;
226
+ private static var maxStep : Float = 0 ;
227
+
228
+ private static var minBeat : Float = 0 ;
229
+ private static var maxBeat : Float = 0 ;
230
+
231
+ private static var minMeasure : Float = 0 ;
232
+ private static var maxMeasure : Float = 0 ;
233
+
234
+ private static var lastMinBeat : Float = - 1 ;
235
+ private static var lastMaxBeat : Float = - 1 ;
236
+
237
+ private static var lastMinMeasure : Float = - 1 ;
238
+ private static var lastMaxMeasure : Float = - 1 ;
239
+
240
+ public static var lastConductorSprY : Float = Math .NEGATIVE_INFINITY ;
241
+
242
+ private static var beatStepTimes : Array <Float > = [];
243
+ private static var measureStepTimes : Array <Float > = [];
244
+ private static var timeSignatureChangeGaps : Array <Float > = [];
245
+
246
+ private function recalculateBeats () {
247
+ var conductorSprY = Charter .instance .gridBackdrops .conductorSprY ;
248
+ if (conductorSprY == lastConductorSprY ) return ;
249
+
250
+ var zoomOffset = ((FlxG .height * (1 / cameras [0 ].zoom )) * 0.5 );
251
+
252
+ minStep = (conductorSprY - zoomOffset )/ 40 ;
253
+ maxStep = (conductorSprY + zoomOffset )/ 40 ;
254
+
255
+ var minTime : Float = Conductor .getStepsInTime (minStep );
256
+ var maxTime : Float = Conductor .getStepsInTime (maxStep );
257
+
258
+ var minBpmChange = Conductor .bpmChangeMap [Conductor .getTimeInChangeIndex (minTime )];
259
+ var maxBpmChange = Conductor .bpmChangeMap [Conductor .getTimeInChangeIndex (maxTime )];
260
+
261
+ minBeat = Conductor .getTimeInBeats (minTime );
262
+ maxBeat = Conductor .getTimeInBeats (maxTime );
263
+
264
+ minMeasure = minBpmChange .measureTime + (minBeat - minBpmChange .beatTime ) / minBpmChange .beatsPerMeasure ;
265
+ maxMeasure = maxBpmChange .measureTime + (maxBeat - maxBpmChange .beatTime ) / maxBpmChange .beatsPerMeasure ;
266
+
267
+ // cap out the beats/measures at the end of the song
268
+ var endTime = Conductor .getStepsInTime (Charter .instance .__endStep );
269
+ var endBeat = Conductor .getTimeInBeats (endTime );
270
+ var endBpmChange = Conductor .bpmChangeMap [Conductor .getTimeInChangeIndex (endTime )];
271
+ var endMeasure = endBpmChange .measureTime + (endBeat - endBpmChange .beatTime ) / endBpmChange .beatsPerMeasure ;
272
+
273
+ if (maxBeat > endBeat ) maxBeat = endBeat ;
274
+ if (maxMeasure > endMeasure ) maxMeasure = endMeasure ;
275
+ if (minMeasure < 0 ) minMeasure = 0 ;
276
+ if (minBeat < 0 ) minBeat = 0 ;
277
+
278
+ // only calculate if needed
279
+ if ((minBeat != lastMinBeat ) || (maxBeat != lastMaxBeat ) || (minMeasure != lastMinMeasure ) || (maxMeasure != lastMaxMeasure ) || lastConductorSprY == Math .NEGATIVE_INFINITY ) {
280
+ calculateTimeSignatureGaps ();
281
+ calculateStepTimes ();
282
+ lastMinBeat = minBeat ;
283
+ lastMaxBeat = maxBeat ;
284
+ lastMinMeasure = minMeasure ;
285
+ lastMaxMeasure = maxMeasure ;
286
+ }
287
+
288
+ lastConductorSprY = conductorSprY ;
289
+ }
290
+
291
+ private inline function calculateTimeSignatureGaps () {
292
+ // for time signatures that start mid step
293
+ timeSignatureChangeGaps .splice (0 , timeSignatureChangeGaps .length );
294
+ for (i => change in Conductor .bpmChangeMap ) {
295
+ if (change .stepTime >= minStep && change .stepTime <= maxStep ) {
296
+ // get step while ignoring the current change
297
+ var index = CoolUtil .boundInt (i - 1 , 0 , Conductor .bpmChangeMap .length - 1 );
298
+ var step = Conductor .getTimeWithBPMInSteps (change .songTime , index , Conductor .getTimeWithIndexInBPM (change .songTime , index ));
299
+
300
+ if (Math .ceil (step ) - step > 0 ) { // mid step change
301
+ timeSignatureChangeGaps .push (step );
302
+ }
303
+ }
304
+ }
305
+ }
306
+
307
+ private inline function calculateStepTimes () {
308
+ beatStepTimes .splice (0 , beatStepTimes .length );
309
+ for (i in Math .floor (minBeat )... Math .ceil (maxBeat )) {
310
+ beatStepTimes .push (Conductor .getTimeInSteps (Conductor .getBeatsInTime (i )));
311
+ }
312
+ measureStepTimes .splice (0 , measureStepTimes .length );
313
+ for (i in Math .floor (minMeasure )... Math .ceil (maxMeasure )) {
314
+ measureStepTimes .push (Conductor .getTimeInSteps (Conductor .getMeasuresInTime (i )));
315
+ }
316
+ }
317
+
318
+ override public function draw () {
319
+
320
+ // should only need to recalculate once per frame and will be shared across each instance
321
+ recalculateBeats ();
322
+
323
+ drawTimeSignatureChangeGaps ();
324
+
325
+ if (Options .charterShowBeats ) drawBeats ();
326
+ if (Options .charterShowSections ) drawMeasures ();
327
+ }
328
+
329
+ private function drawBeats (offset : Float = 0.0 ) {
330
+ for (i in beatStepTimes ) {
331
+ y = (i * 40 )+ offset ;
332
+ super .draw ();
333
+ }
334
+ }
335
+ private function drawMeasures (offset : Float = 0.0 ) {
336
+ for (i in measureStepTimes ) {
337
+ y = (i * 40 )+ offset ;
338
+ super .draw ();
339
+ }
340
+ }
341
+ private function drawTimeSignatureChangeGaps () {
342
+ if (timeSignatureChangeGaps .length == 0 ) return ;
343
+ var prevColor = color ;
344
+ var prevBlend = blend ;
345
+
346
+ color = 0xFF888888 ;
347
+ blend = MULTIPLY ;
348
+
349
+ for (step in timeSignatureChangeGaps ) {
350
+ y = step * 40 ;
351
+ var diff = Math .ceil (step ) - step ;
352
+ scale .y = diff * 40 ;
353
+ updateHitbox ();
354
+
355
+ super .draw ();
356
+ }
357
+
358
+ color = prevColor ;
359
+ blend = prevBlend ;
360
+ }
361
+ }
362
+
363
+ class CharterGridSeperator extends CharterGridSeperatorBase {
364
+ override private function drawBeats (offset : Float = 0.0 ) {
365
+ scale .y = 2 ;
366
+ updateHitbox ();
367
+ super .drawBeats (- 2 );
368
+ }
369
+ override private function drawMeasures (offset : Float = 0.0 ) {
370
+ scale .y = 4 ;
371
+ updateHitbox ();
372
+ super .drawMeasures (- 3 );
373
+ }
374
+ }
375
+
240
376
class CharterBackdropDummy extends UISprite {
241
377
var parent : CharterBackdropGroup ;
242
378
public function new (parent : CharterBackdropGroup ) {
@@ -258,8 +394,7 @@ class CharterBackdropDummy extends UISprite {
258
394
}
259
395
260
396
class EventBackdrop extends FlxBackdrop {
261
- public var eventBeatSeparator : FlxBackdrop ;
262
- public var eventSecSeparator : FlxBackdrop ;
397
+ public var eventBeatSeparator : CharterEventGridSeperator ;
263
398
264
399
public var topSeparator : FlxSprite ;
265
400
public var bottomSeparator : FlxSprite ;
@@ -269,25 +404,10 @@ class EventBackdrop extends FlxBackdrop {
269
404
alpha = 0.9 ;
270
405
271
406
// Separators
272
- eventSecSeparator = new FlxBackdrop (null , Y , 0 , 0 );
273
- eventSecSeparator .y = - 2 ;
274
- eventSecSeparator .visible = Options .charterShowSections ;
275
-
276
- eventBeatSeparator = new FlxBackdrop (null , Y , 0 , 0 );
277
- eventBeatSeparator .y = - 1 ;
278
- eventBeatSeparator .visible = Options .charterShowBeats ;
279
-
280
- for (sep in [eventSecSeparator , eventBeatSeparator ]) {
281
- sep .makeSolid (1 , 1 , - 1 );
282
- sep .alpha = 0.5 ;
283
- sep .scrollFactor .set (1 , 1 );
284
- }
285
-
286
- eventSecSeparator .scale .set (20 , 4 );
287
- eventSecSeparator .updateHitbox ();
288
-
289
- eventBeatSeparator .scale .set (10 , 2 );
290
- eventBeatSeparator .updateHitbox ();
407
+ eventBeatSeparator = new CharterEventGridSeperator ();
408
+ eventBeatSeparator .makeSolid (1 , 1 , - 1 );
409
+ eventBeatSeparator .alpha = 0.5 ;
410
+ eventBeatSeparator .scrollFactor .set (1 , 1 );
291
411
292
412
bottomSeparator = new FlxSprite (0 ,- 2 );
293
413
bottomSeparator .makeSolid (1 , 1 , - 1 );
@@ -308,23 +428,32 @@ class EventBackdrop extends FlxBackdrop {
308
428
public override function draw () {
309
429
super .draw ();
310
430
311
- eventSecSeparator .spacing .y = (10 * Conductor .beatsPerMeasure * Conductor .stepsPerBeat ) - 1 ;
312
- eventBeatSeparator .spacing .y = (20 * Conductor .stepsPerBeat ) - 1 ;
313
-
314
- eventSecSeparator .cameras = cameras ;
315
- eventSecSeparator .x = (x + width ) - 20 ;
316
- if (eventSecSeparator .visible ) eventSecSeparator .draw ();
317
-
318
431
eventBeatSeparator .cameras = cameras ;
319
- eventBeatSeparator .x = ( x + width ) - 10 ;
320
- if ( eventBeatSeparator . visible ) eventBeatSeparator .draw ();
432
+ eventBeatSeparator .xPos = x + width ;
433
+ eventBeatSeparator .draw ();
321
434
322
435
topSeparator .x = (x + width ) - 20 ;
323
436
topSeparator .cameras = this .cameras ;
324
- if (! eventSecSeparator . visible ) topSeparator .draw ();
437
+ if (! Options . charterShowSections ) topSeparator .draw ();
325
438
326
439
bottomSeparator .x = (x + width ) - 20 ;
327
440
bottomSeparator .cameras = this .cameras ;
328
441
bottomSeparator .draw ();
329
442
}
443
+ }
444
+ class CharterEventGridSeperator extends CharterGridSeperatorBase {
445
+ public var xPos : Float = 0.0 ;
446
+ override private function drawBeats (offset : Float = 0.0 ) {
447
+ scale .set (10 , 2 );
448
+ updateHitbox ();
449
+ x = xPos - 10 ;
450
+ super .drawBeats (- 2 );
451
+ }
452
+ override private function drawMeasures (offset : Float = 0.0 ) {
453
+ scale .set (20 , 4 );
454
+ updateHitbox ();
455
+ x = xPos - 20 ;
456
+ super .drawMeasures (- 3 );
457
+ }
458
+ override private function drawTimeSignatureChangeGaps () {}
330
459
}
0 commit comments