Bump flixel-animate and simplify rimlights for atlases

This commit is contained in:
AbnormalPoof
2025-12-16 01:15:33 -06:00
committed by Abnormal
parent 8d4ced40a6
commit 253bb2d7f6
3 changed files with 95 additions and 81 deletions
+1 -1
Submodule assets updated: d645f8fd60...7188323882
+1 -1
View File
@@ -59,7 +59,7 @@
"name": "flixel-animate",
"type": "git",
"dir": null,
"ref": "84cd1915161eb49fba33b3f81a8c7ea3f05ae053",
"ref": "c61476f4b3a3d225631ab3065e4e925a4b63c076",
"url": "https://github.com/MaybeMaru/flixel-animate"
},
{
@@ -2,115 +2,119 @@ package funkin.graphics.shaders;
import flixel.system.FlxAssets.FlxShader;
import flixel.util.FlxColor;
import flixel.FlxSprite;
import funkin.graphics.FunkinSprite;
import flixel.math.FlxAngle;
import flixel.graphics.frames.FlxFrame;
import openfl.display.BitmapData;
/*
A shader that aims to *mostly recreate how Adobe Animate/Flash handles drop shadows, but its main use here is for rim lighting.
Has options for color, angle, distance, and a threshold to not cast the shadow on parts like outlines.
Can also be supplied a secondary mask which can then have an alternate threshold, for when sprites have too many conflicting colors
for the drop shadow to look right (e.g. the tankmen on GF's speakers).
Also has an Adjust Color shader in here so they can work together when needed.
/**
* A shader that aims to *mostly recreate how Adobe Animate/Flash handles drop shadows, but its main use here is for rim lighting.
*
* Has options for color, angle, distance, and a threshold to not cast the shadow on parts like outlines.
* Can also be supplied a secondary mask which can then have an alternate threshold, for when sprites have too many conflicting colors
* for the drop shadow to look right (e.g. the tankmen on GF's speakers).
*
* Also has an Adjust Color shader in here so they can work together when needed.
*/
class DropShadowShader extends FlxShader
{
/*
The color of the drop shadow.
/**
* The color of the drop shadow.
*/
public var color(default, set):FlxColor;
/*
The angle of the drop shadow.
for reference, depending on the angle, the affected side will be:
0 = RIGHT
90 = UP
180 = LEFT
270 = DOWN
/**
* The angle of the drop shadow.
*
* for reference, depending on the angle, the affected side will be:
* 0 = RIGHT
* 90 = UP
* 180 = LEFT
* 270 = DOWN
*/
public var angle(default, set):Float;
/*
The distance or size of the drop shadow, in pixels,
relative to the texture itself... NOT the camera.
/**
* The distance or size of the drop shadow, in pixels,
* relative to the texture itself... NOT the camera.
*/
public var distance(default, set):Float;
/*
The strength of the drop shadow.
Effectively just an alpha multiplier.
/**
* The strength of the drop shadow.
* Effectively just an alpha multiplier.
*/
public var strength(default, set):Float;
/*
The brightness threshold for the drop shadow.
Anything below this number will NOT be affected by the drop shadow shader.
A value of 0 effectively means theres no threshold, and vice versa.
/**
* The brightness threshold for the drop shadow.
* Anything below this number will NOT be affected by the drop shadow shader.
* A value of 0 effectively means theres no threshold, and vice versa.
*/
public var threshold(default, set):Float;
/*
The amount of antialias samples per-pixel,
used to smooth out any hard edges the brightness thresholding creates.
Defaults to 2, and 0 will remove any smoothing.
/**
* The amount of antialias samples per-pixel,
* used to smooth out any hard edges the brightness thresholding creates.
* Defaults to 2, and 0 will remove any smoothing.
*/
public var antialiasAmt(default, set):Float;
/*
Whether the shader should try and use the alternate mask.
False by default.
/**
* Whether the shader should try and use the alternate mask.
* False by default.
*/
public var useAltMask(default, set):Bool;
/*
The image for the alternate mask.
At the moment, it uses the blue channel to specify what is or isnt going to use the alternate threshold.
(its kinda sloppy rn i need to make it work a little nicer)
TODO: maybe have a sort of "threshold intensity texture" as well? where higher/lower values indicate threshold strength..
/**
* The image for the alternate mask.
* At the moment, it uses the blue channel to specify what is or isnt going to use the alternate threshold.
* (its kinda sloppy rn i need to make it work a little nicer)
* TODO: maybe have a sort of "threshold intensity texture" as well? where higher/lower values indicate threshold strength..
*/
public var altMaskImage(default, set):BitmapData;
/*
An alternate brightness threshold for the drop shadow.
Anything below this number will NOT be affected by the drop shadow shader,
but ONLY when the pixel is within the mask.
/**
* An alternate brightness threshold for the drop shadow.
* Anything below this number will NOT be affected by the drop shadow shader,
* but ONLY when the pixel is within the mask.
*/
public var maskThreshold(default, set):Float;
/*
The FlxSprite that the shader should get the frame data from.
Needed to keep the drop shadow shader in the correct bounds and rotation.
/**
* The FunkinSprite that the shader should get the frame data from.
* Needed to keep the drop shadow shader in the correct bounds and rotation.
*/
public var attachedSprite(default, set):FlxSprite;
public var attachedSprite(default, set):FunkinSprite;
/*
The hue component of the Adjust Color part of the shader.
/**
* The hue component of the Adjust Color part of the shader.
*/
public var baseHue(default, set):Float;
/*
The saturation component of the Adjust Color part of the shader.
/**
* The saturation component of the Adjust Color part of the shader.
*/
public var baseSaturation(default, set):Float;
/*
The brightness component of the Adjust Color part of the shader.
/**
* The brightness component of the Adjust Color part of the shader.
*/
public var baseBrightness(default, set):Float;
/*
The contrast component of the Adjust Color part of the shader.
/**
* The contrast component of the Adjust Color part of the shader.
*/
public var baseContrast(default, set):Float;
/*
Sets all 4 adjust color values.
/**
* Sets all 4 adjust color values.
* @param b The brightness value
* @param h The hue value
* @param c The contrast value
* @param s The saturation value
*/
public function setAdjustColor(b:Float, h:Float, c:Float, s:Float)
public function setAdjustColor(b:Float, h:Float, c:Float, s:Float):Void
{
baseBrightness = b;
baseHue = h;
@@ -189,18 +193,28 @@ class DropShadowShader extends FlxShader
return val;
}
function set_attachedSprite(spr:FlxSprite):FlxSprite
function set_attachedSprite(spr:FunkinSprite):FunkinSprite
{
attachedSprite = spr;
updateFrameInfo(attachedSprite.frame);
// Enable render texture for texture atlas sprites
// This allows the shader to work properly on them
if (attachedSprite.isAnimate && !attachedSprite.useRenderTexture)
{
attachedSprite.useRenderTexture = true;
}
return spr;
}
/*
Loads an image for the mask.
While you *could* directly set the value of the mask, this function works for both HTML5 and native targets.
/**
* Loads an image for the mask.
* While you *could* directly set the value of the mask, this function works for both HTML5 and native targets.
*
* @param path The path to the image to load
*/
public function loadAltMask(path:String)
public function loadAltMask(path:String):Void
{
#if html5
BitmapData.loadFromFile(path).onComplete(function(bmp:BitmapData) {
@@ -211,19 +225,24 @@ class DropShadowShader extends FlxShader
#end
}
/*
Should be called on the animation.callback of the attached sprite.
TODO: figure out why the reference to the attachedSprite breaks on web??
/**
* Should be called on the animation.callback of the attached sprite.
* TODO: figure out why the reference to the attachedSprite breaks on web??
*
* @param name The name of the animation
* @param frameNum The current frame number
* @param frameIndex The current frame index
*/
public function onAttachedFrame(name, frameNum, frameIndex)
public function onAttachedFrame(name:String, frameNum:Int, frameIndex:Int):Void
{
if (attachedSprite != null) updateFrameInfo(attachedSprite.frame);
}
/*
Updates the frame bounds and angle offset of the sprite for the shader.
/**
* Updates the frame bounds and angle offset of the sprite for the shader
* @param frame The frame to retrieve the information from
*/
public function updateFrameInfo(frame:FlxFrame)
public function updateFrameInfo(frame:FlxFrame):Void
{
// NOTE: uv.right is actually the right pos and uv.bottom is the bottom pos
uFrameBounds.value = [frame.uv.left, frame.uv.top, frame.uv.right, frame.uv.bottom];
@@ -232,12 +251,6 @@ class DropShadowShader extends FlxShader
angOffset.value = [frame.angle * FlxAngle.TO_RAD];
}
public function updateFrameInfoSimple(width:Float, height:Float, angle:Float):Void
{
uFrameBounds.value = [0, 0, width, height];
angOffset.value = [angle * FlxAngle.TO_RAD];
}
function set_altMaskImage(_bitmapData:BitmapData):BitmapData
{
altMask.input = _bitmapData;
@@ -408,7 +421,8 @@ class DropShadowShader extends FlxShader
vec2 imageRatio = vec2(1.0/openfl_TextureSize.x, 1.0/openfl_TextureSize.y);
// check the pixel in the direction and distance specified
vec2 checkedPixel = vec2(openfl_TextureCoordv.x + (dist * cos(ang + angOffset) * imageRatio.x), openfl_TextureCoordv.y - (dist * sin(ang + angOffset) * imageRatio.y));
vec2 checkedPixel = vec2(openfl_TextureCoordv.x + (dist * cos(ang + angOffset) * imageRatio.x),
openfl_TextureCoordv.y - (dist * sin(ang + angOffset) * imageRatio.y));
// multiplier for the intensity of the drop shadow
float dropShadowAmount = 0.0;