From 172af9a68008f5d5a4813593cc742f76eda5e180 Mon Sep 17 00:00:00 2001 From: lunarcleint <88809950+lunarcleint@users.noreply.github.com> Date: Tue, 19 Mar 2024 04:37:35 -0700 Subject: [PATCH] commiting for now, gn --- assets/shaders/engine/editorWaveforms.frag | 31 ++++++++++++ source/funkin/editors/charter/Charter.hx | 57 ++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 assets/shaders/engine/editorWaveforms.frag diff --git a/assets/shaders/engine/editorWaveforms.frag b/assets/shaders/engine/editorWaveforms.frag new file mode 100644 index 00000000..94ae5293 --- /dev/null +++ b/assets/shaders/engine/editorWaveforms.frag @@ -0,0 +1,31 @@ +#pragma header +#extension GL_EXT_gpu_shader4 : enable + +// Used in charter by waveforms -lunar + +uniform vec2 textureRes; + +uniform sampler2D waveformTexture; +uniform ivec2 waveformSize; + +float getAmplitude() { + float amplitudeRet = 0.; // look in charter for more how it works -lunar + + vec2 pixel = openfl_TextureCoordv * textureRes; + float pixelID = floor(pixel.y/3.); + + vec2 wavePixel = vec2(int(pixelID)%waveformSize.x, floor(pixelID/waveformSize.x)); + vec4 waveData = texture2D(waveformTexture, wavePixel / waveformSize); + + switch (int(pixel.y) % 3) { + case 0: amplitudeRet = waveData.r; break; + case 1: amplitudeRet = waveData.g; break; + case 2: amplitudeRet = waveData.b; break; + } + return amplitudeRet; +} + +void main() +{ + gl_FragColor = vec4(vec3(getAmplitude()), 1.); +} \ No newline at end of file diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 38023cfc..2cca1ea4 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -16,6 +16,9 @@ import funkin.backend.chart.ChartData; import flixel.addons.display.FlxBackdrop; import funkin.editors.ui.UIContextMenu.UIContextMenuOption; import funkin.editors.ui.UIState; +import flixel.util.FlxColor; +import openfl.display.BitmapData; +import funkin.backend.shaders.CustomShader; class Charter extends UIState { public static var __song:String; @@ -547,8 +550,57 @@ class Charter extends UIState { // Undo Stuffs :D __relinkUndos(); __applyPlaytestInfo(); + + var analyzer:AudioAnalyzer = new AudioAnalyzer(FlxG.sound.music); + + var pixelsToAnalyze:Float = __endStep*40; + + var pixelsNeeded:Int = Math.floor(pixelsToAnalyze/3); + if ((pixelsToAnalyze/3) % 1 > 0) pixelsNeeded += 1; + + var WRAP_WIDTH:Int = 300; // just to test if it works - lunar + + var waveData:BitmapData = new BitmapData(WRAP_WIDTH, 1+Math.floor(pixelsNeeded/WRAP_WIDTH), true, 0xFF000000); + + for (y in 0...waveData.height) + for (x in 0...waveData.width) { + var amplitudes:Array = [0., 0., 0.]; + for (color in 0...3) { + var gridY:Float = (y * (WRAP_WIDTH * 3)) + (x * 3) + color; + + var startTime:Float = Conductor.getTimeForStep(gridY/40); + if (startTime > FlxG.sound.music.length) + if (color == 0) break; else continue; + + var endTime:Float = Conductor.getTimeForStep((gridY+1)/40); + if (endTime > FlxG.sound.music.length) + if (color == 0) break; else continue; + + var amplitude:Float = analyzer.analyze(startTime, endTime); + amplitudes[color] = amplitude; + } + waveData.setPixel(x, y, FlxColor.fromRGBFloat(amplitudes[0], amplitudes[1], amplitudes[2])); + } + + var sprite:FlxSprite = new FlxSprite().loadGraphic(waveData); + sprite.cameras = [charterCamera]; + add(sprite); + + var testWaveform:FlxSprite = new FlxSprite().makeSolid(160, 16*Std.int(40 * Conductor.getMeasureLength()), 0xFF000000); + testWaveform.cameras = [charterCamera]; + add(testWaveform); + + wshader = new CustomShader("engine/editorWaveforms"); + wshader.data.waveformSize.value = [waveData.width, waveData.height]; + wshader.data.waveformTexture.input = waveData; + + wshader.data.textureRes.value = [testWaveform.width, testWaveform.height]; + + testWaveform.shader = wshader; } + var wshader:CustomShader; + public var __endStep:Float = 0; public function refreshBPMSensitive() { // refreshes everything dependant on BPM, and BPM changes @@ -1042,6 +1094,11 @@ class Charter extends UIState { super.update(elapsed); + if (FlxG.keys.justPressed.X) + wshader.data.MODE.value = [false]; + if (FlxG.keys.justPressed.Y) + wshader.data.MODE.value = [true]; + scrollBar.size = (FlxG.height / 40 / charterCamera.zoom); scrollBar.start = Conductor.curStepFloat - (scrollBar.size / 2);