From a6eb848429f2f80a93e1413af158e59ef9d75d3e Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 29 Mar 2023 10:49:42 -0600 Subject: [PATCH] Hollywoo-flixel do polygon-based lighting --- src/hollywoo_flixel/FlxDirector.hx | 18 +++++++++++++- src/hollywoo_flixel/FlxDirector.kiss | 37 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/hollywoo_flixel/FlxDirector.hx b/src/hollywoo_flixel/FlxDirector.hx index f244c45..629b778 100644 --- a/src/hollywoo_flixel/FlxDirector.hx +++ b/src/hollywoo_flixel/FlxDirector.hx @@ -18,9 +18,25 @@ import flixel.text.FlxText; import flixel.system.FlxSound; import flixel.FlxCamera; import flixel.util.FlxTimer; +import flixel.math.FlxPoint; import haxe.Constraints; import kiss_flixel.SpriteTools; import haxe.ds.Option; +using flixel.util.FlxSpriteUtil; +import openfl.display.BitmapData; +import openfl.display.BitmapDataChannel; +import openfl.geom.Rectangle; +import openfl.geom.Point; @:build(kiss.Kiss.build()) -class FlxDirector implements Director {} +class FlxDirector implements Director { + public static function blackAlphaMaskFlxSprite(sprite:FlxSprite, mask:FlxSprite, output:FlxSprite):FlxSprite + { + sprite.drawFrame(); + var data:BitmapData = sprite.pixels.clone(); + data.copyChannel(mask.pixels, new Rectangle(0, 0, sprite.width, sprite.height), new Point(), BitmapDataChannel.RED, BitmapDataChannel.ALPHA); + output.pixels = data; + return output; + } + +} diff --git a/src/hollywoo_flixel/FlxDirector.kiss b/src/hollywoo_flixel/FlxDirector.kiss index 195b3df..e9e3ea4 100644 --- a/src/hollywoo_flixel/FlxDirector.kiss +++ b/src/hollywoo_flixel/FlxDirector.kiss @@ -31,6 +31,8 @@ (setSprite.updateHitbox) (setSprite.screenCenter)) (otherwise)) + // TODO draw a sky background depending on time of day, int/ext + (FlxG.cameras.remove flxMovie.uiCamera false) (FlxG.cameras.remove flxMovie.screenCamera false) (FlxG.cameras.add camera) @@ -45,6 +47,41 @@ (FlxG.state.remove set) (cc)) +(method :FlxSprite drawLight [:FlxLightSource source] + (lightSprite.drawPolygon source.points source.color (object color FlxColor.TRANSPARENT)) + (lightMask.drawPolygon source.points FlxColor.BLACK (object color FlxColor.TRANSPARENT))) + +(var EVENING_COLOR (FlxColor.fromRGBFloat 0.5 0 0.5 0.2)) +(var NIGHT_COLOR (FlxColor.fromRGBFloat 0 0 0 0.5)) +(prop &mut :FlxSprite lightSprite null) +(prop &mut :FlxSprite lightMask null) +(prop &mut :FlxSprite darkness null) +(prop &mut :FlxColor darkColor FlxColor.BLACK) +(method :Void showLighting [:SceneTime sceneTime :Array lightSources :FlxCamera camera] + + (set lightSprite (new FlxSprite)) + (lightSprite.makeGraphic FlxG.width FlxG.height FlxColor.TRANSPARENT true) + (set lightMask (new FlxSprite)) + (lightMask.makeGraphic FlxG.width FlxG.height FlxColor.WHITE true) + (set darkness (new FlxSprite)) + // TODO handle morning better + (set darkColor (case sceneTime + (Evening EVENING_COLOR) + (Night NIGHT_COLOR) + (otherwise FlxColor.TRANSPARENT))) + (darkness.makeGraphic FlxG.width FlxG.height darkColor true) + (doFor source lightSources (drawLight source)) + (blackAlphaMaskFlxSprite darkness lightMask darkness) + (set lightSprite.cameras [flxMovie.screenCamera]) + (set darkness.alpha darkColor.alphaFloat) + (set darkness.cameras [flxMovie.screenCamera]) + (FlxG.state.add darkness) + (FlxG.state.add lightSprite)) + +(method :Void hideLighting [] + (FlxG.state.remove darkness) + (FlxG.state.remove lightSprite)) + (method :Void cleanup [] 0) (method :Option autoZConfig [] (Some (object zPerLayer flxMovie.STAGE_BEHIND_DY frontLayer 0)))