Funkin/source/funkin/shaderslmfao/WiggleEffectRuntime.hx
2023-01-22 22:25:45 -05:00

84 lines
2 KiB
Haxe

package funkin.shaderslmfao;
import flixel.addons.display.FlxRuntimeShader;
import openfl.Assets;
enum WiggleEffectType
{
DREAMY; // 0
WAVY; // 1
HEAT_WAVE_HORIZONTAL; // 2
HEAT_WAVE_VERTICAL; // 3
FLAG; // 4
}
/**
* 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
{
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;
}
}