2023-11-07 04:04:22 -05:00
|
|
|
package funkin.graphics.shaders;
|
2022-07-22 16:11:18 -04:00
|
|
|
|
|
|
|
import flixel.addons.display.FlxRuntimeShader;
|
|
|
|
import openfl.Assets;
|
|
|
|
|
|
|
|
enum WiggleEffectType
|
|
|
|
{
|
2023-01-22 22:25:45 -05:00
|
|
|
DREAMY; // 0
|
|
|
|
WAVY; // 1
|
|
|
|
HEAT_WAVE_HORIZONTAL; // 2
|
|
|
|
HEAT_WAVE_VERTICAL; // 3
|
|
|
|
FLAG; // 4
|
2022-07-22 16:11:18 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* To use:
|
|
|
|
* 1. Create an instance of the class, specifying speed, frequency, and amplitude.
|
|
|
|
* 2. Call `sprite.shader = wiggleEffect` on the target sprite.
|
|
|
|
* 3. Call the update() method on the instance every frame.
|
|
|
|
*/
|
|
|
|
class WiggleEffectRuntime extends FlxRuntimeShader
|
|
|
|
{
|
2023-01-22 22:25:45 -05:00
|
|
|
public static function getEffectTypeId(v:WiggleEffectType):Int
|
|
|
|
{
|
|
|
|
return WiggleEffectType.getConstructors().indexOf(Std.string(v));
|
|
|
|
}
|
|
|
|
|
|
|
|
public var effectType(default, set):WiggleEffectType = DREAMY;
|
|
|
|
|
|
|
|
function set_effectType(v:WiggleEffectType):WiggleEffectType
|
|
|
|
{
|
|
|
|
this.setInt('effectType', getEffectTypeId(v));
|
|
|
|
return effectType = v;
|
|
|
|
}
|
|
|
|
|
|
|
|
public var waveSpeed(default, set):Float = 0;
|
|
|
|
|
|
|
|
function set_waveSpeed(v:Float):Float
|
|
|
|
{
|
|
|
|
this.setFloat('uSpeed', v);
|
|
|
|
return waveSpeed = v;
|
|
|
|
}
|
|
|
|
|
|
|
|
public var waveFrequency(default, set):Float = 0;
|
|
|
|
|
|
|
|
function set_waveFrequency(v:Float):Float
|
|
|
|
{
|
|
|
|
this.setFloat('uFrequency', v);
|
|
|
|
return waveFrequency = v;
|
|
|
|
}
|
|
|
|
|
|
|
|
public var waveAmplitude(default, set):Float = 0;
|
|
|
|
|
|
|
|
function set_waveAmplitude(v:Float):Float
|
|
|
|
{
|
|
|
|
this.setFloat('uWaveAmplitude', v);
|
|
|
|
return waveAmplitude = v;
|
|
|
|
}
|
|
|
|
|
|
|
|
var time(default, set):Float = 0;
|
|
|
|
|
|
|
|
function set_time(v:Float):Float
|
|
|
|
{
|
|
|
|
this.setFloat('uTime', v);
|
|
|
|
return time = v;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function new(speed:Float, freq:Float, amplitude:Float, ?effect:WiggleEffectType = DREAMY):Void
|
|
|
|
{
|
|
|
|
super(Assets.getText(Paths.frag('wiggle')));
|
|
|
|
|
|
|
|
// These values may not propagate to the shader until later.
|
|
|
|
this.waveSpeed = speed;
|
|
|
|
this.waveFrequency = freq;
|
|
|
|
this.waveAmplitude = amplitude;
|
|
|
|
this.effectType = effect;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function update(elapsed:Float)
|
|
|
|
{
|
|
|
|
// The setter tied to this value automatically propagates the value to the shader.
|
|
|
|
this.time += elapsed;
|
|
|
|
}
|
2022-07-22 16:11:18 -04:00
|
|
|
}
|