diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 019bfeba..fabd88f1 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -86,6 +86,7 @@ class Charter extends UIState { public static var undos:UndoList; public static var clipboard:Array = []; + public static var waveformHandler:CharterWaveformHandler; public function new(song:String, diff:String, reload:Bool = true) { super(); @@ -551,13 +552,7 @@ class Charter extends UIState { __relinkUndos(); __applyPlaytestInfo(); - var charterWaveHandler:CharterWaveformHandler = new CharterWaveformHandler(); - charterWaveHandler.ampsNeeded = __endStep*40; - - var waveShader:CustomShader = charterWaveHandler.generateShader("Voices.ogg", vocals); - for (grid in gridBackdrops) grid.waveformSprite.shader = waveShader; - - var dataDisplay:FlxSprite = new FlxSprite().loadGraphic(charterWaveHandler.waveDatas.get("Voices.ogg")); + var dataDisplay:FlxSprite = new FlxSprite().loadGraphic(waveformHandler.waveDatas.get("Voices.ogg")); dataDisplay.cameras = [charterCamera]; dataDisplay.x = -dataDisplay.width; add(dataDisplay); } @@ -569,6 +564,30 @@ class Charter extends UIState { gridBackdrops.bottomLimitY = __endStep * 40; eventsBackdrop.bottomSeparator.y = gridBackdrops.bottomLimitY-2; + + regenerateWaveforms(); + } + + public function regenerateWaveforms() { + if (waveformHandler == null ? true : waveformHandler.ampsNeeded != __endStep*40) { + trace("REGEN WAVES"); + + waveformHandler.clearWaveforms(); + waveformHandler.ampsNeeded = __endStep * 40; + + var wavesToGenerate:Array<{name:String, sound:FlxSound}> = [ + {name: "Inst.ogg", sound: FlxG.sound.music}, + {name: "Voices.ogg", sound: vocals} + ]; + + for (data in wavesToGenerate) { + waveformHandler.generateShader(data.name, data.sound); + waveformHandler.waveformList.push(data.name); + } + + for (strumLine in strumLines) // Update grids + strumLine.selectedWaveform = strumLine.selectedWaveform; + } } public override function beatHit(curBeat:Int) { @@ -1726,10 +1745,12 @@ class Charter extends UIState { selection = new Selection(); undos = new UndoList(); clipboard = []; playtestInfo = null; + waveformHandler = new CharterWaveformHandler(); } @:noCompletion public function __clearStatics() { - selection = null; undos = null; clipboard = null; playtestInfo = null; + selection = null; undos = null; clipboard = null; playtestInfo = null; + waveformHandler.destroy(); Charter.waveformHandler = null; } @:noCompletion public function __updatePlaytestInfo() { diff --git a/source/funkin/editors/charter/CharterBackdropGroup.hx b/source/funkin/editors/charter/CharterBackdropGroup.hx index 7a5c379a..ae65f7fe 100644 --- a/source/funkin/editors/charter/CharterBackdropGroup.hx +++ b/source/funkin/editors/charter/CharterBackdropGroup.hx @@ -64,6 +64,8 @@ class CharterBackdropGroup extends FlxTypedGroup { grid.sectionSeparator.visible = sectionsVisible; grid.beatSeparator.visible = beatsVisible; + grid.waveformSprite.shader = strumLine.waveformShader; + grid.notesGroup.clear(); notesGroup.forEach((n) -> { var onStr:Bool = (n.snappedToStrumline ? n.strumLineID : Std.int(FlxMath.bound((n.x+n.width)/(40*4), 0, strumLineGroup.members.length-1))) == i; diff --git a/source/funkin/editors/charter/CharterEventScreen.hx b/source/funkin/editors/charter/CharterEventScreen.hx index 5dc3ca8e..31d62580 100644 --- a/source/funkin/editors/charter/CharterEventScreen.hx +++ b/source/funkin/editors/charter/CharterEventScreen.hx @@ -79,13 +79,13 @@ class CharterEventScreen extends UISubstateWindow { else { chartEvent.events = [for (i in eventsList.buttons.members) i.event]; chartEvent.refreshEventIcons(); + Charter.instance.updateBPMEvents(); Charter.undos.addToUndo(CEditEvent(chartEvent, oldEvents, [for (event in events) Reflect.copy(event)])); } } close(); - Charter.instance.updateBPMEvents(); }); saveButton.x -= saveButton.bWidth; add(saveButton); diff --git a/source/funkin/editors/charter/CharterStrumline.hx b/source/funkin/editors/charter/CharterStrumline.hx index bee6e7a3..f4e1fbb6 100644 --- a/source/funkin/editors/charter/CharterStrumline.hx +++ b/source/funkin/editors/charter/CharterStrumline.hx @@ -5,6 +5,7 @@ import funkin.game.Character; import funkin.editors.ui.UITopMenu.UITopMenuButton; import funkin.game.HealthIcon; import funkin.backend.chart.ChartData.ChartStrumLine; +import funkin.backend.shaders.CustomShader; import flixel.sound.FlxSound; class CharterStrumline extends UISprite { @@ -22,6 +23,17 @@ class CharterStrumline extends UISprite { public var vocals:FlxSound; + public var selectedWaveform(default, set):Int = -1; + public function set_selectedWaveform(value:Int):Int { + if (value == -1) waveformShader = null; + else { + var shaderName:String = Charter.waveformHandler.waveformList[value]; + waveformShader = Charter.waveformHandler.waveShaders.get(shaderName); + } + return selectedWaveform = value; + } + public var waveformShader:CustomShader; + public function new(strumLine:ChartStrumLine) { super(); this.strumLine = strumLine; @@ -60,6 +72,8 @@ class CharterStrumline extends UISprite { vocals = strumLine.vocalsSuffix.length > 0 ? FlxG.sound.load(Paths.voices(PlayState.SONG.meta.name, PlayState.difficulty, strumLine.vocalsSuffix)) : new FlxSound(); vocals.group = FlxG.sound.defaultMusicGroup; + + selectedWaveform = -1; } private var __healthYOffset:Float = 0; @@ -154,6 +168,22 @@ class CharterStrumlineOptions extends UITopMenuButton { icon: 3 } ]; + + contextMenu.insert(0, { + label: "No Waveform", + onSelect: function(_) {strLine.selectedWaveform = -1;}, + icon: strLine.selectedWaveform == -1 ? 1 : 0 + }); + + for (i => name in Charter.waveformHandler.waveformList) + contextMenu.insert(1+i, { + label: name, + onSelect: function(_) {strLine.selectedWaveform = i;}, + icon: strLine.selectedWaveform == i ? 1 : 0 + }); + + contextMenu.insert(1+Charter.waveformHandler.waveformList.length, null); + super.openContextMenu(); } } \ No newline at end of file diff --git a/source/funkin/editors/charter/CharterWaveformHandler.hx b/source/funkin/editors/charter/CharterWaveformHandler.hx index caacad78..233d8e44 100644 --- a/source/funkin/editors/charter/CharterWaveformHandler.hx +++ b/source/funkin/editors/charter/CharterWaveformHandler.hx @@ -22,6 +22,8 @@ class CharterWaveformHandler extends FlxBasic { public var sounds:Map = []; public var analyzers:Map = []; + public var waveformList:Array = []; + public function new() {super(); exists = false;} public function generateData(name:String, sound:FlxSound):BitmapData { @@ -75,14 +77,19 @@ class CharterWaveformHandler extends FlxBasic { return waveShader; } - public override function destroy() { + public function clearWaveforms() { for (data in waveDatas) data.dispose(); for (shader in waveShaders) shader = null; for (analyzer in analyzers) analyzer = null; waveDatas.clear(); waveShaders.clear(); analyzers.clear(); sounds.clear(); + + waveformList = []; + } + public override function destroy() { + clearWaveforms(); super.destroy(); } } \ No newline at end of file