diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/index.html b/index.html index 55a91f5..60e2379 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,84 @@ Lost My Nuts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/index.html b/index.html index 55a91f5..60e2379 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,84 @@ Lost My Nuts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
diff --git a/index.js b/index.js index 57fe4c9..469e75e 100644 --- a/index.js +++ b/index.js @@ -12,13 +12,6 @@ { this.win = win; win.showDevTools(); - const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address - - var gameContainer = document.getElementById("gameContainer"); - Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); - - var gameManager = new GameManager(); - gameManager.init("js/"); window.addEventListener('resize', this.resize.bind(this)); // start up express @@ -36,12 +29,21 @@ maxReceivedFrameSize : 1024000, }); - this.mode = new JoinMode(); - // start listening this.app.listen(HttpPort, () => console.log('HTTP server listening on port ' + HttpPort + '!')); this.httpServer.listen(WsPort, () => console.log('WebSocket Server started on port ' + WsPort + '!')); this.wsServer.on('request', this.connect.bind(this)); + + const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address + + var gameContainer = document.getElementById("gameContainer"); + Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); + + Game.Server = wsServer; + Game.Address = address; + + var gameManager = new GameManager(); + gameManager.init("shared/js/", HostGame); } connect(req) @@ -58,5 +60,4 @@ } let win = nw.Window.get(); -console.log(win); win.on("loaded", () => new LostMyNuts(win)); diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/index.html b/index.html index 55a91f5..60e2379 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,84 @@ Lost My Nuts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
diff --git a/index.js b/index.js index 57fe4c9..469e75e 100644 --- a/index.js +++ b/index.js @@ -12,13 +12,6 @@ { this.win = win; win.showDevTools(); - const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address - - var gameContainer = document.getElementById("gameContainer"); - Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); - - var gameManager = new GameManager(); - gameManager.init("js/"); window.addEventListener('resize', this.resize.bind(this)); // start up express @@ -36,12 +29,21 @@ maxReceivedFrameSize : 1024000, }); - this.mode = new JoinMode(); - // start listening this.app.listen(HttpPort, () => console.log('HTTP server listening on port ' + HttpPort + '!')); this.httpServer.listen(WsPort, () => console.log('WebSocket Server started on port ' + WsPort + '!')); this.wsServer.on('request', this.connect.bind(this)); + + const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address + + var gameContainer = document.getElementById("gameContainer"); + Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); + + Game.Server = wsServer; + Game.Address = address; + + var gameManager = new GameManager(); + gameManager.init("shared/js/", HostGame); } connect(req) @@ -58,5 +60,4 @@ } let win = nw.Window.get(); -console.log(win); win.on("loaded", () => new LostMyNuts(win)); diff --git a/node_modules/.bin/winrun b/node_modules/.bin/winrun index e9fd763..96ea779 100644 --- a/node_modules/.bin/winrun +++ b/node_modules/.bin/winrun @@ -1,7 +1,5 @@ #! /usr/bin/env bash -echo "TEST" - command=$1 args=$(printf '"`"%s`"",' "${@:2}") ; args=${args%,} winrun_pid=$$ @@ -28,7 +26,6 @@ # Use tail to wait for the file to be populated while read -r line; do windows_pid=$(echo $line | tr -d '\r\n') - echo "Windows_pid: $windows_pid" break # we only need the first line done < <(tail -f $pidfile) rm $pidfile @@ -38,8 +35,7 @@ fi term() { - echo "KILLING $windows_pid" - taskkill.exe -f -pid $windows_pid + taskkill.exe -f -pid $windows_pid > /dev/null } trap term SIGTERM diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/index.html b/index.html index 55a91f5..60e2379 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,84 @@ Lost My Nuts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
diff --git a/index.js b/index.js index 57fe4c9..469e75e 100644 --- a/index.js +++ b/index.js @@ -12,13 +12,6 @@ { this.win = win; win.showDevTools(); - const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address - - var gameContainer = document.getElementById("gameContainer"); - Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); - - var gameManager = new GameManager(); - gameManager.init("js/"); window.addEventListener('resize', this.resize.bind(this)); // start up express @@ -36,12 +29,21 @@ maxReceivedFrameSize : 1024000, }); - this.mode = new JoinMode(); - // start listening this.app.listen(HttpPort, () => console.log('HTTP server listening on port ' + HttpPort + '!')); this.httpServer.listen(WsPort, () => console.log('WebSocket Server started on port ' + WsPort + '!')); this.wsServer.on('request', this.connect.bind(this)); + + const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address + + var gameContainer = document.getElementById("gameContainer"); + Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); + + Game.Server = wsServer; + Game.Address = address; + + var gameManager = new GameManager(); + gameManager.init("shared/js/", HostGame); } connect(req) @@ -58,5 +60,4 @@ } let win = nw.Window.get(); -console.log(win); win.on("loaded", () => new LostMyNuts(win)); diff --git a/node_modules/.bin/winrun b/node_modules/.bin/winrun index e9fd763..96ea779 100644 --- a/node_modules/.bin/winrun +++ b/node_modules/.bin/winrun @@ -1,7 +1,5 @@ #! /usr/bin/env bash -echo "TEST" - command=$1 args=$(printf '"`"%s`"",' "${@:2}") ; args=${args%,} winrun_pid=$$ @@ -28,7 +26,6 @@ # Use tail to wait for the file to be populated while read -r line; do windows_pid=$(echo $line | tr -d '\r\n') - echo "Windows_pid: $windows_pid" break # we only need the first line done < <(tail -f $pidfile) rm $pidfile @@ -38,8 +35,7 @@ fi term() { - echo "KILLING $windows_pid" - taskkill.exe -f -pid $windows_pid + taskkill.exe -f -pid $windows_pid > /dev/null } trap term SIGTERM diff --git a/nodemon.json b/nodemon.json index 2e9869f..1305d81 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,4 +1,5 @@ { "signal":"SIGTERM", - "exec":"npm start" + "exec":"npm start", + "ext":"js,html" } diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/index.html b/index.html index 55a91f5..60e2379 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,84 @@ Lost My Nuts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
diff --git a/index.js b/index.js index 57fe4c9..469e75e 100644 --- a/index.js +++ b/index.js @@ -12,13 +12,6 @@ { this.win = win; win.showDevTools(); - const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address - - var gameContainer = document.getElementById("gameContainer"); - Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); - - var gameManager = new GameManager(); - gameManager.init("js/"); window.addEventListener('resize', this.resize.bind(this)); // start up express @@ -36,12 +29,21 @@ maxReceivedFrameSize : 1024000, }); - this.mode = new JoinMode(); - // start listening this.app.listen(HttpPort, () => console.log('HTTP server listening on port ' + HttpPort + '!')); this.httpServer.listen(WsPort, () => console.log('WebSocket Server started on port ' + WsPort + '!')); this.wsServer.on('request', this.connect.bind(this)); + + const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address + + var gameContainer = document.getElementById("gameContainer"); + Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); + + Game.Server = wsServer; + Game.Address = address; + + var gameManager = new GameManager(); + gameManager.init("shared/js/", HostGame); } connect(req) @@ -58,5 +60,4 @@ } let win = nw.Window.get(); -console.log(win); win.on("loaded", () => new LostMyNuts(win)); diff --git a/node_modules/.bin/winrun b/node_modules/.bin/winrun index e9fd763..96ea779 100644 --- a/node_modules/.bin/winrun +++ b/node_modules/.bin/winrun @@ -1,7 +1,5 @@ #! /usr/bin/env bash -echo "TEST" - command=$1 args=$(printf '"`"%s`"",' "${@:2}") ; args=${args%,} winrun_pid=$$ @@ -28,7 +26,6 @@ # Use tail to wait for the file to be populated while read -r line; do windows_pid=$(echo $line | tr -d '\r\n') - echo "Windows_pid: $windows_pid" break # we only need the first line done < <(tail -f $pidfile) rm $pidfile @@ -38,8 +35,7 @@ fi term() { - echo "KILLING $windows_pid" - taskkill.exe -f -pid $windows_pid + taskkill.exe -f -pid $windows_pid > /dev/null } trap term SIGTERM diff --git a/nodemon.json b/nodemon.json index 2e9869f..1305d81 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,4 +1,5 @@ { "signal":"SIGTERM", - "exec":"npm start" + "exec":"npm start", + "ext":"js,html" } diff --git a/session.vim b/session.vim new file mode 100644 index 0000000..f09aa60 --- /dev/null +++ b/session.vim @@ -0,0 +1,282 @@ +let SessionLoad = 1 +if &cp | set nocp | endif +let s:cpo_save=&cpo +set cpo&vim +imap +inoremap pumvisible() ? "\" : "\" +inoremap pumvisible() ? "\" : "\" +inoremap pumvisible() ? "\" : "\" +nnoremap  :TmuxNavigateLeft +nnoremap :TmuxNavigateDown +nnoremap  :TmuxNavigateUp +nnoremap  :TmuxNavigateRight +map  (ctrlp) +nnoremap  :TmuxNavigatePrevious +nnoremap \d :YcmShowDetailedDiagnostic +xmap \ge CamelCaseMotion_ge +xmap \e CamelCaseMotion_e +xmap \b CamelCaseMotion_b +xmap \w CamelCaseMotion_w +omap \ge CamelCaseMotion_ge +omap \e CamelCaseMotion_e +omap \b CamelCaseMotion_b +omap \w CamelCaseMotion_w +nmap \ge CamelCaseMotion_ge +nmap \e CamelCaseMotion_e +nmap \b CamelCaseMotion_b +nmap \w CamelCaseMotion_w +nmap \ucc TextTMakeUpperCamelCaseLine +xmap \uc TextTMakeUpperCamelCaseVisual +nmap \uc TextTMakeUpperCamelCaseOperator +nmap \scc TextTMakeSnakeCaseLine +xmap \sc TextTMakeSnakeCaseVisual +nmap \sc TextTMakeSnakeCaseOperator +nmap \ccc TextTMakeCamelCaseLine +xmap \cc TextTMakeCamelCaseVisual +nmap \cc TextTMakeCamelCaseOperator +vnoremap \c :call CopyMarkWithCursor("<", ">") +nnoremap \c :set opfunc=OpSysCopyMark g@ +vmap gx NetrwBrowseXVis +nmap gx NetrwBrowseX +xmap g. (visualrepeatForceBuiltInRepeat) +xmap i\ge CamelCaseMotion_ige +xmap i\e CamelCaseMotion_ie +xmap i\b CamelCaseMotion_ib +xmap i\w CamelCaseMotion_iw +omap i\ge CamelCaseMotion_ige +omap i\e CamelCaseMotion_ie +omap i\b CamelCaseMotion_ib +omap i\w CamelCaseMotion_iw +vnoremap NetrwBrowseXVis :call netrw#BrowseXVis() +nnoremap NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX())) +xnoremap 30_(CaptureVirtCol) visualrepeat#CaptureVirtCol() +map (ctrlp) +nnoremap (ctrlp) :CtrlPBuffile +vnoremap CamelCaseMotion_ige :call camelcasemotion#InnerMotion('ge',v:count1) +vnoremap CamelCaseMotion_ie :call camelcasemotion#InnerMotion('e',v:count1) +vnoremap CamelCaseMotion_ib :call camelcasemotion#InnerMotion('b',v:count1) +vnoremap CamelCaseMotion_iw :call camelcasemotion#InnerMotion('w',v:count1) +onoremap CamelCaseMotion_ige :call camelcasemotion#InnerMotion('ge',v:count1) +onoremap CamelCaseMotion_ie :call camelcasemotion#InnerMotion('e',v:count1) +onoremap CamelCaseMotion_ib :call camelcasemotion#InnerMotion('b',v:count1) +onoremap CamelCaseMotion_iw :call camelcasemotion#InnerMotion('w',v:count1) +vnoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'v') +vnoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'v') +vnoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'v') +vnoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'v') +onoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'o') +onoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'o') +onoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'o') +onoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'o') +nnoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'n') +nnoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'n') +nnoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'n') +nnoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'n') +nnoremap TextTMakeUpperCamelCaseOperator TextTransform#Arbitrary#Expression('MakeUpperCamelCase', 'TextRMakeUpperCamelCase') +nnoremap TextTMakeSnakeCaseOperator TextTransform#Arbitrary#Expression('MakeSnakeCase', 'TextRMakeSnakeCase') +vnoremap 19_TextTRecordPos TextTransform#Arbitrary#SetTriggerPos() +nnoremap TextTMakeCamelCaseOperator TextTransform#Arbitrary#Expression('MakeCamelCase', 'TextRMakeCamelCase') +nnoremap 19_Reselect '1v' . (visualmode() !=# 'V' && &selection ==# 'exclusive' ? ' ' : '') . '"' . v:register +nnoremap :TmuxNavigatePrevious +nnoremap :TmuxNavigateRight +nnoremap :TmuxNavigateUp +nnoremap :TmuxNavigateDown +nnoremap :TmuxNavigateLeft +inoremap  pumvisible() ? "\" : "\ " +let &cpo=s:cpo_save +unlet s:cpo_save +set autoindent +set backspace=indent,eol,start +set belloff=all +set completeopt=preview,menuone +set cpoptions=aAceFsB +set fileencodings=ucs-bom,utf-8,default,latin1 +set fillchars=vert:|,fold:-,vert:│ +set nofixendofline +set foldlevelstart=99 +set helplang=en +set hidden +set mouse=a +set pyxversion=3 +set ruler +set runtimepath=~/.vim,~/.vim/plugged/onehalf/vim,~/.vim/plugged/QFEnter,~/.vim/bundle/CamelCaseMotion,~/.vim/bundle/JustDo,~/.vim/bundle/YouCompleteMe,~/.vim/bundle/ctrlp.vim,~/.vim/bundle/dracula-vim,~/.vim/bundle/html5.vim,~/.vim/bundle/night_owl_light.vim,~/.vim/bundle/vim-TextTransform,~/.vim/bundle/vim-colors-solarized,~/.vim/bundle/vim-easymotion,~/.vim/bundle/vim-ingo-library,~/.vim/bundle/vim-javascript,~/.vim/bundle/vim-localrc,~/.vim/bundle/vim-repeat,~/.vim/bundle/vim-tmux-navigator,~/.vim/bundle/vim-visualrepeat,~/.vim/bundle/yats.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim82,/usr/share/vim/vimfiles/after,~/.vim/bundle/vim-javascript/after,~/.vim/bundle/html5.vim/after,~/.vim/bundle/dracula-vim/after,~/.vim/after +set sessionoptions=blank,buffers,folds,help,options,tabpages,winsize,terminal,sesdir +set shiftwidth=4 +set shortmess=filnxtToOSc +set softtabstop=4 +set suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc,.snap +set tabstop=4 +set termguicolors +let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0 +let v:this_session=expand(":p") +silent only +silent tabonly +exe "cd " . escape(expand(":p:h"), ' ') +if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' + let s:wipebuf = bufnr('%') +endif +set shortmess=aoO +argglobal +%argdel +edit ../fusion/prototype/client/js/Game/GameManager.js +set splitbelow splitright +set nosplitbelow +set nosplitright +wincmd t +set winminheight=0 +set winheight=1 +set winminwidth=0 +set winwidth=1 +argglobal +setlocal keymap= +setlocal noarabic +setlocal autoindent +setlocal backupcopy= +setlocal balloonexpr= +setlocal nobinary +setlocal nobreakindent +setlocal breakindentopt= +setlocal bufhidden= +setlocal buflisted +setlocal buftype= +setlocal nocindent +setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e +setlocal cinoptions= +setlocal cinwords=if,else,while,do,for,switch +setlocal colorcolumn= +setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//%s +setlocal complete=.,w,b,u,t,i +setlocal concealcursor= +setlocal conceallevel=0 +setlocal completefunc= +setlocal nocopyindent +setlocal cryptmethod= +setlocal nocursorbind +setlocal nocursorcolumn +set cursorline +setlocal cursorline +setlocal cursorlineopt=both +setlocal define=\\(^\\s*(*async\\s\\+function\\|(*function\\)\\|^\\s*\\(\\*\\|static\\|async\\|get\\|set\\|\\i\\+\\.\\)\\|^\\s*\\(\\ze\\i\\+\\)\\(([^)]*).*{$\\|\\s*[:=,]\\)\\|^\\s*\\(export\\s\\+\\|export\\s\\+default\\s\\+\\)*\\(var\\|let\\|const\\|function\\|class\\)\\|\\ +setlocal dictionary= +setlocal nodiff +setlocal equalprg= +setlocal errorformat= +setlocal noexpandtab +if &filetype != 'javascript' +setlocal filetype=javascript +endif +setlocal nofixendofline +setlocal foldcolumn=0 +setlocal foldenable +setlocal foldexpr=0 +setlocal foldignore=# +setlocal foldlevel=99 +setlocal foldmarker={{{,}}} +setlocal foldmethod=manual +setlocal foldminlines=1 +setlocal foldnestmax=20 +setlocal foldtext=foldtext() +setlocal formatexpr= +setlocal formatoptions=croql +setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* +setlocal formatprg= +setlocal grepprg= +setlocal iminsert=0 +setlocal imsearch=-1 +setlocal include= +setlocal includeexpr= +setlocal indentexpr=GetJavascriptIndent() +setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e,0],0) +setlocal noinfercase +setlocal iskeyword=@,48-57,_,192-255,$ +setlocal keywordprg= +setlocal nolinebreak +setlocal nolisp +setlocal lispwords= +setlocal nolist +setlocal makeencoding= +setlocal makeprg= +setlocal matchpairs=(:),{:},[:] +setlocal modeline +setlocal modifiable +setlocal nrformats=bin,octal,hex +set number +setlocal number +setlocal numberwidth=4 +setlocal omnifunc=javascriptcomplete#CompleteJS +setlocal path=.,, +setlocal nopreserveindent +setlocal nopreviewwindow +setlocal quoteescape=\\ +setlocal noreadonly +setlocal norelativenumber +setlocal norightleft +setlocal rightleftcmd=search +setlocal noscrollbind +setlocal scrolloff=-1 +setlocal shiftwidth=4 +setlocal noshortname +setlocal showbreak= +setlocal sidescrolloff=-1 +setlocal signcolumn=auto +setlocal nosmartindent +setlocal softtabstop=4 +setlocal nospell +setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ +setlocal spellfile= +setlocal spelllang=en +setlocal spelloptions= +setlocal statusline= +setlocal suffixesadd=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json +setlocal swapfile +setlocal synmaxcol=3000 +if &syntax != 'javascript' +setlocal syntax=javascript +endif +setlocal tabstop=4 +setlocal tagcase= +setlocal tagfunc= +setlocal tags= +setlocal termwinkey= +setlocal termwinscroll=10000 +setlocal termwinsize= +setlocal textwidth=0 +setlocal thesaurus= +setlocal noundofile +setlocal undolevels=-123456 +setlocal varsofttabstop= +setlocal vartabstop= +setlocal wincolor= +setlocal nowinfixheight +setlocal nowinfixwidth +setlocal wrap +setlocal wrapmargin=0 +silent! normal! zE +let s:l = 28 - ((12 * winheight(0) + 33) / 66) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +28 +normal! 0 +tabnext 1 +badd +36 index.js +badd +37 node_modules/.bin/winrun +badd +4 client/index.html +badd +75 index.html +badd +283 /mnt/c/Projects/fusion/prototype/client/index.html +badd +0 ../fusion/prototype/client/js/Game/GameManager.js +if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 + silent exe 'bwipe ' . s:wipebuf +endif +unlet! s:wipebuf +set winheight=1 winwidth=20 shortmess=filnxtToOSc +set winminheight=1 winminwidth=1 +let s:sx = expand(":p:r")."x.vim" +if filereadable(s:sx) + exe "source " . fnameescape(s:sx) +endif +let &so = s:so_save | let &siso = s:siso_save +doautoall SessionLoadPost +unlet SessionLoad +" vim: set ft=vim : diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/index.html b/index.html index 55a91f5..60e2379 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,84 @@ Lost My Nuts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
diff --git a/index.js b/index.js index 57fe4c9..469e75e 100644 --- a/index.js +++ b/index.js @@ -12,13 +12,6 @@ { this.win = win; win.showDevTools(); - const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address - - var gameContainer = document.getElementById("gameContainer"); - Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); - - var gameManager = new GameManager(); - gameManager.init("js/"); window.addEventListener('resize', this.resize.bind(this)); // start up express @@ -36,12 +29,21 @@ maxReceivedFrameSize : 1024000, }); - this.mode = new JoinMode(); - // start listening this.app.listen(HttpPort, () => console.log('HTTP server listening on port ' + HttpPort + '!')); this.httpServer.listen(WsPort, () => console.log('WebSocket Server started on port ' + WsPort + '!')); this.wsServer.on('request', this.connect.bind(this)); + + const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address + + var gameContainer = document.getElementById("gameContainer"); + Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); + + Game.Server = wsServer; + Game.Address = address; + + var gameManager = new GameManager(); + gameManager.init("shared/js/", HostGame); } connect(req) @@ -58,5 +60,4 @@ } let win = nw.Window.get(); -console.log(win); win.on("loaded", () => new LostMyNuts(win)); diff --git a/node_modules/.bin/winrun b/node_modules/.bin/winrun index e9fd763..96ea779 100644 --- a/node_modules/.bin/winrun +++ b/node_modules/.bin/winrun @@ -1,7 +1,5 @@ #! /usr/bin/env bash -echo "TEST" - command=$1 args=$(printf '"`"%s`"",' "${@:2}") ; args=${args%,} winrun_pid=$$ @@ -28,7 +26,6 @@ # Use tail to wait for the file to be populated while read -r line; do windows_pid=$(echo $line | tr -d '\r\n') - echo "Windows_pid: $windows_pid" break # we only need the first line done < <(tail -f $pidfile) rm $pidfile @@ -38,8 +35,7 @@ fi term() { - echo "KILLING $windows_pid" - taskkill.exe -f -pid $windows_pid + taskkill.exe -f -pid $windows_pid > /dev/null } trap term SIGTERM diff --git a/nodemon.json b/nodemon.json index 2e9869f..1305d81 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,4 +1,5 @@ { "signal":"SIGTERM", - "exec":"npm start" + "exec":"npm start", + "ext":"js,html" } diff --git a/session.vim b/session.vim new file mode 100644 index 0000000..f09aa60 --- /dev/null +++ b/session.vim @@ -0,0 +1,282 @@ +let SessionLoad = 1 +if &cp | set nocp | endif +let s:cpo_save=&cpo +set cpo&vim +imap +inoremap pumvisible() ? "\" : "\" +inoremap pumvisible() ? "\" : "\" +inoremap pumvisible() ? "\" : "\" +nnoremap  :TmuxNavigateLeft +nnoremap :TmuxNavigateDown +nnoremap  :TmuxNavigateUp +nnoremap  :TmuxNavigateRight +map  (ctrlp) +nnoremap  :TmuxNavigatePrevious +nnoremap \d :YcmShowDetailedDiagnostic +xmap \ge CamelCaseMotion_ge +xmap \e CamelCaseMotion_e +xmap \b CamelCaseMotion_b +xmap \w CamelCaseMotion_w +omap \ge CamelCaseMotion_ge +omap \e CamelCaseMotion_e +omap \b CamelCaseMotion_b +omap \w CamelCaseMotion_w +nmap \ge CamelCaseMotion_ge +nmap \e CamelCaseMotion_e +nmap \b CamelCaseMotion_b +nmap \w CamelCaseMotion_w +nmap \ucc TextTMakeUpperCamelCaseLine +xmap \uc TextTMakeUpperCamelCaseVisual +nmap \uc TextTMakeUpperCamelCaseOperator +nmap \scc TextTMakeSnakeCaseLine +xmap \sc TextTMakeSnakeCaseVisual +nmap \sc TextTMakeSnakeCaseOperator +nmap \ccc TextTMakeCamelCaseLine +xmap \cc TextTMakeCamelCaseVisual +nmap \cc TextTMakeCamelCaseOperator +vnoremap \c :call CopyMarkWithCursor("<", ">") +nnoremap \c :set opfunc=OpSysCopyMark g@ +vmap gx NetrwBrowseXVis +nmap gx NetrwBrowseX +xmap g. (visualrepeatForceBuiltInRepeat) +xmap i\ge CamelCaseMotion_ige +xmap i\e CamelCaseMotion_ie +xmap i\b CamelCaseMotion_ib +xmap i\w CamelCaseMotion_iw +omap i\ge CamelCaseMotion_ige +omap i\e CamelCaseMotion_ie +omap i\b CamelCaseMotion_ib +omap i\w CamelCaseMotion_iw +vnoremap NetrwBrowseXVis :call netrw#BrowseXVis() +nnoremap NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX())) +xnoremap 30_(CaptureVirtCol) visualrepeat#CaptureVirtCol() +map (ctrlp) +nnoremap (ctrlp) :CtrlPBuffile +vnoremap CamelCaseMotion_ige :call camelcasemotion#InnerMotion('ge',v:count1) +vnoremap CamelCaseMotion_ie :call camelcasemotion#InnerMotion('e',v:count1) +vnoremap CamelCaseMotion_ib :call camelcasemotion#InnerMotion('b',v:count1) +vnoremap CamelCaseMotion_iw :call camelcasemotion#InnerMotion('w',v:count1) +onoremap CamelCaseMotion_ige :call camelcasemotion#InnerMotion('ge',v:count1) +onoremap CamelCaseMotion_ie :call camelcasemotion#InnerMotion('e',v:count1) +onoremap CamelCaseMotion_ib :call camelcasemotion#InnerMotion('b',v:count1) +onoremap CamelCaseMotion_iw :call camelcasemotion#InnerMotion('w',v:count1) +vnoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'v') +vnoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'v') +vnoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'v') +vnoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'v') +onoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'o') +onoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'o') +onoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'o') +onoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'o') +nnoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'n') +nnoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'n') +nnoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'n') +nnoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'n') +nnoremap TextTMakeUpperCamelCaseOperator TextTransform#Arbitrary#Expression('MakeUpperCamelCase', 'TextRMakeUpperCamelCase') +nnoremap TextTMakeSnakeCaseOperator TextTransform#Arbitrary#Expression('MakeSnakeCase', 'TextRMakeSnakeCase') +vnoremap 19_TextTRecordPos TextTransform#Arbitrary#SetTriggerPos() +nnoremap TextTMakeCamelCaseOperator TextTransform#Arbitrary#Expression('MakeCamelCase', 'TextRMakeCamelCase') +nnoremap 19_Reselect '1v' . (visualmode() !=# 'V' && &selection ==# 'exclusive' ? ' ' : '') . '"' . v:register +nnoremap :TmuxNavigatePrevious +nnoremap :TmuxNavigateRight +nnoremap :TmuxNavigateUp +nnoremap :TmuxNavigateDown +nnoremap :TmuxNavigateLeft +inoremap  pumvisible() ? "\" : "\ " +let &cpo=s:cpo_save +unlet s:cpo_save +set autoindent +set backspace=indent,eol,start +set belloff=all +set completeopt=preview,menuone +set cpoptions=aAceFsB +set fileencodings=ucs-bom,utf-8,default,latin1 +set fillchars=vert:|,fold:-,vert:│ +set nofixendofline +set foldlevelstart=99 +set helplang=en +set hidden +set mouse=a +set pyxversion=3 +set ruler +set runtimepath=~/.vim,~/.vim/plugged/onehalf/vim,~/.vim/plugged/QFEnter,~/.vim/bundle/CamelCaseMotion,~/.vim/bundle/JustDo,~/.vim/bundle/YouCompleteMe,~/.vim/bundle/ctrlp.vim,~/.vim/bundle/dracula-vim,~/.vim/bundle/html5.vim,~/.vim/bundle/night_owl_light.vim,~/.vim/bundle/vim-TextTransform,~/.vim/bundle/vim-colors-solarized,~/.vim/bundle/vim-easymotion,~/.vim/bundle/vim-ingo-library,~/.vim/bundle/vim-javascript,~/.vim/bundle/vim-localrc,~/.vim/bundle/vim-repeat,~/.vim/bundle/vim-tmux-navigator,~/.vim/bundle/vim-visualrepeat,~/.vim/bundle/yats.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim82,/usr/share/vim/vimfiles/after,~/.vim/bundle/vim-javascript/after,~/.vim/bundle/html5.vim/after,~/.vim/bundle/dracula-vim/after,~/.vim/after +set sessionoptions=blank,buffers,folds,help,options,tabpages,winsize,terminal,sesdir +set shiftwidth=4 +set shortmess=filnxtToOSc +set softtabstop=4 +set suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc,.snap +set tabstop=4 +set termguicolors +let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0 +let v:this_session=expand(":p") +silent only +silent tabonly +exe "cd " . escape(expand(":p:h"), ' ') +if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' + let s:wipebuf = bufnr('%') +endif +set shortmess=aoO +argglobal +%argdel +edit ../fusion/prototype/client/js/Game/GameManager.js +set splitbelow splitright +set nosplitbelow +set nosplitright +wincmd t +set winminheight=0 +set winheight=1 +set winminwidth=0 +set winwidth=1 +argglobal +setlocal keymap= +setlocal noarabic +setlocal autoindent +setlocal backupcopy= +setlocal balloonexpr= +setlocal nobinary +setlocal nobreakindent +setlocal breakindentopt= +setlocal bufhidden= +setlocal buflisted +setlocal buftype= +setlocal nocindent +setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e +setlocal cinoptions= +setlocal cinwords=if,else,while,do,for,switch +setlocal colorcolumn= +setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//%s +setlocal complete=.,w,b,u,t,i +setlocal concealcursor= +setlocal conceallevel=0 +setlocal completefunc= +setlocal nocopyindent +setlocal cryptmethod= +setlocal nocursorbind +setlocal nocursorcolumn +set cursorline +setlocal cursorline +setlocal cursorlineopt=both +setlocal define=\\(^\\s*(*async\\s\\+function\\|(*function\\)\\|^\\s*\\(\\*\\|static\\|async\\|get\\|set\\|\\i\\+\\.\\)\\|^\\s*\\(\\ze\\i\\+\\)\\(([^)]*).*{$\\|\\s*[:=,]\\)\\|^\\s*\\(export\\s\\+\\|export\\s\\+default\\s\\+\\)*\\(var\\|let\\|const\\|function\\|class\\)\\|\\ +setlocal dictionary= +setlocal nodiff +setlocal equalprg= +setlocal errorformat= +setlocal noexpandtab +if &filetype != 'javascript' +setlocal filetype=javascript +endif +setlocal nofixendofline +setlocal foldcolumn=0 +setlocal foldenable +setlocal foldexpr=0 +setlocal foldignore=# +setlocal foldlevel=99 +setlocal foldmarker={{{,}}} +setlocal foldmethod=manual +setlocal foldminlines=1 +setlocal foldnestmax=20 +setlocal foldtext=foldtext() +setlocal formatexpr= +setlocal formatoptions=croql +setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* +setlocal formatprg= +setlocal grepprg= +setlocal iminsert=0 +setlocal imsearch=-1 +setlocal include= +setlocal includeexpr= +setlocal indentexpr=GetJavascriptIndent() +setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e,0],0) +setlocal noinfercase +setlocal iskeyword=@,48-57,_,192-255,$ +setlocal keywordprg= +setlocal nolinebreak +setlocal nolisp +setlocal lispwords= +setlocal nolist +setlocal makeencoding= +setlocal makeprg= +setlocal matchpairs=(:),{:},[:] +setlocal modeline +setlocal modifiable +setlocal nrformats=bin,octal,hex +set number +setlocal number +setlocal numberwidth=4 +setlocal omnifunc=javascriptcomplete#CompleteJS +setlocal path=.,, +setlocal nopreserveindent +setlocal nopreviewwindow +setlocal quoteescape=\\ +setlocal noreadonly +setlocal norelativenumber +setlocal norightleft +setlocal rightleftcmd=search +setlocal noscrollbind +setlocal scrolloff=-1 +setlocal shiftwidth=4 +setlocal noshortname +setlocal showbreak= +setlocal sidescrolloff=-1 +setlocal signcolumn=auto +setlocal nosmartindent +setlocal softtabstop=4 +setlocal nospell +setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ +setlocal spellfile= +setlocal spelllang=en +setlocal spelloptions= +setlocal statusline= +setlocal suffixesadd=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json +setlocal swapfile +setlocal synmaxcol=3000 +if &syntax != 'javascript' +setlocal syntax=javascript +endif +setlocal tabstop=4 +setlocal tagcase= +setlocal tagfunc= +setlocal tags= +setlocal termwinkey= +setlocal termwinscroll=10000 +setlocal termwinsize= +setlocal textwidth=0 +setlocal thesaurus= +setlocal noundofile +setlocal undolevels=-123456 +setlocal varsofttabstop= +setlocal vartabstop= +setlocal wincolor= +setlocal nowinfixheight +setlocal nowinfixwidth +setlocal wrap +setlocal wrapmargin=0 +silent! normal! zE +let s:l = 28 - ((12 * winheight(0) + 33) / 66) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +28 +normal! 0 +tabnext 1 +badd +36 index.js +badd +37 node_modules/.bin/winrun +badd +4 client/index.html +badd +75 index.html +badd +283 /mnt/c/Projects/fusion/prototype/client/index.html +badd +0 ../fusion/prototype/client/js/Game/GameManager.js +if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 + silent exe 'bwipe ' . s:wipebuf +endif +unlet! s:wipebuf +set winheight=1 winwidth=20 shortmess=filnxtToOSc +set winminheight=1 winminwidth=1 +let s:sx = expand(":p:r")."x.vim" +if filereadable(s:sx) + exe "source " . fnameescape(s:sx) +endif +let &so = s:so_save | let &siso = s:siso_save +doautoall SessionLoadPost +unlet SessionLoad +" vim: set ft=vim : diff --git a/shared/js/Engine/Display/DrawableEvents.js b/shared/js/Engine/Display/DrawableEvents.js index 878f9e1..78789e3 100644 --- a/shared/js/Engine/Display/DrawableEvents.js +++ b/shared/js/Engine/Display/DrawableEvents.js @@ -47,24 +47,6 @@ clicked(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.clickedInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.clickedInner(event); - } - } - clickedInner(event) - { var clickDistance = Math.sqrt((this.mouseDownPosition.x - event.data.global.x) * (this.mouseDownPosition.x - event.data.global.x) + (this.mouseDownPosition.y - event.data.global.y) * (this.mouseDownPosition.y - event.data.global.y)); if (clickDistance > this.clickThreshold) return; this.onClick.call(this.parentDrawable, event); @@ -72,71 +54,16 @@ mouseOver(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseOverInner(event); - } - catch (error) - { - - GameManager.reportException(error); - } - } - else - { - this.mouseOverInner(event); - } - } - mouseOverInner(event) - { this.onMouseOver.call(this.parentDrawable, event); } mouseOut(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseOutInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseOutInner(event); - } - } - mouseOutInner(event) - { this.onMouseOut.call(this.parentDrawable, event); } mouseDown(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseDownInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseDownInner(event); - } - } - mouseDownInner(event) - { this.mouseDownPosition.x = event.data.global.x; this.mouseDownPosition.y = event.data.global.y; this.onMouseDown.call(this.parentDrawable, event); @@ -144,24 +71,6 @@ mouseUp(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseUpInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseUpInner(event); - } - } - mouseUpInner(event) - { this.onMouseUp.call(this.parentDrawable, event); } diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/index.html b/index.html index 55a91f5..60e2379 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,84 @@ Lost My Nuts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
diff --git a/index.js b/index.js index 57fe4c9..469e75e 100644 --- a/index.js +++ b/index.js @@ -12,13 +12,6 @@ { this.win = win; win.showDevTools(); - const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address - - var gameContainer = document.getElementById("gameContainer"); - Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); - - var gameManager = new GameManager(); - gameManager.init("js/"); window.addEventListener('resize', this.resize.bind(this)); // start up express @@ -36,12 +29,21 @@ maxReceivedFrameSize : 1024000, }); - this.mode = new JoinMode(); - // start listening this.app.listen(HttpPort, () => console.log('HTTP server listening on port ' + HttpPort + '!')); this.httpServer.listen(WsPort, () => console.log('WebSocket Server started on port ' + WsPort + '!')); this.wsServer.on('request', this.connect.bind(this)); + + const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address + + var gameContainer = document.getElementById("gameContainer"); + Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); + + Game.Server = wsServer; + Game.Address = address; + + var gameManager = new GameManager(); + gameManager.init("shared/js/", HostGame); } connect(req) @@ -58,5 +60,4 @@ } let win = nw.Window.get(); -console.log(win); win.on("loaded", () => new LostMyNuts(win)); diff --git a/node_modules/.bin/winrun b/node_modules/.bin/winrun index e9fd763..96ea779 100644 --- a/node_modules/.bin/winrun +++ b/node_modules/.bin/winrun @@ -1,7 +1,5 @@ #! /usr/bin/env bash -echo "TEST" - command=$1 args=$(printf '"`"%s`"",' "${@:2}") ; args=${args%,} winrun_pid=$$ @@ -28,7 +26,6 @@ # Use tail to wait for the file to be populated while read -r line; do windows_pid=$(echo $line | tr -d '\r\n') - echo "Windows_pid: $windows_pid" break # we only need the first line done < <(tail -f $pidfile) rm $pidfile @@ -38,8 +35,7 @@ fi term() { - echo "KILLING $windows_pid" - taskkill.exe -f -pid $windows_pid + taskkill.exe -f -pid $windows_pid > /dev/null } trap term SIGTERM diff --git a/nodemon.json b/nodemon.json index 2e9869f..1305d81 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,4 +1,5 @@ { "signal":"SIGTERM", - "exec":"npm start" + "exec":"npm start", + "ext":"js,html" } diff --git a/session.vim b/session.vim new file mode 100644 index 0000000..f09aa60 --- /dev/null +++ b/session.vim @@ -0,0 +1,282 @@ +let SessionLoad = 1 +if &cp | set nocp | endif +let s:cpo_save=&cpo +set cpo&vim +imap +inoremap pumvisible() ? "\" : "\" +inoremap pumvisible() ? "\" : "\" +inoremap pumvisible() ? "\" : "\" +nnoremap  :TmuxNavigateLeft +nnoremap :TmuxNavigateDown +nnoremap  :TmuxNavigateUp +nnoremap  :TmuxNavigateRight +map  (ctrlp) +nnoremap  :TmuxNavigatePrevious +nnoremap \d :YcmShowDetailedDiagnostic +xmap \ge CamelCaseMotion_ge +xmap \e CamelCaseMotion_e +xmap \b CamelCaseMotion_b +xmap \w CamelCaseMotion_w +omap \ge CamelCaseMotion_ge +omap \e CamelCaseMotion_e +omap \b CamelCaseMotion_b +omap \w CamelCaseMotion_w +nmap \ge CamelCaseMotion_ge +nmap \e CamelCaseMotion_e +nmap \b CamelCaseMotion_b +nmap \w CamelCaseMotion_w +nmap \ucc TextTMakeUpperCamelCaseLine +xmap \uc TextTMakeUpperCamelCaseVisual +nmap \uc TextTMakeUpperCamelCaseOperator +nmap \scc TextTMakeSnakeCaseLine +xmap \sc TextTMakeSnakeCaseVisual +nmap \sc TextTMakeSnakeCaseOperator +nmap \ccc TextTMakeCamelCaseLine +xmap \cc TextTMakeCamelCaseVisual +nmap \cc TextTMakeCamelCaseOperator +vnoremap \c :call CopyMarkWithCursor("<", ">") +nnoremap \c :set opfunc=OpSysCopyMark g@ +vmap gx NetrwBrowseXVis +nmap gx NetrwBrowseX +xmap g. (visualrepeatForceBuiltInRepeat) +xmap i\ge CamelCaseMotion_ige +xmap i\e CamelCaseMotion_ie +xmap i\b CamelCaseMotion_ib +xmap i\w CamelCaseMotion_iw +omap i\ge CamelCaseMotion_ige +omap i\e CamelCaseMotion_ie +omap i\b CamelCaseMotion_ib +omap i\w CamelCaseMotion_iw +vnoremap NetrwBrowseXVis :call netrw#BrowseXVis() +nnoremap NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX())) +xnoremap 30_(CaptureVirtCol) visualrepeat#CaptureVirtCol() +map (ctrlp) +nnoremap (ctrlp) :CtrlPBuffile +vnoremap CamelCaseMotion_ige :call camelcasemotion#InnerMotion('ge',v:count1) +vnoremap CamelCaseMotion_ie :call camelcasemotion#InnerMotion('e',v:count1) +vnoremap CamelCaseMotion_ib :call camelcasemotion#InnerMotion('b',v:count1) +vnoremap CamelCaseMotion_iw :call camelcasemotion#InnerMotion('w',v:count1) +onoremap CamelCaseMotion_ige :call camelcasemotion#InnerMotion('ge',v:count1) +onoremap CamelCaseMotion_ie :call camelcasemotion#InnerMotion('e',v:count1) +onoremap CamelCaseMotion_ib :call camelcasemotion#InnerMotion('b',v:count1) +onoremap CamelCaseMotion_iw :call camelcasemotion#InnerMotion('w',v:count1) +vnoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'v') +vnoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'v') +vnoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'v') +vnoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'v') +onoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'o') +onoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'o') +onoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'o') +onoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'o') +nnoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'n') +nnoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'n') +nnoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'n') +nnoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'n') +nnoremap TextTMakeUpperCamelCaseOperator TextTransform#Arbitrary#Expression('MakeUpperCamelCase', 'TextRMakeUpperCamelCase') +nnoremap TextTMakeSnakeCaseOperator TextTransform#Arbitrary#Expression('MakeSnakeCase', 'TextRMakeSnakeCase') +vnoremap 19_TextTRecordPos TextTransform#Arbitrary#SetTriggerPos() +nnoremap TextTMakeCamelCaseOperator TextTransform#Arbitrary#Expression('MakeCamelCase', 'TextRMakeCamelCase') +nnoremap 19_Reselect '1v' . (visualmode() !=# 'V' && &selection ==# 'exclusive' ? ' ' : '') . '"' . v:register +nnoremap :TmuxNavigatePrevious +nnoremap :TmuxNavigateRight +nnoremap :TmuxNavigateUp +nnoremap :TmuxNavigateDown +nnoremap :TmuxNavigateLeft +inoremap  pumvisible() ? "\" : "\ " +let &cpo=s:cpo_save +unlet s:cpo_save +set autoindent +set backspace=indent,eol,start +set belloff=all +set completeopt=preview,menuone +set cpoptions=aAceFsB +set fileencodings=ucs-bom,utf-8,default,latin1 +set fillchars=vert:|,fold:-,vert:│ +set nofixendofline +set foldlevelstart=99 +set helplang=en +set hidden +set mouse=a +set pyxversion=3 +set ruler +set runtimepath=~/.vim,~/.vim/plugged/onehalf/vim,~/.vim/plugged/QFEnter,~/.vim/bundle/CamelCaseMotion,~/.vim/bundle/JustDo,~/.vim/bundle/YouCompleteMe,~/.vim/bundle/ctrlp.vim,~/.vim/bundle/dracula-vim,~/.vim/bundle/html5.vim,~/.vim/bundle/night_owl_light.vim,~/.vim/bundle/vim-TextTransform,~/.vim/bundle/vim-colors-solarized,~/.vim/bundle/vim-easymotion,~/.vim/bundle/vim-ingo-library,~/.vim/bundle/vim-javascript,~/.vim/bundle/vim-localrc,~/.vim/bundle/vim-repeat,~/.vim/bundle/vim-tmux-navigator,~/.vim/bundle/vim-visualrepeat,~/.vim/bundle/yats.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim82,/usr/share/vim/vimfiles/after,~/.vim/bundle/vim-javascript/after,~/.vim/bundle/html5.vim/after,~/.vim/bundle/dracula-vim/after,~/.vim/after +set sessionoptions=blank,buffers,folds,help,options,tabpages,winsize,terminal,sesdir +set shiftwidth=4 +set shortmess=filnxtToOSc +set softtabstop=4 +set suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc,.snap +set tabstop=4 +set termguicolors +let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0 +let v:this_session=expand(":p") +silent only +silent tabonly +exe "cd " . escape(expand(":p:h"), ' ') +if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' + let s:wipebuf = bufnr('%') +endif +set shortmess=aoO +argglobal +%argdel +edit ../fusion/prototype/client/js/Game/GameManager.js +set splitbelow splitright +set nosplitbelow +set nosplitright +wincmd t +set winminheight=0 +set winheight=1 +set winminwidth=0 +set winwidth=1 +argglobal +setlocal keymap= +setlocal noarabic +setlocal autoindent +setlocal backupcopy= +setlocal balloonexpr= +setlocal nobinary +setlocal nobreakindent +setlocal breakindentopt= +setlocal bufhidden= +setlocal buflisted +setlocal buftype= +setlocal nocindent +setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e +setlocal cinoptions= +setlocal cinwords=if,else,while,do,for,switch +setlocal colorcolumn= +setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//%s +setlocal complete=.,w,b,u,t,i +setlocal concealcursor= +setlocal conceallevel=0 +setlocal completefunc= +setlocal nocopyindent +setlocal cryptmethod= +setlocal nocursorbind +setlocal nocursorcolumn +set cursorline +setlocal cursorline +setlocal cursorlineopt=both +setlocal define=\\(^\\s*(*async\\s\\+function\\|(*function\\)\\|^\\s*\\(\\*\\|static\\|async\\|get\\|set\\|\\i\\+\\.\\)\\|^\\s*\\(\\ze\\i\\+\\)\\(([^)]*).*{$\\|\\s*[:=,]\\)\\|^\\s*\\(export\\s\\+\\|export\\s\\+default\\s\\+\\)*\\(var\\|let\\|const\\|function\\|class\\)\\|\\ +setlocal dictionary= +setlocal nodiff +setlocal equalprg= +setlocal errorformat= +setlocal noexpandtab +if &filetype != 'javascript' +setlocal filetype=javascript +endif +setlocal nofixendofline +setlocal foldcolumn=0 +setlocal foldenable +setlocal foldexpr=0 +setlocal foldignore=# +setlocal foldlevel=99 +setlocal foldmarker={{{,}}} +setlocal foldmethod=manual +setlocal foldminlines=1 +setlocal foldnestmax=20 +setlocal foldtext=foldtext() +setlocal formatexpr= +setlocal formatoptions=croql +setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* +setlocal formatprg= +setlocal grepprg= +setlocal iminsert=0 +setlocal imsearch=-1 +setlocal include= +setlocal includeexpr= +setlocal indentexpr=GetJavascriptIndent() +setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e,0],0) +setlocal noinfercase +setlocal iskeyword=@,48-57,_,192-255,$ +setlocal keywordprg= +setlocal nolinebreak +setlocal nolisp +setlocal lispwords= +setlocal nolist +setlocal makeencoding= +setlocal makeprg= +setlocal matchpairs=(:),{:},[:] +setlocal modeline +setlocal modifiable +setlocal nrformats=bin,octal,hex +set number +setlocal number +setlocal numberwidth=4 +setlocal omnifunc=javascriptcomplete#CompleteJS +setlocal path=.,, +setlocal nopreserveindent +setlocal nopreviewwindow +setlocal quoteescape=\\ +setlocal noreadonly +setlocal norelativenumber +setlocal norightleft +setlocal rightleftcmd=search +setlocal noscrollbind +setlocal scrolloff=-1 +setlocal shiftwidth=4 +setlocal noshortname +setlocal showbreak= +setlocal sidescrolloff=-1 +setlocal signcolumn=auto +setlocal nosmartindent +setlocal softtabstop=4 +setlocal nospell +setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ +setlocal spellfile= +setlocal spelllang=en +setlocal spelloptions= +setlocal statusline= +setlocal suffixesadd=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json +setlocal swapfile +setlocal synmaxcol=3000 +if &syntax != 'javascript' +setlocal syntax=javascript +endif +setlocal tabstop=4 +setlocal tagcase= +setlocal tagfunc= +setlocal tags= +setlocal termwinkey= +setlocal termwinscroll=10000 +setlocal termwinsize= +setlocal textwidth=0 +setlocal thesaurus= +setlocal noundofile +setlocal undolevels=-123456 +setlocal varsofttabstop= +setlocal vartabstop= +setlocal wincolor= +setlocal nowinfixheight +setlocal nowinfixwidth +setlocal wrap +setlocal wrapmargin=0 +silent! normal! zE +let s:l = 28 - ((12 * winheight(0) + 33) / 66) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +28 +normal! 0 +tabnext 1 +badd +36 index.js +badd +37 node_modules/.bin/winrun +badd +4 client/index.html +badd +75 index.html +badd +283 /mnt/c/Projects/fusion/prototype/client/index.html +badd +0 ../fusion/prototype/client/js/Game/GameManager.js +if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 + silent exe 'bwipe ' . s:wipebuf +endif +unlet! s:wipebuf +set winheight=1 winwidth=20 shortmess=filnxtToOSc +set winminheight=1 winminwidth=1 +let s:sx = expand(":p:r")."x.vim" +if filereadable(s:sx) + exe "source " . fnameescape(s:sx) +endif +let &so = s:so_save | let &siso = s:siso_save +doautoall SessionLoadPost +unlet SessionLoad +" vim: set ft=vim : diff --git a/shared/js/Engine/Display/DrawableEvents.js b/shared/js/Engine/Display/DrawableEvents.js index 878f9e1..78789e3 100644 --- a/shared/js/Engine/Display/DrawableEvents.js +++ b/shared/js/Engine/Display/DrawableEvents.js @@ -47,24 +47,6 @@ clicked(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.clickedInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.clickedInner(event); - } - } - clickedInner(event) - { var clickDistance = Math.sqrt((this.mouseDownPosition.x - event.data.global.x) * (this.mouseDownPosition.x - event.data.global.x) + (this.mouseDownPosition.y - event.data.global.y) * (this.mouseDownPosition.y - event.data.global.y)); if (clickDistance > this.clickThreshold) return; this.onClick.call(this.parentDrawable, event); @@ -72,71 +54,16 @@ mouseOver(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseOverInner(event); - } - catch (error) - { - - GameManager.reportException(error); - } - } - else - { - this.mouseOverInner(event); - } - } - mouseOverInner(event) - { this.onMouseOver.call(this.parentDrawable, event); } mouseOut(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseOutInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseOutInner(event); - } - } - mouseOutInner(event) - { this.onMouseOut.call(this.parentDrawable, event); } mouseDown(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseDownInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseDownInner(event); - } - } - mouseDownInner(event) - { this.mouseDownPosition.x = event.data.global.x; this.mouseDownPosition.y = event.data.global.y; this.onMouseDown.call(this.parentDrawable, event); @@ -144,24 +71,6 @@ mouseUp(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseUpInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseUpInner(event); - } - } - mouseUpInner(event) - { this.onMouseUp.call(this.parentDrawable, event); } diff --git a/shared/js/Engine/Libs/pixi-filters.js.map b/shared/js/Engine/Libs/pixi-filters.js.map new file mode 100644 index 0000000..4b269da --- /dev/null +++ b/shared/js/Engine/Libs/pixi-filters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pixi-filters.js","sources":["../../filters/adjustment/lib/filter-adjustment.esm.js","../../filters/kawase-blur/lib/filter-kawase-blur.esm.js","../../filters/advanced-bloom/lib/filter-advanced-bloom.esm.js","../../filters/ascii/lib/filter-ascii.esm.js","../../filters/bevel/lib/filter-bevel.esm.js","../../filters/bloom/lib/filter-bloom.esm.js","../../filters/bulge-pinch/lib/filter-bulge-pinch.esm.js","../../filters/color-map/lib/filter-color-map.esm.js","../../filters/color-replace/lib/filter-color-replace.esm.js","../../filters/convolution/lib/filter-convolution.esm.js","../../filters/cross-hatch/lib/filter-cross-hatch.esm.js","../../filters/crt/lib/filter-crt.esm.js","../../filters/dot/lib/filter-dot.esm.js","../../filters/drop-shadow/lib/filter-drop-shadow.esm.js","../../filters/emboss/lib/filter-emboss.esm.js","../../filters/glitch/lib/filter-glitch.esm.js","../../filters/glow/lib/filter-glow.esm.js","../../filters/godray/lib/filter-godray.esm.js","../../filters/motion-blur/lib/filter-motion-blur.esm.js","../../filters/multi-color-replace/lib/filter-multi-color-replace.esm.js","../../filters/old-film/lib/filter-old-film.esm.js","../../filters/outline/lib/filter-outline.esm.js","../../filters/pixelate/lib/filter-pixelate.esm.js","../../filters/radial-blur/lib/filter-radial-blur.esm.js","../../filters/reflection/lib/filter-reflection.esm.js","../../filters/rgb-split/lib/filter-rgb-split.esm.js","../../filters/shockwave/lib/filter-shockwave.esm.js","../../filters/simple-lightmap/lib/filter-simple-lightmap.esm.js","../../filters/tilt-shift/lib/filter-tilt-shift.esm.js","../../filters/twist/lib/filter-twist.esm.js","../../filters/zoom-blur/lib/filter-zoom-blur.esm.js"],"sourcesContent":["/*!\n * @pixi/filter-adjustment - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-adjustment is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform float gamma;\\nuniform float contrast;\\nuniform float saturation;\\nuniform float brightness;\\nuniform float red;\\nuniform float green;\\nuniform float blue;\\nuniform float alpha;\\n\\nvoid main(void)\\n{\\n vec4 c = texture2D(uSampler, vTextureCoord);\\n\\n if (c.a > 0.0) {\\n c.rgb /= c.a;\\n\\n vec3 rgb = pow(c.rgb, vec3(1. / gamma));\\n rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, saturation), contrast);\\n rgb.r *= red;\\n rgb.g *= green;\\n rgb.b *= blue;\\n c.rgb = rgb * brightness;\\n\\n c.rgb *= c.a;\\n }\\n\\n gl_FragColor = c * alpha;\\n}\\n\";\n\n/**\n * The ability to adjust gamma, contrast, saturation, brightness, alpha or color-channel shift. This is a faster\n * and much simpler to use than {@link http://pixijs.download/release/docs/PIXI.filters.ColorMatrixFilter.html ColorMatrixFilter}\n * because it does not use a matrix.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/adjustment.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-adjustment|@pixi/filter-adjustment}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object|number} [options] - The optional parameters of the filter.\n * @param {number} [options.gamma=1] - The amount of luminance\n * @param {number} [options.saturation=1] - The amount of color saturation\n * @param {number} [options.contrast=1] - The amount of contrast\n * @param {number} [options.brightness=1] - The overall brightness\n * @param {number} [options.red=1] - The multipled red channel\n * @param {number} [options.green=1] - The multipled green channel\n * @param {number} [options.blue=1] - The multipled blue channel\n * @param {number} [options.alpha=1] - The overall alpha amount\n */\nvar AdjustmentFilter = /*@__PURE__*/(function (Filter) {\n function AdjustmentFilter(options) {\n Filter.call(this, vertex, fragment);\n\n Object.assign(this, {\n /**\n * The amount of luminance\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n gamma: 1,\n\n /**\n * The amount of saturation\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n saturation: 1,\n\n /**\n * The amount of contrast\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n contrast: 1,\n\n /**\n * The amount of brightness\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n brightness: 1,\n\n /**\n * The amount of red channel\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n red: 1,\n\n /**\n * The amount of green channel\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n green: 1,\n\n /**\n * The amount of blue channel\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n blue: 1,\n\n /**\n * The amount of alpha channel\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n alpha: 1,\n }, options);\n }\n\n if ( Filter ) AdjustmentFilter.__proto__ = Filter;\n AdjustmentFilter.prototype = Object.create( Filter && Filter.prototype );\n AdjustmentFilter.prototype.constructor = AdjustmentFilter;\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n AdjustmentFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.gamma = Math.max(this.gamma, 0.0001);\n this.uniforms.saturation = this.saturation;\n this.uniforms.contrast = this.contrast;\n this.uniforms.brightness = this.brightness;\n this.uniforms.red = this.red;\n this.uniforms.green = this.green;\n this.uniforms.blue = this.blue;\n this.uniforms.alpha = this.alpha;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n return AdjustmentFilter;\n}(Filter));\n\nexport { AdjustmentFilter };\n//# sourceMappingURL=filter-adjustment.esm.js.map\n","/*!\n * @pixi/filter-kawase-blur - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-kawase-blur is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { Point } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"\\nvarying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec2 uOffset;\\n\\nvoid main(void)\\n{\\n vec4 color = vec4(0.0);\\n\\n // Sample top left pixel\\n color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y));\\n\\n // Sample top right pixel\\n color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y));\\n\\n // Sample bottom right pixel\\n color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y));\\n\\n // Sample bottom left pixel\\n color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y));\\n\\n // Average\\n color *= 0.25;\\n\\n gl_FragColor = color;\\n}\";\n\nvar fragmentClamp = \"\\nvarying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec2 uOffset;\\nuniform vec4 filterClamp;\\n\\nvoid main(void)\\n{\\n vec4 color = vec4(0.0);\\n\\n // Sample top left pixel\\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\\n\\n // Sample top right pixel\\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\\n\\n // Sample bottom right pixel\\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\\n\\n // Sample bottom left pixel\\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\\n\\n // Average\\n color *= 0.25;\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * A much faster blur than Gaussian blur, but more complicated to use.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/kawase-blur.png)\n *\n * @see https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-kawase-blur|@pixi/filter-kawase-blur}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number|number[]} [blur=4] - The blur of the filter. Should be greater than `0`. If\n * value is an Array, setting kernels.\n * @param {number} [quality=3] - The quality of the filter. Should be an integer greater than `1`.\n * @param {boolean} [clamp=false] - Clamp edges, useful for removing dark edges\n * from fullscreen filters or bleeding to the edge of filterArea.\n */\nvar KawaseBlurFilter = /*@__PURE__*/(function (Filter) {\n function KawaseBlurFilter(blur, quality, clamp) {\n if ( blur === void 0 ) blur = 4;\n if ( quality === void 0 ) quality = 3;\n if ( clamp === void 0 ) clamp = false;\n\n Filter.call(this, vertex, clamp ? fragmentClamp : fragment);\n this.uniforms.uOffset = new Float32Array(2);\n\n this._pixelSize = new Point();\n this.pixelSize = 1;\n this._clamp = clamp;\n this._kernels = null;\n\n // if `blur` is array , as kernels\n if (Array.isArray(blur)) {\n this.kernels = blur;\n }\n else {\n this._blur = blur;\n this.quality = quality;\n }\n }\n\n if ( Filter ) KawaseBlurFilter.__proto__ = Filter;\n KawaseBlurFilter.prototype = Object.create( Filter && Filter.prototype );\n KawaseBlurFilter.prototype.constructor = KawaseBlurFilter;\n\n var prototypeAccessors = { kernels: { configurable: true },clamp: { configurable: true },pixelSize: { configurable: true },quality: { configurable: true },blur: { configurable: true } };\n\n /**\n * Overrides apply\n * @private\n */\n KawaseBlurFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n var uvX = this.pixelSize.x / input._frame.width;\n var uvY = this.pixelSize.y / input._frame.height;\n var offset;\n\n if (this._quality === 1 || this._blur === 0) {\n offset = this._kernels[0] + 0.5;\n this.uniforms.uOffset[0] = offset * uvX;\n this.uniforms.uOffset[1] = offset * uvY;\n filterManager.applyFilter(this, input, output, clear);\n }\n else {\n var renderTarget = filterManager.getFilterTexture();\n\n var source = input;\n var target = renderTarget;\n var tmp;\n\n var last = this._quality - 1;\n\n for (var i = 0; i < last; i++) {\n offset = this._kernels[i] + 0.5;\n this.uniforms.uOffset[0] = offset * uvX;\n this.uniforms.uOffset[1] = offset * uvY;\n filterManager.applyFilter(this, source, target, true);\n\n tmp = source;\n source = target;\n target = tmp;\n }\n offset = this._kernels[last] + 0.5;\n this.uniforms.uOffset[0] = offset * uvX;\n this.uniforms.uOffset[1] = offset * uvY;\n filterManager.applyFilter(this, source, output, clear);\n\n filterManager.returnFilterTexture(renderTarget);\n }\n };\n\n /**\n * Auto generate kernels by blur & quality\n * @private\n */\n KawaseBlurFilter.prototype._generateKernels = function _generateKernels () {\n var blur = this._blur;\n var quality = this._quality;\n var kernels = [ blur ];\n\n if (blur > 0) {\n var k = blur;\n var step = blur / quality;\n\n for (var i = 1; i < quality; i++) {\n k -= step;\n kernels.push(k);\n }\n }\n\n this._kernels = kernels;\n };\n\n /**\n * The kernel size of the blur filter, for advanced usage.\n *\n * @member {number[]}\n * @default [0]\n */\n prototypeAccessors.kernels.get = function () {\n return this._kernels;\n };\n prototypeAccessors.kernels.set = function (value) {\n if (Array.isArray(value) && value.length > 0) {\n this._kernels = value;\n this._quality = value.length;\n this._blur = Math.max.apply(Math, value);\n }\n else {\n // if value is invalid , set default value\n this._kernels = [0];\n this._quality = 1;\n }\n };\n\n /**\n * Get the if the filter is clampped.\n *\n * @readonly\n * @member {boolean}\n * @default false\n */\n prototypeAccessors.clamp.get = function () {\n return this._clamp;\n };\n\n /**\n * Sets the pixel size of the filter. Large size is blurrier. For advanced usage.\n *\n * @member {PIXI.Point|number[]}\n * @default [1, 1]\n */\n prototypeAccessors.pixelSize.set = function (value) {\n if (typeof value === 'number') {\n this._pixelSize.x = value;\n this._pixelSize.y = value;\n }\n else if (Array.isArray(value)) {\n this._pixelSize.x = value[0];\n this._pixelSize.y = value[1];\n }\n else if (value instanceof Point) {\n this._pixelSize.x = value.x;\n this._pixelSize.y = value.y;\n }\n else {\n // if value is invalid , set default value\n this._pixelSize.x = 1;\n this._pixelSize.y = 1;\n }\n };\n prototypeAccessors.pixelSize.get = function () {\n return this._pixelSize;\n };\n\n /**\n * The quality of the filter, integer greater than `1`.\n *\n * @member {number}\n * @default 3\n */\n prototypeAccessors.quality.get = function () {\n return this._quality;\n };\n prototypeAccessors.quality.set = function (value) {\n this._quality = Math.max(1, Math.round(value));\n this._generateKernels();\n };\n\n /**\n * The amount of blur, value greater than `0`.\n *\n * @member {number}\n * @default 4\n */\n prototypeAccessors.blur.get = function () {\n return this._blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this._blur = value;\n this._generateKernels();\n };\n\n Object.defineProperties( KawaseBlurFilter.prototype, prototypeAccessors );\n\n return KawaseBlurFilter;\n}(Filter));\n\nexport { KawaseBlurFilter };\n//# sourceMappingURL=filter-kawase-blur.esm.js.map\n","/*!\n * @pixi/filter-advanced-bloom - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-advanced-bloom is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { KawaseBlurFilter } from '@pixi/filter-kawase-blur';\nimport { settings } from '@pixi/settings';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"\\nuniform sampler2D uSampler;\\nvarying vec2 vTextureCoord;\\n\\nuniform float threshold;\\n\\nvoid main() {\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n\\n // A simple & fast algorithm for getting brightness.\\n // It's inaccuracy , but good enought for this feature.\\n float _max = max(max(color.r, color.g), color.b);\\n float _min = min(min(color.r, color.g), color.b);\\n float brightness = (_max + _min) * 0.5;\\n\\n if(brightness > threshold) {\\n gl_FragColor = color;\\n } else {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\\n }\\n}\\n\";\n\n/**\n * Internal filter for AdvancedBloomFilter to get brightness.\n * @class\n * @private\n * @param {number} [threshold=0.5] Defines how bright a color needs to be extracted.\n */\nvar ExtractBrightnessFilter = /*@__PURE__*/(function (Filter) {\n function ExtractBrightnessFilter(threshold) {\n if ( threshold === void 0 ) threshold = 0.5;\n\n Filter.call(this, vertex, fragment);\n\n this.threshold = threshold;\n }\n\n if ( Filter ) ExtractBrightnessFilter.__proto__ = Filter;\n ExtractBrightnessFilter.prototype = Object.create( Filter && Filter.prototype );\n ExtractBrightnessFilter.prototype.constructor = ExtractBrightnessFilter;\n\n var prototypeAccessors = { threshold: { configurable: true } };\n\n /**\n * Defines how bright a color needs to be extracted.\n *\n * @member {number}\n * @default 0.5\n */\n prototypeAccessors.threshold.get = function () {\n return this.uniforms.threshold;\n };\n prototypeAccessors.threshold.set = function (value) {\n this.uniforms.threshold = value;\n };\n\n Object.defineProperties( ExtractBrightnessFilter.prototype, prototypeAccessors );\n\n return ExtractBrightnessFilter;\n}(Filter));\n\nvar fragment$1 = \"uniform sampler2D uSampler;\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D bloomTexture;\\nuniform float bloomScale;\\nuniform float brightness;\\n\\nvoid main() {\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n color.rgb *= brightness;\\n vec4 bloomColor = vec4(texture2D(bloomTexture, vTextureCoord).rgb, 0.0);\\n bloomColor.rgb *= bloomScale;\\n gl_FragColor = color + bloomColor;\\n}\\n\";\n\n/**\n * The AdvancedBloomFilter applies a Bloom Effect to an object. Unlike the normal BloomFilter\n * this had some advanced controls for adjusting the look of the bloom. Note: this filter\n * is slower than normal BloomFilter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/advanced-bloom.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-advanced-bloom|@pixi/filter-advanced-bloom}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object|number} [options] - The optional parameters of advanced bloom filter.\n * When options is a number , it will be `options.threshold`.\n * @param {number} [options.threshold=0.5] - Defines how bright a color needs to be to affect bloom.\n * @param {number} [options.bloomScale=1.0] - To adjust the strength of the bloom. Higher values is more intense brightness.\n * @param {number} [options.brightness=1.0] - The brightness, lower value is more subtle brightness, higher value is blown-out.\n * @param {number} [options.blur=8] - Sets the strength of the Blur properties simultaneously\n * @param {number} [options.quality=4] - The quality of the Blur filter.\n * @param {number[]} [options.kernels=null] - The kernels of the Blur filter.\n * @param {number|number[]|PIXI.Point} [options.pixelSize=1] - the pixelSize of the Blur filter.\n * @param {number} [options.resolution=PIXI.settings.RESOLUTION] - The resolution of the Blur filter.\n */\nvar AdvancedBloomFilter = /*@__PURE__*/(function (Filter) {\n function AdvancedBloomFilter(options) {\n\n Filter.call(this, vertex, fragment$1);\n\n if (typeof options === 'number') {\n options = { threshold: options };\n }\n\n options = Object.assign({\n threshold: 0.5,\n bloomScale: 1.0,\n brightness: 1.0,\n kernels: null,\n blur: 8,\n quality: 4,\n pixelSize: 1,\n resolution: settings.RESOLUTION,\n }, options);\n\n /**\n * To adjust the strength of the bloom. Higher values is more intense brightness.\n *\n * @member {number}\n * @default 1.0\n */\n this.bloomScale = options.bloomScale;\n\n /**\n * The brightness, lower value is more subtle brightness, higher value is blown-out.\n *\n * @member {number}\n * @default 1.0\n */\n this.brightness = options.brightness;\n\n var kernels = options.kernels;\n var blur = options.blur;\n var quality = options.quality;\n var pixelSize = options.pixelSize;\n var resolution = options.resolution;\n\n this._extractFilter = new ExtractBrightnessFilter(options.threshold);\n this._extractFilter.resolution = resolution;\n this._blurFilter = kernels ?\n new KawaseBlurFilter(kernels) :\n new KawaseBlurFilter(blur, quality);\n this.pixelSize = pixelSize;\n this.resolution = resolution;\n }\n\n if ( Filter ) AdvancedBloomFilter.__proto__ = Filter;\n AdvancedBloomFilter.prototype = Object.create( Filter && Filter.prototype );\n AdvancedBloomFilter.prototype.constructor = AdvancedBloomFilter;\n\n var prototypeAccessors = { resolution: { configurable: true },threshold: { configurable: true },kernels: { configurable: true },blur: { configurable: true },quality: { configurable: true },pixelSize: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n AdvancedBloomFilter.prototype.apply = function apply (filterManager, input, output, clear, currentState) {\n\n var brightTarget = filterManager.getFilterTexture();\n\n this._extractFilter.apply(filterManager, input, brightTarget, true, currentState);\n\n var bloomTarget = filterManager.getFilterTexture();\n\n this._blurFilter.apply(filterManager, brightTarget, bloomTarget, true, currentState);\n\n this.uniforms.bloomScale = this.bloomScale;\n this.uniforms.brightness = this.brightness;\n this.uniforms.bloomTexture = bloomTarget;\n\n filterManager.applyFilter(this, input, output, clear);\n\n filterManager.returnFilterTexture(bloomTarget);\n filterManager.returnFilterTexture(brightTarget);\n };\n\n /**\n * The resolution of the filter.\n *\n * @member {number}\n */\n prototypeAccessors.resolution.get = function () {\n return this._resolution;\n };\n prototypeAccessors.resolution.set = function (value) {\n this._resolution = value;\n\n if (this._extractFilter) {\n this._extractFilter.resolution = value;\n }\n if (this._blurFilter) {\n this._blurFilter.resolution = value;\n }\n };\n\n /**\n * Defines how bright a color needs to be to affect bloom.\n *\n * @member {number}\n * @default 0.5\n */\n prototypeAccessors.threshold.get = function () {\n return this._extractFilter.threshold;\n };\n prototypeAccessors.threshold.set = function (value) {\n this._extractFilter.threshold = value;\n };\n\n /**\n * Sets the kernels of the Blur Filter\n *\n * @member {number}\n * @default 4\n */\n prototypeAccessors.kernels.get = function () {\n return this._blurFilter.kernels;\n };\n prototypeAccessors.kernels.set = function (value) {\n this._blurFilter.kernels = value;\n };\n\n /**\n * Sets the strength of the Blur properties simultaneously\n *\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blur.get = function () {\n return this._blurFilter.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this._blurFilter.blur = value;\n };\n\n /**\n * Sets the quality of the Blur Filter\n *\n * @member {number}\n * @default 4\n */\n prototypeAccessors.quality.get = function () {\n return this._blurFilter.quality;\n };\n prototypeAccessors.quality.set = function (value) {\n this._blurFilter.quality = value;\n };\n\n /**\n * Sets the pixelSize of the Kawase Blur filter\n *\n * @member {number|number[]|PIXI.Point}\n * @default 1\n */\n prototypeAccessors.pixelSize.get = function () {\n return this._blurFilter.pixelSize;\n };\n prototypeAccessors.pixelSize.set = function (value) {\n this._blurFilter.pixelSize = value;\n };\n\n Object.defineProperties( AdvancedBloomFilter.prototype, prototypeAccessors );\n\n return AdvancedBloomFilter;\n}(Filter));\n\nexport { AdvancedBloomFilter };\n//# sourceMappingURL=filter-advanced-bloom.esm.js.map\n","/*!\n * @pixi/filter-ascii - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-ascii is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\n\\nuniform vec4 filterArea;\\nuniform float pixelSize;\\nuniform sampler2D uSampler;\\n\\nvec2 mapCoord( vec2 coord )\\n{\\n coord *= filterArea.xy;\\n coord += filterArea.zw;\\n\\n return coord;\\n}\\n\\nvec2 unmapCoord( vec2 coord )\\n{\\n coord -= filterArea.zw;\\n coord /= filterArea.xy;\\n\\n return coord;\\n}\\n\\nvec2 pixelate(vec2 coord, vec2 size)\\n{\\n return floor( coord / size ) * size;\\n}\\n\\nvec2 getMod(vec2 coord, vec2 size)\\n{\\n return mod( coord , size) / size;\\n}\\n\\nfloat character(float n, vec2 p)\\n{\\n p = floor(p*vec2(4.0, -4.0) + 2.5);\\n\\n if (clamp(p.x, 0.0, 4.0) == p.x)\\n {\\n if (clamp(p.y, 0.0, 4.0) == p.y)\\n {\\n if (int(mod(n/exp2(p.x + 5.0*p.y), 2.0)) == 1) return 1.0;\\n }\\n }\\n return 0.0;\\n}\\n\\nvoid main()\\n{\\n vec2 coord = mapCoord(vTextureCoord);\\n\\n // get the rounded color..\\n vec2 pixCoord = pixelate(coord, vec2(pixelSize));\\n pixCoord = unmapCoord(pixCoord);\\n\\n vec4 color = texture2D(uSampler, pixCoord);\\n\\n // determine the character to use\\n float gray = (color.r + color.g + color.b) / 3.0;\\n\\n float n = 65536.0; // .\\n if (gray > 0.2) n = 65600.0; // :\\n if (gray > 0.3) n = 332772.0; // *\\n if (gray > 0.4) n = 15255086.0; // o\\n if (gray > 0.5) n = 23385164.0; // &\\n if (gray > 0.6) n = 15252014.0; // 8\\n if (gray > 0.7) n = 13199452.0; // @\\n if (gray > 0.8) n = 11512810.0; // #\\n\\n // get the mod..\\n vec2 modd = getMod(coord, vec2(pixelSize));\\n\\n gl_FragColor = color * character( n, vec2(-1.0) + modd * 2.0);\\n\\n}\\n\";\n\n// TODO (cengler) - The Y is flipped in this shader for some reason.\n\n/**\n * @author Vico @vicocotea\n * original shader : https://www.shadertoy.com/view/lssGDj by @movAX13h\n */\n\n/**\n * An ASCII filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/ascii.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-ascii|@pixi/filter-ascii}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [size=8] Size of the font\n */\nvar AsciiFilter = /*@__PURE__*/(function (Filter) {\n function AsciiFilter(size) {\n if ( size === void 0 ) size = 8;\n\n Filter.call(this, vertex, fragment);\n this.size = size;\n }\n\n if ( Filter ) AsciiFilter.__proto__ = Filter;\n AsciiFilter.prototype = Object.create( Filter && Filter.prototype );\n AsciiFilter.prototype.constructor = AsciiFilter;\n\n var prototypeAccessors = { size: { configurable: true } };\n\n /**\n * The pixel size used by the filter.\n *\n * @member {number}\n */\n prototypeAccessors.size.get = function () {\n return this.uniforms.pixelSize;\n };\n prototypeAccessors.size.set = function (value) {\n this.uniforms.pixelSize = value;\n };\n\n Object.defineProperties( AsciiFilter.prototype, prototypeAccessors );\n\n return AsciiFilter;\n}(Filter));\n\nexport { AsciiFilter };\n//# sourceMappingURL=filter-ascii.esm.js.map\n","/*!\n * @pixi/filter-bevel - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-bevel is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { DEG_TO_RAD } from '@pixi/math';\nimport { rgb2hex, hex2rgb } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\n\\nuniform float transformX;\\nuniform float transformY;\\nuniform vec3 lightColor;\\nuniform float lightAlpha;\\nuniform vec3 shadowColor;\\nuniform float shadowAlpha;\\n\\nvoid main(void) {\\n vec2 transform = vec2(1.0 / filterArea) * vec2(transformX, transformY);\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n float light = texture2D(uSampler, vTextureCoord - transform).a;\\n float shadow = texture2D(uSampler, vTextureCoord + transform).a;\\n\\n color.rgb = mix(color.rgb, lightColor, clamp((color.a - light) * lightAlpha, 0.0, 1.0));\\n color.rgb = mix(color.rgb, shadowColor, clamp((color.a - shadow) * shadowAlpha, 0.0, 1.0));\\n gl_FragColor = vec4(color.rgb * color.a, color.a);\\n}\\n\";\n\n/**\n * Bevel Filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/bevel.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-bevel|@pixi/filter-bevel}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {object} [options] - The optional parameters of the filter.\n * @param {number} [options.rotation = 45] - The angle of the light in degrees.\n * @param {number} [options.thickness = 2] - The tickness of the bevel.\n * @param {number} [options.lightColor = 0xffffff] - Color of the light.\n * @param {number} [options.lightAlpha = 0.7] - Alpha of the light.\n * @param {number} [options.shadowColor = 0x000000] - Color of the shadow.\n * @param {number} [options.shadowAlpha = 0.7] - Alpha of the shadow.\n */\nvar BevelFilter = /*@__PURE__*/(function (Filter) {\n function BevelFilter(options) {\n if ( options === void 0 ) options = {};\n\n Filter.call(this, vertex, fragment);\n\n this.uniforms.lightColor = new Float32Array(3);\n this.uniforms.shadowColor = new Float32Array(3);\n\n options = Object.assign({\n rotation: 45,\n thickness: 2,\n lightColor: 0xffffff,\n lightAlpha: 0.7,\n shadowColor: 0x000000,\n shadowAlpha: 0.7,\n }, options);\n\n /**\n * The angle of the light in degrees.\n * @member {number}\n * @default 45\n */\n this.rotation = options.rotation;\n\n /**\n * The tickness of the bevel.\n * @member {number}\n * @default 2\n */\n this.thickness = options.thickness;\n\n /**\n * Color of the light.\n * @member {number}\n * @default 0xffffff\n */\n this.lightColor = options.lightColor;\n\n /**\n * Alpha of the light.\n * @member {number}\n * @default 0.7\n */\n this.lightAlpha = options.lightAlpha;\n\n /**\n * Color of the shadow.\n * @member {number}\n * @default 0x000000\n */\n this.shadowColor = options.shadowColor;\n\n /**\n * Alpha of the shadow.\n * @member {number}\n * @default 0.7\n */\n this.shadowAlpha = options.shadowAlpha;\n\n }\n\n if ( Filter ) BevelFilter.__proto__ = Filter;\n BevelFilter.prototype = Object.create( Filter && Filter.prototype );\n BevelFilter.prototype.constructor = BevelFilter;\n\n var prototypeAccessors = { rotation: { configurable: true },thickness: { configurable: true },lightColor: { configurable: true },lightAlpha: { configurable: true },shadowColor: { configurable: true },shadowAlpha: { configurable: true } };\n\n /**\n * Update the transform matrix of offset angle.\n * @private\n */\n BevelFilter.prototype._updateTransform = function _updateTransform () {\n this.uniforms.transformX = this._thickness * Math.cos(this._angle);\n this.uniforms.transformY = this._thickness * Math.sin(this._angle);\n };\n\n prototypeAccessors.rotation.get = function () {\n return this._angle / DEG_TO_RAD;\n };\n prototypeAccessors.rotation.set = function (value) {\n this._angle = value * DEG_TO_RAD;\n this._updateTransform();\n };\n\n prototypeAccessors.thickness.get = function () {\n return this._thickness;\n };\n prototypeAccessors.thickness.set = function (value) {\n this._thickness = value;\n this._updateTransform();\n };\n\n prototypeAccessors.lightColor.get = function () {\n return rgb2hex(this.uniforms.lightColor);\n };\n prototypeAccessors.lightColor.set = function (value) {\n hex2rgb(value, this.uniforms.lightColor);\n };\n\n prototypeAccessors.lightAlpha.get = function () {\n return this.uniforms.lightAlpha;\n };\n prototypeAccessors.lightAlpha.set = function (value) {\n this.uniforms.lightAlpha = value;\n };\n\n prototypeAccessors.shadowColor.get = function () {\n return rgb2hex(this.uniforms.shadowColor);\n };\n prototypeAccessors.shadowColor.set = function (value) {\n hex2rgb(value, this.uniforms.shadowColor);\n };\n\n prototypeAccessors.shadowAlpha.get = function () {\n return this.uniforms.shadowAlpha;\n };\n prototypeAccessors.shadowAlpha.set = function (value) {\n this.uniforms.shadowAlpha = value;\n };\n\n Object.defineProperties( BevelFilter.prototype, prototypeAccessors );\n\n return BevelFilter;\n}(Filter));\n\nexport { BevelFilter };\n//# sourceMappingURL=filter-bevel.esm.js.map\n","/*!\n * @pixi/filter-bloom - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-bloom is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { BLEND_MODES } from '@pixi/constants';\nimport { AlphaFilter } from '@pixi/filter-alpha';\nimport { BlurFilterPass } from '@pixi/filter-blur';\nimport { settings } from '@pixi/settings';\nimport { Point } from '@pixi/math';\n\n/**\n * The BloomFilter applies a Gaussian blur to an object.\n * The strength of the blur can be set for x- and y-axis separately.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/bloom.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-bloom|@pixi/filter-bloom}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number|PIXI.Point|number[]} [blur=2] Sets the strength of both the blurX and blurY properties simultaneously\n * @param {number} [quality=4] The quality of the blurX & blurY filter.\n * @param {number} [resolution=PIXI.settings.RESOLUTION] The resolution of the blurX & blurY filter.\n * @param {number} [kernelSize=5] The kernelSize of the blurX & blurY filter.Options: 5, 7, 9, 11, 13, 15.\n */\nvar BloomFilter = /*@__PURE__*/(function (Filter) {\n function BloomFilter(blur, quality, resolution, kernelSize) {\n if ( blur === void 0 ) blur = 2;\n if ( quality === void 0 ) quality = 4;\n if ( resolution === void 0 ) resolution = settings.RESOLUTION;\n if ( kernelSize === void 0 ) kernelSize = 5;\n\n Filter.call(this);\n\n var blurX;\n var blurY;\n\n if (typeof blur === 'number') {\n blurX = blur;\n blurY = blur;\n }\n else if (blur instanceof Point) {\n blurX = blur.x;\n blurY = blur.y;\n }\n else if (Array.isArray(blur)) {\n blurX = blur[0];\n blurY = blur[1];\n }\n\n this.blurXFilter = new BlurFilterPass(true, blurX, quality, resolution, kernelSize);\n this.blurYFilter = new BlurFilterPass(false, blurY, quality, resolution, kernelSize);\n this.blurYFilter.blendMode = BLEND_MODES.SCREEN;\n this.defaultFilter = new AlphaFilter();\n }\n\n if ( Filter ) BloomFilter.__proto__ = Filter;\n BloomFilter.prototype = Object.create( Filter && Filter.prototype );\n BloomFilter.prototype.constructor = BloomFilter;\n\n var prototypeAccessors = { blur: { configurable: true },blurX: { configurable: true },blurY: { configurable: true } };\n\n BloomFilter.prototype.apply = function apply (filterManager, input, output) {\n var renderTarget = filterManager.getFilterTexture(true);\n\n //TODO - copyTexSubImage2D could be used here?\n this.defaultFilter.apply(filterManager, input, output);\n\n this.blurXFilter.apply(filterManager, input, renderTarget);\n this.blurYFilter.apply(filterManager, renderTarget, output);\n\n filterManager.returnFilterTexture(renderTarget);\n };\n\n /**\n * Sets the strength of both the blurX and blurY properties simultaneously\n *\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blur.get = function () {\n return this.blurXFilter.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this.blurXFilter.blur = this.blurYFilter.blur = value;\n };\n\n /**\n * Sets the strength of the blurX property\n *\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blurX.get = function () {\n return this.blurXFilter.blur;\n };\n prototypeAccessors.blurX.set = function (value) {\n this.blurXFilter.blur = value;\n };\n\n /**\n * Sets the strength of the blurY property\n *\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blurY.get = function () {\n return this.blurYFilter.blur;\n };\n prototypeAccessors.blurY.set = function (value) {\n this.blurYFilter.blur = value;\n };\n\n Object.defineProperties( BloomFilter.prototype, prototypeAccessors );\n\n return BloomFilter;\n}(Filter));\n\nexport { BloomFilter };\n//# sourceMappingURL=filter-bloom.esm.js.map\n","/*!\n * @pixi/filter-bulge-pinch - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-bulge-pinch is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"uniform float radius;\\nuniform float strength;\\nuniform vec2 center;\\nuniform sampler2D uSampler;\\nvarying vec2 vTextureCoord;\\n\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\nuniform vec2 dimensions;\\n\\nvoid main()\\n{\\n vec2 coord = vTextureCoord * filterArea.xy;\\n coord -= center * dimensions.xy;\\n float distance = length(coord);\\n if (distance < radius) {\\n float percent = distance / radius;\\n if (strength > 0.0) {\\n coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75);\\n } else {\\n coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent);\\n }\\n }\\n coord += center * dimensions.xy;\\n coord /= filterArea.xy;\\n vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw);\\n vec4 color = texture2D(uSampler, clampedCoord);\\n if (coord != clampedCoord) {\\n color *= max(0.0, 1.0 - length(coord - clampedCoord));\\n }\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * @author Julien CLEREL @JuloxRox\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/warp/bulgepinch.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * Bulges or pinches the image in a circle.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/bulge-pinch.gif)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-bulge-pinch|@pixi/filter-bulge-pinch}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {PIXI.Point|Array} [center=[0,0]] The x and y coordinates of the center of the circle of effect.\n * @param {number} [radius=100] The radius of the circle of effect.\n * @param {number} [strength=1] -1 to 1 (-1 is strong pinch, 0 is no effect, 1 is strong bulge)\n */\nvar BulgePinchFilter = /*@__PURE__*/(function (Filter) {\n function BulgePinchFilter(center, radius, strength) {\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n this.center = center || [0.5, 0.5];\n this.radius = (typeof radius === 'number') ? radius : 100; // allow 0 to be passed\n this.strength = (typeof strength === 'number') ? strength : 1; // allow 0 to be passed\n }\n\n if ( Filter ) BulgePinchFilter.__proto__ = Filter;\n BulgePinchFilter.prototype = Object.create( Filter && Filter.prototype );\n BulgePinchFilter.prototype.constructor = BulgePinchFilter;\n\n var prototypeAccessors = { radius: { configurable: true },strength: { configurable: true },center: { configurable: true } };\n\n BulgePinchFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * The radius of the circle of effect.\n *\n * @member {number}\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.radius;\n };\n prototypeAccessors.radius.set = function (value) {\n this.uniforms.radius = value;\n };\n\n /**\n * The strength of the effect. -1 to 1 (-1 is strong pinch, 0 is no effect, 1 is strong bulge)\n *\n * @member {number}\n */\n prototypeAccessors.strength.get = function () {\n return this.uniforms.strength;\n };\n prototypeAccessors.strength.set = function (value) {\n this.uniforms.strength = value;\n };\n\n /**\n * The x and y coordinates of the center of the circle of effect.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.center.get = function () {\n return this.uniforms.center;\n };\n prototypeAccessors.center.set = function (value) {\n this.uniforms.center = value;\n };\n\n Object.defineProperties( BulgePinchFilter.prototype, prototypeAccessors );\n\n return BulgePinchFilter;\n}(Filter));\n\nexport { BulgePinchFilter };\n//# sourceMappingURL=filter-bulge-pinch.esm.js.map\n","/*!\n * @pixi/filter-color-map - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-color-map is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Texture, Filter } from '@pixi/core';\nimport { SCALE_MODES } from '@pixi/constants';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform sampler2D colorMap;\\nuniform float _mix;\\nuniform float _size;\\nuniform float _sliceSize;\\nuniform float _slicePixelSize;\\nuniform float _sliceInnerSize;\\nvoid main() {\\n vec4 color = texture2D(uSampler, vTextureCoord.xy);\\n\\n vec4 adjusted;\\n if (color.a > 0.0) {\\n color.rgb /= color.a;\\n float innerWidth = _size - 1.0;\\n float zSlice0 = min(floor(color.b * innerWidth), innerWidth);\\n float zSlice1 = min(zSlice0 + 1.0, innerWidth);\\n float xOffset = _slicePixelSize * 0.5 + color.r * _sliceInnerSize;\\n float s0 = xOffset + (zSlice0 * _sliceSize);\\n float s1 = xOffset + (zSlice1 * _sliceSize);\\n float yOffset = _sliceSize * 0.5 + color.g * (1.0 - _sliceSize);\\n vec4 slice0Color = texture2D(colorMap, vec2(s0,yOffset));\\n vec4 slice1Color = texture2D(colorMap, vec2(s1,yOffset));\\n float zOffset = fract(color.b * innerWidth);\\n adjusted = mix(slice0Color, slice1Color, zOffset);\\n\\n color.rgb *= color.a;\\n }\\n gl_FragColor = vec4(mix(color, adjusted, _mix).rgb, color.a);\\n\\n}\";\n\n/**\n * The ColorMapFilter applies a color-map effect to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/color-map.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-color-map|@pixi/filter-color-map}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {HTMLImageElement|HTMLCanvasElement|PIXI.BaseTexture|PIXI.Texture} [colorMap] - The colorMap texture of the filter.\n * @param {boolean} [nearest=false] - Whether use NEAREST for colorMap texture.\n * @param {number} [mix=1] - The mix from 0 to 1, where 0 is the original image and 1 is the color mapped image.\n */\nvar ColorMapFilter = /*@__PURE__*/(function (Filter) {\n function ColorMapFilter(colorMap, nearest, mix) {\n if ( nearest === void 0 ) nearest = false;\n if ( mix === void 0 ) mix = 1;\n\n Filter.call(this, vertex, fragment);\n\n this._size = 0;\n this._sliceSize = 0;\n this._slicePixelSize = 0;\n this._sliceInnerSize = 0;\n\n this._scaleMode = null;\n this._nearest = false;\n this.nearest = nearest;\n\n /**\n * The mix from 0 to 1, where 0 is the original image and 1 is the color mapped image.\n * @member {number}\n */\n this.mix = mix;\n\n this.colorMap = colorMap;\n }\n\n if ( Filter ) ColorMapFilter.__proto__ = Filter;\n ColorMapFilter.prototype = Object.create( Filter && Filter.prototype );\n ColorMapFilter.prototype.constructor = ColorMapFilter;\n\n var prototypeAccessors = { colorSize: { configurable: true },colorMap: { configurable: true },nearest: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n ColorMapFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms._mix = this.mix;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * the size of one color slice\n * @member {number}\n * @readonly\n */\n prototypeAccessors.colorSize.get = function () {\n return this._size;\n };\n\n /**\n * the colorMap texture\n * @member {PIXI.Texture}\n */\n prototypeAccessors.colorMap.get = function () {\n return this._colorMap;\n };\n prototypeAccessors.colorMap.set = function (colorMap) {\n if (!(colorMap instanceof Texture)) {\n colorMap = Texture.from(colorMap);\n }\n if (colorMap && colorMap.baseTexture) {\n colorMap.baseTexture.scaleMode = this._scaleMode;\n colorMap.baseTexture.mipmap = false;\n\n this._size = colorMap.height;\n this._sliceSize = 1 / this._size;\n this._slicePixelSize = this._sliceSize / this._size;\n this._sliceInnerSize = this._slicePixelSize * (this._size - 1);\n\n this.uniforms._size = this._size;\n this.uniforms._sliceSize = this._sliceSize;\n this.uniforms._slicePixelSize = this._slicePixelSize;\n this.uniforms._sliceInnerSize = this._sliceInnerSize;\n\n this.uniforms.colorMap = colorMap;\n }\n\n this._colorMap = colorMap;\n };\n\n /**\n * Whether use NEAREST for colorMap texture.\n * @member {boolean}\n */\n prototypeAccessors.nearest.get = function () {\n return this._nearest;\n };\n prototypeAccessors.nearest.set = function (nearest) {\n this._nearest = nearest;\n this._scaleMode = nearest ? SCALE_MODES.NEAREST : SCALE_MODES.LINEAR;\n\n var texture = this._colorMap;\n\n if (texture && texture.baseTexture) {\n texture.baseTexture._glTextures = {};\n\n texture.baseTexture.scaleMode = this._scaleMode;\n texture.baseTexture.mipmap = false;\n\n texture._updateID++;\n texture.baseTexture.emit('update', texture.baseTexture);\n }\n };\n\n /**\n * If the colorMap is based on canvas , and the content of canvas has changed,\n * then call `updateColorMap` for update texture.\n */\n ColorMapFilter.prototype.updateColorMap = function updateColorMap () {\n var texture = this._colorMap;\n\n if (texture && texture.baseTexture) {\n texture._updateID++;\n texture.baseTexture.emit('update', texture.baseTexture);\n\n this.colorMap = texture;\n }\n };\n\n /**\n * Destroys this filter\n *\n * @param {boolean} [destroyBase=false] Whether to destroy the base texture of colorMap as well\n */\n ColorMapFilter.prototype.destroy = function destroy (destroyBase) {\n if (this._colorMap) {\n this._colorMap.destroy(destroyBase);\n }\n Filter.prototype.destroy.call(this);\n };\n\n Object.defineProperties( ColorMapFilter.prototype, prototypeAccessors );\n\n return ColorMapFilter;\n}(Filter));\n\nexport { ColorMapFilter };\n//# sourceMappingURL=filter-color-map.esm.js.map\n","/*!\n * @pixi/filter-color-replace - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-color-replace is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { hex2rgb, rgb2hex } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec3 originalColor;\\nuniform vec3 newColor;\\nuniform float epsilon;\\nvoid main(void) {\\n vec4 currentColor = texture2D(uSampler, vTextureCoord);\\n vec3 colorDiff = originalColor - (currentColor.rgb / max(currentColor.a, 0.0000000001));\\n float colorDistance = length(colorDiff);\\n float doReplace = step(colorDistance, epsilon);\\n gl_FragColor = vec4(mix(currentColor.rgb, (newColor + colorDiff) * currentColor.a, doReplace), currentColor.a);\\n}\\n\";\n\n/**\n * ColorReplaceFilter, originally by mishaa, updated by timetocode\n * http://www.html5gamedevs.com/topic/10640-outline-a-sprite-change-certain-colors/?p=69966
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/color-replace.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-color-replace|@pixi/filter-color-replace}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number|Array} [originalColor=0xFF0000] The color that will be changed, as a 3 component RGB e.g. [1.0, 1.0, 1.0]\n * @param {number|Array} [newColor=0x000000] The resulting color, as a 3 component RGB e.g. [1.0, 0.5, 1.0]\n * @param {number} [epsilon=0.4] Tolerance/sensitivity of the floating-point comparison between colors (lower = more exact, higher = more inclusive)\n *\n * @example\n * // replaces true red with true blue\n * someSprite.filters = [new ColorReplaceFilter(\n * [1, 0, 0],\n * [0, 0, 1],\n * 0.001\n * )];\n * // replaces the RGB color 220, 220, 220 with the RGB color 225, 200, 215\n * someOtherSprite.filters = [new ColorReplaceFilter(\n * [220/255.0, 220/255.0, 220/255.0],\n * [225/255.0, 200/255.0, 215/255.0],\n * 0.001\n * )];\n * // replaces the RGB color 220, 220, 220 with the RGB color 225, 200, 215\n * someOtherSprite.filters = [new ColorReplaceFilter(0xdcdcdc, 0xe1c8d7, 0.001)];\n *\n */\nvar ColorReplaceFilter = /*@__PURE__*/(function (Filter) {\n function ColorReplaceFilter(originalColor, newColor, epsilon) {\n if ( originalColor === void 0 ) originalColor = 0xFF0000;\n if ( newColor === void 0 ) newColor = 0x000000;\n if ( epsilon === void 0 ) epsilon = 0.4;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.originalColor = new Float32Array(3);\n this.uniforms.newColor = new Float32Array(3);\n this.originalColor = originalColor;\n this.newColor = newColor;\n this.epsilon = epsilon;\n }\n\n if ( Filter ) ColorReplaceFilter.__proto__ = Filter;\n ColorReplaceFilter.prototype = Object.create( Filter && Filter.prototype );\n ColorReplaceFilter.prototype.constructor = ColorReplaceFilter;\n\n var prototypeAccessors = { originalColor: { configurable: true },newColor: { configurable: true },epsilon: { configurable: true } };\n\n /**\n * The color that will be changed, as a 3 component RGB e.g. [1.0, 1.0, 1.0]\n * @member {number|Array}\n * @default 0xFF0000\n */\n prototypeAccessors.originalColor.set = function (value) {\n var arr = this.uniforms.originalColor;\n if (typeof value === 'number') {\n hex2rgb(value, arr);\n this._originalColor = value;\n }\n else {\n arr[0] = value[0];\n arr[1] = value[1];\n arr[2] = value[2];\n this._originalColor = rgb2hex(arr);\n }\n };\n prototypeAccessors.originalColor.get = function () {\n return this._originalColor;\n };\n\n /**\n * The resulting color, as a 3 component RGB e.g. [1.0, 0.5, 1.0]\n * @member {number|Array}\n * @default 0x000000\n */\n prototypeAccessors.newColor.set = function (value) {\n var arr = this.uniforms.newColor;\n if (typeof value === 'number') {\n hex2rgb(value, arr);\n this._newColor = value;\n }\n else {\n arr[0] = value[0];\n arr[1] = value[1];\n arr[2] = value[2];\n this._newColor = rgb2hex(arr);\n }\n };\n prototypeAccessors.newColor.get = function () {\n return this._newColor;\n };\n\n /**\n * Tolerance/sensitivity of the floating-point comparison between colors (lower = more exact, higher = more inclusive)\n * @member {number}\n * @default 0.4\n */\n prototypeAccessors.epsilon.set = function (value) {\n this.uniforms.epsilon = value;\n };\n prototypeAccessors.epsilon.get = function () {\n return this.uniforms.epsilon;\n };\n\n Object.defineProperties( ColorReplaceFilter.prototype, prototypeAccessors );\n\n return ColorReplaceFilter;\n}(Filter));\n\nexport { ColorReplaceFilter };\n//# sourceMappingURL=filter-color-replace.esm.js.map\n","/*!\n * @pixi/filter-convolution - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-convolution is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying mediump vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform vec2 texelSize;\\nuniform float matrix[9];\\n\\nvoid main(void)\\n{\\n vec4 c11 = texture2D(uSampler, vTextureCoord - texelSize); // top left\\n vec4 c12 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - texelSize.y)); // top center\\n vec4 c13 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y - texelSize.y)); // top right\\n\\n vec4 c21 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y)); // mid left\\n vec4 c22 = texture2D(uSampler, vTextureCoord); // mid center\\n vec4 c23 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y)); // mid right\\n\\n vec4 c31 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y + texelSize.y)); // bottom left\\n vec4 c32 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + texelSize.y)); // bottom center\\n vec4 c33 = texture2D(uSampler, vTextureCoord + texelSize); // bottom right\\n\\n gl_FragColor =\\n c11 * matrix[0] + c12 * matrix[1] + c13 * matrix[2] +\\n c21 * matrix[3] + c22 * matrix[4] + c23 * matrix[5] +\\n c31 * matrix[6] + c32 * matrix[7] + c33 * matrix[8];\\n\\n gl_FragColor.a = c22.a;\\n}\\n\";\n\n/**\n * The ConvolutionFilter class applies a matrix convolution filter effect.\n * A convolution combines pixels in the input image with neighboring pixels to produce a new image.\n * A wide variety of image effects can be achieved through convolutions, including blurring, edge\n * detection, sharpening, embossing, and beveling. The matrix should be specified as a 9 point Array.\n * See http://docs.gimp.org/en/plug-in-convmatrix.html for more info.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/convolution.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-convolution|@pixi/filter-convolution}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param [matrix=[0,0,0,0,0,0,0,0,0]] {number[]} An array of values used for matrix transformation. Specified as a 9 point Array.\n * @param [width=200] {number} Width of the object you are transforming\n * @param [height=200] {number} Height of the object you are transforming\n */\nvar ConvolutionFilter = /*@__PURE__*/(function (Filter) {\n function ConvolutionFilter(matrix, width, height) {\n if ( width === void 0 ) width = 200;\n if ( height === void 0 ) height = 200;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.texelSize = new Float32Array(2);\n this.uniforms.matrix = new Float32Array(9);\n if (matrix !== undefined) {\n this.matrix = matrix;\n }\n this.width = width;\n this.height = height;\n }\n\n if ( Filter ) ConvolutionFilter.__proto__ = Filter;\n ConvolutionFilter.prototype = Object.create( Filter && Filter.prototype );\n ConvolutionFilter.prototype.constructor = ConvolutionFilter;\n\n var prototypeAccessors = { matrix: { configurable: true },width: { configurable: true },height: { configurable: true } };\n\n /**\n * An array of values used for matrix transformation. Specified as a 9 point Array.\n *\n * @member {Array}\n */\n prototypeAccessors.matrix.get = function () {\n return this.uniforms.matrix;\n };\n prototypeAccessors.matrix.set = function (matrix) {\n var this$1 = this;\n\n matrix.forEach(function (v, i) { return this$1.uniforms.matrix[i] = v; });\n };\n\n /**\n * Width of the object you are transforming\n *\n * @member {number}\n */\n prototypeAccessors.width.get = function () {\n return 1/this.uniforms.texelSize[0];\n };\n prototypeAccessors.width.set = function (value) {\n this.uniforms.texelSize[0] = 1/value;\n };\n\n /**\n * Height of the object you are transforming\n *\n * @member {number}\n */\n prototypeAccessors.height.get = function () {\n return 1/this.uniforms.texelSize[1];\n };\n prototypeAccessors.height.set = function (value) {\n this.uniforms.texelSize[1] = 1/value;\n };\n\n Object.defineProperties( ConvolutionFilter.prototype, prototypeAccessors );\n\n return ConvolutionFilter;\n}(Filter));\n\nexport { ConvolutionFilter };\n//# sourceMappingURL=filter-convolution.esm.js.map\n","/*!\n * @pixi/filter-cross-hatch - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-cross-hatch is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\n\\nvoid main(void)\\n{\\n float lum = length(texture2D(uSampler, vTextureCoord.xy).rgb);\\n\\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\\n\\n if (lum < 1.00)\\n {\\n if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0)\\n {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\\n }\\n }\\n\\n if (lum < 0.75)\\n {\\n if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0)\\n {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\\n }\\n }\\n\\n if (lum < 0.50)\\n {\\n if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0)\\n {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\\n }\\n }\\n\\n if (lum < 0.3)\\n {\\n if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0)\\n {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\\n }\\n }\\n}\\n\";\n\n/**\n * A Cross Hatch effect filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/cross-hatch.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-cross-hatch|@pixi/filter-cross-hatch}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n */\nvar CrossHatchFilter = /*@__PURE__*/(function (Filter) {\n function CrossHatchFilter() {\n Filter.call(this, vertex, fragment);\n }\n\n if ( Filter ) CrossHatchFilter.__proto__ = Filter;\n CrossHatchFilter.prototype = Object.create( Filter && Filter.prototype );\n CrossHatchFilter.prototype.constructor = CrossHatchFilter;\n\n return CrossHatchFilter;\n}(Filter));\n\nexport { CrossHatchFilter };\n//# sourceMappingURL=filter-cross-hatch.esm.js.map\n","/*!\n * @pixi/filter-crt - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-crt is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec4 filterArea;\\nuniform vec2 dimensions;\\n\\nconst float SQRT_2 = 1.414213;\\n\\nconst float light = 1.0;\\n\\nuniform float curvature;\\nuniform float lineWidth;\\nuniform float lineContrast;\\nuniform bool verticalLine;\\nuniform float noise;\\nuniform float noiseSize;\\n\\nuniform float vignetting;\\nuniform float vignettingAlpha;\\nuniform float vignettingBlur;\\n\\nuniform float seed;\\nuniform float time;\\n\\nfloat rand(vec2 co) {\\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\\n}\\n\\nvoid main(void)\\n{\\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\\n vec2 coord = pixelCoord / dimensions;\\n\\n vec2 dir = vec2(coord - vec2(0.5, 0.5));\\n\\n float _c = curvature > 0. ? curvature : 1.;\\n float k = curvature > 0. ?(length(dir * dir) * 0.25 * _c * _c + 0.935 * _c) : 1.;\\n vec2 uv = dir * k;\\n\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n vec3 rgb = gl_FragColor.rgb;\\n\\n\\n if (noise > 0.0 && noiseSize > 0.0)\\n {\\n pixelCoord.x = floor(pixelCoord.x / noiseSize);\\n pixelCoord.y = floor(pixelCoord.y / noiseSize);\\n float _noise = rand(pixelCoord * noiseSize * seed) - 0.5;\\n rgb += _noise * noise;\\n }\\n\\n if (lineWidth > 0.0) {\\n float v = (verticalLine ? uv.x * dimensions.x : uv.y * dimensions.y) * min(1.0, 2.0 / lineWidth ) / _c;\\n float j = 1. + cos(v * 1.2 - time) * 0.5 * lineContrast;\\n rgb *= j;\\n float segment = verticalLine ? mod((dir.x + .5) * dimensions.x, 4.) : mod((dir.y + .5) * dimensions.y, 4.);\\n rgb *= 0.99 + ceil(segment) * 0.015;\\n }\\n\\n if (vignetting > 0.0)\\n {\\n float outter = SQRT_2 - vignetting * SQRT_2;\\n float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0);\\n rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha);\\n }\\n\\n gl_FragColor.rgb = rgb;\\n}\\n\";\n\n/**\n * The CRTFilter applies a CRT effect to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/crt.gif)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-crt|@pixi/filter-crt}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object} [options] - The optional parameters of CRT effect\n * @param {number} [options.curvature=1.0] - Bent of interlaced lines, higher value means more bend\n * @param {number} [options.lineWidth=1.0] - Width of the interlaced lines\n * @param {number} [options.lineContrast=0.25] - Contrast of interlaced lines\n * @param {number} [options.verticalLine=false] - `true` is vertical lines, `false` is horizontal\n * @param {number} [options.noise=0.3] - Opacity/intensity of the noise effect between `0` and `1`\n * @param {number} [options.noiseSize=1.0] - The size of the noise particles\n * @param {number} [options.seed=0] - A seed value to apply to the random noise generation\n * @param {number} [options.vignetting=0.3] - The radius of the vignette effect, smaller\n * values produces a smaller vignette\n * @param {number} [options.vignettingAlpha=1.0] - Amount of opacity of vignette\n * @param {number} [options.vignettingBlur=0.3] - Blur intensity of the vignette\n * @param {number} [options.time=0] - For animating interlaced lines\n */\nvar CRTFilter = /*@__PURE__*/(function (Filter) {\n function CRTFilter(options) {\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n\n /**\n * For animating interlaced lines\n *\n * @member {number}\n * @default 0\n */\n this.time = 0;\n\n /**\n * A seed value to apply to the random noise generation\n *\n * @member {number}\n * @default 0\n */\n this.seed = 0;\n\n Object.assign(this, {\n curvature: 1.0,\n lineWidth: 1.0,\n lineContrast: 0.25,\n verticalLine: false,\n noise: 0.0,\n noiseSize: 1.0,\n seed: 0.0,\n vignetting: 0.3,\n vignettingAlpha: 1.0,\n vignettingBlur: 0.3,\n time: 0.0,\n }, options);\n }\n\n if ( Filter ) CRTFilter.__proto__ = Filter;\n CRTFilter.prototype = Object.create( Filter && Filter.prototype );\n CRTFilter.prototype.constructor = CRTFilter;\n\n var prototypeAccessors = { curvature: { configurable: true },lineWidth: { configurable: true },lineContrast: { configurable: true },verticalLine: { configurable: true },noise: { configurable: true },noiseSize: { configurable: true },vignetting: { configurable: true },vignettingAlpha: { configurable: true },vignettingBlur: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n CRTFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n\n this.uniforms.seed = this.seed;\n this.uniforms.time = this.time;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Bent of interlaced lines, higher value means more bend\n *\n * @member {number}\n * @default 1\n */\n prototypeAccessors.curvature.set = function (value) {\n this.uniforms.curvature = value;\n };\n prototypeAccessors.curvature.get = function () {\n return this.uniforms.curvature;\n };\n\n /**\n * Width of interlaced lines\n *\n * @member {number}\n * @default 1\n */\n prototypeAccessors.lineWidth.set = function (value) {\n this.uniforms.lineWidth = value;\n };\n prototypeAccessors.lineWidth.get = function () {\n return this.uniforms.lineWidth;\n };\n\n /**\n * Contrast of interlaced lines\n *\n * @member {number}\n * @default 0.25\n */\n prototypeAccessors.lineContrast.set = function (value) {\n this.uniforms.lineContrast = value;\n };\n prototypeAccessors.lineContrast.get = function () {\n return this.uniforms.lineContrast;\n };\n\n /**\n * `true` for vertical lines, `false` for horizontal lines\n *\n * @member {boolean}\n * @default false\n */\n prototypeAccessors.verticalLine.set = function (value) {\n this.uniforms.verticalLine = value;\n };\n prototypeAccessors.verticalLine.get = function () {\n return this.uniforms.verticalLine;\n };\n\n /**\n * Opacity/intensity of the noise effect between `0` and `1`\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.noise.set = function (value) {\n this.uniforms.noise = value;\n };\n prototypeAccessors.noise.get = function () {\n return this.uniforms.noise;\n };\n\n /**\n * The size of the noise particles\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.noiseSize.set = function (value) {\n this.uniforms.noiseSize = value;\n };\n prototypeAccessors.noiseSize.get = function () {\n return this.uniforms.noiseSize;\n };\n\n /**\n * The radius of the vignette effect, smaller\n * values produces a smaller vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignetting.set = function (value) {\n this.uniforms.vignetting = value;\n };\n prototypeAccessors.vignetting.get = function () {\n return this.uniforms.vignetting;\n };\n\n /**\n * Amount of opacity of vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignettingAlpha.set = function (value) {\n this.uniforms.vignettingAlpha = value;\n };\n prototypeAccessors.vignettingAlpha.get = function () {\n return this.uniforms.vignettingAlpha;\n };\n\n /**\n * Blur intensity of the vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignettingBlur.set = function (value) {\n this.uniforms.vignettingBlur = value;\n };\n prototypeAccessors.vignettingBlur.get = function () {\n return this.uniforms.vignettingBlur;\n };\n\n Object.defineProperties( CRTFilter.prototype, prototypeAccessors );\n\n return CRTFilter;\n}(Filter));\n\nexport { CRTFilter };\n//# sourceMappingURL=filter-crt.esm.js.map\n","/*!\n * @pixi/filter-dot - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-dot is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\nvarying vec4 vColor;\\n\\nuniform vec4 filterArea;\\nuniform sampler2D uSampler;\\n\\nuniform float angle;\\nuniform float scale;\\n\\nfloat pattern()\\n{\\n float s = sin(angle), c = cos(angle);\\n vec2 tex = vTextureCoord * filterArea.xy;\\n vec2 point = vec2(\\n c * tex.x - s * tex.y,\\n s * tex.x + c * tex.y\\n ) * scale;\\n return (sin(point.x) * sin(point.y)) * 4.0;\\n}\\n\\nvoid main()\\n{\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n float average = (color.r + color.g + color.b) / 3.0;\\n gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);\\n}\\n\";\n\n/**\n * @author Mat Groves http://matgroves.com/ @Doormat23\n * original filter: https://github.com/evanw/glfx.js/blob/master/src/filters/fun/dotscreen.js\n */\n\n/**\n * This filter applies a dotscreen effect making display objects appear to be made out of\n * black and white halftone dots like an old printer.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/dot.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-dot|@pixi/filter-dot}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [scale=1] The scale of the effect.\n * @param {number} [angle=5] The radius of the effect.\n */\nvar DotFilter = /*@__PURE__*/(function (Filter) {\n function DotFilter(scale, angle) {\n if ( scale === void 0 ) scale = 1;\n if ( angle === void 0 ) angle = 5;\n\n Filter.call(this, vertex, fragment);\n this.scale = scale;\n this.angle = angle;\n }\n\n if ( Filter ) DotFilter.__proto__ = Filter;\n DotFilter.prototype = Object.create( Filter && Filter.prototype );\n DotFilter.prototype.constructor = DotFilter;\n\n var prototypeAccessors = { scale: { configurable: true },angle: { configurable: true } };\n\n /**\n * The scale of the effect.\n * @member {number}\n * @default 1\n */\n prototypeAccessors.scale.get = function () {\n return this.uniforms.scale;\n };\n prototypeAccessors.scale.set = function (value) {\n this.uniforms.scale = value;\n };\n\n /**\n * The radius of the effect.\n * @member {number}\n * @default 5\n */\n prototypeAccessors.angle.get = function () {\n return this.uniforms.angle;\n };\n prototypeAccessors.angle.set = function (value) {\n this.uniforms.angle = value;\n };\n\n Object.defineProperties( DotFilter.prototype, prototypeAccessors );\n\n return DotFilter;\n}(Filter));\n\nexport { DotFilter };\n//# sourceMappingURL=filter-dot.esm.js.map\n","/*!\n * @pixi/filter-drop-shadow - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-drop-shadow is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { KawaseBlurFilter } from '@pixi/filter-kawase-blur';\nimport { Filter } from '@pixi/core';\nimport { settings } from '@pixi/settings';\nimport { DEG_TO_RAD, Point } from '@pixi/math';\nimport { rgb2hex, hex2rgb } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform float alpha;\\nuniform vec3 color;\\n\\nuniform vec2 shift;\\nuniform vec4 inputSize;\\n\\nvoid main(void){\\n vec4 sample = texture2D(uSampler, vTextureCoord - shift * inputSize.zw);\\n\\n // Un-premultiply alpha before applying the color\\n if (sample.a > 0.0) {\\n sample.rgb /= sample.a;\\n }\\n\\n // Premultiply alpha again\\n sample.rgb = color.rgb * sample.a;\\n\\n // alpha user alpha\\n sample *= alpha;\\n\\n gl_FragColor = sample;\\n}\";\n\n/**\n * Drop shadow filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/drop-shadow.png)\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-drop-shadow|@pixi/filter-drop-shadow}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {object} [options] Filter options\n * @param {number} [options.rotation=45] The angle of the shadow in degrees.\n * @param {number} [options.distance=5] Distance of shadow\n * @param {number} [options.color=0x000000] Color of the shadow\n * @param {number} [options.alpha=0.5] Alpha of the shadow\n * @param {number} [options.shadowOnly=false] Whether render shadow only\n * @param {number} [options.blur=2] - Sets the strength of the Blur properties simultaneously\n * @param {number} [options.quality=3] - The quality of the Blur filter.\n * @param {number[]} [options.kernels=null] - The kernels of the Blur filter.\n * @param {number|number[]|PIXI.Point} [options.pixelSize=1] - the pixelSize of the Blur filter.\n * @param {number} [options.resolution=PIXI.settings.RESOLUTION] - The resolution of the Blur filter.\n */\nvar DropShadowFilter = /*@__PURE__*/(function (Filter) {\n function DropShadowFilter(options) {\n\n // Fallback support for ctor: (rotation, distance, blur, color, alpha)\n if (options && options.constructor !== Object) {\n // eslint-disable-next-line no-console\n console.warn('DropShadowFilter now uses options instead of (rotation, distance, blur, color, alpha)');\n options = { rotation: options };\n if (arguments[1] !== undefined) {\n options.distance = arguments[1];\n }\n if (arguments[2] !== undefined) {\n options.blur = arguments[2];\n }\n if (arguments[3] !== undefined) {\n options.color = arguments[3];\n }\n if (arguments[4] !== undefined) {\n options.alpha = arguments[4];\n }\n }\n\n options = Object.assign({\n rotation: 45,\n distance: 5,\n color: 0x000000,\n alpha: 0.5,\n shadowOnly: false,\n kernels: null,\n blur: 2,\n quality: 3,\n pixelSize: 1,\n resolution: settings.RESOLUTION,\n }, options);\n\n Filter.call(this);\n\n var kernels = options.kernels;\n var blur = options.blur;\n var quality = options.quality;\n var pixelSize = options.pixelSize;\n var resolution = options.resolution;\n\n this._tintFilter = new Filter(vertex, fragment);\n this._tintFilter.uniforms.color = new Float32Array(4);\n this._tintFilter.uniforms.shift = new Point();\n this._tintFilter.resolution = resolution;\n this._blurFilter = kernels ?\n new KawaseBlurFilter(kernels) :\n new KawaseBlurFilter(blur, quality);\n\n this.pixelSize = pixelSize;\n this.resolution = resolution;\n\n var shadowOnly = options.shadowOnly;\n var rotation = options.rotation;\n var distance = options.distance;\n var alpha = options.alpha;\n var color = options.color;\n\n this.shadowOnly = shadowOnly;\n this.rotation = rotation;\n this.distance = distance;\n this.alpha = alpha;\n this.color = color;\n\n this._updatePadding();\n }\n\n if ( Filter ) DropShadowFilter.__proto__ = Filter;\n DropShadowFilter.prototype = Object.create( Filter && Filter.prototype );\n DropShadowFilter.prototype.constructor = DropShadowFilter;\n\n var prototypeAccessors = { resolution: { configurable: true },distance: { configurable: true },rotation: { configurable: true },alpha: { configurable: true },color: { configurable: true },kernels: { configurable: true },blur: { configurable: true },quality: { configurable: true },pixelSize: { configurable: true } };\n\n DropShadowFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n var target = filterManager.getFilterTexture();\n\n this._tintFilter.apply(filterManager, input, target, true);\n this._blurFilter.apply(filterManager, target, output, clear);\n\n if (this.shadowOnly !== true) {\n filterManager.applyFilter(this, input, output, false);\n }\n\n filterManager.returnFilterTexture(target);\n };\n\n /**\n * Recalculate the proper padding amount.\n * @private\n */\n DropShadowFilter.prototype._updatePadding = function _updatePadding () {\n this.padding = this.distance + (this.blur * 2);\n };\n\n /**\n * Update the transform matrix of offset angle.\n * @private\n */\n DropShadowFilter.prototype._updateShift = function _updateShift () {\n this._tintFilter.uniforms.shift.set(\n this.distance * Math.cos(this.angle),\n this.distance * Math.sin(this.angle)\n );\n };\n\n /**\n * The resolution of the filter.\n *\n * @member {number}\n * @default PIXI.settings.RESOLUTION\n */\n prototypeAccessors.resolution.get = function () {\n return this._resolution;\n };\n prototypeAccessors.resolution.set = function (value) {\n this._resolution = value;\n\n if (this._tintFilter) {\n this._tintFilter.resolution = value;\n }\n if (this._blurFilter) {\n this._blurFilter.resolution = value;\n }\n };\n\n /**\n * Distance offset of the shadow\n * @member {number}\n * @default 5\n */\n prototypeAccessors.distance.get = function () {\n return this._distance;\n };\n prototypeAccessors.distance.set = function (value) {\n this._distance = value;\n this._updatePadding();\n this._updateShift();\n };\n\n /**\n * The angle of the shadow in degrees\n * @member {number}\n * @default 2\n */\n prototypeAccessors.rotation.get = function () {\n return this.angle / DEG_TO_RAD;\n };\n prototypeAccessors.rotation.set = function (value) {\n this.angle = value * DEG_TO_RAD;\n this._updateShift();\n };\n\n /**\n * The alpha of the shadow\n * @member {number}\n * @default 1\n */\n prototypeAccessors.alpha.get = function () {\n return this._tintFilter.uniforms.alpha;\n };\n prototypeAccessors.alpha.set = function (value) {\n this._tintFilter.uniforms.alpha = value;\n };\n\n /**\n * The color of the shadow.\n * @member {number}\n * @default 0x000000\n */\n prototypeAccessors.color.get = function () {\n return rgb2hex(this._tintFilter.uniforms.color);\n };\n prototypeAccessors.color.set = function (value) {\n hex2rgb(value, this._tintFilter.uniforms.color);\n };\n\n /**\n * Sets the kernels of the Blur Filter\n *\n * @member {number[]}\n */\n prototypeAccessors.kernels.get = function () {\n return this._blurFilter.kernels;\n };\n prototypeAccessors.kernels.set = function (value) {\n this._blurFilter.kernels = value;\n };\n\n /**\n * The blur of the shadow\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blur.get = function () {\n return this._blurFilter.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this._blurFilter.blur = value;\n this._updatePadding();\n };\n\n /**\n * Sets the quality of the Blur Filter\n *\n * @member {number}\n * @default 4\n */\n prototypeAccessors.quality.get = function () {\n return this._blurFilter.quality;\n };\n prototypeAccessors.quality.set = function (value) {\n this._blurFilter.quality = value;\n };\n\n /**\n * Sets the pixelSize of the Kawase Blur filter\n *\n * @member {number|number[]|PIXI.Point}\n * @default 1\n */\n prototypeAccessors.pixelSize.get = function () {\n return this._blurFilter.pixelSize;\n };\n prototypeAccessors.pixelSize.set = function (value) {\n this._blurFilter.pixelSize = value;\n };\n\n Object.defineProperties( DropShadowFilter.prototype, prototypeAccessors );\n\n return DropShadowFilter;\n}(Filter));\n\nexport { DropShadowFilter };\n//# sourceMappingURL=filter-drop-shadow.esm.js.map\n","/*!\n * @pixi/filter-emboss - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-emboss is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform float strength;\\nuniform vec4 filterArea;\\n\\n\\nvoid main(void)\\n{\\n\\tvec2 onePixel = vec2(1.0 / filterArea);\\n\\n\\tvec4 color;\\n\\n\\tcolor.rgb = vec3(0.5);\\n\\n\\tcolor -= texture2D(uSampler, vTextureCoord - onePixel) * strength;\\n\\tcolor += texture2D(uSampler, vTextureCoord + onePixel) * strength;\\n\\n\\tcolor.rgb = vec3((color.r + color.g + color.b) / 3.0);\\n\\n\\tfloat alpha = texture2D(uSampler, vTextureCoord).a;\\n\\n\\tgl_FragColor = vec4(color.rgb * alpha, alpha);\\n}\\n\";\n\n/**\n * An RGB Split Filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/emboss.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-emboss|@pixi/filter-emboss}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [strength=5] Strength of the emboss.\n */\nvar EmbossFilter = /*@__PURE__*/(function (Filter) {\n function EmbossFilter(strength){\n if ( strength === void 0 ) strength = 5;\n\n Filter.call(this, vertex, fragment);\n this.strength = strength;\n }\n\n if ( Filter ) EmbossFilter.__proto__ = Filter;\n EmbossFilter.prototype = Object.create( Filter && Filter.prototype );\n EmbossFilter.prototype.constructor = EmbossFilter;\n\n var prototypeAccessors = { strength: { configurable: true } };\n\n /**\n * Strength of emboss.\n *\n * @member {number}\n */\n prototypeAccessors.strength.get = function () {\n return this.uniforms.strength;\n };\n prototypeAccessors.strength.set = function (value) {\n this.uniforms.strength = value;\n };\n\n Object.defineProperties( EmbossFilter.prototype, prototypeAccessors );\n\n return EmbossFilter;\n}(Filter));\n\nexport { EmbossFilter };\n//# sourceMappingURL=filter-emboss.esm.js.map\n","/*!\n * @pixi/filter-glitch - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-glitch is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter, Texture } from '@pixi/core';\nimport { SCALE_MODES } from '@pixi/constants';\nimport { DEG_TO_RAD } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"// precision highp float;\\n\\nvarying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\nuniform vec2 dimensions;\\nuniform float aspect;\\n\\nuniform sampler2D displacementMap;\\nuniform float offset;\\nuniform float sinDir;\\nuniform float cosDir;\\nuniform int fillMode;\\n\\nuniform float seed;\\nuniform vec2 red;\\nuniform vec2 green;\\nuniform vec2 blue;\\n\\nconst int TRANSPARENT = 0;\\nconst int ORIGINAL = 1;\\nconst int LOOP = 2;\\nconst int CLAMP = 3;\\nconst int MIRROR = 4;\\n\\nvoid main(void)\\n{\\n vec2 coord = (vTextureCoord * filterArea.xy) / dimensions;\\n\\n if (coord.x > 1.0 || coord.y > 1.0) {\\n return;\\n }\\n\\n float cx = coord.x - 0.5;\\n float cy = (coord.y - 0.5) * aspect;\\n float ny = (-sinDir * cx + cosDir * cy) / aspect + 0.5;\\n\\n // displacementMap: repeat\\n // ny = ny > 1.0 ? ny - 1.0 : (ny < 0.0 ? 1.0 + ny : ny);\\n\\n // displacementMap: mirror\\n ny = ny > 1.0 ? 2.0 - ny : (ny < 0.0 ? -ny : ny);\\n\\n vec4 dc = texture2D(displacementMap, vec2(0.5, ny));\\n\\n float displacement = (dc.r - dc.g) * (offset / filterArea.x);\\n\\n coord = vTextureCoord + vec2(cosDir * displacement, sinDir * displacement * aspect);\\n\\n if (fillMode == CLAMP) {\\n coord = clamp(coord, filterClamp.xy, filterClamp.zw);\\n } else {\\n if( coord.x > filterClamp.z ) {\\n if (fillMode == TRANSPARENT) {\\n discard;\\n } else if (fillMode == LOOP) {\\n coord.x -= filterClamp.z;\\n } else if (fillMode == MIRROR) {\\n coord.x = filterClamp.z * 2.0 - coord.x;\\n }\\n } else if( coord.x < filterClamp.x ) {\\n if (fillMode == TRANSPARENT) {\\n discard;\\n } else if (fillMode == LOOP) {\\n coord.x += filterClamp.z;\\n } else if (fillMode == MIRROR) {\\n coord.x *= -filterClamp.z;\\n }\\n }\\n\\n if( coord.y > filterClamp.w ) {\\n if (fillMode == TRANSPARENT) {\\n discard;\\n } else if (fillMode == LOOP) {\\n coord.y -= filterClamp.w;\\n } else if (fillMode == MIRROR) {\\n coord.y = filterClamp.w * 2.0 - coord.y;\\n }\\n } else if( coord.y < filterClamp.y ) {\\n if (fillMode == TRANSPARENT) {\\n discard;\\n } else if (fillMode == LOOP) {\\n coord.y += filterClamp.w;\\n } else if (fillMode == MIRROR) {\\n coord.y *= -filterClamp.w;\\n }\\n }\\n }\\n\\n gl_FragColor.r = texture2D(uSampler, coord + red * (1.0 - seed * 0.4) / filterArea.xy).r;\\n gl_FragColor.g = texture2D(uSampler, coord + green * (1.0 - seed * 0.3) / filterArea.xy).g;\\n gl_FragColor.b = texture2D(uSampler, coord + blue * (1.0 - seed * 0.2) / filterArea.xy).b;\\n gl_FragColor.a = texture2D(uSampler, coord).a;\\n}\\n\";\n\n/**\n * The GlitchFilter applies a glitch effect to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/glitch.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-glitch|@pixi/filter-glitch}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {object} [options] - The more optional parameters of the filter.\n * @param {number} [options.slices=5] - The maximum number of slices.\n * @param {number} [options.offset=100] - The maximum offset amount of slices.\n * @param {number} [options.direction=0] - The angle in degree of the offset of slices.\n * @param {number} [options.fillMode=0] - The fill mode of the space after the offset. Acceptable values:\n * - `0` {@link PIXI.filters.GlitchFilter.TRANSPARENT TRANSPARENT}\n * - `1` {@link PIXI.filters.GlitchFilter.ORIGINAL ORIGINAL}\n * - `2` {@link PIXI.filters.GlitchFilter.LOOP LOOP}\n * - `3` {@link PIXI.filters.GlitchFilter.CLAMP CLAMP}\n * - `4` {@link PIXI.filters.GlitchFilter.MIRROR MIRROR}\n * @param {number} [options.seed=0] - A seed value for randomizing glitch effect.\n * @param {number} [options.average=false] - `true` will divide the bands roughly based on equal amounts\n * where as setting to `false` will vary the band sizes dramatically (more random looking).\n * @param {number} [options.minSize=8] - Minimum size of individual slice. Segment of total `sampleSize`\n * @param {number} [options.sampleSize=512] - The resolution of the displacement map texture.\n * @param {number} [options.red=[0,0]] - Red channel offset\n * @param {number} [options.green=[0,0]] - Green channel offset.\n * @param {number} [options.blue=[0,0]] - Blue channel offset.\n */\nvar GlitchFilter = /*@__PURE__*/(function (Filter) {\n function GlitchFilter(options) {\n if ( options === void 0 ) options = {};\n\n\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n\n options = Object.assign({\n slices: 5,\n offset: 100,\n direction: 0,\n fillMode: 0,\n average: false,\n seed: 0,\n red: [0, 0],\n green: [0, 0],\n blue: [0, 0],\n minSize: 8,\n sampleSize: 512,\n }, options);\n\n this.direction = options.direction;\n this.red = options.red;\n this.green = options.green;\n this.blue = options.blue;\n\n /**\n * The maximum offset value for each of the slices.\n *\n * @member {number}\n */\n this.offset = options.offset;\n\n /**\n * The fill mode of the space after the offset.\n *\n * @member {number}\n */\n this.fillMode = options.fillMode;\n\n /**\n * `true` will divide the bands roughly based on equal amounts\n * where as setting to `false` will vary the band sizes dramatically (more random looking).\n *\n * @member {boolean}\n * @default false\n */\n this.average = options.average;\n\n /**\n * A seed value for randomizing color offset. Animating\n * this value to `Math.random()` produces a twitching effect.\n *\n * @member {number}\n */\n this.seed = options.seed;\n\n /**\n * Minimum size of slices as a portion of the `sampleSize`\n *\n * @member {number}\n */\n this.minSize = options.minSize;\n\n /**\n * Height of the displacement map canvas.\n *\n * @member {number}\n * @readonly\n */\n this.sampleSize = options.sampleSize;\n\n /**\n * Internally generated canvas.\n *\n * @member {HTMLCanvasElement} _canvas\n * @private\n */\n this._canvas = document.createElement('canvas');\n this._canvas.width = 4;\n this._canvas.height = this.sampleSize;\n\n /**\n * The displacement map is used to generate the bands.\n * If using your own texture, `slices` will be ignored.\n *\n * @member {PIXI.Texture}\n * @readonly\n */\n this.texture = Texture.from(this._canvas, { scaleMode: SCALE_MODES.NEAREST });\n\n /**\n * Internal number of slices\n * @member {number}\n * @private\n */\n this._slices = 0;\n\n // Set slices\n this.slices = options.slices;\n }\n\n if ( Filter ) GlitchFilter.__proto__ = Filter;\n GlitchFilter.prototype = Object.create( Filter && Filter.prototype );\n GlitchFilter.prototype.constructor = GlitchFilter;\n\n var prototypeAccessors = { sizes: { configurable: true },offsets: { configurable: true },slices: { configurable: true },direction: { configurable: true },red: { configurable: true },green: { configurable: true },blue: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n GlitchFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n\n var width = input.filterFrame.width;\n var height = input.filterFrame.height;\n\n this.uniforms.dimensions[0] = width;\n this.uniforms.dimensions[1] = height;\n this.uniforms.aspect = height / width;\n\n this.uniforms.seed = this.seed;\n this.uniforms.offset = this.offset;\n this.uniforms.fillMode = this.fillMode;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Randomize the slices size (heights).\n *\n * @private\n */\n GlitchFilter.prototype._randomizeSizes = function _randomizeSizes () {\n var arr = this._sizes;\n var last = this._slices - 1;\n var size = this.sampleSize;\n var min = Math.min(this.minSize / size, 0.9 / this._slices);\n\n if (this.average) {\n var count = this._slices;\n var rest = 1;\n\n for (var i = 0; i < last; i++) {\n var averageWidth = rest / (count - i);\n var w = Math.max(averageWidth * (1 - Math.random() * 0.6), min);\n arr[i] = w;\n rest -= w;\n }\n arr[last] = rest;\n }\n else {\n var rest$1 = 1;\n var ratio = Math.sqrt(1 / this._slices);\n\n for (var i$1 = 0; i$1 < last; i$1++) {\n var w$1 = Math.max(ratio * rest$1 * Math.random(), min);\n arr[i$1] = w$1;\n rest$1 -= w$1;\n }\n arr[last] = rest$1;\n }\n\n this.shuffle();\n };\n\n /**\n * Shuffle the sizes of the slices, advanced usage.\n */\n GlitchFilter.prototype.shuffle = function shuffle () {\n var arr = this._sizes;\n var last = this._slices - 1;\n\n // shuffle\n for (var i = last; i > 0; i--) {\n var rand = (Math.random() * i) >> 0;\n var temp = arr[i];\n\n arr[i] = arr[rand];\n arr[rand] = temp;\n }\n };\n\n /**\n * Randomize the values for offset from -1 to 1\n *\n * @private\n */\n GlitchFilter.prototype._randomizeOffsets = function _randomizeOffsets () {\n for (var i = 0 ; i < this._slices; i++) {\n this._offsets[i] = Math.random() * (Math.random() < 0.5 ? -1 : 1);\n }\n };\n\n /**\n * Regenerating random size, offsets for slices.\n */\n GlitchFilter.prototype.refresh = function refresh () {\n this._randomizeSizes();\n this._randomizeOffsets();\n this.redraw();\n };\n\n /**\n * Redraw displacement bitmap texture, advanced usage.\n */\n GlitchFilter.prototype.redraw = function redraw () {\n var size = this.sampleSize;\n var texture = this.texture;\n var ctx = this._canvas.getContext('2d');\n ctx.clearRect(0, 0, 8, size);\n\n var offset;\n var y = 0;\n\n for (var i = 0 ; i < this._slices; i++) {\n offset = Math.floor(this._offsets[i] * 256);\n var height = this._sizes[i] * size;\n var red = offset > 0 ? offset : 0;\n var green = offset < 0 ? -offset : 0;\n ctx.fillStyle = 'rgba(' + red + ', ' + green + ', 0, 1)';\n ctx.fillRect(0, y >> 0, size, height + 1 >> 0);\n y += height;\n }\n\n texture.baseTexture.update();\n this.uniforms.displacementMap = texture;\n };\n\n /**\n * Manually custom slices size (height) of displacement bitmap\n *\n * @member {number[]}\n */\n prototypeAccessors.sizes.set = function (sizes) {\n var len = Math.min(this._slices, sizes.length);\n\n for (var i = 0; i < len; i++){\n this._sizes[i] = sizes[i];\n }\n };\n prototypeAccessors.sizes.get = function () {\n return this._sizes;\n };\n\n /**\n * Manually set custom slices offset of displacement bitmap, this is\n * a collection of values from -1 to 1. To change the max offset value\n * set `offset`.\n *\n * @member {number[]}\n */\n prototypeAccessors.offsets.set = function (offsets) {\n var len = Math.min(this._slices, offsets.length);\n\n for (var i = 0; i < len; i++){\n this._offsets[i] = offsets[i];\n }\n };\n prototypeAccessors.offsets.get = function () {\n return this._offsets;\n };\n\n /**\n * The count of slices.\n * @member {number}\n * @default 5\n */\n prototypeAccessors.slices.get = function () {\n return this._slices;\n };\n prototypeAccessors.slices.set = function (value) {\n if (this._slices === value) {\n return;\n }\n this._slices = value;\n this.uniforms.slices = value;\n this._sizes = this.uniforms.slicesWidth = new Float32Array(value);\n this._offsets = this.uniforms.slicesOffset = new Float32Array(value);\n this.refresh();\n };\n\n /**\n * The angle in degree of the offset of slices.\n * @member {number}\n * @default 0\n */\n prototypeAccessors.direction.get = function () {\n return this._direction;\n };\n prototypeAccessors.direction.set = function (value) {\n if (this._direction === value) {\n return;\n }\n this._direction = value;\n\n var radians = value * DEG_TO_RAD;\n\n this.uniforms.sinDir = Math.sin(radians);\n this.uniforms.cosDir = Math.cos(radians);\n };\n\n /**\n * Red channel offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.red.get = function () {\n return this.uniforms.red;\n };\n prototypeAccessors.red.set = function (value) {\n this.uniforms.red = value;\n };\n\n /**\n * Green channel offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.green.get = function () {\n return this.uniforms.green;\n };\n prototypeAccessors.green.set = function (value) {\n this.uniforms.green = value;\n };\n\n /**\n * Blue offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.blue.get = function () {\n return this.uniforms.blue;\n };\n prototypeAccessors.blue.set = function (value) {\n this.uniforms.blue = value;\n };\n\n /**\n * Removes all references\n */\n GlitchFilter.prototype.destroy = function destroy () {\n this.texture.destroy(true);\n this.texture = null;\n this._canvas = null;\n this.red = null;\n this.green = null;\n this.blue = null;\n this._sizes = null;\n this._offsets = null;\n };\n\n Object.defineProperties( GlitchFilter.prototype, prototypeAccessors );\n\n return GlitchFilter;\n}(Filter));\n\n/**\n * Fill mode as transparent\n *\n * @constant\n * @static\n * @member {int} TRANSPARENT\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.TRANSPARENT = 0;\n\n/**\n * Fill mode as original\n *\n * @constant\n * @static\n * @member {int} ORIGINAL\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.ORIGINAL = 1;\n\n/**\n * Fill mode as loop\n *\n * @constant\n * @static\n * @member {int} LOOP\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.LOOP = 2;\n\n/**\n * Fill mode as clamp\n *\n * @constant\n * @static\n * @member {int} CLAMP\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.CLAMP = 3;\n\n/**\n * Fill mode as mirror\n *\n * @constant\n * @static\n * @member {int} MIRROR\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.MIRROR = 4;\n\nexport { GlitchFilter };\n//# sourceMappingURL=filter-glitch.esm.js.map\n","/*!\n * @pixi/filter-glow - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-glow is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { rgb2hex, hex2rgb } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nvarying vec4 vColor;\\n\\nuniform sampler2D uSampler;\\n\\nuniform float distance;\\nuniform float outerStrength;\\nuniform float innerStrength;\\nuniform vec4 glowColor;\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\nconst float PI = 3.14159265358979323846264;\\n\\nvoid main(void) {\\n vec2 px = vec2(1.0 / filterArea.x, 1.0 / filterArea.y);\\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\\n vec4 curColor;\\n float totalAlpha = 0.0;\\n float maxTotalAlpha = 0.0;\\n float cosAngle;\\n float sinAngle;\\n vec2 displaced;\\n for (float angle = 0.0; angle <= PI * 2.0; angle += %QUALITY_DIST%) {\\n cosAngle = cos(angle);\\n sinAngle = sin(angle);\\n for (float curDistance = 1.0; curDistance <= %DIST%; curDistance++) {\\n displaced.x = vTextureCoord.x + cosAngle * curDistance * px.x;\\n displaced.y = vTextureCoord.y + sinAngle * curDistance * px.y;\\n curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\\n totalAlpha += (distance - curDistance) * curColor.a;\\n maxTotalAlpha += (distance - curDistance);\\n }\\n }\\n maxTotalAlpha = max(maxTotalAlpha, 0.0001);\\n\\n ownColor.a = max(ownColor.a, 0.0001);\\n ownColor.rgb = ownColor.rgb / ownColor.a;\\n float outerGlowAlpha = (totalAlpha / maxTotalAlpha) * outerStrength * (1. - ownColor.a);\\n float innerGlowAlpha = ((maxTotalAlpha - totalAlpha) / maxTotalAlpha) * innerStrength * ownColor.a;\\n float resultAlpha = (ownColor.a + outerGlowAlpha);\\n gl_FragColor = vec4(mix(mix(ownColor.rgb, glowColor.rgb, innerGlowAlpha / ownColor.a), glowColor.rgb, outerGlowAlpha / resultAlpha) * resultAlpha, resultAlpha);\\n}\\n\";\n\n/**\n * GlowFilter, originally by mishaa\n * http://www.html5gamedevs.com/topic/12756-glow-filter/?hl=mishaa#entry73578\n * http://codepen.io/mishaa/pen/raKzrm
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/glow.png)\n *\n * @class\n *\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-glow|@pixi/filter-glow}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [distance=10] The distance of the glow. Make it 2 times more for resolution=2. It cant be changed after filter creation\n * @param {number} [outerStrength=4] The strength of the glow outward from the edge of the sprite.\n * @param {number} [innerStrength=0] The strength of the glow inward from the edge of the sprite.\n * @param {number} [color=0xffffff] The color of the glow.\n * @param {number} [quality=0.1] A number between 0 and 1 that describes the quality of the glow.\n *\n * @example\n * someSprite.filters = [\n * new GlowFilter(15, 2, 1, 0xFF0000, 0.5)\n * ];\n */\nvar GlowFilter = /*@__PURE__*/(function (Filter) {\n function GlowFilter(distance, outerStrength, innerStrength, color, quality) {\n if ( distance === void 0 ) distance = 10;\n if ( outerStrength === void 0 ) outerStrength = 4;\n if ( innerStrength === void 0 ) innerStrength = 0;\n if ( color === void 0 ) color = 0xffffff;\n if ( quality === void 0 ) quality = 0.1;\n\n Filter.call(this, vertex, fragment\n .replace(/%QUALITY_DIST%/gi, '' + (1 / quality / distance).toFixed(7))\n .replace(/%DIST%/gi, '' + distance.toFixed(7)));\n\n this.uniforms.glowColor = new Float32Array([0, 0, 0, 1]);\n this.distance = distance;\n this.color = color;\n this.outerStrength = outerStrength;\n this.innerStrength = innerStrength;\n }\n\n if ( Filter ) GlowFilter.__proto__ = Filter;\n GlowFilter.prototype = Object.create( Filter && Filter.prototype );\n GlowFilter.prototype.constructor = GlowFilter;\n\n var prototypeAccessors = { color: { configurable: true },distance: { configurable: true },outerStrength: { configurable: true },innerStrength: { configurable: true } };\n\n /**\n * The color of the glow.\n * @member {number}\n * @default 0xFFFFFF\n */\n prototypeAccessors.color.get = function () {\n return rgb2hex(this.uniforms.glowColor);\n };\n prototypeAccessors.color.set = function (value) {\n hex2rgb(value, this.uniforms.glowColor);\n };\n\n /**\n * The distance of the glow. Make it 2 times more for resolution=2. It cant be changed after filter creation\n * @member {number}\n * @default 10\n */\n prototypeAccessors.distance.get = function () {\n return this.uniforms.distance;\n };\n prototypeAccessors.distance.set = function (value) {\n this.uniforms.distance = value;\n };\n\n /**\n * The strength of the glow outward from the edge of the sprite.\n * @member {number}\n * @default 4\n */\n prototypeAccessors.outerStrength.get = function () {\n return this.uniforms.outerStrength;\n };\n prototypeAccessors.outerStrength.set = function (value) {\n this.uniforms.outerStrength = value;\n };\n\n /**\n * The strength of the glow inward from the edge of the sprite.\n * @member {number}\n * @default 0\n */\n prototypeAccessors.innerStrength.get = function () {\n return this.uniforms.innerStrength;\n };\n prototypeAccessors.innerStrength.set = function (value) {\n this.uniforms.innerStrength = value;\n };\n\n Object.defineProperties( GlowFilter.prototype, prototypeAccessors );\n\n return GlowFilter;\n}(Filter));\n\nexport { GlowFilter };\n//# sourceMappingURL=filter-glow.esm.js.map\n","/*!\n * @pixi/filter-godray - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-godray is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { Point, DEG_TO_RAD } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar perlin = \"vec3 mod289(vec3 x)\\n{\\n return x - floor(x * (1.0 / 289.0)) * 289.0;\\n}\\nvec4 mod289(vec4 x)\\n{\\n return x - floor(x * (1.0 / 289.0)) * 289.0;\\n}\\nvec4 permute(vec4 x)\\n{\\n return mod289(((x * 34.0) + 1.0) * x);\\n}\\nvec4 taylorInvSqrt(vec4 r)\\n{\\n return 1.79284291400159 - 0.85373472095314 * r;\\n}\\nvec3 fade(vec3 t)\\n{\\n return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\\n}\\n// Classic Perlin noise, periodic variant\\nfloat pnoise(vec3 P, vec3 rep)\\n{\\n vec3 Pi0 = mod(floor(P), rep); // Integer part, modulo period\\n vec3 Pi1 = mod(Pi0 + vec3(1.0), rep); // Integer part + 1, mod period\\n Pi0 = mod289(Pi0);\\n Pi1 = mod289(Pi1);\\n vec3 Pf0 = fract(P); // Fractional part for interpolation\\n vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0\\n vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\\n vec4 iy = vec4(Pi0.yy, Pi1.yy);\\n vec4 iz0 = Pi0.zzzz;\\n vec4 iz1 = Pi1.zzzz;\\n vec4 ixy = permute(permute(ix) + iy);\\n vec4 ixy0 = permute(ixy + iz0);\\n vec4 ixy1 = permute(ixy + iz1);\\n vec4 gx0 = ixy0 * (1.0 / 7.0);\\n vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;\\n gx0 = fract(gx0);\\n vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\\n vec4 sz0 = step(gz0, vec4(0.0));\\n gx0 -= sz0 * (step(0.0, gx0) - 0.5);\\n gy0 -= sz0 * (step(0.0, gy0) - 0.5);\\n vec4 gx1 = ixy1 * (1.0 / 7.0);\\n vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;\\n gx1 = fract(gx1);\\n vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\\n vec4 sz1 = step(gz1, vec4(0.0));\\n gx1 -= sz1 * (step(0.0, gx1) - 0.5);\\n gy1 -= sz1 * (step(0.0, gy1) - 0.5);\\n vec3 g000 = vec3(gx0.x, gy0.x, gz0.x);\\n vec3 g100 = vec3(gx0.y, gy0.y, gz0.y);\\n vec3 g010 = vec3(gx0.z, gy0.z, gz0.z);\\n vec3 g110 = vec3(gx0.w, gy0.w, gz0.w);\\n vec3 g001 = vec3(gx1.x, gy1.x, gz1.x);\\n vec3 g101 = vec3(gx1.y, gy1.y, gz1.y);\\n vec3 g011 = vec3(gx1.z, gy1.z, gz1.z);\\n vec3 g111 = vec3(gx1.w, gy1.w, gz1.w);\\n vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\\n g000 *= norm0.x;\\n g010 *= norm0.y;\\n g100 *= norm0.z;\\n g110 *= norm0.w;\\n vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\\n g001 *= norm1.x;\\n g011 *= norm1.y;\\n g101 *= norm1.z;\\n g111 *= norm1.w;\\n float n000 = dot(g000, Pf0);\\n float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));\\n float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));\\n float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));\\n float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));\\n float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));\\n float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));\\n float n111 = dot(g111, Pf1);\\n vec3 fade_xyz = fade(Pf0);\\n vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);\\n vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);\\n float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\\n return 2.2 * n_xyz;\\n}\\nfloat turb(vec3 P, vec3 rep, float lacunarity, float gain)\\n{\\n float sum = 0.0;\\n float sc = 1.0;\\n float totalgain = 1.0;\\n for (float i = 0.0; i < 6.0; i++)\\n {\\n sum += totalgain * pnoise(P * sc, rep);\\n sc *= lacunarity;\\n totalgain *= gain;\\n }\\n return abs(sum);\\n}\\n\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\nuniform vec2 dimensions;\\n\\nuniform vec2 light;\\nuniform bool parallel;\\nuniform float aspect;\\n\\nuniform float gain;\\nuniform float lacunarity;\\nuniform float time;\\n\\n${perlin}\\n\\nvoid main(void) {\\n vec2 coord = vTextureCoord * filterArea.xy / dimensions.xy;\\n\\n float d;\\n\\n if (parallel) {\\n float _cos = light.x;\\n float _sin = light.y;\\n d = (_cos * coord.x) + (_sin * coord.y * aspect);\\n } else {\\n float dx = coord.x - light.x / dimensions.x;\\n float dy = (coord.y - light.y / dimensions.y) * aspect;\\n float dis = sqrt(dx * dx + dy * dy) + 0.00001;\\n d = dy / dis;\\n }\\n\\n vec3 dir = vec3(d, d, 0.0);\\n\\n float noise = turb(dir + vec3(time, 0.0, 62.1 + time) * 0.05, vec3(480.0, 320.0, 480.0), lacunarity, gain);\\n noise = mix(noise, 0.0, 0.3);\\n //fade vertically.\\n vec4 mist = vec4(noise, noise, noise, 1.0) * (1.0 - coord.y);\\n mist.a = 1.0;\\n\\n gl_FragColor = texture2D(uSampler, vTextureCoord) + mist;\\n}\\n\";\n\n/**\n * GordayFilter, {@link https://codepen.io/alaingalvan originally} by Alain Galvan\n *\n *\n *\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/godray.gif)\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-godray|@pixi/filter-godray}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @example\n * displayObject.filters = [new GodrayFilter()];\n * @param {object} [options] Filter options\n * @param {number} [options.angle=30] Angle/Light-source of the rays.\n * @param {number} [options.gain=0.5] General intensity of the effect.\n * @param {number} [options.lacunrity=2.5] The density of the fractal noise.\n * @param {boolean} [options.parallel=true] `true` to use `angle`, `false` to use `center`\n * @param {number} [options.time=0] The current time position.\n * @param {PIXI.Point|number[]} [options.center=[0,0]] Focal point for non-parallel rays,\n * to use this `parallel` must be set to `false`.\n */\nvar GodrayFilter = /*@__PURE__*/(function (Filter) {\n function GodrayFilter(options) {\n Filter.call(this, vertex, fragment.replace('${perlin}', perlin));\n\n this.uniforms.dimensions = new Float32Array(2);\n\n // Fallback support for ctor: (angle, gain, lacunarity, time)\n if (typeof options === 'number') {\n // eslint-disable-next-line no-console\n console.warn('GodrayFilter now uses options instead of (angle, gain, lacunarity, time)');\n options = { angle: options };\n if (arguments[1] !== undefined) {\n options.gain = arguments[1];\n }\n if (arguments[2] !== undefined) {\n options.lacunarity = arguments[2];\n }\n if (arguments[3] !== undefined) {\n options.time = arguments[3];\n }\n }\n\n options = Object.assign({\n angle: 30,\n gain: 0.5,\n lacunarity: 2.5,\n time: 0,\n parallel: true,\n center: [0, 0],\n }, options);\n\n this._angleLight = new Point();\n this.angle = options.angle;\n this.gain = options.gain;\n this.lacunarity = options.lacunarity;\n\n /**\n * `true` if light rays are parallel (uses angle),\n * `false` to use the focal `center` point\n *\n * @member {boolean}\n * @default true\n */\n this.parallel = options.parallel;\n\n /**\n * The position of the emitting point for light rays\n * only used if `parallel` is set to `false`.\n *\n * @member {PIXI.Point|number[]}\n * @default [0, 0]\n */\n this.center = options.center;\n\n /**\n * The current time.\n *\n * @member {number}\n * @default 0\n */\n this.time = options.time;\n }\n\n if ( Filter ) GodrayFilter.__proto__ = Filter;\n GodrayFilter.prototype = Object.create( Filter && Filter.prototype );\n GodrayFilter.prototype.constructor = GodrayFilter;\n\n var prototypeAccessors = { angle: { configurable: true },gain: { configurable: true },lacunarity: { configurable: true } };\n\n /**\n * Applies the filter.\n * @private\n * @param {PIXI.FilterManager} filterManager - The manager.\n * @param {PIXI.RenderTarget} input - The input target.\n * @param {PIXI.RenderTarget} output - The output target.\n */\n GodrayFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n var ref = input.filterFrame;\n var width = ref.width;\n var height = ref.height;\n\n this.uniforms.light = this.parallel ? this._angleLight : this.center;\n\n this.uniforms.parallel = this.parallel;\n this.uniforms.dimensions[0] = width;\n this.uniforms.dimensions[1] = height;\n this.uniforms.aspect = height / width;\n this.uniforms.time = this.time;\n\n // draw the filter...\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * The angle/light-source of the rays in degrees. For instance, a value of 0 is vertical rays,\n * values of 90 or -90 produce horizontal rays.\n * @member {number}\n * @default 30\n */\n prototypeAccessors.angle.get = function () {\n return this._angle;\n };\n prototypeAccessors.angle.set = function (value) {\n this._angle = value;\n\n var radians = value * DEG_TO_RAD;\n\n this._angleLight.x = Math.cos(radians);\n this._angleLight.y = Math.sin(radians);\n };\n\n /**\n * General intensity of the effect. A value closer to 1 will produce a more intense effect,\n * where a value closer to 0 will produce a subtler effect.\n *\n * @member {number}\n * @default 0.5\n */\n prototypeAccessors.gain.get = function () {\n return this.uniforms.gain;\n };\n prototypeAccessors.gain.set = function (value) {\n this.uniforms.gain = value;\n };\n\n /**\n * The density of the fractal noise. A higher amount produces more rays and a smaller amound\n * produces fewer waves.\n *\n * @member {number}\n * @default 2.5\n */\n prototypeAccessors.lacunarity.get = function () {\n return this.uniforms.lacunarity;\n };\n prototypeAccessors.lacunarity.set = function (value) {\n this.uniforms.lacunarity = value;\n };\n\n Object.defineProperties( GodrayFilter.prototype, prototypeAccessors );\n\n return GodrayFilter;\n}(Filter));\n\nexport { GodrayFilter };\n//# sourceMappingURL=filter-godray.esm.js.map\n","/*!\n * @pixi/filter-motion-blur - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-motion-blur is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { Point, ObservablePoint } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\n\\nuniform vec2 uVelocity;\\nuniform int uKernelSize;\\nuniform float uOffset;\\n\\nconst int MAX_KERNEL_SIZE = 2048;\\n\\n// Notice:\\n// the perfect way:\\n// int kernelSize = min(uKernelSize, MAX_KERNELSIZE);\\n// BUT in real use-case , uKernelSize < MAX_KERNELSIZE almost always.\\n// So use uKernelSize directly.\\n\\nvoid main(void)\\n{\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n\\n if (uKernelSize == 0)\\n {\\n gl_FragColor = color;\\n return;\\n }\\n\\n vec2 velocity = uVelocity / filterArea.xy;\\n float offset = -uOffset / length(uVelocity) - 0.5;\\n int k = uKernelSize - 1;\\n\\n for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) {\\n if (i == k) {\\n break;\\n }\\n vec2 bias = velocity * (float(i) / float(k) + offset);\\n color += texture2D(uSampler, vTextureCoord + bias);\\n }\\n gl_FragColor = color / float(uKernelSize);\\n}\\n\";\n\n/**\n * The MotionBlurFilter applies a Motion blur to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/motion-blur.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-motion-blur|@pixi/filter-motion-blur}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {PIXI.ObservablePoint|PIXI.Point|number[]} [velocity=[0, 0]] Sets the velocity of the motion for blur effect.\n * @param {number} [kernelSize=5] - The kernelSize of the blur filter. Must be odd number >= 5\n * @param {number} [offset=0] - The offset of the blur filter.\n */\nvar MotionBlurFilter = /*@__PURE__*/(function (Filter) {\n function MotionBlurFilter(velocity, kernelSize, offset) {\n if ( velocity === void 0 ) velocity = [0, 0];\n if ( kernelSize === void 0 ) kernelSize = 5;\n if ( offset === void 0 ) offset = 0;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.uVelocity = new Float32Array(2);\n this._velocity = new ObservablePoint(this.velocityChanged, this);\n this.velocity = velocity;\n\n /**\n * The kernelSize of the blur, higher values are slower but look better.\n * Use odd value greater than 5.\n * @member {number}\n * @default 5\n */\n this.kernelSize = kernelSize;\n this.offset = offset;\n }\n\n if ( Filter ) MotionBlurFilter.__proto__ = Filter;\n MotionBlurFilter.prototype = Object.create( Filter && Filter.prototype );\n MotionBlurFilter.prototype.constructor = MotionBlurFilter;\n\n var prototypeAccessors = { velocity: { configurable: true },offset: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n MotionBlurFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n var ref = this.velocity;\n var x = ref.x;\n var y = ref.y;\n\n this.uniforms.uKernelSize = (x !== 0 || y !== 0) ? this.kernelSize : 0;\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Sets the velocity of the motion for blur effect.\n *\n * @member {PIXI.ObservablePoint}\n */\n prototypeAccessors.velocity.set = function (value) {\n if (Array.isArray(value)) {\n this._velocity.set(value[0], value[1]);\n }\n else if (value instanceof Point || value instanceof ObservablePoint) {\n this._velocity.copy(value);\n }\n };\n\n prototypeAccessors.velocity.get = function () {\n return this._velocity;\n };\n\n /**\n * Handle velocity changed\n * @private\n */\n MotionBlurFilter.prototype.velocityChanged = function velocityChanged () {\n this.uniforms.uVelocity[0] = this._velocity.x;\n this.uniforms.uVelocity[1] = this._velocity.y;\n };\n\n /**\n * The offset of the blur filter.\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.offset.set = function (value) {\n this.uniforms.uOffset = value;\n };\n\n prototypeAccessors.offset.get = function () {\n return this.uniforms.uOffset;\n };\n\n Object.defineProperties( MotionBlurFilter.prototype, prototypeAccessors );\n\n return MotionBlurFilter;\n}(Filter));\n\nexport { MotionBlurFilter };\n//# sourceMappingURL=filter-motion-blur.esm.js.map\n","/*!\n * @pixi/filter-multi-color-replace - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-multi-color-replace is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { hex2rgb, rgb2hex } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform float epsilon;\\n\\nconst int MAX_COLORS = %maxColors%;\\n\\nuniform vec3 originalColors[MAX_COLORS];\\nuniform vec3 targetColors[MAX_COLORS];\\n\\nvoid main(void)\\n{\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n\\n float alpha = gl_FragColor.a;\\n if (alpha < 0.0001)\\n {\\n return;\\n }\\n\\n vec3 color = gl_FragColor.rgb / alpha;\\n\\n for(int i = 0; i < MAX_COLORS; i++)\\n {\\n vec3 origColor = originalColors[i];\\n if (origColor.r < 0.0)\\n {\\n break;\\n }\\n vec3 colorDiff = origColor - color;\\n if (length(colorDiff) < epsilon)\\n {\\n vec3 targetColor = targetColors[i];\\n gl_FragColor = vec4((targetColor + colorDiff) * alpha, alpha);\\n return;\\n }\\n }\\n}\\n\";\n\n/**\n * Filter for replacing a color with another color. Similar to ColorReplaceFilter, but support multiple\n * colors.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/multi-color-replace.png)\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-multi-color-replace|@pixi/filter-multi-color-replace}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {Array} replacements - The collection of replacement items. Each item is color-pair (an array length is 2).\n * In the pair, the first value is original color , the second value is target color.\n * @param {number} [epsilon=0.05] - Tolerance of the floating-point comparison between colors\n * (lower = more exact, higher = more inclusive)\n * @param {number} [maxColors] - The maximum number of replacements filter is able to use. Because the\n * fragment is only compiled once, this cannot be changed after construction.\n * If omitted, the default value is the length of `replacements`.\n *\n * @example\n * // replaces pure red with pure blue, and replaces pure green with pure white\n * someSprite.filters = [new MultiColorReplaceFilter(\n * [\n * [0xFF0000, 0x0000FF],\n * [0x00FF00, 0xFFFFFF]\n * ],\n * 0.001\n * )];\n *\n * You also could use [R, G, B] as the color\n * someOtherSprite.filters = [new MultiColorReplaceFilter(\n * [\n * [ [1,0,0], [0,0,1] ],\n * [ [0,1,0], [1,1,1] ]\n * ],\n * 0.001\n * )];\n *\n */\nvar MultiColorReplaceFilter = /*@__PURE__*/(function (Filter) {\n function MultiColorReplaceFilter(replacements, epsilon, maxColors) {\n if ( epsilon === void 0 ) epsilon = 0.05;\n if ( maxColors === void 0 ) maxColors = null;\n\n maxColors = maxColors || replacements.length;\n\n Filter.call(this, vertex, fragment.replace(/%maxColors%/g, maxColors));\n\n this.epsilon = epsilon;\n this._maxColors = maxColors;\n this._replacements = null;\n this.uniforms.originalColors = new Float32Array(maxColors * 3);\n this.uniforms.targetColors = new Float32Array(maxColors * 3);\n this.replacements = replacements;\n }\n\n if ( Filter ) MultiColorReplaceFilter.__proto__ = Filter;\n MultiColorReplaceFilter.prototype = Object.create( Filter && Filter.prototype );\n MultiColorReplaceFilter.prototype.constructor = MultiColorReplaceFilter;\n\n var prototypeAccessors = { replacements: { configurable: true },maxColors: { configurable: true },epsilon: { configurable: true } };\n\n /**\n * The source and target colors for replacement. See constructor for information on the format.\n *\n * @member {Array}\n */\n prototypeAccessors.replacements.set = function (replacements) {\n var originals = this.uniforms.originalColors;\n var targets = this.uniforms.targetColors;\n var colorCount = replacements.length;\n\n if (colorCount > this._maxColors) {\n throw (\"Length of replacements (\" + colorCount + \") exceeds the maximum colors length (\" + (this._maxColors) + \")\");\n }\n\n // Fill with negative values\n originals[colorCount * 3] = -1;\n\n for (var i = 0; i < colorCount; i++) {\n var pair = replacements[i];\n\n // for original colors\n var color = pair[0];\n if (typeof color === 'number') {\n color = hex2rgb(color);\n }\n else {\n pair[0] = rgb2hex(color);\n }\n\n originals[i * 3] = color[0];\n originals[(i * 3) + 1] = color[1];\n originals[(i * 3) + 2] = color[2];\n\n // for target colors\n var targetColor = pair[1];\n if (typeof targetColor === 'number') {\n targetColor = hex2rgb(targetColor);\n }\n else {\n pair[1] = rgb2hex(targetColor);\n }\n\n targets[i * 3] = targetColor[0];\n targets[(i * 3) + 1] = targetColor[1];\n targets[(i * 3) + 2] = targetColor[2];\n }\n\n this._replacements = replacements;\n };\n prototypeAccessors.replacements.get = function () {\n return this._replacements;\n };\n\n /**\n * Should be called after changing any of the contents of the replacements.\n * This is a convenience method for resetting the `replacements`.\n */\n MultiColorReplaceFilter.prototype.refresh = function refresh () {\n this.replacements = this._replacements;\n };\n\n /**\n * The maximum number of color replacements supported by this filter. Can be changed\n * _only_ during construction.\n *\n * @member {number}\n * @readonly\n */\n prototypeAccessors.maxColors.get = function () {\n return this._maxColors;\n };\n\n /**\n * Tolerance of the floating-point comparison between colors (lower = more exact, higher = more inclusive)\n *\n * @member {number}\n * @default 0.05\n */\n prototypeAccessors.epsilon.set = function (value) {\n this.uniforms.epsilon = value;\n };\n prototypeAccessors.epsilon.get = function () {\n return this.uniforms.epsilon;\n };\n\n Object.defineProperties( MultiColorReplaceFilter.prototype, prototypeAccessors );\n\n return MultiColorReplaceFilter;\n}(Filter));\n\nexport { MultiColorReplaceFilter };\n//# sourceMappingURL=filter-multi-color-replace.esm.js.map\n","/*!\n * @pixi/filter-old-film - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-old-film is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\nuniform vec2 dimensions;\\n\\nuniform float sepia;\\nuniform float noise;\\nuniform float noiseSize;\\nuniform float scratch;\\nuniform float scratchDensity;\\nuniform float scratchWidth;\\nuniform float vignetting;\\nuniform float vignettingAlpha;\\nuniform float vignettingBlur;\\nuniform float seed;\\n\\nconst float SQRT_2 = 1.414213;\\nconst vec3 SEPIA_RGB = vec3(112.0 / 255.0, 66.0 / 255.0, 20.0 / 255.0);\\n\\nfloat rand(vec2 co) {\\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\\n}\\n\\nvec3 Overlay(vec3 src, vec3 dst)\\n{\\n // if (dst <= 0.5) then: 2 * src * dst\\n // if (dst > 0.5) then: 1 - 2 * (1 - dst) * (1 - src)\\n return vec3((dst.x <= 0.5) ? (2.0 * src.x * dst.x) : (1.0 - 2.0 * (1.0 - dst.x) * (1.0 - src.x)),\\n (dst.y <= 0.5) ? (2.0 * src.y * dst.y) : (1.0 - 2.0 * (1.0 - dst.y) * (1.0 - src.y)),\\n (dst.z <= 0.5) ? (2.0 * src.z * dst.z) : (1.0 - 2.0 * (1.0 - dst.z) * (1.0 - src.z)));\\n}\\n\\n\\nvoid main()\\n{\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n vec3 color = gl_FragColor.rgb;\\n\\n if (sepia > 0.0)\\n {\\n float gray = (color.x + color.y + color.z) / 3.0;\\n vec3 grayscale = vec3(gray);\\n\\n color = Overlay(SEPIA_RGB, grayscale);\\n\\n color = grayscale + sepia * (color - grayscale);\\n }\\n\\n vec2 coord = vTextureCoord * filterArea.xy / dimensions.xy;\\n\\n if (vignetting > 0.0)\\n {\\n float outter = SQRT_2 - vignetting * SQRT_2;\\n vec2 dir = vec2(vec2(0.5, 0.5) - coord);\\n dir.y *= dimensions.y / dimensions.x;\\n float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0);\\n color.rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha);\\n }\\n\\n if (scratchDensity > seed && scratch != 0.0)\\n {\\n float phase = seed * 256.0;\\n float s = mod(floor(phase), 2.0);\\n float dist = 1.0 / scratchDensity;\\n float d = distance(coord, vec2(seed * dist, abs(s - seed * dist)));\\n if (d < seed * 0.6 + 0.4)\\n {\\n highp float period = scratchDensity * 10.0;\\n\\n float xx = coord.x * period + phase;\\n float aa = abs(mod(xx, 0.5) * 4.0);\\n float bb = mod(floor(xx / 0.5), 2.0);\\n float yy = (1.0 - bb) * aa + bb * (2.0 - aa);\\n\\n float kk = 2.0 * period;\\n float dw = scratchWidth / dimensions.x * (0.75 + seed);\\n float dh = dw * kk;\\n\\n float tine = (yy - (2.0 - dh));\\n\\n if (tine > 0.0) {\\n float _sign = sign(scratch);\\n\\n tine = s * tine / period + scratch + 0.1;\\n tine = clamp(tine + 1.0, 0.5 + _sign * 0.5, 1.5 + _sign * 0.5);\\n\\n color.rgb *= tine;\\n }\\n }\\n }\\n\\n if (noise > 0.0 && noiseSize > 0.0)\\n {\\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\\n pixelCoord.x = floor(pixelCoord.x / noiseSize);\\n pixelCoord.y = floor(pixelCoord.y / noiseSize);\\n // vec2 d = pixelCoord * noiseSize * vec2(1024.0 + seed * 512.0, 1024.0 - seed * 512.0);\\n // float _noise = snoise(d) * 0.5;\\n float _noise = rand(pixelCoord * noiseSize * seed) - 0.5;\\n color += _noise * noise;\\n }\\n\\n gl_FragColor.rgb = color;\\n}\\n\";\n\n/**\n * The OldFilmFilter applies a Old film effect to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/old-film.gif)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-old-film|@pixi/filter-old-film}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object|number} [options] - The optional parameters of old film effect.\n * When options is a number , it will be `seed`\n * @param {number} [options.sepia=0.3] - The amount of saturation of sepia effect,\n * a value of `1` is more saturation and closer to `0` is less, and a value of\n * `0` produces no sepia effect\n * @param {number} [options.noise=0.3] - Opacity/intensity of the noise effect between `0` and `1`\n * @param {number} [options.noiseSize=1.0] - The size of the noise particles\n * @param {number} [options.scratch=0.5] - How often scratches appear\n * @param {number} [options.scratchDensity=0.3] - The density of the number of scratches\n * @param {number} [options.scratchWidth=1.0] - The width of the scratches\n * @param {number} [options.vignetting=0.3] - The radius of the vignette effect, smaller\n * values produces a smaller vignette\n * @param {number} [options.vignettingAlpha=1.0] - Amount of opacity of vignette\n * @param {number} [options.vignettingBlur=0.3] - Blur intensity of the vignette\n * @param {number} [seed=0] - A see value to apply to the random noise generation\n */\nvar OldFilmFilter = /*@__PURE__*/(function (Filter) {\n function OldFilmFilter(options, seed) {\n if ( seed === void 0 ) seed = 0;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n\n if (typeof options === 'number') {\n this.seed = options;\n options = null;\n }\n else {\n /**\n * A see value to apply to the random noise generation\n * @member {number}\n */\n this.seed = seed;\n }\n\n Object.assign(this, {\n sepia: 0.3,\n noise: 0.3,\n noiseSize: 1.0,\n scratch: 0.5,\n scratchDensity: 0.3,\n scratchWidth: 1.0,\n vignetting: 0.3,\n vignettingAlpha: 1.0,\n vignettingBlur: 0.3,\n }, options);\n }\n\n if ( Filter ) OldFilmFilter.__proto__ = Filter;\n OldFilmFilter.prototype = Object.create( Filter && Filter.prototype );\n OldFilmFilter.prototype.constructor = OldFilmFilter;\n\n var prototypeAccessors = { sepia: { configurable: true },noise: { configurable: true },noiseSize: { configurable: true },scratch: { configurable: true },scratchDensity: { configurable: true },scratchWidth: { configurable: true },vignetting: { configurable: true },vignettingAlpha: { configurable: true },vignettingBlur: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n OldFilmFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n\n // named `seed` because in the most programming languages,\n // `random` used for \"the function for generating random value\".\n this.uniforms.seed = this.seed;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n\n /**\n * The amount of saturation of sepia effect,\n * a value of `1` is more saturation and closer to `0` is less,\n * and a value of `0` produces no sepia effect\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.sepia.set = function (value) {\n this.uniforms.sepia = value;\n };\n\n prototypeAccessors.sepia.get = function () {\n return this.uniforms.sepia;\n };\n\n /**\n * Opacity/intensity of the noise effect between `0` and `1`\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.noise.set = function (value) {\n this.uniforms.noise = value;\n };\n\n prototypeAccessors.noise.get = function () {\n return this.uniforms.noise;\n };\n\n /**\n * The size of the noise particles\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.noiseSize.set = function (value) {\n this.uniforms.noiseSize = value;\n };\n\n prototypeAccessors.noiseSize.get = function () {\n return this.uniforms.noiseSize;\n };\n\n /**\n * How often scratches appear\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.scratch.set = function (value) {\n this.uniforms.scratch = value;\n };\n\n prototypeAccessors.scratch.get = function () {\n return this.uniforms.scratch;\n };\n\n /**\n * The density of the number of scratches\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.scratchDensity.set = function (value) {\n this.uniforms.scratchDensity = value;\n };\n\n prototypeAccessors.scratchDensity.get = function () {\n return this.uniforms.scratchDensity;\n };\n\n /**\n * The width of the scratches\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.scratchWidth.set = function (value) {\n this.uniforms.scratchWidth = value;\n };\n\n prototypeAccessors.scratchWidth.get = function () {\n return this.uniforms.scratchWidth;\n };\n\n /**\n * The radius of the vignette effect, smaller\n * values produces a smaller vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignetting.set = function (value) {\n this.uniforms.vignetting = value;\n };\n\n prototypeAccessors.vignetting.get = function () {\n return this.uniforms.vignetting;\n };\n\n /**\n * Amount of opacity of vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignettingAlpha.set = function (value) {\n this.uniforms.vignettingAlpha = value;\n };\n\n prototypeAccessors.vignettingAlpha.get = function () {\n return this.uniforms.vignettingAlpha;\n };\n\n /**\n * Blur intensity of the vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignettingBlur.set = function (value) {\n this.uniforms.vignettingBlur = value;\n };\n\n prototypeAccessors.vignettingBlur.get = function () {\n return this.uniforms.vignettingBlur;\n };\n\n Object.defineProperties( OldFilmFilter.prototype, prototypeAccessors );\n\n return OldFilmFilter;\n}(Filter));\n\nexport { OldFilmFilter };\n//# sourceMappingURL=filter-old-film.esm.js.map\n","/*!\n * @pixi/filter-outline - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-outline is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { rgb2hex, hex2rgb } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec2 thickness;\\nuniform vec4 outlineColor;\\nuniform vec4 filterClamp;\\n\\nconst float DOUBLE_PI = 3.14159265358979323846264 * 2.;\\n\\nvoid main(void) {\\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\\n vec4 curColor;\\n float maxAlpha = 0.;\\n vec2 displaced;\\n for (float angle = 0.; angle <= DOUBLE_PI; angle += ${angleStep}) {\\n displaced.x = vTextureCoord.x + thickness.x * cos(angle);\\n displaced.y = vTextureCoord.y + thickness.y * sin(angle);\\n curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\\n maxAlpha = max(maxAlpha, curColor.a);\\n }\\n float resultAlpha = max(maxAlpha, ownColor.a);\\n gl_FragColor = vec4((ownColor.rgb + outlineColor.rgb * (1. - ownColor.a)) * resultAlpha, resultAlpha);\\n}\\n\";\n\n/**\n * OutlineFilter, originally by mishaa\n * http://www.html5gamedevs.com/topic/10640-outline-a-sprite-change-certain-colors/?p=69966\n * http://codepen.io/mishaa/pen/emGNRB
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/outline.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-outline|@pixi/filter-outline}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [thickness=1] The tickness of the outline. Make it 2 times more for resolution 2\n * @param {number} [color=0x000000] The color of the outline.\n * @param {number} [quality=0.1] The quality of the outline from `0` to `1`, using a higher quality\n * setting will result in slower performance and more accuracy.\n *\n * @example\n * someSprite.shader = new OutlineFilter(9, 0xFF0000);\n */\nvar OutlineFilter = /*@__PURE__*/(function (Filter) {\n function OutlineFilter(thickness, color, quality) {\n if ( thickness === void 0 ) thickness = 1;\n if ( color === void 0 ) color = 0x000000;\n if ( quality === void 0 ) quality = 0.1;\n\n var samples = Math.max(\n quality * OutlineFilter.MAX_SAMPLES,\n OutlineFilter.MIN_SAMPLES\n );\n var angleStep = (Math.PI * 2 / samples).toFixed(7);\n\n Filter.call(this, vertex, fragment.replace(/\\$\\{angleStep\\}/, angleStep));\n this.uniforms.thickness = new Float32Array([0, 0]);\n\n /**\n * The thickness of the outline.\n * @member {number}\n * @default 1\n */\n this.thickness = thickness;\n\n this.uniforms.outlineColor = new Float32Array([0, 0, 0, 1]);\n this.color = color;\n\n this.quality = quality;\n }\n\n if ( Filter ) OutlineFilter.__proto__ = Filter;\n OutlineFilter.prototype = Object.create( Filter && Filter.prototype );\n OutlineFilter.prototype.constructor = OutlineFilter;\n\n var prototypeAccessors = { color: { configurable: true } };\n\n OutlineFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.thickness[0] = this.thickness / input._frame.width;\n this.uniforms.thickness[1] = this.thickness / input._frame.height;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * The color of the glow.\n * @member {number}\n * @default 0x000000\n */\n prototypeAccessors.color.get = function () {\n return rgb2hex(this.uniforms.outlineColor);\n };\n prototypeAccessors.color.set = function (value) {\n hex2rgb(value, this.uniforms.outlineColor);\n };\n\n Object.defineProperties( OutlineFilter.prototype, prototypeAccessors );\n\n return OutlineFilter;\n}(Filter));\n\n/**\n * The minimum number of samples for rendering outline.\n * @static\n * @member {number} MIN_SAMPLES\n * @memberof PIXI.filters.OutlineFilter\n * @default 1\n */\nOutlineFilter.MIN_SAMPLES = 1;\n\n/**\n * The maximum number of samples for rendering outline.\n * @static\n * @member {number} MAX_SAMPLES\n * @memberof PIXI.filters.OutlineFilter\n * @default 100\n */\nOutlineFilter.MAX_SAMPLES = 100;\n\nexport { OutlineFilter };\n//# sourceMappingURL=filter-outline.esm.js.map\n","/*!\n * @pixi/filter-pixelate - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-pixelate is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform vec2 size;\\nuniform sampler2D uSampler;\\n\\nuniform vec4 filterArea;\\n\\nvec2 mapCoord( vec2 coord )\\n{\\n coord *= filterArea.xy;\\n coord += filterArea.zw;\\n\\n return coord;\\n}\\n\\nvec2 unmapCoord( vec2 coord )\\n{\\n coord -= filterArea.zw;\\n coord /= filterArea.xy;\\n\\n return coord;\\n}\\n\\nvec2 pixelate(vec2 coord, vec2 size)\\n{\\n\\treturn floor( coord / size ) * size;\\n}\\n\\nvoid main(void)\\n{\\n vec2 coord = mapCoord(vTextureCoord);\\n\\n coord = pixelate(coord, size);\\n\\n coord = unmapCoord(coord);\\n\\n gl_FragColor = texture2D(uSampler, coord);\\n}\\n\";\n\n/**\n * This filter applies a pixelate effect making display objects appear 'blocky'.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/pixelate.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-pixelate|@pixi/filter-pixelate}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {PIXI.Point|Array|number} [size=10] Either the width/height of the size of the pixels, or square size\n */\nvar PixelateFilter = /*@__PURE__*/(function (Filter) {\n function PixelateFilter(size) {\n if ( size === void 0 ) size = 10;\n\n Filter.call(this, vertex, fragment);\n this.size = size;\n }\n\n if ( Filter ) PixelateFilter.__proto__ = Filter;\n PixelateFilter.prototype = Object.create( Filter && Filter.prototype );\n PixelateFilter.prototype.constructor = PixelateFilter;\n\n var prototypeAccessors = { size: { configurable: true } };\n\n /**\n * This a point that describes the size of the blocks.\n * x is the width of the block and y is the height.\n *\n * @member {PIXI.Point|Array|number}\n * @default 10\n */\n prototypeAccessors.size.get = function () {\n return this.uniforms.size;\n };\n prototypeAccessors.size.set = function (value) {\n if (typeof value === 'number') {\n value = [value, value];\n }\n this.uniforms.size = value;\n };\n\n Object.defineProperties( PixelateFilter.prototype, prototypeAccessors );\n\n return PixelateFilter;\n}(Filter));\n\nexport { PixelateFilter };\n//# sourceMappingURL=filter-pixelate.esm.js.map\n","/*!\n * @pixi/filter-radial-blur - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-radial-blur is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\n\\nuniform float uRadian;\\nuniform vec2 uCenter;\\nuniform float uRadius;\\nuniform int uKernelSize;\\n\\nconst int MAX_KERNEL_SIZE = 2048;\\n\\nvoid main(void)\\n{\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n\\n if (uKernelSize == 0)\\n {\\n gl_FragColor = color;\\n return;\\n }\\n\\n float aspect = filterArea.y / filterArea.x;\\n vec2 center = uCenter.xy / filterArea.xy;\\n float gradient = uRadius / filterArea.x * 0.3;\\n float radius = uRadius / filterArea.x - gradient * 0.5;\\n int k = uKernelSize - 1;\\n\\n vec2 coord = vTextureCoord;\\n vec2 dir = vec2(center - coord);\\n float dist = length(vec2(dir.x, dir.y * aspect));\\n\\n float radianStep = uRadian;\\n if (radius >= 0.0 && dist > radius) {\\n float delta = dist - radius;\\n float gap = gradient;\\n float scale = 1.0 - abs(delta / gap);\\n if (scale <= 0.0) {\\n gl_FragColor = color;\\n return;\\n }\\n radianStep *= scale;\\n }\\n radianStep /= float(k);\\n\\n float s = sin(radianStep);\\n float c = cos(radianStep);\\n mat2 rotationMatrix = mat2(vec2(c, -s), vec2(s, c));\\n\\n for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) {\\n if (i == k) {\\n break;\\n }\\n\\n coord -= center;\\n coord.y *= aspect;\\n coord = rotationMatrix * coord;\\n coord.y /= aspect;\\n coord += center;\\n\\n vec4 sample = texture2D(uSampler, coord);\\n\\n // switch to pre-multiplied alpha to correctly blur transparent images\\n // sample.rgb *= sample.a;\\n\\n color += sample;\\n }\\n\\n gl_FragColor = color / float(uKernelSize);\\n}\\n\";\n\n/**\n * The RadialBlurFilter applies a Motion blur to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/radial-blur.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-radial-blur|@pixi/filter-radial-blur}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [angle=0] Sets the angle of the motion for blur effect.\n * @param {PIXI.Point|number[]} [center=[0,0]] The center of the radial.\n * @param {number} [kernelSize=5] - The kernelSize of the blur filter. But be odd number >= 3\n * @param {number} [radius=-1] - The maximum size of the blur radius, `-1` is infinite\n */\nvar RadialBlurFilter = /*@__PURE__*/(function (Filter) {\n function RadialBlurFilter(angle, center, kernelSize, radius) {\n if ( angle === void 0 ) angle = 0;\n if ( center === void 0 ) center = [0, 0];\n if ( kernelSize === void 0 ) kernelSize = 5;\n if ( radius === void 0 ) radius = -1;\n\n Filter.call(this, vertex, fragment);\n\n this._angle = 0;\n this.angle = angle;\n this.center = center;\n this.kernelSize = kernelSize;\n this.radius = radius;\n }\n\n if ( Filter ) RadialBlurFilter.__proto__ = Filter;\n RadialBlurFilter.prototype = Object.create( Filter && Filter.prototype );\n RadialBlurFilter.prototype.constructor = RadialBlurFilter;\n\n var prototypeAccessors = { angle: { configurable: true },center: { configurable: true },radius: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n RadialBlurFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.uKernelSize = this._angle !== 0 ? this.kernelSize : 0;\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Sets the angle in degrees of the motion for blur effect.\n *\n * @member {PIXI.Point|number[]}\n * @default [0, 0]\n */\n prototypeAccessors.angle.set = function (value) {\n this._angle = value;\n this.uniforms.uRadian = value * Math.PI / 180;\n };\n\n prototypeAccessors.angle.get = function () {\n return this._angle;\n };\n\n /**\n * Center of the effect.\n *\n * @member {PIXI.Point|number[]}\n * @default [0, 0]\n */\n prototypeAccessors.center.get = function () {\n return this.uniforms.uCenter;\n };\n\n prototypeAccessors.center.set = function (value) {\n this.uniforms.uCenter = value;\n };\n\n /**\n * Outer radius of the effect. The default value of `-1` is infinite.\n *\n * @member {number}\n * @default -1\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.uRadius;\n };\n\n prototypeAccessors.radius.set = function (value) {\n if (value < 0 || value === Infinity) {\n value = -1;\n }\n this.uniforms.uRadius = value;\n };\n\n Object.defineProperties( RadialBlurFilter.prototype, prototypeAccessors );\n\n return RadialBlurFilter;\n}(Filter));\n\nexport { RadialBlurFilter };\n//# sourceMappingURL=filter-radial-blur.esm.js.map\n","/*!\n * @pixi/filter-reflection - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-reflection is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\nuniform vec2 dimensions;\\n\\nuniform bool mirror;\\nuniform float boundary;\\nuniform vec2 amplitude;\\nuniform vec2 waveLength;\\nuniform vec2 alpha;\\nuniform float time;\\n\\nfloat rand(vec2 co) {\\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\\n}\\n\\nvoid main(void)\\n{\\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\\n vec2 coord = pixelCoord / dimensions;\\n\\n if (coord.y < boundary) {\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n return;\\n }\\n\\n float k = (coord.y - boundary) / (1. - boundary + 0.0001);\\n float areaY = boundary * dimensions.y / filterArea.y;\\n float v = areaY + areaY - vTextureCoord.y;\\n float y = mirror ? v : vTextureCoord.y;\\n\\n float _amplitude = ((amplitude.y - amplitude.x) * k + amplitude.x ) / filterArea.x;\\n float _waveLength = ((waveLength.y - waveLength.x) * k + waveLength.x) / filterArea.y;\\n float _alpha = (alpha.y - alpha.x) * k + alpha.x;\\n\\n float x = vTextureCoord.x + cos(v * 6.28 / _waveLength - time) * _amplitude;\\n x = clamp(x, filterClamp.x, filterClamp.z);\\n\\n vec4 color = texture2D(uSampler, vec2(x, y));\\n\\n gl_FragColor = color * _alpha;\\n}\\n\";\n\n/**\n * Applies a reflection effect to simulate the reflection on water with waves.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/reflection.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-reflection|@pixi/filter-reflection}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object} [options] - The optional parameters of Reflection effect.\n * @param {number} [options.mirror=true] - `true` to reflect the image, `false` for waves-only\n * @param {number} [options.boundary=0.5] - Vertical position of the reflection point, default is 50% (middle)\n * smaller numbers produce a larger reflection, larger numbers produce a smaller reflection.\n * @param {number} [options.amplitude=[0, 20]] - Starting and ending amplitude of waves\n * @param {number} [options.waveLength=[30, 100]] - Starting and ending length of waves\n * @param {number} [options.alpha=[1, 1]] - Starting and ending alpha values\n * @param {number} [options.time=0] - Time for animating position of waves\n */\nvar ReflectionFilter = /*@__PURE__*/(function (Filter) {\n function ReflectionFilter(options) {\n Filter.call(this, vertex, fragment);\n this.uniforms.amplitude = new Float32Array(2);\n this.uniforms.waveLength = new Float32Array(2);\n this.uniforms.alpha = new Float32Array(2);\n this.uniforms.dimensions = new Float32Array(2);\n\n Object.assign(this, {\n mirror: true,\n boundary: 0.5,\n amplitude: [0, 20],\n waveLength: [30, 100],\n alpha: [1, 1],\n\n /**\n * Time for animating position of waves\n *\n * @member {number}\n * @memberof PIXI.filters.ReflectionFilter#\n * @default 0\n */\n time: 0,\n }, options);\n }\n\n if ( Filter ) ReflectionFilter.__proto__ = Filter;\n ReflectionFilter.prototype = Object.create( Filter && Filter.prototype );\n ReflectionFilter.prototype.constructor = ReflectionFilter;\n\n var prototypeAccessors = { mirror: { configurable: true },boundary: { configurable: true },amplitude: { configurable: true },waveLength: { configurable: true },alpha: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n ReflectionFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n\n this.uniforms.time = this.time;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * `true` to reflect the image, `false` for waves-only\n *\n * @member {boolean}\n * @default true\n */\n prototypeAccessors.mirror.set = function (value) {\n this.uniforms.mirror = value;\n };\n prototypeAccessors.mirror.get = function () {\n return this.uniforms.mirror;\n };\n\n /**\n * Vertical position of the reflection point, default is 50% (middle)\n * smaller numbers produce a larger reflection, larger numbers produce a smaller reflection.\n *\n * @member {number}\n * @default 0.5\n */\n prototypeAccessors.boundary.set = function (value) {\n this.uniforms.boundary = value;\n };\n prototypeAccessors.boundary.get = function () {\n return this.uniforms.boundary;\n };\n\n /**\n * Starting and ending amplitude of waves\n * @member {number[]}\n * @default [0, 20]\n */\n prototypeAccessors.amplitude.set = function (value) {\n this.uniforms.amplitude[0] = value[0];\n this.uniforms.amplitude[1] = value[1];\n };\n prototypeAccessors.amplitude.get = function () {\n return this.uniforms.amplitude;\n };\n\n /**\n * Starting and ending length of waves\n * @member {number[]}\n * @default [30, 100]\n */\n prototypeAccessors.waveLength.set = function (value) {\n this.uniforms.waveLength[0] = value[0];\n this.uniforms.waveLength[1] = value[1];\n };\n prototypeAccessors.waveLength.get = function () {\n return this.uniforms.waveLength;\n };\n\n /**\n * Starting and ending alpha values\n * @member {number[]}\n * @default [1, 1]\n */\n prototypeAccessors.alpha.set = function (value) {\n this.uniforms.alpha[0] = value[0];\n this.uniforms.alpha[1] = value[1];\n };\n prototypeAccessors.alpha.get = function () {\n return this.uniforms.alpha;\n };\n\n Object.defineProperties( ReflectionFilter.prototype, prototypeAccessors );\n\n return ReflectionFilter;\n}(Filter));\n\nexport { ReflectionFilter };\n//# sourceMappingURL=filter-reflection.esm.js.map\n","/*!\n * @pixi/filter-rgb-split - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-rgb-split is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\nuniform vec2 red;\\nuniform vec2 green;\\nuniform vec2 blue;\\n\\nvoid main(void)\\n{\\n gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/filterArea.xy).r;\\n gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/filterArea.xy).g;\\n gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/filterArea.xy).b;\\n gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;\\n}\\n\";\n\n/**\n * An RGB Split Filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/rgb.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-rgb-split|@pixi/filter-rgb-split}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {PIXI.Point} [red=[-10,0]] Red channel offset\n * @param {PIXI.Point} [green=[0, 10]] Green channel offset\n * @param {PIXI.Point} [blue=[0, 0]] Blue channel offset\n */\nvar RGBSplitFilter = /*@__PURE__*/(function (Filter) {\n function RGBSplitFilter(red, green, blue) {\n if ( red === void 0 ) red = [-10, 0];\n if ( green === void 0 ) green = [0, 10];\n if ( blue === void 0 ) blue = [0, 0];\n\n Filter.call(this, vertex, fragment);\n this.red = red;\n this.green = green;\n this.blue = blue;\n }\n\n if ( Filter ) RGBSplitFilter.__proto__ = Filter;\n RGBSplitFilter.prototype = Object.create( Filter && Filter.prototype );\n RGBSplitFilter.prototype.constructor = RGBSplitFilter;\n\n var prototypeAccessors = { red: { configurable: true },green: { configurable: true },blue: { configurable: true } };\n\n /**\n * Red channel offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.red.get = function () {\n return this.uniforms.red;\n };\n prototypeAccessors.red.set = function (value) {\n this.uniforms.red = value;\n };\n\n /**\n * Green channel offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.green.get = function () {\n return this.uniforms.green;\n };\n prototypeAccessors.green.set = function (value) {\n this.uniforms.green = value;\n };\n\n /**\n * Blue offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.blue.get = function () {\n return this.uniforms.blue;\n };\n prototypeAccessors.blue.set = function (value) {\n this.uniforms.blue = value;\n };\n\n Object.defineProperties( RGBSplitFilter.prototype, prototypeAccessors );\n\n return RGBSplitFilter;\n}(Filter));\n\nexport { RGBSplitFilter };\n//# sourceMappingURL=filter-rgb-split.esm.js.map\n","/*!\n * @pixi/filter-shockwave - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-shockwave is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\n\\nuniform vec2 center;\\n\\nuniform float amplitude;\\nuniform float wavelength;\\n// uniform float power;\\nuniform float brightness;\\nuniform float speed;\\nuniform float radius;\\n\\nuniform float time;\\n\\nconst float PI = 3.14159;\\n\\nvoid main()\\n{\\n float halfWavelength = wavelength * 0.5 / filterArea.x;\\n float maxRadius = radius / filterArea.x;\\n float currentRadius = time * speed / filterArea.x;\\n\\n float fade = 1.0;\\n\\n if (maxRadius > 0.0) {\\n if (currentRadius > maxRadius) {\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n return;\\n }\\n fade = 1.0 - pow(currentRadius / maxRadius, 2.0);\\n }\\n\\n vec2 dir = vec2(vTextureCoord - center / filterArea.xy);\\n dir.y *= filterArea.y / filterArea.x;\\n float dist = length(dir);\\n\\n if (dist <= 0.0 || dist < currentRadius - halfWavelength || dist > currentRadius + halfWavelength) {\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n return;\\n }\\n\\n vec2 diffUV = normalize(dir);\\n\\n float diff = (dist - currentRadius) / halfWavelength;\\n\\n float p = 1.0 - pow(abs(diff), 2.0);\\n\\n // float powDiff = diff * pow(p, 2.0) * ( amplitude * fade );\\n float powDiff = 1.25 * sin(diff * PI) * p * ( amplitude * fade );\\n\\n vec2 offset = diffUV * powDiff / filterArea.xy;\\n\\n // Do clamp :\\n vec2 coord = vTextureCoord + offset;\\n vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw);\\n vec4 color = texture2D(uSampler, clampedCoord);\\n if (coord != clampedCoord) {\\n color *= max(0.0, 1.0 - length(coord - clampedCoord));\\n }\\n\\n // No clamp :\\n // gl_FragColor = texture2D(uSampler, vTextureCoord + offset);\\n\\n color.rgb *= 1.0 + (brightness - 1.0) * p * fade;\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * The ShockwaveFilter class lets you apply a shockwave effect.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/shockwave.gif)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-shockwave|@pixi/filter-shockwave}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {PIXI.Point|number[]} [center=[0.5, 0.5]] See `center` property.\n * @param {object} [options] - The optional parameters of shockwave filter.\n * @param {number} [options.amplitude=0.5] - See `amplitude`` property.\n * @param {number} [options.wavelength=1.0] - See `wavelength` property.\n * @param {number} [options.speed=500.0] - See `speed` property.\n * @param {number} [options.brightness=8] - See `brightness` property.\n * @param {number} [options.radius=4] - See `radius` property.\n * @param {number} [time=0] - See `time` property.\n */\nvar ShockwaveFilter = /*@__PURE__*/(function (Filter) {\n function ShockwaveFilter(center, options, time) {\n if ( center === void 0 ) center = [0.0, 0.0];\n if ( options === void 0 ) options = {};\n if ( time === void 0 ) time = 0;\n\n Filter.call(this, vertex, fragment);\n\n this.center = center;\n\n if (Array.isArray(options)) {\n // eslint-disable-next-line no-console\n console.warn('Deprecated Warning: ShockwaveFilter params Array has been changed to options Object.');\n options = {};\n }\n\n options = Object.assign({\n amplitude: 30.0,\n wavelength: 160.0,\n brightness: 1.0,\n speed: 500.0,\n radius: -1.0,\n }, options);\n\n this.amplitude = options.amplitude;\n\n this.wavelength = options.wavelength;\n\n this.brightness = options.brightness;\n\n this.speed = options.speed;\n\n this.radius = options.radius;\n\n /**\n * Sets the elapsed time of the shockwave.\n * It could control the current size of shockwave.\n *\n * @member {number}\n */\n this.time = time;\n }\n\n if ( Filter ) ShockwaveFilter.__proto__ = Filter;\n ShockwaveFilter.prototype = Object.create( Filter && Filter.prototype );\n ShockwaveFilter.prototype.constructor = ShockwaveFilter;\n\n var prototypeAccessors = { center: { configurable: true },amplitude: { configurable: true },wavelength: { configurable: true },brightness: { configurable: true },speed: { configurable: true },radius: { configurable: true } };\n\n ShockwaveFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n /**\n * There is no set/get of `time`, for performance.\n * Because in the most real cases, `time` will be changed in ever game tick.\n * Use set/get will take more function-call.\n */\n this.uniforms.time = this.time;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Sets the center of the shockwave in normalized screen coords. That is\n * (0,0) is the top-left and (1,1) is the bottom right.\n *\n * @member {PIXI.Point|number[]}\n */\n prototypeAccessors.center.get = function () {\n return this.uniforms.center;\n };\n prototypeAccessors.center.set = function (value) {\n this.uniforms.center = value;\n };\n\n /**\n * The amplitude of the shockwave.\n *\n * @member {number}\n */\n prototypeAccessors.amplitude.get = function () {\n return this.uniforms.amplitude;\n };\n prototypeAccessors.amplitude.set = function (value) {\n this.uniforms.amplitude = value;\n };\n\n /**\n * The wavelength of the shockwave.\n *\n * @member {number}\n */\n prototypeAccessors.wavelength.get = function () {\n return this.uniforms.wavelength;\n };\n prototypeAccessors.wavelength.set = function (value) {\n this.uniforms.wavelength = value;\n };\n\n /**\n * The brightness of the shockwave.\n *\n * @member {number}\n */\n prototypeAccessors.brightness.get = function () {\n return this.uniforms.brightness;\n };\n prototypeAccessors.brightness.set = function (value) {\n this.uniforms.brightness = value;\n };\n\n /**\n * The speed about the shockwave ripples out.\n * The unit is `pixel/second`\n *\n * @member {number}\n */\n prototypeAccessors.speed.get = function () {\n return this.uniforms.speed;\n };\n prototypeAccessors.speed.set = function (value) {\n this.uniforms.speed = value;\n };\n\n /**\n * The maximum radius of shockwave.\n * `< 0.0` means it's infinity.\n *\n * @member {number}\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.radius;\n };\n prototypeAccessors.radius.set = function (value) {\n this.uniforms.radius = value;\n };\n\n Object.defineProperties( ShockwaveFilter.prototype, prototypeAccessors );\n\n return ShockwaveFilter;\n}(Filter));\n\nexport { ShockwaveFilter };\n//# sourceMappingURL=filter-shockwave.esm.js.map\n","/*!\n * @pixi/filter-simple-lightmap - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-simple-lightmap is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { hex2rgb, rgb2hex } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform sampler2D uLightmap;\\nuniform vec4 filterArea;\\nuniform vec2 dimensions;\\nuniform vec4 ambientColor;\\nvoid main() {\\n vec4 diffuseColor = texture2D(uSampler, vTextureCoord);\\n vec2 lightCoord = (vTextureCoord * filterArea.xy) / dimensions;\\n vec4 light = texture2D(uLightmap, lightCoord);\\n vec3 ambient = ambientColor.rgb * ambientColor.a;\\n vec3 intensity = ambient + light.rgb;\\n vec3 finalColor = diffuseColor.rgb * intensity;\\n gl_FragColor = vec4(finalColor, diffuseColor.a);\\n}\\n\";\n\n/**\n* SimpleLightmap, originally by Oza94\n* http://www.html5gamedevs.com/topic/20027-pixijs-simple-lightmapping/\n* http://codepen.io/Oza94/pen/EPoRxj\n*\n* You have to specify filterArea, or suffer consequences.\n* You may have to use it with `filter.dontFit = true`,\n* until we rewrite this using same approach as for DisplacementFilter.\n*\n* ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/simple-lightmap.png)\n* @class\n* @extends PIXI.Filter\n* @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-simple-lightmap|@pixi/filter-simple-lightmap}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n* @param {PIXI.Texture} texture a texture where your lightmap is rendered\n* @param {Array|number} [color=0x000000] An RGBA array of the ambient color\n* @param {number} [alpha=1] Default alpha set independent of color (if it's a number, not array).\n*\n* @example\n* displayObject.filters = [new SimpleLightmapFilter(texture, 0x666666)];\n*/\nvar SimpleLightmapFilter = /*@__PURE__*/(function (Filter) {\n function SimpleLightmapFilter(texture, color, alpha) {\n if ( color === void 0 ) color = 0x000000;\n if ( alpha === void 0 ) alpha = 1;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n this.uniforms.ambientColor = new Float32Array([0, 0, 0, alpha]);\n this.texture = texture;\n this.color = color;\n }\n\n if ( Filter ) SimpleLightmapFilter.__proto__ = Filter;\n SimpleLightmapFilter.prototype = Object.create( Filter && Filter.prototype );\n SimpleLightmapFilter.prototype.constructor = SimpleLightmapFilter;\n\n var prototypeAccessors = { texture: { configurable: true },color: { configurable: true },alpha: { configurable: true } };\n\n /**\n * Applies the filter.\n * @private\n * @param {PIXI.FilterManager} filterManager - The manager.\n * @param {PIXI.RenderTarget} input - The input target.\n * @param {PIXI.RenderTarget} output - The output target.\n */\n SimpleLightmapFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n\n // draw the filter...\n filterManager.applyFilter(this, input, output, clear);\n };\n\n\n /**\n * a texture where your lightmap is rendered\n * @member {PIXI.Texture}\n */\n prototypeAccessors.texture.get = function () {\n return this.uniforms.uLightmap;\n };\n prototypeAccessors.texture.set = function (value) {\n this.uniforms.uLightmap = value;\n };\n\n /**\n * An RGBA array of the ambient color or a hex color without alpha\n * @member {Array|number}\n */\n prototypeAccessors.color.set = function (value) {\n var arr = this.uniforms.ambientColor;\n if (typeof value === 'number') {\n hex2rgb(value, arr);\n this._color = value;\n }\n else {\n arr[0] = value[0];\n arr[1] = value[1];\n arr[2] = value[2];\n arr[3] = value[3];\n this._color = rgb2hex(arr);\n }\n };\n prototypeAccessors.color.get = function () {\n return this._color;\n };\n\n /**\n * When setting `color` as hex, this can be used to set alpha independently.\n * @member {number}\n */\n prototypeAccessors.alpha.get = function () {\n return this.uniforms.ambientColor[3];\n };\n prototypeAccessors.alpha.set = function (value) {\n this.uniforms.ambientColor[3] = value;\n };\n\n Object.defineProperties( SimpleLightmapFilter.prototype, prototypeAccessors );\n\n return SimpleLightmapFilter;\n}(Filter));\n\nexport { SimpleLightmapFilter };\n//# sourceMappingURL=filter-simple-lightmap.esm.js.map\n","/*!\n * @pixi/filter-tilt-shift - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-tilt-shift is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { Point } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform float blur;\\nuniform float gradientBlur;\\nuniform vec2 start;\\nuniform vec2 end;\\nuniform vec2 delta;\\nuniform vec2 texSize;\\n\\nfloat random(vec3 scale, float seed)\\n{\\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\\n}\\n\\nvoid main(void)\\n{\\n vec4 color = vec4(0.0);\\n float total = 0.0;\\n\\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n vec2 normal = normalize(vec2(start.y - end.y, end.x - start.x));\\n float radius = smoothstep(0.0, 1.0, abs(dot(vTextureCoord * texSize - start, normal)) / gradientBlur) * blur;\\n\\n for (float t = -30.0; t <= 30.0; t++)\\n {\\n float percent = (t + offset - 0.5) / 30.0;\\n float weight = 1.0 - abs(percent);\\n vec4 sample = texture2D(uSampler, vTextureCoord + delta / texSize * percent * radius);\\n sample.rgb *= sample.a;\\n color += sample * weight;\\n total += weight;\\n }\\n\\n color /= total;\\n color.rgb /= color.a + 0.00001;\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * @author Vico @vicocotea\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/blur/tiltshift.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * A TiltShiftAxisFilter.\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @private\n */\nvar TiltShiftAxisFilter = /*@__PURE__*/(function (Filter) {\n function TiltShiftAxisFilter(blur, gradientBlur, start, end){\n if ( blur === void 0 ) blur = 100;\n if ( gradientBlur === void 0 ) gradientBlur = 600;\n if ( start === void 0 ) start = null;\n if ( end === void 0 ) end = null;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.blur = blur;\n this.uniforms.gradientBlur = gradientBlur;\n this.uniforms.start = start || new Point(0, window.innerHeight / 2);\n this.uniforms.end = end || new Point(600, window.innerHeight / 2);\n this.uniforms.delta = new Point(30, 30);\n this.uniforms.texSize = new Point(window.innerWidth, window.innerHeight);\n this.updateDelta();\n }\n\n if ( Filter ) TiltShiftAxisFilter.__proto__ = Filter;\n TiltShiftAxisFilter.prototype = Object.create( Filter && Filter.prototype );\n TiltShiftAxisFilter.prototype.constructor = TiltShiftAxisFilter;\n\n var prototypeAccessors = { blur: { configurable: true },gradientBlur: { configurable: true },start: { configurable: true },end: { configurable: true } };\n\n /**\n * Updates the filter delta values.\n * This is overridden in the X and Y filters, does nothing for this class.\n *\n */\n TiltShiftAxisFilter.prototype.updateDelta = function updateDelta () {\n this.uniforms.delta.x = 0;\n this.uniforms.delta.y = 0;\n };\n\n /**\n * The strength of the blur.\n *\n * @member {number}\n * @memberof PIXI.filters.TiltShiftAxisFilter#\n */\n prototypeAccessors.blur.get = function () {\n return this.uniforms.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this.uniforms.blur = value;\n };\n\n /**\n * The strength of the gradient blur.\n *\n * @member {number}\n * @memberof PIXI.filters.TiltShiftAxisFilter#\n */\n prototypeAccessors.gradientBlur.get = function () {\n return this.uniforms.gradientBlur;\n };\n prototypeAccessors.gradientBlur.set = function (value) {\n this.uniforms.gradientBlur = value;\n };\n\n /**\n * The X value to start the effect at.\n *\n * @member {PIXI.Point}\n * @memberof PIXI.filters.TiltShiftAxisFilter#\n */\n prototypeAccessors.start.get = function () {\n return this.uniforms.start;\n };\n prototypeAccessors.start.set = function (value) {\n this.uniforms.start = value;\n this.updateDelta();\n };\n\n /**\n * The X value to end the effect at.\n *\n * @member {PIXI.Point}\n * @memberof PIXI.filters.TiltShiftAxisFilter#\n */\n prototypeAccessors.end.get = function () {\n return this.uniforms.end;\n };\n prototypeAccessors.end.set = function (value) {\n this.uniforms.end = value;\n this.updateDelta();\n };\n\n Object.defineProperties( TiltShiftAxisFilter.prototype, prototypeAccessors );\n\n return TiltShiftAxisFilter;\n}(Filter));\n\n/**\n * @author Vico @vicocotea\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/blur/tiltshift.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * A TiltShiftXFilter.\n *\n * @class\n * @extends PIXI.TiltShiftAxisFilter\n * @memberof PIXI.filters\n * @private\n */\nvar TiltShiftXFilter = /*@__PURE__*/(function (TiltShiftAxisFilter) {\n function TiltShiftXFilter () {\n TiltShiftAxisFilter.apply(this, arguments);\n }\n\n if ( TiltShiftAxisFilter ) TiltShiftXFilter.__proto__ = TiltShiftAxisFilter;\n TiltShiftXFilter.prototype = Object.create( TiltShiftAxisFilter && TiltShiftAxisFilter.prototype );\n TiltShiftXFilter.prototype.constructor = TiltShiftXFilter;\n\n TiltShiftXFilter.prototype.updateDelta = function updateDelta () {\n var dx = this.uniforms.end.x - this.uniforms.start.x;\n var dy = this.uniforms.end.y - this.uniforms.start.y;\n var d = Math.sqrt(dx * dx + dy * dy);\n this.uniforms.delta.x = dx / d;\n this.uniforms.delta.y = dy / d;\n };\n\n return TiltShiftXFilter;\n}(TiltShiftAxisFilter));\n\n/**\n * @author Vico @vicocotea\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/blur/tiltshift.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * A TiltShiftYFilter.\n *\n * @class\n * @extends PIXI.TiltShiftAxisFilter\n * @memberof PIXI.filters\n * @private\n */\nvar TiltShiftYFilter = /*@__PURE__*/(function (TiltShiftAxisFilter) {\n function TiltShiftYFilter () {\n TiltShiftAxisFilter.apply(this, arguments);\n }\n\n if ( TiltShiftAxisFilter ) TiltShiftYFilter.__proto__ = TiltShiftAxisFilter;\n TiltShiftYFilter.prototype = Object.create( TiltShiftAxisFilter && TiltShiftAxisFilter.prototype );\n TiltShiftYFilter.prototype.constructor = TiltShiftYFilter;\n\n TiltShiftYFilter.prototype.updateDelta = function updateDelta () {\n var dx = this.uniforms.end.x - this.uniforms.start.x;\n var dy = this.uniforms.end.y - this.uniforms.start.y;\n var d = Math.sqrt(dx * dx + dy * dy);\n this.uniforms.delta.x = -dy / d;\n this.uniforms.delta.y = dx / d;\n };\n\n return TiltShiftYFilter;\n}(TiltShiftAxisFilter));\n\n/**\n * @author Vico @vicocotea\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/blur/tiltshift.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * A TiltShift Filter. Manages the pass of both a TiltShiftXFilter and TiltShiftYFilter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/tilt-shift.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-tilt-shift|@pixi/filter-tilt-shift}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [blur=100] The strength of the blur.\n * @param {number} [gradientBlur=600] The strength of the gradient blur.\n * @param {PIXI.Point} [start=null] The Y value to start the effect at.\n * @param {PIXI.Point} [end=null] The Y value to end the effect at.\n */\nvar TiltShiftFilter = /*@__PURE__*/(function (Filter) {\n function TiltShiftFilter(blur, gradientBlur, start, end) {\n if ( blur === void 0 ) blur = 100;\n if ( gradientBlur === void 0 ) gradientBlur = 600;\n if ( start === void 0 ) start = null;\n if ( end === void 0 ) end = null;\n\n Filter.call(this);\n this.tiltShiftXFilter = new TiltShiftXFilter(blur, gradientBlur, start, end);\n this.tiltShiftYFilter = new TiltShiftYFilter(blur, gradientBlur, start, end);\n }\n\n if ( Filter ) TiltShiftFilter.__proto__ = Filter;\n TiltShiftFilter.prototype = Object.create( Filter && Filter.prototype );\n TiltShiftFilter.prototype.constructor = TiltShiftFilter;\n\n var prototypeAccessors = { blur: { configurable: true },gradientBlur: { configurable: true },start: { configurable: true },end: { configurable: true } };\n\n TiltShiftFilter.prototype.apply = function apply (filterManager, input, output) {\n var renderTarget = filterManager.getFilterTexture();\n this.tiltShiftXFilter.apply(filterManager, input, renderTarget);\n this.tiltShiftYFilter.apply(filterManager, renderTarget, output);\n filterManager.returnFilterTexture(renderTarget);\n };\n\n /**\n * The strength of the blur.\n *\n * @member {number}\n */\n prototypeAccessors.blur.get = function () {\n return this.tiltShiftXFilter.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this.tiltShiftXFilter.blur = this.tiltShiftYFilter.blur = value;\n };\n\n /**\n * The strength of the gradient blur.\n *\n * @member {number}\n */\n prototypeAccessors.gradientBlur.get = function () {\n return this.tiltShiftXFilter.gradientBlur;\n };\n prototypeAccessors.gradientBlur.set = function (value) {\n this.tiltShiftXFilter.gradientBlur = this.tiltShiftYFilter.gradientBlur = value;\n };\n\n /**\n * The Y value to start the effect at.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.start.get = function () {\n return this.tiltShiftXFilter.start;\n };\n prototypeAccessors.start.set = function (value) {\n this.tiltShiftXFilter.start = this.tiltShiftYFilter.start = value;\n };\n\n /**\n * The Y value to end the effect at.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.end.get = function () {\n return this.tiltShiftXFilter.end;\n };\n prototypeAccessors.end.set = function (value) {\n this.tiltShiftXFilter.end = this.tiltShiftYFilter.end = value;\n };\n\n Object.defineProperties( TiltShiftFilter.prototype, prototypeAccessors );\n\n return TiltShiftFilter;\n}(Filter));\n\nexport { TiltShiftAxisFilter, TiltShiftFilter, TiltShiftXFilter, TiltShiftYFilter };\n//# sourceMappingURL=filter-tilt-shift.esm.js.map\n","/*!\n * @pixi/filter-twist - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-twist is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform float radius;\\nuniform float angle;\\nuniform vec2 offset;\\nuniform vec4 filterArea;\\n\\nvec2 mapCoord( vec2 coord )\\n{\\n coord *= filterArea.xy;\\n coord += filterArea.zw;\\n\\n return coord;\\n}\\n\\nvec2 unmapCoord( vec2 coord )\\n{\\n coord -= filterArea.zw;\\n coord /= filterArea.xy;\\n\\n return coord;\\n}\\n\\nvec2 twist(vec2 coord)\\n{\\n coord -= offset;\\n\\n float dist = length(coord);\\n\\n if (dist < radius)\\n {\\n float ratioDist = (radius - dist) / radius;\\n float angleMod = ratioDist * ratioDist * angle;\\n float s = sin(angleMod);\\n float c = cos(angleMod);\\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\\n }\\n\\n coord += offset;\\n\\n return coord;\\n}\\n\\nvoid main(void)\\n{\\n\\n vec2 coord = mapCoord(vTextureCoord);\\n\\n coord = twist(coord);\\n\\n coord = unmapCoord(coord);\\n\\n gl_FragColor = texture2D(uSampler, coord );\\n\\n}\\n\";\n\n/**\n * This filter applies a twist effect making display objects appear twisted in the given direction.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/twist.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-twist|@pixi/filter-twist}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [radius=200] The radius of the twist.\n * @param {number} [angle=4] The angle of the twist.\n * @param {number} [padding=20] Padding for filter area.\n */\nvar TwistFilter = /*@__PURE__*/(function (Filter) {\n function TwistFilter(radius, angle, padding) {\n if ( radius === void 0 ) radius = 200;\n if ( angle === void 0 ) angle = 4;\n if ( padding === void 0 ) padding = 20;\n\n Filter.call(this, vertex, fragment);\n\n this.radius = radius;\n this.angle = angle;\n this.padding = padding;\n }\n\n if ( Filter ) TwistFilter.__proto__ = Filter;\n TwistFilter.prototype = Object.create( Filter && Filter.prototype );\n TwistFilter.prototype.constructor = TwistFilter;\n\n var prototypeAccessors = { offset: { configurable: true },radius: { configurable: true },angle: { configurable: true } };\n\n /**\n * This point describes the the offset of the twist.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.offset.get = function () {\n return this.uniforms.offset;\n };\n prototypeAccessors.offset.set = function (value) {\n this.uniforms.offset = value;\n };\n\n /**\n * The radius of the twist.\n *\n * @member {number}\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.radius;\n };\n prototypeAccessors.radius.set = function (value) {\n this.uniforms.radius = value;\n };\n\n /**\n * The angle of the twist.\n *\n * @member {number}\n */\n prototypeAccessors.angle.get = function () {\n return this.uniforms.angle;\n };\n prototypeAccessors.angle.set = function (value) {\n this.uniforms.angle = value;\n };\n\n Object.defineProperties( TwistFilter.prototype, prototypeAccessors );\n\n return TwistFilter;\n}(Filter));\n\nexport { TwistFilter };\n//# sourceMappingURL=filter-twist.esm.js.map\n","/*!\n * @pixi/filter-zoom-blur - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-zoom-blur is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\n\\nuniform vec2 uCenter;\\nuniform float uStrength;\\nuniform float uInnerRadius;\\nuniform float uRadius;\\n\\nconst float MAX_KERNEL_SIZE = 32.0;\\n\\n// author: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\\nhighp float rand(vec2 co, float seed) {\\n const highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n highp float dt = dot(co + seed, vec2(a, b)), sn = mod(dt, 3.14159);\\n return fract(sin(sn) * c + seed);\\n}\\n\\nvoid main() {\\n\\n float minGradient = uInnerRadius * 0.3;\\n float innerRadius = (uInnerRadius + minGradient * 0.5) / filterArea.x;\\n\\n float gradient = uRadius * 0.3;\\n float radius = (uRadius - gradient * 0.5) / filterArea.x;\\n\\n float countLimit = MAX_KERNEL_SIZE;\\n\\n vec2 dir = vec2(uCenter.xy / filterArea.xy - vTextureCoord);\\n float dist = length(vec2(dir.x, dir.y * filterArea.y / filterArea.x));\\n\\n float strength = uStrength;\\n\\n float delta = 0.0;\\n float gap;\\n if (dist < innerRadius) {\\n delta = innerRadius - dist;\\n gap = minGradient;\\n } else if (radius >= 0.0 && dist > radius) { // radius < 0 means it's infinity\\n delta = dist - radius;\\n gap = gradient;\\n }\\n\\n if (delta > 0.0) {\\n float normalCount = gap / filterArea.x;\\n delta = (normalCount - delta) / normalCount;\\n countLimit *= delta;\\n strength *= delta;\\n if (countLimit < 1.0)\\n {\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n return;\\n }\\n }\\n\\n // randomize the lookup values to hide the fixed number of samples\\n float offset = rand(vTextureCoord, 0.0);\\n\\n float total = 0.0;\\n vec4 color = vec4(0.0);\\n\\n dir *= strength;\\n\\n for (float t = 0.0; t < MAX_KERNEL_SIZE; t++) {\\n float percent = (t + offset) / MAX_KERNEL_SIZE;\\n float weight = 4.0 * (percent - percent * percent);\\n vec2 p = vTextureCoord + dir * percent;\\n vec4 sample = texture2D(uSampler, p);\\n\\n // switch to pre-multiplied alpha to correctly blur transparent images\\n // sample.rgb *= sample.a;\\n\\n color += sample * weight;\\n total += weight;\\n\\n if (t > countLimit){\\n break;\\n }\\n }\\n\\n color /= total;\\n // switch back from pre-multiplied alpha\\n // color.rgb /= color.a + 0.00001;\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * The ZoomFilter applies a Zoom blur to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/zoom-blur.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-zoom-blur|@pixi/filter-zoom-blur}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [strength=0.1] Sets the strength of the zoom blur effect\n * @param {PIXI.Point|number[]} [center=[0,0]] The center of the zoom.\n * @param {number} [innerRadius=0] The inner radius of zoom. The part in inner circle won't apply zoom blur effect.\n * @param {number} [radius=-1] See `radius` property.\n */\nvar ZoomBlurFilter = /*@__PURE__*/(function (Filter) {\n function ZoomBlurFilter(strength, center, innerRadius, radius) {\n if ( strength === void 0 ) strength = 0.1;\n if ( center === void 0 ) center = [0, 0];\n if ( innerRadius === void 0 ) innerRadius = 0;\n if ( radius === void 0 ) radius = -1;\n\n Filter.call(this, vertex, fragment);\n\n this.center = center;\n this.strength = strength;\n this.innerRadius = innerRadius;\n this.radius = radius;\n }\n\n if ( Filter ) ZoomBlurFilter.__proto__ = Filter;\n ZoomBlurFilter.prototype = Object.create( Filter && Filter.prototype );\n ZoomBlurFilter.prototype.constructor = ZoomBlurFilter;\n\n var prototypeAccessors = { center: { configurable: true },strength: { configurable: true },innerRadius: { configurable: true },radius: { configurable: true } };\n\n /**\n * Center of the effect.\n *\n * @member {PIXI.Point|number[]}\n * @default [0, 0]\n */\n prototypeAccessors.center.get = function () {\n return this.uniforms.uCenter;\n };\n prototypeAccessors.center.set = function (value) {\n this.uniforms.uCenter = value;\n };\n\n /**\n * Intensity of the zoom effect.\n *\n * @member {number}\n * @default 0.1\n */\n prototypeAccessors.strength.get = function () {\n return this.uniforms.uStrength;\n };\n prototypeAccessors.strength.set = function (value) {\n this.uniforms.uStrength = value;\n };\n\n /**\n * Radius of the inner region not effected by blur.\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.innerRadius.get = function () {\n return this.uniforms.uInnerRadius;\n };\n prototypeAccessors.innerRadius.set = function (value) {\n this.uniforms.uInnerRadius = value;\n };\n\n /**\n * Outer radius of the effect. The default value is `-1`.\n * `< 0.0` means it's infinity.\n *\n * @member {number}\n * @default -1\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.uRadius;\n };\n prototypeAccessors.radius.set = function (value) {\n if (value < 0 || value === Infinity) {\n value = -1;\n }\n this.uniforms.uRadius = value;\n };\n\n Object.defineProperties( ZoomBlurFilter.prototype, prototypeAccessors );\n\n return ZoomBlurFilter;\n}(Filter));\n\nexport { ZoomBlurFilter };\n//# sourceMappingURL=filter-zoom-blur.esm.js.map\n"],"names":["vertex","fragment","AdjustmentFilter","Filter","options","call","this","Object","assign","gamma","saturation","contrast","brightness","red","green","blue","alpha","__proto__","prototype","create","constructor","apply","filterManager","input","output","clear","uniforms","Math","max","applyFilter","fragmentClamp","KawaseBlurFilter","blur","quality","clamp","uOffset","Float32Array","_pixelSize","Point","pixelSize","_clamp","_kernels","Array","isArray","kernels","_blur","prototypeAccessors","configurable","offset","uvX","x","_frame","width","uvY","y","height","_quality","tmp","renderTarget","getFilterTexture","source","target","last","i","returnFilterTexture","_generateKernels","k","step","push","get","set","value","length","round","defineProperties","ExtractBrightnessFilter","threshold","fragment$1","AdvancedBloomFilter","bloomScale","resolution","settings","RESOLUTION","_extractFilter","_blurFilter","currentState","brightTarget","bloomTarget","bloomTexture","_resolution","AsciiFilter","size","BevelFilter","lightColor","shadowColor","rotation","thickness","lightAlpha","shadowAlpha","_updateTransform","transformX","_thickness","cos","_angle","transformY","sin","DEG_TO_RAD","rgb2hex","hex2rgb","BloomFilter","kernelSize","blurX","blurY","blurXFilter","BlurFilterPass","blurYFilter","blendMode","BLEND_MODES","SCREEN","defaultFilter","AlphaFilter","BulgePinchFilter","center","radius","strength","dimensions","filterFrame","ColorMapFilter","colorMap","nearest","mix","_size","_sliceSize","_slicePixelSize","_sliceInnerSize","_scaleMode","_nearest","colorSize","_mix","_colorMap","Texture","from","baseTexture","scaleMode","mipmap","SCALE_MODES","NEAREST","LINEAR","texture","_glTextures","_updateID","emit","updateColorMap","destroy","destroyBase","ColorReplaceFilter","originalColor","newColor","epsilon","arr","_originalColor","_newColor","ConvolutionFilter","matrix","texelSize","undefined","this$1","forEach","v","CrossHatchFilter","CRTFilter","time","seed","curvature","lineWidth","lineContrast","verticalLine","noise","noiseSize","vignetting","vignettingAlpha","vignettingBlur","DotFilter","scale","angle","DropShadowFilter","console","warn","arguments","distance","color","shadowOnly","_tintFilter","shift","_updatePadding","padding","_updateShift","_distance","EmbossFilter","GlitchFilter","slices","direction","fillMode","average","minSize","sampleSize","_canvas","document","createElement","_slices","sizes","offsets","aspect","_randomizeSizes","_sizes","min","count","rest","averageWidth","w","random","rest$1","ratio","sqrt","i$1","w$1","shuffle","rand","temp","_randomizeOffsets","_offsets","refresh","redraw","ctx","getContext","clearRect","floor","fillStyle","fillRect","update","displacementMap","len","slicesWidth","slicesOffset","_direction","radians","sinDir","cosDir","TRANSPARENT","ORIGINAL","LOOP","CLAMP","MIRROR","GlowFilter","outerStrength","innerStrength","replace","toFixed","glowColor","perlin","GodrayFilter","gain","lacunarity","parallel","_angleLight","ref","light","MotionBlurFilter","velocity","uVelocity","_velocity","ObservablePoint","velocityChanged","uKernelSize","copy","MultiColorReplaceFilter","replacements","maxColors","_maxColors","_replacements","originalColors","targetColors","originals","targets","colorCount","pair","targetColor","OldFilmFilter","sepia","scratch","scratchDensity","scratchWidth","OutlineFilter","samples","MAX_SAMPLES","MIN_SAMPLES","angleStep","PI","outlineColor","PixelateFilter","RadialBlurFilter","uRadian","uCenter","uRadius","Infinity","ReflectionFilter","amplitude","waveLength","mirror","boundary","RGBSplitFilter","ShockwaveFilter","wavelength","speed","SimpleLightmapFilter","ambientColor","uLightmap","_color","TiltShiftAxisFilter","gradientBlur","start","end","window","innerHeight","delta","texSize","innerWidth","updateDelta","TiltShiftXFilter","dx","dy","d","TiltShiftYFilter","TiltShiftFilter","tiltShiftXFilter","tiltShiftYFilter","TwistFilter","ZoomBlurFilter","innerRadius","uStrength","uInnerRadius"],"mappings":"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"} \ No newline at end of file diff --git a/HostGame.js b/HostGame.js new file mode 100644 index 0000000..6c04f43 --- /dev/null +++ b/HostGame.js @@ -0,0 +1,22 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/HostGameClass.js b/HostGameClass.js new file mode 100644 index 0000000..8d4564c --- /dev/null +++ b/HostGameClass.js @@ -0,0 +1,23 @@ +class HostGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new LobbyScreen(this, this.screenController); + + this.showGameScreen(); + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/LobbyScreen.js b/LobbyScreen.js new file mode 100644 index 0000000..aa8c834 --- /dev/null +++ b/LobbyScreen.js @@ -0,0 +1,12 @@ +class LobbyScreen extends GameScreen +{ + constructor(screenController) + { + super(screenController); + this.players = []; + } + + show() + { + } +} diff --git a/client/index.html b/client/index.html index 9b7e3b7..28ac3ae 100644 --- a/client/index.html +++ b/client/index.html @@ -52,9 +52,6 @@ - - - diff --git a/client/js/PlayerGame.js b/client/js/PlayerGame.js new file mode 100644 index 0000000..d10f337 --- /dev/null +++ b/client/js/PlayerGame.js @@ -0,0 +1,25 @@ +class PlayerGame extends Engine.GameBase +{ + constructor(rootDrawable) + { + super(rootDrawable); + + this.gameScreen = new SignupScreen(this, this.screenController); + + this.network = new NetworkGameManager(); + Game.Network = this.network; + + this.gameScreen.show(); + } + + resolutionChanged(width, height) + { + this.gameScreen.resolutionChanged(width, height); + } + + update(timeElapsed) + { + super.update(timeElapsed); + } + +} diff --git a/index.html b/index.html index 55a91f5..60e2379 100644 --- a/index.html +++ b/index.html @@ -1,8 +1,84 @@ Lost My Nuts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + +
diff --git a/index.js b/index.js index 57fe4c9..469e75e 100644 --- a/index.js +++ b/index.js @@ -12,13 +12,6 @@ { this.win = win; win.showDevTools(); - const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address - - var gameContainer = document.getElementById("gameContainer"); - Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); - - var gameManager = new GameManager(); - gameManager.init("js/"); window.addEventListener('resize', this.resize.bind(this)); // start up express @@ -36,12 +29,21 @@ maxReceivedFrameSize : 1024000, }); - this.mode = new JoinMode(); - // start listening this.app.listen(HttpPort, () => console.log('HTTP server listening on port ' + HttpPort + '!')); this.httpServer.listen(WsPort, () => console.log('WebSocket Server started on port ' + WsPort + '!')); this.wsServer.on('request', this.connect.bind(this)); + + const address = Object.values(os.networkInterfaces()).flatMap(i => i).filter(i => i.family == "IPv4" && !i.internal)[0].address + + var gameContainer = document.getElementById("gameContainer"); + Engine.InitEngine(gameContainer, { width: window.innerWidth, height: window.innerHeight, roundPixels: false} ); + + Game.Server = wsServer; + Game.Address = address; + + var gameManager = new GameManager(); + gameManager.init("shared/js/", HostGame); } connect(req) @@ -58,5 +60,4 @@ } let win = nw.Window.get(); -console.log(win); win.on("loaded", () => new LostMyNuts(win)); diff --git a/node_modules/.bin/winrun b/node_modules/.bin/winrun index e9fd763..96ea779 100644 --- a/node_modules/.bin/winrun +++ b/node_modules/.bin/winrun @@ -1,7 +1,5 @@ #! /usr/bin/env bash -echo "TEST" - command=$1 args=$(printf '"`"%s`"",' "${@:2}") ; args=${args%,} winrun_pid=$$ @@ -28,7 +26,6 @@ # Use tail to wait for the file to be populated while read -r line; do windows_pid=$(echo $line | tr -d '\r\n') - echo "Windows_pid: $windows_pid" break # we only need the first line done < <(tail -f $pidfile) rm $pidfile @@ -38,8 +35,7 @@ fi term() { - echo "KILLING $windows_pid" - taskkill.exe -f -pid $windows_pid + taskkill.exe -f -pid $windows_pid > /dev/null } trap term SIGTERM diff --git a/nodemon.json b/nodemon.json index 2e9869f..1305d81 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,4 +1,5 @@ { "signal":"SIGTERM", - "exec":"npm start" + "exec":"npm start", + "ext":"js,html" } diff --git a/session.vim b/session.vim new file mode 100644 index 0000000..f09aa60 --- /dev/null +++ b/session.vim @@ -0,0 +1,282 @@ +let SessionLoad = 1 +if &cp | set nocp | endif +let s:cpo_save=&cpo +set cpo&vim +imap +inoremap pumvisible() ? "\" : "\" +inoremap pumvisible() ? "\" : "\" +inoremap pumvisible() ? "\" : "\" +nnoremap  :TmuxNavigateLeft +nnoremap :TmuxNavigateDown +nnoremap  :TmuxNavigateUp +nnoremap  :TmuxNavigateRight +map  (ctrlp) +nnoremap  :TmuxNavigatePrevious +nnoremap \d :YcmShowDetailedDiagnostic +xmap \ge CamelCaseMotion_ge +xmap \e CamelCaseMotion_e +xmap \b CamelCaseMotion_b +xmap \w CamelCaseMotion_w +omap \ge CamelCaseMotion_ge +omap \e CamelCaseMotion_e +omap \b CamelCaseMotion_b +omap \w CamelCaseMotion_w +nmap \ge CamelCaseMotion_ge +nmap \e CamelCaseMotion_e +nmap \b CamelCaseMotion_b +nmap \w CamelCaseMotion_w +nmap \ucc TextTMakeUpperCamelCaseLine +xmap \uc TextTMakeUpperCamelCaseVisual +nmap \uc TextTMakeUpperCamelCaseOperator +nmap \scc TextTMakeSnakeCaseLine +xmap \sc TextTMakeSnakeCaseVisual +nmap \sc TextTMakeSnakeCaseOperator +nmap \ccc TextTMakeCamelCaseLine +xmap \cc TextTMakeCamelCaseVisual +nmap \cc TextTMakeCamelCaseOperator +vnoremap \c :call CopyMarkWithCursor("<", ">") +nnoremap \c :set opfunc=OpSysCopyMark g@ +vmap gx NetrwBrowseXVis +nmap gx NetrwBrowseX +xmap g. (visualrepeatForceBuiltInRepeat) +xmap i\ge CamelCaseMotion_ige +xmap i\e CamelCaseMotion_ie +xmap i\b CamelCaseMotion_ib +xmap i\w CamelCaseMotion_iw +omap i\ge CamelCaseMotion_ige +omap i\e CamelCaseMotion_ie +omap i\b CamelCaseMotion_ib +omap i\w CamelCaseMotion_iw +vnoremap NetrwBrowseXVis :call netrw#BrowseXVis() +nnoremap NetrwBrowseX :call netrw#BrowseX(netrw#GX(),netrw#CheckIfRemote(netrw#GX())) +xnoremap 30_(CaptureVirtCol) visualrepeat#CaptureVirtCol() +map (ctrlp) +nnoremap (ctrlp) :CtrlPBuffile +vnoremap CamelCaseMotion_ige :call camelcasemotion#InnerMotion('ge',v:count1) +vnoremap CamelCaseMotion_ie :call camelcasemotion#InnerMotion('e',v:count1) +vnoremap CamelCaseMotion_ib :call camelcasemotion#InnerMotion('b',v:count1) +vnoremap CamelCaseMotion_iw :call camelcasemotion#InnerMotion('w',v:count1) +onoremap CamelCaseMotion_ige :call camelcasemotion#InnerMotion('ge',v:count1) +onoremap CamelCaseMotion_ie :call camelcasemotion#InnerMotion('e',v:count1) +onoremap CamelCaseMotion_ib :call camelcasemotion#InnerMotion('b',v:count1) +onoremap CamelCaseMotion_iw :call camelcasemotion#InnerMotion('w',v:count1) +vnoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'v') +vnoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'v') +vnoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'v') +vnoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'v') +onoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'o') +onoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'o') +onoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'o') +onoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'o') +nnoremap CamelCaseMotion_ge :call camelcasemotion#Motion('ge',v:count1,'n') +nnoremap CamelCaseMotion_e :call camelcasemotion#Motion('e',v:count1,'n') +nnoremap CamelCaseMotion_b :call camelcasemotion#Motion('b',v:count1,'n') +nnoremap CamelCaseMotion_w :call camelcasemotion#Motion('w',v:count1,'n') +nnoremap TextTMakeUpperCamelCaseOperator TextTransform#Arbitrary#Expression('MakeUpperCamelCase', 'TextRMakeUpperCamelCase') +nnoremap TextTMakeSnakeCaseOperator TextTransform#Arbitrary#Expression('MakeSnakeCase', 'TextRMakeSnakeCase') +vnoremap 19_TextTRecordPos TextTransform#Arbitrary#SetTriggerPos() +nnoremap TextTMakeCamelCaseOperator TextTransform#Arbitrary#Expression('MakeCamelCase', 'TextRMakeCamelCase') +nnoremap 19_Reselect '1v' . (visualmode() !=# 'V' && &selection ==# 'exclusive' ? ' ' : '') . '"' . v:register +nnoremap :TmuxNavigatePrevious +nnoremap :TmuxNavigateRight +nnoremap :TmuxNavigateUp +nnoremap :TmuxNavigateDown +nnoremap :TmuxNavigateLeft +inoremap  pumvisible() ? "\" : "\ " +let &cpo=s:cpo_save +unlet s:cpo_save +set autoindent +set backspace=indent,eol,start +set belloff=all +set completeopt=preview,menuone +set cpoptions=aAceFsB +set fileencodings=ucs-bom,utf-8,default,latin1 +set fillchars=vert:|,fold:-,vert:│ +set nofixendofline +set foldlevelstart=99 +set helplang=en +set hidden +set mouse=a +set pyxversion=3 +set ruler +set runtimepath=~/.vim,~/.vim/plugged/onehalf/vim,~/.vim/plugged/QFEnter,~/.vim/bundle/CamelCaseMotion,~/.vim/bundle/JustDo,~/.vim/bundle/YouCompleteMe,~/.vim/bundle/ctrlp.vim,~/.vim/bundle/dracula-vim,~/.vim/bundle/html5.vim,~/.vim/bundle/night_owl_light.vim,~/.vim/bundle/vim-TextTransform,~/.vim/bundle/vim-colors-solarized,~/.vim/bundle/vim-easymotion,~/.vim/bundle/vim-ingo-library,~/.vim/bundle/vim-javascript,~/.vim/bundle/vim-localrc,~/.vim/bundle/vim-repeat,~/.vim/bundle/vim-tmux-navigator,~/.vim/bundle/vim-visualrepeat,~/.vim/bundle/yats.vim,/usr/share/vim/vimfiles,/usr/share/vim/vim82,/usr/share/vim/vimfiles/after,~/.vim/bundle/vim-javascript/after,~/.vim/bundle/html5.vim/after,~/.vim/bundle/dracula-vim/after,~/.vim/after +set sessionoptions=blank,buffers,folds,help,options,tabpages,winsize,terminal,sesdir +set shiftwidth=4 +set shortmess=filnxtToOSc +set softtabstop=4 +set suffixes=.bak,~,.swp,.o,.info,.aux,.log,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc,.snap +set tabstop=4 +set termguicolors +let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0 +let v:this_session=expand(":p") +silent only +silent tabonly +exe "cd " . escape(expand(":p:h"), ' ') +if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == '' + let s:wipebuf = bufnr('%') +endif +set shortmess=aoO +argglobal +%argdel +edit ../fusion/prototype/client/js/Game/GameManager.js +set splitbelow splitright +set nosplitbelow +set nosplitright +wincmd t +set winminheight=0 +set winheight=1 +set winminwidth=0 +set winwidth=1 +argglobal +setlocal keymap= +setlocal noarabic +setlocal autoindent +setlocal backupcopy= +setlocal balloonexpr= +setlocal nobinary +setlocal nobreakindent +setlocal breakindentopt= +setlocal bufhidden= +setlocal buflisted +setlocal buftype= +setlocal nocindent +setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e +setlocal cinoptions= +setlocal cinwords=if,else,while,do,for,switch +setlocal colorcolumn= +setlocal comments=sO:*\ -,mO:*\ \ ,exO:*/,s1:/*,mb:*,ex:*/,:// +setlocal commentstring=//%s +setlocal complete=.,w,b,u,t,i +setlocal concealcursor= +setlocal conceallevel=0 +setlocal completefunc= +setlocal nocopyindent +setlocal cryptmethod= +setlocal nocursorbind +setlocal nocursorcolumn +set cursorline +setlocal cursorline +setlocal cursorlineopt=both +setlocal define=\\(^\\s*(*async\\s\\+function\\|(*function\\)\\|^\\s*\\(\\*\\|static\\|async\\|get\\|set\\|\\i\\+\\.\\)\\|^\\s*\\(\\ze\\i\\+\\)\\(([^)]*).*{$\\|\\s*[:=,]\\)\\|^\\s*\\(export\\s\\+\\|export\\s\\+default\\s\\+\\)*\\(var\\|let\\|const\\|function\\|class\\)\\|\\ +setlocal dictionary= +setlocal nodiff +setlocal equalprg= +setlocal errorformat= +setlocal noexpandtab +if &filetype != 'javascript' +setlocal filetype=javascript +endif +setlocal nofixendofline +setlocal foldcolumn=0 +setlocal foldenable +setlocal foldexpr=0 +setlocal foldignore=# +setlocal foldlevel=99 +setlocal foldmarker={{{,}}} +setlocal foldmethod=manual +setlocal foldminlines=1 +setlocal foldnestmax=20 +setlocal foldtext=foldtext() +setlocal formatexpr= +setlocal formatoptions=croql +setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s* +setlocal formatprg= +setlocal grepprg= +setlocal iminsert=0 +setlocal imsearch=-1 +setlocal include= +setlocal includeexpr= +setlocal indentexpr=GetJavascriptIndent() +setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e,0],0) +setlocal noinfercase +setlocal iskeyword=@,48-57,_,192-255,$ +setlocal keywordprg= +setlocal nolinebreak +setlocal nolisp +setlocal lispwords= +setlocal nolist +setlocal makeencoding= +setlocal makeprg= +setlocal matchpairs=(:),{:},[:] +setlocal modeline +setlocal modifiable +setlocal nrformats=bin,octal,hex +set number +setlocal number +setlocal numberwidth=4 +setlocal omnifunc=javascriptcomplete#CompleteJS +setlocal path=.,, +setlocal nopreserveindent +setlocal nopreviewwindow +setlocal quoteescape=\\ +setlocal noreadonly +setlocal norelativenumber +setlocal norightleft +setlocal rightleftcmd=search +setlocal noscrollbind +setlocal scrolloff=-1 +setlocal shiftwidth=4 +setlocal noshortname +setlocal showbreak= +setlocal sidescrolloff=-1 +setlocal signcolumn=auto +setlocal nosmartindent +setlocal softtabstop=4 +setlocal nospell +setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+ +setlocal spellfile= +setlocal spelllang=en +setlocal spelloptions= +setlocal statusline= +setlocal suffixesadd=.js,.jsx,.es,.es6,.cjs,.mjs,.jsm,.vue,.json +setlocal swapfile +setlocal synmaxcol=3000 +if &syntax != 'javascript' +setlocal syntax=javascript +endif +setlocal tabstop=4 +setlocal tagcase= +setlocal tagfunc= +setlocal tags= +setlocal termwinkey= +setlocal termwinscroll=10000 +setlocal termwinsize= +setlocal textwidth=0 +setlocal thesaurus= +setlocal noundofile +setlocal undolevels=-123456 +setlocal varsofttabstop= +setlocal vartabstop= +setlocal wincolor= +setlocal nowinfixheight +setlocal nowinfixwidth +setlocal wrap +setlocal wrapmargin=0 +silent! normal! zE +let s:l = 28 - ((12 * winheight(0) + 33) / 66) +if s:l < 1 | let s:l = 1 | endif +exe s:l +normal! zt +28 +normal! 0 +tabnext 1 +badd +36 index.js +badd +37 node_modules/.bin/winrun +badd +4 client/index.html +badd +75 index.html +badd +283 /mnt/c/Projects/fusion/prototype/client/index.html +badd +0 ../fusion/prototype/client/js/Game/GameManager.js +if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 + silent exe 'bwipe ' . s:wipebuf +endif +unlet! s:wipebuf +set winheight=1 winwidth=20 shortmess=filnxtToOSc +set winminheight=1 winminwidth=1 +let s:sx = expand(":p:r")."x.vim" +if filereadable(s:sx) + exe "source " . fnameescape(s:sx) +endif +let &so = s:so_save | let &siso = s:siso_save +doautoall SessionLoadPost +unlet SessionLoad +" vim: set ft=vim : diff --git a/shared/js/Engine/Display/DrawableEvents.js b/shared/js/Engine/Display/DrawableEvents.js index 878f9e1..78789e3 100644 --- a/shared/js/Engine/Display/DrawableEvents.js +++ b/shared/js/Engine/Display/DrawableEvents.js @@ -47,24 +47,6 @@ clicked(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.clickedInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.clickedInner(event); - } - } - clickedInner(event) - { var clickDistance = Math.sqrt((this.mouseDownPosition.x - event.data.global.x) * (this.mouseDownPosition.x - event.data.global.x) + (this.mouseDownPosition.y - event.data.global.y) * (this.mouseDownPosition.y - event.data.global.y)); if (clickDistance > this.clickThreshold) return; this.onClick.call(this.parentDrawable, event); @@ -72,71 +54,16 @@ mouseOver(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseOverInner(event); - } - catch (error) - { - - GameManager.reportException(error); - } - } - else - { - this.mouseOverInner(event); - } - } - mouseOverInner(event) - { this.onMouseOver.call(this.parentDrawable, event); } mouseOut(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseOutInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseOutInner(event); - } - } - mouseOutInner(event) - { this.onMouseOut.call(this.parentDrawable, event); } mouseDown(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseDownInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseDownInner(event); - } - } - mouseDownInner(event) - { this.mouseDownPosition.x = event.data.global.x; this.mouseDownPosition.y = event.data.global.y; this.onMouseDown.call(this.parentDrawable, event); @@ -144,24 +71,6 @@ mouseUp(event) { - if (GameManager.catchAndReportExceptions) - { - try - { - this.mouseUpInner(event); - } - catch (error) - { - GameManager.reportException(error); - } - } - else - { - this.mouseUpInner(event); - } - } - mouseUpInner(event) - { this.onMouseUp.call(this.parentDrawable, event); } diff --git a/shared/js/Engine/Libs/pixi-filters.js.map b/shared/js/Engine/Libs/pixi-filters.js.map new file mode 100644 index 0000000..4b269da --- /dev/null +++ b/shared/js/Engine/Libs/pixi-filters.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pixi-filters.js","sources":["../../filters/adjustment/lib/filter-adjustment.esm.js","../../filters/kawase-blur/lib/filter-kawase-blur.esm.js","../../filters/advanced-bloom/lib/filter-advanced-bloom.esm.js","../../filters/ascii/lib/filter-ascii.esm.js","../../filters/bevel/lib/filter-bevel.esm.js","../../filters/bloom/lib/filter-bloom.esm.js","../../filters/bulge-pinch/lib/filter-bulge-pinch.esm.js","../../filters/color-map/lib/filter-color-map.esm.js","../../filters/color-replace/lib/filter-color-replace.esm.js","../../filters/convolution/lib/filter-convolution.esm.js","../../filters/cross-hatch/lib/filter-cross-hatch.esm.js","../../filters/crt/lib/filter-crt.esm.js","../../filters/dot/lib/filter-dot.esm.js","../../filters/drop-shadow/lib/filter-drop-shadow.esm.js","../../filters/emboss/lib/filter-emboss.esm.js","../../filters/glitch/lib/filter-glitch.esm.js","../../filters/glow/lib/filter-glow.esm.js","../../filters/godray/lib/filter-godray.esm.js","../../filters/motion-blur/lib/filter-motion-blur.esm.js","../../filters/multi-color-replace/lib/filter-multi-color-replace.esm.js","../../filters/old-film/lib/filter-old-film.esm.js","../../filters/outline/lib/filter-outline.esm.js","../../filters/pixelate/lib/filter-pixelate.esm.js","../../filters/radial-blur/lib/filter-radial-blur.esm.js","../../filters/reflection/lib/filter-reflection.esm.js","../../filters/rgb-split/lib/filter-rgb-split.esm.js","../../filters/shockwave/lib/filter-shockwave.esm.js","../../filters/simple-lightmap/lib/filter-simple-lightmap.esm.js","../../filters/tilt-shift/lib/filter-tilt-shift.esm.js","../../filters/twist/lib/filter-twist.esm.js","../../filters/zoom-blur/lib/filter-zoom-blur.esm.js"],"sourcesContent":["/*!\n * @pixi/filter-adjustment - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-adjustment is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform float gamma;\\nuniform float contrast;\\nuniform float saturation;\\nuniform float brightness;\\nuniform float red;\\nuniform float green;\\nuniform float blue;\\nuniform float alpha;\\n\\nvoid main(void)\\n{\\n vec4 c = texture2D(uSampler, vTextureCoord);\\n\\n if (c.a > 0.0) {\\n c.rgb /= c.a;\\n\\n vec3 rgb = pow(c.rgb, vec3(1. / gamma));\\n rgb = mix(vec3(.5), mix(vec3(dot(vec3(.2125, .7154, .0721), rgb)), rgb, saturation), contrast);\\n rgb.r *= red;\\n rgb.g *= green;\\n rgb.b *= blue;\\n c.rgb = rgb * brightness;\\n\\n c.rgb *= c.a;\\n }\\n\\n gl_FragColor = c * alpha;\\n}\\n\";\n\n/**\n * The ability to adjust gamma, contrast, saturation, brightness, alpha or color-channel shift. This is a faster\n * and much simpler to use than {@link http://pixijs.download/release/docs/PIXI.filters.ColorMatrixFilter.html ColorMatrixFilter}\n * because it does not use a matrix.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/adjustment.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-adjustment|@pixi/filter-adjustment}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object|number} [options] - The optional parameters of the filter.\n * @param {number} [options.gamma=1] - The amount of luminance\n * @param {number} [options.saturation=1] - The amount of color saturation\n * @param {number} [options.contrast=1] - The amount of contrast\n * @param {number} [options.brightness=1] - The overall brightness\n * @param {number} [options.red=1] - The multipled red channel\n * @param {number} [options.green=1] - The multipled green channel\n * @param {number} [options.blue=1] - The multipled blue channel\n * @param {number} [options.alpha=1] - The overall alpha amount\n */\nvar AdjustmentFilter = /*@__PURE__*/(function (Filter) {\n function AdjustmentFilter(options) {\n Filter.call(this, vertex, fragment);\n\n Object.assign(this, {\n /**\n * The amount of luminance\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n gamma: 1,\n\n /**\n * The amount of saturation\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n saturation: 1,\n\n /**\n * The amount of contrast\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n contrast: 1,\n\n /**\n * The amount of brightness\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n brightness: 1,\n\n /**\n * The amount of red channel\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n red: 1,\n\n /**\n * The amount of green channel\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n green: 1,\n\n /**\n * The amount of blue channel\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n blue: 1,\n\n /**\n * The amount of alpha channel\n * @member {number}\n * @memberof PIXI.filters.AdjustmentFilter#\n * @default 1\n */\n alpha: 1,\n }, options);\n }\n\n if ( Filter ) AdjustmentFilter.__proto__ = Filter;\n AdjustmentFilter.prototype = Object.create( Filter && Filter.prototype );\n AdjustmentFilter.prototype.constructor = AdjustmentFilter;\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n AdjustmentFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.gamma = Math.max(this.gamma, 0.0001);\n this.uniforms.saturation = this.saturation;\n this.uniforms.contrast = this.contrast;\n this.uniforms.brightness = this.brightness;\n this.uniforms.red = this.red;\n this.uniforms.green = this.green;\n this.uniforms.blue = this.blue;\n this.uniforms.alpha = this.alpha;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n return AdjustmentFilter;\n}(Filter));\n\nexport { AdjustmentFilter };\n//# sourceMappingURL=filter-adjustment.esm.js.map\n","/*!\n * @pixi/filter-kawase-blur - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-kawase-blur is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { Point } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"\\nvarying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec2 uOffset;\\n\\nvoid main(void)\\n{\\n vec4 color = vec4(0.0);\\n\\n // Sample top left pixel\\n color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y));\\n\\n // Sample top right pixel\\n color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y));\\n\\n // Sample bottom right pixel\\n color += texture2D(uSampler, vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y));\\n\\n // Sample bottom left pixel\\n color += texture2D(uSampler, vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y));\\n\\n // Average\\n color *= 0.25;\\n\\n gl_FragColor = color;\\n}\";\n\nvar fragmentClamp = \"\\nvarying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec2 uOffset;\\nuniform vec4 filterClamp;\\n\\nvoid main(void)\\n{\\n vec4 color = vec4(0.0);\\n\\n // Sample top left pixel\\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\\n\\n // Sample top right pixel\\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y + uOffset.y), filterClamp.xy, filterClamp.zw));\\n\\n // Sample bottom right pixel\\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x + uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\\n\\n // Sample bottom left pixel\\n color += texture2D(uSampler, clamp(vec2(vTextureCoord.x - uOffset.x, vTextureCoord.y - uOffset.y), filterClamp.xy, filterClamp.zw));\\n\\n // Average\\n color *= 0.25;\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * A much faster blur than Gaussian blur, but more complicated to use.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/kawase-blur.png)\n *\n * @see https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-kawase-blur|@pixi/filter-kawase-blur}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number|number[]} [blur=4] - The blur of the filter. Should be greater than `0`. If\n * value is an Array, setting kernels.\n * @param {number} [quality=3] - The quality of the filter. Should be an integer greater than `1`.\n * @param {boolean} [clamp=false] - Clamp edges, useful for removing dark edges\n * from fullscreen filters or bleeding to the edge of filterArea.\n */\nvar KawaseBlurFilter = /*@__PURE__*/(function (Filter) {\n function KawaseBlurFilter(blur, quality, clamp) {\n if ( blur === void 0 ) blur = 4;\n if ( quality === void 0 ) quality = 3;\n if ( clamp === void 0 ) clamp = false;\n\n Filter.call(this, vertex, clamp ? fragmentClamp : fragment);\n this.uniforms.uOffset = new Float32Array(2);\n\n this._pixelSize = new Point();\n this.pixelSize = 1;\n this._clamp = clamp;\n this._kernels = null;\n\n // if `blur` is array , as kernels\n if (Array.isArray(blur)) {\n this.kernels = blur;\n }\n else {\n this._blur = blur;\n this.quality = quality;\n }\n }\n\n if ( Filter ) KawaseBlurFilter.__proto__ = Filter;\n KawaseBlurFilter.prototype = Object.create( Filter && Filter.prototype );\n KawaseBlurFilter.prototype.constructor = KawaseBlurFilter;\n\n var prototypeAccessors = { kernels: { configurable: true },clamp: { configurable: true },pixelSize: { configurable: true },quality: { configurable: true },blur: { configurable: true } };\n\n /**\n * Overrides apply\n * @private\n */\n KawaseBlurFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n var uvX = this.pixelSize.x / input._frame.width;\n var uvY = this.pixelSize.y / input._frame.height;\n var offset;\n\n if (this._quality === 1 || this._blur === 0) {\n offset = this._kernels[0] + 0.5;\n this.uniforms.uOffset[0] = offset * uvX;\n this.uniforms.uOffset[1] = offset * uvY;\n filterManager.applyFilter(this, input, output, clear);\n }\n else {\n var renderTarget = filterManager.getFilterTexture();\n\n var source = input;\n var target = renderTarget;\n var tmp;\n\n var last = this._quality - 1;\n\n for (var i = 0; i < last; i++) {\n offset = this._kernels[i] + 0.5;\n this.uniforms.uOffset[0] = offset * uvX;\n this.uniforms.uOffset[1] = offset * uvY;\n filterManager.applyFilter(this, source, target, true);\n\n tmp = source;\n source = target;\n target = tmp;\n }\n offset = this._kernels[last] + 0.5;\n this.uniforms.uOffset[0] = offset * uvX;\n this.uniforms.uOffset[1] = offset * uvY;\n filterManager.applyFilter(this, source, output, clear);\n\n filterManager.returnFilterTexture(renderTarget);\n }\n };\n\n /**\n * Auto generate kernels by blur & quality\n * @private\n */\n KawaseBlurFilter.prototype._generateKernels = function _generateKernels () {\n var blur = this._blur;\n var quality = this._quality;\n var kernels = [ blur ];\n\n if (blur > 0) {\n var k = blur;\n var step = blur / quality;\n\n for (var i = 1; i < quality; i++) {\n k -= step;\n kernels.push(k);\n }\n }\n\n this._kernels = kernels;\n };\n\n /**\n * The kernel size of the blur filter, for advanced usage.\n *\n * @member {number[]}\n * @default [0]\n */\n prototypeAccessors.kernels.get = function () {\n return this._kernels;\n };\n prototypeAccessors.kernels.set = function (value) {\n if (Array.isArray(value) && value.length > 0) {\n this._kernels = value;\n this._quality = value.length;\n this._blur = Math.max.apply(Math, value);\n }\n else {\n // if value is invalid , set default value\n this._kernels = [0];\n this._quality = 1;\n }\n };\n\n /**\n * Get the if the filter is clampped.\n *\n * @readonly\n * @member {boolean}\n * @default false\n */\n prototypeAccessors.clamp.get = function () {\n return this._clamp;\n };\n\n /**\n * Sets the pixel size of the filter. Large size is blurrier. For advanced usage.\n *\n * @member {PIXI.Point|number[]}\n * @default [1, 1]\n */\n prototypeAccessors.pixelSize.set = function (value) {\n if (typeof value === 'number') {\n this._pixelSize.x = value;\n this._pixelSize.y = value;\n }\n else if (Array.isArray(value)) {\n this._pixelSize.x = value[0];\n this._pixelSize.y = value[1];\n }\n else if (value instanceof Point) {\n this._pixelSize.x = value.x;\n this._pixelSize.y = value.y;\n }\n else {\n // if value is invalid , set default value\n this._pixelSize.x = 1;\n this._pixelSize.y = 1;\n }\n };\n prototypeAccessors.pixelSize.get = function () {\n return this._pixelSize;\n };\n\n /**\n * The quality of the filter, integer greater than `1`.\n *\n * @member {number}\n * @default 3\n */\n prototypeAccessors.quality.get = function () {\n return this._quality;\n };\n prototypeAccessors.quality.set = function (value) {\n this._quality = Math.max(1, Math.round(value));\n this._generateKernels();\n };\n\n /**\n * The amount of blur, value greater than `0`.\n *\n * @member {number}\n * @default 4\n */\n prototypeAccessors.blur.get = function () {\n return this._blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this._blur = value;\n this._generateKernels();\n };\n\n Object.defineProperties( KawaseBlurFilter.prototype, prototypeAccessors );\n\n return KawaseBlurFilter;\n}(Filter));\n\nexport { KawaseBlurFilter };\n//# sourceMappingURL=filter-kawase-blur.esm.js.map\n","/*!\n * @pixi/filter-advanced-bloom - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-advanced-bloom is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { KawaseBlurFilter } from '@pixi/filter-kawase-blur';\nimport { settings } from '@pixi/settings';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"\\nuniform sampler2D uSampler;\\nvarying vec2 vTextureCoord;\\n\\nuniform float threshold;\\n\\nvoid main() {\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n\\n // A simple & fast algorithm for getting brightness.\\n // It's inaccuracy , but good enought for this feature.\\n float _max = max(max(color.r, color.g), color.b);\\n float _min = min(min(color.r, color.g), color.b);\\n float brightness = (_max + _min) * 0.5;\\n\\n if(brightness > threshold) {\\n gl_FragColor = color;\\n } else {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\\n }\\n}\\n\";\n\n/**\n * Internal filter for AdvancedBloomFilter to get brightness.\n * @class\n * @private\n * @param {number} [threshold=0.5] Defines how bright a color needs to be extracted.\n */\nvar ExtractBrightnessFilter = /*@__PURE__*/(function (Filter) {\n function ExtractBrightnessFilter(threshold) {\n if ( threshold === void 0 ) threshold = 0.5;\n\n Filter.call(this, vertex, fragment);\n\n this.threshold = threshold;\n }\n\n if ( Filter ) ExtractBrightnessFilter.__proto__ = Filter;\n ExtractBrightnessFilter.prototype = Object.create( Filter && Filter.prototype );\n ExtractBrightnessFilter.prototype.constructor = ExtractBrightnessFilter;\n\n var prototypeAccessors = { threshold: { configurable: true } };\n\n /**\n * Defines how bright a color needs to be extracted.\n *\n * @member {number}\n * @default 0.5\n */\n prototypeAccessors.threshold.get = function () {\n return this.uniforms.threshold;\n };\n prototypeAccessors.threshold.set = function (value) {\n this.uniforms.threshold = value;\n };\n\n Object.defineProperties( ExtractBrightnessFilter.prototype, prototypeAccessors );\n\n return ExtractBrightnessFilter;\n}(Filter));\n\nvar fragment$1 = \"uniform sampler2D uSampler;\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D bloomTexture;\\nuniform float bloomScale;\\nuniform float brightness;\\n\\nvoid main() {\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n color.rgb *= brightness;\\n vec4 bloomColor = vec4(texture2D(bloomTexture, vTextureCoord).rgb, 0.0);\\n bloomColor.rgb *= bloomScale;\\n gl_FragColor = color + bloomColor;\\n}\\n\";\n\n/**\n * The AdvancedBloomFilter applies a Bloom Effect to an object. Unlike the normal BloomFilter\n * this had some advanced controls for adjusting the look of the bloom. Note: this filter\n * is slower than normal BloomFilter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/advanced-bloom.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-advanced-bloom|@pixi/filter-advanced-bloom}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object|number} [options] - The optional parameters of advanced bloom filter.\n * When options is a number , it will be `options.threshold`.\n * @param {number} [options.threshold=0.5] - Defines how bright a color needs to be to affect bloom.\n * @param {number} [options.bloomScale=1.0] - To adjust the strength of the bloom. Higher values is more intense brightness.\n * @param {number} [options.brightness=1.0] - The brightness, lower value is more subtle brightness, higher value is blown-out.\n * @param {number} [options.blur=8] - Sets the strength of the Blur properties simultaneously\n * @param {number} [options.quality=4] - The quality of the Blur filter.\n * @param {number[]} [options.kernels=null] - The kernels of the Blur filter.\n * @param {number|number[]|PIXI.Point} [options.pixelSize=1] - the pixelSize of the Blur filter.\n * @param {number} [options.resolution=PIXI.settings.RESOLUTION] - The resolution of the Blur filter.\n */\nvar AdvancedBloomFilter = /*@__PURE__*/(function (Filter) {\n function AdvancedBloomFilter(options) {\n\n Filter.call(this, vertex, fragment$1);\n\n if (typeof options === 'number') {\n options = { threshold: options };\n }\n\n options = Object.assign({\n threshold: 0.5,\n bloomScale: 1.0,\n brightness: 1.0,\n kernels: null,\n blur: 8,\n quality: 4,\n pixelSize: 1,\n resolution: settings.RESOLUTION,\n }, options);\n\n /**\n * To adjust the strength of the bloom. Higher values is more intense brightness.\n *\n * @member {number}\n * @default 1.0\n */\n this.bloomScale = options.bloomScale;\n\n /**\n * The brightness, lower value is more subtle brightness, higher value is blown-out.\n *\n * @member {number}\n * @default 1.0\n */\n this.brightness = options.brightness;\n\n var kernels = options.kernels;\n var blur = options.blur;\n var quality = options.quality;\n var pixelSize = options.pixelSize;\n var resolution = options.resolution;\n\n this._extractFilter = new ExtractBrightnessFilter(options.threshold);\n this._extractFilter.resolution = resolution;\n this._blurFilter = kernels ?\n new KawaseBlurFilter(kernels) :\n new KawaseBlurFilter(blur, quality);\n this.pixelSize = pixelSize;\n this.resolution = resolution;\n }\n\n if ( Filter ) AdvancedBloomFilter.__proto__ = Filter;\n AdvancedBloomFilter.prototype = Object.create( Filter && Filter.prototype );\n AdvancedBloomFilter.prototype.constructor = AdvancedBloomFilter;\n\n var prototypeAccessors = { resolution: { configurable: true },threshold: { configurable: true },kernels: { configurable: true },blur: { configurable: true },quality: { configurable: true },pixelSize: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n AdvancedBloomFilter.prototype.apply = function apply (filterManager, input, output, clear, currentState) {\n\n var brightTarget = filterManager.getFilterTexture();\n\n this._extractFilter.apply(filterManager, input, brightTarget, true, currentState);\n\n var bloomTarget = filterManager.getFilterTexture();\n\n this._blurFilter.apply(filterManager, brightTarget, bloomTarget, true, currentState);\n\n this.uniforms.bloomScale = this.bloomScale;\n this.uniforms.brightness = this.brightness;\n this.uniforms.bloomTexture = bloomTarget;\n\n filterManager.applyFilter(this, input, output, clear);\n\n filterManager.returnFilterTexture(bloomTarget);\n filterManager.returnFilterTexture(brightTarget);\n };\n\n /**\n * The resolution of the filter.\n *\n * @member {number}\n */\n prototypeAccessors.resolution.get = function () {\n return this._resolution;\n };\n prototypeAccessors.resolution.set = function (value) {\n this._resolution = value;\n\n if (this._extractFilter) {\n this._extractFilter.resolution = value;\n }\n if (this._blurFilter) {\n this._blurFilter.resolution = value;\n }\n };\n\n /**\n * Defines how bright a color needs to be to affect bloom.\n *\n * @member {number}\n * @default 0.5\n */\n prototypeAccessors.threshold.get = function () {\n return this._extractFilter.threshold;\n };\n prototypeAccessors.threshold.set = function (value) {\n this._extractFilter.threshold = value;\n };\n\n /**\n * Sets the kernels of the Blur Filter\n *\n * @member {number}\n * @default 4\n */\n prototypeAccessors.kernels.get = function () {\n return this._blurFilter.kernels;\n };\n prototypeAccessors.kernels.set = function (value) {\n this._blurFilter.kernels = value;\n };\n\n /**\n * Sets the strength of the Blur properties simultaneously\n *\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blur.get = function () {\n return this._blurFilter.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this._blurFilter.blur = value;\n };\n\n /**\n * Sets the quality of the Blur Filter\n *\n * @member {number}\n * @default 4\n */\n prototypeAccessors.quality.get = function () {\n return this._blurFilter.quality;\n };\n prototypeAccessors.quality.set = function (value) {\n this._blurFilter.quality = value;\n };\n\n /**\n * Sets the pixelSize of the Kawase Blur filter\n *\n * @member {number|number[]|PIXI.Point}\n * @default 1\n */\n prototypeAccessors.pixelSize.get = function () {\n return this._blurFilter.pixelSize;\n };\n prototypeAccessors.pixelSize.set = function (value) {\n this._blurFilter.pixelSize = value;\n };\n\n Object.defineProperties( AdvancedBloomFilter.prototype, prototypeAccessors );\n\n return AdvancedBloomFilter;\n}(Filter));\n\nexport { AdvancedBloomFilter };\n//# sourceMappingURL=filter-advanced-bloom.esm.js.map\n","/*!\n * @pixi/filter-ascii - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-ascii is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\n\\nuniform vec4 filterArea;\\nuniform float pixelSize;\\nuniform sampler2D uSampler;\\n\\nvec2 mapCoord( vec2 coord )\\n{\\n coord *= filterArea.xy;\\n coord += filterArea.zw;\\n\\n return coord;\\n}\\n\\nvec2 unmapCoord( vec2 coord )\\n{\\n coord -= filterArea.zw;\\n coord /= filterArea.xy;\\n\\n return coord;\\n}\\n\\nvec2 pixelate(vec2 coord, vec2 size)\\n{\\n return floor( coord / size ) * size;\\n}\\n\\nvec2 getMod(vec2 coord, vec2 size)\\n{\\n return mod( coord , size) / size;\\n}\\n\\nfloat character(float n, vec2 p)\\n{\\n p = floor(p*vec2(4.0, -4.0) + 2.5);\\n\\n if (clamp(p.x, 0.0, 4.0) == p.x)\\n {\\n if (clamp(p.y, 0.0, 4.0) == p.y)\\n {\\n if (int(mod(n/exp2(p.x + 5.0*p.y), 2.0)) == 1) return 1.0;\\n }\\n }\\n return 0.0;\\n}\\n\\nvoid main()\\n{\\n vec2 coord = mapCoord(vTextureCoord);\\n\\n // get the rounded color..\\n vec2 pixCoord = pixelate(coord, vec2(pixelSize));\\n pixCoord = unmapCoord(pixCoord);\\n\\n vec4 color = texture2D(uSampler, pixCoord);\\n\\n // determine the character to use\\n float gray = (color.r + color.g + color.b) / 3.0;\\n\\n float n = 65536.0; // .\\n if (gray > 0.2) n = 65600.0; // :\\n if (gray > 0.3) n = 332772.0; // *\\n if (gray > 0.4) n = 15255086.0; // o\\n if (gray > 0.5) n = 23385164.0; // &\\n if (gray > 0.6) n = 15252014.0; // 8\\n if (gray > 0.7) n = 13199452.0; // @\\n if (gray > 0.8) n = 11512810.0; // #\\n\\n // get the mod..\\n vec2 modd = getMod(coord, vec2(pixelSize));\\n\\n gl_FragColor = color * character( n, vec2(-1.0) + modd * 2.0);\\n\\n}\\n\";\n\n// TODO (cengler) - The Y is flipped in this shader for some reason.\n\n/**\n * @author Vico @vicocotea\n * original shader : https://www.shadertoy.com/view/lssGDj by @movAX13h\n */\n\n/**\n * An ASCII filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/ascii.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-ascii|@pixi/filter-ascii}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [size=8] Size of the font\n */\nvar AsciiFilter = /*@__PURE__*/(function (Filter) {\n function AsciiFilter(size) {\n if ( size === void 0 ) size = 8;\n\n Filter.call(this, vertex, fragment);\n this.size = size;\n }\n\n if ( Filter ) AsciiFilter.__proto__ = Filter;\n AsciiFilter.prototype = Object.create( Filter && Filter.prototype );\n AsciiFilter.prototype.constructor = AsciiFilter;\n\n var prototypeAccessors = { size: { configurable: true } };\n\n /**\n * The pixel size used by the filter.\n *\n * @member {number}\n */\n prototypeAccessors.size.get = function () {\n return this.uniforms.pixelSize;\n };\n prototypeAccessors.size.set = function (value) {\n this.uniforms.pixelSize = value;\n };\n\n Object.defineProperties( AsciiFilter.prototype, prototypeAccessors );\n\n return AsciiFilter;\n}(Filter));\n\nexport { AsciiFilter };\n//# sourceMappingURL=filter-ascii.esm.js.map\n","/*!\n * @pixi/filter-bevel - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-bevel is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { DEG_TO_RAD } from '@pixi/math';\nimport { rgb2hex, hex2rgb } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\n\\nuniform float transformX;\\nuniform float transformY;\\nuniform vec3 lightColor;\\nuniform float lightAlpha;\\nuniform vec3 shadowColor;\\nuniform float shadowAlpha;\\n\\nvoid main(void) {\\n vec2 transform = vec2(1.0 / filterArea) * vec2(transformX, transformY);\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n float light = texture2D(uSampler, vTextureCoord - transform).a;\\n float shadow = texture2D(uSampler, vTextureCoord + transform).a;\\n\\n color.rgb = mix(color.rgb, lightColor, clamp((color.a - light) * lightAlpha, 0.0, 1.0));\\n color.rgb = mix(color.rgb, shadowColor, clamp((color.a - shadow) * shadowAlpha, 0.0, 1.0));\\n gl_FragColor = vec4(color.rgb * color.a, color.a);\\n}\\n\";\n\n/**\n * Bevel Filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/bevel.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-bevel|@pixi/filter-bevel}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {object} [options] - The optional parameters of the filter.\n * @param {number} [options.rotation = 45] - The angle of the light in degrees.\n * @param {number} [options.thickness = 2] - The tickness of the bevel.\n * @param {number} [options.lightColor = 0xffffff] - Color of the light.\n * @param {number} [options.lightAlpha = 0.7] - Alpha of the light.\n * @param {number} [options.shadowColor = 0x000000] - Color of the shadow.\n * @param {number} [options.shadowAlpha = 0.7] - Alpha of the shadow.\n */\nvar BevelFilter = /*@__PURE__*/(function (Filter) {\n function BevelFilter(options) {\n if ( options === void 0 ) options = {};\n\n Filter.call(this, vertex, fragment);\n\n this.uniforms.lightColor = new Float32Array(3);\n this.uniforms.shadowColor = new Float32Array(3);\n\n options = Object.assign({\n rotation: 45,\n thickness: 2,\n lightColor: 0xffffff,\n lightAlpha: 0.7,\n shadowColor: 0x000000,\n shadowAlpha: 0.7,\n }, options);\n\n /**\n * The angle of the light in degrees.\n * @member {number}\n * @default 45\n */\n this.rotation = options.rotation;\n\n /**\n * The tickness of the bevel.\n * @member {number}\n * @default 2\n */\n this.thickness = options.thickness;\n\n /**\n * Color of the light.\n * @member {number}\n * @default 0xffffff\n */\n this.lightColor = options.lightColor;\n\n /**\n * Alpha of the light.\n * @member {number}\n * @default 0.7\n */\n this.lightAlpha = options.lightAlpha;\n\n /**\n * Color of the shadow.\n * @member {number}\n * @default 0x000000\n */\n this.shadowColor = options.shadowColor;\n\n /**\n * Alpha of the shadow.\n * @member {number}\n * @default 0.7\n */\n this.shadowAlpha = options.shadowAlpha;\n\n }\n\n if ( Filter ) BevelFilter.__proto__ = Filter;\n BevelFilter.prototype = Object.create( Filter && Filter.prototype );\n BevelFilter.prototype.constructor = BevelFilter;\n\n var prototypeAccessors = { rotation: { configurable: true },thickness: { configurable: true },lightColor: { configurable: true },lightAlpha: { configurable: true },shadowColor: { configurable: true },shadowAlpha: { configurable: true } };\n\n /**\n * Update the transform matrix of offset angle.\n * @private\n */\n BevelFilter.prototype._updateTransform = function _updateTransform () {\n this.uniforms.transformX = this._thickness * Math.cos(this._angle);\n this.uniforms.transformY = this._thickness * Math.sin(this._angle);\n };\n\n prototypeAccessors.rotation.get = function () {\n return this._angle / DEG_TO_RAD;\n };\n prototypeAccessors.rotation.set = function (value) {\n this._angle = value * DEG_TO_RAD;\n this._updateTransform();\n };\n\n prototypeAccessors.thickness.get = function () {\n return this._thickness;\n };\n prototypeAccessors.thickness.set = function (value) {\n this._thickness = value;\n this._updateTransform();\n };\n\n prototypeAccessors.lightColor.get = function () {\n return rgb2hex(this.uniforms.lightColor);\n };\n prototypeAccessors.lightColor.set = function (value) {\n hex2rgb(value, this.uniforms.lightColor);\n };\n\n prototypeAccessors.lightAlpha.get = function () {\n return this.uniforms.lightAlpha;\n };\n prototypeAccessors.lightAlpha.set = function (value) {\n this.uniforms.lightAlpha = value;\n };\n\n prototypeAccessors.shadowColor.get = function () {\n return rgb2hex(this.uniforms.shadowColor);\n };\n prototypeAccessors.shadowColor.set = function (value) {\n hex2rgb(value, this.uniforms.shadowColor);\n };\n\n prototypeAccessors.shadowAlpha.get = function () {\n return this.uniforms.shadowAlpha;\n };\n prototypeAccessors.shadowAlpha.set = function (value) {\n this.uniforms.shadowAlpha = value;\n };\n\n Object.defineProperties( BevelFilter.prototype, prototypeAccessors );\n\n return BevelFilter;\n}(Filter));\n\nexport { BevelFilter };\n//# sourceMappingURL=filter-bevel.esm.js.map\n","/*!\n * @pixi/filter-bloom - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-bloom is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { BLEND_MODES } from '@pixi/constants';\nimport { AlphaFilter } from '@pixi/filter-alpha';\nimport { BlurFilterPass } from '@pixi/filter-blur';\nimport { settings } from '@pixi/settings';\nimport { Point } from '@pixi/math';\n\n/**\n * The BloomFilter applies a Gaussian blur to an object.\n * The strength of the blur can be set for x- and y-axis separately.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/bloom.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-bloom|@pixi/filter-bloom}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number|PIXI.Point|number[]} [blur=2] Sets the strength of both the blurX and blurY properties simultaneously\n * @param {number} [quality=4] The quality of the blurX & blurY filter.\n * @param {number} [resolution=PIXI.settings.RESOLUTION] The resolution of the blurX & blurY filter.\n * @param {number} [kernelSize=5] The kernelSize of the blurX & blurY filter.Options: 5, 7, 9, 11, 13, 15.\n */\nvar BloomFilter = /*@__PURE__*/(function (Filter) {\n function BloomFilter(blur, quality, resolution, kernelSize) {\n if ( blur === void 0 ) blur = 2;\n if ( quality === void 0 ) quality = 4;\n if ( resolution === void 0 ) resolution = settings.RESOLUTION;\n if ( kernelSize === void 0 ) kernelSize = 5;\n\n Filter.call(this);\n\n var blurX;\n var blurY;\n\n if (typeof blur === 'number') {\n blurX = blur;\n blurY = blur;\n }\n else if (blur instanceof Point) {\n blurX = blur.x;\n blurY = blur.y;\n }\n else if (Array.isArray(blur)) {\n blurX = blur[0];\n blurY = blur[1];\n }\n\n this.blurXFilter = new BlurFilterPass(true, blurX, quality, resolution, kernelSize);\n this.blurYFilter = new BlurFilterPass(false, blurY, quality, resolution, kernelSize);\n this.blurYFilter.blendMode = BLEND_MODES.SCREEN;\n this.defaultFilter = new AlphaFilter();\n }\n\n if ( Filter ) BloomFilter.__proto__ = Filter;\n BloomFilter.prototype = Object.create( Filter && Filter.prototype );\n BloomFilter.prototype.constructor = BloomFilter;\n\n var prototypeAccessors = { blur: { configurable: true },blurX: { configurable: true },blurY: { configurable: true } };\n\n BloomFilter.prototype.apply = function apply (filterManager, input, output) {\n var renderTarget = filterManager.getFilterTexture(true);\n\n //TODO - copyTexSubImage2D could be used here?\n this.defaultFilter.apply(filterManager, input, output);\n\n this.blurXFilter.apply(filterManager, input, renderTarget);\n this.blurYFilter.apply(filterManager, renderTarget, output);\n\n filterManager.returnFilterTexture(renderTarget);\n };\n\n /**\n * Sets the strength of both the blurX and blurY properties simultaneously\n *\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blur.get = function () {\n return this.blurXFilter.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this.blurXFilter.blur = this.blurYFilter.blur = value;\n };\n\n /**\n * Sets the strength of the blurX property\n *\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blurX.get = function () {\n return this.blurXFilter.blur;\n };\n prototypeAccessors.blurX.set = function (value) {\n this.blurXFilter.blur = value;\n };\n\n /**\n * Sets the strength of the blurY property\n *\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blurY.get = function () {\n return this.blurYFilter.blur;\n };\n prototypeAccessors.blurY.set = function (value) {\n this.blurYFilter.blur = value;\n };\n\n Object.defineProperties( BloomFilter.prototype, prototypeAccessors );\n\n return BloomFilter;\n}(Filter));\n\nexport { BloomFilter };\n//# sourceMappingURL=filter-bloom.esm.js.map\n","/*!\n * @pixi/filter-bulge-pinch - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-bulge-pinch is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"uniform float radius;\\nuniform float strength;\\nuniform vec2 center;\\nuniform sampler2D uSampler;\\nvarying vec2 vTextureCoord;\\n\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\nuniform vec2 dimensions;\\n\\nvoid main()\\n{\\n vec2 coord = vTextureCoord * filterArea.xy;\\n coord -= center * dimensions.xy;\\n float distance = length(coord);\\n if (distance < radius) {\\n float percent = distance / radius;\\n if (strength > 0.0) {\\n coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75);\\n } else {\\n coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent);\\n }\\n }\\n coord += center * dimensions.xy;\\n coord /= filterArea.xy;\\n vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw);\\n vec4 color = texture2D(uSampler, clampedCoord);\\n if (coord != clampedCoord) {\\n color *= max(0.0, 1.0 - length(coord - clampedCoord));\\n }\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * @author Julien CLEREL @JuloxRox\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/warp/bulgepinch.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * Bulges or pinches the image in a circle.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/bulge-pinch.gif)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-bulge-pinch|@pixi/filter-bulge-pinch}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {PIXI.Point|Array} [center=[0,0]] The x and y coordinates of the center of the circle of effect.\n * @param {number} [radius=100] The radius of the circle of effect.\n * @param {number} [strength=1] -1 to 1 (-1 is strong pinch, 0 is no effect, 1 is strong bulge)\n */\nvar BulgePinchFilter = /*@__PURE__*/(function (Filter) {\n function BulgePinchFilter(center, radius, strength) {\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n this.center = center || [0.5, 0.5];\n this.radius = (typeof radius === 'number') ? radius : 100; // allow 0 to be passed\n this.strength = (typeof strength === 'number') ? strength : 1; // allow 0 to be passed\n }\n\n if ( Filter ) BulgePinchFilter.__proto__ = Filter;\n BulgePinchFilter.prototype = Object.create( Filter && Filter.prototype );\n BulgePinchFilter.prototype.constructor = BulgePinchFilter;\n\n var prototypeAccessors = { radius: { configurable: true },strength: { configurable: true },center: { configurable: true } };\n\n BulgePinchFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * The radius of the circle of effect.\n *\n * @member {number}\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.radius;\n };\n prototypeAccessors.radius.set = function (value) {\n this.uniforms.radius = value;\n };\n\n /**\n * The strength of the effect. -1 to 1 (-1 is strong pinch, 0 is no effect, 1 is strong bulge)\n *\n * @member {number}\n */\n prototypeAccessors.strength.get = function () {\n return this.uniforms.strength;\n };\n prototypeAccessors.strength.set = function (value) {\n this.uniforms.strength = value;\n };\n\n /**\n * The x and y coordinates of the center of the circle of effect.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.center.get = function () {\n return this.uniforms.center;\n };\n prototypeAccessors.center.set = function (value) {\n this.uniforms.center = value;\n };\n\n Object.defineProperties( BulgePinchFilter.prototype, prototypeAccessors );\n\n return BulgePinchFilter;\n}(Filter));\n\nexport { BulgePinchFilter };\n//# sourceMappingURL=filter-bulge-pinch.esm.js.map\n","/*!\n * @pixi/filter-color-map - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-color-map is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Texture, Filter } from '@pixi/core';\nimport { SCALE_MODES } from '@pixi/constants';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform sampler2D colorMap;\\nuniform float _mix;\\nuniform float _size;\\nuniform float _sliceSize;\\nuniform float _slicePixelSize;\\nuniform float _sliceInnerSize;\\nvoid main() {\\n vec4 color = texture2D(uSampler, vTextureCoord.xy);\\n\\n vec4 adjusted;\\n if (color.a > 0.0) {\\n color.rgb /= color.a;\\n float innerWidth = _size - 1.0;\\n float zSlice0 = min(floor(color.b * innerWidth), innerWidth);\\n float zSlice1 = min(zSlice0 + 1.0, innerWidth);\\n float xOffset = _slicePixelSize * 0.5 + color.r * _sliceInnerSize;\\n float s0 = xOffset + (zSlice0 * _sliceSize);\\n float s1 = xOffset + (zSlice1 * _sliceSize);\\n float yOffset = _sliceSize * 0.5 + color.g * (1.0 - _sliceSize);\\n vec4 slice0Color = texture2D(colorMap, vec2(s0,yOffset));\\n vec4 slice1Color = texture2D(colorMap, vec2(s1,yOffset));\\n float zOffset = fract(color.b * innerWidth);\\n adjusted = mix(slice0Color, slice1Color, zOffset);\\n\\n color.rgb *= color.a;\\n }\\n gl_FragColor = vec4(mix(color, adjusted, _mix).rgb, color.a);\\n\\n}\";\n\n/**\n * The ColorMapFilter applies a color-map effect to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/color-map.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-color-map|@pixi/filter-color-map}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {HTMLImageElement|HTMLCanvasElement|PIXI.BaseTexture|PIXI.Texture} [colorMap] - The colorMap texture of the filter.\n * @param {boolean} [nearest=false] - Whether use NEAREST for colorMap texture.\n * @param {number} [mix=1] - The mix from 0 to 1, where 0 is the original image and 1 is the color mapped image.\n */\nvar ColorMapFilter = /*@__PURE__*/(function (Filter) {\n function ColorMapFilter(colorMap, nearest, mix) {\n if ( nearest === void 0 ) nearest = false;\n if ( mix === void 0 ) mix = 1;\n\n Filter.call(this, vertex, fragment);\n\n this._size = 0;\n this._sliceSize = 0;\n this._slicePixelSize = 0;\n this._sliceInnerSize = 0;\n\n this._scaleMode = null;\n this._nearest = false;\n this.nearest = nearest;\n\n /**\n * The mix from 0 to 1, where 0 is the original image and 1 is the color mapped image.\n * @member {number}\n */\n this.mix = mix;\n\n this.colorMap = colorMap;\n }\n\n if ( Filter ) ColorMapFilter.__proto__ = Filter;\n ColorMapFilter.prototype = Object.create( Filter && Filter.prototype );\n ColorMapFilter.prototype.constructor = ColorMapFilter;\n\n var prototypeAccessors = { colorSize: { configurable: true },colorMap: { configurable: true },nearest: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n ColorMapFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms._mix = this.mix;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * the size of one color slice\n * @member {number}\n * @readonly\n */\n prototypeAccessors.colorSize.get = function () {\n return this._size;\n };\n\n /**\n * the colorMap texture\n * @member {PIXI.Texture}\n */\n prototypeAccessors.colorMap.get = function () {\n return this._colorMap;\n };\n prototypeAccessors.colorMap.set = function (colorMap) {\n if (!(colorMap instanceof Texture)) {\n colorMap = Texture.from(colorMap);\n }\n if (colorMap && colorMap.baseTexture) {\n colorMap.baseTexture.scaleMode = this._scaleMode;\n colorMap.baseTexture.mipmap = false;\n\n this._size = colorMap.height;\n this._sliceSize = 1 / this._size;\n this._slicePixelSize = this._sliceSize / this._size;\n this._sliceInnerSize = this._slicePixelSize * (this._size - 1);\n\n this.uniforms._size = this._size;\n this.uniforms._sliceSize = this._sliceSize;\n this.uniforms._slicePixelSize = this._slicePixelSize;\n this.uniforms._sliceInnerSize = this._sliceInnerSize;\n\n this.uniforms.colorMap = colorMap;\n }\n\n this._colorMap = colorMap;\n };\n\n /**\n * Whether use NEAREST for colorMap texture.\n * @member {boolean}\n */\n prototypeAccessors.nearest.get = function () {\n return this._nearest;\n };\n prototypeAccessors.nearest.set = function (nearest) {\n this._nearest = nearest;\n this._scaleMode = nearest ? SCALE_MODES.NEAREST : SCALE_MODES.LINEAR;\n\n var texture = this._colorMap;\n\n if (texture && texture.baseTexture) {\n texture.baseTexture._glTextures = {};\n\n texture.baseTexture.scaleMode = this._scaleMode;\n texture.baseTexture.mipmap = false;\n\n texture._updateID++;\n texture.baseTexture.emit('update', texture.baseTexture);\n }\n };\n\n /**\n * If the colorMap is based on canvas , and the content of canvas has changed,\n * then call `updateColorMap` for update texture.\n */\n ColorMapFilter.prototype.updateColorMap = function updateColorMap () {\n var texture = this._colorMap;\n\n if (texture && texture.baseTexture) {\n texture._updateID++;\n texture.baseTexture.emit('update', texture.baseTexture);\n\n this.colorMap = texture;\n }\n };\n\n /**\n * Destroys this filter\n *\n * @param {boolean} [destroyBase=false] Whether to destroy the base texture of colorMap as well\n */\n ColorMapFilter.prototype.destroy = function destroy (destroyBase) {\n if (this._colorMap) {\n this._colorMap.destroy(destroyBase);\n }\n Filter.prototype.destroy.call(this);\n };\n\n Object.defineProperties( ColorMapFilter.prototype, prototypeAccessors );\n\n return ColorMapFilter;\n}(Filter));\n\nexport { ColorMapFilter };\n//# sourceMappingURL=filter-color-map.esm.js.map\n","/*!\n * @pixi/filter-color-replace - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-color-replace is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { hex2rgb, rgb2hex } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec3 originalColor;\\nuniform vec3 newColor;\\nuniform float epsilon;\\nvoid main(void) {\\n vec4 currentColor = texture2D(uSampler, vTextureCoord);\\n vec3 colorDiff = originalColor - (currentColor.rgb / max(currentColor.a, 0.0000000001));\\n float colorDistance = length(colorDiff);\\n float doReplace = step(colorDistance, epsilon);\\n gl_FragColor = vec4(mix(currentColor.rgb, (newColor + colorDiff) * currentColor.a, doReplace), currentColor.a);\\n}\\n\";\n\n/**\n * ColorReplaceFilter, originally by mishaa, updated by timetocode\n * http://www.html5gamedevs.com/topic/10640-outline-a-sprite-change-certain-colors/?p=69966
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/color-replace.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-color-replace|@pixi/filter-color-replace}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number|Array} [originalColor=0xFF0000] The color that will be changed, as a 3 component RGB e.g. [1.0, 1.0, 1.0]\n * @param {number|Array} [newColor=0x000000] The resulting color, as a 3 component RGB e.g. [1.0, 0.5, 1.0]\n * @param {number} [epsilon=0.4] Tolerance/sensitivity of the floating-point comparison between colors (lower = more exact, higher = more inclusive)\n *\n * @example\n * // replaces true red with true blue\n * someSprite.filters = [new ColorReplaceFilter(\n * [1, 0, 0],\n * [0, 0, 1],\n * 0.001\n * )];\n * // replaces the RGB color 220, 220, 220 with the RGB color 225, 200, 215\n * someOtherSprite.filters = [new ColorReplaceFilter(\n * [220/255.0, 220/255.0, 220/255.0],\n * [225/255.0, 200/255.0, 215/255.0],\n * 0.001\n * )];\n * // replaces the RGB color 220, 220, 220 with the RGB color 225, 200, 215\n * someOtherSprite.filters = [new ColorReplaceFilter(0xdcdcdc, 0xe1c8d7, 0.001)];\n *\n */\nvar ColorReplaceFilter = /*@__PURE__*/(function (Filter) {\n function ColorReplaceFilter(originalColor, newColor, epsilon) {\n if ( originalColor === void 0 ) originalColor = 0xFF0000;\n if ( newColor === void 0 ) newColor = 0x000000;\n if ( epsilon === void 0 ) epsilon = 0.4;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.originalColor = new Float32Array(3);\n this.uniforms.newColor = new Float32Array(3);\n this.originalColor = originalColor;\n this.newColor = newColor;\n this.epsilon = epsilon;\n }\n\n if ( Filter ) ColorReplaceFilter.__proto__ = Filter;\n ColorReplaceFilter.prototype = Object.create( Filter && Filter.prototype );\n ColorReplaceFilter.prototype.constructor = ColorReplaceFilter;\n\n var prototypeAccessors = { originalColor: { configurable: true },newColor: { configurable: true },epsilon: { configurable: true } };\n\n /**\n * The color that will be changed, as a 3 component RGB e.g. [1.0, 1.0, 1.0]\n * @member {number|Array}\n * @default 0xFF0000\n */\n prototypeAccessors.originalColor.set = function (value) {\n var arr = this.uniforms.originalColor;\n if (typeof value === 'number') {\n hex2rgb(value, arr);\n this._originalColor = value;\n }\n else {\n arr[0] = value[0];\n arr[1] = value[1];\n arr[2] = value[2];\n this._originalColor = rgb2hex(arr);\n }\n };\n prototypeAccessors.originalColor.get = function () {\n return this._originalColor;\n };\n\n /**\n * The resulting color, as a 3 component RGB e.g. [1.0, 0.5, 1.0]\n * @member {number|Array}\n * @default 0x000000\n */\n prototypeAccessors.newColor.set = function (value) {\n var arr = this.uniforms.newColor;\n if (typeof value === 'number') {\n hex2rgb(value, arr);\n this._newColor = value;\n }\n else {\n arr[0] = value[0];\n arr[1] = value[1];\n arr[2] = value[2];\n this._newColor = rgb2hex(arr);\n }\n };\n prototypeAccessors.newColor.get = function () {\n return this._newColor;\n };\n\n /**\n * Tolerance/sensitivity of the floating-point comparison between colors (lower = more exact, higher = more inclusive)\n * @member {number}\n * @default 0.4\n */\n prototypeAccessors.epsilon.set = function (value) {\n this.uniforms.epsilon = value;\n };\n prototypeAccessors.epsilon.get = function () {\n return this.uniforms.epsilon;\n };\n\n Object.defineProperties( ColorReplaceFilter.prototype, prototypeAccessors );\n\n return ColorReplaceFilter;\n}(Filter));\n\nexport { ColorReplaceFilter };\n//# sourceMappingURL=filter-color-replace.esm.js.map\n","/*!\n * @pixi/filter-convolution - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-convolution is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying mediump vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform vec2 texelSize;\\nuniform float matrix[9];\\n\\nvoid main(void)\\n{\\n vec4 c11 = texture2D(uSampler, vTextureCoord - texelSize); // top left\\n vec4 c12 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y - texelSize.y)); // top center\\n vec4 c13 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y - texelSize.y)); // top right\\n\\n vec4 c21 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y)); // mid left\\n vec4 c22 = texture2D(uSampler, vTextureCoord); // mid center\\n vec4 c23 = texture2D(uSampler, vec2(vTextureCoord.x + texelSize.x, vTextureCoord.y)); // mid right\\n\\n vec4 c31 = texture2D(uSampler, vec2(vTextureCoord.x - texelSize.x, vTextureCoord.y + texelSize.y)); // bottom left\\n vec4 c32 = texture2D(uSampler, vec2(vTextureCoord.x, vTextureCoord.y + texelSize.y)); // bottom center\\n vec4 c33 = texture2D(uSampler, vTextureCoord + texelSize); // bottom right\\n\\n gl_FragColor =\\n c11 * matrix[0] + c12 * matrix[1] + c13 * matrix[2] +\\n c21 * matrix[3] + c22 * matrix[4] + c23 * matrix[5] +\\n c31 * matrix[6] + c32 * matrix[7] + c33 * matrix[8];\\n\\n gl_FragColor.a = c22.a;\\n}\\n\";\n\n/**\n * The ConvolutionFilter class applies a matrix convolution filter effect.\n * A convolution combines pixels in the input image with neighboring pixels to produce a new image.\n * A wide variety of image effects can be achieved through convolutions, including blurring, edge\n * detection, sharpening, embossing, and beveling. The matrix should be specified as a 9 point Array.\n * See http://docs.gimp.org/en/plug-in-convmatrix.html for more info.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/convolution.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-convolution|@pixi/filter-convolution}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param [matrix=[0,0,0,0,0,0,0,0,0]] {number[]} An array of values used for matrix transformation. Specified as a 9 point Array.\n * @param [width=200] {number} Width of the object you are transforming\n * @param [height=200] {number} Height of the object you are transforming\n */\nvar ConvolutionFilter = /*@__PURE__*/(function (Filter) {\n function ConvolutionFilter(matrix, width, height) {\n if ( width === void 0 ) width = 200;\n if ( height === void 0 ) height = 200;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.texelSize = new Float32Array(2);\n this.uniforms.matrix = new Float32Array(9);\n if (matrix !== undefined) {\n this.matrix = matrix;\n }\n this.width = width;\n this.height = height;\n }\n\n if ( Filter ) ConvolutionFilter.__proto__ = Filter;\n ConvolutionFilter.prototype = Object.create( Filter && Filter.prototype );\n ConvolutionFilter.prototype.constructor = ConvolutionFilter;\n\n var prototypeAccessors = { matrix: { configurable: true },width: { configurable: true },height: { configurable: true } };\n\n /**\n * An array of values used for matrix transformation. Specified as a 9 point Array.\n *\n * @member {Array}\n */\n prototypeAccessors.matrix.get = function () {\n return this.uniforms.matrix;\n };\n prototypeAccessors.matrix.set = function (matrix) {\n var this$1 = this;\n\n matrix.forEach(function (v, i) { return this$1.uniforms.matrix[i] = v; });\n };\n\n /**\n * Width of the object you are transforming\n *\n * @member {number}\n */\n prototypeAccessors.width.get = function () {\n return 1/this.uniforms.texelSize[0];\n };\n prototypeAccessors.width.set = function (value) {\n this.uniforms.texelSize[0] = 1/value;\n };\n\n /**\n * Height of the object you are transforming\n *\n * @member {number}\n */\n prototypeAccessors.height.get = function () {\n return 1/this.uniforms.texelSize[1];\n };\n prototypeAccessors.height.set = function (value) {\n this.uniforms.texelSize[1] = 1/value;\n };\n\n Object.defineProperties( ConvolutionFilter.prototype, prototypeAccessors );\n\n return ConvolutionFilter;\n}(Filter));\n\nexport { ConvolutionFilter };\n//# sourceMappingURL=filter-convolution.esm.js.map\n","/*!\n * @pixi/filter-cross-hatch - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-cross-hatch is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\n\\nvoid main(void)\\n{\\n float lum = length(texture2D(uSampler, vTextureCoord.xy).rgb);\\n\\n gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\\n\\n if (lum < 1.00)\\n {\\n if (mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0)\\n {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\\n }\\n }\\n\\n if (lum < 0.75)\\n {\\n if (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0)\\n {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\\n }\\n }\\n\\n if (lum < 0.50)\\n {\\n if (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0)\\n {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\\n }\\n }\\n\\n if (lum < 0.3)\\n {\\n if (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0)\\n {\\n gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);\\n }\\n }\\n}\\n\";\n\n/**\n * A Cross Hatch effect filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/cross-hatch.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-cross-hatch|@pixi/filter-cross-hatch}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n */\nvar CrossHatchFilter = /*@__PURE__*/(function (Filter) {\n function CrossHatchFilter() {\n Filter.call(this, vertex, fragment);\n }\n\n if ( Filter ) CrossHatchFilter.__proto__ = Filter;\n CrossHatchFilter.prototype = Object.create( Filter && Filter.prototype );\n CrossHatchFilter.prototype.constructor = CrossHatchFilter;\n\n return CrossHatchFilter;\n}(Filter));\n\nexport { CrossHatchFilter };\n//# sourceMappingURL=filter-cross-hatch.esm.js.map\n","/*!\n * @pixi/filter-crt - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-crt is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec4 filterArea;\\nuniform vec2 dimensions;\\n\\nconst float SQRT_2 = 1.414213;\\n\\nconst float light = 1.0;\\n\\nuniform float curvature;\\nuniform float lineWidth;\\nuniform float lineContrast;\\nuniform bool verticalLine;\\nuniform float noise;\\nuniform float noiseSize;\\n\\nuniform float vignetting;\\nuniform float vignettingAlpha;\\nuniform float vignettingBlur;\\n\\nuniform float seed;\\nuniform float time;\\n\\nfloat rand(vec2 co) {\\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\\n}\\n\\nvoid main(void)\\n{\\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\\n vec2 coord = pixelCoord / dimensions;\\n\\n vec2 dir = vec2(coord - vec2(0.5, 0.5));\\n\\n float _c = curvature > 0. ? curvature : 1.;\\n float k = curvature > 0. ?(length(dir * dir) * 0.25 * _c * _c + 0.935 * _c) : 1.;\\n vec2 uv = dir * k;\\n\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n vec3 rgb = gl_FragColor.rgb;\\n\\n\\n if (noise > 0.0 && noiseSize > 0.0)\\n {\\n pixelCoord.x = floor(pixelCoord.x / noiseSize);\\n pixelCoord.y = floor(pixelCoord.y / noiseSize);\\n float _noise = rand(pixelCoord * noiseSize * seed) - 0.5;\\n rgb += _noise * noise;\\n }\\n\\n if (lineWidth > 0.0) {\\n float v = (verticalLine ? uv.x * dimensions.x : uv.y * dimensions.y) * min(1.0, 2.0 / lineWidth ) / _c;\\n float j = 1. + cos(v * 1.2 - time) * 0.5 * lineContrast;\\n rgb *= j;\\n float segment = verticalLine ? mod((dir.x + .5) * dimensions.x, 4.) : mod((dir.y + .5) * dimensions.y, 4.);\\n rgb *= 0.99 + ceil(segment) * 0.015;\\n }\\n\\n if (vignetting > 0.0)\\n {\\n float outter = SQRT_2 - vignetting * SQRT_2;\\n float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0);\\n rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha);\\n }\\n\\n gl_FragColor.rgb = rgb;\\n}\\n\";\n\n/**\n * The CRTFilter applies a CRT effect to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/crt.gif)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-crt|@pixi/filter-crt}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object} [options] - The optional parameters of CRT effect\n * @param {number} [options.curvature=1.0] - Bent of interlaced lines, higher value means more bend\n * @param {number} [options.lineWidth=1.0] - Width of the interlaced lines\n * @param {number} [options.lineContrast=0.25] - Contrast of interlaced lines\n * @param {number} [options.verticalLine=false] - `true` is vertical lines, `false` is horizontal\n * @param {number} [options.noise=0.3] - Opacity/intensity of the noise effect between `0` and `1`\n * @param {number} [options.noiseSize=1.0] - The size of the noise particles\n * @param {number} [options.seed=0] - A seed value to apply to the random noise generation\n * @param {number} [options.vignetting=0.3] - The radius of the vignette effect, smaller\n * values produces a smaller vignette\n * @param {number} [options.vignettingAlpha=1.0] - Amount of opacity of vignette\n * @param {number} [options.vignettingBlur=0.3] - Blur intensity of the vignette\n * @param {number} [options.time=0] - For animating interlaced lines\n */\nvar CRTFilter = /*@__PURE__*/(function (Filter) {\n function CRTFilter(options) {\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n\n /**\n * For animating interlaced lines\n *\n * @member {number}\n * @default 0\n */\n this.time = 0;\n\n /**\n * A seed value to apply to the random noise generation\n *\n * @member {number}\n * @default 0\n */\n this.seed = 0;\n\n Object.assign(this, {\n curvature: 1.0,\n lineWidth: 1.0,\n lineContrast: 0.25,\n verticalLine: false,\n noise: 0.0,\n noiseSize: 1.0,\n seed: 0.0,\n vignetting: 0.3,\n vignettingAlpha: 1.0,\n vignettingBlur: 0.3,\n time: 0.0,\n }, options);\n }\n\n if ( Filter ) CRTFilter.__proto__ = Filter;\n CRTFilter.prototype = Object.create( Filter && Filter.prototype );\n CRTFilter.prototype.constructor = CRTFilter;\n\n var prototypeAccessors = { curvature: { configurable: true },lineWidth: { configurable: true },lineContrast: { configurable: true },verticalLine: { configurable: true },noise: { configurable: true },noiseSize: { configurable: true },vignetting: { configurable: true },vignettingAlpha: { configurable: true },vignettingBlur: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n CRTFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n\n this.uniforms.seed = this.seed;\n this.uniforms.time = this.time;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Bent of interlaced lines, higher value means more bend\n *\n * @member {number}\n * @default 1\n */\n prototypeAccessors.curvature.set = function (value) {\n this.uniforms.curvature = value;\n };\n prototypeAccessors.curvature.get = function () {\n return this.uniforms.curvature;\n };\n\n /**\n * Width of interlaced lines\n *\n * @member {number}\n * @default 1\n */\n prototypeAccessors.lineWidth.set = function (value) {\n this.uniforms.lineWidth = value;\n };\n prototypeAccessors.lineWidth.get = function () {\n return this.uniforms.lineWidth;\n };\n\n /**\n * Contrast of interlaced lines\n *\n * @member {number}\n * @default 0.25\n */\n prototypeAccessors.lineContrast.set = function (value) {\n this.uniforms.lineContrast = value;\n };\n prototypeAccessors.lineContrast.get = function () {\n return this.uniforms.lineContrast;\n };\n\n /**\n * `true` for vertical lines, `false` for horizontal lines\n *\n * @member {boolean}\n * @default false\n */\n prototypeAccessors.verticalLine.set = function (value) {\n this.uniforms.verticalLine = value;\n };\n prototypeAccessors.verticalLine.get = function () {\n return this.uniforms.verticalLine;\n };\n\n /**\n * Opacity/intensity of the noise effect between `0` and `1`\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.noise.set = function (value) {\n this.uniforms.noise = value;\n };\n prototypeAccessors.noise.get = function () {\n return this.uniforms.noise;\n };\n\n /**\n * The size of the noise particles\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.noiseSize.set = function (value) {\n this.uniforms.noiseSize = value;\n };\n prototypeAccessors.noiseSize.get = function () {\n return this.uniforms.noiseSize;\n };\n\n /**\n * The radius of the vignette effect, smaller\n * values produces a smaller vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignetting.set = function (value) {\n this.uniforms.vignetting = value;\n };\n prototypeAccessors.vignetting.get = function () {\n return this.uniforms.vignetting;\n };\n\n /**\n * Amount of opacity of vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignettingAlpha.set = function (value) {\n this.uniforms.vignettingAlpha = value;\n };\n prototypeAccessors.vignettingAlpha.get = function () {\n return this.uniforms.vignettingAlpha;\n };\n\n /**\n * Blur intensity of the vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignettingBlur.set = function (value) {\n this.uniforms.vignettingBlur = value;\n };\n prototypeAccessors.vignettingBlur.get = function () {\n return this.uniforms.vignettingBlur;\n };\n\n Object.defineProperties( CRTFilter.prototype, prototypeAccessors );\n\n return CRTFilter;\n}(Filter));\n\nexport { CRTFilter };\n//# sourceMappingURL=filter-crt.esm.js.map\n","/*!\n * @pixi/filter-dot - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-dot is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\nvarying vec4 vColor;\\n\\nuniform vec4 filterArea;\\nuniform sampler2D uSampler;\\n\\nuniform float angle;\\nuniform float scale;\\n\\nfloat pattern()\\n{\\n float s = sin(angle), c = cos(angle);\\n vec2 tex = vTextureCoord * filterArea.xy;\\n vec2 point = vec2(\\n c * tex.x - s * tex.y,\\n s * tex.x + c * tex.y\\n ) * scale;\\n return (sin(point.x) * sin(point.y)) * 4.0;\\n}\\n\\nvoid main()\\n{\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n float average = (color.r + color.g + color.b) / 3.0;\\n gl_FragColor = vec4(vec3(average * 10.0 - 5.0 + pattern()), color.a);\\n}\\n\";\n\n/**\n * @author Mat Groves http://matgroves.com/ @Doormat23\n * original filter: https://github.com/evanw/glfx.js/blob/master/src/filters/fun/dotscreen.js\n */\n\n/**\n * This filter applies a dotscreen effect making display objects appear to be made out of\n * black and white halftone dots like an old printer.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/dot.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-dot|@pixi/filter-dot}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [scale=1] The scale of the effect.\n * @param {number} [angle=5] The radius of the effect.\n */\nvar DotFilter = /*@__PURE__*/(function (Filter) {\n function DotFilter(scale, angle) {\n if ( scale === void 0 ) scale = 1;\n if ( angle === void 0 ) angle = 5;\n\n Filter.call(this, vertex, fragment);\n this.scale = scale;\n this.angle = angle;\n }\n\n if ( Filter ) DotFilter.__proto__ = Filter;\n DotFilter.prototype = Object.create( Filter && Filter.prototype );\n DotFilter.prototype.constructor = DotFilter;\n\n var prototypeAccessors = { scale: { configurable: true },angle: { configurable: true } };\n\n /**\n * The scale of the effect.\n * @member {number}\n * @default 1\n */\n prototypeAccessors.scale.get = function () {\n return this.uniforms.scale;\n };\n prototypeAccessors.scale.set = function (value) {\n this.uniforms.scale = value;\n };\n\n /**\n * The radius of the effect.\n * @member {number}\n * @default 5\n */\n prototypeAccessors.angle.get = function () {\n return this.uniforms.angle;\n };\n prototypeAccessors.angle.set = function (value) {\n this.uniforms.angle = value;\n };\n\n Object.defineProperties( DotFilter.prototype, prototypeAccessors );\n\n return DotFilter;\n}(Filter));\n\nexport { DotFilter };\n//# sourceMappingURL=filter-dot.esm.js.map\n","/*!\n * @pixi/filter-drop-shadow - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-drop-shadow is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { KawaseBlurFilter } from '@pixi/filter-kawase-blur';\nimport { Filter } from '@pixi/core';\nimport { settings } from '@pixi/settings';\nimport { DEG_TO_RAD, Point } from '@pixi/math';\nimport { rgb2hex, hex2rgb } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform float alpha;\\nuniform vec3 color;\\n\\nuniform vec2 shift;\\nuniform vec4 inputSize;\\n\\nvoid main(void){\\n vec4 sample = texture2D(uSampler, vTextureCoord - shift * inputSize.zw);\\n\\n // Un-premultiply alpha before applying the color\\n if (sample.a > 0.0) {\\n sample.rgb /= sample.a;\\n }\\n\\n // Premultiply alpha again\\n sample.rgb = color.rgb * sample.a;\\n\\n // alpha user alpha\\n sample *= alpha;\\n\\n gl_FragColor = sample;\\n}\";\n\n/**\n * Drop shadow filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/drop-shadow.png)\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-drop-shadow|@pixi/filter-drop-shadow}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {object} [options] Filter options\n * @param {number} [options.rotation=45] The angle of the shadow in degrees.\n * @param {number} [options.distance=5] Distance of shadow\n * @param {number} [options.color=0x000000] Color of the shadow\n * @param {number} [options.alpha=0.5] Alpha of the shadow\n * @param {number} [options.shadowOnly=false] Whether render shadow only\n * @param {number} [options.blur=2] - Sets the strength of the Blur properties simultaneously\n * @param {number} [options.quality=3] - The quality of the Blur filter.\n * @param {number[]} [options.kernels=null] - The kernels of the Blur filter.\n * @param {number|number[]|PIXI.Point} [options.pixelSize=1] - the pixelSize of the Blur filter.\n * @param {number} [options.resolution=PIXI.settings.RESOLUTION] - The resolution of the Blur filter.\n */\nvar DropShadowFilter = /*@__PURE__*/(function (Filter) {\n function DropShadowFilter(options) {\n\n // Fallback support for ctor: (rotation, distance, blur, color, alpha)\n if (options && options.constructor !== Object) {\n // eslint-disable-next-line no-console\n console.warn('DropShadowFilter now uses options instead of (rotation, distance, blur, color, alpha)');\n options = { rotation: options };\n if (arguments[1] !== undefined) {\n options.distance = arguments[1];\n }\n if (arguments[2] !== undefined) {\n options.blur = arguments[2];\n }\n if (arguments[3] !== undefined) {\n options.color = arguments[3];\n }\n if (arguments[4] !== undefined) {\n options.alpha = arguments[4];\n }\n }\n\n options = Object.assign({\n rotation: 45,\n distance: 5,\n color: 0x000000,\n alpha: 0.5,\n shadowOnly: false,\n kernels: null,\n blur: 2,\n quality: 3,\n pixelSize: 1,\n resolution: settings.RESOLUTION,\n }, options);\n\n Filter.call(this);\n\n var kernels = options.kernels;\n var blur = options.blur;\n var quality = options.quality;\n var pixelSize = options.pixelSize;\n var resolution = options.resolution;\n\n this._tintFilter = new Filter(vertex, fragment);\n this._tintFilter.uniforms.color = new Float32Array(4);\n this._tintFilter.uniforms.shift = new Point();\n this._tintFilter.resolution = resolution;\n this._blurFilter = kernels ?\n new KawaseBlurFilter(kernels) :\n new KawaseBlurFilter(blur, quality);\n\n this.pixelSize = pixelSize;\n this.resolution = resolution;\n\n var shadowOnly = options.shadowOnly;\n var rotation = options.rotation;\n var distance = options.distance;\n var alpha = options.alpha;\n var color = options.color;\n\n this.shadowOnly = shadowOnly;\n this.rotation = rotation;\n this.distance = distance;\n this.alpha = alpha;\n this.color = color;\n\n this._updatePadding();\n }\n\n if ( Filter ) DropShadowFilter.__proto__ = Filter;\n DropShadowFilter.prototype = Object.create( Filter && Filter.prototype );\n DropShadowFilter.prototype.constructor = DropShadowFilter;\n\n var prototypeAccessors = { resolution: { configurable: true },distance: { configurable: true },rotation: { configurable: true },alpha: { configurable: true },color: { configurable: true },kernels: { configurable: true },blur: { configurable: true },quality: { configurable: true },pixelSize: { configurable: true } };\n\n DropShadowFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n var target = filterManager.getFilterTexture();\n\n this._tintFilter.apply(filterManager, input, target, true);\n this._blurFilter.apply(filterManager, target, output, clear);\n\n if (this.shadowOnly !== true) {\n filterManager.applyFilter(this, input, output, false);\n }\n\n filterManager.returnFilterTexture(target);\n };\n\n /**\n * Recalculate the proper padding amount.\n * @private\n */\n DropShadowFilter.prototype._updatePadding = function _updatePadding () {\n this.padding = this.distance + (this.blur * 2);\n };\n\n /**\n * Update the transform matrix of offset angle.\n * @private\n */\n DropShadowFilter.prototype._updateShift = function _updateShift () {\n this._tintFilter.uniforms.shift.set(\n this.distance * Math.cos(this.angle),\n this.distance * Math.sin(this.angle)\n );\n };\n\n /**\n * The resolution of the filter.\n *\n * @member {number}\n * @default PIXI.settings.RESOLUTION\n */\n prototypeAccessors.resolution.get = function () {\n return this._resolution;\n };\n prototypeAccessors.resolution.set = function (value) {\n this._resolution = value;\n\n if (this._tintFilter) {\n this._tintFilter.resolution = value;\n }\n if (this._blurFilter) {\n this._blurFilter.resolution = value;\n }\n };\n\n /**\n * Distance offset of the shadow\n * @member {number}\n * @default 5\n */\n prototypeAccessors.distance.get = function () {\n return this._distance;\n };\n prototypeAccessors.distance.set = function (value) {\n this._distance = value;\n this._updatePadding();\n this._updateShift();\n };\n\n /**\n * The angle of the shadow in degrees\n * @member {number}\n * @default 2\n */\n prototypeAccessors.rotation.get = function () {\n return this.angle / DEG_TO_RAD;\n };\n prototypeAccessors.rotation.set = function (value) {\n this.angle = value * DEG_TO_RAD;\n this._updateShift();\n };\n\n /**\n * The alpha of the shadow\n * @member {number}\n * @default 1\n */\n prototypeAccessors.alpha.get = function () {\n return this._tintFilter.uniforms.alpha;\n };\n prototypeAccessors.alpha.set = function (value) {\n this._tintFilter.uniforms.alpha = value;\n };\n\n /**\n * The color of the shadow.\n * @member {number}\n * @default 0x000000\n */\n prototypeAccessors.color.get = function () {\n return rgb2hex(this._tintFilter.uniforms.color);\n };\n prototypeAccessors.color.set = function (value) {\n hex2rgb(value, this._tintFilter.uniforms.color);\n };\n\n /**\n * Sets the kernels of the Blur Filter\n *\n * @member {number[]}\n */\n prototypeAccessors.kernels.get = function () {\n return this._blurFilter.kernels;\n };\n prototypeAccessors.kernels.set = function (value) {\n this._blurFilter.kernels = value;\n };\n\n /**\n * The blur of the shadow\n * @member {number}\n * @default 2\n */\n prototypeAccessors.blur.get = function () {\n return this._blurFilter.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this._blurFilter.blur = value;\n this._updatePadding();\n };\n\n /**\n * Sets the quality of the Blur Filter\n *\n * @member {number}\n * @default 4\n */\n prototypeAccessors.quality.get = function () {\n return this._blurFilter.quality;\n };\n prototypeAccessors.quality.set = function (value) {\n this._blurFilter.quality = value;\n };\n\n /**\n * Sets the pixelSize of the Kawase Blur filter\n *\n * @member {number|number[]|PIXI.Point}\n * @default 1\n */\n prototypeAccessors.pixelSize.get = function () {\n return this._blurFilter.pixelSize;\n };\n prototypeAccessors.pixelSize.set = function (value) {\n this._blurFilter.pixelSize = value;\n };\n\n Object.defineProperties( DropShadowFilter.prototype, prototypeAccessors );\n\n return DropShadowFilter;\n}(Filter));\n\nexport { DropShadowFilter };\n//# sourceMappingURL=filter-drop-shadow.esm.js.map\n","/*!\n * @pixi/filter-emboss - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-emboss is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform float strength;\\nuniform vec4 filterArea;\\n\\n\\nvoid main(void)\\n{\\n\\tvec2 onePixel = vec2(1.0 / filterArea);\\n\\n\\tvec4 color;\\n\\n\\tcolor.rgb = vec3(0.5);\\n\\n\\tcolor -= texture2D(uSampler, vTextureCoord - onePixel) * strength;\\n\\tcolor += texture2D(uSampler, vTextureCoord + onePixel) * strength;\\n\\n\\tcolor.rgb = vec3((color.r + color.g + color.b) / 3.0);\\n\\n\\tfloat alpha = texture2D(uSampler, vTextureCoord).a;\\n\\n\\tgl_FragColor = vec4(color.rgb * alpha, alpha);\\n}\\n\";\n\n/**\n * An RGB Split Filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/emboss.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-emboss|@pixi/filter-emboss}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [strength=5] Strength of the emboss.\n */\nvar EmbossFilter = /*@__PURE__*/(function (Filter) {\n function EmbossFilter(strength){\n if ( strength === void 0 ) strength = 5;\n\n Filter.call(this, vertex, fragment);\n this.strength = strength;\n }\n\n if ( Filter ) EmbossFilter.__proto__ = Filter;\n EmbossFilter.prototype = Object.create( Filter && Filter.prototype );\n EmbossFilter.prototype.constructor = EmbossFilter;\n\n var prototypeAccessors = { strength: { configurable: true } };\n\n /**\n * Strength of emboss.\n *\n * @member {number}\n */\n prototypeAccessors.strength.get = function () {\n return this.uniforms.strength;\n };\n prototypeAccessors.strength.set = function (value) {\n this.uniforms.strength = value;\n };\n\n Object.defineProperties( EmbossFilter.prototype, prototypeAccessors );\n\n return EmbossFilter;\n}(Filter));\n\nexport { EmbossFilter };\n//# sourceMappingURL=filter-emboss.esm.js.map\n","/*!\n * @pixi/filter-glitch - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-glitch is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter, Texture } from '@pixi/core';\nimport { SCALE_MODES } from '@pixi/constants';\nimport { DEG_TO_RAD } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"// precision highp float;\\n\\nvarying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\nuniform vec2 dimensions;\\nuniform float aspect;\\n\\nuniform sampler2D displacementMap;\\nuniform float offset;\\nuniform float sinDir;\\nuniform float cosDir;\\nuniform int fillMode;\\n\\nuniform float seed;\\nuniform vec2 red;\\nuniform vec2 green;\\nuniform vec2 blue;\\n\\nconst int TRANSPARENT = 0;\\nconst int ORIGINAL = 1;\\nconst int LOOP = 2;\\nconst int CLAMP = 3;\\nconst int MIRROR = 4;\\n\\nvoid main(void)\\n{\\n vec2 coord = (vTextureCoord * filterArea.xy) / dimensions;\\n\\n if (coord.x > 1.0 || coord.y > 1.0) {\\n return;\\n }\\n\\n float cx = coord.x - 0.5;\\n float cy = (coord.y - 0.5) * aspect;\\n float ny = (-sinDir * cx + cosDir * cy) / aspect + 0.5;\\n\\n // displacementMap: repeat\\n // ny = ny > 1.0 ? ny - 1.0 : (ny < 0.0 ? 1.0 + ny : ny);\\n\\n // displacementMap: mirror\\n ny = ny > 1.0 ? 2.0 - ny : (ny < 0.0 ? -ny : ny);\\n\\n vec4 dc = texture2D(displacementMap, vec2(0.5, ny));\\n\\n float displacement = (dc.r - dc.g) * (offset / filterArea.x);\\n\\n coord = vTextureCoord + vec2(cosDir * displacement, sinDir * displacement * aspect);\\n\\n if (fillMode == CLAMP) {\\n coord = clamp(coord, filterClamp.xy, filterClamp.zw);\\n } else {\\n if( coord.x > filterClamp.z ) {\\n if (fillMode == TRANSPARENT) {\\n discard;\\n } else if (fillMode == LOOP) {\\n coord.x -= filterClamp.z;\\n } else if (fillMode == MIRROR) {\\n coord.x = filterClamp.z * 2.0 - coord.x;\\n }\\n } else if( coord.x < filterClamp.x ) {\\n if (fillMode == TRANSPARENT) {\\n discard;\\n } else if (fillMode == LOOP) {\\n coord.x += filterClamp.z;\\n } else if (fillMode == MIRROR) {\\n coord.x *= -filterClamp.z;\\n }\\n }\\n\\n if( coord.y > filterClamp.w ) {\\n if (fillMode == TRANSPARENT) {\\n discard;\\n } else if (fillMode == LOOP) {\\n coord.y -= filterClamp.w;\\n } else if (fillMode == MIRROR) {\\n coord.y = filterClamp.w * 2.0 - coord.y;\\n }\\n } else if( coord.y < filterClamp.y ) {\\n if (fillMode == TRANSPARENT) {\\n discard;\\n } else if (fillMode == LOOP) {\\n coord.y += filterClamp.w;\\n } else if (fillMode == MIRROR) {\\n coord.y *= -filterClamp.w;\\n }\\n }\\n }\\n\\n gl_FragColor.r = texture2D(uSampler, coord + red * (1.0 - seed * 0.4) / filterArea.xy).r;\\n gl_FragColor.g = texture2D(uSampler, coord + green * (1.0 - seed * 0.3) / filterArea.xy).g;\\n gl_FragColor.b = texture2D(uSampler, coord + blue * (1.0 - seed * 0.2) / filterArea.xy).b;\\n gl_FragColor.a = texture2D(uSampler, coord).a;\\n}\\n\";\n\n/**\n * The GlitchFilter applies a glitch effect to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/glitch.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-glitch|@pixi/filter-glitch}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {object} [options] - The more optional parameters of the filter.\n * @param {number} [options.slices=5] - The maximum number of slices.\n * @param {number} [options.offset=100] - The maximum offset amount of slices.\n * @param {number} [options.direction=0] - The angle in degree of the offset of slices.\n * @param {number} [options.fillMode=0] - The fill mode of the space after the offset. Acceptable values:\n * - `0` {@link PIXI.filters.GlitchFilter.TRANSPARENT TRANSPARENT}\n * - `1` {@link PIXI.filters.GlitchFilter.ORIGINAL ORIGINAL}\n * - `2` {@link PIXI.filters.GlitchFilter.LOOP LOOP}\n * - `3` {@link PIXI.filters.GlitchFilter.CLAMP CLAMP}\n * - `4` {@link PIXI.filters.GlitchFilter.MIRROR MIRROR}\n * @param {number} [options.seed=0] - A seed value for randomizing glitch effect.\n * @param {number} [options.average=false] - `true` will divide the bands roughly based on equal amounts\n * where as setting to `false` will vary the band sizes dramatically (more random looking).\n * @param {number} [options.minSize=8] - Minimum size of individual slice. Segment of total `sampleSize`\n * @param {number} [options.sampleSize=512] - The resolution of the displacement map texture.\n * @param {number} [options.red=[0,0]] - Red channel offset\n * @param {number} [options.green=[0,0]] - Green channel offset.\n * @param {number} [options.blue=[0,0]] - Blue channel offset.\n */\nvar GlitchFilter = /*@__PURE__*/(function (Filter) {\n function GlitchFilter(options) {\n if ( options === void 0 ) options = {};\n\n\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n\n options = Object.assign({\n slices: 5,\n offset: 100,\n direction: 0,\n fillMode: 0,\n average: false,\n seed: 0,\n red: [0, 0],\n green: [0, 0],\n blue: [0, 0],\n minSize: 8,\n sampleSize: 512,\n }, options);\n\n this.direction = options.direction;\n this.red = options.red;\n this.green = options.green;\n this.blue = options.blue;\n\n /**\n * The maximum offset value for each of the slices.\n *\n * @member {number}\n */\n this.offset = options.offset;\n\n /**\n * The fill mode of the space after the offset.\n *\n * @member {number}\n */\n this.fillMode = options.fillMode;\n\n /**\n * `true` will divide the bands roughly based on equal amounts\n * where as setting to `false` will vary the band sizes dramatically (more random looking).\n *\n * @member {boolean}\n * @default false\n */\n this.average = options.average;\n\n /**\n * A seed value for randomizing color offset. Animating\n * this value to `Math.random()` produces a twitching effect.\n *\n * @member {number}\n */\n this.seed = options.seed;\n\n /**\n * Minimum size of slices as a portion of the `sampleSize`\n *\n * @member {number}\n */\n this.minSize = options.minSize;\n\n /**\n * Height of the displacement map canvas.\n *\n * @member {number}\n * @readonly\n */\n this.sampleSize = options.sampleSize;\n\n /**\n * Internally generated canvas.\n *\n * @member {HTMLCanvasElement} _canvas\n * @private\n */\n this._canvas = document.createElement('canvas');\n this._canvas.width = 4;\n this._canvas.height = this.sampleSize;\n\n /**\n * The displacement map is used to generate the bands.\n * If using your own texture, `slices` will be ignored.\n *\n * @member {PIXI.Texture}\n * @readonly\n */\n this.texture = Texture.from(this._canvas, { scaleMode: SCALE_MODES.NEAREST });\n\n /**\n * Internal number of slices\n * @member {number}\n * @private\n */\n this._slices = 0;\n\n // Set slices\n this.slices = options.slices;\n }\n\n if ( Filter ) GlitchFilter.__proto__ = Filter;\n GlitchFilter.prototype = Object.create( Filter && Filter.prototype );\n GlitchFilter.prototype.constructor = GlitchFilter;\n\n var prototypeAccessors = { sizes: { configurable: true },offsets: { configurable: true },slices: { configurable: true },direction: { configurable: true },red: { configurable: true },green: { configurable: true },blue: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n GlitchFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n\n var width = input.filterFrame.width;\n var height = input.filterFrame.height;\n\n this.uniforms.dimensions[0] = width;\n this.uniforms.dimensions[1] = height;\n this.uniforms.aspect = height / width;\n\n this.uniforms.seed = this.seed;\n this.uniforms.offset = this.offset;\n this.uniforms.fillMode = this.fillMode;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Randomize the slices size (heights).\n *\n * @private\n */\n GlitchFilter.prototype._randomizeSizes = function _randomizeSizes () {\n var arr = this._sizes;\n var last = this._slices - 1;\n var size = this.sampleSize;\n var min = Math.min(this.minSize / size, 0.9 / this._slices);\n\n if (this.average) {\n var count = this._slices;\n var rest = 1;\n\n for (var i = 0; i < last; i++) {\n var averageWidth = rest / (count - i);\n var w = Math.max(averageWidth * (1 - Math.random() * 0.6), min);\n arr[i] = w;\n rest -= w;\n }\n arr[last] = rest;\n }\n else {\n var rest$1 = 1;\n var ratio = Math.sqrt(1 / this._slices);\n\n for (var i$1 = 0; i$1 < last; i$1++) {\n var w$1 = Math.max(ratio * rest$1 * Math.random(), min);\n arr[i$1] = w$1;\n rest$1 -= w$1;\n }\n arr[last] = rest$1;\n }\n\n this.shuffle();\n };\n\n /**\n * Shuffle the sizes of the slices, advanced usage.\n */\n GlitchFilter.prototype.shuffle = function shuffle () {\n var arr = this._sizes;\n var last = this._slices - 1;\n\n // shuffle\n for (var i = last; i > 0; i--) {\n var rand = (Math.random() * i) >> 0;\n var temp = arr[i];\n\n arr[i] = arr[rand];\n arr[rand] = temp;\n }\n };\n\n /**\n * Randomize the values for offset from -1 to 1\n *\n * @private\n */\n GlitchFilter.prototype._randomizeOffsets = function _randomizeOffsets () {\n for (var i = 0 ; i < this._slices; i++) {\n this._offsets[i] = Math.random() * (Math.random() < 0.5 ? -1 : 1);\n }\n };\n\n /**\n * Regenerating random size, offsets for slices.\n */\n GlitchFilter.prototype.refresh = function refresh () {\n this._randomizeSizes();\n this._randomizeOffsets();\n this.redraw();\n };\n\n /**\n * Redraw displacement bitmap texture, advanced usage.\n */\n GlitchFilter.prototype.redraw = function redraw () {\n var size = this.sampleSize;\n var texture = this.texture;\n var ctx = this._canvas.getContext('2d');\n ctx.clearRect(0, 0, 8, size);\n\n var offset;\n var y = 0;\n\n for (var i = 0 ; i < this._slices; i++) {\n offset = Math.floor(this._offsets[i] * 256);\n var height = this._sizes[i] * size;\n var red = offset > 0 ? offset : 0;\n var green = offset < 0 ? -offset : 0;\n ctx.fillStyle = 'rgba(' + red + ', ' + green + ', 0, 1)';\n ctx.fillRect(0, y >> 0, size, height + 1 >> 0);\n y += height;\n }\n\n texture.baseTexture.update();\n this.uniforms.displacementMap = texture;\n };\n\n /**\n * Manually custom slices size (height) of displacement bitmap\n *\n * @member {number[]}\n */\n prototypeAccessors.sizes.set = function (sizes) {\n var len = Math.min(this._slices, sizes.length);\n\n for (var i = 0; i < len; i++){\n this._sizes[i] = sizes[i];\n }\n };\n prototypeAccessors.sizes.get = function () {\n return this._sizes;\n };\n\n /**\n * Manually set custom slices offset of displacement bitmap, this is\n * a collection of values from -1 to 1. To change the max offset value\n * set `offset`.\n *\n * @member {number[]}\n */\n prototypeAccessors.offsets.set = function (offsets) {\n var len = Math.min(this._slices, offsets.length);\n\n for (var i = 0; i < len; i++){\n this._offsets[i] = offsets[i];\n }\n };\n prototypeAccessors.offsets.get = function () {\n return this._offsets;\n };\n\n /**\n * The count of slices.\n * @member {number}\n * @default 5\n */\n prototypeAccessors.slices.get = function () {\n return this._slices;\n };\n prototypeAccessors.slices.set = function (value) {\n if (this._slices === value) {\n return;\n }\n this._slices = value;\n this.uniforms.slices = value;\n this._sizes = this.uniforms.slicesWidth = new Float32Array(value);\n this._offsets = this.uniforms.slicesOffset = new Float32Array(value);\n this.refresh();\n };\n\n /**\n * The angle in degree of the offset of slices.\n * @member {number}\n * @default 0\n */\n prototypeAccessors.direction.get = function () {\n return this._direction;\n };\n prototypeAccessors.direction.set = function (value) {\n if (this._direction === value) {\n return;\n }\n this._direction = value;\n\n var radians = value * DEG_TO_RAD;\n\n this.uniforms.sinDir = Math.sin(radians);\n this.uniforms.cosDir = Math.cos(radians);\n };\n\n /**\n * Red channel offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.red.get = function () {\n return this.uniforms.red;\n };\n prototypeAccessors.red.set = function (value) {\n this.uniforms.red = value;\n };\n\n /**\n * Green channel offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.green.get = function () {\n return this.uniforms.green;\n };\n prototypeAccessors.green.set = function (value) {\n this.uniforms.green = value;\n };\n\n /**\n * Blue offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.blue.get = function () {\n return this.uniforms.blue;\n };\n prototypeAccessors.blue.set = function (value) {\n this.uniforms.blue = value;\n };\n\n /**\n * Removes all references\n */\n GlitchFilter.prototype.destroy = function destroy () {\n this.texture.destroy(true);\n this.texture = null;\n this._canvas = null;\n this.red = null;\n this.green = null;\n this.blue = null;\n this._sizes = null;\n this._offsets = null;\n };\n\n Object.defineProperties( GlitchFilter.prototype, prototypeAccessors );\n\n return GlitchFilter;\n}(Filter));\n\n/**\n * Fill mode as transparent\n *\n * @constant\n * @static\n * @member {int} TRANSPARENT\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.TRANSPARENT = 0;\n\n/**\n * Fill mode as original\n *\n * @constant\n * @static\n * @member {int} ORIGINAL\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.ORIGINAL = 1;\n\n/**\n * Fill mode as loop\n *\n * @constant\n * @static\n * @member {int} LOOP\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.LOOP = 2;\n\n/**\n * Fill mode as clamp\n *\n * @constant\n * @static\n * @member {int} CLAMP\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.CLAMP = 3;\n\n/**\n * Fill mode as mirror\n *\n * @constant\n * @static\n * @member {int} MIRROR\n * @memberof PIXI.filters.GlitchFilter\n * @readonly\n */\nGlitchFilter.MIRROR = 4;\n\nexport { GlitchFilter };\n//# sourceMappingURL=filter-glitch.esm.js.map\n","/*!\n * @pixi/filter-glow - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-glow is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { rgb2hex, hex2rgb } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nvarying vec4 vColor;\\n\\nuniform sampler2D uSampler;\\n\\nuniform float distance;\\nuniform float outerStrength;\\nuniform float innerStrength;\\nuniform vec4 glowColor;\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\nconst float PI = 3.14159265358979323846264;\\n\\nvoid main(void) {\\n vec2 px = vec2(1.0 / filterArea.x, 1.0 / filterArea.y);\\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\\n vec4 curColor;\\n float totalAlpha = 0.0;\\n float maxTotalAlpha = 0.0;\\n float cosAngle;\\n float sinAngle;\\n vec2 displaced;\\n for (float angle = 0.0; angle <= PI * 2.0; angle += %QUALITY_DIST%) {\\n cosAngle = cos(angle);\\n sinAngle = sin(angle);\\n for (float curDistance = 1.0; curDistance <= %DIST%; curDistance++) {\\n displaced.x = vTextureCoord.x + cosAngle * curDistance * px.x;\\n displaced.y = vTextureCoord.y + sinAngle * curDistance * px.y;\\n curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\\n totalAlpha += (distance - curDistance) * curColor.a;\\n maxTotalAlpha += (distance - curDistance);\\n }\\n }\\n maxTotalAlpha = max(maxTotalAlpha, 0.0001);\\n\\n ownColor.a = max(ownColor.a, 0.0001);\\n ownColor.rgb = ownColor.rgb / ownColor.a;\\n float outerGlowAlpha = (totalAlpha / maxTotalAlpha) * outerStrength * (1. - ownColor.a);\\n float innerGlowAlpha = ((maxTotalAlpha - totalAlpha) / maxTotalAlpha) * innerStrength * ownColor.a;\\n float resultAlpha = (ownColor.a + outerGlowAlpha);\\n gl_FragColor = vec4(mix(mix(ownColor.rgb, glowColor.rgb, innerGlowAlpha / ownColor.a), glowColor.rgb, outerGlowAlpha / resultAlpha) * resultAlpha, resultAlpha);\\n}\\n\";\n\n/**\n * GlowFilter, originally by mishaa\n * http://www.html5gamedevs.com/topic/12756-glow-filter/?hl=mishaa#entry73578\n * http://codepen.io/mishaa/pen/raKzrm
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/glow.png)\n *\n * @class\n *\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-glow|@pixi/filter-glow}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [distance=10] The distance of the glow. Make it 2 times more for resolution=2. It cant be changed after filter creation\n * @param {number} [outerStrength=4] The strength of the glow outward from the edge of the sprite.\n * @param {number} [innerStrength=0] The strength of the glow inward from the edge of the sprite.\n * @param {number} [color=0xffffff] The color of the glow.\n * @param {number} [quality=0.1] A number between 0 and 1 that describes the quality of the glow.\n *\n * @example\n * someSprite.filters = [\n * new GlowFilter(15, 2, 1, 0xFF0000, 0.5)\n * ];\n */\nvar GlowFilter = /*@__PURE__*/(function (Filter) {\n function GlowFilter(distance, outerStrength, innerStrength, color, quality) {\n if ( distance === void 0 ) distance = 10;\n if ( outerStrength === void 0 ) outerStrength = 4;\n if ( innerStrength === void 0 ) innerStrength = 0;\n if ( color === void 0 ) color = 0xffffff;\n if ( quality === void 0 ) quality = 0.1;\n\n Filter.call(this, vertex, fragment\n .replace(/%QUALITY_DIST%/gi, '' + (1 / quality / distance).toFixed(7))\n .replace(/%DIST%/gi, '' + distance.toFixed(7)));\n\n this.uniforms.glowColor = new Float32Array([0, 0, 0, 1]);\n this.distance = distance;\n this.color = color;\n this.outerStrength = outerStrength;\n this.innerStrength = innerStrength;\n }\n\n if ( Filter ) GlowFilter.__proto__ = Filter;\n GlowFilter.prototype = Object.create( Filter && Filter.prototype );\n GlowFilter.prototype.constructor = GlowFilter;\n\n var prototypeAccessors = { color: { configurable: true },distance: { configurable: true },outerStrength: { configurable: true },innerStrength: { configurable: true } };\n\n /**\n * The color of the glow.\n * @member {number}\n * @default 0xFFFFFF\n */\n prototypeAccessors.color.get = function () {\n return rgb2hex(this.uniforms.glowColor);\n };\n prototypeAccessors.color.set = function (value) {\n hex2rgb(value, this.uniforms.glowColor);\n };\n\n /**\n * The distance of the glow. Make it 2 times more for resolution=2. It cant be changed after filter creation\n * @member {number}\n * @default 10\n */\n prototypeAccessors.distance.get = function () {\n return this.uniforms.distance;\n };\n prototypeAccessors.distance.set = function (value) {\n this.uniforms.distance = value;\n };\n\n /**\n * The strength of the glow outward from the edge of the sprite.\n * @member {number}\n * @default 4\n */\n prototypeAccessors.outerStrength.get = function () {\n return this.uniforms.outerStrength;\n };\n prototypeAccessors.outerStrength.set = function (value) {\n this.uniforms.outerStrength = value;\n };\n\n /**\n * The strength of the glow inward from the edge of the sprite.\n * @member {number}\n * @default 0\n */\n prototypeAccessors.innerStrength.get = function () {\n return this.uniforms.innerStrength;\n };\n prototypeAccessors.innerStrength.set = function (value) {\n this.uniforms.innerStrength = value;\n };\n\n Object.defineProperties( GlowFilter.prototype, prototypeAccessors );\n\n return GlowFilter;\n}(Filter));\n\nexport { GlowFilter };\n//# sourceMappingURL=filter-glow.esm.js.map\n","/*!\n * @pixi/filter-godray - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-godray is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { Point, DEG_TO_RAD } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar perlin = \"vec3 mod289(vec3 x)\\n{\\n return x - floor(x * (1.0 / 289.0)) * 289.0;\\n}\\nvec4 mod289(vec4 x)\\n{\\n return x - floor(x * (1.0 / 289.0)) * 289.0;\\n}\\nvec4 permute(vec4 x)\\n{\\n return mod289(((x * 34.0) + 1.0) * x);\\n}\\nvec4 taylorInvSqrt(vec4 r)\\n{\\n return 1.79284291400159 - 0.85373472095314 * r;\\n}\\nvec3 fade(vec3 t)\\n{\\n return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);\\n}\\n// Classic Perlin noise, periodic variant\\nfloat pnoise(vec3 P, vec3 rep)\\n{\\n vec3 Pi0 = mod(floor(P), rep); // Integer part, modulo period\\n vec3 Pi1 = mod(Pi0 + vec3(1.0), rep); // Integer part + 1, mod period\\n Pi0 = mod289(Pi0);\\n Pi1 = mod289(Pi1);\\n vec3 Pf0 = fract(P); // Fractional part for interpolation\\n vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0\\n vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);\\n vec4 iy = vec4(Pi0.yy, Pi1.yy);\\n vec4 iz0 = Pi0.zzzz;\\n vec4 iz1 = Pi1.zzzz;\\n vec4 ixy = permute(permute(ix) + iy);\\n vec4 ixy0 = permute(ixy + iz0);\\n vec4 ixy1 = permute(ixy + iz1);\\n vec4 gx0 = ixy0 * (1.0 / 7.0);\\n vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;\\n gx0 = fract(gx0);\\n vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);\\n vec4 sz0 = step(gz0, vec4(0.0));\\n gx0 -= sz0 * (step(0.0, gx0) - 0.5);\\n gy0 -= sz0 * (step(0.0, gy0) - 0.5);\\n vec4 gx1 = ixy1 * (1.0 / 7.0);\\n vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;\\n gx1 = fract(gx1);\\n vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);\\n vec4 sz1 = step(gz1, vec4(0.0));\\n gx1 -= sz1 * (step(0.0, gx1) - 0.5);\\n gy1 -= sz1 * (step(0.0, gy1) - 0.5);\\n vec3 g000 = vec3(gx0.x, gy0.x, gz0.x);\\n vec3 g100 = vec3(gx0.y, gy0.y, gz0.y);\\n vec3 g010 = vec3(gx0.z, gy0.z, gz0.z);\\n vec3 g110 = vec3(gx0.w, gy0.w, gz0.w);\\n vec3 g001 = vec3(gx1.x, gy1.x, gz1.x);\\n vec3 g101 = vec3(gx1.y, gy1.y, gz1.y);\\n vec3 g011 = vec3(gx1.z, gy1.z, gz1.z);\\n vec3 g111 = vec3(gx1.w, gy1.w, gz1.w);\\n vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));\\n g000 *= norm0.x;\\n g010 *= norm0.y;\\n g100 *= norm0.z;\\n g110 *= norm0.w;\\n vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));\\n g001 *= norm1.x;\\n g011 *= norm1.y;\\n g101 *= norm1.z;\\n g111 *= norm1.w;\\n float n000 = dot(g000, Pf0);\\n float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));\\n float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));\\n float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));\\n float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));\\n float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));\\n float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));\\n float n111 = dot(g111, Pf1);\\n vec3 fade_xyz = fade(Pf0);\\n vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);\\n vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);\\n float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);\\n return 2.2 * n_xyz;\\n}\\nfloat turb(vec3 P, vec3 rep, float lacunarity, float gain)\\n{\\n float sum = 0.0;\\n float sc = 1.0;\\n float totalgain = 1.0;\\n for (float i = 0.0; i < 6.0; i++)\\n {\\n sum += totalgain * pnoise(P * sc, rep);\\n sc *= lacunarity;\\n totalgain *= gain;\\n }\\n return abs(sum);\\n}\\n\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\nuniform vec2 dimensions;\\n\\nuniform vec2 light;\\nuniform bool parallel;\\nuniform float aspect;\\n\\nuniform float gain;\\nuniform float lacunarity;\\nuniform float time;\\n\\n${perlin}\\n\\nvoid main(void) {\\n vec2 coord = vTextureCoord * filterArea.xy / dimensions.xy;\\n\\n float d;\\n\\n if (parallel) {\\n float _cos = light.x;\\n float _sin = light.y;\\n d = (_cos * coord.x) + (_sin * coord.y * aspect);\\n } else {\\n float dx = coord.x - light.x / dimensions.x;\\n float dy = (coord.y - light.y / dimensions.y) * aspect;\\n float dis = sqrt(dx * dx + dy * dy) + 0.00001;\\n d = dy / dis;\\n }\\n\\n vec3 dir = vec3(d, d, 0.0);\\n\\n float noise = turb(dir + vec3(time, 0.0, 62.1 + time) * 0.05, vec3(480.0, 320.0, 480.0), lacunarity, gain);\\n noise = mix(noise, 0.0, 0.3);\\n //fade vertically.\\n vec4 mist = vec4(noise, noise, noise, 1.0) * (1.0 - coord.y);\\n mist.a = 1.0;\\n\\n gl_FragColor = texture2D(uSampler, vTextureCoord) + mist;\\n}\\n\";\n\n/**\n * GordayFilter, {@link https://codepen.io/alaingalvan originally} by Alain Galvan\n *\n *\n *\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/godray.gif)\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-godray|@pixi/filter-godray}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @example\n * displayObject.filters = [new GodrayFilter()];\n * @param {object} [options] Filter options\n * @param {number} [options.angle=30] Angle/Light-source of the rays.\n * @param {number} [options.gain=0.5] General intensity of the effect.\n * @param {number} [options.lacunrity=2.5] The density of the fractal noise.\n * @param {boolean} [options.parallel=true] `true` to use `angle`, `false` to use `center`\n * @param {number} [options.time=0] The current time position.\n * @param {PIXI.Point|number[]} [options.center=[0,0]] Focal point for non-parallel rays,\n * to use this `parallel` must be set to `false`.\n */\nvar GodrayFilter = /*@__PURE__*/(function (Filter) {\n function GodrayFilter(options) {\n Filter.call(this, vertex, fragment.replace('${perlin}', perlin));\n\n this.uniforms.dimensions = new Float32Array(2);\n\n // Fallback support for ctor: (angle, gain, lacunarity, time)\n if (typeof options === 'number') {\n // eslint-disable-next-line no-console\n console.warn('GodrayFilter now uses options instead of (angle, gain, lacunarity, time)');\n options = { angle: options };\n if (arguments[1] !== undefined) {\n options.gain = arguments[1];\n }\n if (arguments[2] !== undefined) {\n options.lacunarity = arguments[2];\n }\n if (arguments[3] !== undefined) {\n options.time = arguments[3];\n }\n }\n\n options = Object.assign({\n angle: 30,\n gain: 0.5,\n lacunarity: 2.5,\n time: 0,\n parallel: true,\n center: [0, 0],\n }, options);\n\n this._angleLight = new Point();\n this.angle = options.angle;\n this.gain = options.gain;\n this.lacunarity = options.lacunarity;\n\n /**\n * `true` if light rays are parallel (uses angle),\n * `false` to use the focal `center` point\n *\n * @member {boolean}\n * @default true\n */\n this.parallel = options.parallel;\n\n /**\n * The position of the emitting point for light rays\n * only used if `parallel` is set to `false`.\n *\n * @member {PIXI.Point|number[]}\n * @default [0, 0]\n */\n this.center = options.center;\n\n /**\n * The current time.\n *\n * @member {number}\n * @default 0\n */\n this.time = options.time;\n }\n\n if ( Filter ) GodrayFilter.__proto__ = Filter;\n GodrayFilter.prototype = Object.create( Filter && Filter.prototype );\n GodrayFilter.prototype.constructor = GodrayFilter;\n\n var prototypeAccessors = { angle: { configurable: true },gain: { configurable: true },lacunarity: { configurable: true } };\n\n /**\n * Applies the filter.\n * @private\n * @param {PIXI.FilterManager} filterManager - The manager.\n * @param {PIXI.RenderTarget} input - The input target.\n * @param {PIXI.RenderTarget} output - The output target.\n */\n GodrayFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n var ref = input.filterFrame;\n var width = ref.width;\n var height = ref.height;\n\n this.uniforms.light = this.parallel ? this._angleLight : this.center;\n\n this.uniforms.parallel = this.parallel;\n this.uniforms.dimensions[0] = width;\n this.uniforms.dimensions[1] = height;\n this.uniforms.aspect = height / width;\n this.uniforms.time = this.time;\n\n // draw the filter...\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * The angle/light-source of the rays in degrees. For instance, a value of 0 is vertical rays,\n * values of 90 or -90 produce horizontal rays.\n * @member {number}\n * @default 30\n */\n prototypeAccessors.angle.get = function () {\n return this._angle;\n };\n prototypeAccessors.angle.set = function (value) {\n this._angle = value;\n\n var radians = value * DEG_TO_RAD;\n\n this._angleLight.x = Math.cos(radians);\n this._angleLight.y = Math.sin(radians);\n };\n\n /**\n * General intensity of the effect. A value closer to 1 will produce a more intense effect,\n * where a value closer to 0 will produce a subtler effect.\n *\n * @member {number}\n * @default 0.5\n */\n prototypeAccessors.gain.get = function () {\n return this.uniforms.gain;\n };\n prototypeAccessors.gain.set = function (value) {\n this.uniforms.gain = value;\n };\n\n /**\n * The density of the fractal noise. A higher amount produces more rays and a smaller amound\n * produces fewer waves.\n *\n * @member {number}\n * @default 2.5\n */\n prototypeAccessors.lacunarity.get = function () {\n return this.uniforms.lacunarity;\n };\n prototypeAccessors.lacunarity.set = function (value) {\n this.uniforms.lacunarity = value;\n };\n\n Object.defineProperties( GodrayFilter.prototype, prototypeAccessors );\n\n return GodrayFilter;\n}(Filter));\n\nexport { GodrayFilter };\n//# sourceMappingURL=filter-godray.esm.js.map\n","/*!\n * @pixi/filter-motion-blur - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-motion-blur is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { Point, ObservablePoint } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\n\\nuniform vec2 uVelocity;\\nuniform int uKernelSize;\\nuniform float uOffset;\\n\\nconst int MAX_KERNEL_SIZE = 2048;\\n\\n// Notice:\\n// the perfect way:\\n// int kernelSize = min(uKernelSize, MAX_KERNELSIZE);\\n// BUT in real use-case , uKernelSize < MAX_KERNELSIZE almost always.\\n// So use uKernelSize directly.\\n\\nvoid main(void)\\n{\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n\\n if (uKernelSize == 0)\\n {\\n gl_FragColor = color;\\n return;\\n }\\n\\n vec2 velocity = uVelocity / filterArea.xy;\\n float offset = -uOffset / length(uVelocity) - 0.5;\\n int k = uKernelSize - 1;\\n\\n for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) {\\n if (i == k) {\\n break;\\n }\\n vec2 bias = velocity * (float(i) / float(k) + offset);\\n color += texture2D(uSampler, vTextureCoord + bias);\\n }\\n gl_FragColor = color / float(uKernelSize);\\n}\\n\";\n\n/**\n * The MotionBlurFilter applies a Motion blur to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/motion-blur.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-motion-blur|@pixi/filter-motion-blur}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {PIXI.ObservablePoint|PIXI.Point|number[]} [velocity=[0, 0]] Sets the velocity of the motion for blur effect.\n * @param {number} [kernelSize=5] - The kernelSize of the blur filter. Must be odd number >= 5\n * @param {number} [offset=0] - The offset of the blur filter.\n */\nvar MotionBlurFilter = /*@__PURE__*/(function (Filter) {\n function MotionBlurFilter(velocity, kernelSize, offset) {\n if ( velocity === void 0 ) velocity = [0, 0];\n if ( kernelSize === void 0 ) kernelSize = 5;\n if ( offset === void 0 ) offset = 0;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.uVelocity = new Float32Array(2);\n this._velocity = new ObservablePoint(this.velocityChanged, this);\n this.velocity = velocity;\n\n /**\n * The kernelSize of the blur, higher values are slower but look better.\n * Use odd value greater than 5.\n * @member {number}\n * @default 5\n */\n this.kernelSize = kernelSize;\n this.offset = offset;\n }\n\n if ( Filter ) MotionBlurFilter.__proto__ = Filter;\n MotionBlurFilter.prototype = Object.create( Filter && Filter.prototype );\n MotionBlurFilter.prototype.constructor = MotionBlurFilter;\n\n var prototypeAccessors = { velocity: { configurable: true },offset: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n MotionBlurFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n var ref = this.velocity;\n var x = ref.x;\n var y = ref.y;\n\n this.uniforms.uKernelSize = (x !== 0 || y !== 0) ? this.kernelSize : 0;\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Sets the velocity of the motion for blur effect.\n *\n * @member {PIXI.ObservablePoint}\n */\n prototypeAccessors.velocity.set = function (value) {\n if (Array.isArray(value)) {\n this._velocity.set(value[0], value[1]);\n }\n else if (value instanceof Point || value instanceof ObservablePoint) {\n this._velocity.copy(value);\n }\n };\n\n prototypeAccessors.velocity.get = function () {\n return this._velocity;\n };\n\n /**\n * Handle velocity changed\n * @private\n */\n MotionBlurFilter.prototype.velocityChanged = function velocityChanged () {\n this.uniforms.uVelocity[0] = this._velocity.x;\n this.uniforms.uVelocity[1] = this._velocity.y;\n };\n\n /**\n * The offset of the blur filter.\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.offset.set = function (value) {\n this.uniforms.uOffset = value;\n };\n\n prototypeAccessors.offset.get = function () {\n return this.uniforms.uOffset;\n };\n\n Object.defineProperties( MotionBlurFilter.prototype, prototypeAccessors );\n\n return MotionBlurFilter;\n}(Filter));\n\nexport { MotionBlurFilter };\n//# sourceMappingURL=filter-motion-blur.esm.js.map\n","/*!\n * @pixi/filter-multi-color-replace - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-multi-color-replace is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { hex2rgb, rgb2hex } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform float epsilon;\\n\\nconst int MAX_COLORS = %maxColors%;\\n\\nuniform vec3 originalColors[MAX_COLORS];\\nuniform vec3 targetColors[MAX_COLORS];\\n\\nvoid main(void)\\n{\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n\\n float alpha = gl_FragColor.a;\\n if (alpha < 0.0001)\\n {\\n return;\\n }\\n\\n vec3 color = gl_FragColor.rgb / alpha;\\n\\n for(int i = 0; i < MAX_COLORS; i++)\\n {\\n vec3 origColor = originalColors[i];\\n if (origColor.r < 0.0)\\n {\\n break;\\n }\\n vec3 colorDiff = origColor - color;\\n if (length(colorDiff) < epsilon)\\n {\\n vec3 targetColor = targetColors[i];\\n gl_FragColor = vec4((targetColor + colorDiff) * alpha, alpha);\\n return;\\n }\\n }\\n}\\n\";\n\n/**\n * Filter for replacing a color with another color. Similar to ColorReplaceFilter, but support multiple\n * colors.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/multi-color-replace.png)\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-multi-color-replace|@pixi/filter-multi-color-replace}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {Array} replacements - The collection of replacement items. Each item is color-pair (an array length is 2).\n * In the pair, the first value is original color , the second value is target color.\n * @param {number} [epsilon=0.05] - Tolerance of the floating-point comparison between colors\n * (lower = more exact, higher = more inclusive)\n * @param {number} [maxColors] - The maximum number of replacements filter is able to use. Because the\n * fragment is only compiled once, this cannot be changed after construction.\n * If omitted, the default value is the length of `replacements`.\n *\n * @example\n * // replaces pure red with pure blue, and replaces pure green with pure white\n * someSprite.filters = [new MultiColorReplaceFilter(\n * [\n * [0xFF0000, 0x0000FF],\n * [0x00FF00, 0xFFFFFF]\n * ],\n * 0.001\n * )];\n *\n * You also could use [R, G, B] as the color\n * someOtherSprite.filters = [new MultiColorReplaceFilter(\n * [\n * [ [1,0,0], [0,0,1] ],\n * [ [0,1,0], [1,1,1] ]\n * ],\n * 0.001\n * )];\n *\n */\nvar MultiColorReplaceFilter = /*@__PURE__*/(function (Filter) {\n function MultiColorReplaceFilter(replacements, epsilon, maxColors) {\n if ( epsilon === void 0 ) epsilon = 0.05;\n if ( maxColors === void 0 ) maxColors = null;\n\n maxColors = maxColors || replacements.length;\n\n Filter.call(this, vertex, fragment.replace(/%maxColors%/g, maxColors));\n\n this.epsilon = epsilon;\n this._maxColors = maxColors;\n this._replacements = null;\n this.uniforms.originalColors = new Float32Array(maxColors * 3);\n this.uniforms.targetColors = new Float32Array(maxColors * 3);\n this.replacements = replacements;\n }\n\n if ( Filter ) MultiColorReplaceFilter.__proto__ = Filter;\n MultiColorReplaceFilter.prototype = Object.create( Filter && Filter.prototype );\n MultiColorReplaceFilter.prototype.constructor = MultiColorReplaceFilter;\n\n var prototypeAccessors = { replacements: { configurable: true },maxColors: { configurable: true },epsilon: { configurable: true } };\n\n /**\n * The source and target colors for replacement. See constructor for information on the format.\n *\n * @member {Array}\n */\n prototypeAccessors.replacements.set = function (replacements) {\n var originals = this.uniforms.originalColors;\n var targets = this.uniforms.targetColors;\n var colorCount = replacements.length;\n\n if (colorCount > this._maxColors) {\n throw (\"Length of replacements (\" + colorCount + \") exceeds the maximum colors length (\" + (this._maxColors) + \")\");\n }\n\n // Fill with negative values\n originals[colorCount * 3] = -1;\n\n for (var i = 0; i < colorCount; i++) {\n var pair = replacements[i];\n\n // for original colors\n var color = pair[0];\n if (typeof color === 'number') {\n color = hex2rgb(color);\n }\n else {\n pair[0] = rgb2hex(color);\n }\n\n originals[i * 3] = color[0];\n originals[(i * 3) + 1] = color[1];\n originals[(i * 3) + 2] = color[2];\n\n // for target colors\n var targetColor = pair[1];\n if (typeof targetColor === 'number') {\n targetColor = hex2rgb(targetColor);\n }\n else {\n pair[1] = rgb2hex(targetColor);\n }\n\n targets[i * 3] = targetColor[0];\n targets[(i * 3) + 1] = targetColor[1];\n targets[(i * 3) + 2] = targetColor[2];\n }\n\n this._replacements = replacements;\n };\n prototypeAccessors.replacements.get = function () {\n return this._replacements;\n };\n\n /**\n * Should be called after changing any of the contents of the replacements.\n * This is a convenience method for resetting the `replacements`.\n */\n MultiColorReplaceFilter.prototype.refresh = function refresh () {\n this.replacements = this._replacements;\n };\n\n /**\n * The maximum number of color replacements supported by this filter. Can be changed\n * _only_ during construction.\n *\n * @member {number}\n * @readonly\n */\n prototypeAccessors.maxColors.get = function () {\n return this._maxColors;\n };\n\n /**\n * Tolerance of the floating-point comparison between colors (lower = more exact, higher = more inclusive)\n *\n * @member {number}\n * @default 0.05\n */\n prototypeAccessors.epsilon.set = function (value) {\n this.uniforms.epsilon = value;\n };\n prototypeAccessors.epsilon.get = function () {\n return this.uniforms.epsilon;\n };\n\n Object.defineProperties( MultiColorReplaceFilter.prototype, prototypeAccessors );\n\n return MultiColorReplaceFilter;\n}(Filter));\n\nexport { MultiColorReplaceFilter };\n//# sourceMappingURL=filter-multi-color-replace.esm.js.map\n","/*!\n * @pixi/filter-old-film - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-old-film is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\nuniform vec2 dimensions;\\n\\nuniform float sepia;\\nuniform float noise;\\nuniform float noiseSize;\\nuniform float scratch;\\nuniform float scratchDensity;\\nuniform float scratchWidth;\\nuniform float vignetting;\\nuniform float vignettingAlpha;\\nuniform float vignettingBlur;\\nuniform float seed;\\n\\nconst float SQRT_2 = 1.414213;\\nconst vec3 SEPIA_RGB = vec3(112.0 / 255.0, 66.0 / 255.0, 20.0 / 255.0);\\n\\nfloat rand(vec2 co) {\\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\\n}\\n\\nvec3 Overlay(vec3 src, vec3 dst)\\n{\\n // if (dst <= 0.5) then: 2 * src * dst\\n // if (dst > 0.5) then: 1 - 2 * (1 - dst) * (1 - src)\\n return vec3((dst.x <= 0.5) ? (2.0 * src.x * dst.x) : (1.0 - 2.0 * (1.0 - dst.x) * (1.0 - src.x)),\\n (dst.y <= 0.5) ? (2.0 * src.y * dst.y) : (1.0 - 2.0 * (1.0 - dst.y) * (1.0 - src.y)),\\n (dst.z <= 0.5) ? (2.0 * src.z * dst.z) : (1.0 - 2.0 * (1.0 - dst.z) * (1.0 - src.z)));\\n}\\n\\n\\nvoid main()\\n{\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n vec3 color = gl_FragColor.rgb;\\n\\n if (sepia > 0.0)\\n {\\n float gray = (color.x + color.y + color.z) / 3.0;\\n vec3 grayscale = vec3(gray);\\n\\n color = Overlay(SEPIA_RGB, grayscale);\\n\\n color = grayscale + sepia * (color - grayscale);\\n }\\n\\n vec2 coord = vTextureCoord * filterArea.xy / dimensions.xy;\\n\\n if (vignetting > 0.0)\\n {\\n float outter = SQRT_2 - vignetting * SQRT_2;\\n vec2 dir = vec2(vec2(0.5, 0.5) - coord);\\n dir.y *= dimensions.y / dimensions.x;\\n float darker = clamp((outter - length(dir) * SQRT_2) / ( 0.00001 + vignettingBlur * SQRT_2), 0.0, 1.0);\\n color.rgb *= darker + (1.0 - darker) * (1.0 - vignettingAlpha);\\n }\\n\\n if (scratchDensity > seed && scratch != 0.0)\\n {\\n float phase = seed * 256.0;\\n float s = mod(floor(phase), 2.0);\\n float dist = 1.0 / scratchDensity;\\n float d = distance(coord, vec2(seed * dist, abs(s - seed * dist)));\\n if (d < seed * 0.6 + 0.4)\\n {\\n highp float period = scratchDensity * 10.0;\\n\\n float xx = coord.x * period + phase;\\n float aa = abs(mod(xx, 0.5) * 4.0);\\n float bb = mod(floor(xx / 0.5), 2.0);\\n float yy = (1.0 - bb) * aa + bb * (2.0 - aa);\\n\\n float kk = 2.0 * period;\\n float dw = scratchWidth / dimensions.x * (0.75 + seed);\\n float dh = dw * kk;\\n\\n float tine = (yy - (2.0 - dh));\\n\\n if (tine > 0.0) {\\n float _sign = sign(scratch);\\n\\n tine = s * tine / period + scratch + 0.1;\\n tine = clamp(tine + 1.0, 0.5 + _sign * 0.5, 1.5 + _sign * 0.5);\\n\\n color.rgb *= tine;\\n }\\n }\\n }\\n\\n if (noise > 0.0 && noiseSize > 0.0)\\n {\\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\\n pixelCoord.x = floor(pixelCoord.x / noiseSize);\\n pixelCoord.y = floor(pixelCoord.y / noiseSize);\\n // vec2 d = pixelCoord * noiseSize * vec2(1024.0 + seed * 512.0, 1024.0 - seed * 512.0);\\n // float _noise = snoise(d) * 0.5;\\n float _noise = rand(pixelCoord * noiseSize * seed) - 0.5;\\n color += _noise * noise;\\n }\\n\\n gl_FragColor.rgb = color;\\n}\\n\";\n\n/**\n * The OldFilmFilter applies a Old film effect to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/old-film.gif)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-old-film|@pixi/filter-old-film}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object|number} [options] - The optional parameters of old film effect.\n * When options is a number , it will be `seed`\n * @param {number} [options.sepia=0.3] - The amount of saturation of sepia effect,\n * a value of `1` is more saturation and closer to `0` is less, and a value of\n * `0` produces no sepia effect\n * @param {number} [options.noise=0.3] - Opacity/intensity of the noise effect between `0` and `1`\n * @param {number} [options.noiseSize=1.0] - The size of the noise particles\n * @param {number} [options.scratch=0.5] - How often scratches appear\n * @param {number} [options.scratchDensity=0.3] - The density of the number of scratches\n * @param {number} [options.scratchWidth=1.0] - The width of the scratches\n * @param {number} [options.vignetting=0.3] - The radius of the vignette effect, smaller\n * values produces a smaller vignette\n * @param {number} [options.vignettingAlpha=1.0] - Amount of opacity of vignette\n * @param {number} [options.vignettingBlur=0.3] - Blur intensity of the vignette\n * @param {number} [seed=0] - A see value to apply to the random noise generation\n */\nvar OldFilmFilter = /*@__PURE__*/(function (Filter) {\n function OldFilmFilter(options, seed) {\n if ( seed === void 0 ) seed = 0;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n\n if (typeof options === 'number') {\n this.seed = options;\n options = null;\n }\n else {\n /**\n * A see value to apply to the random noise generation\n * @member {number}\n */\n this.seed = seed;\n }\n\n Object.assign(this, {\n sepia: 0.3,\n noise: 0.3,\n noiseSize: 1.0,\n scratch: 0.5,\n scratchDensity: 0.3,\n scratchWidth: 1.0,\n vignetting: 0.3,\n vignettingAlpha: 1.0,\n vignettingBlur: 0.3,\n }, options);\n }\n\n if ( Filter ) OldFilmFilter.__proto__ = Filter;\n OldFilmFilter.prototype = Object.create( Filter && Filter.prototype );\n OldFilmFilter.prototype.constructor = OldFilmFilter;\n\n var prototypeAccessors = { sepia: { configurable: true },noise: { configurable: true },noiseSize: { configurable: true },scratch: { configurable: true },scratchDensity: { configurable: true },scratchWidth: { configurable: true },vignetting: { configurable: true },vignettingAlpha: { configurable: true },vignettingBlur: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n OldFilmFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n\n // named `seed` because in the most programming languages,\n // `random` used for \"the function for generating random value\".\n this.uniforms.seed = this.seed;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n\n /**\n * The amount of saturation of sepia effect,\n * a value of `1` is more saturation and closer to `0` is less,\n * and a value of `0` produces no sepia effect\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.sepia.set = function (value) {\n this.uniforms.sepia = value;\n };\n\n prototypeAccessors.sepia.get = function () {\n return this.uniforms.sepia;\n };\n\n /**\n * Opacity/intensity of the noise effect between `0` and `1`\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.noise.set = function (value) {\n this.uniforms.noise = value;\n };\n\n prototypeAccessors.noise.get = function () {\n return this.uniforms.noise;\n };\n\n /**\n * The size of the noise particles\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.noiseSize.set = function (value) {\n this.uniforms.noiseSize = value;\n };\n\n prototypeAccessors.noiseSize.get = function () {\n return this.uniforms.noiseSize;\n };\n\n /**\n * How often scratches appear\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.scratch.set = function (value) {\n this.uniforms.scratch = value;\n };\n\n prototypeAccessors.scratch.get = function () {\n return this.uniforms.scratch;\n };\n\n /**\n * The density of the number of scratches\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.scratchDensity.set = function (value) {\n this.uniforms.scratchDensity = value;\n };\n\n prototypeAccessors.scratchDensity.get = function () {\n return this.uniforms.scratchDensity;\n };\n\n /**\n * The width of the scratches\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.scratchWidth.set = function (value) {\n this.uniforms.scratchWidth = value;\n };\n\n prototypeAccessors.scratchWidth.get = function () {\n return this.uniforms.scratchWidth;\n };\n\n /**\n * The radius of the vignette effect, smaller\n * values produces a smaller vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignetting.set = function (value) {\n this.uniforms.vignetting = value;\n };\n\n prototypeAccessors.vignetting.get = function () {\n return this.uniforms.vignetting;\n };\n\n /**\n * Amount of opacity of vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignettingAlpha.set = function (value) {\n this.uniforms.vignettingAlpha = value;\n };\n\n prototypeAccessors.vignettingAlpha.get = function () {\n return this.uniforms.vignettingAlpha;\n };\n\n /**\n * Blur intensity of the vignette\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.vignettingBlur.set = function (value) {\n this.uniforms.vignettingBlur = value;\n };\n\n prototypeAccessors.vignettingBlur.get = function () {\n return this.uniforms.vignettingBlur;\n };\n\n Object.defineProperties( OldFilmFilter.prototype, prototypeAccessors );\n\n return OldFilmFilter;\n}(Filter));\n\nexport { OldFilmFilter };\n//# sourceMappingURL=filter-old-film.esm.js.map\n","/*!\n * @pixi/filter-outline - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-outline is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { rgb2hex, hex2rgb } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec2 thickness;\\nuniform vec4 outlineColor;\\nuniform vec4 filterClamp;\\n\\nconst float DOUBLE_PI = 3.14159265358979323846264 * 2.;\\n\\nvoid main(void) {\\n vec4 ownColor = texture2D(uSampler, vTextureCoord);\\n vec4 curColor;\\n float maxAlpha = 0.;\\n vec2 displaced;\\n for (float angle = 0.; angle <= DOUBLE_PI; angle += ${angleStep}) {\\n displaced.x = vTextureCoord.x + thickness.x * cos(angle);\\n displaced.y = vTextureCoord.y + thickness.y * sin(angle);\\n curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw));\\n maxAlpha = max(maxAlpha, curColor.a);\\n }\\n float resultAlpha = max(maxAlpha, ownColor.a);\\n gl_FragColor = vec4((ownColor.rgb + outlineColor.rgb * (1. - ownColor.a)) * resultAlpha, resultAlpha);\\n}\\n\";\n\n/**\n * OutlineFilter, originally by mishaa\n * http://www.html5gamedevs.com/topic/10640-outline-a-sprite-change-certain-colors/?p=69966\n * http://codepen.io/mishaa/pen/emGNRB
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/outline.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-outline|@pixi/filter-outline}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [thickness=1] The tickness of the outline. Make it 2 times more for resolution 2\n * @param {number} [color=0x000000] The color of the outline.\n * @param {number} [quality=0.1] The quality of the outline from `0` to `1`, using a higher quality\n * setting will result in slower performance and more accuracy.\n *\n * @example\n * someSprite.shader = new OutlineFilter(9, 0xFF0000);\n */\nvar OutlineFilter = /*@__PURE__*/(function (Filter) {\n function OutlineFilter(thickness, color, quality) {\n if ( thickness === void 0 ) thickness = 1;\n if ( color === void 0 ) color = 0x000000;\n if ( quality === void 0 ) quality = 0.1;\n\n var samples = Math.max(\n quality * OutlineFilter.MAX_SAMPLES,\n OutlineFilter.MIN_SAMPLES\n );\n var angleStep = (Math.PI * 2 / samples).toFixed(7);\n\n Filter.call(this, vertex, fragment.replace(/\\$\\{angleStep\\}/, angleStep));\n this.uniforms.thickness = new Float32Array([0, 0]);\n\n /**\n * The thickness of the outline.\n * @member {number}\n * @default 1\n */\n this.thickness = thickness;\n\n this.uniforms.outlineColor = new Float32Array([0, 0, 0, 1]);\n this.color = color;\n\n this.quality = quality;\n }\n\n if ( Filter ) OutlineFilter.__proto__ = Filter;\n OutlineFilter.prototype = Object.create( Filter && Filter.prototype );\n OutlineFilter.prototype.constructor = OutlineFilter;\n\n var prototypeAccessors = { color: { configurable: true } };\n\n OutlineFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.thickness[0] = this.thickness / input._frame.width;\n this.uniforms.thickness[1] = this.thickness / input._frame.height;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * The color of the glow.\n * @member {number}\n * @default 0x000000\n */\n prototypeAccessors.color.get = function () {\n return rgb2hex(this.uniforms.outlineColor);\n };\n prototypeAccessors.color.set = function (value) {\n hex2rgb(value, this.uniforms.outlineColor);\n };\n\n Object.defineProperties( OutlineFilter.prototype, prototypeAccessors );\n\n return OutlineFilter;\n}(Filter));\n\n/**\n * The minimum number of samples for rendering outline.\n * @static\n * @member {number} MIN_SAMPLES\n * @memberof PIXI.filters.OutlineFilter\n * @default 1\n */\nOutlineFilter.MIN_SAMPLES = 1;\n\n/**\n * The maximum number of samples for rendering outline.\n * @static\n * @member {number} MAX_SAMPLES\n * @memberof PIXI.filters.OutlineFilter\n * @default 100\n */\nOutlineFilter.MAX_SAMPLES = 100;\n\nexport { OutlineFilter };\n//# sourceMappingURL=filter-outline.esm.js.map\n","/*!\n * @pixi/filter-pixelate - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-pixelate is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform vec2 size;\\nuniform sampler2D uSampler;\\n\\nuniform vec4 filterArea;\\n\\nvec2 mapCoord( vec2 coord )\\n{\\n coord *= filterArea.xy;\\n coord += filterArea.zw;\\n\\n return coord;\\n}\\n\\nvec2 unmapCoord( vec2 coord )\\n{\\n coord -= filterArea.zw;\\n coord /= filterArea.xy;\\n\\n return coord;\\n}\\n\\nvec2 pixelate(vec2 coord, vec2 size)\\n{\\n\\treturn floor( coord / size ) * size;\\n}\\n\\nvoid main(void)\\n{\\n vec2 coord = mapCoord(vTextureCoord);\\n\\n coord = pixelate(coord, size);\\n\\n coord = unmapCoord(coord);\\n\\n gl_FragColor = texture2D(uSampler, coord);\\n}\\n\";\n\n/**\n * This filter applies a pixelate effect making display objects appear 'blocky'.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/pixelate.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-pixelate|@pixi/filter-pixelate}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {PIXI.Point|Array|number} [size=10] Either the width/height of the size of the pixels, or square size\n */\nvar PixelateFilter = /*@__PURE__*/(function (Filter) {\n function PixelateFilter(size) {\n if ( size === void 0 ) size = 10;\n\n Filter.call(this, vertex, fragment);\n this.size = size;\n }\n\n if ( Filter ) PixelateFilter.__proto__ = Filter;\n PixelateFilter.prototype = Object.create( Filter && Filter.prototype );\n PixelateFilter.prototype.constructor = PixelateFilter;\n\n var prototypeAccessors = { size: { configurable: true } };\n\n /**\n * This a point that describes the size of the blocks.\n * x is the width of the block and y is the height.\n *\n * @member {PIXI.Point|Array|number}\n * @default 10\n */\n prototypeAccessors.size.get = function () {\n return this.uniforms.size;\n };\n prototypeAccessors.size.set = function (value) {\n if (typeof value === 'number') {\n value = [value, value];\n }\n this.uniforms.size = value;\n };\n\n Object.defineProperties( PixelateFilter.prototype, prototypeAccessors );\n\n return PixelateFilter;\n}(Filter));\n\nexport { PixelateFilter };\n//# sourceMappingURL=filter-pixelate.esm.js.map\n","/*!\n * @pixi/filter-radial-blur - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-radial-blur is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\n\\nuniform float uRadian;\\nuniform vec2 uCenter;\\nuniform float uRadius;\\nuniform int uKernelSize;\\n\\nconst int MAX_KERNEL_SIZE = 2048;\\n\\nvoid main(void)\\n{\\n vec4 color = texture2D(uSampler, vTextureCoord);\\n\\n if (uKernelSize == 0)\\n {\\n gl_FragColor = color;\\n return;\\n }\\n\\n float aspect = filterArea.y / filterArea.x;\\n vec2 center = uCenter.xy / filterArea.xy;\\n float gradient = uRadius / filterArea.x * 0.3;\\n float radius = uRadius / filterArea.x - gradient * 0.5;\\n int k = uKernelSize - 1;\\n\\n vec2 coord = vTextureCoord;\\n vec2 dir = vec2(center - coord);\\n float dist = length(vec2(dir.x, dir.y * aspect));\\n\\n float radianStep = uRadian;\\n if (radius >= 0.0 && dist > radius) {\\n float delta = dist - radius;\\n float gap = gradient;\\n float scale = 1.0 - abs(delta / gap);\\n if (scale <= 0.0) {\\n gl_FragColor = color;\\n return;\\n }\\n radianStep *= scale;\\n }\\n radianStep /= float(k);\\n\\n float s = sin(radianStep);\\n float c = cos(radianStep);\\n mat2 rotationMatrix = mat2(vec2(c, -s), vec2(s, c));\\n\\n for(int i = 0; i < MAX_KERNEL_SIZE - 1; i++) {\\n if (i == k) {\\n break;\\n }\\n\\n coord -= center;\\n coord.y *= aspect;\\n coord = rotationMatrix * coord;\\n coord.y /= aspect;\\n coord += center;\\n\\n vec4 sample = texture2D(uSampler, coord);\\n\\n // switch to pre-multiplied alpha to correctly blur transparent images\\n // sample.rgb *= sample.a;\\n\\n color += sample;\\n }\\n\\n gl_FragColor = color / float(uKernelSize);\\n}\\n\";\n\n/**\n * The RadialBlurFilter applies a Motion blur to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/radial-blur.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-radial-blur|@pixi/filter-radial-blur}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [angle=0] Sets the angle of the motion for blur effect.\n * @param {PIXI.Point|number[]} [center=[0,0]] The center of the radial.\n * @param {number} [kernelSize=5] - The kernelSize of the blur filter. But be odd number >= 3\n * @param {number} [radius=-1] - The maximum size of the blur radius, `-1` is infinite\n */\nvar RadialBlurFilter = /*@__PURE__*/(function (Filter) {\n function RadialBlurFilter(angle, center, kernelSize, radius) {\n if ( angle === void 0 ) angle = 0;\n if ( center === void 0 ) center = [0, 0];\n if ( kernelSize === void 0 ) kernelSize = 5;\n if ( radius === void 0 ) radius = -1;\n\n Filter.call(this, vertex, fragment);\n\n this._angle = 0;\n this.angle = angle;\n this.center = center;\n this.kernelSize = kernelSize;\n this.radius = radius;\n }\n\n if ( Filter ) RadialBlurFilter.__proto__ = Filter;\n RadialBlurFilter.prototype = Object.create( Filter && Filter.prototype );\n RadialBlurFilter.prototype.constructor = RadialBlurFilter;\n\n var prototypeAccessors = { angle: { configurable: true },center: { configurable: true },radius: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n RadialBlurFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.uKernelSize = this._angle !== 0 ? this.kernelSize : 0;\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Sets the angle in degrees of the motion for blur effect.\n *\n * @member {PIXI.Point|number[]}\n * @default [0, 0]\n */\n prototypeAccessors.angle.set = function (value) {\n this._angle = value;\n this.uniforms.uRadian = value * Math.PI / 180;\n };\n\n prototypeAccessors.angle.get = function () {\n return this._angle;\n };\n\n /**\n * Center of the effect.\n *\n * @member {PIXI.Point|number[]}\n * @default [0, 0]\n */\n prototypeAccessors.center.get = function () {\n return this.uniforms.uCenter;\n };\n\n prototypeAccessors.center.set = function (value) {\n this.uniforms.uCenter = value;\n };\n\n /**\n * Outer radius of the effect. The default value of `-1` is infinite.\n *\n * @member {number}\n * @default -1\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.uRadius;\n };\n\n prototypeAccessors.radius.set = function (value) {\n if (value < 0 || value === Infinity) {\n value = -1;\n }\n this.uniforms.uRadius = value;\n };\n\n Object.defineProperties( RadialBlurFilter.prototype, prototypeAccessors );\n\n return RadialBlurFilter;\n}(Filter));\n\nexport { RadialBlurFilter };\n//# sourceMappingURL=filter-radial-blur.esm.js.map\n","/*!\n * @pixi/filter-reflection - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-reflection is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\n\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\nuniform vec2 dimensions;\\n\\nuniform bool mirror;\\nuniform float boundary;\\nuniform vec2 amplitude;\\nuniform vec2 waveLength;\\nuniform vec2 alpha;\\nuniform float time;\\n\\nfloat rand(vec2 co) {\\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\\n}\\n\\nvoid main(void)\\n{\\n vec2 pixelCoord = vTextureCoord.xy * filterArea.xy;\\n vec2 coord = pixelCoord / dimensions;\\n\\n if (coord.y < boundary) {\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n return;\\n }\\n\\n float k = (coord.y - boundary) / (1. - boundary + 0.0001);\\n float areaY = boundary * dimensions.y / filterArea.y;\\n float v = areaY + areaY - vTextureCoord.y;\\n float y = mirror ? v : vTextureCoord.y;\\n\\n float _amplitude = ((amplitude.y - amplitude.x) * k + amplitude.x ) / filterArea.x;\\n float _waveLength = ((waveLength.y - waveLength.x) * k + waveLength.x) / filterArea.y;\\n float _alpha = (alpha.y - alpha.x) * k + alpha.x;\\n\\n float x = vTextureCoord.x + cos(v * 6.28 / _waveLength - time) * _amplitude;\\n x = clamp(x, filterClamp.x, filterClamp.z);\\n\\n vec4 color = texture2D(uSampler, vec2(x, y));\\n\\n gl_FragColor = color * _alpha;\\n}\\n\";\n\n/**\n * Applies a reflection effect to simulate the reflection on water with waves.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/reflection.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-reflection|@pixi/filter-reflection}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {object} [options] - The optional parameters of Reflection effect.\n * @param {number} [options.mirror=true] - `true` to reflect the image, `false` for waves-only\n * @param {number} [options.boundary=0.5] - Vertical position of the reflection point, default is 50% (middle)\n * smaller numbers produce a larger reflection, larger numbers produce a smaller reflection.\n * @param {number} [options.amplitude=[0, 20]] - Starting and ending amplitude of waves\n * @param {number} [options.waveLength=[30, 100]] - Starting and ending length of waves\n * @param {number} [options.alpha=[1, 1]] - Starting and ending alpha values\n * @param {number} [options.time=0] - Time for animating position of waves\n */\nvar ReflectionFilter = /*@__PURE__*/(function (Filter) {\n function ReflectionFilter(options) {\n Filter.call(this, vertex, fragment);\n this.uniforms.amplitude = new Float32Array(2);\n this.uniforms.waveLength = new Float32Array(2);\n this.uniforms.alpha = new Float32Array(2);\n this.uniforms.dimensions = new Float32Array(2);\n\n Object.assign(this, {\n mirror: true,\n boundary: 0.5,\n amplitude: [0, 20],\n waveLength: [30, 100],\n alpha: [1, 1],\n\n /**\n * Time for animating position of waves\n *\n * @member {number}\n * @memberof PIXI.filters.ReflectionFilter#\n * @default 0\n */\n time: 0,\n }, options);\n }\n\n if ( Filter ) ReflectionFilter.__proto__ = Filter;\n ReflectionFilter.prototype = Object.create( Filter && Filter.prototype );\n ReflectionFilter.prototype.constructor = ReflectionFilter;\n\n var prototypeAccessors = { mirror: { configurable: true },boundary: { configurable: true },amplitude: { configurable: true },waveLength: { configurable: true },alpha: { configurable: true } };\n\n /**\n * Override existing apply method in PIXI.Filter\n * @private\n */\n ReflectionFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n\n this.uniforms.time = this.time;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * `true` to reflect the image, `false` for waves-only\n *\n * @member {boolean}\n * @default true\n */\n prototypeAccessors.mirror.set = function (value) {\n this.uniforms.mirror = value;\n };\n prototypeAccessors.mirror.get = function () {\n return this.uniforms.mirror;\n };\n\n /**\n * Vertical position of the reflection point, default is 50% (middle)\n * smaller numbers produce a larger reflection, larger numbers produce a smaller reflection.\n *\n * @member {number}\n * @default 0.5\n */\n prototypeAccessors.boundary.set = function (value) {\n this.uniforms.boundary = value;\n };\n prototypeAccessors.boundary.get = function () {\n return this.uniforms.boundary;\n };\n\n /**\n * Starting and ending amplitude of waves\n * @member {number[]}\n * @default [0, 20]\n */\n prototypeAccessors.amplitude.set = function (value) {\n this.uniforms.amplitude[0] = value[0];\n this.uniforms.amplitude[1] = value[1];\n };\n prototypeAccessors.amplitude.get = function () {\n return this.uniforms.amplitude;\n };\n\n /**\n * Starting and ending length of waves\n * @member {number[]}\n * @default [30, 100]\n */\n prototypeAccessors.waveLength.set = function (value) {\n this.uniforms.waveLength[0] = value[0];\n this.uniforms.waveLength[1] = value[1];\n };\n prototypeAccessors.waveLength.get = function () {\n return this.uniforms.waveLength;\n };\n\n /**\n * Starting and ending alpha values\n * @member {number[]}\n * @default [1, 1]\n */\n prototypeAccessors.alpha.set = function (value) {\n this.uniforms.alpha[0] = value[0];\n this.uniforms.alpha[1] = value[1];\n };\n prototypeAccessors.alpha.get = function () {\n return this.uniforms.alpha;\n };\n\n Object.defineProperties( ReflectionFilter.prototype, prototypeAccessors );\n\n return ReflectionFilter;\n}(Filter));\n\nexport { ReflectionFilter };\n//# sourceMappingURL=filter-reflection.esm.js.map\n","/*!\n * @pixi/filter-rgb-split - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-rgb-split is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"precision mediump float;\\n\\nvarying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\nuniform vec2 red;\\nuniform vec2 green;\\nuniform vec2 blue;\\n\\nvoid main(void)\\n{\\n gl_FragColor.r = texture2D(uSampler, vTextureCoord + red/filterArea.xy).r;\\n gl_FragColor.g = texture2D(uSampler, vTextureCoord + green/filterArea.xy).g;\\n gl_FragColor.b = texture2D(uSampler, vTextureCoord + blue/filterArea.xy).b;\\n gl_FragColor.a = texture2D(uSampler, vTextureCoord).a;\\n}\\n\";\n\n/**\n * An RGB Split Filter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/rgb.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-rgb-split|@pixi/filter-rgb-split}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {PIXI.Point} [red=[-10,0]] Red channel offset\n * @param {PIXI.Point} [green=[0, 10]] Green channel offset\n * @param {PIXI.Point} [blue=[0, 0]] Blue channel offset\n */\nvar RGBSplitFilter = /*@__PURE__*/(function (Filter) {\n function RGBSplitFilter(red, green, blue) {\n if ( red === void 0 ) red = [-10, 0];\n if ( green === void 0 ) green = [0, 10];\n if ( blue === void 0 ) blue = [0, 0];\n\n Filter.call(this, vertex, fragment);\n this.red = red;\n this.green = green;\n this.blue = blue;\n }\n\n if ( Filter ) RGBSplitFilter.__proto__ = Filter;\n RGBSplitFilter.prototype = Object.create( Filter && Filter.prototype );\n RGBSplitFilter.prototype.constructor = RGBSplitFilter;\n\n var prototypeAccessors = { red: { configurable: true },green: { configurable: true },blue: { configurable: true } };\n\n /**\n * Red channel offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.red.get = function () {\n return this.uniforms.red;\n };\n prototypeAccessors.red.set = function (value) {\n this.uniforms.red = value;\n };\n\n /**\n * Green channel offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.green.get = function () {\n return this.uniforms.green;\n };\n prototypeAccessors.green.set = function (value) {\n this.uniforms.green = value;\n };\n\n /**\n * Blue offset.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.blue.get = function () {\n return this.uniforms.blue;\n };\n prototypeAccessors.blue.set = function (value) {\n this.uniforms.blue = value;\n };\n\n Object.defineProperties( RGBSplitFilter.prototype, prototypeAccessors );\n\n return RGBSplitFilter;\n}(Filter));\n\nexport { RGBSplitFilter };\n//# sourceMappingURL=filter-rgb-split.esm.js.map\n","/*!\n * @pixi/filter-shockwave - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-shockwave is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\nuniform vec4 filterClamp;\\n\\nuniform vec2 center;\\n\\nuniform float amplitude;\\nuniform float wavelength;\\n// uniform float power;\\nuniform float brightness;\\nuniform float speed;\\nuniform float radius;\\n\\nuniform float time;\\n\\nconst float PI = 3.14159;\\n\\nvoid main()\\n{\\n float halfWavelength = wavelength * 0.5 / filterArea.x;\\n float maxRadius = radius / filterArea.x;\\n float currentRadius = time * speed / filterArea.x;\\n\\n float fade = 1.0;\\n\\n if (maxRadius > 0.0) {\\n if (currentRadius > maxRadius) {\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n return;\\n }\\n fade = 1.0 - pow(currentRadius / maxRadius, 2.0);\\n }\\n\\n vec2 dir = vec2(vTextureCoord - center / filterArea.xy);\\n dir.y *= filterArea.y / filterArea.x;\\n float dist = length(dir);\\n\\n if (dist <= 0.0 || dist < currentRadius - halfWavelength || dist > currentRadius + halfWavelength) {\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n return;\\n }\\n\\n vec2 diffUV = normalize(dir);\\n\\n float diff = (dist - currentRadius) / halfWavelength;\\n\\n float p = 1.0 - pow(abs(diff), 2.0);\\n\\n // float powDiff = diff * pow(p, 2.0) * ( amplitude * fade );\\n float powDiff = 1.25 * sin(diff * PI) * p * ( amplitude * fade );\\n\\n vec2 offset = diffUV * powDiff / filterArea.xy;\\n\\n // Do clamp :\\n vec2 coord = vTextureCoord + offset;\\n vec2 clampedCoord = clamp(coord, filterClamp.xy, filterClamp.zw);\\n vec4 color = texture2D(uSampler, clampedCoord);\\n if (coord != clampedCoord) {\\n color *= max(0.0, 1.0 - length(coord - clampedCoord));\\n }\\n\\n // No clamp :\\n // gl_FragColor = texture2D(uSampler, vTextureCoord + offset);\\n\\n color.rgb *= 1.0 + (brightness - 1.0) * p * fade;\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * The ShockwaveFilter class lets you apply a shockwave effect.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/shockwave.gif)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-shockwave|@pixi/filter-shockwave}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n *\n * @param {PIXI.Point|number[]} [center=[0.5, 0.5]] See `center` property.\n * @param {object} [options] - The optional parameters of shockwave filter.\n * @param {number} [options.amplitude=0.5] - See `amplitude`` property.\n * @param {number} [options.wavelength=1.0] - See `wavelength` property.\n * @param {number} [options.speed=500.0] - See `speed` property.\n * @param {number} [options.brightness=8] - See `brightness` property.\n * @param {number} [options.radius=4] - See `radius` property.\n * @param {number} [time=0] - See `time` property.\n */\nvar ShockwaveFilter = /*@__PURE__*/(function (Filter) {\n function ShockwaveFilter(center, options, time) {\n if ( center === void 0 ) center = [0.0, 0.0];\n if ( options === void 0 ) options = {};\n if ( time === void 0 ) time = 0;\n\n Filter.call(this, vertex, fragment);\n\n this.center = center;\n\n if (Array.isArray(options)) {\n // eslint-disable-next-line no-console\n console.warn('Deprecated Warning: ShockwaveFilter params Array has been changed to options Object.');\n options = {};\n }\n\n options = Object.assign({\n amplitude: 30.0,\n wavelength: 160.0,\n brightness: 1.0,\n speed: 500.0,\n radius: -1.0,\n }, options);\n\n this.amplitude = options.amplitude;\n\n this.wavelength = options.wavelength;\n\n this.brightness = options.brightness;\n\n this.speed = options.speed;\n\n this.radius = options.radius;\n\n /**\n * Sets the elapsed time of the shockwave.\n * It could control the current size of shockwave.\n *\n * @member {number}\n */\n this.time = time;\n }\n\n if ( Filter ) ShockwaveFilter.__proto__ = Filter;\n ShockwaveFilter.prototype = Object.create( Filter && Filter.prototype );\n ShockwaveFilter.prototype.constructor = ShockwaveFilter;\n\n var prototypeAccessors = { center: { configurable: true },amplitude: { configurable: true },wavelength: { configurable: true },brightness: { configurable: true },speed: { configurable: true },radius: { configurable: true } };\n\n ShockwaveFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n /**\n * There is no set/get of `time`, for performance.\n * Because in the most real cases, `time` will be changed in ever game tick.\n * Use set/get will take more function-call.\n */\n this.uniforms.time = this.time;\n\n filterManager.applyFilter(this, input, output, clear);\n };\n\n /**\n * Sets the center of the shockwave in normalized screen coords. That is\n * (0,0) is the top-left and (1,1) is the bottom right.\n *\n * @member {PIXI.Point|number[]}\n */\n prototypeAccessors.center.get = function () {\n return this.uniforms.center;\n };\n prototypeAccessors.center.set = function (value) {\n this.uniforms.center = value;\n };\n\n /**\n * The amplitude of the shockwave.\n *\n * @member {number}\n */\n prototypeAccessors.amplitude.get = function () {\n return this.uniforms.amplitude;\n };\n prototypeAccessors.amplitude.set = function (value) {\n this.uniforms.amplitude = value;\n };\n\n /**\n * The wavelength of the shockwave.\n *\n * @member {number}\n */\n prototypeAccessors.wavelength.get = function () {\n return this.uniforms.wavelength;\n };\n prototypeAccessors.wavelength.set = function (value) {\n this.uniforms.wavelength = value;\n };\n\n /**\n * The brightness of the shockwave.\n *\n * @member {number}\n */\n prototypeAccessors.brightness.get = function () {\n return this.uniforms.brightness;\n };\n prototypeAccessors.brightness.set = function (value) {\n this.uniforms.brightness = value;\n };\n\n /**\n * The speed about the shockwave ripples out.\n * The unit is `pixel/second`\n *\n * @member {number}\n */\n prototypeAccessors.speed.get = function () {\n return this.uniforms.speed;\n };\n prototypeAccessors.speed.set = function (value) {\n this.uniforms.speed = value;\n };\n\n /**\n * The maximum radius of shockwave.\n * `< 0.0` means it's infinity.\n *\n * @member {number}\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.radius;\n };\n prototypeAccessors.radius.set = function (value) {\n this.uniforms.radius = value;\n };\n\n Object.defineProperties( ShockwaveFilter.prototype, prototypeAccessors );\n\n return ShockwaveFilter;\n}(Filter));\n\nexport { ShockwaveFilter };\n//# sourceMappingURL=filter-shockwave.esm.js.map\n","/*!\n * @pixi/filter-simple-lightmap - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-simple-lightmap is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { hex2rgb, rgb2hex } from '@pixi/utils';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform sampler2D uLightmap;\\nuniform vec4 filterArea;\\nuniform vec2 dimensions;\\nuniform vec4 ambientColor;\\nvoid main() {\\n vec4 diffuseColor = texture2D(uSampler, vTextureCoord);\\n vec2 lightCoord = (vTextureCoord * filterArea.xy) / dimensions;\\n vec4 light = texture2D(uLightmap, lightCoord);\\n vec3 ambient = ambientColor.rgb * ambientColor.a;\\n vec3 intensity = ambient + light.rgb;\\n vec3 finalColor = diffuseColor.rgb * intensity;\\n gl_FragColor = vec4(finalColor, diffuseColor.a);\\n}\\n\";\n\n/**\n* SimpleLightmap, originally by Oza94\n* http://www.html5gamedevs.com/topic/20027-pixijs-simple-lightmapping/\n* http://codepen.io/Oza94/pen/EPoRxj\n*\n* You have to specify filterArea, or suffer consequences.\n* You may have to use it with `filter.dontFit = true`,\n* until we rewrite this using same approach as for DisplacementFilter.\n*\n* ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/simple-lightmap.png)\n* @class\n* @extends PIXI.Filter\n* @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-simple-lightmap|@pixi/filter-simple-lightmap}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n* @param {PIXI.Texture} texture a texture where your lightmap is rendered\n* @param {Array|number} [color=0x000000] An RGBA array of the ambient color\n* @param {number} [alpha=1] Default alpha set independent of color (if it's a number, not array).\n*\n* @example\n* displayObject.filters = [new SimpleLightmapFilter(texture, 0x666666)];\n*/\nvar SimpleLightmapFilter = /*@__PURE__*/(function (Filter) {\n function SimpleLightmapFilter(texture, color, alpha) {\n if ( color === void 0 ) color = 0x000000;\n if ( alpha === void 0 ) alpha = 1;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.dimensions = new Float32Array(2);\n this.uniforms.ambientColor = new Float32Array([0, 0, 0, alpha]);\n this.texture = texture;\n this.color = color;\n }\n\n if ( Filter ) SimpleLightmapFilter.__proto__ = Filter;\n SimpleLightmapFilter.prototype = Object.create( Filter && Filter.prototype );\n SimpleLightmapFilter.prototype.constructor = SimpleLightmapFilter;\n\n var prototypeAccessors = { texture: { configurable: true },color: { configurable: true },alpha: { configurable: true } };\n\n /**\n * Applies the filter.\n * @private\n * @param {PIXI.FilterManager} filterManager - The manager.\n * @param {PIXI.RenderTarget} input - The input target.\n * @param {PIXI.RenderTarget} output - The output target.\n */\n SimpleLightmapFilter.prototype.apply = function apply (filterManager, input, output, clear) {\n this.uniforms.dimensions[0] = input.filterFrame.width;\n this.uniforms.dimensions[1] = input.filterFrame.height;\n\n // draw the filter...\n filterManager.applyFilter(this, input, output, clear);\n };\n\n\n /**\n * a texture where your lightmap is rendered\n * @member {PIXI.Texture}\n */\n prototypeAccessors.texture.get = function () {\n return this.uniforms.uLightmap;\n };\n prototypeAccessors.texture.set = function (value) {\n this.uniforms.uLightmap = value;\n };\n\n /**\n * An RGBA array of the ambient color or a hex color without alpha\n * @member {Array|number}\n */\n prototypeAccessors.color.set = function (value) {\n var arr = this.uniforms.ambientColor;\n if (typeof value === 'number') {\n hex2rgb(value, arr);\n this._color = value;\n }\n else {\n arr[0] = value[0];\n arr[1] = value[1];\n arr[2] = value[2];\n arr[3] = value[3];\n this._color = rgb2hex(arr);\n }\n };\n prototypeAccessors.color.get = function () {\n return this._color;\n };\n\n /**\n * When setting `color` as hex, this can be used to set alpha independently.\n * @member {number}\n */\n prototypeAccessors.alpha.get = function () {\n return this.uniforms.ambientColor[3];\n };\n prototypeAccessors.alpha.set = function (value) {\n this.uniforms.ambientColor[3] = value;\n };\n\n Object.defineProperties( SimpleLightmapFilter.prototype, prototypeAccessors );\n\n return SimpleLightmapFilter;\n}(Filter));\n\nexport { SimpleLightmapFilter };\n//# sourceMappingURL=filter-simple-lightmap.esm.js.map\n","/*!\n * @pixi/filter-tilt-shift - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-tilt-shift is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\nimport { Point } from '@pixi/math';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform float blur;\\nuniform float gradientBlur;\\nuniform vec2 start;\\nuniform vec2 end;\\nuniform vec2 delta;\\nuniform vec2 texSize;\\n\\nfloat random(vec3 scale, float seed)\\n{\\n return fract(sin(dot(gl_FragCoord.xyz + seed, scale)) * 43758.5453 + seed);\\n}\\n\\nvoid main(void)\\n{\\n vec4 color = vec4(0.0);\\n float total = 0.0;\\n\\n float offset = random(vec3(12.9898, 78.233, 151.7182), 0.0);\\n vec2 normal = normalize(vec2(start.y - end.y, end.x - start.x));\\n float radius = smoothstep(0.0, 1.0, abs(dot(vTextureCoord * texSize - start, normal)) / gradientBlur) * blur;\\n\\n for (float t = -30.0; t <= 30.0; t++)\\n {\\n float percent = (t + offset - 0.5) / 30.0;\\n float weight = 1.0 - abs(percent);\\n vec4 sample = texture2D(uSampler, vTextureCoord + delta / texSize * percent * radius);\\n sample.rgb *= sample.a;\\n color += sample * weight;\\n total += weight;\\n }\\n\\n color /= total;\\n color.rgb /= color.a + 0.00001;\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * @author Vico @vicocotea\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/blur/tiltshift.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * A TiltShiftAxisFilter.\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @private\n */\nvar TiltShiftAxisFilter = /*@__PURE__*/(function (Filter) {\n function TiltShiftAxisFilter(blur, gradientBlur, start, end){\n if ( blur === void 0 ) blur = 100;\n if ( gradientBlur === void 0 ) gradientBlur = 600;\n if ( start === void 0 ) start = null;\n if ( end === void 0 ) end = null;\n\n Filter.call(this, vertex, fragment);\n this.uniforms.blur = blur;\n this.uniforms.gradientBlur = gradientBlur;\n this.uniforms.start = start || new Point(0, window.innerHeight / 2);\n this.uniforms.end = end || new Point(600, window.innerHeight / 2);\n this.uniforms.delta = new Point(30, 30);\n this.uniforms.texSize = new Point(window.innerWidth, window.innerHeight);\n this.updateDelta();\n }\n\n if ( Filter ) TiltShiftAxisFilter.__proto__ = Filter;\n TiltShiftAxisFilter.prototype = Object.create( Filter && Filter.prototype );\n TiltShiftAxisFilter.prototype.constructor = TiltShiftAxisFilter;\n\n var prototypeAccessors = { blur: { configurable: true },gradientBlur: { configurable: true },start: { configurable: true },end: { configurable: true } };\n\n /**\n * Updates the filter delta values.\n * This is overridden in the X and Y filters, does nothing for this class.\n *\n */\n TiltShiftAxisFilter.prototype.updateDelta = function updateDelta () {\n this.uniforms.delta.x = 0;\n this.uniforms.delta.y = 0;\n };\n\n /**\n * The strength of the blur.\n *\n * @member {number}\n * @memberof PIXI.filters.TiltShiftAxisFilter#\n */\n prototypeAccessors.blur.get = function () {\n return this.uniforms.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this.uniforms.blur = value;\n };\n\n /**\n * The strength of the gradient blur.\n *\n * @member {number}\n * @memberof PIXI.filters.TiltShiftAxisFilter#\n */\n prototypeAccessors.gradientBlur.get = function () {\n return this.uniforms.gradientBlur;\n };\n prototypeAccessors.gradientBlur.set = function (value) {\n this.uniforms.gradientBlur = value;\n };\n\n /**\n * The X value to start the effect at.\n *\n * @member {PIXI.Point}\n * @memberof PIXI.filters.TiltShiftAxisFilter#\n */\n prototypeAccessors.start.get = function () {\n return this.uniforms.start;\n };\n prototypeAccessors.start.set = function (value) {\n this.uniforms.start = value;\n this.updateDelta();\n };\n\n /**\n * The X value to end the effect at.\n *\n * @member {PIXI.Point}\n * @memberof PIXI.filters.TiltShiftAxisFilter#\n */\n prototypeAccessors.end.get = function () {\n return this.uniforms.end;\n };\n prototypeAccessors.end.set = function (value) {\n this.uniforms.end = value;\n this.updateDelta();\n };\n\n Object.defineProperties( TiltShiftAxisFilter.prototype, prototypeAccessors );\n\n return TiltShiftAxisFilter;\n}(Filter));\n\n/**\n * @author Vico @vicocotea\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/blur/tiltshift.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * A TiltShiftXFilter.\n *\n * @class\n * @extends PIXI.TiltShiftAxisFilter\n * @memberof PIXI.filters\n * @private\n */\nvar TiltShiftXFilter = /*@__PURE__*/(function (TiltShiftAxisFilter) {\n function TiltShiftXFilter () {\n TiltShiftAxisFilter.apply(this, arguments);\n }\n\n if ( TiltShiftAxisFilter ) TiltShiftXFilter.__proto__ = TiltShiftAxisFilter;\n TiltShiftXFilter.prototype = Object.create( TiltShiftAxisFilter && TiltShiftAxisFilter.prototype );\n TiltShiftXFilter.prototype.constructor = TiltShiftXFilter;\n\n TiltShiftXFilter.prototype.updateDelta = function updateDelta () {\n var dx = this.uniforms.end.x - this.uniforms.start.x;\n var dy = this.uniforms.end.y - this.uniforms.start.y;\n var d = Math.sqrt(dx * dx + dy * dy);\n this.uniforms.delta.x = dx / d;\n this.uniforms.delta.y = dy / d;\n };\n\n return TiltShiftXFilter;\n}(TiltShiftAxisFilter));\n\n/**\n * @author Vico @vicocotea\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/blur/tiltshift.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * A TiltShiftYFilter.\n *\n * @class\n * @extends PIXI.TiltShiftAxisFilter\n * @memberof PIXI.filters\n * @private\n */\nvar TiltShiftYFilter = /*@__PURE__*/(function (TiltShiftAxisFilter) {\n function TiltShiftYFilter () {\n TiltShiftAxisFilter.apply(this, arguments);\n }\n\n if ( TiltShiftAxisFilter ) TiltShiftYFilter.__proto__ = TiltShiftAxisFilter;\n TiltShiftYFilter.prototype = Object.create( TiltShiftAxisFilter && TiltShiftAxisFilter.prototype );\n TiltShiftYFilter.prototype.constructor = TiltShiftYFilter;\n\n TiltShiftYFilter.prototype.updateDelta = function updateDelta () {\n var dx = this.uniforms.end.x - this.uniforms.start.x;\n var dy = this.uniforms.end.y - this.uniforms.start.y;\n var d = Math.sqrt(dx * dx + dy * dy);\n this.uniforms.delta.x = -dy / d;\n this.uniforms.delta.y = dx / d;\n };\n\n return TiltShiftYFilter;\n}(TiltShiftAxisFilter));\n\n/**\n * @author Vico @vicocotea\n * original filter https://github.com/evanw/glfx.js/blob/master/src/filters/blur/tiltshift.js by Evan Wallace : http://madebyevan.com/\n */\n\n/**\n * A TiltShift Filter. Manages the pass of both a TiltShiftXFilter and TiltShiftYFilter.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/tilt-shift.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-tilt-shift|@pixi/filter-tilt-shift}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [blur=100] The strength of the blur.\n * @param {number} [gradientBlur=600] The strength of the gradient blur.\n * @param {PIXI.Point} [start=null] The Y value to start the effect at.\n * @param {PIXI.Point} [end=null] The Y value to end the effect at.\n */\nvar TiltShiftFilter = /*@__PURE__*/(function (Filter) {\n function TiltShiftFilter(blur, gradientBlur, start, end) {\n if ( blur === void 0 ) blur = 100;\n if ( gradientBlur === void 0 ) gradientBlur = 600;\n if ( start === void 0 ) start = null;\n if ( end === void 0 ) end = null;\n\n Filter.call(this);\n this.tiltShiftXFilter = new TiltShiftXFilter(blur, gradientBlur, start, end);\n this.tiltShiftYFilter = new TiltShiftYFilter(blur, gradientBlur, start, end);\n }\n\n if ( Filter ) TiltShiftFilter.__proto__ = Filter;\n TiltShiftFilter.prototype = Object.create( Filter && Filter.prototype );\n TiltShiftFilter.prototype.constructor = TiltShiftFilter;\n\n var prototypeAccessors = { blur: { configurable: true },gradientBlur: { configurable: true },start: { configurable: true },end: { configurable: true } };\n\n TiltShiftFilter.prototype.apply = function apply (filterManager, input, output) {\n var renderTarget = filterManager.getFilterTexture();\n this.tiltShiftXFilter.apply(filterManager, input, renderTarget);\n this.tiltShiftYFilter.apply(filterManager, renderTarget, output);\n filterManager.returnFilterTexture(renderTarget);\n };\n\n /**\n * The strength of the blur.\n *\n * @member {number}\n */\n prototypeAccessors.blur.get = function () {\n return this.tiltShiftXFilter.blur;\n };\n prototypeAccessors.blur.set = function (value) {\n this.tiltShiftXFilter.blur = this.tiltShiftYFilter.blur = value;\n };\n\n /**\n * The strength of the gradient blur.\n *\n * @member {number}\n */\n prototypeAccessors.gradientBlur.get = function () {\n return this.tiltShiftXFilter.gradientBlur;\n };\n prototypeAccessors.gradientBlur.set = function (value) {\n this.tiltShiftXFilter.gradientBlur = this.tiltShiftYFilter.gradientBlur = value;\n };\n\n /**\n * The Y value to start the effect at.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.start.get = function () {\n return this.tiltShiftXFilter.start;\n };\n prototypeAccessors.start.set = function (value) {\n this.tiltShiftXFilter.start = this.tiltShiftYFilter.start = value;\n };\n\n /**\n * The Y value to end the effect at.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.end.get = function () {\n return this.tiltShiftXFilter.end;\n };\n prototypeAccessors.end.set = function (value) {\n this.tiltShiftXFilter.end = this.tiltShiftYFilter.end = value;\n };\n\n Object.defineProperties( TiltShiftFilter.prototype, prototypeAccessors );\n\n return TiltShiftFilter;\n}(Filter));\n\nexport { TiltShiftAxisFilter, TiltShiftFilter, TiltShiftXFilter, TiltShiftYFilter };\n//# sourceMappingURL=filter-tilt-shift.esm.js.map\n","/*!\n * @pixi/filter-twist - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-twist is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\n\\nuniform sampler2D uSampler;\\nuniform float radius;\\nuniform float angle;\\nuniform vec2 offset;\\nuniform vec4 filterArea;\\n\\nvec2 mapCoord( vec2 coord )\\n{\\n coord *= filterArea.xy;\\n coord += filterArea.zw;\\n\\n return coord;\\n}\\n\\nvec2 unmapCoord( vec2 coord )\\n{\\n coord -= filterArea.zw;\\n coord /= filterArea.xy;\\n\\n return coord;\\n}\\n\\nvec2 twist(vec2 coord)\\n{\\n coord -= offset;\\n\\n float dist = length(coord);\\n\\n if (dist < radius)\\n {\\n float ratioDist = (radius - dist) / radius;\\n float angleMod = ratioDist * ratioDist * angle;\\n float s = sin(angleMod);\\n float c = cos(angleMod);\\n coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);\\n }\\n\\n coord += offset;\\n\\n return coord;\\n}\\n\\nvoid main(void)\\n{\\n\\n vec2 coord = mapCoord(vTextureCoord);\\n\\n coord = twist(coord);\\n\\n coord = unmapCoord(coord);\\n\\n gl_FragColor = texture2D(uSampler, coord );\\n\\n}\\n\";\n\n/**\n * This filter applies a twist effect making display objects appear twisted in the given direction.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/twist.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-twist|@pixi/filter-twist}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [radius=200] The radius of the twist.\n * @param {number} [angle=4] The angle of the twist.\n * @param {number} [padding=20] Padding for filter area.\n */\nvar TwistFilter = /*@__PURE__*/(function (Filter) {\n function TwistFilter(radius, angle, padding) {\n if ( radius === void 0 ) radius = 200;\n if ( angle === void 0 ) angle = 4;\n if ( padding === void 0 ) padding = 20;\n\n Filter.call(this, vertex, fragment);\n\n this.radius = radius;\n this.angle = angle;\n this.padding = padding;\n }\n\n if ( Filter ) TwistFilter.__proto__ = Filter;\n TwistFilter.prototype = Object.create( Filter && Filter.prototype );\n TwistFilter.prototype.constructor = TwistFilter;\n\n var prototypeAccessors = { offset: { configurable: true },radius: { configurable: true },angle: { configurable: true } };\n\n /**\n * This point describes the the offset of the twist.\n *\n * @member {PIXI.Point}\n */\n prototypeAccessors.offset.get = function () {\n return this.uniforms.offset;\n };\n prototypeAccessors.offset.set = function (value) {\n this.uniforms.offset = value;\n };\n\n /**\n * The radius of the twist.\n *\n * @member {number}\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.radius;\n };\n prototypeAccessors.radius.set = function (value) {\n this.uniforms.radius = value;\n };\n\n /**\n * The angle of the twist.\n *\n * @member {number}\n */\n prototypeAccessors.angle.get = function () {\n return this.uniforms.angle;\n };\n prototypeAccessors.angle.set = function (value) {\n this.uniforms.angle = value;\n };\n\n Object.defineProperties( TwistFilter.prototype, prototypeAccessors );\n\n return TwistFilter;\n}(Filter));\n\nexport { TwistFilter };\n//# sourceMappingURL=filter-twist.esm.js.map\n","/*!\n * @pixi/filter-zoom-blur - v3.0.3\n * Compiled Wed, 29 May 2019 03:04:05 UTC\n *\n * @pixi/filter-zoom-blur is licensed under the MIT License.\n * http://www.opensource.org/licenses/mit-license\n */\nimport { Filter } from '@pixi/core';\n\nvar vertex = \"attribute vec2 aVertexPosition;\\nattribute vec2 aTextureCoord;\\n\\nuniform mat3 projectionMatrix;\\n\\nvarying vec2 vTextureCoord;\\n\\nvoid main(void)\\n{\\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\\n vTextureCoord = aTextureCoord;\\n}\";\n\nvar fragment = \"varying vec2 vTextureCoord;\\nuniform sampler2D uSampler;\\nuniform vec4 filterArea;\\n\\nuniform vec2 uCenter;\\nuniform float uStrength;\\nuniform float uInnerRadius;\\nuniform float uRadius;\\n\\nconst float MAX_KERNEL_SIZE = 32.0;\\n\\n// author: http://byteblacksmith.com/improvements-to-the-canonical-one-liner-glsl-rand-for-opengl-es-2-0/\\nhighp float rand(vec2 co, float seed) {\\n const highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n highp float dt = dot(co + seed, vec2(a, b)), sn = mod(dt, 3.14159);\\n return fract(sin(sn) * c + seed);\\n}\\n\\nvoid main() {\\n\\n float minGradient = uInnerRadius * 0.3;\\n float innerRadius = (uInnerRadius + minGradient * 0.5) / filterArea.x;\\n\\n float gradient = uRadius * 0.3;\\n float radius = (uRadius - gradient * 0.5) / filterArea.x;\\n\\n float countLimit = MAX_KERNEL_SIZE;\\n\\n vec2 dir = vec2(uCenter.xy / filterArea.xy - vTextureCoord);\\n float dist = length(vec2(dir.x, dir.y * filterArea.y / filterArea.x));\\n\\n float strength = uStrength;\\n\\n float delta = 0.0;\\n float gap;\\n if (dist < innerRadius) {\\n delta = innerRadius - dist;\\n gap = minGradient;\\n } else if (radius >= 0.0 && dist > radius) { // radius < 0 means it's infinity\\n delta = dist - radius;\\n gap = gradient;\\n }\\n\\n if (delta > 0.0) {\\n float normalCount = gap / filterArea.x;\\n delta = (normalCount - delta) / normalCount;\\n countLimit *= delta;\\n strength *= delta;\\n if (countLimit < 1.0)\\n {\\n gl_FragColor = texture2D(uSampler, vTextureCoord);\\n return;\\n }\\n }\\n\\n // randomize the lookup values to hide the fixed number of samples\\n float offset = rand(vTextureCoord, 0.0);\\n\\n float total = 0.0;\\n vec4 color = vec4(0.0);\\n\\n dir *= strength;\\n\\n for (float t = 0.0; t < MAX_KERNEL_SIZE; t++) {\\n float percent = (t + offset) / MAX_KERNEL_SIZE;\\n float weight = 4.0 * (percent - percent * percent);\\n vec2 p = vTextureCoord + dir * percent;\\n vec4 sample = texture2D(uSampler, p);\\n\\n // switch to pre-multiplied alpha to correctly blur transparent images\\n // sample.rgb *= sample.a;\\n\\n color += sample * weight;\\n total += weight;\\n\\n if (t > countLimit){\\n break;\\n }\\n }\\n\\n color /= total;\\n // switch back from pre-multiplied alpha\\n // color.rgb /= color.a + 0.00001;\\n\\n gl_FragColor = color;\\n}\\n\";\n\n/**\n * The ZoomFilter applies a Zoom blur to an object.
\n * ![original](../tools/screenshots/dist/original.png)![filter](../tools/screenshots/dist/zoom-blur.png)\n *\n * @class\n * @extends PIXI.Filter\n * @memberof PIXI.filters\n * @see {@link https://www.npmjs.com/package/@pixi/filter-zoom-blur|@pixi/filter-zoom-blur}\n * @see {@link https://www.npmjs.com/package/pixi-filters|pixi-filters}\n * @param {number} [strength=0.1] Sets the strength of the zoom blur effect\n * @param {PIXI.Point|number[]} [center=[0,0]] The center of the zoom.\n * @param {number} [innerRadius=0] The inner radius of zoom. The part in inner circle won't apply zoom blur effect.\n * @param {number} [radius=-1] See `radius` property.\n */\nvar ZoomBlurFilter = /*@__PURE__*/(function (Filter) {\n function ZoomBlurFilter(strength, center, innerRadius, radius) {\n if ( strength === void 0 ) strength = 0.1;\n if ( center === void 0 ) center = [0, 0];\n if ( innerRadius === void 0 ) innerRadius = 0;\n if ( radius === void 0 ) radius = -1;\n\n Filter.call(this, vertex, fragment);\n\n this.center = center;\n this.strength = strength;\n this.innerRadius = innerRadius;\n this.radius = radius;\n }\n\n if ( Filter ) ZoomBlurFilter.__proto__ = Filter;\n ZoomBlurFilter.prototype = Object.create( Filter && Filter.prototype );\n ZoomBlurFilter.prototype.constructor = ZoomBlurFilter;\n\n var prototypeAccessors = { center: { configurable: true },strength: { configurable: true },innerRadius: { configurable: true },radius: { configurable: true } };\n\n /**\n * Center of the effect.\n *\n * @member {PIXI.Point|number[]}\n * @default [0, 0]\n */\n prototypeAccessors.center.get = function () {\n return this.uniforms.uCenter;\n };\n prototypeAccessors.center.set = function (value) {\n this.uniforms.uCenter = value;\n };\n\n /**\n * Intensity of the zoom effect.\n *\n * @member {number}\n * @default 0.1\n */\n prototypeAccessors.strength.get = function () {\n return this.uniforms.uStrength;\n };\n prototypeAccessors.strength.set = function (value) {\n this.uniforms.uStrength = value;\n };\n\n /**\n * Radius of the inner region not effected by blur.\n *\n * @member {number}\n * @default 0\n */\n prototypeAccessors.innerRadius.get = function () {\n return this.uniforms.uInnerRadius;\n };\n prototypeAccessors.innerRadius.set = function (value) {\n this.uniforms.uInnerRadius = value;\n };\n\n /**\n * Outer radius of the effect. The default value is `-1`.\n * `< 0.0` means it's infinity.\n *\n * @member {number}\n * @default -1\n */\n prototypeAccessors.radius.get = function () {\n return this.uniforms.uRadius;\n };\n prototypeAccessors.radius.set = function (value) {\n if (value < 0 || value === Infinity) {\n value = -1;\n }\n this.uniforms.uRadius = value;\n };\n\n Object.defineProperties( ZoomBlurFilter.prototype, prototypeAccessors );\n\n return ZoomBlurFilter;\n}(Filter));\n\nexport { ZoomBlurFilter };\n//# sourceMappingURL=filter-zoom-blur.esm.js.map\n"],"names":["vertex","fragment","AdjustmentFilter","Filter","options","call","this","Object","assign","gamma","saturation","contrast","brightness","red","green","blue","alpha","__proto__","prototype","create","constructor","apply","filterManager","input","output","clear","uniforms","Math","max","applyFilter","fragmentClamp","KawaseBlurFilter","blur","quality","clamp","uOffset","Float32Array","_pixelSize","Point","pixelSize","_clamp","_kernels","Array","isArray","kernels","_blur","prototypeAccessors","configurable","offset","uvX","x","_frame","width","uvY","y","height","_quality","tmp","renderTarget","getFilterTexture","source","target","last","i","returnFilterTexture","_generateKernels","k","step","push","get","set","value","length","round","defineProperties","ExtractBrightnessFilter","threshold","fragment$1","AdvancedBloomFilter","bloomScale","resolution","settings","RESOLUTION","_extractFilter","_blurFilter","currentState","brightTarget","bloomTarget","bloomTexture","_resolution","AsciiFilter","size","BevelFilter","lightColor","shadowColor","rotation","thickness","lightAlpha","shadowAlpha","_updateTransform","transformX","_thickness","cos","_angle","transformY","sin","DEG_TO_RAD","rgb2hex","hex2rgb","BloomFilter","kernelSize","blurX","blurY","blurXFilter","BlurFilterPass","blurYFilter","blendMode","BLEND_MODES","SCREEN","defaultFilter","AlphaFilter","BulgePinchFilter","center","radius","strength","dimensions","filterFrame","ColorMapFilter","colorMap","nearest","mix","_size","_sliceSize","_slicePixelSize","_sliceInnerSize","_scaleMode","_nearest","colorSize","_mix","_colorMap","Texture","from","baseTexture","scaleMode","mipmap","SCALE_MODES","NEAREST","LINEAR","texture","_glTextures","_updateID","emit","updateColorMap","destroy","destroyBase","ColorReplaceFilter","originalColor","newColor","epsilon","arr","_originalColor","_newColor","ConvolutionFilter","matrix","texelSize","undefined","this$1","forEach","v","CrossHatchFilter","CRTFilter","time","seed","curvature","lineWidth","lineContrast","verticalLine","noise","noiseSize","vignetting","vignettingAlpha","vignettingBlur","DotFilter","scale","angle","DropShadowFilter","console","warn","arguments","distance","color","shadowOnly","_tintFilter","shift","_updatePadding","padding","_updateShift","_distance","EmbossFilter","GlitchFilter","slices","direction","fillMode","average","minSize","sampleSize","_canvas","document","createElement","_slices","sizes","offsets","aspect","_randomizeSizes","_sizes","min","count","rest","averageWidth","w","random","rest$1","ratio","sqrt","i$1","w$1","shuffle","rand","temp","_randomizeOffsets","_offsets","refresh","redraw","ctx","getContext","clearRect","floor","fillStyle","fillRect","update","displacementMap","len","slicesWidth","slicesOffset","_direction","radians","sinDir","cosDir","TRANSPARENT","ORIGINAL","LOOP","CLAMP","MIRROR","GlowFilter","outerStrength","innerStrength","replace","toFixed","glowColor","perlin","GodrayFilter","gain","lacunarity","parallel","_angleLight","ref","light","MotionBlurFilter","velocity","uVelocity","_velocity","ObservablePoint","velocityChanged","uKernelSize","copy","MultiColorReplaceFilter","replacements","maxColors","_maxColors","_replacements","originalColors","targetColors","originals","targets","colorCount","pair","targetColor","OldFilmFilter","sepia","scratch","scratchDensity","scratchWidth","OutlineFilter","samples","MAX_SAMPLES","MIN_SAMPLES","angleStep","PI","outlineColor","PixelateFilter","RadialBlurFilter","uRadian","uCenter","uRadius","Infinity","ReflectionFilter","amplitude","waveLength","mirror","boundary","RGBSplitFilter","ShockwaveFilter","wavelength","speed","SimpleLightmapFilter","ambientColor","uLightmap","_color","TiltShiftAxisFilter","gradientBlur","start","end","window","innerHeight","delta","texSize","innerWidth","updateDelta","TiltShiftXFilter","dx","dy","d","TiltShiftYFilter","TiltShiftFilter","tiltShiftXFilter","tiltShiftYFilter","TwistFilter","ZoomBlurFilter","innerRadius","uStrength","uInnerRadius"],"mappings":"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"} \ No newline at end of file diff --git a/shared/js/Engine/Libs/pixi-sound.js.map b/shared/js/Engine/Libs/pixi-sound.js.map new file mode 100644 index 0000000..4bbbc28 --- /dev/null +++ b/shared/js/Engine/Libs/pixi-sound.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pixi-sound.js","sources":["../node_modules/promise-polyfill/src/index.js","../node_modules/promise-polyfill/src/finally.js","../src/Filterable.ts","../src/filters/Filter.ts","../src/instance.ts","../src/webaudio/WebAudioUtils.ts","../src/webaudio/WebAudioInstance.ts","../src/webaudio/WebAudioNodes.ts","../src/webaudio/WebAudioMedia.ts","../src/webaudio/WebAudioContext.ts","../src/filters/EqualizerFilter.ts","../src/filters/DistortionFilter.ts","../src/filters/StereoFilter.ts","../src/filters/ReverbFilter.ts","../src/filters/MonoFilter.ts","../src/filters/TelephoneFilter.ts","../src/htmlaudio/HTMLAudioInstance.ts","../src/htmlaudio/HTMLAudioMedia.ts","../src/htmlaudio/HTMLAudioContext.ts","../src/utils/supported.ts","../src/utils/resolveUrl.ts","../src/loader/LoaderMiddleware.ts","../src/loader/Loader.ts","../src/sprites/SoundSprite.ts","../src/Sound.ts","../src/SoundLibrary.ts","../src/utils/playOnce.ts","../src/utils/render.ts","../src/utils/sineTone.ts","../src/index.ts"],"sourcesContent":["import promiseFinally from './finally';\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\n\nfunction noop() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n return function() {\n fn.apply(thisArg, arguments);\n };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise(fn) {\n if (!(this instanceof Promise))\n throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n /** @type {!number} */\n this._state = 0;\n /** @type {!boolean} */\n this._handled = false;\n /** @type {Promise|undefined} */\n this._value = undefined;\n /** @type {!Array} */\n this._deferreds = [];\n\n doResolve(fn, this);\n}\n\nfunction handle(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise._immediateFn(function() {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject(deferred.promise, e);\n return;\n }\n resolve(deferred.promise, ret);\n });\n}\n\nfunction resolve(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self)\n throw new TypeError('A promise cannot be resolved with itself.');\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = newValue.then;\n if (newValue instanceof Promise) {\n self._state = 3;\n self._value = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(bind(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale(self);\n } catch (e) {\n reject(self, e);\n }\n}\n\nfunction reject(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale(self);\n}\n\nfunction finale(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise._immediateFn(function() {\n if (!self._handled) {\n Promise._unhandledRejectionFn(self._value);\n }\n });\n }\n\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n var done = false;\n try {\n fn(\n function(value) {\n if (done) return;\n done = true;\n resolve(self, value);\n },\n function(reason) {\n if (done) return;\n done = true;\n reject(self, reason);\n }\n );\n } catch (ex) {\n if (done) return;\n done = true;\n reject(self, ex);\n }\n}\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n // @ts-ignore\n var prom = new this.constructor(noop);\n\n handle(this, new Handler(onFulfilled, onRejected, prom));\n return prom;\n};\n\nPromise.prototype['finally'] = promiseFinally;\n\nPromise.all = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!arr || typeof arr.length === 'undefined')\n throw new TypeError('Promise.all accepts an array');\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n\n function res(i, val) {\n try {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(\n val,\n function(val) {\n res(i, val);\n },\n reject\n );\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.resolve = function(value) {\n if (value && typeof value === 'object' && value.constructor === Promise) {\n return value;\n }\n\n return new Promise(function(resolve) {\n resolve(value);\n });\n};\n\nPromise.reject = function(value) {\n return new Promise(function(resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function(values) {\n return new Promise(function(resolve, reject) {\n for (var i = 0, len = values.length; i < len; i++) {\n values[i].then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise._immediateFn =\n (typeof setImmediate === 'function' &&\n function(fn) {\n setImmediate(fn);\n }) ||\n function(fn) {\n setTimeoutFunc(fn, 0);\n };\n\nPromise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\n\nexport default Promise;\n","/**\n * @this {Promise}\n */\nfunction finallyConstructor(callback) {\n var constructor = this.constructor;\n return this.then(\n function(value) {\n return constructor.resolve(callback()).then(function() {\n return value;\n });\n },\n function(reason) {\n return constructor.resolve(callback()).then(function() {\n return constructor.reject(reason);\n });\n }\n );\n}\n\nexport default finallyConstructor;\n","import { Filter } from \"./filters/Filter\";\n\n/**\n * Abstract class which SoundNodes and SoundContext\n * both extend. This provides the functionality for adding\n * dynamic filters.\n * @class Filterable\n * @memberof PIXI.sound\n * @param {AudioNode} source The source audio node\n * @param {AudioNode} destination The output audio node\n * @private\n */\nexport class Filterable\n{\n /**\n * Get the gain node\n * @name PIXI.sound.Filterable#_input\n * @type {AudioNode}\n * @private\n */\n private _input: AudioNode;\n\n /**\n * The destination output audio node\n * @name PIXI.sound.Filterable#_output\n * @type {AudioNode}\n * @private\n */\n private _output: AudioNode;\n\n /**\n * Collection of filters.\n * @name PIXI.sound.Filterable#_filters\n * @type {PIXI.sound.filters.Filter[]}\n * @private\n */\n private _filters: Filter[];\n\n constructor(input: AudioNode, output: AudioNode)\n {\n this._output = output;\n this._input = input;\n }\n\n /**\n * The destination output audio node\n * @name PIXI.sound.Filterable#destination\n * @type {AudioNode}\n * @readonly\n */\n get destination(): AudioNode\n {\n return this._input;\n }\n\n /**\n * The collection of filters\n * @name PIXI.sound.Filterable#filters\n * @type {PIXI.sound.filters.Filter[]}\n */\n get filters(): Filter[]\n {\n return this._filters;\n }\n set filters(filters: Filter[])\n {\n if (this._filters)\n {\n this._filters.forEach((filter: Filter) => {\n if (filter)\n {\n filter.disconnect();\n }\n });\n this._filters = null;\n // Reconnect direct path\n this._input.connect(this._output);\n }\n\n if (filters && filters.length)\n {\n this._filters = filters.slice(0);\n\n // Disconnect direct path before inserting filters\n this._input.disconnect();\n\n // Connect each filter\n let prevFilter: Filter = null;\n filters.forEach((filter: Filter) => {\n if (prevFilter === null)\n {\n // first filter is the destination\n // for the analyser\n this._input.connect(filter.destination);\n }\n else\n {\n prevFilter.connect(filter.destination);\n }\n prevFilter = filter;\n });\n prevFilter.connect(this._output);\n }\n }\n\n /**\n * Cleans up.\n * @method PIXI.sound.Filterable#destroy\n */\n public destroy(): void\n {\n this.filters = null;\n this._input = null;\n this._output = null;\n }\n}\n","/**\n * Represents a single sound element. Can be used to play, pause, etc. sound instances.\n *\n * @class Filter\n * @memberof PIXI.sound.filters\n * @param {AudioNode} destination The audio node to use as the destination for the input AudioNode\n * @param {AudioNode} [source] Optional output node, defaults to destination node. This is useful\n * when creating filters which contains multiple AudioNode elements chained together.\n */\nexport class Filter\n{\n /**\n * The node to connect for the filter to the previous filter.\n * @name PIXI.sound.filters.Filter#destination\n * @type {AudioNode}\n */\n public destination: AudioNode;\n\n /**\n * The node to connect for the filter to the previous filter.\n * @name PIXI.sound.filters.Filter#source\n * @type {AudioNode}\n */\n public source: AudioNode;\n\n constructor(destination: AudioNode, source?: AudioNode)\n {\n this.init(destination, source);\n }\n\n /**\n * Reinitialize\n * @method PIXI.sound.filters.Filter#init\n * @private\n */\n protected init(destination: AudioNode, source?: AudioNode)\n {\n this.destination = destination;\n this.source = source || destination;\n }\n\n /**\n * Connect to the destination.\n * @method PIXI.sound.filters.Filter#connect\n * @param {AudioNode} destination The destination node to connect the output to\n */\n public connect(destination: AudioNode): void\n {\n this.source.connect(destination);\n }\n\n /**\n * Completely disconnect filter from destination and source nodes.\n * @method PIXI.sound.filters.Filter#disconnect\n */\n public disconnect(): void\n {\n this.source.disconnect();\n }\n\n /**\n * Destroy the filter and don't use after this.\n * @method PIXI.sound.filters.Filter#destroy\n */\n public destroy(): void\n {\n this.disconnect();\n this.destination = null;\n this.source = null;\n }\n}\n","import { SoundLibrary } from \"./SoundLibrary\";\n\n/**\n * Singletone instance of the SoundLibrary\n * @private\n */\nexport let instance: SoundLibrary;\n\n/**\n * Internal set function for the singleton instance.\n * @private\n * @param {PIXI.sound} sound - Sound library instance\n * @return {PIXI.sound}\n */\nexport function setInstance(sound: SoundLibrary) {\n instance = sound;\n return sound;\n}\n\n/**\n * Internal get function for the singleton instance.\n * @private\n * @return {PIXI.sound}\n */\nexport function getInstance(): SoundLibrary {\n return instance;\n}\n","import { getInstance } from \"../instance\";\nimport { WebAudioContext } from \"./WebAudioContext\";\n\n/**\n * Internal class for Web Audio abstractions and convenience methods.\n * @private\n * @class WebAudioUtils\n * @memberof PIXI.sound.webaudio\n */\nexport class WebAudioUtils\n{\n /**\n * Dezippering is removed in the future Web Audio API, instead\n * we use the `setValueAtTime` method, however, this is not available\n * in all environments (e.g., Android webview), so we fallback to the `value` setter.\n * @method PIXI.sound.webaudio.WebAudioUtils.setParamValue\n * @private\n * @param {AudioParam} param - AudioNode parameter object\n * @param {number} value - Value to set\n * @return {number} The value set\n */\n public static setParamValue(param: AudioParam, value: number): number\n {\n if (param.setValueAtTime)\n {\n const context = getInstance().context as WebAudioContext;\n param.setValueAtTime(value, context.audioContext.currentTime);\n }\n else\n {\n param.value = value;\n }\n return value;\n }\n}\n","import { IMediaInstance } from \"../interfaces\";\nimport { PlayOptions } from \"../Sound\";\nimport { WebAudioMedia } from \"./WebAudioMedia\";\nimport { WebAudioUtils } from \"./WebAudioUtils\";\n\nlet id = 0;\n\n/**\n * A single play instance that handles the AudioBufferSourceNode.\n * @private\n * @class WebAudioInstance\n * @memberof PIXI.sound.webaudio\n * @param {SoundNodes} source Reference to the SoundNodes.\n */\nexport class WebAudioInstance extends PIXI.utils.EventEmitter implements IMediaInstance\n{\n /**\n * The current unique ID for this instance.\n * @name PIXI.sound.webaudio.WebAudioInstance#id\n * @readonly\n */\n public id: number;\n\n /**\n * The source Sound.\n * @type {PIXI.sound.webaudio.WebAudioMedia}\n * @name PIXI.sound.webaudio.WebAudioInstance#_media\n * @private\n */\n private _media: WebAudioMedia;\n\n /**\n * true if paused.\n * @type {boolean}\n * @name PIXI.sound.webaudio.WebAudioInstance#_paused\n * @private\n */\n private _paused: boolean;\n\n /**\n * true if muted.\n * @type {boolean}\n * @name PIXI.sound.webaudio.WebAudioInstance#_muted\n * @private\n */\n private _muted: boolean;\n\n /**\n * true if paused.\n * @type {boolean}\n * @name PIXI.sound.webaudio.WebAudioInstance#_pausedReal\n * @private\n */\n private _pausedReal: boolean;\n\n /**\n * The instance volume\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioInstance#_volume\n * @private\n */\n private _volume: number;\n\n /**\n * Last update frame number.\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioInstance#_lastUpdate\n * @private\n */\n private _lastUpdate: number;\n\n /**\n * The total number of seconds elapsed in playback.\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioInstance#_elapsed\n * @private\n */\n private _elapsed: number;\n\n /**\n * Playback rate, where 1 is 100%.\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioInstance#_speed\n * @private\n */\n private _speed: number;\n\n /**\n * Playback rate, where 1 is 100%.\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioInstance#_end\n * @private\n */\n private _end: number;\n\n /**\n * `true` if should be looping.\n * @type {boolean}\n * @name PIXI.sound.webaudio.WebAudioInstance#_loop\n * @private\n */\n private _loop: boolean;\n\n /**\n * Gain node for controlling volume of instance\n * @type {GainNode}\n * @name PIXI.sound.webaudio.WebAudioInstance#_gain\n * @private\n */\n private _gain: GainNode;\n\n /**\n * Length of the sound in seconds.\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioInstance#_duration\n * @private\n */\n private _duration: number;\n\n /**\n * The progress of the sound from 0 to 1.\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioInstance#_progress\n * @private\n */\n private _progress: number;\n\n /**\n * Callback for update listener\n * @type {EventListener}\n * @name PIXI.sound.webaudio.WebAudioInstance#_updateListener\n * @private\n */\n private _updateListener: EventListener;\n\n /**\n * Audio buffer source clone from Sound object.\n * @type {AudioBufferSourceNode}\n * @name PIXI.sound.webaudio.WebAudioInstance#_source\n * @private\n */\n private _source: AudioBufferSourceNode;\n\n constructor(media: WebAudioMedia)\n {\n super();\n\n this.id = id++;\n this._media = null;\n this._paused = false;\n this._muted = false;\n this._elapsed = 0;\n this._updateListener = this._update.bind(this) as EventListener;\n\n // Initialize\n this.init(media);\n }\n\n /**\n * Stops the instance, don't use after this.\n * @method PIXI.sound.webaudio.WebAudioInstance#stop\n */\n public stop(): void\n {\n if (this._source)\n {\n this._internalStop();\n\n /**\n * The sound is stopped. Don't use after this is called.\n * @event PIXI.sound.webaudio.WebAudioInstance#stop\n */\n this.emit(\"stop\");\n }\n }\n\n /**\n * Set the instance speed from 0 to 1\n * @member {number} PIXI.sound.htmlaudio.HTMLAudioInstance#speed\n */\n public get speed(): number\n {\n return this._speed;\n }\n public set speed(speed: number)\n {\n this._speed = speed;\n this.refresh();\n this._update(true); // update progress\n }\n\n /**\n * Get the set the volume for this instance from 0 to 1\n * @member {number} PIXI.sound.htmlaudio.HTMLAudioInstance#volume\n */\n public get volume(): number\n {\n return this._volume;\n }\n public set volume(volume: number)\n {\n this._volume = volume;\n this.refresh();\n }\n\n /**\n * `true` if the sound is muted\n * @member {boolean} PIXI.sound.htmlaudio.HTMLAudioInstance#muted\n */\n public get muted(): boolean\n {\n return this._muted;\n }\n public set muted(muted: boolean)\n {\n this._muted = muted;\n this.refresh();\n }\n\n /**\n * If the sound instance should loop playback\n * @member {boolean} PIXI.sound.htmlaudio.HTMLAudioInstance#loop\n */\n public get loop(): boolean\n {\n return this._loop;\n }\n public set loop(loop: boolean)\n {\n this._loop = loop;\n this.refresh();\n }\n\n /**\n * Refresh loop, volume and speed based on changes to parent\n * @method PIXI.sound.webaudio.WebAudioInstance#refresh\n */\n public refresh(): void\n {\n // Sound could be paused\n if (!this._source) {\n return;\n }\n const global = this._media.context;\n const sound = this._media.parent;\n\n // Updating looping\n this._source.loop = this._loop || sound.loop;\n\n // Update the volume\n const globalVolume = global.volume * (global.muted ? 0 : 1);\n const soundVolume = sound.volume * (sound.muted ? 0 : 1);\n const instanceVolume = this._volume * (this._muted ? 0 : 1);\n WebAudioUtils.setParamValue(this._gain.gain, instanceVolume * soundVolume * globalVolume);\n\n // Update the speed\n WebAudioUtils.setParamValue(this._source.playbackRate, this._speed * sound.speed * global.speed);\n }\n\n /**\n * Handle changes in paused state, either globally or sound or instance\n * @method PIXI.sound.webaudio.WebAudioInstance#refreshPaused\n */\n public refreshPaused(): void\n {\n const global = this._media.context;\n const sound = this._media.parent;\n\n // Consider global and sound paused\n const pausedReal = this._paused || sound.paused || global.paused;\n\n if (pausedReal !== this._pausedReal)\n {\n this._pausedReal = pausedReal;\n\n if (pausedReal)\n {\n // pause the sounds\n this._internalStop();\n\n /**\n * The sound is paused.\n * @event PIXI.sound.webaudio.WebAudioInstance#paused\n */\n this.emit(\"paused\");\n }\n else\n {\n /**\n * The sound is unpaused.\n * @event PIXI.sound.webaudio.WebAudioInstance#resumed\n */\n this.emit(\"resumed\");\n\n // resume the playing with offset\n this.play({\n start: this._elapsed % this._duration,\n end: this._end,\n speed: this._speed,\n loop: this._loop,\n volume: this._volume,\n });\n }\n\n /**\n * The sound is paused or unpaused.\n * @event PIXI.sound.webaudio.WebAudioInstance#pause\n * @property {boolean} paused If the instance was paused or not.\n */\n this.emit(\"pause\", pausedReal);\n }\n }\n\n /**\n * Plays the sound.\n * @method PIXI.sound.webaudio.WebAudioInstance#play\n * @param {Object} options Play options\n * @param {number} options.start The position to start playing, in seconds.\n * @param {number} options.end The ending position in seconds.\n * @param {number} options.speed Speed for the instance\n * @param {boolean} options.loop If the instance is looping, defaults to sound loop\n * @param {number} options.volume Volume of the instance\n * @param {boolean} options.muted Muted state of instance\n */\n public play(options: PlayOptions): void\n {\n const {start, end, speed, loop, volume, muted} = options;\n\n if (end)\n {\n console.assert(end > start, \"End time is before start time\");\n }\n this._paused = false;\n const {source, gain} = this._media.nodes.cloneBufferSource();\n\n this._source = source;\n this._gain = gain;\n this._speed = speed;\n this._volume = volume;\n this._loop = !!loop;\n this._muted = muted;\n this.refresh();\n\n const duration: number = this._source.buffer.duration;\n this._duration = duration;\n this._end = end;\n this._lastUpdate = this._now();\n this._elapsed = start;\n this._source.onended = this._onComplete.bind(this);\n\n if (this._loop)\n {\n this._source.loopEnd = end;\n this._source.loopStart = start;\n this._source.start(0, start);\n }\n else if (end)\n {\n this._source.start(0, start, end - start);\n }\n else\n {\n this._source.start(0, start);\n }\n\n /**\n * The sound is started.\n * @event PIXI.sound.webaudio.WebAudioInstance#start\n */\n this.emit(\"start\");\n\n // Do an update for the initial progress\n this._update(true);\n\n // Start handling internal ticks\n this._enabled = true;\n }\n\n /**\n * Utility to convert time in millseconds or seconds\n * @method PIXI.sound.webaudio.WebAudioInstance#_toSec\n * @private\n * @param {number} [time] Time in either ms or sec\n * @return {number} Time in seconds\n */\n private _toSec(time?: number): number\n {\n if (time > 10)\n {\n time /= 1000;\n }\n return time || 0;\n }\n\n /**\n * Start the update progress.\n * @name PIXI.sound.webaudio.WebAudioInstance#_enabled\n * @type {boolean}\n * @private\n */\n private set _enabled(enabled: boolean)\n {\n const script = this._media.nodes.script;\n\n script.removeEventListener(\"audioprocess\", this._updateListener);\n\n if (enabled)\n {\n script.addEventListener(\"audioprocess\", this._updateListener);\n }\n }\n\n /**\n * The current playback progress from 0 to 1.\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioInstance#progress\n */\n public get progress(): number\n {\n return this._progress;\n }\n\n /**\n * Pauses the sound.\n * @type {boolean}\n * @name PIXI.sound.webaudio.WebAudioInstance#paused\n */\n public get paused(): boolean\n {\n return this._paused;\n }\n\n public set paused(paused: boolean)\n {\n this._paused = paused;\n this.refreshPaused();\n }\n\n /**\n * Don't use after this.\n * @method PIXI.sound.webaudio.WebAudioInstance#destroy\n */\n public destroy(): void\n {\n this.removeAllListeners();\n this._internalStop();\n if (this._source)\n {\n this._source.disconnect();\n this._source = null;\n }\n if (this._gain)\n {\n this._gain.disconnect();\n this._gain = null;\n }\n if (this._media)\n {\n this._media.context.events.off(\"refresh\", this.refresh, this);\n this._media.context.events.off(\"refreshPaused\", this.refreshPaused, this);\n this._media = null;\n }\n this._end = null;\n this._speed = 1;\n this._volume = 1;\n this._loop = false;\n this._elapsed = 0;\n this._duration = 0;\n this._paused = false;\n this._muted = false;\n this._pausedReal = false;\n }\n\n /**\n * To string method for instance.\n * @method PIXI.sound.webaudio.WebAudioInstance#toString\n * @return {string} The string representation of instance.\n * @private\n */\n public toString(): string\n {\n return \"[WebAudioInstance id=\" + this.id + \"]\";\n }\n\n /**\n * Get the current time in seconds.\n * @method PIXI.sound.webaudio.WebAudioInstance#_now\n * @private\n * @return {number} Seconds since start of context\n */\n private _now(): number\n {\n return this._media.context.audioContext.currentTime;\n }\n\n /**\n * Internal update the progress.\n * @method PIXI.sound.webaudio.WebAudioInstance#_update\n * @private\n */\n private _update(force: boolean = false): void\n {\n if (this._source)\n {\n const now: number = this._now();\n const delta: number = now - this._lastUpdate;\n\n if (delta > 0 || force)\n {\n const speed: number = this._source.playbackRate.value;\n this._elapsed += delta * speed;\n this._lastUpdate = now;\n const duration: number = this._duration;\n let progress: number;\n if (this._source.loopStart)\n {\n const soundLength = this._source.loopEnd - this._source.loopStart;\n progress = (this._source.loopStart + this._elapsed % soundLength) / duration;\n }\n else\n {\n progress = (this._elapsed % duration) / duration;\n }\n\n // Update the progress\n this._progress = progress;\n\n /**\n * The sound progress is updated.\n * @event PIXI.sound.webaudio.WebAudioInstance#progress\n * @property {number} progress Amount progressed from 0 to 1\n * @property {number} duration The total playback in seconds\n */\n this.emit(\"progress\", this._progress, duration);\n }\n }\n }\n\n /**\n * Initializes the instance.\n * @method PIXI.sound.webaudio.WebAudioInstance#init\n */\n public init(media: WebAudioMedia): void\n {\n this._media = media;\n media.context.events.on(\"refresh\", this.refresh, this);\n media.context.events.on(\"refreshPaused\", this.refreshPaused, this);\n }\n\n /**\n * Stops the instance.\n * @method PIXI.sound.webaudio.WebAudioInstance#_internalStop\n * @private\n */\n private _internalStop(): void\n {\n if (this._source)\n {\n this._enabled = false;\n this._source.onended = null;\n this._source.stop(0); // param needed for iOS 8 bug\n this._source = null;\n }\n }\n\n /**\n * Callback when completed.\n * @method PIXI.sound.webaudio.WebAudioInstance#_onComplete\n * @private\n */\n private _onComplete(): void\n {\n if (this._source)\n {\n this._enabled = false;\n this._source.onended = null;\n }\n this._source = null;\n this._progress = 1;\n this.emit(\"progress\", 1, this._duration);\n /**\n * The sound ends, don't use after this\n * @event PIXI.sound.webaudio.WebAudioInstance#end\n */\n this.emit(\"end\", this);\n }\n}\n","import { Filterable } from \"../Filterable\";\nimport { Filter } from \"../filters/Filter\";\nimport { WebAudioContext } from \"./WebAudioContext\";\nimport { WebAudioUtils } from \"./WebAudioUtils\";\n\n/**\n * Output for cloneing node\n * @interface PIXI.sound.SoundNodes~SourceClone\n * @property {AudioBufferSourceNode} source Cloned audio buffer source\n * @property {GainNode} gain Independent volume control\n */\nexport interface SourceClone {\n source: AudioBufferSourceNode;\n gain: GainNode;\n}\n\n/**\n * @private\n * @class WebAudioNodes\n * @extends PIXI.sound.Filterable\n * @private\n * @memberof PIXI.sound.webaudio\n * @param {PIXI.sound.webaudio.WebAudioContext} audioContext The audio context.\n */\nexport class WebAudioNodes extends Filterable\n{\n /**\n * The buffer size for script processor\n * @name PIXI.sound.SoundNodes.BUFFER_SIZE\n * @type {number}\n * @default 256\n */\n public static BUFFER_SIZE: number = 256;\n\n /**\n * Get the buffer source node\n * @name PIXI.sound.SoundNodes#bufferSource\n * @type {AudioBufferSourceNode}\n * @readonly\n */\n public bufferSource: AudioBufferSourceNode;\n\n /**\n * Get the script processor node.\n * @name PIXI.sound.SoundNodes#script\n * @type {ScriptProcessorNode}\n * @readonly\n */\n public script: ScriptProcessorNode;\n\n /**\n * Get the gain node\n * @name PIXI.sound.SoundNodes#gain\n * @type {GainNode}\n * @readonly\n */\n public gain: GainNode;\n\n /**\n * Get the analyser node\n * @name PIXI.sound.SoundNodes#analyser\n * @type {AnalyserNode}\n * @readonly\n */\n public analyser: AnalyserNode;\n\n /**\n * Reference to the SoundContext\n * @name PIXI.sound.SoundNodes#context\n * @type {PIXI.sound.webaudio.WebAudioContext}\n * @readonly\n */\n public context: WebAudioContext;\n\n constructor(context: WebAudioContext)\n {\n const audioContext: AudioContext = context.audioContext;\n\n const bufferSource: AudioBufferSourceNode = audioContext.createBufferSource();\n const script: ScriptProcessorNode = audioContext.createScriptProcessor(WebAudioNodes.BUFFER_SIZE);\n const gain: GainNode = audioContext.createGain();\n const analyser: AnalyserNode = audioContext.createAnalyser();\n\n bufferSource.connect(analyser);\n analyser.connect(gain);\n gain.connect(context.destination);\n script.connect(context.destination);\n\n super(analyser, gain);\n\n this.context = context;\n this.bufferSource = bufferSource;\n this.script = script;\n this.gain = gain;\n this.analyser = analyser;\n }\n\n /**\n * Cleans up.\n * @method PIXI.sound.SoundNodes#destroy\n */\n public destroy(): void\n {\n super.destroy();\n\n this.bufferSource.disconnect();\n this.script.disconnect();\n this.gain.disconnect();\n this.analyser.disconnect();\n\n this.bufferSource = null;\n this.script = null;\n this.gain = null;\n this.analyser = null;\n\n this.context = null;\n }\n\n /**\n * Clones the bufferSource. Used just before playing a sound.\n * @method PIXI.sound.SoundNodes#cloneBufferSource\n * @returns {PIXI.sound.SoundNodes~SourceClone} The clone AudioBufferSourceNode.\n */\n public cloneBufferSource(): SourceClone\n {\n const orig: AudioBufferSourceNode = this.bufferSource;\n const source: AudioBufferSourceNode = this.context.audioContext.createBufferSource();\n source.buffer = orig.buffer;\n WebAudioUtils.setParamValue(source.playbackRate, orig.playbackRate.value);\n source.loop = orig.loop;\n\n const gain: GainNode = this.context.audioContext.createGain();\n source.connect(gain);\n gain.connect(this.destination);\n return { source, gain };\n }\n}\n","import * as path from \"path\";\nimport { Filter } from \"../filters\";\nimport { IMedia } from \"../interfaces\";\nimport { CompleteCallback, LoadedCallback, Options, PlayOptions, Sound } from \"../Sound\";\nimport { SoundSprite, SoundSpriteData, SoundSprites } from \"../sprites\";\nimport { WebAudioContext } from \"./WebAudioContext\";\nimport { WebAudioInstance } from \"./WebAudioInstance\";\nimport { WebAudioNodes } from \"./WebAudioNodes\";\n\n/**\n * Represents a single sound element. Can be used to play, pause, etc. sound instances.\n * @private\n * @class WebAudioMedia\n * @memberof PIXI.sound.webaudio\n * @param {PIXI.sound.Sound} parent - Instance of parent Sound container\n */\nexport class WebAudioMedia implements IMedia\n{\n /**\n * Reference to the parent Sound container.\n * @name PIXI.sound.webaudio.WebAudioMedia#parent\n * @type {PIXI.sound.Sound}\n * @readonly\n */\n public parent: Sound;\n\n /**\n * The file buffer to load.\n * @name PIXI.sound.webaudio.WebAudioMedia#source\n * @type {ArrayBuffer}\n * @readonly\n */\n public source: ArrayBuffer;\n\n /**\n * Instance of the chain builder.\n * @name PIXI.sound.webaudio.WebAudioMedia#_nodes\n * @type {PIXI.sound.webaudio.WebAudioNodes}\n * @private\n */\n private _nodes: WebAudioNodes;\n\n /**\n * Instance of the source node.\n * @name PIXI.sound.webaudio.WebAudioMedia#_source\n * @type {AudioBufferSourceNode}\n * @private\n */\n private _source: AudioBufferSourceNode;\n\n public init(parent: Sound): void\n {\n this.parent = parent;\n this._nodes = new WebAudioNodes(this.context);\n this._source = this._nodes.bufferSource;\n this.source = parent.options.source as ArrayBuffer;\n }\n\n /**\n * Destructor, safer to use `SoundLibrary.remove(alias)` to remove this sound.\n * @private\n * @method PIXI.sound.webaudio.WebAudioMedia#destroy\n */\n public destroy(): void\n {\n this.parent = null;\n this._nodes.destroy();\n this._nodes = null;\n this._source = null;\n this.source = null;\n }\n\n // Implement create\n public create(): WebAudioInstance\n {\n return new WebAudioInstance(this);\n }\n\n // Implement context\n public get context(): WebAudioContext\n {\n return this.parent.context as WebAudioContext;\n }\n\n // Implement isPlayable\n public get isPlayable(): boolean\n {\n return !!this._source && !!this._source.buffer;\n }\n\n // Implement filters\n public get filters(): Filter[]\n {\n return this._nodes.filters;\n }\n public set filters(filters: Filter[])\n {\n this._nodes.filters = filters;\n }\n\n // Implements duration\n public get duration(): number\n {\n console.assert(this.isPlayable, \"Sound not yet playable, no duration\");\n return this._source.buffer.duration;\n }\n\n /**\n * Gets and sets the buffer.\n * @name PIXI.sound.webaudio.WebAudioMedia#buffer\n * @type {AudioBuffer}\n */\n public get buffer(): AudioBuffer\n {\n return this._source.buffer;\n }\n public set buffer(buffer: AudioBuffer)\n {\n this._source.buffer = buffer;\n }\n\n /**\n * Get the current chained nodes object\n * @private\n * @name PIXI.sound.webaudio.WebAudioMedia#nodes\n * @type {PIXI.sound.webaudio.WebAudioNodes}\n */\n public get nodes(): WebAudioNodes\n {\n return this._nodes;\n }\n\n // Implements load\n public load(callback?: LoadedCallback): void\n {\n // Load from the arraybuffer, incase it was loaded outside\n if (this.source)\n {\n this._decode(this.source, callback);\n }\n // Load from the file path\n else if (this.parent.url)\n {\n this._loadUrl(callback);\n }\n else if (callback)\n {\n callback(new Error(\"sound.url or sound.source must be set\"));\n }\n else\n {\n console.error(\"sound.url or sound.source must be set\");\n }\n }\n\n /**\n * Loads a sound using XHMLHttpRequest object.\n * @method PIXI.sound.webaudio.WebAudioMedia#_loadUrl\n * @private\n */\n private _loadUrl(callback?: LoadedCallback): void\n {\n const request = new XMLHttpRequest();\n const url: string = this.parent.url;\n request.open(\"GET\", url, true);\n request.responseType = \"arraybuffer\";\n\n // Decode asynchronously\n request.onload = () => {\n this.source = request.response as ArrayBuffer;\n this._decode(request.response, callback);\n };\n\n // actually start the request\n request.send();\n }\n\n /**\n * Decodes the array buffer.\n * @method PIXI.sound.webaudio.WebAudioMedia#decode\n * @param {ArrayBuffer} arrayBuffer From load.\n * @private\n */\n private _decode(arrayBuffer: ArrayBuffer, callback?: LoadedCallback): void\n {\n const context = this.parent.context as WebAudioContext;\n context.decode(arrayBuffer, (err: Error, buffer: AudioBuffer) =>\n {\n if (err)\n {\n if (callback)\n {\n callback(err);\n }\n }\n else\n {\n this.parent.isLoaded = true;\n this.buffer = buffer;\n const instance = this.parent.autoPlayStart();\n if (callback)\n {\n callback(null, this.parent, instance);\n }\n }\n });\n }\n}\n","import { Filterable } from \"../Filterable\";\nimport { IMediaContext } from \"../interfaces\";\n\n/**\n * Main class to handle WebAudio API. There's a simple chain\n * of AudioNode elements: analyser > compressor > context.destination.\n * any filters that are added are inserted between the analyser and compressor nodes\n * @private\n * @class WebAudioContext\n * @extends PIXI.sound.Filterable\n * @memberof PIXI.sound.webaudio\n */\nexport class WebAudioContext extends Filterable implements IMediaContext\n{\n /**\n * Context Compressor node\n * @name PIXI.sound.webaudio.WebAudioContext#compressor\n * @type {DynamicsCompressorNode}\n * @readonly\n */\n public compressor: DynamicsCompressorNode;\n\n /**\n * Context Analyser node\n * @name PIXI.sound.webaudio.WebAudioContext#analyser\n * @type {AnalyserNode}\n * @readonly\n */\n public analyser: AnalyserNode;\n\n /**\n * Global speed of all sounds\n * @name PIXI.sound.webaudio.WebAudioContext#speed\n * @type {number}\n * @readonly\n */\n public speed: number;\n\n /**\n * Sets the muted state.\n * @type {boolean}\n * @name PIXI.sound.webaudio.WebAudioContext#muted\n * @default false\n */\n public muted: boolean;\n\n /**\n * Sets the volume from 0 to 1.\n * @type {number}\n * @name PIXI.sound.webaudio.WebAudioContext#volume\n * @default 1\n */\n public volume: number;\n\n /**\n * Handle global events\n * @type {PIXI.utils.EventEmitter}\n * @name PIXI.sound.webaudio.WebAudioContext#events\n * @default 1\n */\n public events: PIXI.utils.EventEmitter;\n\n /**\n * The instance of the AudioContext for WebAudio API.\n * @name PIXI.sound.webaudio.WebAudioContext#_ctx\n * @type {AudioContext}\n * @private\n */\n private _ctx: AudioContext;\n\n /**\n * The instance of the OfflineAudioContext for fast decoding audio.\n * @name PIXI.sound.webaudio.WebAudioContext#_offlineCtx\n * @type {OfflineAudioContext}\n * @private\n */\n private _offlineCtx: OfflineAudioContext;\n\n /**\n * Current paused status\n * @name PIXI.sound.webaudio.WebAudioContext#_paused\n * @type {boolean}\n * @private\n * @default false\n */\n private _paused: boolean;\n\n /**\n * Indicated whether audio on iOS has been unlocked, which requires a touchend/mousedown event that plays an\n * empty sound.\n * @name PIXI.sound.webaudio.WebAudioContext#_unlocked\n * @type {boolean}\n * @private\n */\n private _unlocked: boolean;\n\n constructor()\n {\n const win: any = window as any;\n const ctx = new WebAudioContext.AudioContext();\n const compressor: DynamicsCompressorNode = ctx.createDynamicsCompressor();\n const analyser: AnalyserNode = ctx.createAnalyser();\n\n // setup the end of the node chain\n analyser.connect(compressor);\n compressor.connect(ctx.destination);\n\n super(analyser, compressor);\n\n this._ctx = ctx;\n // ios11 safari's webkitOfflineAudioContext allows only 44100 Hz sample rate\n this._offlineCtx = new WebAudioContext.OfflineAudioContext(1, 2,\n (win.OfflineAudioContext) ? ctx.sampleRate : 44100);\n this._unlocked = false;\n\n this.compressor = compressor;\n this.analyser = analyser;\n this.events = new PIXI.utils.EventEmitter();\n\n // Set the defaults\n this.volume = 1;\n this.speed = 1;\n this.muted = false;\n this.paused = false;\n\n // Listen for document level clicks to unlock WebAudio. See the _unlock method.\n if (ctx.state !== \"running\")\n {\n this._unlock(); // When played inside of a touch event, this will enable audio on iOS immediately.\n this._unlock = this._unlock.bind(this);\n document.addEventListener(\"mousedown\", this._unlock, true);\n document.addEventListener(\"touchstart\", this._unlock, true);\n document.addEventListener(\"touchend\", this._unlock, true);\n }\n }\n\n /**\n * Try to unlock audio on iOS. This is triggered from either WebAudio plugin setup (which will work if inside of\n * a `mousedown` or `touchend` event stack), or the first document touchend/mousedown event. If it fails (touchend\n * will fail if the user presses for too long, indicating a scroll event instead of a click event.\n *\n * Note that earlier versions of iOS supported `touchstart` for this, but iOS9 removed this functionality. Adding\n * a `touchstart` event to support older platforms may preclude a `mousedown` even from getting fired on iOS9, so we\n * stick with `mousedown` and `touchend`.\n * @method PIXI.sound.webaudio.WebAudioContext#_unlock\n * @private\n */\n private _unlock(): void\n {\n if (this._unlocked)\n {\n return;\n }\n this.playEmptySound();\n if (this._ctx.state === \"running\")\n {\n document.removeEventListener(\"mousedown\", this._unlock, true);\n document.removeEventListener(\"touchend\", this._unlock, true);\n document.removeEventListener(\"touchstart\", this._unlock, true);\n this._unlocked = true;\n }\n }\n\n /**\n * Plays an empty sound in the web audio context. This is used to enable web audio on iOS devices, as they\n * require the first sound to be played inside of a user initiated event (touch/click).\n * @method PIXI.sound.webaudio.WebAudioContext#playEmptySound\n */\n public playEmptySound(): void\n {\n const source = this._ctx.createBufferSource();\n source.buffer = this._ctx.createBuffer(1, 1, 22050);\n source.connect(this._ctx.destination);\n source.start(0, 0, 0);\n if (source.context.state === \"suspended\")\n {\n source.context.resume();\n }\n }\n\n /**\n * Get AudioContext class, if not supported returns `null`\n * @name PIXI.sound.webaudio.WebAudioContext.AudioContext\n * @type {Function}\n * @static\n */\n public static get AudioContext(): typeof AudioContext\n {\n const win: any = window as any;\n return (\n win.AudioContext ||\n win.webkitAudioContext ||\n null\n );\n }\n\n /**\n * Get OfflineAudioContext class, if not supported returns `null`\n * @name PIXI.sound.webaudio.WebAudioContext.OfflineAudioContext\n * @type {Function}\n * @static\n */\n public static get OfflineAudioContext(): typeof OfflineAudioContext\n {\n const win: any = window as any;\n return (\n win.OfflineAudioContext ||\n win.webkitOfflineAudioContext ||\n null\n );\n }\n\n /**\n * Destroy this context.\n * @method PIXI.sound.webaudio.WebAudioContext#destroy\n */\n public destroy()\n {\n super.destroy();\n\n const ctx: any = this._ctx as any;\n // check if browser supports AudioContext.close()\n if (typeof ctx.close !== \"undefined\")\n {\n ctx.close();\n }\n this.events.removeAllListeners();\n this.analyser.disconnect();\n this.compressor.disconnect();\n this.analyser = null;\n this.compressor = null;\n this.events = null;\n this._offlineCtx = null;\n this._ctx = null;\n }\n\n /**\n * The WebAudio API AudioContext object.\n * @name PIXI.sound.webaudio.WebAudioContext#audioContext\n * @type {AudioContext}\n * @readonly\n */\n public get audioContext(): AudioContext\n {\n return this._ctx;\n }\n\n /**\n * The WebAudio API OfflineAudioContext object.\n * @name PIXI.sound.webaudio.WebAudioContext#offlineContext\n * @type {OfflineAudioContext}\n * @readonly\n */\n public get offlineContext(): OfflineAudioContext\n {\n return this._offlineCtx;\n }\n\n /**\n * Pauses all sounds, even though we handle this at the instance\n * level, we'll also pause the audioContext so that the\n * time used to compute progress isn't messed up.\n * @type {boolean}\n * @name PIXI.sound.webaudio.WebAudioContext#paused\n * @default false\n */\n public set paused(paused: boolean)\n {\n if (paused && this._ctx.state === \"running\")\n {\n (this._ctx as any).suspend();\n }\n else if (!paused && this._ctx.state === \"suspended\")\n {\n (this._ctx as any).resume();\n }\n this._paused = paused;\n }\n public get paused(): boolean\n {\n return this._paused;\n }\n\n /**\n * Emit event when muted, volume or speed changes\n * @method PIXI.sound.webaudio.WebAudioContext#refresh\n * @private\n */\n public refresh(): void\n {\n this.events.emit(\"refresh\");\n }\n\n /**\n * Emit event when muted, volume or speed changes\n * @method PIXI.sound.webaudio.WebAudioContext#refreshPaused\n * @private\n */\n public refreshPaused(): void\n {\n this.events.emit(\"refreshPaused\");\n }\n\n /**\n * Toggles the muted state.\n * @method PIXI.sound.webaudio.WebAudioContext#toggleMute\n * @return {boolean} The current muted state.\n */\n public toggleMute(): boolean\n {\n this.muted = !this.muted;\n this.refresh();\n return this.muted;\n }\n\n /**\n * Toggles the paused state.\n * @method PIXI.sound.webaudio.WebAudioContext#togglePause\n * @return {boolean} The current muted state.\n */\n public togglePause(): boolean\n {\n this.paused = !this.paused;\n this.refreshPaused();\n return this._paused;\n }\n\n /**\n * Decode the audio data\n * @method PIXI.sound.webaudio.WebAudioContext#decode\n * @param {ArrayBuffer} arrayBuffer Buffer from loader\n * @param {Function} callback When completed, error and audioBuffer are parameters.\n */\n public decode(arrayBuffer: ArrayBuffer, callback: (err?: Error, buffer?: AudioBuffer) => void): void\n {\n this._offlineCtx.decodeAudioData(\n arrayBuffer, (buffer: AudioBuffer) => {\n callback(null, buffer);\n },\n (err) => {\n callback(new Error(err.message || \"Unable to decode file\"));\n },\n );\n }\n}\n","import { getInstance } from \"../instance\";\nimport { WebAudioUtils } from \"../webaudio\";\nimport { Filter } from \"./Filter\";\n\ninterface Band {\n f: number;\n type: string;\n gain: number;\n}\n\n/**\n * Filter for adding equalizer bands.\n *\n * @class EqualizerFilter\n * @memberof PIXI.sound.filters\n * @param {number} [f32=0] Default gain for 32 Hz\n * @param {number} [f64=0] Default gain for 64 Hz\n * @param {number} [f125=0] Default gain for 125 Hz\n * @param {number} [f250=0] Default gain for 250 Hz\n * @param {number} [f500=0] Default gain for 500 Hz\n * @param {number} [f1k=0] Default gain for 1000 Hz\n * @param {number} [f2k=0] Default gain for 2000 Hz\n * @param {number} [f4k=0] Default gain for 4000 Hz\n * @param {number} [f8k=0] Default gain for 8000 Hz\n * @param {number} [f16k=0] Default gain for 16000 Hz\n */\nexport class EqualizerFilter extends Filter\n{\n /**\n * Band at 32 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F32\n * @type {number}\n * @readonly\n */\n public static F32: number = 32;\n\n /**\n * Band at 64 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F64\n * @type {number}\n * @readonly\n */\n public static F64: number = 64;\n\n /**\n * Band at 125 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F125\n * @type {number}\n * @readonly\n */\n public static F125: number = 125;\n\n /**\n * Band at 250 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F250\n * @type {number}\n * @readonly\n */\n public static F250: number = 250;\n\n /**\n * Band at 500 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F500\n * @type {number}\n * @readonly\n */\n public static F500: number = 500;\n\n /**\n * Band at 1000 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F1K\n * @type {number}\n * @readonly\n */\n public static F1K: number = 1000;\n\n /**\n * Band at 2000 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F2K\n * @type {number}\n * @readonly\n */\n public static F2K: number = 2000;\n\n /**\n * Band at 4000 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F4K\n * @type {number}\n * @readonly\n */\n public static F4K: number = 4000;\n\n /**\n * Band at 8000 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F8K\n * @type {number}\n * @readonly\n */\n public static F8K: number = 8000;\n\n /**\n * Band at 16000 Hz\n * @name PIXI.sound.filters.EqualizerFilter.F16K\n * @type {number}\n * @readonly\n */\n public static F16K: number = 16000;\n\n /**\n * The list of bands\n * @name PIXI.sounds.filters.EqualizerFilter#bands\n * @type {BiquadFilterNode[]}\n * @readonly\n */\n public bands: BiquadFilterNode[];\n\n /**\n * The map of bands to frequency\n * @name PIXI.sounds.filters.EqualizerFilter#bandsMap\n * @type {Object}\n * @readonly\n */\n public bandsMap: {[id: number]: BiquadFilterNode};\n\n constructor(f32: number = 0, f64: number = 0, f125: number = 0, f250: number = 0, f500: number = 0,\n f1k: number = 0, f2k: number = 0, f4k: number = 0, f8k: number = 0, f16k: number = 0)\n {\n if (getInstance().useLegacy)\n {\n super(null);\n return;\n }\n\n const equalizerBands: Band[] = [\n {\n f: EqualizerFilter.F32,\n type: \"lowshelf\",\n gain: f32,\n },\n {\n f: EqualizerFilter.F64,\n type: \"peaking\",\n gain: f64,\n },\n {\n f: EqualizerFilter.F125,\n type: \"peaking\",\n gain: f125,\n },\n {\n f: EqualizerFilter.F250,\n type: \"peaking\",\n gain: f250,\n },\n {\n f: EqualizerFilter.F500,\n type: \"peaking\",\n gain: f500,\n },\n {\n f: EqualizerFilter.F1K,\n type: \"peaking\",\n gain: f1k,\n },\n {\n f: EqualizerFilter.F2K,\n type: \"peaking\",\n gain: f2k,\n },\n {\n f: EqualizerFilter.F4K,\n type: \"peaking\",\n gain: f4k,\n },\n {\n f: EqualizerFilter.F8K,\n type: \"peaking\",\n gain: f8k,\n },\n {\n f: EqualizerFilter.F16K,\n type: \"highshelf\",\n gain: f16k,\n },\n ];\n\n const bands: BiquadFilterNode[] = equalizerBands.map((band: Band) =>\n {\n const node: BiquadFilterNode = getInstance().context.audioContext.createBiquadFilter();\n node.type = band.type as BiquadFilterType;\n WebAudioUtils.setParamValue(node.Q, 1);\n node.frequency.value = band.f; // WebAudioUtils.setParamValue(filter.frequency, band.f);\n WebAudioUtils.setParamValue(node.gain, band.gain);\n return node;\n });\n\n // Setup the constructor AudioNode, where first is the input, and last is the output\n super(bands[0], bands[bands.length - 1]);\n\n // Manipulate the bands\n this.bands = bands;\n\n // Create a map\n this.bandsMap = {};\n\n for (let i = 0; i < this.bands.length; i++)\n {\n const node: BiquadFilterNode = this.bands[i];\n\n // Connect the previous band to the current one\n if (i > 0)\n {\n this.bands[i - 1].connect(node);\n }\n this.bandsMap[node.frequency.value] = node;\n }\n }\n\n /**\n * Set gain on a specific frequency.\n * @method PIXI.sound.filters.EqualizerFilter#setGain\n * @param {number} frequency The frequency, see EqualizerFilter.F* for bands\n * @param {number} [gain=0] Recommended -40 to 40.\n */\n public setGain(frequency: number, gain: number = 0): void\n {\n if (!this.bandsMap[frequency])\n {\n throw new Error(\"No band found for frequency \" + frequency);\n }\n WebAudioUtils.setParamValue(this.bandsMap[frequency].gain, gain);\n }\n\n /**\n * Get gain amount on a specific frequency.\n * @method PIXI.sound.filters.EqualizerFilter#getGain\n * @return {number} The amount of gain set.\n */\n public getGain(frequency: number): number\n {\n if (!this.bandsMap[frequency])\n {\n throw new Error(\"No band found for frequency \" + frequency);\n }\n return this.bandsMap[frequency].gain.value;\n }\n\n /**\n * Gain at 32 Hz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f32\n * @type {number}\n * @default 0\n */\n public set f32(value: number)\n {\n this.setGain(EqualizerFilter.F32, value);\n }\n public get f32(): number\n {\n return this.getGain(EqualizerFilter.F32);\n }\n\n /**\n * Gain at 64 Hz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f64\n * @type {number}\n * @default 0\n */\n public set f64(value: number)\n {\n this.setGain(EqualizerFilter.F64, value);\n }\n public get f64(): number\n {\n return this.getGain(EqualizerFilter.F64);\n }\n\n /**\n * Gain at 125 Hz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f125\n * @type {number}\n * @default 0\n */\n public set f125(value: number)\n {\n this.setGain(EqualizerFilter.F125, value);\n }\n public get f125(): number\n {\n return this.getGain(EqualizerFilter.F125);\n }\n\n /**\n * Gain at 250 Hz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f250\n * @type {number}\n * @default 0\n */\n public set f250(value: number)\n {\n this.setGain(EqualizerFilter.F250, value);\n }\n public get f250(): number\n {\n return this.getGain(EqualizerFilter.F250);\n }\n\n /**\n * Gain at 500 Hz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f500\n * @type {number}\n * @default 0\n */\n public set f500(value: number)\n {\n this.setGain(EqualizerFilter.F500, value);\n }\n public get f500(): number\n {\n return this.getGain(EqualizerFilter.F500);\n }\n\n /**\n * Gain at 1 KHz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f1k\n * @type {number}\n * @default 0\n */\n public set f1k(value: number)\n {\n this.setGain(EqualizerFilter.F1K, value);\n }\n public get f1k(): number\n {\n return this.getGain(EqualizerFilter.F1K);\n }\n\n /**\n * Gain at 2 KHz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f2k\n * @type {number}\n * @default 0\n */\n public set f2k(value: number)\n {\n this.setGain(EqualizerFilter.F2K, value);\n }\n public get f2k(): number\n {\n return this.getGain(EqualizerFilter.F2K);\n }\n\n /**\n * Gain at 4 KHz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f4k\n * @type {number}\n * @default 0\n */\n public set f4k(value: number)\n {\n this.setGain(EqualizerFilter.F4K, value);\n }\n public get f4k(): number\n {\n return this.getGain(EqualizerFilter.F4K);\n }\n\n /**\n * Gain at 8 KHz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f8k\n * @type {number}\n * @default 0\n */\n public set f8k(value: number)\n {\n this.setGain(EqualizerFilter.F8K, value);\n }\n public get f8k(): number\n {\n return this.getGain(EqualizerFilter.F8K);\n }\n\n /**\n * Gain at 16 KHz frequencey.\n * @name PIXI.sound.filters.EqualizerFilter#f16k\n * @type {number}\n * @default 0\n */\n public set f16k(value: number)\n {\n this.setGain(EqualizerFilter.F16K, value);\n }\n public get f16k(): number\n {\n return this.getGain(EqualizerFilter.F16K);\n }\n\n /**\n * Reset all frequency bands to have gain of 0\n * @method PIXI.sound.filters.EqualizerFilter#reset\n */\n public reset(): void\n {\n this.bands.forEach((band: BiquadFilterNode) => {\n WebAudioUtils.setParamValue(band.gain, 0);\n });\n }\n\n public destroy(): void\n {\n this.bands.forEach((band: BiquadFilterNode) => {\n band.disconnect();\n });\n this.bands = null;\n this.bandsMap = null;\n }\n}\n","import { getInstance } from \"../instance\";\nimport { Filter } from \"./Filter\";\n\n/**\n * Filter for adding adding delaynode.\n *\n * @class DistortionFilter\n * @memberof PIXI.sound.filters\n * @param {number} [amount=0] The amount of distoration from 0 to 1.\n */\nexport class DistortionFilter extends Filter\n{\n /**\n * The Wave shape node use to distort\n * @name PIXI.sound.filters.DistortionFilter#_distortion\n * @type {WaveShaperNode}\n * @private\n */\n private _distortion: WaveShaperNode;\n\n /**\n * The amount of distoration\n * @name PIXI.sound.filters.DistortionFilter#_amount\n * @type {number}\n * @private\n */\n private _amount: number;\n\n constructor(amount: number = 0)\n {\n if (getInstance().useLegacy)\n {\n super(null);\n return;\n }\n\n const {context} = getInstance();\n const distortion: WaveShaperNode = context.audioContext.createWaveShaper();\n\n super(distortion);\n\n this._distortion = distortion;\n\n this.amount = amount;\n }\n\n /**\n * @name PIXI.sound.filters.Distoration#amount\n * @type {number}\n */\n set amount(value: number)\n {\n value *= 1000;\n this._amount = value;\n const samples: number = 44100;\n const curve: Float32Array = new Float32Array(samples);\n const deg: number = Math.PI / 180;\n\n let i: number = 0;\n let x: number;\n\n for (; i < samples; ++i)\n {\n x = i * 2 / samples - 1;\n curve[i] = (3 + value) * x * 20 * deg / (Math.PI + value * Math.abs(x));\n }\n this._distortion.curve = curve;\n this._distortion.oversample = \"4x\";\n }\n get amount(): number\n {\n return this._amount;\n }\n\n public destroy(): void\n {\n this._distortion = null;\n super.destroy();\n }\n}\n","import { getInstance } from \"../instance\";\nimport { WebAudioUtils } from \"../webaudio\";\nimport { Filter } from \"./Filter\";\n\n/**\n * Filter for adding Stereo panning.\n *\n * @class StereoFilter\n * @memberof PIXI.sound.filters\n * @param {number} [pan=0] The amount of panning, -1 is left, 1 is right, 0 is centered.\n */\nexport class StereoFilter extends Filter\n{\n /**\n * The stereo panning node\n * @name PIXI.sound.filters.StereoFilter#_stereo\n * @type {StereoPannerNode}\n * @private\n */\n private _stereo: StereoPannerNode;\n\n /**\n * The stereo panning node\n * @name PIXI.sound.filters.StereoFilter#_panner\n * @type {PannerNode}\n * @private\n */\n private _panner: PannerNode;\n\n /**\n * The amount of panning, -1 is left, 1 is right, 0 is centered\n * @name PIXI.sound.filters.StereoFilter#_pan\n * @type {number}\n * @private\n */\n private _pan: number;\n\n constructor(pan: number = 0)\n {\n if (getInstance().useLegacy)\n {\n super(null);\n return;\n }\n\n let stereo: StereoPannerNode;\n let panner: PannerNode;\n let destination: AudioNode;\n const {audioContext} = getInstance().context;\n\n if (audioContext.createStereoPanner)\n {\n stereo = audioContext.createStereoPanner();\n destination = stereo;\n }\n else\n {\n panner = audioContext.createPanner();\n panner.panningModel = \"equalpower\";\n destination = panner;\n }\n\n super(destination);\n\n this._stereo = stereo;\n this._panner = panner;\n\n this.pan = pan;\n }\n\n /**\n * Set the amount of panning, where -1 is left, 1 is right, and 0 is centered\n * @name PIXI.sound.filters.StereoFilter#pan\n * @type {number}\n */\n set pan(value: number)\n {\n this._pan = value;\n if (this._stereo)\n {\n WebAudioUtils.setParamValue(this._stereo.pan, value);\n }\n else\n {\n this._panner.setPosition(value, 0, 1 - Math.abs(value));\n }\n }\n get pan(): number\n {\n return this._pan;\n }\n\n public destroy(): void\n {\n super.destroy();\n this._stereo = null;\n this._panner = null;\n }\n}\n","import { getInstance } from \"../instance\";\nimport { Filter } from \"./Filter\";\n\n/**\n * Filter for adding reverb. Refactored from\n * https://github.com/web-audio-components/simple-reverb/\n *\n * @class ReverbFilter\n * @memberof PIXI.sound.filters\n * @param {number} [seconds=3] Seconds for reverb\n * @param {number} [decay=2] The decay length\n * @param {boolean} [reverse=false] Reverse reverb\n */\nexport class ReverbFilter extends Filter\n{\n /**\n * @name PIXI.sound.filters.ReverbFilter#_seconds\n * @type {number}\n * @private\n */\n private _seconds: number;\n\n /**\n * @name PIXI.sound.filters.ReverbFilter#_decay\n * @type {number}\n * @private\n */\n private _decay: number;\n\n /**\n * @name PIXI.sound.filters.ReverbFilter#_reverse\n * @type {number}\n * @private\n */\n private _reverse: boolean;\n\n constructor(seconds: number = 3, decay: number = 2, reverse: boolean = false)\n {\n if (getInstance().useLegacy)\n {\n super(null);\n return;\n }\n\n super(null);\n\n this._seconds = this._clamp(seconds, 1, 50);\n this._decay = this._clamp(decay, 0, 100);\n this._reverse = reverse;\n this._rebuild();\n }\n\n /**\n * Clamp a value\n * @method PIXI.sound.filters.ReverbFilter#_clamp\n * @private\n * @param {number} value\n * @param {number} min Minimum value\n * @param {number} max Maximum value\n * @return {number} Clamped number\n */\n private _clamp(value: number, min: number, max: number): number\n {\n return Math.min(max, Math.max(min, value));\n }\n\n /**\n * Length of reverb in seconds from 1 to 50\n * @name PIXI.sound.filters.ReverbFilter#decay\n * @type {number}\n * @default 3\n */\n get seconds(): number\n {\n return this._seconds;\n }\n set seconds(seconds: number)\n {\n this._seconds = this._clamp(seconds, 1, 50);\n this._rebuild();\n }\n\n /**\n * Decay value from 0 to 100\n * @name PIXI.sound.filters.ReverbFilter#decay\n * @type {number}\n * @default 2\n */\n get decay(): number\n {\n return this._decay;\n }\n set decay(decay: number)\n {\n this._decay = this._clamp(decay, 0, 100);\n this._rebuild();\n }\n\n /**\n * Reverse value from 0 to 1\n * @name PIXI.sound.filters.ReverbFilter#reverse\n * @type {boolean}\n * @default false\n */\n get reverse(): boolean\n {\n return this._reverse;\n }\n set reverse(reverse: boolean)\n {\n this._reverse = reverse;\n this._rebuild();\n }\n\n /**\n * Utility function for building an impulse response\n * from the module parameters.\n * @method PIXI.sound.filters.ReverbFilter#_rebuild\n * @private\n */\n private _rebuild(): void\n {\n const context = getInstance().context.audioContext;\n const rate: number = context.sampleRate;\n const length: number = rate * this._seconds;\n const impulse: AudioBuffer = context.createBuffer(2, length, rate);\n const impulseL: Float32Array = impulse.getChannelData(0);\n const impulseR: Float32Array = impulse.getChannelData(1);\n let n: number;\n\n for (let i: number = 0; i < length; i++)\n {\n n = this._reverse ? length - i : i;\n impulseL[i] = (Math.random() * 2 - 1) * Math.pow(1 - n / length, this._decay);\n impulseR[i] = (Math.random() * 2 - 1) * Math.pow(1 - n / length, this._decay);\n }\n const convolver = getInstance().context.audioContext.createConvolver();\n convolver.buffer = impulse;\n this.init(convolver);\n }\n}\n","import { getInstance } from \"../instance\";\nimport { Filter } from \"./Filter\";\n\n/**\n * Combine all channels into mono channel.\n *\n * @class MonoFilter\n * @memberof PIXI.sound.filters\n */\nexport class MonoFilter extends Filter\n{\n /**\n * Merger node\n * @name PIXI.sound.filters.MonoFilter#_merge\n * @type {ChannelMergerNode}\n * @private\n */\n private _merger: ChannelMergerNode;\n\n constructor()\n {\n if (getInstance().useLegacy)\n {\n super(null);\n return;\n }\n const audioContext: AudioContext = getInstance().context.audioContext;\n const splitter: ChannelSplitterNode = audioContext.createChannelSplitter();\n const merger: ChannelMergerNode = audioContext.createChannelMerger();\n merger.connect(splitter);\n super(merger, splitter);\n this._merger = merger;\n }\n\n public destroy(): void\n {\n this._merger.disconnect();\n this._merger = null;\n super.destroy();\n }\n}\n","import { getInstance } from \"../instance\";\nimport { WebAudioUtils } from \"../webaudio\";\nimport { Filter } from \"./Filter\";\n\n/**\n * Creates a telephone-sound filter.\n *\n * @class TelephoneFilter\n * @memberof PIXI.sound.filters\n */\nexport class TelephoneFilter extends Filter\n{\n constructor()\n {\n if (getInstance().useLegacy)\n {\n super(null);\n return;\n }\n\n const {audioContext} = getInstance().context;\n const lpf1 = audioContext.createBiquadFilter();\n const lpf2 = audioContext.createBiquadFilter();\n const hpf1 = audioContext.createBiquadFilter();\n const hpf2 = audioContext.createBiquadFilter();\n\n lpf1.type = \"lowpass\";\n WebAudioUtils.setParamValue(lpf1.frequency, 2000.0);\n\n lpf2.type = \"lowpass\";\n WebAudioUtils.setParamValue(lpf2.frequency, 2000.0);\n\n hpf1.type = \"highpass\";\n WebAudioUtils.setParamValue(hpf1.frequency, 500.0);\n\n hpf2.type = \"highpass\";\n WebAudioUtils.setParamValue(hpf2.frequency, 500.0);\n\n lpf1.connect(lpf2);\n lpf2.connect(hpf1);\n hpf1.connect(hpf2);\n\n super(lpf1, hpf2);\n }\n}\n","import { IMediaInstance } from \"../interfaces/IMediaInstance\";\nimport { PlayOptions } from \"../Sound\";\nimport { HTMLAudioMedia } from \"./HTMLAudioMedia\";\n\nlet id = 0;\n\n/**\n * Instance which wraps the `