Optimize Adjust Color
Co-Authored-By: iLauncherDev <93844852+iLauncherDev@users.noreply.github.com>
This commit is contained in:
committed by
Hundrec
co-authored by
iLauncherDev
parent
92331dd8bf
commit
475c7cbf80
@@ -1,15 +1,88 @@
|
||||
package funkin.graphics.shaders;
|
||||
|
||||
import flixel.addons.display.FlxRuntimeShader;
|
||||
import flixel.math.FlxAngle;
|
||||
|
||||
@:nullSafety
|
||||
/**
|
||||
* This shader is a recreation of Adobe Animate/Flash's "Adjust Color" filter.
|
||||
* Originally written by Rozebud https://github.com/ThatRozebudDude
|
||||
*
|
||||
* Adapted from Andrey-Postelzhuks shader found here: https://forum.unity.com/threads/hue-saturation-brightness-contrast-shader.260649/
|
||||
* Hue rotation stuff is from here: https://www.w3.org/TR/filter-effects/#feColorMatrixElement
|
||||
*/
|
||||
class AdjustColorShader extends FlxRuntimeShader
|
||||
{
|
||||
/**
|
||||
* The hue adjustment.
|
||||
*/
|
||||
public var hue(default, set):Float = 0;
|
||||
|
||||
function set_hue(val:Float):Float
|
||||
{
|
||||
hue = val;
|
||||
|
||||
hueMatrix = makeHueMatrix(val * FlxAngle.TO_RAD);
|
||||
|
||||
updateFinalMatrix();
|
||||
return val;
|
||||
}
|
||||
|
||||
/**
|
||||
* The saturation adjustment.
|
||||
*/
|
||||
public var saturation(default, set):Float = 0;
|
||||
|
||||
function set_saturation(val:Float):Float
|
||||
{
|
||||
saturation = val;
|
||||
|
||||
if (val > 0) val *= 3;
|
||||
val = 1 + (val / 100);
|
||||
|
||||
saturationMatrix = makeSaturationMatrix(val);
|
||||
|
||||
updateFinalMatrix();
|
||||
return val;
|
||||
}
|
||||
|
||||
/**
|
||||
* The brightness adjustment.
|
||||
*/
|
||||
public var brightness(default, set):Float = 0;
|
||||
|
||||
function set_brightness(val:Float):Float
|
||||
{
|
||||
brightness = val;
|
||||
|
||||
this.setFloat('brightness', val / 255);
|
||||
return val;
|
||||
}
|
||||
|
||||
/**
|
||||
* The contrast adjustment.
|
||||
*/
|
||||
public var contrast(default, set):Float = 0;
|
||||
|
||||
function set_contrast(val:Float):Float
|
||||
{
|
||||
var e:Float = 2.718281828459045;
|
||||
|
||||
contrast = val;
|
||||
|
||||
val = 1 + (val / 100);
|
||||
if (val > 1.0)
|
||||
{
|
||||
val = (((0.00852259 * Math.pow(e, 4.76454 * (val - 1.0))) * 1.01) - 0.0086078159) * 10.0; // Just roll with it...
|
||||
val += 1.0;
|
||||
}
|
||||
|
||||
this.setFloat('contrast', val);
|
||||
return val;
|
||||
}
|
||||
|
||||
var hueMatrix:Array<Float>;
|
||||
var saturationMatrix:Array<Float>;
|
||||
|
||||
public function new()
|
||||
{
|
||||
super(Assets.getText(Paths.frag('adjustColor')));
|
||||
@@ -19,39 +92,51 @@ class AdjustColorShader extends FlxRuntimeShader
|
||||
contrast = 0;
|
||||
}
|
||||
|
||||
function set_hue(value:Float):Float
|
||||
function updateFinalMatrix():Void
|
||||
{
|
||||
this.setFloat('hue', value);
|
||||
this.hue = value;
|
||||
if (hueMatrix != null)
|
||||
{
|
||||
this.setFloatArray('hueMatrix', hueMatrix);
|
||||
}
|
||||
|
||||
return this.hue;
|
||||
if (saturationMatrix != null)
|
||||
{
|
||||
this.setFloatArray('saturationMatrix', saturationMatrix);
|
||||
}
|
||||
}
|
||||
|
||||
function set_saturation(value:Float):Float
|
||||
function makeHueMatrix(h:Float):Array<Float>
|
||||
{
|
||||
this.setFloat('saturation', value);
|
||||
this.saturation = value;
|
||||
var c = Math.cos(h);
|
||||
var s = Math.sin(h);
|
||||
|
||||
return this.saturation;
|
||||
var wR = 0.299;
|
||||
var wG = 0.587;
|
||||
var wB = 0.114;
|
||||
|
||||
return [
|
||||
wR + (1 - wR) * c - wR * s, wG - wG * c - wG * s, wB - wB * c + (1 - wB) * s,
|
||||
wR - wR * c + 0.143 * s, wG + (1 - wG) * c + 0.140 * s, wB - wB * c - 0.283 * s,
|
||||
wR - wR * c - (1 - wR) * s, wG - wG * c + wG * s, wB + (1 - wB) * c + wB * s
|
||||
];
|
||||
}
|
||||
|
||||
function set_brightness(value:Float):Float
|
||||
function makeSaturationMatrix(s:Float):Array<Float>
|
||||
{
|
||||
this.setFloat('brightness', value);
|
||||
this.brightness = value;
|
||||
var lr = 0.2126;
|
||||
var lg = 0.7152;
|
||||
var lb = 0.0722;
|
||||
|
||||
return this.brightness;
|
||||
var inv = 1.0 - s;
|
||||
|
||||
return [
|
||||
lr * inv + s, lg * inv, lb * inv,
|
||||
lr * inv, lg * inv + s, lb * inv,
|
||||
lr * inv, lg * inv, lb * inv + s
|
||||
];
|
||||
}
|
||||
|
||||
function set_contrast(value:Float):Float
|
||||
{
|
||||
this.setFloat('contrast', value);
|
||||
this.contrast = value;
|
||||
|
||||
return this.contrast;
|
||||
}
|
||||
|
||||
override public function toString():String
|
||||
public override function toString():String
|
||||
{
|
||||
return 'AdjustColorShader(${this.hue}, ${this.saturation}, ${this.brightness}, ${this.contrast})';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user