Skip to content

Instantly share code, notes, and snippets.

@01010111
Created October 28, 2022 03:47
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 01010111/8f5950ba80bc436d95e29bc383b60dc4 to your computer and use it in GitHub Desktop.
Save 01010111/8f5950ba80bc436d95e29bc383b60dc4 to your computer and use it in GitHub Desktop.

Camera Drop Shadow Filter

Apply to a foreground camera to project shadows down to a background camera:

var bg_cam = new FlxCamera();
var fg_cam = new FlxCamera();

FlxG.cameras.setDefaultDrawTarget(bg_cam, false);
fg_cam.bgColor = 0x00FFFFFF;
fg_cam.setFilters([new ShaderFilter(new CameraShadowFilter(8, 8, 0x80000000))]);

FlxG.cameras.reset(bg_cam);
FlxG.cameras.add(fg_cam);
import flixel.system.FlxAssets;
class CameraShadowFilter extends FlxShader {
@:glFragmentSource('
#pragma header
uniform float uOffsetX;
uniform float uOffsetY;
uniform vec4 uShadow;
void main() {
float x = 1.0 / openfl_TextureSize.x;
float y = 1.0 / openfl_TextureSize.y;
vec4 col = texture2D(bitmap, openfl_TextureCoordv.st);
vec4 smp = texture2D(bitmap, openfl_TextureCoordv.st + vec2(x * -uOffsetX, y * -uOffsetY));
if (smp.a > 0.0) {
gl_FragColor = mix(uShadow, col, col.a);
}
else {
gl_FragColor = col;
}
}
')
public var offset_x(default, set):Float;
public var offset_y(default, set):Float;
public var shadow(default, set):FlxColor;
function set_offset_x(v:Float) {
uOffsetX.value = [v];
return offset_x = v;
}
function set_offset_y(v:Float) {
uOffsetY.value = [v];
return offset_y = v;
}
function set_shadow(v:FlxColor) {
uShadow.value = [v.redFloat, v.greenFloat, v.blueFloat, v.alphaFloat];
return shadow = v;
}
public function new(offset_x:Float = 4, offset_y:Float = 4, shadow:FlxColor = FlxColor.BLACK) {
super();
this.offset_x = offset_x;
this.offset_y = offset_y;
this.shadow = shadow;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment