{"version":3,"file":"tokenmagic.js","mappings":"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","sources":["webpack://tokenmagic/webpack/runtime/load script","webpack://tokenmagic/./tokenmagic/fx/Anime.js","webpack://tokenmagic/./tokenmagic/module/proto/PlaceableObjectProto.js","webpack://tokenmagic/./tokenmagic/fx/filters/proto/FilterProto.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterAdjustment.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterAscii.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterAdvancedBloom.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterDot.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterDistortion.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterOldFilm.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterGlow.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterOutline.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterBevel.js","webpack://tokenmagic/./tokenmagic/fx/filters/CustomFilter.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/dropshadow.js","webpack://tokenmagic/./tokenmagic/fx/glsl/vertexshaders/customvertex2D.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterDropShadowEx.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterTwist.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterZoomBlur.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterBlurEx.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterShockWave.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterBulgePinch.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterRemoveShadow.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/removeshadow.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterRays.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/cosmicray.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterFog.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/fog.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterXFog.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/xfog.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/electricity.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterElectric.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterWaves.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/waves.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterFire.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/fire.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterFumes.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/fumes.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterFlood.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/flood.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterSmoke.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/smoke.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterForceField.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/forcefield.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterMirrorImages.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/mirrorimages.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterXRays.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/xray.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterLiquid.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/liquid.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterGleamingGlow.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/magicglow.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterPixelate.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterSpiderWeb.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/spiderweb.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/ripples.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterSolarRipples.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterGlobes.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/globes.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterTransform.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/matrix.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterSplash.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/splash.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/polymorph.js","webpack://tokenmagic/./tokenmagic/fx/glsl/vertexshaders/customvertex2DSampler.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterPolymorph.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterXFire.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/xfire.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterSprite.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/sprite.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterSpriteMask.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/spritemask.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterReplaceColor.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterDDTint.js","webpack://tokenmagic/./tokenmagic/fx/glsl/fragmentshaders/ddtint.js","webpack://tokenmagic/./tokenmagic/migration/migration.js","webpack://tokenmagic/./tokenmagic/module/proto/CanvasDocumentProto.js","webpack://tokenmagic/./tokenmagic/module/utilities.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterCRT.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterRGBSplit.js","webpack://tokenmagic/./tokenmagic/gui/apps/autoTemplate/TemplateSettings.js","webpack://tokenmagic/./tokenmagic/gui/apps/autoTemplate/dnd5e.js","webpack://tokenmagic/./tokenmagic/gui/apps/autoTemplate/pf2e.js","webpack://tokenmagic/./tokenmagic/gui/apps/autoTemplate/TheWitcherTRPG.js","webpack://tokenmagic/./tokenmagic/module/settings.js","webpack://tokenmagic/./tokenmagic/module/tokenmagic.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterDropShadow.js","webpack://tokenmagic/./tokenmagic/fx/filters/FilterBlur.js","webpack://tokenmagic/./tokenmagic/fx/presets/defaultpresets.js","webpack://tokenmagic/./tokenmagic/module/constants.js","webpack://tokenmagic/webpack/bootstrap","webpack://tokenmagic/webpack/runtime/define property getters","webpack://tokenmagic/webpack/runtime/ensure chunk","webpack://tokenmagic/webpack/runtime/get javascript chunk filename","webpack://tokenmagic/webpack/runtime/hasOwnProperty shorthand","webpack://tokenmagic/webpack/runtime/publicPath","webpack://tokenmagic/webpack/runtime/jsonp chunk loading","webpack://tokenmagic/webpack/startup"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"tokenmagic:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import { isAnimationDisabled } from '../module/tokenmagic.js';\r\n\r\nexport class Anime {\r\n\tconstructor(puppet) {\r\n\t\tconst self = this;\r\n\t\tthis.puppet = puppet;\r\n\t\tthis.animated = null;\r\n\t\tthis.animeId = foundry.utils.randomID();\r\n\r\n\t\t// Time/synchronization related variables\r\n\t\tthis.frameTime = {};\r\n\t\tthis.elapsedTime = {};\r\n\t\tthis.loopElapsedTime = {};\r\n\t\tthis.loops = {};\r\n\t\tthis.internalLoops = {};\r\n\t\tthis.ping = {};\r\n\t\tthis.pauseBetweenElapsedTime = {};\r\n\t\tthis.pauseBetween = {};\r\n\t\tthis.shutdown = {};\r\n\r\n\t\tif (!(this.puppet == null)) {\r\n\t\t\tif (\r\n\t\t\t\tthis.puppet.hasOwnProperty('animated') &&\r\n\t\t\t\t!(this.puppet.animated == null) &&\r\n\t\t\t\ttypeof this.puppet.animated === 'object' &&\r\n\t\t\t\tObject.keys(this.puppet.animated).length > 0\r\n\t\t\t) {\r\n\t\t\t\tthis.initAnimatedInternals(this.puppet.animated);\r\n\t\t\t\tthis.animated = this.puppet.animated; // easy access to the puppet's animodes\r\n\t\t\t}\r\n\t\t\tAnime.addAnimation(self); // ready to tick\r\n\t\t}\r\n\t}\r\n\r\n\tstatic rgbToValue(r, g, b) {\r\n\t\treturn (r << 16) | (g << 8) | b;\r\n\t}\r\n\r\n\tstatic valueToRgb(bin) {\r\n\t\tconst r = bin >> 16;\r\n\t\tconst g = (bin >> 8) & 0xff;\r\n\t\tconst b = bin & 0xff;\r\n\t\treturn [r, g, b];\r\n\t}\r\n\r\n\tstatic oscillation(elapsed, loopDuration, syncShift, val1, val2, func, isSync, xpi = Anime.twoPi) {\r\n\t\treturn (\r\n\t\t\t((val1 - val2) *\r\n\t\t\t\t(func(\r\n\t\t\t\t\txpi * (isSync ? Anime.getSynchronizedTime(loopDuration, syncShift) : elapsed / loopDuration + syncShift),\r\n\t\t\t\t) +\r\n\t\t\t\t\t1)) /\r\n\t\t\t\t2 +\r\n\t\t\tval2\r\n\t\t);\r\n\t}\r\n\r\n\tstatic colOscillation(elapsed, loopDuration, syncShift, val1, val2, isSync, xpi = Anime.twoPi) {\r\n\t\tconst rgbValue1 = Anime.valueToRgb(val1);\r\n\t\tconst rgbValue2 = Anime.valueToRgb(val2);\r\n\r\n\t\treturn Anime.rgbToValue(\r\n\t\t\tMath.floor(\r\n\t\t\t\tAnime.oscillation(elapsed, loopDuration, syncShift, rgbValue1[0], rgbValue2[0], Math.cos, isSync, xpi),\r\n\t\t\t),\r\n\t\t\tMath.floor(\r\n\t\t\t\tAnime.oscillation(elapsed, loopDuration, syncShift, rgbValue1[1], rgbValue2[1], Math.cos, isSync, xpi),\r\n\t\t\t),\r\n\t\t\tMath.floor(\r\n\t\t\t\tAnime.oscillation(elapsed, loopDuration, syncShift, rgbValue1[2], rgbValue2[2], Math.cos, isSync, xpi),\r\n\t\t\t),\r\n\t\t);\r\n\t}\r\n\r\n\tstatic getSynchronizedTime(loopDuration, syncShift) {\r\n\t\treturn Anime._lastTime / loopDuration + syncShift;\r\n\t}\r\n\r\n\tstatic getSynchronizedRotation(loopDuration, syncShift) {\r\n\t\treturn (360 * ((Anime._lastTime + syncShift) % loopDuration)) / loopDuration;\r\n\t}\r\n\r\n\tstatic getPuppetsByParams(params) {\r\n\t\tlet puppetArray = [];\r\n\t\tAnime._animeMap.forEach((anime, id) => {\r\n\t\t\tif (\r\n\t\t\t\tanime.puppet.placeableId === params.placeableId &&\r\n\t\t\t\tanime.puppet.filterId === params.filterId &&\r\n\t\t\t\t(!anime.puppet.hasOwnProperty('filterInternalId') || anime.puppet.filterInternalId === params.filterInternalId)\r\n\t\t\t) {\r\n\t\t\t\tpuppetArray.push(anime.puppet);\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn puppetArray;\r\n\t}\r\n\r\n\tstatic addAnimation(anime) {\r\n\t\tAnime._animeMap.set(anime.animeId, anime);\r\n\t\tAnime._resumeAnimation();\r\n\t}\r\n\r\n\tstatic removeAnimation(placeableId) {\r\n\t\tAnime._animeMap.forEach((anime, id) => {\r\n\t\t\tif (anime.puppet.placeableId === placeableId) {\r\n\t\t\t\tAnime._animeMap.delete(id);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif (Anime._animeMap.size === 0) {\r\n\t\t\tAnime._suspendAnimation();\r\n\t\t}\r\n\t}\r\n\r\n\tstatic removeAnimationByFilterId(placeableId, filterId) {\r\n\t\tAnime._animeMap.forEach((anime, id) => {\r\n\t\t\tif (anime.puppet.placeableId === placeableId && anime.puppet.filterId === filterId) {\r\n\t\t\t\tAnime._animeMap.delete(id);\r\n\t\t\t}\r\n\t\t});\r\n\t\tif (Anime._animeMap.size === 0) {\r\n\t\t\tAnime._suspendAnimation();\r\n\t\t}\r\n\t}\r\n\r\n\tstatic resetAnimation() {\r\n\t\tAnime._animeMap = new Map();\r\n\t\tAnime._suspended = true;\r\n\t}\r\n\r\n\tstatic tick() {\r\n\t\tAnime._lastTime = canvas.app.ticker.lastTime;\r\n\t\tAnime._frameTime = Anime._lastTime - Anime._prevTime;\r\n\r\n\t\tfor (const [id, anime] of Anime._animeMap) {\r\n\t\t\tif (anime.puppet.enabled) {\r\n\t\t\t\tif (anime.puppet.hasOwnProperty('preComputation') && anime.puppet.placeableImg != null) {\r\n\t\t\t\t\tanime.puppet.preComputation();\r\n\t\t\t\t}\r\n\t\t\t\tif (anime.puppet.hasOwnProperty('animated') && !(anime.puppet.animated == null)) {\r\n\t\t\t\t\tanime.animate(Anime._frameTime);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tAnime._prevTime = Anime._lastTime;\r\n\t}\r\n\r\n\tstatic _suspendAnimation() {\r\n\t\tif (Anime._activated && !Anime._suspended && !isAnimationDisabled()) {\r\n\t\t\tAnime._detachFromTicker();\r\n\t\t}\r\n\t\tAnime._suspended = true;\r\n\t}\r\n\r\n\tstatic _resumeAnimation() {\r\n\t\tif (Anime._activated && Anime._suspended && !isAnimationDisabled()) {\r\n\t\t\tAnime._attachToTicker();\r\n\t\t}\r\n\t\tAnime._suspended = false;\r\n\t}\r\n\r\n\tstatic activateAnimation() {\r\n\t\tif (!Anime._activated && !Anime._suspended && !isAnimationDisabled()) {\r\n\t\t\tAnime._attachToTicker();\r\n\t\t}\r\n\t\tAnime._activated = true;\r\n\t}\r\n\r\n\tstatic deactivateAnimation() {\r\n\t\tif (Anime._activated && !Anime._suspended && !isAnimationDisabled()) {\r\n\t\t\tAnime._detachFromTicker();\r\n\t\t}\r\n\t\tAnime._activated = false;\r\n\t}\r\n\r\n\tstatic _attachToTicker() {\r\n\t\tcanvas.app.ticker.add(Anime.tick, this, PIXI.UPDATE_PRIORITY.LOW + 1);\r\n\t\tAnime._lastTime = canvas.app.ticker.lastTime;\r\n\t\tAnime._prevTime = Anime._lastTime;\r\n\t}\r\n\r\n\tstatic _detachFromTicker() {\r\n\t\tcanvas.app.ticker.remove(Anime.tick, this);\r\n\t\tAnime._lastTime = 0;\r\n\t\tAnime._prevTime = 0;\r\n\t}\r\n\r\n\tstatic getAnimeMap() {\r\n\t\treturn Anime._animeMap;\r\n\t}\r\n\r\n\tinitAnimatedInternals(animated) {\r\n\t\tObject.keys(animated).forEach((effect) => {\r\n\t\t\t// Internals init\r\n\t\t\tthis.initInternals(effect);\r\n\t\t});\r\n\t}\r\n\r\n\tinitInternals(effect) {\r\n\t\tthis.elapsedTime[effect] = 0;\r\n\t\tthis.loopElapsedTime[effect] = 0;\r\n\t\tthis.pauseBetweenElapsedTime[effect] = 0;\r\n\t\tthis.loops[effect] = 0;\r\n\t\tthis.internalLoops[effect] = 0;\r\n\t\tthis.frameTime[effect] = 0;\r\n\t\tthis.pauseBetween[effect] = false;\r\n\t\tthis.ping[effect] = false;\r\n\t\tthis.shutdown[effect] = false;\r\n\t}\r\n\r\n\thasInternals(effect) {\r\n\t\treturn this.elapsedTime.hasOwnProperty(effect);\r\n\t}\r\n\r\n\tanimate(frameTime) {\r\n\t\tfor (const effect of Object.keys(this.puppet.animated)) {\r\n\t\t\tif (this.animated[effect].active && this.cycleCheck(effect, frameTime)) {\r\n\t\t\t\tif (this[this.animated[effect].animType] != null) {\r\n\t\t\t\t\tthis[this.animated[effect].animType](effect);\r\n\t\t\t\t}\r\n\t\t\t\tif (this.shutdown[effect]) {\r\n\t\t\t\t\tthis.animated[effect].active = false;\r\n\t\t\t\t\tthis.shutdown[effect] = false;\r\n\r\n\t\t\t\t\t// persists the value of an effect which is terminated.\r\n\t\t\t\t\tthis.persistTerminatedEffect(effect);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.loopElapsedTime[effect] += frameTime;\r\n\t\t\t\t\tthis.elapsedTime[effect] += frameTime;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.autoDisableCheck();\r\n\t}\r\n\r\n\tcycleCheck(effect, frameTime) {\r\n\t\tthis.frameTime[effect] = frameTime;\r\n\r\n\t\tif (this.isPauseBetweenLoop(effect, frameTime)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this.loopElapsedTime[effect] > this.animated[effect].loopDuration) {\r\n\t\t\tthis.loopElapsedTime[effect] -= this.animated[effect].loopDuration;\r\n\t\t\tthis.ping[effect] = true;\r\n\r\n\t\t\tif (this.animated[effect].loops !== Infinity) {\r\n\t\t\t\tthis.loops[effect]++;\r\n\t\t\t\tthis.internalLoops[effect]++;\r\n\t\t\t}\r\n\r\n\t\t\tif (this.loops[effect] >= this.animated[effect].loops) {\r\n\t\t\t\t// correction to stop exactly on the target value when the last loop end.\r\n\t\t\t\tthis.elapsedTime[effect] = this.internalLoops[effect] * this.animated[effect].loopDuration;\r\n\t\t\t\tthis.loops[effect] = 0;\r\n\t\t\t\tthis.loopElapsedTime[effect] = 0;\r\n\t\t\t\tthis.shutdown[effect] = true;\r\n\t\t\t} else if (this.animated[effect].pauseBetweenDuration > 0) {\r\n\t\t\t\tthis.elapsedTime[effect] = this.animated[effect].loopDuration;\r\n\t\t\t\tthis.pauseBetween[effect] = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tasync persistTerminatedEffect(effect) {\r\n\t\tif (!(this.puppet.filterOwner === game.data.userId)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet animeInfo;\r\n\t\tlet doInit = true;\r\n\t\tlet flag = this.puppet.targetPlaceable.document.getFlag('tokenmagic', 'animeInfo');\r\n\r\n\t\tif (flag) {\r\n\t\t\t// fastest than array.find\r\n\t\t\tfor (const animeinfo of flag.values()) {\r\n\t\t\t\tif (\r\n\t\t\t\t\tanimeinfo.tmFilterId === this.puppet.filterId &&\r\n\t\t\t\t\tanimeinfo.tmFilterInternalId === this.puppet.filterInternalId &&\r\n\t\t\t\t\tanimeinfo.tmFilterEffect === effect\r\n\t\t\t\t) {\r\n\t\t\t\t\tif (animeinfo && animeinfo instanceof Object) {\r\n\t\t\t\t\t\tanimeinfo.tmFilterEffectValue = this.puppet[effect];\r\n\t\t\t\t\t\tdoInit = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (doInit) {\r\n\t\t\tanimeInfo = [\r\n\t\t\t\t{\r\n\t\t\t\t\ttmFilterId: this.puppet.filterId,\r\n\t\t\t\t\ttmFilterInternalId: this.puppet.filterInternalId,\r\n\t\t\t\t\ttmFilterEffect: effect,\r\n\t\t\t\t\ttmFilterEffectValue: this.puppet[effect],\r\n\t\t\t\t},\r\n\t\t\t];\r\n\r\n\t\t\tif (flag) flag = flag.concat(animeInfo);\r\n\t\t\telse flag = animeInfo;\r\n\t\t}\r\n\r\n\t\tflag = foundry.utils.duplicate(flag);\r\n\t\tawait this.puppet.targetPlaceable.document._TMFXsetAnimeFlag(flag);\r\n\t}\r\n\r\n\tautoDisableCheck() {\r\n\t\tif (!(this.puppet.autoDisable || this.puppet.autoDestroy)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!(this.puppet.filterOwner === game.data.userId)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (this.puppet.enabled === false && !this.puppet.autoDestroy) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (Object.values(this.animated).every((animeEffect) => animeEffect.active === false)) {\r\n\t\t\tthis.disableOrDestroy();\r\n\t\t}\r\n\t}\r\n\r\n\tasync disableOrDestroy() {\r\n\t\tif (this.puppet == null) return;\r\n\t\tconst placeable = this.puppet.targetPlaceable;\r\n\t\tif (placeable == null) return;\r\n\r\n\t\tif (this.puppet.autoDestroy) {\r\n\t\t\tawait window.TokenMagic.deleteFilters(placeable, this.puppet.filterId);\r\n\t\t} else {\r\n\t\t\tlet params = {};\r\n\t\t\tparams.filterType = this.puppet.filterType;\r\n\t\t\tparams.filterId = this.puppet.filterId;\r\n\t\t\tparams.enabled = false;\r\n\t\t\tawait window.TokenMagic.updateFiltersByPlaceable(placeable, [params]);\r\n\t\t}\r\n\t}\r\n\r\n\tisPauseBetweenLoop(effect, frametime) {\r\n\t\tif (this.pauseBetween[effect] && this.animated[effect].pauseBetweenDuration > 0) {\r\n\t\t\tthis.pauseBetweenElapsedTime[effect] += frametime;\r\n\t\t\tif (this.pauseBetweenElapsedTime[effect] < this.animated[effect].pauseBetweenDuration) {\r\n\t\t\t\treturn true;\r\n\t\t\t} else {\r\n\t\t\t\tthis.pauseBetweenElapsedTime[effect] = 0;\r\n\t\t\t\treturn (this.pauseBetween[effect] = false);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpauseBetweenCheck(effect, frametime) {\r\n\t\tif (this.pauseStart[effect] && this.animated[effect].pauseStartDuration > 0) {\r\n\t\t\tthis.pauseStartElapsedTime[effect] += frametime;\r\n\t\t\tif (this.pauseStartElapsedTime[effect] < this.animated[effect].pauseStartDuration) {\r\n\t\t\t\treturn false;\r\n\t\t\t} else {\r\n\t\t\t\tthis.pauseStart[effect] = false;\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tmoveToward(effect) {\r\n\t\tthis.puppet[effect] =\r\n\t\t\t((this.animated[effect].val1 - this.animated[effect].val2) / this.animated[effect].loopDuration) *\r\n\t\t\tthis.elapsedTime[effect];\r\n\t}\r\n\r\n\tcolorOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.colOscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t}\r\n\r\n\thalfColorOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.colOscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tfalse,\r\n\t\t\tMath.PI,\r\n\t\t);\r\n\t}\r\n\r\n\tsyncColorOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.colOscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t}\r\n\r\n\tcosOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.oscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tMath.cos,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t}\r\n\r\n\thalfCosOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.oscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tMath.cos,\r\n\t\t\tfalse,\r\n\t\t\tMath.PI,\r\n\t\t);\r\n\t}\r\n\r\n\tsinOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.oscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tMath.sin,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t}\r\n\r\n\thalfSinOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.oscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tMath.sin,\r\n\t\t\tfalse,\r\n\t\t\tMath.PI,\r\n\t\t);\r\n\t}\r\n\r\n\tchaoticOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.oscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift + Math.random() * this.animated[effect].chaosFactor,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tMath.cos,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t}\r\n\r\n\tsyncCosOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.oscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tMath.cos,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t}\r\n\r\n\tsyncSinOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.oscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tMath.sin,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t}\r\n\r\n\tsyncChaoticOscillation(effect) {\r\n\t\tthis.puppet[effect] = Anime.oscillation(\r\n\t\t\tthis.elapsedTime[effect],\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift + Math.random() * this.animated[effect].chaosFactor,\r\n\t\t\tthis.animated[effect].val1,\r\n\t\t\tthis.animated[effect].val2,\r\n\t\t\tMath.cos,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t}\r\n\r\n\trotation(effect) {\r\n\t\tconst computedRotation = (360 * this.elapsedTime[effect]) / this.animated[effect].loopDuration;\r\n\t\tthis.puppet[effect] = this.animated[effect].clockWise ? computedRotation : 360 - computedRotation;\r\n\t}\r\n\r\n\tsyncRotation(effect) {\r\n\t\tconst computedRotation = Anime.getSynchronizedRotation(\r\n\t\t\tthis.animated[effect].loopDuration,\r\n\t\t\tthis.animated[effect].syncShift,\r\n\t\t);\r\n\t\tthis.puppet[effect] = this.animated[effect].clockWise ? computedRotation : 360 - computedRotation;\r\n\t}\r\n\r\n\trandomNumber(effect) {\r\n\t\tconst randomNumber =\r\n\t\t\tMath.random() * (this.animated[effect].val2 - this.animated[effect].val1) + this.animated[effect].val1;\r\n\t\tif (this.animated[effect].wantInteger) {\r\n\t\t\tthis.puppet[effect] = Math.floor(randomNumber);\r\n\t\t} else {\r\n\t\t\tthis.puppet[effect] = randomNumber;\r\n\t\t}\r\n\t}\r\n\r\n\trandomNumberPerLoop(effect) {\r\n\t\tif (this._ringing(effect)) {\r\n\t\t\tthis.randomNumber(effect);\r\n\t\t}\r\n\t}\r\n\r\n\trandomColor(effect) {\r\n\t\tthis.puppet[effect] = Math.floor(Math.random() * 16777215);\r\n\t}\r\n\r\n\trandomColorPerLoop(effect) {\r\n\t\tif (this._ringing(effect)) {\r\n\t\t\tthis.randomColor(effect);\r\n\t\t}\r\n\t}\r\n\r\n\tmove(effect) {\r\n\t\tthis.puppet[effect] += this.animated[effect].speed * this.frameTime[effect];\r\n\t}\r\n\r\n\t_ringing(effect) {\r\n\t\tif (this.ping[effect]) {\r\n\t\t\tthis.ping[effect] = false;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nAnime._lastTime = 0;\r\nAnime._prevTime = 0;\r\nAnime._frameTime = 0;\r\nAnime._animeMap = new Map();\r\nAnime.twoPi = Math.PI * 2;\r\nAnime._activated = false;\r\nAnime._suspended = true;\r\n","import { Magic, isZOrderConfig } from '../tokenmagic.js';\r\nimport { autoMinRank, PlaceableType } from '../constants.js';\r\nconst { logCompatibilityWarning } = foundry.utils;\r\n\r\nexport var gMaxRank = autoMinRank;\r\n\r\nconst { PlaceableObject } = foundry.canvas.placeables;\r\n\r\nPlaceableObject.prototype.TMFXaddFilters = async function (paramsArray, replace = false) {\r\n\tawait Magic.addFilters(this, paramsArray, replace);\r\n};\r\n\r\nPlaceableObject.prototype.TMFXupdateFilters = async function (paramsArray) {\r\n\tawait Magic.updateFiltersByPlaceable(this, paramsArray);\r\n};\r\n\r\nPlaceableObject.prototype.TMFXaddUpdateFilters = async function (paramsArray) {\r\n\tawait Magic.addUpdateFilters(this, paramsArray);\r\n};\r\n\r\nPlaceableObject.prototype.TMFXdeleteFilters = async function (filterId = null) {\r\n\tawait Magic.deleteFilters(this, filterId);\r\n};\r\n\r\nPlaceableObject.prototype.TMFXhasFilterType = function (filterType) {\r\n\treturn Magic.hasFilterType(this, filterType);\r\n};\r\n\r\nPlaceableObject.prototype.TMFXhasFilterId = function (filterId) {\r\n\treturn Magic.hasFilterId(this, filterId);\r\n};\r\n\r\nPlaceableObject.prototype._TMFXsetFlag = async function (flag) {\r\n\tlogCompatibilityWarning(\r\n\t\t'You are accessing PlaceableObject._TMFXsetFlag which must now be accessed through CanvasDocument._TMFXsetFlag',\r\n\t\t{ since: '0.7.4', once: true },\r\n\t);\r\n\treturn this.document._TMFXsetFlag(flag);\r\n};\r\n\r\nPlaceableObject.prototype._TMFXsetAnimeFlag = async function (flag) {\r\n\tlogCompatibilityWarning(\r\n\t\t'You are accessing PlaceableObject._TMFXsetAnimeFlag which must now be accessed through CanvasDocument._TMFXsetAnimeFlag',\r\n\t\t{ since: '0.7.4', once: true },\r\n\t);\r\n\treturn this.document._TMFXsetAnimeFlag(flag);\r\n};\r\n\r\nPlaceableObject.prototype._TMFXunsetFlag = async function () {\r\n\tlogCompatibilityWarning(\r\n\t\t'You are accessing PlaceableObject._TMFXunsetFlag which must now be accessed through CanvasDocument._TMFXunsetFlag',\r\n\t\t{ since: '0.7.4', once: true },\r\n\t);\r\n\treturn this.document._TMFXunsetFlag();\r\n};\r\n\r\nPlaceableObject.prototype._TMFXunsetAnimeFlag = async function () {\r\n\tlogCompatibilityWarning(\r\n\t\t'You are accessing PlaceableObject._TMFXunsetFlag which must now be accessed through CanvasDocument._TMFXunsetFlag',\r\n\t\t{ since: '0.7.4', once: true },\r\n\t);\r\n\treturn this.document._TMFXunsetAnimeFlag();\r\n};\r\n\r\nPlaceableObject.prototype._TMFXgetSprite = function () {\r\n\tconst type = this._TMFXgetPlaceableType();\r\n\tswitch (type) {\r\n\t\tcase PlaceableType.TOKEN:\r\n\t\t\treturn this.mesh;\r\n\t\tcase PlaceableType.TILE:\r\n\t\t\treturn this.mesh ?? this.bg;\r\n\t\tcase PlaceableType.TEMPLATE:\r\n\t\t\treturn this.template;\r\n\t\tcase PlaceableType.DRAWING:\r\n\t\t\treturn this.hasText ? this.text : this.shape;\r\n\t\tcase PlaceableType.REGION:\r\n\t\t\treturn this.children.find((ch) => ch instanceof foundry.canvas.placeables.regions.RegionMesh);\r\n\t\tdefault:\r\n\t\t\treturn null;\r\n\t}\r\n};\r\n\r\nPlaceableObject.prototype._TMFXgetPlaceablePadding = function () {\r\n\t// get the placeable padding, by taking into account all filters and options\r\n\tlet accPadding = 0;\r\n\tconst filters = this._TMFXgetSprite().filters;\r\n\tif (filters instanceof Array) {\r\n\t\tfor (const filter of filters) {\r\n\t\t\tif (!filter.enabled) continue;\r\n\t\t\tif (canvas.app.renderer.filter.useMaxPadding) {\r\n\t\t\t\taccPadding = Math.max(accPadding, filter.padding);\r\n\t\t\t} else {\r\n\t\t\t\taccPadding += filter.padding;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn accPadding;\r\n};\r\n\r\nPlaceableObject.prototype._TMFXcheckSprite = function () {\r\n\tconst type = this._TMFXgetPlaceableType();\r\n\tswitch (type) {\r\n\t\tcase PlaceableType.TOKEN:\r\n\t\tcase PlaceableType.TILE:\r\n\t\t\treturn !(this.mesh == null);\r\n\t\tcase PlaceableType.TEMPLATE:\r\n\t\t\treturn !(this.template == null);\r\n\t\tcase PlaceableType.DRAWING:\r\n\t\t\treturn !(this.shape == null);\r\n\t\tcase PlaceableType.REGION:\r\n\t\t\treturn !(this.children.find((ch) => ch instanceof foundry.canvas.placeables.regions.RegionMesh) == null);\r\n\t\tdefault:\r\n\t\t\treturn null;\r\n\t}\r\n};\r\n\r\nPlaceableObject.prototype._TMFXgetMaxFilterRank = function () {\r\n\tconst sprite = this._TMFXgetSprite();\r\n\tif (sprite?.filters == null) {\r\n\t\treturn gMaxRank++;\r\n\t} else {\r\n\t\tlet maxRank = Math.max(...sprite.filters.map((f) => f.rank), autoMinRank);\r\n\t\tgMaxRank = Math.max(maxRank, gMaxRank) + 1;\r\n\t\treturn gMaxRank;\r\n\t}\r\n};\r\n\r\nPlaceableObject.prototype._TMFXsetRawFilters = function (filters) {\r\n\tfunction insertFilter(filters) {\r\n\t\tfunction filterZOrderCompare(a, b) {\r\n\t\t\tif (a.zOrder < b.zOrder) return -1;\r\n\t\t\tif (a.zOrder > b.zOrder) return 1;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tfunction filterRankCompare(a, b) {\r\n\t\t\tif (a.rank < b.rank) return -1;\r\n\t\t\tif (a.rank > b.rank) return 1;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tif (!isZOrder) {\r\n\t\t\tif (!filters.hasOwnProperty('rank')) {\r\n\t\t\t\tlet maxRank = Math.max(...sprite.filters.map((f) => f.rank), autoMinRank);\r\n\t\t\t\tfilters.rank = maxRank + 1;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsprite.filters.push(filters);\r\n\t\tisZOrder ? sprite.filters.sort(filterZOrderCompare) : sprite.filters.sort(filterRankCompare);\r\n\t}\r\n\r\n\tfunction addFilter(filters) {\r\n\t\tif (!isZOrder && !filters.hasOwnProperty('rank')) {\r\n\t\t\tfilters.rank = autoMinRank;\r\n\t\t}\r\n\t\tsprite.filters = [filters];\r\n\t}\r\n\r\n\tconst isZOrder = isZOrderConfig();\r\n\tconst sprite = this._TMFXgetSprite();\r\n\tif (sprite == null) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (filters == null) {\r\n\t\tsprite.filters = null;\r\n\t} else {\r\n\t\tsprite.filters == null ? addFilter(filters) : insertFilter(filters);\r\n\t}\r\n\r\n\treturn true;\r\n};\r\n\r\nPlaceableObject.prototype._TMFXunsetRawFilters = function () {\r\n\treturn this._TMFXsetRawFilters(null);\r\n};\r\n\r\nPlaceableObject.prototype._TMFXgetPlaceableType = function () {\r\n\tif (\r\n\t\t[\r\n\t\t\tPlaceableType.TOKEN,\r\n\t\t\tPlaceableType.TEMPLATE,\r\n\t\t\tPlaceableType.TILE,\r\n\t\t\tPlaceableType.DRAWING,\r\n\t\t\tPlaceableType.REGION,\r\n\t\t].includes(this.constructor.embeddedName)\r\n\t)\r\n\t\treturn this.constructor.embeddedName;\r\n\treturn PlaceableType.NOT_SUPPORTED;\r\n};\r\n","import { getPlaceableById, getMinPadding } from '../../../module/tokenmagic.js';\r\nimport '../../../module/proto/PlaceableObjectProto.js';\r\nimport { PlaceableType } from '../../../module/constants.js';\r\n\r\nPIXI.Filter.prototype.setTMParams = function (params) {\r\n\tthis.autoDisable = false;\r\n\tthis.autoDestroy = false;\r\n\tthis.gridPadding = 0;\r\n\tthis.boundsPadding = new PIXI.Point(0, 0);\r\n\tthis.currentPadding = 0;\r\n\tthis.recalculatePadding = true;\r\n\tthis.dummy = false;\r\n\tfoundry.utils.mergeObject(this, params);\r\n\tif (!this.dummy) {\r\n\t\tthis.rawPadding = this.rawPadding ?? this.padding ?? 0;\r\n\t\tthis.originalPadding = Math.max(this.rawPadding, getMinPadding());\r\n\t\tthis.assignPlaceable();\r\n\t\tthis.activateTransform();\r\n\t\tObject.defineProperty(this, 'padding', {\r\n\t\t\tget: function () {\r\n\t\t\t\tif (this.recalculatePadding) this.calculatePadding();\r\n\t\t\t\treturn this.currentPadding;\r\n\t\t\t},\r\n\t\t\tset: function (padding) {\r\n\t\t\t\tthis.rawPadding = padding;\r\n\t\t\t\tthis.originalPadding = Math.max(padding, getMinPadding());\r\n\t\t\t},\r\n\t\t});\r\n\t} else {\r\n\t\tthis.apply = function (filterManager, input, output, clear) {\r\n\t\t\tfilterManager.applyFilter(this, input, output, clear);\r\n\t\t};\r\n\t}\r\n};\r\n\r\nPIXI.Filter.prototype.getPlaceable = function () {\r\n\treturn getPlaceableById(this.placeableId, this.placeableType);\r\n};\r\n\r\nPIXI.Filter.prototype.getPlaceableType = function () {\r\n\treturn this.placeableType;\r\n};\r\n\r\nPIXI.Filter.prototype.calculatePadding = function () {\r\n\tconst target = this.placeableImg;\r\n\tlet width;\r\n\tlet height;\r\n\r\n\t{\r\n\t\tconst ang = !this.sticky && this.placeableType !== PlaceableType.TOKEN ? target.rotation : 0;\r\n\t\tconst sin = Math.sin(ang);\r\n\t\tconst cos = Math.cos(ang);\r\n\t\twidth = Math.abs(target.width * cos) + Math.abs(target.height * sin);\r\n\t\theight = Math.abs(target.width * sin) + Math.abs(target.height * cos);\r\n\t}\r\n\r\n\tif (this.gridPadding > 0) {\r\n\t\tconst gridSize = canvas.dimensions.size;\r\n\t\tthis.boundsPadding.x = this.boundsPadding.y = (this.gridPadding - 1) * gridSize;\r\n\t\tthis.boundsPadding.x += (gridSize - 1 - ((width + gridSize - 1) % gridSize)) / 2;\r\n\t\tthis.boundsPadding.y += (gridSize - 1 - ((height + gridSize - 1) % gridSize)) / 2;\r\n\t} else {\r\n\t\tthis.boundsPadding.x = this.boundsPadding.y = this.rawPadding;\r\n\t}\r\n\r\n\t{\r\n\t\tconst ang = this.sticky ? target.rotation : 0;\r\n\t\tconst sin = Math.sin(ang);\r\n\t\tconst cos = Math.cos(ang);\r\n\t\tthis.currentPadding =\r\n\t\t\tMath.max(\r\n\t\t\t\tMath.abs(this.boundsPadding.x * cos) + Math.abs(this.boundsPadding.y * sin),\r\n\t\t\t\tMath.abs(this.boundsPadding.x * sin) + Math.abs(this.boundsPadding.y * cos),\r\n\t\t\t) +\r\n\t\t\t(this.originalPadding - this.rawPadding);\r\n\t}\r\n\r\n\tthis.boundsPadding.x += (width - target.width) / 2;\r\n\tthis.boundsPadding.y += (height - target.height) / 2;\r\n\r\n\tconst scale = this.targetPlaceable.worldTransform.a;\r\n\r\n\tthis.boundsPadding.x *= scale;\r\n\tthis.boundsPadding.y *= scale;\r\n\tthis.currentPadding *= scale;\r\n};\r\n\r\nPIXI.Filter.prototype.assignPlaceable = function () {\r\n\tthis.targetPlaceable = this.getPlaceable();\r\n\tthis.targetPlaceable != null\r\n\t\t? (this.placeableImg = this.targetPlaceable._TMFXgetSprite())\r\n\t\t: (this.placeableImg = null);\r\n};\r\n\r\nPIXI.Filter.prototype.activateTransform = function () {\r\n\tthis.preComputation = this.filterTransform;\r\n\tthis.filterTransform();\r\n\r\n\tconst apply = this.apply;\r\n\tthis.apply = function (filterManager, input, output, clear, state) {\r\n\t\tif ('handleTransform' in this) {\r\n\t\t\tthis.handleTransform(state);\r\n\t\t}\r\n\t\treturn apply.apply(this, arguments);\r\n\t};\r\n};\r\n\r\nPIXI.Filter.prototype.filterTransform = function () {\r\n\tif (this.hasOwnProperty('zIndex')) {\r\n\t\tthis.targetPlaceable.zIndex = this.zIndex;\r\n\t}\r\n};\r\n\r\nPIXI.Filter.prototype.normalizeTMParams = function () {\r\n\tif (this.hasOwnProperty('animated') && !(this.animated == null)) {\r\n\t\t// Normalize animations properties\r\n\t\tObject.keys(this.animated).forEach((effect) => {\r\n\t\t\tif (this.animated[effect].active == null || typeof this.animated[effect].active != 'boolean') {\r\n\t\t\t\tthis.animated[effect].active = true;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tthis.animated[effect].loops == null ||\r\n\t\t\t\ttypeof this.animated[effect].loops != 'number' ||\r\n\t\t\t\tthis.animated[effect].loops <= 0\r\n\t\t\t) {\r\n\t\t\t\tthis.animated[effect].loops = Infinity;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tthis.animated[effect].loopDuration == null ||\r\n\t\t\t\ttypeof this.animated[effect].loopDuration != 'number' ||\r\n\t\t\t\tthis.animated[effect].loopDuration <= 0\r\n\t\t\t) {\r\n\t\t\t\tthis.animated[effect].loopDuration = 3000;\r\n\t\t\t}\r\n\t\t\tif (this.animated[effect].clockWise == null || typeof this.animated[effect].clockWise != 'boolean') {\r\n\t\t\t\tthis.animated[effect].clockWise = true;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tthis.animated[effect].pauseBetweenDuration == null ||\r\n\t\t\t\ttypeof this.animated[effect].pauseBetweenDuration != 'number' ||\r\n\t\t\t\tthis.animated[effect].pauseBetweenDuration <= 0\r\n\t\t\t) {\r\n\t\t\t\tthis.animated[effect].pauseBetweenDuration = 0;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tthis.animated[effect].syncShift == null ||\r\n\t\t\t\ttypeof this.animated[effect].syncShift != 'number' ||\r\n\t\t\t\tthis.animated[effect].syncShift < 0\r\n\t\t\t) {\r\n\t\t\t\tthis.animated[effect].syncShift = 0;\r\n\t\t\t}\r\n\t\t\tif (this.animated[effect].val1 == null || typeof this.animated[effect].val1 != 'number') {\r\n\t\t\t\tthis.animated[effect].val1 = 0;\r\n\t\t\t}\r\n\t\t\tif (this.animated[effect].val2 == null || typeof this.animated[effect].val2 != 'number') {\r\n\t\t\t\tthis.animated[effect].val2 = 0;\r\n\t\t\t}\r\n\t\t\tif (this.anime[this.animated[effect].animType] === undefined) {\r\n\t\t\t\tthis.animated[effect].animType = null;\r\n\t\t\t}\r\n\t\t\tif (this.animated[effect].speed == null || typeof this.animated[effect].speed != 'number') {\r\n\t\t\t\tthis.animated[effect].speed = 0;\r\n\t\t\t}\r\n\t\t\tif (this.animated[effect].chaosFactor == null || typeof this.animated[effect].chaosFactor != 'number') {\r\n\t\t\t\tthis.animated[effect].chaosFactor = 0.25;\r\n\t\t\t}\r\n\t\t\tif (this.animated[effect].wantInteger == null || typeof this.animated[effect].wantInteger != 'boolean') {\r\n\t\t\t\tthis.animated[effect].wantInteger = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (!this.anime.hasInternals(effect)) {\r\n\t\t\t\tthis.anime.initInternals(effect);\r\n\t\t\t}\r\n\r\n\t\t\tthis.anime.animated = this.animated;\r\n\t\t});\r\n\t}\r\n};\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterAdjustment extends PIXI.filters.AdjustmentFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.enabled = false;\r\n\t\tthis.gamma = 1;\r\n\t\tthis.saturation = 1;\r\n\t\tthis.contrast = 1;\r\n\t\tthis.brightness = 1;\r\n\t\tthis.red = 1;\r\n\t\tthis.green = 1;\r\n\t\tthis.blue = 1;\r\n\t\tthis.alpha = 1;\r\n\t\tthis.zOrder = 30;\r\n\t\tthis.animating = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterAscii extends PIXI.filters.AsciiFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.size = 8;\r\n\t\tthis.zOrder = 310;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterXBloom extends PIXI.filters.AdvancedBloomFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\r\n\t\tthis.enabled = false;\r\n\t\tthis.threshold = 0.5;\r\n\t\tthis.bloomScale = 1.0;\r\n\t\tthis.brightness = 1.0;\r\n\t\tthis.blur = 4.0;\r\n\t\tthis.quality = 4.0;\r\n\t\tthis.zOrder = 40;\r\n\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterDot extends PIXI.filters.DotFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.scale = 1;\r\n\t\tthis.angle = 5;\r\n\t\tthis.grayscale = true;\r\n\t\tthis.zOrder = 330;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\nimport { fixPath } from '../../module/tokenmagic.js';\r\n\r\nexport class FilterDistortion extends PIXI.filters.DisplacementFilter {\r\n\tconstructor(params) {\r\n\t\t// Loading distortion sprite\r\n\t\tvar displacementSpriteMask;\r\n\t\tvar spriteMaskPath;\r\n\t\tspriteMaskPath = params.hasOwnProperty('maskPath')\r\n\t\t\t? fixPath(params.maskPath)\r\n\t\t\t: 'modules/tokenmagic/fx/assets/distortion-1.png';\r\n\t\tdisplacementSpriteMask = PIXI.Sprite.from(spriteMaskPath);\r\n\t\tsuper(displacementSpriteMask);\r\n\r\n\t\t// Configuring distortion sprite\r\n\t\tthis.sprite = displacementSpriteMask;\r\n\t\tthis.wrapMode = PIXI.WRAP_MODES.REPEAT;\r\n\t\tthis.position = new PIXI.Point();\r\n\t\tthis.skew = new PIXI.Point();\r\n\t\tthis.pivot = new PIXI.Point();\r\n\t\tthis.anchorSet = 0.5;\r\n\t\tthis.transition = null;\r\n\t\tthis.padding = 15; // conf\r\n\t\tthis.enabled = false;\r\n\t\tthis.maskSpriteX = 0;\r\n\t\tthis.maskSpriteY = 0;\r\n\t\tthis.maskSpriteScaleX = 4;\r\n\t\tthis.maskSpriteScaleY = 4;\r\n\t\tthis.maskSpriteSkewX = 0;\r\n\t\tthis.maskSpriteSkewY = 0;\r\n\t\tthis.maskSpriteRotation = 0;\r\n\t\tthis.zOrder = 4000;\r\n\t\tthis.sticky = true;\r\n\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tthis.maskPath = spriteMaskPath;\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t\tthis.sprite.anchor.set(this.anchorSet);\r\n\t\t\tthis.sprite.texture.baseTexture.wrapMode = this.wrapMode;\r\n\t\t}\r\n\t}\r\n\r\n\tset maskSpriteX(value) {\r\n\t\tthis.position.x = value;\r\n\t}\r\n\r\n\tset maskSpriteY(value) {\r\n\t\tthis.position.y = value;\r\n\t}\r\n\r\n\tget maskSpriteX() {\r\n\t\treturn this.position.x;\r\n\t}\r\n\r\n\tget maskSpriteY() {\r\n\t\treturn this.position.y;\r\n\t}\r\n\r\n\tset maskSpriteScaleX(value) {\r\n\t\tthis.scale.x = value;\r\n\t}\r\n\r\n\tset maskSpriteScaleY(value) {\r\n\t\tthis.scale.y = value;\r\n\t}\r\n\r\n\tget maskSpriteScaleX() {\r\n\t\treturn this.scale.x;\r\n\t}\r\n\r\n\tget maskSpriteScaleY() {\r\n\t\treturn this.scale.y;\r\n\t}\r\n\r\n\tset maskSpriteRotation(value) {\r\n\t\tthis.rotation = value;\r\n\t}\r\n\r\n\tget maskSpriteRotation() {\r\n\t\treturn this.rotation;\r\n\t}\r\n\r\n\tset maskSpriteSkewX(value) {\r\n\t\tthis.skew.x = value;\r\n\t}\r\n\r\n\tget maskSpriteSkewX() {\r\n\t\treturn this.skew.x;\r\n\t}\r\n\r\n\tset maskSpriteSkewY(value) {\r\n\t\tthis.skew.y = value;\r\n\t}\r\n\r\n\tget maskSpriteSkewY() {\r\n\t\treturn this.skew.y;\r\n\t}\r\n\r\n\tset maskSpritePivotX(value) {\r\n\t\tthis.pivot.x = value;\r\n\t}\r\n\r\n\tget maskSpritePivotX() {\r\n\t\treturn this.pivot.x;\r\n\t}\r\n\r\n\tset maskSpritePivotY(value) {\r\n\t\tthis.pivot.y = value;\r\n\t}\r\n\r\n\tget maskSpritePivotY() {\r\n\t\treturn this.pivot.y;\r\n\t}\r\n\r\n\thandleTransform() {\r\n\t\tthis.sprite.position.x = this.targetPlaceable.x + this.placeableImg.x + this.position.x;\r\n\t\tthis.sprite.position.y = this.targetPlaceable.y + this.placeableImg.y + this.position.y;\r\n\t\tthis.sprite.skew.x = this.skew.x;\r\n\t\tthis.sprite.skew.x = this.skew.y;\r\n\t\tthis.sprite.rotation = this.rotation;\r\n\t\tthis.sprite.pivot.x = this.pivot.x;\r\n\t\tthis.sprite.pivot.y = this.pivot.y;\r\n\r\n\t\tif (this.sticky) this.sprite.rotation += this.placeableImg.rotation;\r\n\r\n\t\tthis.sprite.transform.updateTransform(canvas.stage.transform);\r\n\t}\r\n\r\n\tapply(filterManager, input, output, clear) {\r\n\t\tthis.uniforms.filterMatrix = filterManager.calculateSpriteMatrix(this.maskMatrix, this.maskSprite);\r\n\t\tthis.uniforms.scale.x = this.scale.x;\r\n\t\tthis.uniforms.scale.y = this.scale.y;\r\n\r\n\t\tconst wt = this.maskSprite.worldTransform;\r\n\t\tthis.uniforms.rotation[0] = wt.a;\r\n\t\tthis.uniforms.rotation[1] = wt.b;\r\n\t\tthis.uniforms.rotation[2] = wt.c;\r\n\t\tthis.uniforms.rotation[3] = wt.d;\r\n\r\n\t\tfilterManager.applyFilter(this, input, output, clear);\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterOldFilm extends PIXI.filters.OldFilmFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.enabled = false;\r\n\t\tthis.vignetting = 0;\r\n\t\tthis.noise = 0.08;\r\n\t\tthis.scratch = 0.1;\r\n\t\tthis.scratchDensity = 0.1;\r\n\t\tthis.seed = 0;\r\n\t\tthis.zOrder = 60;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterGlow extends PIXI.filters.GlowFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.padding = 15;\r\n\t\tthis.enabled = false;\r\n\t\tthis.innerStrength = 0;\r\n\t\tthis.outerStrength = 6.5;\r\n\t\tthis.color = 0x0020ff;\r\n\t\tthis.quality = 1;\r\n\t\tthis.alpha = 1;\r\n\t\tthis.zOrder = 70;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\t// Imposed value. Should not be a shader uniform\r\n\t\tthis.distance = 10;\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterOutline extends PIXI.filters.OutlineFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.blendMode = PIXI.BLEND_MODES.NORMAL;\r\n\t\tthis.padding = 5;\r\n\t\tthis.enabled = false;\r\n\t\tthis.thickness = 3;\r\n\t\tthis.color = 0x000000;\r\n\t\tthis.quality = 1;\r\n\t\tthis.zOrder = 50;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterBevel extends PIXI.filters.BevelFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.blendMode = PIXI.BLEND_MODES.NORMAL;\r\n\t\tthis.padding = 10;\r\n\t\tthis.enabled = false;\r\n\t\tthis.rotation = 0;\r\n\t\tthis.thickness = 5;\r\n\t\tthis.lightColor = 0xffffff;\r\n\t\tthis.lightAlpha = 0.95;\r\n\t\tthis.shadowColor = 0x000000;\r\n\t\tthis.shadowAlpha = 0.95;\r\n\t\tthis.zOrder = 90;\r\n\t\tthis.quality = 1;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","const _tempRect = new PIXI.Rectangle();\r\n\r\nexport class CustomFilter extends PIXI.Filter {\r\n\tconstructor(...args) {\r\n\t\tsuper(...args);\r\n\r\n\t\tif (!this.uniforms.filterMatrix || !this.uniforms.filterMatrixInverse)\r\n\t\t\tthis.uniforms.filterMatrix = new PIXI.Matrix();\r\n\r\n\t\tif (!this.uniforms.filterMatrixInverse) this.uniforms.filterMatrixInverse = new PIXI.Matrix();\r\n\t}\r\n\r\n\tapply(filterManager, input, output, clear) {\r\n\t\tconst filterMatrix = this.uniforms.filterMatrix;\r\n\r\n\t\tif (filterMatrix) {\r\n\t\t\tconst { sourceFrame, destinationFrame, target } = filterManager.activeState;\r\n\r\n\t\t\tfilterMatrix.set(destinationFrame.width, 0, 0, destinationFrame.height, sourceFrame.x, sourceFrame.y);\r\n\r\n\t\t\tconst worldTransform = PIXI.Matrix.TEMP_MATRIX;\r\n\r\n\t\t\tconst localBounds = target.getLocalBounds(_tempRect);\r\n\r\n\t\t\tif (this.sticky) {\r\n\t\t\t\tworldTransform.copyFrom(target.transform.worldTransform);\r\n\t\t\t\tworldTransform.invert();\r\n\r\n\t\t\t\tconst rotation = target.transform.rotation;\r\n\t\t\t\tconst sin = Math.sin(rotation);\r\n\t\t\t\tconst cos = Math.cos(rotation);\r\n\t\t\t\tconst scaleX = Math.hypot(\r\n\t\t\t\t\tcos * worldTransform.a + sin * worldTransform.c,\r\n\t\t\t\t\tcos * worldTransform.b + sin * worldTransform.d\r\n\t\t\t\t);\r\n\t\t\t\tconst scaleY = Math.hypot(\r\n\t\t\t\t\t-sin * worldTransform.a + cos * worldTransform.c,\r\n\t\t\t\t\t-sin * worldTransform.b + cos * worldTransform.d\r\n\t\t\t\t);\r\n\r\n\t\t\t\tlocalBounds.pad(scaleX * this.boundsPadding.x, scaleY * this.boundsPadding.y);\r\n\t\t\t} else {\r\n\t\t\t\tconst transform = target.transform;\r\n\t\t\t\tworldTransform.a = transform.scale.x;\r\n\t\t\t\tworldTransform.b = 0;\r\n\t\t\t\tworldTransform.c = 0;\r\n\t\t\t\tworldTransform.d = transform.scale.y;\r\n\t\t\t\tworldTransform.tx = transform.position.x - transform.pivot.x * transform.scale.x;\r\n\t\t\t\tworldTransform.ty = transform.position.y - transform.pivot.y * transform.scale.y;\r\n\t\t\t\tworldTransform.prepend(target.parent.transform.worldTransform);\r\n\t\t\t\tworldTransform.invert();\r\n\r\n\t\t\t\tconst scaleX = Math.hypot(worldTransform.a, worldTransform.b);\r\n\t\t\t\tconst scaleY = Math.hypot(worldTransform.c, worldTransform.d);\r\n\r\n\t\t\t\tlocalBounds.pad(scaleX * this.boundsPadding.x, scaleY * this.boundsPadding.y);\r\n\t\t\t}\r\n\r\n\t\t\tfilterMatrix.prepend(worldTransform);\r\n\t\t\tfilterMatrix.translate(-localBounds.x, -localBounds.y);\r\n\t\t\tfilterMatrix.scale(1.0 / localBounds.width, 1.0 / localBounds.height);\r\n\r\n\t\t\tconst filterMatrixInverse = this.uniforms.filterMatrixInverse;\r\n\r\n\t\t\tif (filterMatrixInverse) {\r\n\t\t\t\tfilterMatrixInverse.copyFrom(filterMatrix);\r\n\t\t\t\tfilterMatrixInverse.invert();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfilterManager.applyFilter(this, input, output, clear);\r\n\t}\r\n}\r\n","export const dropShadow = `\r\nvarying vec2 vTextureCoord;\r\nuniform sampler2D uSampler;\r\nuniform float alpha;\r\nuniform vec3 color;\r\n\r\nuniform vec2 shift;\r\nuniform vec4 inputSize;\r\n\r\nvoid main(void){\r\n    vec4 sample = texture2D(uSampler, vTextureCoord - shift * inputSize.zw);\r\n\r\n    // Premultiply alpha\r\n    sample.rgb = color.rgb * sample.a;\r\n\r\n    // alpha user alpha\r\n    sample *= alpha;\r\n\r\n    gl_FragColor = sample;\r\n}\r\n`;\r\n","// Custom vertex shader with filterLocalCoord()\r\n\r\nexport const customVertex2D = `\r\nprecision mediump float;\r\n\r\nattribute vec2 aVertexPosition;\r\n\r\nuniform mat3 projectionMatrix;\r\nuniform mat3 filterMatrix;\r\nuniform vec4 inputSize;\r\nuniform vec4 outputFrame;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nvec4 filterVertexPosition( void )\r\n{\r\n    vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\r\n\r\n    return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0., 1.);\r\n}\r\n\r\nvec2 filterTextureCoord( void )\r\n{\r\n    return aVertexPosition * (outputFrame.zw * inputSize.zw);\r\n}\r\n\r\nvoid main(void)\r\n{\r\n    gl_Position = filterVertexPosition();\r\n    vTextureCoord = filterTextureCoord();\r\n    vFilterCoord = (filterMatrix * vec3(vTextureCoord, 1.0)).xy;\r\n}\r\n`;\r\n","import { CustomFilter } from './CustomFilter.js';\r\nimport { dropShadow } from '../glsl/fragmentshaders/dropshadow.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterDropShadowEx extends CustomFilter {\r\n\tshadowOnly;\r\n\tangle = 45;\r\n\r\n\t_distance = 5;\r\n\t_resolution = PIXI.settings.RESOLUTION;\r\n\t_tintFilter;\r\n\t_blurFilter;\r\n\r\n\tconstructor(options = {}) {\r\n\t\tsuper();\r\n\r\n\t\tconst opt = options ? { ...FilterDropShadowEx.defaults, ...options } : FilterDropShadowEx.defaults;\r\n\r\n\t\tconst { kernels, blur, quality, resolution } = opt;\r\n\r\n\t\tthis._tintFilter = new PIXI.Filter(customVertex2D, dropShadow);\r\n\t\tthis._tintFilter.uniforms.color = new Float32Array(4);\r\n\t\tthis._tintFilter.uniforms.shift = new PIXI.Point();\r\n\t\tthis._tintFilter.resolution = resolution;\r\n\t\tthis._blurFilter = kernels\r\n\t\t\t? new PIXI.filters.KawaseBlurFilter(kernels)\r\n\t\t\t: new PIXI.filters.KawaseBlurFilter(blur, quality);\r\n\r\n\t\tthis._pixelSize = 1.0;\r\n\t\tthis.resolution = resolution;\r\n\r\n\t\tconst { shadowOnly, rotation, distance, alpha, color } = opt;\r\n\r\n\t\tthis.shadowOnly = shadowOnly;\r\n\t\tthis.rotation = rotation;\r\n\t\tthis.distance = distance;\r\n\t\tthis.alpha = alpha;\r\n\t\tthis.color = color;\r\n\t}\r\n\r\n\tapply(filterManager, input, output, clear) {\r\n\t\tthis._updateShiftAndScale();\r\n\t\tconst target = filterManager.getFilterTexture();\r\n\r\n\t\tthis._tintFilter.apply(filterManager, input, target, 1);\r\n\t\tthis._blurFilter.apply(filterManager, target, output, clear);\r\n\r\n\t\tif (this.shadowOnly !== true) {\r\n\t\t\tfilterManager.applyFilter(this, input, output, 0);\r\n\t\t}\r\n\r\n\t\tfilterManager.returnFilterTexture(target);\r\n\t}\r\n\r\n\t_updateShiftAndScale() {\r\n\t\tconst scale = this.targetPlaceable?.worldTransform.a ?? 1.0;\r\n\t\tthis._tintFilter.uniforms.shift.set(\r\n\t\t\tthis.distance * Math.cos(this.angle) * scale,\r\n\t\t\tthis.distance * Math.sin(this.angle) * scale,\r\n\t\t);\r\n\t\tthis._pixelSize = Math.max(1.0, 1.0 * scale);\r\n\t}\r\n\r\n\tget resolution() {\r\n\t\treturn this._resolution;\r\n\t}\r\n\tset resolution(value) {\r\n\t\tthis._resolution = value;\r\n\r\n\t\tif (this._tintFilter) {\r\n\t\t\tthis._tintFilter.resolution = value;\r\n\t\t}\r\n\t\tif (this._blurFilter) {\r\n\t\t\tthis._blurFilter.resolution = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget distance() {\r\n\t\treturn this._distance;\r\n\t}\r\n\tset distance(value) {\r\n\t\tthis._distance = value;\r\n\t}\r\n\r\n\tget rotation() {\r\n\t\treturn this.angle / PIXI.DEG_TO_RAD;\r\n\t}\r\n\tset rotation(value) {\r\n\t\tthis.angle = value * PIXI.DEG_TO_RAD;\r\n\t}\r\n\r\n\tget alpha() {\r\n\t\treturn this._tintFilter.uniforms.alpha;\r\n\t}\r\n\tset alpha(value) {\r\n\t\tthis._tintFilter.uniforms.alpha = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this._tintFilter.uniforms.color);\r\n\t}\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this._tintFilter.uniforms.color);\r\n\t}\r\n\r\n\tget kernels() {\r\n\t\treturn this._blurFilter.kernels;\r\n\t}\r\n\tset kernels(value) {\r\n\t\tthis._blurFilter.kernels = value;\r\n\t}\r\n\r\n\tget blur() {\r\n\t\treturn this._blurFilter.blur;\r\n\t}\r\n\tset blur(value) {\r\n\t\tthis._blurFilter.blur = value;\r\n\t}\r\n\r\n\tget quality() {\r\n\t\treturn this._blurFilter.quality;\r\n\t}\r\n\tset quality(value) {\r\n\t\tthis._blurFilter.quality = value;\r\n\t}\r\n\r\n\tget _pixelSize() {\r\n\t\treturn this._blurFilter.pixelSize;\r\n\t}\r\n\tset _pixelSize(value) {\r\n\t\tthis._blurFilter.pixelSize = value;\r\n\t}\r\n}\r\n\r\nFilterDropShadowEx.defaults = {\r\n\trotation: 45,\r\n\tdistance: 5,\r\n\tcolor: 0x000000,\r\n\talpha: 0.5,\r\n\tshadowOnly: false,\r\n\tkernels: null,\r\n\tblur: 2,\r\n\tquality: 3,\r\n\tresolution: PIXI.settings.RESOLUTION,\r\n};\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterTwist extends PIXI.filters.TwistFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.enabled = false;\r\n\t\tthis.radiusPercent = 50;\r\n\t\tthis.angle = 4;\r\n\t\tthis.zOrder = 240;\r\n\t\tthis.animated = {};\r\n\t\tthis.offset = [0, 0];\r\n\t\tthis.autoFit = false;\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\thandleTransform() {\r\n\t\tthis.offset[0] = this.placeableImg.worldTransform.tx;\r\n\t\tthis.offset[1] = this.placeableImg.worldTransform.ty;\r\n\t\tthis.radius =\r\n\t\t\t(Math.max(this.placeableImg.width, this.placeableImg.height) *\r\n\t\t\t\tthis.targetPlaceable.worldTransform.a *\r\n\t\t\t\tthis.radiusPercent) /\r\n\t\t\t200;\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterZoomBlur extends PIXI.filters.ZoomBlurFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.enabled = false;\r\n\t\tthis.strength = 0.1;\r\n\t\tthis.radiusPercent = 50;\r\n\t\tthis.innerRadiusPercent = 10;\r\n\t\tthis.zOrder = 300;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\thandleTransform(state) {\r\n\t\tthis.center[0] = 0.5 * state.sourceFrame.width;\r\n\t\tthis.center[1] = 0.5 * state.sourceFrame.height;\r\n\t\tthis.radius =\r\n\t\t\t(Math.max(this.placeableImg.width, this.placeableImg.height) *\r\n\t\t\t\tthis.targetPlaceable.worldTransform.a *\r\n\t\t\t\tthis.radiusPercent) /\r\n\t\t\t200;\r\n\t\tthis.innerRadius =\r\n\t\t\t(Math.max(this.placeableImg.width, this.placeableImg.height) *\r\n\t\t\t\tthis.targetPlaceable.worldTransform.a *\r\n\t\t\t\tthis.innerRadiusPercent) /\r\n\t\t\t200;\r\n\t}\r\n}\r\n","import { CustomFilter } from './CustomFilter.js';\r\n\r\nexport class FilterBlurEx extends CustomFilter {\r\n\tblurXFilter;\r\n\tblurYFilter;\r\n\r\n\t_repeatEdgePixels;\r\n\r\n\tconstructor(strength = 8, quality = 4, resolution = PIXI.settings.RESOLUTION, kernelSize = 5) {\r\n\t\tsuper();\r\n\r\n\t\tthis.blurXFilter = new BlurFilterPassEx(true, strength, quality, resolution, kernelSize);\r\n\t\tthis.blurYFilter = new BlurFilterPassEx(false, strength, quality, resolution, kernelSize);\r\n\r\n\t\tthis.resolution = resolution;\r\n\t\tthis.quality = quality;\r\n\t\tthis.blur = strength;\r\n\r\n\t\tthis.repeatEdgePixels = false;\r\n\t}\r\n\r\n\tapply(filterManager, input, output, clearMode) {\r\n\t\tconst xStrength = Math.abs(this.blurXFilter.strength);\r\n\t\tconst yStrength = Math.abs(this.blurYFilter.strength);\r\n\r\n\t\tif (xStrength && yStrength) {\r\n\t\t\tconst renderTarget = filterManager.getFilterTexture();\r\n\r\n\t\t\tthis.blurXFilter.apply(filterManager, input, renderTarget, PIXI.CLEAR_MODES.CLEAR);\r\n\t\t\tthis.blurYFilter.apply(filterManager, renderTarget, output, clearMode);\r\n\r\n\t\t\tfilterManager.returnFilterTexture(renderTarget);\r\n\t\t} else if (yStrength) {\r\n\t\t\tthis.blurYFilter.apply(filterManager, input, output, clearMode);\r\n\t\t} else {\r\n\t\t\tthis.blurXFilter.apply(filterManager, input, output, clearMode);\r\n\t\t}\r\n\t}\r\n\r\n\tupdatePadding() {\r\n\t\tif (this._repeatEdgePixels) {\r\n\t\t\tthis.padding = 0;\r\n\t\t} else {\r\n\t\t\tthis.padding = Math.max(Math.abs(this.blurXFilter.strength), Math.abs(this.blurYFilter.strength)) * 2;\r\n\t\t}\r\n\t}\r\n\r\n\tget blur() {\r\n\t\treturn this.blurXFilter.blur;\r\n\t}\r\n\r\n\tset blur(value) {\r\n\t\tthis.blurXFilter.blur = this.blurYFilter.blur = value;\r\n\t\tthis.updatePadding();\r\n\t}\r\n\r\n\tget quality() {\r\n\t\treturn this.blurXFilter.quality;\r\n\t}\r\n\r\n\tset quality(value) {\r\n\t\tthis.blurXFilter.quality = this.blurYFilter.quality = value;\r\n\t}\r\n\r\n\tget blurX() {\r\n\t\treturn this.blurXFilter.blur;\r\n\t}\r\n\r\n\tset blurX(value) {\r\n\t\tthis.blurXFilter.blur = value;\r\n\t\tthis.updatePadding();\r\n\t}\r\n\r\n\tget blurY() {\r\n\t\treturn this.blurYFilter.blur;\r\n\t}\r\n\r\n\tset blurY(value) {\r\n\t\tthis.blurYFilter.blur = value;\r\n\t\tthis.updatePadding();\r\n\t}\r\n\r\n\tget blendMode() {\r\n\t\treturn this.blurYFilter.blendMode;\r\n\t}\r\n\r\n\tset blendMode(value) {\r\n\t\tthis.blurYFilter.blendMode = value;\r\n\t}\r\n\r\n\tget repeatEdgePixels() {\r\n\t\treturn this._repeatEdgePixels;\r\n\t}\r\n\r\n\tset repeatEdgePixels(value) {\r\n\t\tthis._repeatEdgePixels = value;\r\n\t\tthis.updatePadding();\r\n\t}\r\n}\r\n\r\nexport class BlurFilterPassEx extends CustomFilter {\r\n\thorizontal;\r\n\tstrength;\r\n\tpasses;\r\n\t_quality;\r\n\r\n\tconstructor(horizontal, strength = 8, quality = 4, resolution = PIXI.settings.RESOLUTION, kernelSize = 5) {\r\n\t\tconst vertSrc = generateBlurVertSource(kernelSize, horizontal);\r\n\t\tconst fragSrc = generateBlurFragSource(kernelSize);\r\n\r\n\t\tsuper(\r\n\t\t\t// vertex shader\r\n\t\t\tvertSrc,\r\n\t\t\t// fragment shader\r\n\t\t\tfragSrc,\r\n\t\t);\r\n\r\n\t\tthis.horizontal = horizontal;\r\n\r\n\t\tthis.resolution = resolution;\r\n\r\n\t\tthis._quality = 0;\r\n\r\n\t\tthis.quality = quality;\r\n\r\n\t\tthis.blur = strength;\r\n\t}\r\n\r\n\tapply(filterManager, input, output, clearMode) {\r\n\t\tif (output) {\r\n\t\t\tif (this.horizontal) {\r\n\t\t\t\tthis.uniforms.strength = (1 / output.width) * (output.width / input.width);\r\n\t\t\t} else {\r\n\t\t\t\tthis.uniforms.strength = (1 / output.height) * (output.height / input.height);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (this.horizontal) {\r\n\t\t\t\tthis.uniforms.strength = (1 / filterManager.renderer.width) * (filterManager.renderer.width / input.width);\r\n\t\t\t} else {\r\n\t\t\t\tthis.uniforms.strength = (1 / filterManager.renderer.height) * (filterManager.renderer.height / input.height);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// screen space!\r\n\t\tthis.uniforms.strength *= this.strength;\r\n\t\tthis.uniforms.strength /= this.passes;\r\n\r\n\t\tif (this.passes === 1) {\r\n\t\t\tfilterManager.applyFilter(this, input, output, clearMode);\r\n\t\t} else {\r\n\t\t\tconst renderTarget = filterManager.getFilterTexture();\r\n\t\t\tconst renderer = filterManager.renderer;\r\n\r\n\t\t\tlet flip = input;\r\n\t\t\tlet flop = renderTarget;\r\n\r\n\t\t\tthis.state.blend = false;\r\n\t\t\tfilterManager.applyFilter(this, flip, flop, PIXI.CLEAR_MODES.CLEAR);\r\n\r\n\t\t\tfor (let i = 1; i < this.passes - 1; i++) {\r\n\t\t\t\tfilterManager.bindAndClear(flip, PIXI.CLEAR_MODES.BLIT);\r\n\r\n\t\t\t\tthis.uniforms.uSampler = flop;\r\n\r\n\t\t\t\tconst temp = flop;\r\n\r\n\t\t\t\tflop = flip;\r\n\t\t\t\tflip = temp;\r\n\r\n\t\t\t\trenderer.shader.bind(this);\r\n\t\t\t\trenderer.geometry.draw(5);\r\n\t\t\t}\r\n\r\n\t\t\tthis.state.blend = true;\r\n\t\t\tfilterManager.applyFilter(this, flop, output, clearMode);\r\n\t\t\tfilterManager.returnFilterTexture(renderTarget);\r\n\t\t}\r\n\t}\r\n\r\n\tget blur() {\r\n\t\treturn this.strength;\r\n\t}\r\n\r\n\tset blur(value) {\r\n\t\tthis.padding = 1 + Math.abs(value) * 2;\r\n\t\tthis.strength = value;\r\n\t}\r\n\r\n\tget quality() {\r\n\t\treturn this._quality;\r\n\t}\r\n\r\n\tset quality(value) {\r\n\t\tthis._quality = value;\r\n\t\tthis.passes = value;\r\n\t}\r\n}\r\n\r\nconst GAUSSIAN_VALUES = {\r\n\t5: [0.153388, 0.221461, 0.250301],\r\n\t7: [0.071303, 0.131514, 0.189879, 0.214607],\r\n\t9: [0.028532, 0.067234, 0.124009, 0.179044, 0.20236],\r\n\t11: [0.0093, 0.028002, 0.065984, 0.121703, 0.175713, 0.198596],\r\n\t13: [0.002406, 0.009255, 0.027867, 0.065666, 0.121117, 0.174868, 0.197641],\r\n\t15: [0.000489, 0.002403, 0.009246, 0.02784, 0.065602, 0.120999, 0.174697, 0.197448],\r\n};\r\n\r\nconst fragTemplate = [\r\n\t'varying vec2 vBlurTexCoords[%size%];',\r\n\t'uniform sampler2D uSampler;',\r\n\r\n\t'void main(void)',\r\n\t'{',\r\n\t'    gl_FragColor = vec4(0.0);',\r\n\t'    %blur%',\r\n\t'}',\r\n].join('\\n');\r\n\r\nexport function generateBlurFragSource(kernelSize) {\r\n\tconst kernel = GAUSSIAN_VALUES[kernelSize];\r\n\tconst halfLength = kernel.length;\r\n\r\n\tlet fragSource = fragTemplate;\r\n\r\n\tlet blurLoop = '';\r\n\tconst template = 'gl_FragColor += texture2D(uSampler, vBlurTexCoords[%index%]) * %value%;';\r\n\tlet value;\r\n\r\n\tfor (let i = 0; i < kernelSize; i++) {\r\n\t\tlet blur = template.replace('%index%', i.toString());\r\n\r\n\t\tvalue = i;\r\n\r\n\t\tif (i >= halfLength) {\r\n\t\t\tvalue = kernelSize - i - 1;\r\n\t\t}\r\n\r\n\t\tblur = blur.replace('%value%', kernel[value].toString());\r\n\r\n\t\tblurLoop += blur;\r\n\t\tblurLoop += '\\n';\r\n\t}\r\n\r\n\tfragSource = fragSource.replace('%blur%', blurLoop);\r\n\tfragSource = fragSource.replace('%size%', kernelSize.toString());\r\n\r\n\treturn fragSource;\r\n}\r\n\r\nconst vertTemplate = `\r\n    attribute vec2 aVertexPosition;\r\n    uniform mat3 projectionMatrix;\r\n    uniform float strength;\r\n    varying vec2 vBlurTexCoords[%size%];\r\n    uniform vec4 inputSize;\r\n    uniform vec4 outputFrame;\r\n    vec4 filterVertexPosition( void )\r\n    {\r\n        vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\r\n        return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\r\n    }\r\n    vec2 filterTextureCoord( void )\r\n    {\r\n        return aVertexPosition * (outputFrame.zw * inputSize.zw);\r\n    }\r\n    void main(void)\r\n    {\r\n        gl_Position = filterVertexPosition();\r\n        vec2 textureCoord = filterTextureCoord();\r\n        %blur%\r\n    }`;\r\n\r\nexport function generateBlurVertSource(kernelSize, x) {\r\n\tconst halfLength = Math.ceil(kernelSize / 2);\r\n\r\n\tlet vertSource = vertTemplate;\r\n\r\n\tlet blurLoop = '';\r\n\tlet template;\r\n\r\n\tif (x) {\r\n\t\ttemplate = 'vBlurTexCoords[%index%] =  textureCoord + vec2(%sampleIndex% * strength, 0.0);';\r\n\t} else {\r\n\t\ttemplate = 'vBlurTexCoords[%index%] =  textureCoord + vec2(0.0, %sampleIndex% * strength);';\r\n\t}\r\n\r\n\tfor (let i = 0; i < kernelSize; i++) {\r\n\t\tlet blur = template.replace('%index%', i.toString());\r\n\r\n\t\tblur = blur.replace('%sampleIndex%', `${i - (halfLength - 1)}.0`);\r\n\r\n\t\tblurLoop += blur;\r\n\t\tblurLoop += '\\n';\r\n\t}\r\n\r\n\tvertSource = vertSource.replace('%blur%', blurLoop);\r\n\tvertSource = vertSource.replace('%size%', kernelSize.toString());\r\n\r\n\treturn vertSource;\r\n}\r\n\r\nexport function getMaxKernelSize(gl) {\r\n\tconst maxVaryings = PIXI.gl.getParameter(PIXI.gl.MAX_VARYING_VECTORS);\r\n\tlet kernelSize = 15;\r\n\r\n\twhile (kernelSize > maxVaryings) {\r\n\t\tkernelSize -= 2;\r\n\t}\r\n\r\n\treturn kernelSize;\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterShockwave extends PIXI.filters.ShockwaveFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.enabled = false;\r\n\r\n\t\tthis.time = 0;\r\n\t\tthis.amplitude = 5;\r\n\t\tthis.wavelength = 100;\r\n\t\tthis.speed = 50.0;\r\n\t\tthis.brightness = 1.5;\r\n\t\tthis.radius = 200;\r\n\r\n\t\tthis.zOrder = 220;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\thandleTransform(state) {\r\n\t\tthis.center[0] = 0.5 * state.sourceFrame.width;\r\n\t\tthis.center[1] = 0.5 * state.sourceFrame.height;\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterBulgePinch extends PIXI.filters.BulgePinchFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\r\n\t\tthis.strength = 0;\r\n\t\tthis.radiusPercent = 100;\r\n\t\tthis.zOrder = 140;\r\n\t\tthis.autoFit = false;\r\n\t\tthis.center = [0.5, 0.5]; // Anchor point\r\n\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget anchorX() {\r\n\t\treturn this.center[0];\r\n\t}\r\n\r\n\tset anchorX(value) {\r\n\t\tthis.center[0] = value;\r\n\t}\r\n\r\n\tget anchorY() {\r\n\t\treturn this.center[1];\r\n\t}\r\n\r\n\tset anchorY(value) {\r\n\t\tthis.center[1] = value;\r\n\t}\r\n\r\n\thandleTransform() {\r\n\t\tthis.radius =\r\n\t\t\t(Math.max(this.placeableImg.width, this.placeableImg.height) *\r\n\t\t\t\tthis.targetPlaceable.worldTransform.a *\r\n\t\t\t\tthis.radiusPercent) /\r\n\t\t\t200;\r\n\t}\r\n}\r\n\r\nFilterBulgePinch.defaults.anchorX = 0.5;\r\nFilterBulgePinch.defaults.anchorY = 0.5;\r\n","import { removeShadowFrag } from '../glsl/fragmentshaders/removeshadow.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterRemoveShadow extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { alphaTolerance } = Object.assign({}, FilterRemoveShadow.defaults, params);\r\n\r\n\t\t// using the default vertex shader and the specific fragment shader\r\n\t\tsuper(undefined, removeShadowFrag);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\talphaTolerance,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 10;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget alphaTolerance() {\r\n\t\treturn this.uniforms.alphaTolerance;\r\n\t}\r\n\tset alphaTolerance(value) {\r\n\t\tthis.uniforms.alphaTolerance = value;\r\n\t}\r\n}\r\n\r\nFilterRemoveShadow.defaults = {\r\n\talphaTolerance: 0.8,\r\n};\r\n","export const removeShadowFrag = `\r\nprecision mediump float;\r\nvarying vec2 vTextureCoord;\r\nuniform sampler2D uSampler;\r\nuniform float alphaTolerance;\r\n\r\nvoid main(void) {\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    if (pixel.a <= alphaTolerance) {\r\n        pixel = vec4(0.);\r\n    } \r\n    gl_FragColor = pixel;\r\n}\r\n`;\r\n","import { cosmicRayFrag } from '../glsl/fragmentshaders/cosmicray.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterRays extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, divisor, alpha, anchorX, anchorY, dimX, dimY, alphaDiscard } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterRays.defaults,\r\n\t\t\tparams,\r\n\t\t);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, cosmicRayFrag);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 0.4, 0.1, 0.55]);\r\n\t\tthis.uniforms.anchor = new Float32Array([0.5, 0.5]);\r\n\t\tthis.uniforms.dimensions = new Float32Array([1.0, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tdivisor,\r\n\t\t\talpha,\r\n\t\t\tanchorX,\r\n\t\t\tanchorY,\r\n\t\t\tdimX,\r\n\t\t\tdimY,\r\n\t\t\talphaDiscard,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 120;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget divisor() {\r\n\t\treturn this.uniforms.divisor;\r\n\t}\r\n\r\n\tset divisor(value) {\r\n\t\tthis.uniforms.divisor = value;\r\n\t}\r\n\r\n\tget alpha() {\r\n\t\treturn this.uniforms.color[3];\r\n\t}\r\n\r\n\tset alpha(value) {\r\n\t\tif (value >= 0 && value <= 1) {\r\n\t\t\tthis.uniforms.color[3] = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget anchorX() {\r\n\t\treturn this.uniforms.anchor[0];\r\n\t}\r\n\r\n\tset anchorX(value) {\r\n\t\tthis.uniforms.anchor[0] = value;\r\n\t}\r\n\r\n\tget anchorY() {\r\n\t\treturn this.uniforms.anchor[1];\r\n\t}\r\n\r\n\tset anchorY(value) {\r\n\t\tthis.uniforms.anchor[1] = value;\r\n\t}\r\n\r\n\tget dimX() {\r\n\t\treturn this.uniforms.dimensions[0];\r\n\t}\r\n\r\n\tset dimX(value) {\r\n\t\tthis.uniforms.dimensions[0] = value;\r\n\t}\r\n\r\n\tget dimY() {\r\n\t\treturn this.uniforms.dimensions[1];\r\n\t}\r\n\r\n\tset dimY(value) {\r\n\t\tthis.uniforms.dimensions[1] = value;\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterRays.defaults = {\r\n\ttime: 0.0,\r\n\tcolor: 0xff8010,\r\n\tdivisor: 16,\r\n\talpha: 0.55,\r\n\tanchorX: 0.5,\r\n\tanchorY: 0.5,\r\n\tdimX: 100,\r\n\tdimY: 100,\r\n\talphaDiscard: false,\r\n};\r\n","export const cosmicRayFrag = `\r\nprecision mediump float;\r\nprecision mediump int;\r\n\r\nuniform sampler2D uSampler;\r\nuniform float time;\r\nuniform vec2 dimensions;\r\nuniform vec2 anchor;\r\nuniform vec4 color;\r\nuniform float divisor;\r\nuniform bool alphaDiscard;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nfloat PI = 3.14159265359;\r\nfloat speed = 1.2;\r\nfloat width = 0.5;\r\nfloat subdivide = 512.0;\r\n\r\nvoid main() {\r\n\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    if (pixel.a==0.) {\r\n       gl_FragColor = pixel;\r\n       return;\r\n    }\r\n\r\n    vec2 uv = (vFilterCoord - anchor) / dimensions;    \r\n    float len = length(uv *0.5),\r\n   \t\tangle = ( atan(uv.x, uv.y) / ( 2. * PI) ) + 1.5,\r\n    \twobble = 48. + 24. * cos(time/5.),\r\n    \twhite = fract((angle) * divisor + sin((sqrt(len) * wobble) - time * speed));\r\n    \r\n    white  = 2.* cos(white / (PI * 0.1));\r\n    white *= floor(fract(angle * divisor + sin(time / speed - (len * 1.2) * wobble)) *subdivide) / subdivide;\r\n    \r\n    vec4 color1 = smoothstep(0., 1., white * color);\r\n    vec4 result = mix(pixel, color1, color1.a);\r\n    if (alphaDiscard && all(lessThanEqual(result.rgb,vec3(0.05)))) discard;\r\n    gl_FragColor = result*pixel.a;\r\n}\r\n`;\r\n","import { innerFog } from '../glsl/fragmentshaders/fog.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\n\r\nexport class FilterFog extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, density, dimX, dimY } = Object.assign({}, FilterFog.defaults, params);\r\n\r\n\t\t// specific vertex and fragment shaders\r\n\t\tsuper(customVertex2D, innerFog);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 0.4, 0.1, 0.55]);\r\n\t\tthis.uniforms.dimensions = new Float32Array([1.0, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tdensity,\r\n\t\t\tdimX,\r\n\t\t\tdimY,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 190;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget density() {\r\n\t\treturn this.uniforms.density;\r\n\t}\r\n\r\n\tset density(value) {\r\n\t\tthis.uniforms.density = value;\r\n\t}\r\n\r\n\tget dimX() {\r\n\t\treturn this.uniforms.dimensions[0];\r\n\t}\r\n\r\n\tset dimX(value) {\r\n\t\tthis.uniforms.dimensions[0] = value;\r\n\t}\r\n\r\n\tget dimY() {\r\n\t\treturn this.uniforms.dimensions[1];\r\n\t}\r\n\r\n\tset dimY(value) {\r\n\t\tthis.uniforms.dimensions[1] = value;\r\n\t}\r\n}\r\n\r\nFilterFog.defaults = {\r\n\ttime: 0.0,\r\n\tcolor: 0xffffff,\r\n\tdensity: 0.5,\r\n\tdimX: 1.0,\r\n\tdimY: 1.0,\r\n};\r\n","export const innerFog = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform vec3 color;\r\nuniform float density;\r\nuniform vec2 dimensions;\r\nuniform sampler2D uSampler;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\n// generates pseudo-random based on screen position\r\nfloat random(vec2 pos) \r\n{\r\n\treturn fract(sin(dot(pos.xy, vec2(12.9898, 78.233))) * 43758.5453123);\r\n}\r\n\r\n// perlin noise\r\nfloat noise(vec2 pos) \r\n{\r\n\tvec2 i = floor(pos);\r\n\tvec2 f = fract(pos);\r\n\tfloat a = random(i + vec2(0.0, 0.0));\r\n\tfloat b = random(i + vec2(1.0, 0.0));\r\n\tfloat c = random(i + vec2(0.0, 1.0));\r\n\tfloat d = random(i + vec2(1.0, 1.0));\r\n\tvec2 u = f * f * (3.0 - 2.0 * f);\r\n\treturn mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y;\r\n}\r\n\r\n// fractional brownian motion\r\nfloat fbm(vec2 pos) \r\n{\r\n\tfloat v = 0.0;\r\n\tfloat a = 0.5;\r\n\tvec2 shift = vec2(100.);\r\n\tmat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5));\r\n\tfor (int i=0; i<16; i++) \r\n\t{\r\n\t\tv = (sin(v*1.07)) + ( a * noise(pos) );\r\n\t\tpos = rot * pos * 1.9 + shift;\r\n\t\ta *= 0.5;\r\n\t}\r\n\treturn v;\r\n}\r\n\r\nmat4 contrastMatrix(float contrast)\r\n{\r\n\tfloat t = ( 1.0 - contrast ) * 0.5;\r\n    \r\n    return mat4( contrast, 0, 0, 0,\r\n                 0, contrast, 0, 0,\r\n                 0, 0, contrast, 0,\r\n                 t, t, t, 1 );\r\n}\r\n\r\nvec4 fog()\r\n{\r\n\tvec2 p = (vFilterCoord.xy * 8. - vFilterCoord.xy) * dimensions;\r\n\t\r\n\tfloat time2 = time * 0.0025;\r\n\t\r\n\tvec2 q = vec2(0.0);\r\n\tq.x = fbm(p);\r\n\tq.y = fbm(p);\r\n\tvec2 r = vec2(-1.0);\r\n\tr.x = fbm(p * q + vec2(1.7, 9.2) + .15 * time2);\r\n\tr.y = fbm(p * q + vec2(9.3, 2.8) + .35 * time2);\r\n\tfloat f = fbm(p*.2 + r*3.102);\r\n\r\n\tvec4 fogPixel = mix(\r\n\t\tvec4(color,1.0),\r\n\t\tvec4(1.5, 1.5, 1.5, 1.5),\r\n\t\tclamp(length(r.x), 0.4, 1.)\r\n\t);\r\n\r\n\treturn (f *f * f + 0.6 * f * f + 0.5 * f) * fogPixel;\r\n}\r\n\r\nvoid main(void) \r\n{\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n\r\n    // to avoid computation on an invisible pixel.\r\n    if (pixel.a == 0.) {\r\n\t\tgl_FragColor = pixel;\r\n\t\treturn;\r\n    }\r\n\r\n\tvec4 fogPixel = contrastMatrix(3.0)*fog();\r\n    gl_FragColor = mix(pixel, fogPixel, 1.*density) * pixel.a;\r\n}\r\n`;\r\n","import { xFog } from '../glsl/fragmentshaders/xfog.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\n\r\nexport class FilterXFog extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, alphaDiscard } = Object.assign({}, FilterXFog.defaults, params);\r\n\r\n\t\t// specific vertex and fragment shaders\r\n\t\tsuper(customVertex2D, xFog);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 0.4, 0.1, 0.55]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\talphaDiscard,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 230;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterXFog.defaults = {\r\n\ttime: 0.0,\r\n\tcolor: 0xffffff,\r\n\talphaDiscard: false,\r\n};\r\n","export const xFog = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform vec3 color;\r\nuniform bool alphaDiscard;\r\nuniform sampler2D uSampler;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nconst float PI = 3.14159265;\r\nconst mat3 rotationMatrix = mat3(1.0,0.0,0.0,0.0,0.47,-0.88,0.0,0.88,0.47);\r\n\t\r\nfloat hash(float p)\r\n{\r\n    return fract(sin(dot(vec2(p*0.00010,0.),vec2(12.9898,78.233))) * 43758.5453);\r\n}\r\n\r\nfloat noise( vec3 x )\r\n{\r\n    vec3 p = floor(x);\r\n    vec3 f = fract(x);\r\n    f = f*f*(3.0-2.0*f);\r\n    float n = p.x + p.y*57.0 + 113.0*p.z;\r\n    return mix(mix(mix( hash(n+0.0  ), hash(n+1.0),f.x),mix( hash(n+57.0 ), hash(n+58.0 ),f.x),f.y),\r\n           mix(mix( hash(n+113.0), hash(n+114.0),f.x),mix( hash(n+170.0), hash(n+171.0),f.x),f.y),f.z);\r\n} \r\n\r\nvec4 map( vec3 p )\r\n{\r\n\tfloat d = 0.2 - p.y;\t\r\n\tvec3 q = p  - vec3(0.0,1.0,0.0)*time;\r\n\tfloat f  = 0.5*noise( q ); q = q*2.02 - vec3(0.25,0.25,0.25)*time*0.4;\r\n\tf += 0.25*noise( q ); \r\n    q = q*2.03 - vec3(0.0,1.0,0.0)*time*0.2;\r\n\tf += 0.125*noise( q ); \r\n\td = clamp( d + 4.5*f, 0.0, 1.0 );\r\n\tvec3 col = mix( vec3(0.9,0.9,0.9), vec3(0.1,0.1,0.1), d ) + 0.05*sin(p);\r\n\treturn vec4( col, d );\r\n}\r\n\r\nvec3 cloudify( vec3 ro, vec3 rd )\r\n{\r\n\tvec4 s = vec4(0.);\r\n\tfloat t = 0.0;\r\n    vec3 col = color*0.75;\r\n    vec3 p;\r\n    vec4 k;\r\n\r\n\tfor( int i=0; i<90; i++ )\r\n\t{\r\n\t\tif( s.a > 0.97 ) break;\r\n\t\tp = ro + t*rd;\r\n\t\tk = map( p );\r\n\t\tk.rgb *= mix( col, color, clamp( (p.y-0.2)*0.5, 0.0, 1.0 ) );\r\n\t\tk.a *= 0.5;\r\n\t\tk.rgb *= k.a;\r\n\t\ts = s + k*(1.0-s.a);\t\r\n\t\tt += 0.05;\r\n\t}\r\n\treturn clamp( s.xyz, 0.0, 1.0 );\r\n}\r\n\r\nvec4 xfog()\r\n{\r\n\tvec3 vo = vec3(0.0,4.9,-40.);\r\n\tvec3 vd = normalize(vec3(vFilterCoord.xy, 1.)) * rotationMatrix * 2.25;\r\n\tvec3 volume = cloudify( vo, vd );\r\n\tvolume *= volume;\r\n\treturn vec4( volume, 1.0 );\r\n}\r\n\r\nvoid main() \r\n{\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    if (pixel.a == 0.) discard;\r\n    vec4 result = max( xfog(), pixel) * pixel.a;\r\n    if (alphaDiscard && all(lessThanEqual(result.rgb,vec3(0.15)))) discard;\r\n    gl_FragColor = result;\r\n}\r\n`;\r\n","export const zapElectricity = `\r\nprecision mediump float;\r\nprecision mediump int;\r\n\r\n#define INTENSITY 5\r\n\r\nconst float PI = 3.14159265358979323846264;\r\n\r\nuniform sampler2D uSampler;\r\nuniform vec4 color;\r\nvarying vec2 vFilterCoord;\r\nvarying vec2 vTextureCoord;\r\nuniform float time;\r\nuniform int blend;\r\n\r\nvec4 blenderVec3(int blend, vec4 fColv4, vec4 sColv4)\r\n{\r\n    vec3 fCol = vec3(fColv4);\r\n    vec3 sCol = vec3(sColv4);\r\n    if ( blend == 1) { fCol = fCol * sCol; }\r\n    else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 3) { fCol = min(fCol, sCol); }\r\n    else if (blend == 4) { fCol = max(fCol, sCol); }\r\n    else if (blend == 5) { fCol = abs(fCol - sCol); }\r\n    else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); }\r\n    else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); }\r\n    else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); }\r\n    else if (blend == 11) { fCol = fCol / (1.0 - sCol); }\r\n    else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol; }\r\n    else if (blend == 13) { fCol = fCol + sCol; }\r\n    else { fCol = fCol + sCol; }\r\n    \r\n    return vec4(fCol,1.0);\r\n}\r\n\r\nfloat Perlin(vec3 P)\r\n{\r\n    vec3 Pi = floor(P);\r\n    vec3 Pf = P - Pi;\r\n    vec3 Pf_min1 = Pf - 1.0;\r\n\r\n    Pi.xyz = Pi.xyz - floor(Pi.xyz * (1.0 / 69.0)) * 69.0;\r\n    vec3 Pi_inc1 = step(Pi, vec3(69.0 - 1.5)) * (Pi + 1.0);\r\n\r\n    vec4 Pt = vec4(Pi.xy, Pi_inc1.xy) + vec2(50.0, 161.0).xyxy;\r\n    Pt *= Pt;\r\n    Pt = Pt.xzxz * Pt.yyww;\r\n    const vec3 SOMELARGEFLOATS = vec3(635.298681, 682.357502, 668.926525);\r\n    const vec3 ZINC = vec3(48.500388, 65.294118, 63.934599);\r\n    vec3 lowz_mod = vec3(1.0 / (SOMELARGEFLOATS + Pi.zzz * ZINC));\r\n    vec3 highz_mod = vec3(1.0 / (SOMELARGEFLOATS + Pi_inc1.zzz * ZINC));\r\n    vec4 hashx0 = fract(Pt * lowz_mod.xxxx);\r\n    vec4 hashx1 = fract(Pt * highz_mod.xxxx);\r\n    vec4 hashy0 = fract(Pt * lowz_mod.yyyy);\r\n    vec4 hashy1 = fract(Pt * highz_mod.yyyy);\r\n    vec4 hashz0 = fract(Pt * lowz_mod.zzzz);\r\n    vec4 hashz1 = fract(Pt * highz_mod.zzzz);\r\n\r\n    vec4 grad_x0 = hashx0 - 0.49999;\r\n    vec4 grad_y0 = hashy0 - 0.49999;\r\n    vec4 grad_z0 = hashz0 - 0.49999;\r\n    vec4 grad_x1 = hashx1 - 0.49999;\r\n    vec4 grad_y1 = hashy1 - 0.49999;\r\n    vec4 grad_z1 = hashz1 - 0.49999;\r\n    vec4 grad_results_0 = inversesqrt(grad_x0 * grad_x0 + grad_y0 * grad_y0 + grad_z0 * grad_z0) * (vec2(Pf.x, Pf_min1.x).xyxy * grad_x0 + vec2(Pf.y, Pf_min1.y).xxyy * grad_y0 + Pf.zzzz * grad_z0);\r\n    vec4 grad_results_1 = inversesqrt(grad_x1 * grad_x1 + grad_y1 * grad_y1 + grad_z1 * grad_z1) * (vec2(Pf.x, Pf_min1.x).xyxy * grad_x1 + vec2(Pf.y, Pf_min1.y).xxyy * grad_y1 + Pf_min1.zzzz * grad_z1);\r\n\r\n    vec3 blend = Pf * Pf * Pf * (Pf * (Pf * 6.0 - 15.0) + 10.0);\r\n    vec4 res0 = mix(grad_results_0, grad_results_1, blend.z);\r\n    vec4 blend2 = vec4(blend.xy, vec2(1.0 - blend.xy));\r\n    float final = dot(res0, blend2.zxzx * blend2.wwyy);\r\n    return (final * 1.1547005383792515290182975610039);  // scale things to a strict -1.0->1.0 range  *= 1.0/sqrt(0.75)\r\n}\r\n\r\nfloat fbm(vec3 p)\r\n{\r\n    float v = 0.0;\r\n    v += Perlin(p * 0.9) * 1.5 * cos(PI * time * 0.48);\r\n    v += Perlin(p * 3.99) * 0.5 * sin(PI * time * 0.4);\r\n    v += Perlin(p * 8.01) * 0.4 * cos(PI * time * 0.4);\r\n    v += Perlin(p * 15.05) * 0.05 * sin(PI * time * 0.8);\r\n\r\n    return v;\r\n}\r\n\r\nvec4 electric() {\r\n    vec3 noiseVec = vec3(vFilterCoord, 1.);\r\n    vec3 color = vec3(0.0);\r\n    for (int i = 0; i < INTENSITY; ++i ) {\r\n        noiseVec = noiseVec.yxz;\r\n        float t = abs(2.0 / (fbm(noiseVec + vec3(0.0, time / float(i + 4), 0.0)) * 120.0));\r\n        color += t * vec3(float(i + 1) * 0.1 + 0.1, 0.5, 2.0);\r\n    }\r\n    return vec4(color, 1.);\r\n}\r\n\r\nvoid main() {\r\n \r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    \r\n    // to avoid computation of invisible pixels\r\n    if (pixel.a==0.) {\r\n       gl_FragColor = pixel;\r\n       return;\r\n    }\r\n    \r\n    vec4 electric = electric();\r\n    electric *= color;\r\n\r\n    gl_FragColor = blenderVec3(blend,pixel,electric)*pixel.a;\r\n}\r\n`;\r\n","import { zapElectricity } from '../glsl/fragmentshaders/electricity.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterElectric extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, blend, color } = Object.assign({}, FilterElectric.defaults, params);\r\n\r\n\t\tvar shaderFragment;\r\n\t\tif (params.hasOwnProperty('intensity') && typeof params.intensity === 'number') {\r\n\t\t\tvar intensityVal = Math.floor(params.intensity);\r\n\t\t\tshaderFragment = zapElectricity.replace('#define INTENSITY 5', '#define INTENSITY ' + intensityVal);\r\n\t\t} else {\r\n\t\t\tshaderFragment = zapElectricity;\r\n\t\t}\r\n\r\n\t\tsuper(customVertex2D, shaderFragment);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.blend = 2;\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tblend,\r\n\t\t\tcolor,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 160;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\r\n\t\tthis.quality = 0.5;\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n}\r\n\r\nFilterElectric.defaults = {\r\n\ttime: 0.0,\r\n\tblend: 1,\r\n\tcolor: 0xffffff,\r\n};\r\n","import { magicWaves } from '../glsl/fragmentshaders/waves.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterWaves extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, inward, frequency, strength, minIntensity, maxIntensity, anchorX, anchorY } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterWaves.defaults,\r\n\t\t\tparams,\r\n\t\t);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, magicWaves);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.anchor = new Float32Array([0.5, 0.5]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tinward,\r\n\t\t\tfrequency,\r\n\t\t\tstrength,\r\n\t\t\tminIntensity,\r\n\t\t\tmaxIntensity,\r\n\t\t\tanchorX,\r\n\t\t\tanchorY,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 280;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget inward() {\r\n\t\treturn this.uniforms.inward;\r\n\t}\r\n\r\n\tset inward(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.inward = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget anchorX() {\r\n\t\treturn this.uniforms.anchor[0];\r\n\t}\r\n\r\n\tset anchorX(value) {\r\n\t\tthis.uniforms.anchor[0] = value;\r\n\t}\r\n\r\n\tget anchorY() {\r\n\t\treturn this.uniforms.anchor[1];\r\n\t}\r\n\r\n\tset anchorY(value) {\r\n\t\tthis.uniforms.anchor[1] = value;\r\n\t}\r\n\r\n\tget frequency() {\r\n\t\treturn this.uniforms.frequency;\r\n\t}\r\n\r\n\tset frequency(value) {\r\n\t\tthis.uniforms.frequency = value;\r\n\t}\r\n\r\n\tget strength() {\r\n\t\treturn this.uniforms.strength;\r\n\t}\r\n\r\n\tset strength(value) {\r\n\t\tthis.uniforms.strength = value;\r\n\t}\r\n\r\n\tget minIntensity() {\r\n\t\treturn this.uniforms.minIntensity;\r\n\t}\r\n\r\n\tset minIntensity(value) {\r\n\t\tthis.uniforms.minIntensity = value;\r\n\t}\r\n\r\n\tget maxIntensity() {\r\n\t\treturn this.uniforms.maxIntensity;\r\n\t}\r\n\r\n\tset maxIntensity(value) {\r\n\t\tthis.uniforms.maxIntensity = value;\r\n\t}\r\n}\r\n\r\nFilterWaves.defaults = {\r\n\ttime: 0,\r\n\tcolor: 0xffffff,\r\n\tinward: false,\r\n\tfrequency: 35,\r\n\tstrength: 0.01,\r\n\tminIntensity: 1.2,\r\n\tmaxIntensity: 3.5,\r\n\tanchorX: 0.5,\r\n\tanchorY: 0.5,\r\n};\r\n","export const magicWaves = `\r\nprecision mediump float;\r\nprecision mediump int;\r\n\r\nuniform vec3 color;\r\nuniform vec2 anchor;\r\nuniform float time;\r\nuniform bool inward;\r\nuniform float frequency;\r\nuniform float strength;\r\nuniform float minIntensity;\r\nuniform float maxIntensity;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\nuniform sampler2D uSampler;\r\n\r\nvoid main() {\r\n\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    if (pixel.a==0.) {\r\n       gl_FragColor = pixel;\r\n       return;\r\n    }\r\n\r\n    float speed = inward ? 1.0 : -1.0;\r\n\r\n    vec2 centeredUVs = vFilterCoord - anchor;\r\n    float dist = length(centeredUVs);\r\n    float sinVal = sin((time * speed) + (dist * frequency));\r\n    \r\n    float sinValNormalized = sinVal * 0.5 + 0.5;\r\n    float lerp = ((maxIntensity - minIntensity) * sinValNormalized) + minIntensity;\r\n    \r\n    float rotationAmount = strength * sinVal;\r\n\r\n    float sinX = sin ( rotationAmount );\r\n    float cosX = cos ( rotationAmount );\r\n    mat2 rotationMatrix = mat2( cosX, -sinX, sinX, cosX);\r\n    vec2 newTextureCoord = vTextureCoord - vec2(0.5,0.5);\r\n\r\n    newTextureCoord = vec2(newTextureCoord * rotationMatrix ); \r\n    newTextureCoord = newTextureCoord + vec2(0.5, 0.5);     \r\n    vec4 col = texture2D(uSampler, newTextureCoord);\r\n    \r\n    col.rgb = col.rgb * color * lerp;\r\n    if (col.r != 0. && col.g != 0. && col.b != 0.) {\r\n       col.a = pixel.a;\r\n    }\r\n\r\n    gl_FragColor = col * pixel.a;\r\n}\r\n`;\r\n","import { burnFire } from '../glsl/fragmentshaders/fire.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterFire extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, amplitude, intensity, fireBlend, blend, anchorX, anchorY, alphaDiscard } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterFire.defaults,\r\n\t\t\tparams,\r\n\t\t);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, burnFire);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.anchor = new Float32Array([1.0, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tamplitude,\r\n\t\t\tintensity,\r\n\t\t\tfireBlend,\r\n\t\t\tblend,\r\n\t\t\tanchorX,\r\n\t\t\tanchorY,\r\n\t\t\talphaDiscard,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 150;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget amplitude() {\r\n\t\treturn this.uniforms.amplitude;\r\n\t}\r\n\r\n\tset amplitude(value) {\r\n\t\tthis.uniforms.amplitude = value;\r\n\t}\r\n\r\n\tget intensity() {\r\n\t\treturn this.uniforms.intensity;\r\n\t}\r\n\r\n\tset intensity(value) {\r\n\t\tthis.uniforms.intensity = value;\r\n\t}\r\n\r\n\tget fireBlend() {\r\n\t\treturn this.uniforms.fireBlend;\r\n\t}\r\n\r\n\tset fireBlend(value) {\r\n\t\tthis.uniforms.fireBlend = Math.floor(value);\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget anchorX() {\r\n\t\treturn this.uniforms.anchor[0];\r\n\t}\r\n\r\n\tset anchorX(value) {\r\n\t\tthis.uniforms.anchor[0] = value;\r\n\t}\r\n\r\n\tget anchorY() {\r\n\t\treturn this.uniforms.anchor[1];\r\n\t}\r\n\r\n\tset anchorY(value) {\r\n\t\tthis.uniforms.anchor[1] = value;\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterFire.defaults = {\r\n\ttime: 0,\r\n\tcolor: 0xffffff,\r\n\tamplitude: 1,\r\n\tintensity: 1,\r\n\tfireBlend: 1,\r\n\tblend: 2,\r\n\tanchorX: 1,\r\n\tanchorY: 1,\r\n\talphaDiscard: false,\r\n};\r\n","export const burnFire = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform float amplitude;\r\nuniform float intensity;\r\nuniform int fireBlend;\r\nuniform int blend;\r\nuniform bool alphaDiscard;\r\nuniform vec2 anchor;\r\nuniform vec3 color;\r\n\r\nuniform sampler2D uSampler;\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nfloat rand(vec2 n) \r\n{ \r\n\treturn fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);\r\n}\r\n\r\nvec4 blenderVec3(int blend, vec4 fColv4, vec4 sColv4)\r\n{\r\n    vec3 fCol = vec3(fColv4);\r\n    vec3 sCol = vec3(sColv4);\r\n    if ( blend == 1) { fCol = fCol * sCol; }\r\n    else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 3) { fCol = min(fCol, sCol); }\r\n    else if (blend == 4) { fCol = max(fCol, sCol); }\r\n    else if (blend == 5) { fCol = abs(fCol - sCol); }\r\n    else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); }\r\n    else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); }\r\n    else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); }\r\n    else if (blend == 11) { fCol = fCol / (1.0 - sCol); }\r\n    else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol; }\r\n    else if (blend == 13) { fCol = fCol + sCol; }\r\n    else { fCol = fCol + sCol; }\r\n    \r\n    return vec4(fCol,1.0);\r\n}\r\n\r\nfloat noise(vec2 n) \r\n{\r\n\tconst vec2 d = vec2(0.0, 1.0);\r\n\tvec2 b = floor(n);\r\n\tvec2 f = smoothstep(vec2(0.), vec2(1.0), fract(n));\r\n\treturn mix(mix(rand(b), rand(b + d.yx), f.x), \r\n\t       mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y);\r\n}\r\n\r\nfloat fbm(vec2 n) \r\n{\r\n\tfloat total = 0.0, amp = amplitude;\r\n\tfor (int i = 0; i < 7; i++) {\r\n\t\ttotal += noise(n) * amp;\r\n\t\tn += n;\r\n\t\tamp *= 0.5;\r\n\t}\r\n\treturn total;\r\n}\r\n\r\nvec4 fire() \r\n{\r\n    const vec3 c1 = vec3(0.1, 0.0, 0.);\r\n\tconst vec3 c2 = vec3(0.7, 0.0, 0.);\r\n\tconst vec3 c3 = vec3(0.2, 0.0, 0.);\r\n\tconst vec3 c4 = vec3(1.0, 0.9, 0.);\r\n\tconst vec3 c5 = vec3(0.1);\r\n\tconst vec3 c6 = vec3(0.9);\r\n    vec2 uv = vFilterCoord - anchor;\r\n\tvec2 p = uv.xy * 8.0;\r\n\tfloat q = fbm(p - time * 0.1);\r\n\tvec2 r = vec2(fbm(p + q + time * 0.7 - p.x - p.y), fbm(p + q - time * 0.4));\r\n\tvec3 c = mix(c1, c2, fbm(p + r)) + mix(c3, c4, r.x) - mix(c5, c6, r.y);\r\n\treturn vec4(c * cos(1.57/(intensity-0.03) * uv.y), 1.0);\r\n}\r\n\r\nvec4 fireBlending()\r\n{\r\n    vec4 fire = fire();\r\n    vec4 tint = vec4(color,1.0);\r\n    return blenderVec3(fireBlend,fire,tint);\r\n}\r\n\r\nvec4 resultBlending(vec4 pixel, vec4 fire)\r\n{\r\n    vec4 result = blenderVec3(blend,pixel,fire);\r\n    return result;\r\n}\r\n\r\nvoid main() \r\n{\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    if (pixel.a==0.) {\r\n       gl_FragColor = pixel;\r\n       return;\r\n    }\r\n\r\n    vec4 result = resultBlending(pixel, fireBlending())*pixel.a;\r\n    if (alphaDiscard && all(lessThanEqual(result.rgb,vec3(0.50)))) discard;\r\n\tgl_FragColor = result;\r\n}\r\n`;\r\n","import { fumes } from '../glsl/fragmentshaders/fumes.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterFumes extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, blend, dimX, dimY } = Object.assign({}, FilterFumes.defaults, params);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, fumes);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.dimensions = new Float32Array([1.0, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tblend,\r\n\t\t\tdimX,\r\n\t\t\tdimY,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 210;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget dimX() {\r\n\t\treturn this.uniforms.dimensions[0];\r\n\t}\r\n\r\n\tset dimX(value) {\r\n\t\tthis.uniforms.dimensions[0] = value;\r\n\t}\r\n\r\n\tget dimY() {\r\n\t\treturn this.uniforms.dimensions[1];\r\n\t}\r\n\r\n\tset dimY(value) {\r\n\t\tthis.uniforms.dimensions[1] = value;\r\n\t}\r\n}\r\n\r\nFilterFumes.defaults = {\r\n\ttime: 0,\r\n\tcolor: 0xffffff,\r\n\tblend: 2,\r\n\tdimX: 1,\r\n\tdimY: 1,\r\n};\r\n","export const fumes = `\r\nprecision mediump float;\r\nprecision mediump int;\r\n\r\nuniform float time;\r\nuniform vec2 dimensions;\r\nuniform int blend;\r\nuniform vec3 color;\r\nuniform sampler2D uSampler;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\n#define TWOPI 6.28318530718\r\n\r\nvec4 toGray(in vec4 color)\r\n{\r\n  float average = (color.r + color.g + color.b) * 0.33333334;\r\n  return vec4(average, average, average, 1.0);\r\n}\r\n\r\nvec4 colorize(in vec4 grayscale, in vec4 color)\r\n{\r\n    return (grayscale * color);\r\n}\r\n\r\nvec4 blenderVec3(int blend, vec4 fColv4, vec4 sColv4)\r\n{\r\n    vec3 fCol = vec3(fColv4);\r\n    vec3 sCol = vec3(sColv4);\r\n    if ( blend == 1) { fCol = fCol * sCol; }\r\n    else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 3) { fCol = min(fCol, sCol); }\r\n    else if (blend == 4) { fCol = max(fCol, sCol); }\r\n    else if (blend == 5) { fCol = abs(fCol - sCol); }\r\n    else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); }\r\n    else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); }\r\n    else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); }\r\n    else if (blend == 11) { fCol = fCol / (1.0 - sCol); }\r\n    else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol; }\r\n    else if (blend == 13) { fCol = fCol + sCol; }\r\n    else { fCol = fCol + sCol; }\r\n    \r\n    return vec4(fCol,1.0);\r\n}\r\n\r\nvec4 fog(vec2 fragCoord)\r\n{\r\n    float t = time * 0.26 + 23.0;\r\n    vec2 uv = fragCoord.xy * dimensions.xy;\r\n\r\n    vec2 p = mod(uv * TWOPI, TWOPI) - 250.0;\r\n    vec2 i = vec2(p);\r\n    float c = 0.75;\r\n    float intensity = 0.014;\r\n\r\n    for (int n = 0; n < 4; n++) {\r\n        float t = t * (1.0 - (3.5 / float(n + 1)));\r\n        i = p + vec2(cos(t - i.x) + sin(t + i.y), sin(t - i.y) + cos(t + i.x));\r\n        c += 1.0 / length(vec2(.5 * p.x / (sin(0.40 * i.x + t) / intensity), p.y / (cos(i.y + t) / intensity)));\r\n    }\r\n\r\n    c *= 0.16666667;\r\n    c = 1.17 - pow(c, 1.4);\r\n    vec3 colour = vec3(pow(abs(c), 8.0));\r\n\r\n    return vec4(colour * colour, 1.);\r\n}\r\n\r\n\r\nvoid main() \r\n{\r\n    vec4 pixel = texture2D(uSampler,vTextureCoord);\r\n\r\n    // to avoid computation on an invisible pixel.\r\n    if (pixel.a==0.) {\r\n        gl_FragColor = pixel;\r\n        return;\r\n    }\r\n\r\n    // fog generation.\r\n    vec4 fog = colorize(\r\n               toGray(\r\n                 fog(vFilterCoord.xy) \r\n               + fog(-vFilterCoord.xy * 0.65))\r\n                    ,vec4(color/3., 1.)) * 0.9;\r\n\r\n    // we put the fog and the pixel into the blender, and we serve, adjusted by the pixel alpha.\r\n\tgl_FragColor = blenderVec3(blend, fog, pixel) * pixel.a;\r\n}\r\n`;\r\n","import { seaFlood } from '../glsl/fragmentshaders/flood.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterFlood extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, scale, glint, billowy, color, shiftX, shiftY, tintIntensity } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterFlood.defaults,\r\n\t\t\tparams,\r\n\t\t);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, seaFlood);\r\n\r\n\t\tthis.uniforms.waterColor = new Float32Array([0.0, 0.18, 0.54]);\r\n\t\tthis.uniforms.shift = new Float32Array([0.0, 0.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tscale,\r\n\t\t\tglint,\r\n\t\t\tbillowy,\r\n\t\t\tcolor,\r\n\t\t\tshiftX,\r\n\t\t\tshiftY,\r\n\t\t\ttintIntensity,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 170;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.waterColor);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.waterColor);\r\n\t}\r\n\r\n\tget scale() {\r\n\t\treturn this.uniforms.scale;\r\n\t}\r\n\r\n\tset scale(value) {\r\n\t\tthis.uniforms.scale = value;\r\n\t}\r\n\r\n\tget glint() {\r\n\t\treturn this.uniforms.glint;\r\n\t}\r\n\r\n\tset glint(value) {\r\n\t\tthis.uniforms.glint = value;\r\n\t}\r\n\r\n\tget billowy() {\r\n\t\treturn this.uniforms.billowy;\r\n\t}\r\n\r\n\tset billowy(value) {\r\n\t\tthis.uniforms.billowy = value;\r\n\t}\r\n\r\n\tget tintIntensity() {\r\n\t\treturn this.uniforms.tintIntensity;\r\n\t}\r\n\r\n\tset tintIntensity(value) {\r\n\t\tthis.uniforms.tintIntensity = value;\r\n\t}\r\n\r\n\tget shiftX() {\r\n\t\treturn this.uniforms.shift[0];\r\n\t}\r\n\r\n\tset shiftX(value) {\r\n\t\tthis.uniforms.shift[0] = value;\r\n\t}\r\n\r\n\tget shiftY() {\r\n\t\tthis.uniforms.shift[1];\r\n\t}\r\n\r\n\tset shiftY(value) {\r\n\t\tthis.uniforms.shift[1] = value;\r\n\t}\r\n}\r\n\r\nFilterFlood.defaults = {\r\n\ttime: 0,\r\n\tglint: 0.5,\r\n\tscale: 70,\r\n\tbillowy: 0.5,\r\n\tcolor: 0x0020a9,\r\n\tshiftX: 0,\r\n\tshiftY: 0,\r\n\ttintIntensity: 0.2,\r\n};\r\n","export const seaFlood = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform float scale;\r\nuniform float glint;\r\nuniform float billowy;\r\nuniform float tintIntensity;\r\nuniform vec2 shift;\r\nuniform vec3 waterColor;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\nuniform sampler2D uSampler;\r\nuniform mat3 filterMatrixInverse;\r\n\r\nconst float timeSpeed = 3.;\r\n\r\n#define TWOPI 6.28318531\r\n\r\nfloat randomVal (float inVal)\r\n{\r\n    return fract(sin(mod(dot(vec2(inVal, 2523.2361) , vec2(12.9898,78.233)), TWOPI)) * 43758.5453)-0.5;\r\n}\r\n\r\nvec2 randomVec2 (float inVal)\r\n{\r\n    return normalize(vec2(randomVal(inVal), randomVal(inVal+151.523)));\r\n}\r\n\r\nfloat makeWaves(vec2 uv, float theTime, float offset)\r\n{\r\n    float result = 0.0;\r\n    float direction = 0.0;\r\n    float sineWave = 0.0;\r\n    vec2 randVec = vec2(0.0,0.0);\r\n    float i;\r\n    for(int n = 0; n < 16; n++)\r\n    {\r\n        i = float(n)+offset;\r\n        randVec = randomVec2(float(i));\r\n  \t\tdirection = (uv.x*randVec.x+uv.y*randVec.y);\r\n        sineWave = sin(mod(direction*randomVal(i+1.6516)+theTime*timeSpeed, TWOPI));\r\n        sineWave = smoothstep(0.2,1.,sineWave);\r\n    \tresult += randomVal(i+123.0)*sineWave;\r\n    }\r\n    return result;\r\n}\r\n\r\nvec4 water( vec2 fragCoord )\r\n{\r\n    vec4 fragColor;\r\n\tvec2 uv = fragCoord.xy * 0.5;\r\n    \r\n    vec2 uv2 = uv * scale;\r\n    \r\n    uv *= 2.0;\r\n\r\n    float result = 0.0;\r\n    float result2 = 0.0;\r\n    \r\n    result = makeWaves( uv2+vec2(time*timeSpeed,0.0), time, 0.1);\r\n    result2 = makeWaves( uv2-vec2(time*0.8*timeSpeed,0.0), time*0.8+1.06, 0.26);\r\n    \r\n    result *= 0.2;\r\n    \r\n    result = smoothstep(0.35,1.1,1.0-abs(result));\r\n    result2 = smoothstep(0.35,1.1,1.0-abs(result2));\r\n    \r\n    result = 2.0*smoothstep(0.35,1.8,(result+result2)*glint);\r\n\r\n    vec2 p = vec2(result, result2)*0.019 + (cos( mod(  uv*1.1 - sin(mod(uv.yx + time*timeSpeed/20., TWOPI)), TWOPI) )*0.012);\r\n    uv.x -= shift.x;\r\n    uv.y -= shift.y;\r\n    uv += p * billowy;\r\n    vec4 pixel = texture2D( uSampler , (filterMatrixInverse * vec3(uv, 1.0)).xy );\r\n\treturn (vec4(result)*0.9 + pixel)*pixel.a;\r\n}\r\n\r\nvoid main() {\r\n    vec4 water = water(vFilterCoord);\r\n    vec4 result = mix(vec4(waterColor,1.0),water,1./(tintIntensity+1.000000001))*water.a;\r\n    gl_FragColor = result;\r\n}\r\n`;\r\n","import { innerSmoke } from '../glsl/fragmentshaders/smoke.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterSmoke extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, blend, dimX, dimY } = Object.assign({}, FilterSmoke.defaults, params);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, innerSmoke);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.scale = new Float32Array([1.0, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tblend,\r\n\t\t\tdimX,\r\n\t\t\tdimY,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 200;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget dimX() {\r\n\t\treturn this.uniforms.scale[0];\r\n\t}\r\n\r\n\tset dimX(value) {\r\n\t\tthis.uniforms.scale[0] = value;\r\n\t}\r\n\r\n\tget dimY() {\r\n\t\treturn this.uniforms.scale[1];\r\n\t}\r\n\r\n\tset dimY(value) {\r\n\t\tthis.uniforms.scale[1] = value;\r\n\t}\r\n}\r\n\r\nFilterSmoke.defaults = {\r\n\ttime: 0,\r\n\tcolor: 0xffffff,\r\n\tblend: 13,\r\n\tdimX: 1,\r\n\tdimY: 1,\r\n};\r\n","export const innerSmoke = `\r\nprecision mediump float;\r\nprecision mediump int;\r\n\r\nuniform float time;\r\nuniform vec2 scale;\r\nuniform vec3 color;\r\nuniform int blend;\r\nuniform sampler2D uSampler;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\n#define F4 0.309016994374947451\r\n#define PI 3.14159\r\n#define SPEED 0.01\r\n\r\nvec4 blenderVec3(int blend, vec4 fColv4, vec4 sColv4)\r\n{\r\n    vec3 fCol = vec3(fColv4);\r\n    vec3 sCol = vec3(sColv4);\r\n    if ( blend == 1) { fCol = fCol * sCol; }\r\n    else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 3) { fCol = min(fCol, sCol); }\r\n    else if (blend == 4) { fCol = max(fCol, sCol); }\r\n    else if (blend == 5) { fCol = abs(fCol - sCol); }\r\n    else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); }\r\n    else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); }\r\n    else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); }\r\n    else if (blend == 11) { fCol = fCol / (1.0 - sCol); }\r\n    else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol; }\r\n    else if (blend == 13) { fCol = fCol + sCol; }\r\n    else { fCol = fCol + sCol; }\r\n    \r\n    return vec4(fCol,1.0);\r\n}\r\n\r\nvec4 mod289(vec4 x) \r\n{\r\n    return x - floor(x * (1.0 / 289.0)) * 289.0;\r\n}\r\n\r\nfloat mod289(float x) \r\n{\r\n    return x - floor(x * (1.0 / 289.0)) * 289.0;\r\n}\r\n\r\nvec4 permute(vec4 x) \r\n{\r\n    return mod289(((x*34.0)+1.0)*x);\r\n}\r\n\r\nfloat permute(float x) \r\n{\r\n    return mod289(((x*34.0)+1.0)*x);\r\n}\r\n\r\nvec4 taylorInvSqrt(vec4 r) \r\n{\r\n    return 1.79284291400159 - 0.85373472095314 * r;\r\n}\r\n\r\nfloat taylorInvSqrt(float r) \r\n{\r\n    return 1.79284291400159 - 0.85373472095314 * r;\r\n}\r\n\r\nvec4 grad4(float j, vec4 ip) \r\n{\r\n    const vec4 ones = vec4(1.0, 1.0, 1.0, -1.0);\r\n    vec4 p,s;\r\n\r\n    p.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0;\r\n    p.w = 1.5 - dot(abs(p.xyz), ones.xyz);\r\n    s = vec4(lessThan(p, vec4(0.0)));\r\n    p.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www;\r\n\r\n    return p;\r\n}\r\n\r\nfloat snoise(vec4 v) \r\n{\r\n    const vec4  C = vec4( 0.138196601125011,\r\n                          0.276393202250021,\r\n                          0.414589803375032,\r\n                         -0.447213595499958);\r\n\r\n    vec4 i  = floor(v + dot(v, vec4(F4)) );\r\n    vec4 x0 = v -   i + dot(i, C.xxxx);\r\n\r\n    vec4 i0;\r\n    vec3 isX = step( x0.yzw, x0.xxx );\r\n    vec3 isYZ = step( x0.zww, x0.yyz );\r\n      \r\n    i0.x = isX.x + isX.y + isX.z;\r\n    i0.yzw = 1.0 - isX;\r\n      \r\n    i0.y += isYZ.x + isYZ.y;\r\n    i0.zw += 1.0 - isYZ.xy;\r\n    i0.z += isYZ.z;\r\n    i0.w += 1.0 - isYZ.z;\r\n\r\n    vec4 i3 = clamp( i0, 0.0, 1.0 );\r\n    vec4 i2 = clamp( i0-1.0, 0.0, 1.0 );\r\n    vec4 i1 = clamp( i0-2.0, 0.0, 1.0 );\r\n\r\n    vec4 x1 = x0 - i1 + C.xxxx;\r\n    vec4 x2 = x0 - i2 + C.yyyy;\r\n    vec4 x3 = x0 - i3 + C.zzzz;\r\n    vec4 x4 = x0 + C.wwww;\r\n    \r\n    i = mod289(i);\r\n    float j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x);\r\n    vec4 j1 = permute( permute( permute( permute (\r\n                        i.w + vec4(i1.w, i2.w, i3.w, 1.0 ))\r\n                    + i.z + vec4(i1.z, i2.z, i3.z, 1.0 ))\r\n                + i.y + vec4(i1.y, i2.y, i3.y, 1.0 ))\r\n            + i.x + vec4(i1.x, i2.x, i3.x, 1.0 ));\r\n\r\n    vec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ;\r\n\r\n    vec4 p0 = grad4(j0,   ip);\r\n    vec4 p1 = grad4(j1.x, ip);\r\n    vec4 p2 = grad4(j1.y, ip);\r\n    vec4 p3 = grad4(j1.z, ip);\r\n    vec4 p4 = grad4(j1.w, ip);\r\n\r\n    vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\r\n    p0 *= norm.x;\r\n    p1 *= norm.y;\r\n    p2 *= norm.z;\r\n    p3 *= norm.w;\r\n    p4 *= taylorInvSqrt(dot(p4,p4));\r\n\r\n    vec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0);\r\n    vec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4)            ), 0.0);\r\n    m0 = m0 * m0;\r\n    m1 = m1 * m1;\r\n    return 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 )))\r\n            + dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ;\r\n\r\n}\r\n\r\nfloat surface( vec4 coord ) \r\n{\r\n\tfloat n = 0.0;\r\n\r\n\tn += 0.25 * abs( snoise( coord * 4.0 ) );\r\n\tn += 0.5 * abs( snoise( coord * 8.0 ) );\r\n\tn += 0.25 * abs( snoise( coord * 16.0 ) );\r\n\tn += 0.125 * abs( snoise( coord * 32.0 ) );\r\n\t\r\n\treturn n;\r\n}\r\n\r\nvoid main() \r\n{\r\n    vec4 pixel = texture2D(uSampler,vTextureCoord);\r\n\r\n    // to avoid computation on an invisible pixel\r\n    if (pixel.a == 0.) {\r\n        gl_FragColor = pixel;\r\n        return;\r\n    }\r\n\r\n    vec2 uv = vFilterCoord - vec2(0.375*scale.x,0.375*scale.y);\r\n    float s = uv.x * scale.x;\r\n    float t = uv.y * scale.y;\r\n    \r\n    float multiplier = 1.0 / ( 2.0 * PI );\r\n    float nx = cos( s * 2.0 * PI ) * multiplier;\r\n    float ny = cos( t * 2.0 * PI ) * multiplier;\r\n    float nz = sin( s * 2.0 * PI ) * multiplier;\r\n    float nw = sin( t * 2.0 * PI ) * multiplier;\r\n\r\n    float surf = surface( vec4( nx, ny, nz, nw ) + time * SPEED );\r\n    vec4 result = vec4( color * vec3( surf ), 1.0 );\r\n    \r\n    gl_FragColor = blenderVec3(blend,pixel,result) * pixel.a;\r\n}\r\n`;\r\n","import { forceField } from '../glsl/fragmentshaders/forcefield.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterForceField extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tlightAlpha,\r\n\t\t\tblend,\r\n\t\t\tshieldType,\r\n\t\t\tposLightX,\r\n\t\t\tposLightY,\r\n\t\t\tlightSize,\r\n\t\t\tscale,\r\n\t\t\tintensity,\r\n\t\t\tradius,\r\n\t\t\thideRadius,\r\n\t\t\tchromatic,\r\n\t\t\tdiscardThreshold,\r\n\t\t\talphaDiscard,\r\n\t\t} = Object.assign({}, FilterForceField.defaults, params);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, forceField);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.posLight = new Float32Array([1.0, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tlightAlpha,\r\n\t\t\tblend,\r\n\t\t\tshieldType,\r\n\t\t\tposLightX,\r\n\t\t\tposLightY,\r\n\t\t\tlightSize,\r\n\t\t\tscale,\r\n\t\t\tintensity,\r\n\t\t\tradius,\r\n\t\t\thideRadius,\r\n\t\t\tchromatic,\r\n\t\t\tdiscardThreshold,\r\n\t\t\talphaDiscard,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 2000;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget lightAlpha() {\r\n\t\treturn this.uniforms.lightColorAlpha;\r\n\t}\r\n\r\n\tset lightAlpha(value) {\r\n\t\tthis.uniforms.lightColorAlpha = value;\r\n\t}\r\n\r\n\tget shieldType() {\r\n\t\treturn this.uniforms.shieldType;\r\n\t}\r\n\r\n\tset shieldType(value) {\r\n\t\tthis.uniforms.shieldType = Math.floor(value);\r\n\t}\r\n\r\n\tget posLightX() {\r\n\t\treturn this.uniforms.posLight[0];\r\n\t}\r\n\r\n\tset posLightX(value) {\r\n\t\tthis.uniforms.posLight[0] = value;\r\n\t}\r\n\r\n\tget posLightY() {\r\n\t\treturn this.uniforms.posLight[1];\r\n\t}\r\n\r\n\tset posLightY(value) {\r\n\t\tthis.uniforms.posLight[1] = value;\r\n\t}\r\n\r\n\tget lightSize() {\r\n\t\treturn this.uniforms.lightSize;\r\n\t}\r\n\r\n\tset lightSize(value) {\r\n\t\tthis.uniforms.lightSize = value;\r\n\t}\r\n\r\n\tget scale() {\r\n\t\treturn this.uniforms.scale;\r\n\t}\r\n\r\n\tset scale(value) {\r\n\t\tthis.uniforms.scale = value;\r\n\t}\r\n\r\n\tget intensity() {\r\n\t\treturn this.uniforms.intensity;\r\n\t}\r\n\r\n\tset intensity(value) {\r\n\t\tthis.uniforms.intensity = value;\r\n\t}\r\n\r\n\tget radius() {\r\n\t\treturn this.uniforms.radius;\r\n\t}\r\n\r\n\tset radius(value) {\r\n\t\tthis.uniforms.radius = value;\r\n\t}\r\n\r\n\tget hideRadius() {\r\n\t\treturn this.uniforms.hideRadius;\r\n\t}\r\n\r\n\tset hideRadius(value) {\r\n\t\tthis.uniforms.hideRadius = value;\r\n\t}\r\n\r\n\tget discardThreshold() {\r\n\t\treturn this.uniforms.discardThreshold;\r\n\t}\r\n\r\n\tset discardThreshold(value) {\r\n\t\tthis.uniforms.discardThreshold = value;\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget chromatic() {\r\n\t\treturn this.uniforms.chromatic;\r\n\t}\r\n\r\n\tset chromatic(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.chromatic = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterForceField.defaults = {\r\n\ttime: 0,\r\n\tcolor: 0xbbbbbb,\r\n\tlightAlpha: 1.0,\r\n\tblend: 2,\r\n\tshieldType: 1,\r\n\tposLightX: 0.65,\r\n\tposLightY: 0.25,\r\n\tlightSize: 0.483,\r\n\tscale: 1,\r\n\tintensity: 1,\r\n\tradius: 1,\r\n\thideRadius: 0,\r\n\tchromatic: false,\r\n\tdiscardThreshold: 0.25,\r\n\talphaDiscard: false,\r\n};\r\n","export const forceField = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform int blend;\r\nuniform int shieldType;\r\nuniform vec3 color;\r\nuniform vec2 posLight;\r\nuniform vec3 ambientColor;\r\nuniform float intensity;\r\nuniform float lightColorAlpha;\r\nuniform float lightSize;\r\nuniform float scale;\r\nuniform float radius;\r\nuniform float hideRadius;\r\nuniform float discardThreshold;\r\nuniform bool chromatic;\r\nuniform bool alphaDiscard;\r\nuniform sampler2D uSampler;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\n#define SQRT5B20 0.30901699\r\n#define PI 3.14159265\r\n#define TWOPI 6.28318531\r\n#define SPEED 0.01\r\n#define MU_TWOPI 0.15915494309\r\n#define MU_289 0.00346020761\r\n#define MU_3 0.33333333334\r\n#define MU_1_5 0.66666666667\r\n\r\nvec3 hsvToRgb(vec3 hsVcolor)\r\n{\r\n    vec4 K = vec4(1., 2.0 * MU_3, 1.0 * MU_3, 3.0);\r\n    vec3 p = abs(fract(hsVcolor.xxx + K.xyz) \r\n             * 6.0 - K.www);\r\n    return hsVcolor.z \r\n           * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), hsVcolor.y);\r\n}\r\n\r\nvec3 multihue(vec2 uv) \r\n{\r\n    float h = 0.5 + atan(uv.y, uv.x) * MU_TWOPI;\r\n    vec3 hsv = vec3(h, 1., 1.);\r\n    return hsvToRgb(hsv);\r\n}\r\n\r\nfloat random(vec2 n) \r\n{ \r\n\treturn fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);\r\n}\r\n\r\nvec2 random2(vec2 p) \r\n{\r\n    return fract(sin(vec2(dot(p,vec2(127.1,311.7)),dot(p,vec2(269.5,183.3))))*43758.5453);\r\n}\r\n\r\nfloat bornedCos(float minimum, float maximum)\r\n{\r\n    return (maximum-minimum)*(cos(PI*time*0.10 + 1.)*0.5)+minimum;\r\n}\r\n\r\nfloat bornedSin(float minimum, float maximum)\r\n{\r\n    return (maximum-minimum)*(sin(PI*time*0.10 + 1.)*0.5)+minimum;\r\n}\r\n\r\nvec4 mod289(vec4 x) \r\n{\r\n    return x - floor(x * MU_289) * 289.0;\r\n}\r\n\r\nfloat mod289(float x) \r\n{\r\n    return x - floor(x * MU_289) * 289.0;\r\n}\r\n\r\nvec4 permute(vec4 x) \r\n{\r\n    return mod289(((x*34.0)+1.0)*x);\r\n}\r\n\r\nfloat permute(float x) \r\n{\r\n    return mod289(((x*34.0)+1.0)*x);\r\n}\r\n\r\nvec4 taylorInvSqrt(vec4 r) \r\n{\r\n    return 1.79284291400159 - 0.85373472095314 * r;\r\n}\r\n\r\nfloat taylorInvSqrt(float r) \r\n{\r\n    return 1.79284291400159 - 0.85373472095314 * r;\r\n}\r\n\r\nvec4 grad4(float j, vec4 ip) \r\n{\r\n    const vec4 ones = vec4(1.0, 1.0, 1.0, -1.0);\r\n    vec4 p,s;\r\n\r\n    p.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0;\r\n    p.w = 1.5 - dot(abs(p.xyz), ones.xyz);\r\n    s = vec4(lessThan(p, vec4(0.0)));\r\n    p.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www;\r\n\r\n    return p;\r\n}\r\n\r\nfloat snoise(vec4 v) \r\n{\r\n    const vec4  C = vec4( 0.138196601125011,\r\n                          0.276393202250021,\r\n                          0.414589803375032,\r\n                         -0.447213595499958);\r\n\r\n    vec4 i  = floor(v + dot(v, vec4(SQRT5B20)) );\r\n    vec4 x0 = v -   i + dot(i, C.xxxx);\r\n\r\n    vec4 i0;\r\n    vec3 isX = step( x0.yzw, x0.xxx );\r\n    vec3 isYZ = step( x0.zww, x0.yyz );\r\n      \r\n    i0.x = isX.x + isX.y + isX.z;\r\n    i0.yzw = 1.0 - isX;\r\n      \r\n    i0.y += isYZ.x + isYZ.y;\r\n    i0.zw += 1.0 - isYZ.xy;\r\n    i0.z += isYZ.z;\r\n    i0.w += 1.0 - isYZ.z;\r\n\r\n    vec4 i3 = clamp( i0, 0.0, 1.0 );\r\n    vec4 i2 = clamp( i0-1.0, 0.0, 1.0 );\r\n    vec4 i1 = clamp( i0-2.0, 0.0, 1.0 );\r\n\r\n    vec4 x1 = x0 - i1 + C.xxxx;\r\n    vec4 x2 = x0 - i2 + C.yyyy;\r\n    vec4 x3 = x0 - i3 + C.zzzz;\r\n    vec4 x4 = x0 + C.wwww;\r\n    \r\n    i = mod289(i);\r\n    float j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x);\r\n    vec4 j1 = permute( permute( permute( permute (\r\n                        i.w + vec4(i1.w, i2.w, i3.w, 1.0 ))\r\n                    + i.z + vec4(i1.z, i2.z, i3.z, 1.0 ))\r\n                + i.y + vec4(i1.y, i2.y, i3.y, 1.0 ))\r\n            + i.x + vec4(i1.x, i2.x, i3.x, 1.0 ));\r\n\r\n    vec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ;\r\n\r\n    vec4 p0 = grad4(j0,   ip);\r\n    vec4 p1 = grad4(j1.x, ip);\r\n    vec4 p2 = grad4(j1.y, ip);\r\n    vec4 p3 = grad4(j1.z, ip);\r\n    vec4 p4 = grad4(j1.w, ip);\r\n\r\n    vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\r\n    p0 *= norm.x;\r\n    p1 *= norm.y;\r\n    p2 *= norm.z;\r\n    p3 *= norm.w;\r\n    p4 *= taylorInvSqrt(dot(p4,p4));\r\n\r\n    vec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0);\r\n    vec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4)            ), 0.0);\r\n    m0 = m0 * m0;\r\n    m1 = m1 * m1;\r\n    return 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 )))\r\n            + dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ;\r\n\r\n}\r\n\r\nfloat surface( vec4 coord ) \r\n{\r\n\tfloat n = 0.0;\r\n\r\n\tn += 0.25 * abs( snoise( coord * 4.0 ) );\r\n\tn += 0.5 * abs( snoise( coord * 8.0 ) );\r\n\tn += 0.25 * abs( snoise( coord * 16.0 ) );\r\n\tn += 0.125 * abs( snoise( coord * 32.0 ) );\r\n\t\r\n\treturn n;\r\n}\r\n\r\nvec4 ambientLight(vec4 pixel, vec2 fragCoord, vec2 posLg) \r\n{\r\n  vec3 lightColor = (color+vec3(2.)) * MU_3;\r\n  vec2 position = posLg;\r\n  \r\n  float maxDistance = lightSize;\r\n  float distance = distance(fragCoord-posLg, position);\r\n  float value = 1.0 - smoothstep(-0.2, maxDistance, distance);\r\n  \r\n  vec3 ambient = pixel.rgb * color * intensity;\r\n  vec3 light = (lightColor*lightColorAlpha) * clamp(value, 0.0, 1.0);\r\n  vec3 intensity = ambient + light;\r\n  vec3 final = pixel.rgb * intensity;\r\n\r\n  return vec4(final, 1.0);\r\n}\r\n\r\nvec3 toGray(vec3 color)\r\n{\r\n  float average = (color.r + color.g + color.b)*0.3333333;\r\n  return vec3(average, average, average);\r\n}\r\n\r\nvec3 colorize(vec3 grayscale, vec3 color)\r\n{\r\n    return (grayscale * color);\r\n}\r\n\r\nvec4 blenderVec3(int blend, vec4 fColv4, vec4 sColv4)\r\n{\r\n    vec3 fCol = vec3(fColv4);\r\n    vec3 sCol = vec3(sColv4);\r\n    if ( blend == 1) { fCol = fCol * sCol; }\r\n    else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 3) { fCol = min(fCol, sCol); }\r\n    else if (blend == 4) { fCol = max(fCol, sCol); }\r\n    else if (blend == 5) { fCol = abs(fCol - sCol); }\r\n    else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); }\r\n    else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); }\r\n    else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); }\r\n    else if (blend == 11) { fCol = fCol / (1.0 - sCol + 0.00001); }\r\n    else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol + 0.00001; }\r\n    else if (blend == 13) { fCol = fCol + sCol; return vec4(fCol,0.6); }\r\n    else if (blend == 14) { return mix(fColv4,sColv4,1.-fColv4.a); }\r\n    else if (blend == 15) { return mix(fColv4,sColv4,fColv4.a); }\r\n    else { fCol = fCol + sCol; }\r\n    \r\n    return vec4(fCol,(fColv4.a+sColv4.a)*0.5);\r\n}\r\n\r\nfloat hexDist(vec2 p) \r\n{\r\n\tp = abs(p);\r\n\t\r\n    float c = dot(p, normalize(vec2(1,1.73)));\r\n    c = max(c, p.x);\r\n    \r\n    return c;\r\n}\r\n\r\nvec4 hexCoords(vec2 uv) \r\n{\r\n\tconst vec2 r = vec2(1, 1.73);\r\n    const vec2 h = r*.5;\r\n    \r\n    vec2 a = mod(uv, r)-h;\r\n    vec2 b = mod(uv-h, r)-h;\r\n    vec2 gv = dot(a, a) < dot(b,b) ? a : b;\r\n    \r\n    float x = atan(gv.x, gv.y);\r\n    float y = .65-hexDist(gv);\r\n    vec2 id = uv-gv;\r\n    return vec4(x, y, id.x,id.y);\r\n}\r\n\r\nvec4 hexa(vec2 fragCoord)\r\n{\r\n    float t = time;\r\n    \r\n    vec2 uv = fragCoord;\r\n    vec2 uv1 = uv + vec2(0, sin(uv.x*1. +t)*.25);\r\n    \r\n    vec2 uv2 = .5*uv1 + .5*uv + vec2(sin(uv.y*5. + t)*.05, 0);\r\n    float a = 1. + t*0.1;\r\n    float c = cos(a);\r\n    float s = sin(a);\r\n    uv2 *= mat2(c, -s, s, c);\r\n    \r\n    vec3 col = color;\r\n    col += (smoothstep(abs(uv2.y)*MU_1_5, 3.99, hexCoords(uv2*15.).y) * 40.*(sin(t)+1.));\r\n    col += (smoothstep(abs(uv2.x)*MU_1_5, 3.99, hexCoords(uv2*15.).y) * 40.*(cos(t)+1.));\r\n\r\n    return vec4(colorize(toGray(clamp(col,0.,2.)),color),1.);\r\n}\r\n\r\nvec4 voronoi( in vec2 x, float step1, float step2 ) \r\n{\r\n    vec2 n = floor(x);\r\n    vec2 f = fract(x);\r\n\r\n    vec2 mg, mr;\r\n    float md = 8.0;\r\n    for (int j= -1; j <= 1; j++) {\r\n        for (int i= -1; i <= 1; i++) {\r\n            vec2 g = vec2(float(i),float(j));\r\n            vec2 o = random2( n + g );\r\n            o = 0.5 + 0.5*sin( time + 6.2831*o );\r\n\r\n            vec2 r = g + o - f;\r\n            float d = dot(r,r);\r\n\r\n            if( d<md ) {\r\n                md = d;\r\n                mr = r;\r\n                mg = g;\r\n            }\r\n        }\r\n    }\r\n\r\n    md = 8.0;\r\n    for (int j= -2; j <= 1; j++) {\r\n        for (int i= -2; i <= 1; i++) {\r\n            vec2 g = mg + vec2(float(i),float(j));\r\n            vec2 o = random2( n + g );\r\n            o = 0.5 + 0.5*sin( time + 6.2831*o );\r\n\r\n            vec2 r = g + o - f;\r\n\r\n            if ( dot(mr-r,mr-r)>0.000001 ) {\r\n                md = min(md, dot( 0.6*(mr+r), normalize(r-mr) ));\r\n            }\r\n        }\r\n    }\r\n    vec3 intermediate = vec3(md, mr);\r\n    vec3 final = (intermediate.x*(0.4 + .5*sin(64.0*intermediate.x))*color);\r\n    final = mix( color, final, smoothstep( step1, step2, intermediate.x*18. ) );\r\n    return vec4(final,1.);\r\n}\r\n\r\nfloat noise(vec2 n) \r\n{\r\n\tconst vec2 d = vec2(0.0, 1.0);\r\n\tvec2 b = floor(n);\r\n\tvec2 f = smoothstep(vec2(0.), vec2(1.0), fract(n));\r\n\treturn mix(mix(random(b), random(b + d.yx), f.x), \r\n\t       mix(random(b + d.xy), random(b + d.yy), f.x), f.y);\r\n}\r\n\r\nfloat fbm(vec2 n) \r\n{\r\n\tfloat total = 0.0, amp = 1.;\r\n\tfor (int i = 0; i < 7; i++) {\r\n\t\ttotal += noise(n) * amp;\r\n\t\tn += n;\r\n\t\tamp *= 0.5;\r\n\t}\r\n\treturn total;\r\n}\r\n\r\nfloat fbm2(vec2 n) \r\n{\r\n\tfloat total = 0.0, amp = 1.;\r\n\tfor (int i = 0; i < 2; i++) {\r\n\t\ttotal += noise(n) * amp;\r\n\t\tn += n;\r\n\t\tamp *= 0.5;\r\n\t}\r\n\treturn total;\r\n}\r\n\r\nvec4 ripples(vec2 suv) \r\n{\r\n    suv.x += time*0.5;\r\n    vec3 c1 = vec3(0.);\r\n    vec3 c2 = vec3(c1);\r\n    vec3 c3 = vec3(c1);\r\n    vec3 c4 = vec3(color.r*5., color.g*3.333, color.b*2.);\r\n    vec3 c5 = vec3(c3);\r\n    vec3 c6 = vec3(c1);\r\n    vec2 p = suv;\r\n    float q = 2.*fbm2(p + time*2.);\r\n    vec2 r = vec2(fbm2(p + q + ( time  ) - p.x - p.y), fbm2(p + p + ( time )));\r\n    r.x += bornedCos(-0.3,-0.2);\r\n    r.y += 200.*bornedSin(-1.9,1.9);\r\n    \r\n    vec3 c = color * (\r\n        mix( c1, c2, fbm( p + r ) ) + mix( c3, c4, r.x ) - mix( c5, c6, r.y )\r\n    );\r\n    return vec4(c,1.);\r\n}\r\n\r\nvec4 fire(vec2 suv) \r\n{\r\n    vec3 c1 = color+vec3(0.1, 0.0, 0.)*0.666667;\r\n\tvec3 c2 = color+vec3(0.7, 0.0, 0.)*0.666667;\r\n\tvec3 c3 = color+vec3(0.2, 0.0, 0.)*0.666667;\r\n\tvec3 c4 = color+vec3(1.0, 0.9, 0.)*0.666667;\r\n\tvec3 c5 = vec3(0.1);\r\n\tvec3 c6 = vec3(0.9);\r\n    vec2 uv = suv - vec2(0.92,0.26);\r\n\tvec2 p = uv.xy * 8.0;\r\n\tfloat q = fbm(p - time * 0.1);\r\n\tvec2 r = vec2(fbm(p + q + time * 0.7 - p.x - p.y), fbm(p + q - time * 0.4));\r\n\tvec3 c = mix(c1, c2, fbm(p + r)) + mix(c3, c4, r.x) - mix(c5, c6, r.y);\r\n\treturn vec4(c * cos(1.57/(1.-0.03) * uv.y), 1.0);\r\n}\r\n\r\nvec4 surface4d(vec2 suv)\r\n{\r\n    float s = suv.x + 0.61;\r\n    float t = suv.y + 0.5;\r\n    float nx = cos( s * TWOPI ) * MU_TWOPI;\r\n    float ny = cos( t * TWOPI ) * MU_TWOPI;\r\n    float nz = sin( s * TWOPI ) * MU_TWOPI;\r\n    float nw = sin( t * TWOPI ) * MU_TWOPI;\r\n\r\n    float surf = surface( vec4( nx, ny, nz, nw ) + time * 0.03 );\r\n    return vec4( color * vec3( surf ), 1.0 );\r\n}\r\n\r\nvec4 noisy(vec2 suv)\r\n{\r\n    vec4 noiseColor;\r\n    noiseColor.rgb = (color.rgb * noise(suv + fbm(suv) + time*0.5));\r\n    noiseColor.a = 1.;\r\n    return clamp(noiseColor,0.,1.);\r\n}\r\n\r\nvec2 circuit(vec2 p) {\r\n\tp = fract(p);\r\n\tfloat r = 0.3;\r\n\tfloat v = 0.0, g = 1.0;\r\n\tfloat d;\r\n\t\r\n\tconst int iter = 7;\r\n\tfor(int i = 0; i < iter; i ++)\r\n\t{\r\n\t\td = p.x - r;\r\n\t\tg += pow(clamp(1.0 - abs(d), 0.0, 1.0), 200.0);\r\n\t\t\r\n\t\tif(d > 0.0) {\r\n\t\t\tp.x = (p.x - r) / (1.8 - r);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tp.x = p.x;\r\n\t\t}\r\n\t\tp = p.yx;\r\n\t}\r\n\tv /= float(iter);\r\n\treturn vec2(g, v);\r\n}\r\n\r\nvec4 denseSmoke(vec2 suv)\r\n{\r\n    vec4 noiseColor;\r\n    vec2 uv;\r\n    uv.x = (fbm(suv*2.)-suv.x);\r\n    uv.y = (suv.y+fbm(suv*2.));\r\n    noiseColor.rgb = (color.rgb * min(fbm(uv - time*0.5),fbm(uv)*1.5));\r\n    noiseColor.a = 1.0;\r\n    return clamp(noiseColor,0.,1.);\r\n}\r\n\r\nvec4 dancingFume(vec2 suv)\r\n{\r\n    vec4 noiseColor;\r\n    vec2 uv;\r\n    uv.x += noise(suv)+fbm(suv);\r\n    uv.y += noise(suv)+fbm(suv);\r\n    uv *= 0.5;\r\n    noiseColor.rgb = (color.rgb * fbm((uv + suv*0.15) - time));\r\n    noiseColor.a = 1.0;\r\n    return clamp(noiseColor,0.,1.);\r\n}\r\n\r\nvec4 hugeSmoke(vec2 suv)\r\n{\r\n    vec4 noiseColor;\r\n    vec2 uv;\r\n    uv.x += sin(suv.y)+fbm(suv);\r\n    uv.y += cos(suv.x)+fbm(suv);\r\n    uv *= 0.5;\r\n    noiseColor.rgb = (color.rgb * fbm((uv + suv) - time));\r\n    noiseColor.a = 1.0;\r\n    return clamp(noiseColor,0.,1.);\r\n}\r\n\r\nvec4 grid(vec2 suv)\r\n{\r\n    vec2 uv = suv + vec2(0.,-1.5);\r\n\tvec2 cid2 = floor(uv);\r\n\tfloat cid = (cid2.y + cid2.x);\r\n\r\n\tvec2 dg = circuit(uv);\r\n\tfloat d = dg.x;\r\n\tvec3 col1 = (0.5-vec3(max(min(d, 2.0) - 1., 0.))) * color * 2.;\r\n    col1.rgb = sqrt(col1.rgb*0.5);\r\n\tvec3 col2 = vec3(max(d - 1.0, 0.0)) * color * 30. ;\r\n\r\n\tfloat f = max(0.7 - mod(sin(-uv.y) - cos(-uv.x) + (time * 1.) + (dg.y * 0.2), 0.9), 0.0) * 1.;\r\n\tcol2 *= f;\r\n\r\n    return vec4(col1 + col2, 1.0);\r\n}\r\n\r\nvec4 galaxy(vec2 suv)\r\n{\r\n    vec2 uv = suv*0.166666667 \r\n        + vec2(bornedCos(0.0,0.7),\r\n               bornedSin(0.0,0.7));\r\n\r\n    float t = 0.44 * time \r\n            + (( 0.25 + 0.05 * sin( time * 0.44 )) \r\n            / ( length( uv.xy ) + 0.2 )) * 2.2;\r\n    \r\n    float si = sin( t * 1.5 );\r\n    float co = cos( t * 0.66666667 );\r\n    mat2 matrix = mat2( -co, si, si, co );\r\n    \r\n    float c;\r\n    float v1 = 0.0;\r\n    float v2 = 0.0;\r\n    vec3 uv2 = vec3( uv, 0.0 );\r\n    \r\n    for( int i = 0; i < 50; i++ ) {\r\n        float s = float( i ) * 0.035;\r\n        vec3 p = s * uv2;\r\n        p.xy *= matrix;\r\n        p += vec3( .22,.3, s - 1.5 - sin( t * 0.13 ) * 0.1 );\r\n\r\n        for( int i = 0; i < 6; i++ ) {\r\n            p = abs( p ) / dot( p, p ) - 0.659;\r\n        }\r\n\r\n        v1 += dot( p,p ) * 0.0045 * ( 1.8 + sin( length( uv.xy * 13.0 ) + 0.5 - t * 0.2 ) );\r\n        v2 += dot( p,p ) * 0.0045 * ( 1.5 + sin( length( uv.xy * 13.5 ) + 2.2 - t * 0.3 ) );\r\n        c = length( p.xy * 0.5 ) * 1.05;\r\n    }\r\n    \r\n    float len = length( uv );\r\n    v1 *= smoothstep( 0.7, 0.0, len );\r\n    v2 *= smoothstep( 0.6, 0.0, len );\r\n    \r\n    float r = clamp( c, 0.0, 1.0 );\r\n    float g = clamp( ( v1 + c ) * 0.25, 0.0, 1.0 );\r\n    float b = clamp( v2, 0.0, 1.0 );\r\n    vec3 col = color * vec3( r, g, b ) + smoothstep( 0.15, 0.0, len ) * 0.9;\r\n\r\n    return clamp(vec4( col, 1.0 ),0.,1.);\r\n}\r\n\r\nvec2 getSphere(out float alpha, out float r)\r\n{\r\n  vec2 tc = vFilterCoord.xy;\r\n  vec2 p = (-1.0 + 2. * tc) * (1.01 / radius);\r\n  r = dot(p,p);\r\n  r > 0.943 ? alpha = max(min(40.*log(1./r),1.),0.) : alpha = 1.;\r\n  float f = (1.0-sqrt(1.0-r))/(r);\r\n  vec2 uv;\r\n  uv.x = p.x*f;\r\n  uv.y = p.y*f;\r\n  return uv;\r\n}\r\n\r\nvoid computeHideAlpha(out float alpha)\r\n{\r\n  vec2 tc = vFilterCoord.xy;\r\n  vec2 p = (-1.0 + 2. * tc) * (1.01 / hideRadius);\r\n  float r = dot(p,p);\r\n  r > 0.9 ? alpha = 1.-max(min(40.*log(1./r),1.),0.) : alpha = 0.;\r\n}\r\n\r\nvoid main()\r\n{\r\n    float a, r, hideAlpha;\r\n    vec4 result;\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n\r\n    if (hideRadius > 0.) computeHideAlpha(hideAlpha);\r\n    else hideAlpha = 1.;\r\n\r\n    if (pixel.a == 0. && hideAlpha == 0.) {\r\n        discard;\r\n    }\r\n\r\n    vec2 uv = getSphere(a, r);\r\n\r\n    if (shieldType <= 1) {\r\n        result = ripples(15.*uv*scale);\r\n    } else if (shieldType == 2) {\r\n        result = hexa(uv*scale);\r\n    } else if (shieldType == 3) {\r\n        result = fire(uv/1.5*scale);\r\n    } else if (shieldType == 4) {\r\n        result = voronoi(uv*scale*3.+0.3*cos(time),0.29,0.0);\r\n    } else if (shieldType == 5) {\r\n        result = voronoi(uv*scale*3.+0.3*cos(time),0.0019,1.);\r\n    } else if (shieldType == 6) {\r\n        result = 3.*surface4d(uv*scale);\r\n    } else if (shieldType == 7) {\r\n        result = noisy(uv*20.*scale);\r\n    } else if (shieldType == 8) {\r\n        result = denseSmoke(uv*10.*scale);\r\n    } else if (shieldType == 9) {\r\n        result = dancingFume(uv*20.*scale);\r\n    } else if (shieldType == 10) {\r\n        result = hugeSmoke(uv*5.*scale);\r\n    } else if (shieldType == 11) {\r\n        result = grid(uv*5.*scale);\r\n    } else if (shieldType == 12) {\r\n        result = galaxy(uv*5.*scale);\r\n    } else if (shieldType != 1) {\r\n        result = vec4(color,1.);\r\n    }\r\n\r\n    vec4 colorized;\r\n    vec3 chromaOption;\r\n    if (chromatic) {\r\n        vec2 vHue = uv;\r\n        vHue.x -= bornedCos(-0.,+2.2);\r\n        vHue.y -= bornedSin(-0.,+2.2);\r\n        chromaOption = multihue(vHue);\r\n    } else {\r\n        chromaOption = color;\r\n    }\r\n    colorized = (vec4(\r\n                    colorize(\r\n                        toGray(result.rgb), chromaOption), result.a) + result)*0.5;\r\n    vec4 preRenderedResult = clamp(ambientLight(clamp(colorized, 0., 1.)*intensity, uv, posLight-vec2(0.5,0.5)),0.,1.);\r\n    vec4 final = vec4(preRenderedResult.rgb * hideAlpha, 1.);\r\n\r\n    if (alphaDiscard && all(lessThanEqual(final.rgb,vec3(discardThreshold)))) {\r\n        if (pixel.a == 0.) discard;\r\n        else {\r\n            gl_FragColor = pixel;\r\n            return;\r\n        }\r\n    }\r\n\r\n    gl_FragColor =\r\n            r > 1.0\r\n                ? pixel*(1.-a)\r\n                : (pixel.a < 1. \r\n                        ? mix( blenderVec3(13, pixel, final), blenderVec3(blend, pixel, final), pixel.a)\r\n                        : blenderVec3(blend, pixel, final) * a);\r\n}\r\n`;\r\n","import { mirrorImages } from '../glsl/fragmentshaders/mirrorimages.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterMirrorImages extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, blend, alphaImg, alphaChr, nbImage, ampX, ampY } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterMirrorImages.defaults,\r\n\t\t\tparams\r\n\t\t);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, mirrorImages);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tblend,\r\n\t\t\talphaImg,\r\n\t\t\talphaChr,\r\n\t\t\tnbImage,\r\n\t\t\tampX,\r\n\t\t\tampY,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 100;\r\n\t\tthis.autoFit = false;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget alphaImg() {\r\n\t\treturn this.uniforms.alphaImg;\r\n\t}\r\n\r\n\tset alphaImg(value) {\r\n\t\tthis.uniforms.alphaImg = value;\r\n\t}\r\n\r\n\tget alphaChr() {\r\n\t\treturn this.uniforms.alphaChr;\r\n\t}\r\n\r\n\tset alphaChr(value) {\r\n\t\tthis.uniforms.alphaChr = value;\r\n\t}\r\n\r\n\tget nbImage() {\r\n\t\treturn this.uniforms.nbImage;\r\n\t}\r\n\r\n\tset nbImage(value) {\r\n\t\tthis.uniforms.nbImage = Math.floor(value);\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget ampX() {\r\n\t\treturn this.uniforms.ampX;\r\n\t}\r\n\r\n\tset ampX(value) {\r\n\t\tthis.uniforms.ampX = value;\r\n\t}\r\n\r\n\tget ampY() {\r\n\t\treturn this.uniforms.ampY;\r\n\t}\r\n\r\n\tset ampY(value) {\r\n\t\tthis.uniforms.ampY = value;\r\n\t}\r\n}\r\n\r\nFilterMirrorImages.defaults = {\r\n\ttime: 0,\r\n\tblend: 4,\r\n\talphaImg: 0.5,\r\n\talphaChr: 1.0,\r\n\tnbImage: 4,\r\n\tampX: 0.15,\r\n\tampY: 0.15,\r\n};\r\n","export const mirrorImages = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform float alphaImg;\r\nuniform float alphaChr;\r\nuniform float ampX;\r\nuniform float ampY;\r\nuniform int blend;\r\nuniform int nbImage;\r\nuniform sampler2D uSampler;\r\nuniform vec4 inputClamp;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nconst float PI = 3.14159265;\r\n\r\nfloat bornedCos(float mi, float ma) {\r\n    return (ma-mi)*(cos(2.*PI*time*0.2+1.)*0.5)+mi;\r\n}\r\n\r\nfloat bornedSin(float mi, float ma) {\r\n    return (ma-mi)*(sin(2.*PI*time*0.2+1.)*0.5)+mi;\r\n}\r\n\r\nvec4 blender(int blend, vec4 fCol, vec4 sCol)\r\n{\r\n    if ( blend == 1) { fCol.rgb = fCol.rgb * sCol.rgb; }\r\n    else if (blend == 2) { fCol.rgb = (1. - (1. - fCol.rgb) * (1. - sCol.rgb)); }\r\n    else if (blend == 3) { fCol.rgb = min(fCol.rgb, sCol.rgb); }\r\n    else if (blend == 4) { fCol.rgb = max(fCol.rgb, sCol.rgb); }\r\n    else if (blend == 5) { fCol.rgb = abs(fCol.rgb - sCol.rgb); }\r\n    else if (blend == 6) { fCol.rgb = 1. - abs(1. - fCol.rgb - sCol.rgb); }\r\n    else if (blend == 7) { fCol.rgb = fCol.rgb + sCol.rgb - (2. * fCol.rgb * sCol.rgb); }\r\n    else if (blend == 8) { fCol.rgb = all(lessThanEqual(fCol.rgb, vec3(0.5, 0.5, 0.5))) ? (2. * fCol.rgb * sCol.rgb) : (1. - 2. * (1. - fCol.rgb) * (1. - sCol.rgb)); }\r\n    else if (blend == 9) { fCol.rgb = all(lessThanEqual(sCol.rgb, vec3(0.5, 0.5, 0.5))) ? (2. * fCol.rgb * sCol.rgb) : (1. - 2. * (1. - fCol.rgb) * (1. - sCol.rgb)); }\r\n    else if (blend == 10) { fCol.rgb = all(lessThanEqual(sCol.rgb, vec3(0.5, 0.5, 0.5))) ? (2. * fCol.rgb * sCol.rgb + fCol.rgb * fCol.rgb * (1. - 2. * sCol.rgb)) : sqrt(fCol.rgb) * (2. * sCol.rgb - 1.) + (2. * fCol.rgb) * (1. - sCol.rgb); }\r\n    else if (blend == 11) { fCol.rgb = fCol.rgb / (1.0 - sCol.rgb); }\r\n    else if (blend == 12) { fCol.rgb = 1.0 - (1.0 - fCol.rgb) / (sCol.rgb)+0.001; }\r\n    else if (blend == 13) { fCol.rgb = fCol.rgb + sCol.rgb; }\r\n    else if (blend == 14) { fCol.rgb = (max(fCol.rgb,sCol.rgb)-(min(fCol.rgb,sCol.rgb)))+abs(fCol.rgb-sCol.rgb);}\r\n    else { fCol.rgb = clamp(fCol.rgb + sCol.rgb,0.,1.); }\r\n\r\n    fCol.a = max(fCol.a,sCol.a);\r\n    return fCol;\r\n}\r\n\r\nvec4 renderMirror(vec2 translation, vec4 prevpix)\r\n{\r\n    vec2 displaced = vTextureCoord + translation;\r\n    return blender(blend, prevpix, \r\n                   texture2D(uSampler, clamp(displaced, inputClamp.xy, inputClamp.zw)));\r\n}\r\n\r\nvoid main() \r\n{\r\n    float x = ampX * bornedCos(0.,1.);\r\n    float y = ampY * bornedSin(0.,1.);\r\n    vec4 renderedPixel;\r\n    vec2 translation;\r\n\r\n    if (nbImage >= 1) {\r\n        translation = vec2(x,y);\r\n        renderedPixel = texture2D(uSampler, clamp(vTextureCoord + translation, inputClamp.xy, inputClamp.zw));\r\n    }\r\n    if (nbImage >= 2) {\r\n        translation = 0.90*vec2(-x,y*0.5);\r\n        renderedPixel = renderMirror(translation, renderedPixel);\r\n    }\r\n    if (nbImage >= 3) {\r\n        translation = 0.70*vec2(x,-y);\r\n        renderedPixel = renderMirror(translation, renderedPixel);\r\n    }\r\n    if (nbImage >= 4) {\r\n        translation = 0.80*vec2(-x*0.6,-y);\r\n        renderedPixel = renderMirror(translation, renderedPixel);\r\n    }\r\n    if (nbImage >= 5) {\r\n        translation = 1.20*vec2(-x,y*0.4);\r\n        renderedPixel = renderMirror(translation, renderedPixel);\r\n    }\r\n    if (nbImage >= 6) {\r\n        translation = 1.10*vec2(x,-y);\r\n        renderedPixel = renderMirror(translation, renderedPixel);\r\n    }\r\n    if (nbImage >= 7) {\r\n        translation = 0.6*vec2(-x*0.4,-y);\r\n        renderedPixel = renderMirror(translation, renderedPixel);\r\n    }\r\n    if (nbImage >= 8) {\r\n        translation = 1.3*vec2(-x,y*0.70);\r\n        renderedPixel = renderMirror(translation, renderedPixel);\r\n    }\r\n    if (nbImage >= 9) {\r\n        translation = vec2(x*0.5,y*0.85);\r\n        renderedPixel = renderMirror(translation, renderedPixel);\r\n    }\r\n    renderedPixel = renderedPixel*alphaImg;\r\n    gl_FragColor = blender(blend,texture2D(uSampler, vTextureCoord)*alphaChr , renderedPixel);\r\n}\r\n`;\r\n","import { xRay } from '../glsl/fragmentshaders/xray.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterXRays extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, divisor, intensity, blend, anchorX, anchorY, dimX, dimY } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterXRays.defaults,\r\n\t\t\tparams,\r\n\t\t);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, xRay);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 0.4, 0.1]);\r\n\t\tthis.uniforms.anchor = new Float32Array([0.5, -1.0]);\r\n\t\tthis.uniforms.dimensions = new Float32Array([1.0, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tdivisor,\r\n\t\t\tintensity,\r\n\t\t\tblend,\r\n\t\t\tanchorX,\r\n\t\t\tanchorY,\r\n\t\t\tdimX,\r\n\t\t\tdimY,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 130;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget divisor() {\r\n\t\treturn this.uniforms.divisor;\r\n\t}\r\n\r\n\tset divisor(value) {\r\n\t\tthis.uniforms.divisor = value;\r\n\t}\r\n\r\n\tget intensity() {\r\n\t\treturn this.uniforms.intensity;\r\n\t}\r\n\r\n\tset intensity(value) {\r\n\t\tthis.uniforms.intensity = value;\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget anchorX() {\r\n\t\treturn this.uniforms.anchor[0];\r\n\t}\r\n\r\n\tset anchorX(value) {\r\n\t\tthis.uniforms.anchor[0] = value;\r\n\t}\r\n\r\n\tget anchorY() {\r\n\t\treturn this.uniforms.anchor[1];\r\n\t}\r\n\r\n\tset anchorY(value) {\r\n\t\tthis.uniforms.anchor[1] = value;\r\n\t}\r\n\r\n\tget dimX() {\r\n\t\treturn this.uniforms.dimensions[0];\r\n\t}\r\n\r\n\tset dimX(value) {\r\n\t\tthis.uniforms.dimensions[0] = value;\r\n\t}\r\n\r\n\tget dimY() {\r\n\t\treturn this.uniforms.dimensions[1];\r\n\t}\r\n\r\n\tset dimY(value) {\r\n\t\tthis.uniforms.dimensions[1] = value;\r\n\t}\r\n}\r\n\r\nFilterXRays.defaults = {\r\n\ttime: 0.0,\r\n\tcolor: 0xff8010,\r\n\tdivisor: 40,\r\n\tintensity: 0.1,\r\n\tblend: 8,\r\n\tanchorX: 0.5,\r\n\tanchorY: -1.0,\r\n\tdimX: 1,\r\n\tdimY: 1,\r\n};\r\n","export const xRay = `\r\nprecision mediump float;\r\nprecision mediump int;\r\n\r\nuniform sampler2D uSampler;\r\nuniform float time;\r\nuniform float intensity;\r\nuniform float divisor;\r\nuniform int blend;\r\nuniform vec2 dimensions;\r\nuniform vec2 anchor;\r\nuniform vec3 color;\r\n\r\nvarying vec2 vFilterCoord;\r\nvarying vec2 vTextureCoord;\r\n\r\nconst float MU_TWOPI = 0.15915494309;\r\nconst float MU_PI5 = 1.59154943092;\r\nconst float MU_256 = 0.00390625;\r\n\r\nvec4 blender(int blend, vec4 fColv4, vec4 sColv4)\r\n{\r\n    vec3 fCol = vec3(fColv4);\r\n    vec3 sCol = vec3(sColv4);\r\n\r\n    if ( blend <= 1) { fCol = fCol * sCol; }\r\n    else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 3) { fCol = min(fCol, sCol); }\r\n    else if (blend == 4) { fCol = max(fCol, sCol); }\r\n    else if (blend == 5) { fCol = abs(fCol - sCol); }\r\n    else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); }\r\n    else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); }\r\n    else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); }\r\n    else if (blend == 11) { fCol = fCol / (1.0 - sCol); }\r\n    else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol; }\r\n    else if (blend == 13) { fCol = max(fCol,sCol)-(min(fCol,sCol)*0.5)+abs(fCol-sCol);}\r\n    else if (blend >= 14) { fCol = fCol + sCol; }\r\n\r\n    return vec4(fCol,fColv4.a);\r\n}\r\n\r\nvoid main() {\r\n\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    if (pixel.a==0.) {\r\n       gl_FragColor = pixel;\r\n       return;\r\n    }\r\n\r\n    vec2 uv = (vFilterCoord - anchor) / dimensions;\r\n\r\n    float len = length(uv * 0.5);\r\n   \tfloat angle = atan(uv.x, uv.y) * MU_TWOPI;\r\n    float beam = fract((angle) * divisor + sin((sqrt(len) * 0.2) - (time*0.5)));\r\n    \r\n    beam  = 2.* cos(beam * MU_PI5);\r\n    beam *= floor(fract(angle * divisor + sin(time - (len * 1.2) * 0.2)) *256.) * MU_256;\r\n    \r\n    float fractburn = fract(beam);\r\n\r\n    vec4 color1 = smoothstep(0.0, 1., (beam*(intensity*0.1) + pixel * vec4(color,1.)) / (fractburn == 0. ? fractburn+0.1 : fractburn) * 0.3 );\r\n    vec4 result = blender(blend, pixel, color1);\r\n\r\n    gl_FragColor = result*pixel.a;\r\n}\r\n`;\r\n","import { liquid } from '../glsl/fragmentshaders/liquid.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterLiquid extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, scale, intensity, blend, spectral, alphaDiscard } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterLiquid.defaults,\r\n\t\t\tparams,\r\n\t\t);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, liquid);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([0.1, 0.45, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tscale,\r\n\t\t\tintensity,\r\n\t\t\tblend,\r\n\t\t\tspectral,\r\n\t\t\talphaDiscard,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 180;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget scale() {\r\n\t\treturn this.uniforms.scale;\r\n\t}\r\n\r\n\tset scale(value) {\r\n\t\tthis.uniforms.scale = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget intensity() {\r\n\t\treturn this.uniforms.intensity;\r\n\t}\r\n\r\n\tset intensity(value) {\r\n\t\tthis.uniforms.intensity = value;\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget spectral() {\r\n\t\treturn this.uniforms.spectral;\r\n\t}\r\n\r\n\tset spectral(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.spectral = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterLiquid.defaults = {\r\n\ttime: 0.0,\r\n\tcolor: 0x0595ff,\r\n\tscale: 1,\r\n\tintensity: 5,\r\n\tblend: 4,\r\n\tspectral: false,\r\n\talphaDiscard: false,\r\n};\r\n","export const liquid = `\r\nprecision mediump float;\r\nprecision mediump int;\r\n\r\nuniform sampler2D uSampler;\r\nuniform mat3 filterMatrixInverse;\r\nuniform float time;\r\nuniform float intensity;\r\nuniform float scale;\r\nuniform int blend;\r\nuniform bool spectral;\r\nuniform bool alphaDiscard;\r\nuniform vec3 color;\r\n\r\nvarying vec2 vFilterCoord;\r\nvarying vec2 vTextureCoord;\r\n\r\n#define PI 3.14159265359\r\n\r\n#define NUM_OCTAVES 3\r\n\r\nfloat rand(vec2 n) { \r\n\treturn fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);\r\n}\r\n\r\nfloat noise(vec2 p){\r\n\tvec2 ip = floor(p);\r\n\tvec2 u = fract(p);\r\n\tu = u*u*(3.0-2.0*u);\r\n\t\r\n\tfloat res = mix(\r\n\t\tmix(rand(ip),rand(ip+vec2(1.0,0.0)),u.x),\r\n\t\tmix(rand(ip+vec2(0.0,1.0)),rand(ip+vec2(1.0,1.0)),u.x),u.y);\r\n\treturn res*res;\r\n}\r\n\r\nfloat fbm(vec2 x) {\r\n\tfloat v = 0.0;\r\n\tfloat a = 0.5;\r\n\tvec2 shift = vec2(100);\r\n    mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.50));\r\n\tfor (int i = 0; i < NUM_OCTAVES; ++i) {\r\n\t\tv += a * noise(x);\r\n\t\tx = rot * x * 2.0 + shift;\r\n\t\ta *= 0.5;\r\n\t}\r\n\treturn v;\r\n}\r\n\r\nvec4 blenderVec3(int blend, vec4 fColv4, vec3 sCol)\r\n{\r\n    vec3 fCol = vec3(fColv4);\r\n    if ( blend == 1) { fCol = fCol * sCol; }\r\n    else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 3) { fCol = min(fCol, sCol); }\r\n    else if (blend == 4) { fCol = max(fCol, sCol); }\r\n    else if (blend == 5) { fCol = abs(fCol - sCol); }\r\n    else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); }\r\n    else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); }\r\n    else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); }\r\n    else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); }\r\n    else if (blend == 11) { fCol = fCol / (1.0 - sCol + 0.00001); }\r\n    else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol + 0.00001; }\r\n    else if (blend == 13) { fCol = max(fCol,sCol)-(min(fCol,sCol)*0.5)+abs(fCol-sCol);}\r\n    else if (blend >= 14) { fCol = fCol + sCol; }\r\n    \r\n    return vec4(fCol,fColv4.a);\r\n}\r\n\r\nvoid main() {\r\n    \r\n    float distortion1 = fbm( \r\n        vec2( fbm(  vFilterCoord * 2.5 * scale + time*0.5),\r\n              fbm( (-vFilterCoord - vec2(0.01)) * 5. * scale + time*0.3333334) )\r\n                    );\r\n    \r\n    float distortion2 = fbm( \r\n        vec2( fbm( -vFilterCoord * 5. * scale + time*0.5),\r\n              fbm(  (vFilterCoord + vec2(0.01)) * 2.5 * scale + time*0.3333334) )\r\n                    );\r\n    \r\n    vec2 uv = vFilterCoord;\r\n    \r\n    uv.x += 0.8*sin(min(distortion1*0.25,distortion2*0.25));\r\n    uv.y += 0.8*cos(min(distortion1*0.25,distortion2*0.25));\r\n    uv *= 1. + 0.11*(cos(sqrt(max(distortion1, distortion2))+1.)*0.5);\r\n    uv -= vec2(0.036,0.81); \r\n\r\n    vec2 mappedCoord = (filterMatrixInverse * vec3(uv, 1.0)).xy;\r\n    \r\n    vec4 pixel = texture2D(uSampler, mappedCoord);\r\n    vec3 aColor = color;\r\n    if (alphaDiscard) aColor.rgb *= mix(distortion1,distortion2,0.5);\r\n    else aColor.rgb *= min(distortion1,distortion2);\r\n    pixel.rgb += aColor*intensity;\r\n\r\n    float a = pixel.a;\r\n\r\n    if (spectral) pixel.a = max(distortion1,distortion2)*3.75;\r\n    if (alphaDiscard && all(lessThanEqual(pixel.rgb,vec3(0.50)))) discard;\r\n\r\n    gl_FragColor = blenderVec3(blend,pixel,color*0.3333334) * min(pixel.a,a);\r\n}\r\n`;\r\n","import { magicGlow } from '../glsl/fragmentshaders/magicglow.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterGleamingGlow extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, thickness, scale, auraIntensity, subAuraIntensity, discard, threshold, auraType } =\r\n\t\t\tObject.assign({}, FilterGleamingGlow.defaults, params);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, magicGlow);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 0.4, 0.1, 1.0]);\r\n\t\tthis.uniforms.thickness = new Float32Array([0.01, 0.01]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tthickness,\r\n\t\t\tscale,\r\n\t\t\tauraIntensity,\r\n\t\t\tsubAuraIntensity,\r\n\t\t\tdiscard,\r\n\t\t\tthreshold,\r\n\t\t\tauraType,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 80;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget scale() {\r\n\t\treturn this.uniforms.scale;\r\n\t}\r\n\r\n\tset scale(value) {\r\n\t\tthis.uniforms.scale = value;\r\n\t}\r\n\r\n\tget auraIntensity() {\r\n\t\treturn this.uniforms.auraIntensity;\r\n\t}\r\n\r\n\tset auraIntensity(value) {\r\n\t\tthis.uniforms.auraIntensity = value;\r\n\t}\r\n\r\n\tget subAuraIntensity() {\r\n\t\treturn this.uniforms.subAuraIntensity;\r\n\t}\r\n\r\n\tset subAuraIntensity(value) {\r\n\t\tthis.uniforms.subAuraIntensity = value;\r\n\t}\r\n\r\n\tget threshold() {\r\n\t\treturn this.uniforms.threshold;\r\n\t}\r\n\r\n\tset threshold(value) {\r\n\t\tthis.uniforms.threshold = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget discard() {\r\n\t\treturn this.uniforms.holes;\r\n\t}\r\n\r\n\tset discard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.holes = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget auraType() {\r\n\t\treturn this.uniforms.auraType;\r\n\t}\r\n\r\n\tset auraType(value) {\r\n\t\tthis.uniforms.auraType = Math.floor(value);\r\n\t}\r\n\r\n\tapply(filterManager, input, output, clear) {\r\n\t\tthis.uniforms.thickness[0] = (this.thickness * this.targetPlaceable.worldTransform.a) / input._frame.width;\r\n\t\tthis.uniforms.thickness[1] = (this.thickness * this.targetPlaceable.worldTransform.a) / input._frame.height;\r\n\t\tsuper.apply(filterManager, input, output, clear);\r\n\t}\r\n}\r\n\r\nFilterGleamingGlow.defaults = {\r\n\ttime: 0,\r\n\tcolor: 0xff8010,\r\n\tthickness: 5,\r\n\tscale: 1,\r\n\tauraIntensity: 1,\r\n\tsubAuraIntensity: 1,\r\n\tdiscard: false,\r\n\tthreshold: 0.5,\r\n\tauraType: 1,\r\n};\r\n","export const magicGlow = `\r\nprecision mediump float;\r\n\r\nuniform sampler2D uSampler;\r\nuniform float time;\r\nuniform float scale;\r\nuniform float auraIntensity;\r\nuniform float subAuraIntensity;\r\nuniform float threshold;\r\nuniform int auraType;\r\nuniform bool holes;\r\nuniform vec2 thickness;\r\nuniform vec4 color;\r\nuniform vec4 inputSize;\r\nuniform vec4 inputClamp;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nconst int NUM_OCTAVES = 4;\r\nconst float PI = 3.14159265358;\r\nconst float TWOPI = 6.28318530717;\r\nconst float MAX_TOTAL_ALPHA = 17.2787595915;\r\n\r\nfloat rand(vec2 uv)\r\n{\r\n    return fract(sin(dot(uv.xy ,vec2(12.9898,78.233))) * 43758.5453);\r\n}\r\n\r\nfloat noise(vec2 p)\r\n{\r\n\tvec2 ip = floor(p);\r\n\tvec2 u = fract(p);\r\n\tu = u*u*(3.0-2.0*u);\r\n\t\r\n\tfloat res = mix(\r\n\t\tmix(rand(ip),rand(ip+vec2(1.0,0.0)),u.x),\r\n\t\tmix(rand(ip+vec2(0.0,1.0)),rand(ip+vec2(1.0,1.0)),u.x),u.y);\r\n\treturn res*res;\r\n}\r\n\r\nfloat fbm(vec2 x) \r\n{\r\n\tfloat v = 0.0;\r\n\tfloat a = 0.5;\r\n\tvec2 shift = vec2(100);\r\n    mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.50));\r\n\tfor (int i = 0; i < NUM_OCTAVES; ++i) {\r\n\t\tv += a * noise(x);\r\n\t\tx = rot * x * 2.0 + shift;\r\n\t\ta *= 0.5;\r\n\t}\r\n\treturn v;\r\n}\r\n\r\nvec4 outlining() \r\n{\r\n    vec4 ownColor = texture2D(uSampler, vTextureCoord);\r\n    vec4 curColor;\r\n    float maxAlpha = 0.;\r\n    vec2 displaced;\r\n    for (float angle = 0.; angle <= TWOPI; angle += 0.3141592653) {\r\n        displaced.x = vTextureCoord.x + thickness.x * cos(angle);\r\n        displaced.y = vTextureCoord.y + thickness.y * sin(angle);\r\n        curColor = texture2D(uSampler, clamp(displaced, inputClamp.xy, inputClamp.zw));\r\n        maxAlpha = max(maxAlpha, curColor.a);\r\n    }\r\n    float resultAlpha = max(maxAlpha, ownColor.a);\r\n    return vec4((ownColor.rgb + color.rgb * (1. - ownColor.a)) * resultAlpha, resultAlpha);\r\n\r\n}\r\n\r\nvec4 glowing() \r\n{\r\n\tvec2 px = inputSize.zw;\r\n\r\n    float totalAlpha = 0.0;\r\n    float outerStrength = 6.;\r\n\r\n    vec2 direction;\r\n    vec2 displaced;\r\n    vec4 curColor;\r\n\r\n    for (float angle = 0.0; angle < TWOPI; angle += 0.3141592653) {\r\n       direction = vec2(cos(angle), sin(angle)) * px;\r\n\r\n       for (float curDistance = 0.0; curDistance < 10.; curDistance++) {\r\n           displaced = clamp(vTextureCoord + direction * \r\n                   (curDistance + 1.0), inputClamp.xy, inputClamp.zw);\r\n\r\n           curColor = texture2D(uSampler, displaced);\r\n           totalAlpha += (10. - curDistance) * curColor.a;\r\n       }\r\n    }\r\n    \r\n    curColor = texture2D(uSampler, vTextureCoord);\r\n\r\n    float alphaRatio = (totalAlpha / MAX_TOTAL_ALPHA);\r\n    float outerGlowAlpha = alphaRatio * outerStrength * (1. - curColor.a);\r\n    float outerGlowStrength = min(1.0 - curColor.a, outerGlowAlpha);\r\n\r\n    vec4 outerGlowColor = (outerGlowStrength * (color.rgba*0.1) );\r\n\r\n    float resultAlpha = outerGlowAlpha;\r\n    return vec4(color.rgb * resultAlpha, resultAlpha);\r\n}\r\n\r\nvec4 ripples(vec2 suv) \r\n{\r\n    suv.x += time/2.;\r\n    vec3 c1 = ( 0.0 ) * (color.rgb*10.);\r\n    vec3 c2 = vec3(c1);\r\n    vec3 c3 = vec3(c1);\r\n    vec3 c4 = vec3( color.r*5., color.g*3.3333, color.b*2. );\r\n    vec3 c5 = vec3(c3);\r\n    vec3 c6 = vec3(c1);\r\n    vec2 p = suv;\r\n    float q = 2.*fbm(p + time*0.2);\r\n    vec2 r = vec2(fbm(p + q + ( time*0.1  ) - p.x - p.y), fbm(p + p + ( time*0.1 )));\r\n    vec3 c = color.rgb * (\r\n        mix( c1, c2, fbm( p + r ) ) + mix( c3, c4, r.x ) - mix( c5, c6, r.y )\r\n    );\r\n    return vec4(c,1.);\r\n}\r\n\r\nvec4 noisy(vec2 suv)\r\n{\r\n    vec4 noiseColor;\r\n    noiseColor.rgb = (color.rgb * noise(suv + fbm(suv) + time));\r\n    noiseColor.a = 1.;\r\n    return clamp(noiseColor,0.,1.);\r\n}\r\n\r\nvoid main(void) \r\n{\r\n\r\n    vec4 pixel = texture2D(uSampler,vTextureCoord);\r\n\r\n    if (pixel.a == 1.) {\r\n        gl_FragColor =  pixel;\r\n    } else {\r\n        vec4 glowlevel = glowing();\r\n        vec4 outlinelevel = outlining();\r\n        vec4 aura;\r\n        \r\n        if (auraType <= 1) {\r\n            aura = ripples(vFilterCoord*20.*scale);\r\n        } else {\r\n            aura = noisy(vFilterCoord*20.*scale);\r\n        }\r\n\r\n        vec4 effect;\r\n        effect = ((glowlevel*subAuraIntensity)*0.1) + ((outlinelevel*auraIntensity)*0.8);\r\n\r\n        if (effect.a >= 0.) {effect.rgb = aura.rgb*(max(effect.a,0.));}\r\n\r\n        float intensity = effect.r + effect.g + effect.b;\r\n\t    if(intensity < threshold && effect.a != 0.) {\r\n            if (holes) {discard;}\r\n            effect.rgb = (color.rgb)*(effect.a*0.5);\r\n        } \r\n\r\n        gl_FragColor =  pixel + effect * (1.-pixel.a);\r\n    }\r\n}\r\n`;\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterPixelate extends PIXI.filters.PixelateFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.enabled = false;\r\n\t\tthis.animated = {};\r\n\t\tthis.sizeX = 5;\r\n\t\tthis.sizeY = 5;\r\n\t\tthis.zOrder = 20;\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tset sizeX(value) {\r\n\t\tthis.size[0] = value;\r\n\t}\r\n\r\n\tget sizeX() {\r\n\t\treturn this.size[0];\r\n\t}\r\n\r\n\tset sizeY(value) {\r\n\t\tthis.size[1] = value;\r\n\t}\r\n\r\n\tget sizeY() {\r\n\t\treturn this.size[1];\r\n\t}\r\n}\r\n","import { spiderWeb } from '../glsl/fragmentshaders/spiderweb.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterSpiderWeb extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, anchorX, anchorY, color, thickness, div1, div2, tear, amplitude, alphaDiscard } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterSpiderWeb.defaults,\r\n\t\t\tparams,\r\n\t\t);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, spiderWeb);\r\n\r\n\t\tthis.uniforms.anchor = new Float32Array([0.5, -1.0]);\r\n\t\tthis.uniforms.color = new Float32Array([0.75, 0.75, 0.75]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tanchorX,\r\n\t\t\tanchorY,\r\n\t\t\tcolor,\r\n\t\t\tthickness,\r\n\t\t\tdiv1,\r\n\t\t\tdiv2,\r\n\t\t\ttear,\r\n\t\t\tamplitude,\r\n\t\t\talphaDiscard,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 260;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget anchorX() {\r\n\t\treturn this.uniforms.anchor[0];\r\n\t}\r\n\r\n\tset anchorX(value) {\r\n\t\tthis.uniforms.anchor[0] = value;\r\n\t}\r\n\r\n\tget anchorY() {\r\n\t\treturn this.uniforms.anchor[1];\r\n\t}\r\n\r\n\tset anchorY(value) {\r\n\t\tthis.uniforms.anchor[1] = value;\r\n\t}\r\n\r\n\tget thickness() {\r\n\t\treturn this.uniforms.thickness;\r\n\t}\r\n\r\n\tset thickness(value) {\r\n\t\tthis.uniforms.thickness = value;\r\n\t}\r\n\r\n\tget tear() {\r\n\t\treturn this.uniforms.tear;\r\n\t}\r\n\r\n\tset tear(value) {\r\n\t\tthis.uniforms.tear = value;\r\n\t}\r\n\r\n\tget amplitude() {\r\n\t\treturn this.uniforms.amplitude;\r\n\t}\r\n\r\n\tset amplitude(value) {\r\n\t\tthis.uniforms.amplitude = value;\r\n\t}\r\n\r\n\tget div1() {\r\n\t\treturn this.uniforms.div1;\r\n\t}\r\n\r\n\tset div1(value) {\r\n\t\tthis.uniforms.div1 = value;\r\n\t}\r\n\r\n\tget div2() {\r\n\t\treturn this.uniforms.div2;\r\n\t}\r\n\r\n\tset div2(value) {\r\n\t\tthis.uniforms.div2 = value;\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterSpiderWeb.defaults = {\r\n\ttime: 0.0,\r\n\tanchorX: 0.5,\r\n\tanchorY: 0.5,\r\n\tcolor: 0xbbbbbb,\r\n\tthickness: 1,\r\n\tdiv1: 10,\r\n\tdiv2: 10,\r\n\ttear: 0.54,\r\n\tamplitude: 0.8,\r\n\talphaDiscard: false,\r\n};\r\n","export const spiderWeb = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform float thickness;\r\nuniform float div1;\r\nuniform float div2;\r\nuniform float tear;\r\nuniform float amplitude;\r\nuniform bool alphaDiscard;\r\nuniform vec2 anchor;\r\nuniform vec3 color;\r\nuniform sampler2D uSampler;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nconst float PI = 3.14159265358;\r\n\r\nfloat random(vec2 n) \r\n{ \r\n\treturn fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);\r\n}\r\n\r\nfloat noise(vec2 n) \r\n{\r\n\tconst vec2 d = vec2(0., 1.0);\r\n\tvec2 b = floor(n);\r\n\tvec2 f = smoothstep(vec2(0.), vec2(1.0), fract(n));\r\n\treturn mix(mix(random(b), random(b + d.yx), f.x), \r\n\t       mix(random(b + d.xy), random(b + d.yy), f.x), f.y);\r\n}\r\n\r\nfloat fbm(vec2 n) \r\n{\r\n\tfloat total = 0.0, amp = amplitude;\r\n\tfor (int i = 0; i < 2; i++) {\r\n\t\ttotal += noise(n) * amp;\r\n\t\tn += n;\r\n\t\tamp *= 0.5;\r\n\t}\r\n\treturn total;\r\n}\r\n\r\nvec4 spiderweb()\r\n{\r\n    vec2 coord = vFilterCoord.xy + anchor;\r\n\r\n    float t = floor(time * 0.01) * 7.3962;\r\n\r\n    vec2 sc = (coord.xy - 1.) * 0.5;\r\n    float phi = atan(sc.y, sc.x + 1e-6);\r\n    vec2 pc = vec2(fract(phi / (PI * 2.)), length(sc));\r\n    \r\n    float h_divnum = div1;\r\n    float s_divnum = div2;\r\n    \r\n    float ddth = fbm(vec2(pc.x*h_divnum,pc.x*20.*pow(length(sc*0.5),2.))*3.);\r\n    \r\n    float h_rand = 0.3+0.0895*(0.1*cos(time)+010.9)*tear;\r\n    float s_rand = .355*(0.2*cos(time)+1.);\r\n    \r\n    float l = pc.y+ cos(ddth*0.5) * (h_rand - 0.4) + ddth*(s_rand - 0.5)*0.2;\r\n    \r\n    float ts = 0.05;\r\n    float a = smoothstep(abs(sin(( pc.x*PI*2.  )  * s_divnum) ),-.1,thickness * ts );\r\n    float b = smoothstep(abs(sin(( pc.y*PI*2. + h_rand + l)  * h_divnum ) ),-.1,thickness * ts );\r\n    float s = a*b*2.;\r\n    float m = alphaDiscard ? 1. : 2.25;\r\n    return vec4(color.rgb*m,2.)-vec4(s,s,s,1.);\r\n}\r\n\r\nvoid main() \r\n{\r\n    vec4 pixel = texture2D(uSampler,vTextureCoord);\r\n    vec4 result = max(spiderweb(),pixel)*pixel.a;\r\n    if (alphaDiscard && result.rgb == vec3(0.)) discard;\r\n    gl_FragColor = result;\r\n}\r\n`;\r\n","export const solarRipples = `\r\nprecision mediump float;\r\nprecision mediump int;\r\n\r\nuniform vec3 color;\r\nuniform float time;\r\nuniform float amplitude;\r\nuniform float intensity;\r\nuniform bool alphaDiscard;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\nuniform sampler2D uSampler;\r\n\r\n#define PI 3.14159265\r\n#define OCTAVES 3\r\n\r\nfloat random(vec2 n) \r\n{ \r\n\treturn fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);\r\n}\r\n\r\nfloat bornedCos(float minimum, float maximum)\r\n{\r\n    return (maximum-minimum)*(cos(2.*PI*time*0.05 + 1.)*0.5)+minimum;\r\n}\r\n\r\nfloat bornedSin(float minimum, float maximum)\r\n{\r\n    return (maximum-minimum)*(sin(2.*PI*time*0.05 + 1.)*0.5)+minimum;\r\n}\r\n\r\nfloat noise(vec2 n) \r\n{\r\n\tconst vec2 d = vec2(0.0, 1.0);\r\n\tvec2 b = floor(n);\r\n\tvec2 f = smoothstep(vec2(0.), vec2(1.0), fract(n));\r\n\treturn mix(mix(random(b), random(b + d.yx), f.x), \r\n\t       mix(random(b + d.xy), random(b + d.yy), f.x), f.y);\r\n}\r\n\r\nfloat fbm(vec2 n) \r\n{\r\n\tfloat total = 0.0, amp = amplitude;\r\n\tfor (int i = 0; i < OCTAVES; i++) {\r\n\t\ttotal += noise(n) * amp;\r\n\t\tn += n;\r\n\t\tamp *= 0.5;\r\n\t}\r\n\treturn total;\r\n}\r\n\r\nvec4 ripples(vec2 suv) \r\n{\r\n    suv.x += time*0.5;\r\n    vec3 c1 = color*intensity;\r\n    vec3 c2 = vec3(0.);\r\n    vec3 c3 = vec3(c1);\r\n    vec3 c4 = vec3(color.r*3.333, color.g*3.333, color.b*3.333);\r\n    vec3 c5 = vec3(c3);\r\n    vec3 c6 = vec3(c1);\r\n    vec2 p = suv;\r\n    float q = 2. * fbm(p + time * 2.);\r\n    vec2 r = vec2(fbm(p + q + ( time  ) - p.x - p.y), fbm(p + p + ( time )));\r\n    r.x += bornedCos(-0.3,-0.2);\r\n    r.y += 200.*bornedSin(-1.9,1.9);\r\n    \r\n    vec3 c = color * (\r\n        mix( c1, c2, fbm( p + r ) ) + mix( c3, c4, r.x ) - mix( c5, c6, r.y )\r\n    );\r\n    return vec4(c,1.);\r\n}\r\n\r\nvoid main() {\r\n\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    if (pixel.a==0.) {\r\n       gl_FragColor = pixel;\r\n       return;\r\n    }\r\n\r\n    vec4 result = max(ripples(15.* vFilterCoord),pixel);\r\n    if (alphaDiscard && all(lessThanEqual(result.rgb,vec3(0.40)))) discard;\r\n    gl_FragColor = result*pixel.a;\r\n}\r\n`;\r\n","import { solarRipples } from '../glsl/fragmentshaders/ripples.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterSolarRipples extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, amplitude, intensity, alphaDiscard, _octaves } = Object.assign(\r\n\t\t\t{},\r\n\t\t\tFilterSolarRipples.defaults,\r\n\t\t\tparams,\r\n\t\t);\r\n\r\n\t\tif (typeof _octaves !== 'number') _octaves = FilterSolarRipples.defaults._octave;\r\n\t\tlet fragment = solarRipples.replace(`#define OCTAVES 3`, `#define OCTAVES ${_octaves}`);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, fragment);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([0.75, 0.75, 0.75]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tamplitude,\r\n\t\t\tintensity,\r\n\t\t\talphaDiscard,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 250;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget amplitude() {\r\n\t\treturn this.uniforms.amplitude;\r\n\t}\r\n\r\n\tset amplitude(value) {\r\n\t\tthis.uniforms.amplitude = value;\r\n\t}\r\n\r\n\tget intensity() {\r\n\t\treturn this.uniforms.intensity;\r\n\t}\r\n\r\n\tset intensity(value) {\r\n\t\tthis.uniforms.intensity = value;\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterSolarRipples.defaults = {\r\n\ttime: 0.0,\r\n\tcolor: 0xbbbbbb,\r\n\tamplitude: 1,\r\n\tintensity: 0.001,\r\n\talphaDiscard: false,\r\n\t_octave: 3,\r\n};\r\n","import { globes } from '../glsl/fragmentshaders/globes.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterGlobes extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, color, scale, distortion, alphaDiscard } = Object.assign({}, FilterGlobes.defaults, params);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, globes);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([0.75, 0.75, 0.75]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tscale,\r\n\t\t\tdistortion,\r\n\t\t\talphaDiscard,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 270;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget scale() {\r\n\t\treturn this.uniforms.scale;\r\n\t}\r\n\r\n\tset scale(value) {\r\n\t\tthis.uniforms.scale = value;\r\n\t}\r\n\r\n\tget distortion() {\r\n\t\treturn this.uniforms.distortion;\r\n\t}\r\n\r\n\tset distortion(value) {\r\n\t\tthis.uniforms.distortion = value;\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterGlobes.defaults = {\r\n\ttime: 0.0,\r\n\tcolor: 0xaa3050,\r\n\tscale: 20,\r\n\tdistortion: 0.25,\r\n\talphaDiscard: false,\r\n};\r\n","export const globes = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform float scale;\r\nuniform float distortion;\r\nuniform bool alphaDiscard;\r\nuniform vec3 color;\r\nuniform sampler2D uSampler;\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nconst float PI = 3.14159265358;\r\n\r\nfloat rand(vec2 c)\r\n{\r\n\treturn fract( sin( dot( c.xy, vec2( 12.9898, 78.233 ) ) ) * 43758.5453 );\r\n}\r\n\r\nvec2 rand2(vec2 st)\r\n{\r\n    st = vec2( dot(st,vec2(127.1,311.7)),\r\n              dot(st,vec2(269.5,183.3)) );\r\n    return -1.0 + 2.0*fract(cos(st)*43758.5453123);\r\n}\r\n\r\nvec3 toGray(vec3 color)\r\n{\r\n  float average = (color.r + color.g + color.b)*0.3333333;\r\n  return vec3(average, average, average);\r\n}\r\n\r\nvec3 colorize(vec3 grayscale, vec3 color)\r\n{\r\n    return (grayscale * color);\r\n}\r\n\r\nfloat noise (vec2 st) \r\n{\r\n    vec2 i = floor(st);\r\n    vec2 f = fract(st);\r\n\r\n    vec2 u = f*f*(3.0-2.0*f);\r\n\r\n    return mix( mix( dot( rand2(i + vec2(0.0,0.0) ), f - vec2(0.0,0.0) ),\r\n                     dot( rand2(i + vec2(1.0,0.0) ), f - vec2(1.0,0.0) ), u.x),\r\n                mix( dot( rand2(i + vec2(0.0,1.0) ), f - vec2(0.0,1.0) ),\r\n                     dot( rand2(i + vec2(1.0,1.0) ), f - vec2(1.0,1.0) ), u.x), u.y);\r\n}\r\n\r\nfloat circle(vec2 pos, float radius, float glow)\r\n{\r\n    float sdf = length(pos);\r\n    sdf = smoothstep(radius-0.700,radius,sdf);\r\n    float circles = 1.0 - smoothstep(0.0,1.0,sdf*1.280);\r\n    float glows = exp(-sdf*4.496) * glow * (3.0 - circles);\r\n    return circles+glows;\r\n}\r\n\r\nvec4 globes()\r\n{\r\n    vec2 st = (vFilterCoord - 0.5);\r\n    st *= scale;\r\n    vec2 uv = st;\r\n    float noisest = noise(vec2(uv.x - time,uv.y - time));\r\n    uv += noisest*distortion;\r\n    uv -= vec2( noise(vec2(time)*0.2)*4.0,-time*0.01);\r\n    \r\n    vec3 color = vec3(0.);\r\n    \r\n    \r\n    vec2 pos = fract(uv)-0.5;\r\n    vec2 id = floor(uv);\r\n\r\n    \r\n    for(int y = -1; y <= 1; y++){\r\n        for(int x = -1; x <= 1; x++){\r\n            vec2 neighbour = vec2(x,y);\r\n            vec2 rand2 = rand2(id+neighbour);\r\n            float a = noise(rand2+time*2.8);\r\n            vec2 offset = 0.5*(sin(time + rand2*5.28))*2.2;\r\n            float size = rand(id+neighbour)*0.75 + a*0.15;\r\n            color += circle(pos-neighbour+offset,size,size*1.400)*0.143 * vec3(rand2.x*7.884,7.2,rand2.y*6.832);\r\n        }\r\n    }\r\n    \r\n    return vec4(color,1.0);\r\n}\r\n\r\nvoid main() {\r\n    vec4 pixel = texture2D(uSampler,vTextureCoord);\r\n\r\n    vec4 tinyGlobes = vec4(colorize(toGray(globes().rgb*1.5),color*1.5),1.);\r\n\r\n    bool belowThreshold = all(lessThanEqual(tinyGlobes.rgb,vec3(0.6)));\r\n    if (alphaDiscard && belowThreshold) discard;\r\n    else if (belowThreshold) tinyGlobes = pixel;\r\n\r\n    gl_FragColor = max(tinyGlobes,pixel)*pixel.a;\r\n}\r\n`;\r\n","import { matrix } from '../glsl/fragmentshaders/matrix.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterTransform extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet {\r\n\t\t\trotation,\r\n\t\t\ttwRadiusPercent,\r\n\t\t\ttwAngle,\r\n\t\t\ttwRotation,\r\n\t\t\tbpRadiusPercent,\r\n\t\t\tbpStrength,\r\n\t\t\tscale,\r\n\t\t\tscaleX,\r\n\t\t\tscaleY,\r\n\t\t\tpivotX,\r\n\t\t\tpivotY,\r\n\t\t\ttranslationX,\r\n\t\t\ttranslationY,\r\n\t\t} = Object.assign({}, FilterTransform.defaults, params);\r\n\r\n\t\tsuper(customVertex2D, matrix);\r\n\r\n\t\tthis.uniforms.scale = new Float32Array([1.0, 1.0]);\r\n\t\tthis.uniforms.pivot = new Float32Array([0.5, 0.5]);\r\n\t\tthis.uniforms.translation = new Float32Array([0.0, 0.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\trotation,\r\n\t\t\ttwRadiusPercent,\r\n\t\t\ttwAngle,\r\n\t\t\ttwRotation,\r\n\t\t\tbpRadiusPercent,\r\n\t\t\tbpStrength,\r\n\t\t\tscale,\r\n\t\t\tscaleX,\r\n\t\t\tscaleY,\r\n\t\t\tpivotX,\r\n\t\t\tpivotY,\r\n\t\t\ttranslationX,\r\n\t\t\ttranslationY,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 1000;\r\n\t\tthis.autoFit = false;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget rotation() {\r\n\t\treturn this.uniforms.rotation;\r\n\t}\r\n\r\n\tset rotation(value) {\r\n\t\tthis.uniforms.rotation = value;\r\n\t}\r\n\r\n\tget twRadiusPercent() {\r\n\t\treturn this.uniforms.twRadius * 200;\r\n\t}\r\n\r\n\tset twRadiusPercent(value) {\r\n\t\tthis.uniforms.twRadius = value / 200;\r\n\t}\r\n\r\n\tget twAngle() {\r\n\t\treturn this.uniforms.twAngle;\r\n\t}\r\n\r\n\tset twAngle(value) {\r\n\t\tthis.uniforms.twAngle = value;\r\n\t}\r\n\r\n\tget twRotation() {\r\n\t\treturn this.uniforms.twAngle * (180 / Math.PI);\r\n\t}\r\n\r\n\tset twRotation(value) {\r\n\t\tthis.uniforms.twAngle = value * (Math.PI / 180);\r\n\t}\r\n\r\n\tget bpRadiusPercent() {\r\n\t\treturn this.uniforms.bpRadius * 200;\r\n\t}\r\n\r\n\tset bpRadiusPercent(value) {\r\n\t\tthis.uniforms.bpRadius = value / 200;\r\n\t}\r\n\r\n\tget bpStrength() {\r\n\t\treturn this.uniforms.bpStrength;\r\n\t}\r\n\r\n\tset bpStrength(value) {\r\n\t\tthis.uniforms.bpStrength = value;\r\n\t}\r\n\r\n\tget scale() {\r\n\t\t// a little hack (we get only x)\r\n\t\treturn this.uniforms.scale[0];\r\n\t}\r\n\r\n\tset scale(value) {\r\n\t\tthis.uniforms.scale[1] = this.uniforms.scale[0] = value;\r\n\t}\r\n\r\n\tget scaleX() {\r\n\t\treturn this.uniforms.scale[0];\r\n\t}\r\n\r\n\tset scaleX(value) {\r\n\t\tthis.uniforms.scale[0] = value;\r\n\t}\r\n\r\n\tget scaleY() {\r\n\t\treturn this.uniforms.scale[1];\r\n\t}\r\n\r\n\tset scaleY(value) {\r\n\t\tthis.uniforms.scale[1] = value;\r\n\t}\r\n\r\n\tget pivotX() {\r\n\t\treturn this.uniforms.pivot[0];\r\n\t}\r\n\r\n\tset pivotX(value) {\r\n\t\tthis.uniforms.pivot[0] = value;\r\n\t}\r\n\r\n\tget pivotY() {\r\n\t\treturn this.uniforms.pivot[1];\r\n\t}\r\n\r\n\tset pivotY(value) {\r\n\t\tthis.uniforms.pivot[1] = value;\r\n\t}\r\n\r\n\tget translationX() {\r\n\t\treturn this.uniforms.translation[0];\r\n\t}\r\n\r\n\tset translationX(value) {\r\n\t\tthis.uniforms.translation[0] = value;\r\n\t}\r\n\r\n\tget translationY() {\r\n\t\treturn this.uniforms.translation[1];\r\n\t}\r\n\r\n\tset translationY(value) {\r\n\t\tthis.uniforms.translation[1] = value;\r\n\t}\r\n}\r\n\r\nFilterTransform.defaults = {\r\n\trotation: 0.0,\r\n\ttwRadiusPercent: 0,\r\n\ttwAngle: 0,\r\n\tbpRadiusPercent: 0,\r\n\tbpStrength: 0,\r\n\tscaleX: 1,\r\n\tscaleY: 1,\r\n\tpivotX: 0.5,\r\n\tpivotY: 0.5,\r\n\ttranslationX: 0,\r\n\ttranslationY: 0,\r\n};\r\n","export const matrix = `\r\nprecision mediump float;\r\n\r\nuniform float rotation;\r\nuniform float twRadius;\r\nuniform float twAngle;\r\nuniform float bpRadius;\r\nuniform float bpStrength;\r\nuniform vec2 scale;\r\nuniform vec2 translation;\r\nuniform vec2 pivot;\r\nuniform vec4 inputClamp;\r\nuniform sampler2D uSampler;\r\nuniform mat3 filterMatrixInverse;\r\n\r\nvarying vec2 vFilterCoord;\r\n\r\nconst float PI = 3.1415927;\r\n\r\nvec2 morphing(in vec2 uv) {\r\n    float dist = length(uv);\r\n\r\n    // twist effect\r\n    if (dist < twRadius) {\r\n        float ratioDist = (twRadius - dist) / twRadius;\r\n        float angleMod = ratioDist * ratioDist * twAngle;\r\n        float s = sin(angleMod);\r\n        float c = cos(angleMod);\r\n        uv = vec2(uv.x * c - uv.y * s, uv.x * s + uv.y * c);\r\n    }\r\n\r\n    // bulge pinch effect\r\n    if (dist < bpRadius) {\r\n        float percent = dist / bpRadius;\r\n        if (bpStrength > 0.) {\r\n            uv *= mix(1.0, smoothstep(0., bpRadius / dist, percent), bpStrength * 0.75);\r\n        } else {\r\n            uv *= mix(1.0, pow(percent, 1.0 + bpStrength * 0.75) * bpRadius / dist, 1.0 - percent);\r\n        }\r\n    }\r\n\r\n    return uv;\r\n}\r\n\r\nvec2 transform(in vec2 uv) {\r\n    float angle = -(PI * rotation * 0.005555555555);\r\n    uv -= pivot;\r\n    uv *= mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\r\n    uv *= mat2(scale.x, 0.0, 0.0, scale.y);\r\n    uv = morphing(uv);\r\n    uv += pivot;\r\n\r\n    return uv;\r\n}\r\n\r\nvoid main() {\r\n    vec2 uv = vFilterCoord + translation;\r\n    uv = transform(uv);\r\n    vec2 mappedCoord = (filterMatrixInverse * vec3(uv, 1.0)).xy;\r\n    vec4 pixel = texture2D(uSampler,clamp(mappedCoord, inputClamp.xy, inputClamp.zw));\r\n    gl_FragColor = pixel;\r\n}\r\n`;\r\n","import { splash } from '../glsl/fragmentshaders/splash.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterSplash extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { time, seed, spread, splashFactor, color, dimX, dimY, blend, cut, textureAlphaBlend, anchorX, anchorY } =\r\n\t\t\tObject.assign({}, FilterSplash.defaults, params);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, splash);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 0.05, 0.05]);\r\n\t\tthis.uniforms.dimensions = new Float32Array([1.0, 1.0]);\r\n\t\tthis.uniforms.anchor = new Float32Array([0.0, 0.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tseed,\r\n\t\t\tspread,\r\n\t\t\tsplashFactor,\r\n\t\t\tcolor,\r\n\t\t\tdimX,\r\n\t\t\tdimY,\r\n\t\t\tblend,\r\n\t\t\tcut,\r\n\t\t\ttextureAlphaBlend,\r\n\t\t\tanchorX,\r\n\t\t\tanchorY,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 5;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget seed() {\r\n\t\treturn this.uniforms.seed;\r\n\t}\r\n\r\n\tset seed(value) {\r\n\t\tthis.uniforms.seed = value;\r\n\t}\r\n\r\n\tget spread() {\r\n\t\treturn this.uniforms.spread;\r\n\t}\r\n\r\n\tset spread(value) {\r\n\t\tthis.uniforms.spread = value;\r\n\t}\r\n\r\n\tget splashFactor() {\r\n\t\treturn this.uniforms.splashFactor;\r\n\t}\r\n\r\n\tset splashFactor(value) {\r\n\t\tthis.uniforms.splashFactor = value;\r\n\t}\r\n\r\n\tget dimX() {\r\n\t\treturn this.uniforms.dimensions[0];\r\n\t}\r\n\r\n\tset dimX(value) {\r\n\t\tthis.uniforms.dimensions[0] = value;\r\n\t}\r\n\r\n\tget dimY() {\r\n\t\treturn this.uniforms.dimensions[1];\r\n\t}\r\n\r\n\tset dimY(value) {\r\n\t\tthis.uniforms.dimensions[1] = value;\r\n\t}\r\n\r\n\tget anchorY() {\r\n\t\treturn this.uniforms.anchor[1] + 0.5;\r\n\t}\r\n\r\n\tset anchorY(value) {\r\n\t\tthis.uniforms.anchor[1] = value - 0.5;\r\n\t}\r\n\r\n\tget anchorX() {\r\n\t\treturn this.uniforms.anchor[0] + 0.5;\r\n\t}\r\n\r\n\tset anchorX(value) {\r\n\t\tthis.uniforms.anchor[0] = value - 0.5;\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget cut() {\r\n\t\treturn this.uniforms.cut;\r\n\t}\r\n\r\n\tset cut(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.cut = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget textureAlphaBlend() {\r\n\t\treturn this.uniforms.textureAlphaBlend;\r\n\t}\r\n\r\n\tset textureAlphaBlend(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.textureAlphaBlend = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterSplash.defaults = {\r\n\ttime: Math.random() * 2000,\r\n\tcolor: 0xf00505,\r\n\tseed: 0.1,\r\n\tspread: 5,\r\n\tsplashFactor: 2,\r\n\tdimX: 1,\r\n\tdimY: 1,\r\n\tblend: 8,\r\n\tcut: false,\r\n\ttextureAlphaBlend: false,\r\n\tanchorX: 0.5,\r\n\tanchorY: 0.5,\r\n};\r\n","export const splash = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform float seed;\r\nuniform float spread;\r\nuniform float splashFactor;\r\nuniform int blend;\r\nuniform vec2 dimensions;\r\nuniform vec2 anchor;\r\nuniform vec3 color;\r\nuniform bool cut;\r\nuniform bool textureAlphaBlend;\r\nuniform sampler2D uSampler;\r\n\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nfloat random(vec2 n) \r\n{ \r\n\treturn fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);\r\n}\r\n\r\nvec4 blender(int blend, vec4 fCol, vec4 sCol)\r\n{\r\n    if ( blend == 1) { fCol.rgb = fCol.rgb * sCol.rgb; }\r\n    else if (blend == 2) { fCol.rgb = (1. - (1. - fCol.rgb) * (1. - sCol.rgb)); }\r\n    else if (blend == 3) { fCol.rgb = min(fCol.rgb, sCol.rgb); }\r\n    else if (blend == 4) { fCol.rgb = max(fCol.rgb, sCol.rgb); }\r\n    else if (blend == 5) { fCol.rgb = abs(fCol.rgb - sCol.rgb); }\r\n    else if (blend == 6) { fCol.rgb = 1. - abs(1. - fCol.rgb - sCol.rgb); }\r\n    else if (blend == 7) { fCol.rgb = fCol.rgb + sCol.rgb - (2. * fCol.rgb * sCol.rgb); }\r\n    else if (blend == 8) { fCol.rgb = all(lessThanEqual(fCol.rgb, vec3(0.5, 0.5, 0.5))) ? (2. * fCol.rgb * sCol.rgb) : (1. - 2. * (1. - fCol.rgb) * (1. - sCol.rgb)); }\r\n    else if (blend == 9) { fCol.rgb = all(lessThanEqual(sCol.rgb, vec3(0.5, 0.5, 0.5))) ? (2. * fCol.rgb * sCol.rgb) : (1. - 2. * (1. - fCol.rgb) * (1. - sCol.rgb)); }\r\n    else if (blend == 10) { fCol.rgb = all(lessThanEqual(sCol.rgb, vec3(0.5, 0.5, 0.5))) ? (2. * fCol.rgb * sCol.rgb + fCol.rgb * fCol.rgb * (1. - 2. * sCol.rgb)) : sqrt(fCol.rgb) * (2. * sCol.rgb - 1.) + (2. * fCol.rgb) * (1. - sCol.rgb); }\r\n    else if (blend == 11) { fCol.rgb = fCol.rgb / (1.0 - sCol.rgb); }\r\n    else if (blend == 12) { fCol.rgb = 1.0 - (1.0 - fCol.rgb) / (sCol.rgb)+0.001; }\r\n    else if (blend == 13) { fCol.rgb = fCol.rgb + sCol.rgb; }\r\n    else if (blend == 14) { fCol.rgb = (max(fCol.rgb,sCol.rgb)-(min(fCol.rgb,sCol.rgb)))+abs(fCol.rgb-sCol.rgb);}\r\n    else { fCol.rgb = clamp(fCol.rgb + sCol.rgb,0.,1.); }\r\n\r\n    fCol.a = max(fCol.a,sCol.a);\r\n    return fCol;\r\n}\r\n\r\nvec3 splash(vec2 g)\r\n{\r\n\tvec2 uv = (12.*(2.*g-1.)*.2) / dimensions;\r\n\r\n    float a = abs(atan(uv.x,uv.y) * splashFactor);   \r\n\tvec3 iuv = vec3(uv.x,uv.y,a);\r\n\r\n\tfloat cseed = sin(1.+fract(abs(random(vec2(seed*0.9854,seed*0.3541)))));\r\n    vec3 uvw = iuv;\r\n\r\n\tiuv = 1. - abs(1. - mod(uvw - time*0.1, 2.));\r\n\t\r\n    float initLen = length(iuv);\r\n    float nLen = initLen;\r\n    float tot = 0.;\r\n    \r\n    for (int i=0; i < 12; i++) \r\n\t{\r\n\t\tiuv = abs(iuv) / (initLen*initLen) - cseed;\r\n\t\tnLen = length(iuv);\r\n\t\ttot += abs(nLen-initLen);\r\n\t\tinitLen = nLen;\r\n    }\r\n    \r\n    float fc = tot + 1.0;\r\n\tfc = 1.-smoothstep(fc, fc+1.9, spread/dot(uv,uv));\r\n\t\r\n\treturn vec3(1.-fc)*color;\r\n}\r\n\r\nvoid main() {\r\n    vec4 pixel = texture2D(uSampler,vTextureCoord);\r\n    vec3 splashed = splash(vFilterCoord - anchor);\r\n\r\n    if (splashed == vec3(0.0))\r\n    {\r\n        if (pixel.a > 0. && !cut)\r\n        {\r\n            gl_FragColor = pixel;\r\n            return;\r\n        }\r\n        else if (cut) discard;\r\n    }\r\n\r\n    vec4 splashed4 = vec4(splashed,1.);\r\n    vec4 blendResult = mix(blender(blend, pixel, splashed4),splashed4,1.-pixel.a);\r\n    gl_FragColor = (textureAlphaBlend ? blendResult * pixel.a : blendResult);\r\n}\r\n`;\r\n","export const polymorph = `#version 300 es\r\nprecision mediump float;\r\n\r\nuniform float progress;\r\nuniform float magnify;\r\nuniform int type;\r\nuniform vec4 inputClamp;\r\nuniform vec4 inputClampTarget;\r\nuniform sampler2D uSampler;\r\nuniform sampler2D uSamplerTarget;\r\nuniform mat3 filterMatrixInverse;\r\n\r\nin vec2 vTextureCoord;\r\nin vec2 vTextureCoordExtra;\r\nin vec2 vFilterCoord;\r\n\r\nout vec4 outputColor;\r\n\r\nconst float PI = 3.14159265358;\r\n\r\nfloat getClip(vec2 uv) {\r\n    return step(3.5,\r\n       step(inputClampTarget.x, uv.x) +\r\n       step(inputClampTarget.y, uv.y) +\r\n       step(uv.x, inputClampTarget.z) +\r\n       step(uv.y, inputClampTarget.w));\r\n}\r\n\r\nvec4 getFromColor(vec2 uv) {\r\n    return texture(uSampler,clamp(uv,inputClamp.xy,inputClamp.zw));\r\n}\r\n\r\nvec4 getToColor(vec2 uv) {\r\n    return texture(uSamplerTarget,clamp(uv,inputClampTarget.xy,inputClampTarget.zw))*getClip(uv);\r\n}\r\n\r\nfloat rand(vec2 co) {\r\n  return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\r\n}\r\n\r\nvec2 offset(float progress, float x, float theta, float str) {\r\n    float shifty = str*progress*cos(10.0*(progress+x));\r\n    return vec2(0, shifty);\r\n}\r\n\r\nvec2 roffset(float progress, float x, float theta, float str) {\r\n    float shifty = (1.-progress)*str*progress*cos(10.0*(progress+x));\r\n    return vec2(0, shifty);\r\n}\r\n\r\nfloat noise(vec2 co) {\r\n    float a = 12.9898;\r\n    float b = 78.233;\r\n    float c = 43758.5453;\r\n    float dt= dot(co.xy * progress, vec2(a, b));\r\n    float sn= mod(dt,3.14);\r\n    return fract(sin(sn) * c);\r\n}\r\n\r\nvec4 morph(vec2 uv, vec2 uvt) {\r\n    vec4 ca = getFromColor(uv);\r\n    vec4 cb = getToColor(uvt);\r\n    vec2 oa = (((ca.rg+ca.b)*0.5)*2.0-1.0);\r\n    vec2 ob = (((cb.rg+cb.b)*0.5)*2.0-1.0);\r\n    vec2 oc = mix(oa,ob,0.5)*0.1;\r\n    float w0 = progress;\r\n    float w1 = 1.0-w0;\r\n    vec2 sourceMappedCoord = (filterMatrixInverse * vec3(vFilterCoord+(oc*0.4)*w0, 1.0)).xy;\r\n    vec4 fromcol = getFromColor(sourceMappedCoord);\r\n    vec4 tocol = getToColor(uvt-oc*w1);\r\n    float a = mix(ca.a, cb.a, progress);\r\n    return mix(fromcol, tocol, progress)*a;\r\n}\r\n\r\nvec4 waterdrop(vec2 uv, vec2 uvt) {\r\n    vec2 dirt = uvt - vec2(.5);\r\n    float distt = length(dirt);\r\n    if (distt > progress) {\r\n        return mix(getFromColor(uv), getToColor(uvt), progress);\r\n    } else {\r\n        vec2 shiftuvt = dirt * sin(distt * 60. - progress * 20.);\r\n        vec2 fuv = (filterMatrixInverse * vec3(vFilterCoord + (shiftuvt*(1.-progress)), 1.0)).xy;\r\n        return mix(getFromColor(fuv), getToColor(uvt + (shiftuvt*(1.-progress))), progress);\r\n    }\r\n}\r\n\r\nvec4 dreamy(vec2 uv, vec2 uvt) {\r\n    return mix(getFromColor(uv + offset(progress, uv.x, 0.0, 0.03)), \r\n               getToColor(uvt + offset(1.0-progress, uvt.x, 3.14, 0.03)), \r\n               progress);\r\n}\r\n\r\nvec2 swirluv(vec2 uv) {\r\n    vec2 xy = 2.* uv - 1.;\r\n    float fdist = length(xy);\r\n    if (fdist > 1.) return uv;\r\n    uv -= vec2( 0.5, 0.5 );\r\n    float dist = length(uv);\r\n    if ( dist < 1. ) {\r\n\t    float pct = (1. - dist);\r\n\t    float a = ( progress <= 0.5 ) ? mix( 0.0, 1.0, progress*2. ) : mix( 1.0, 0.0, (progress-0.5)*2. );\r\n\t    float t = pct * pct * a * 5.0 * 3.14159;\r\n\t    float s = sin( t );\r\n\t    float c = cos( t );\r\n\t    uv = vec2(dot(uv,vec2(c,-s)),dot(uv,vec2(s,c)));\r\n    }\r\n    uv += vec2(0.5,0.5);\r\n    return uv;\r\n}\r\n\r\nvec4 swirl(vec2 uv, vec2 uvt) {\r\n    vec2 suvfrom = swirluv(vFilterCoord);\r\n    vec2 suvto = swirluv(uvt);\r\n    vec2 sourceMappedCoord = (filterMatrixInverse * vec3(suvfrom, 1.0)).xy;\r\n    vec4 fscol = getFromColor(sourceMappedCoord);\r\n    vec4 ftcol = getToColor(suvto);\r\n    return mix( fscol, ftcol, progress );\r\n}\r\n\r\nvec4 crosswarp(vec2 uv, vec2 uvt) {\r\n    float x = progress;\r\n    x = smoothstep(.0,1.0,(x*2.0+uv.x-1.0));\r\n    vec4 rawfscol = getFromColor(uv);\r\n    vec4 fscol = getFromColor((uv-.5)*(1.-x)+.5);\r\n    vec4 ftcol = getToColor(uvt);\r\n    return mix(fscol, ftcol, x)*mix(rawfscol.a,ftcol.a,progress);\r\n}\r\n\r\nvec4 tvnoise(vec2 uv, vec2 uvt) {\r\n    vec4 noise = vec4(vec3(noise(uv)), 1.);\r\n    vec4 fscol = getFromColor(uv);\r\n    vec4 ftcol = getToColor(uvt);\r\n    float alphamix = mix(fscol.a, ftcol.a, pow(clamp(progress,0.,1.), 0.6));\r\n    if (progress <= 0.30) {\r\n        return mix(fscol, noise*alphamix, pow(clamp(progress,0.,1.),0.3-progress));\r\n    } else if (progress >= 0.70) {\r\n        return mix(noise*alphamix, ftcol, pow(clamp(progress-0.7,0.,1.),1.-progress));\r\n    } else {\r\n        return noise*alphamix;\r\n    }\r\n}\r\n\r\nvec4 hologram(vec2 uv, vec2 uvt) {\r\n    float cosProg = 0.5*(cos(2.*PI*progress)+1.);\r\n    vec4 fscol = getFromColor(uv + roffset(progress, uvt.x, 0., 0.12));\r\n    vec4 ftcol = getToColor(uvt + roffset(progress, uvt.x, 0., 0.6));\r\n  \r\n    float scintensity = max(max(fscol.r,fscol.g),fscol.b);\r\n    float tcintensity = max(max(ftcol.r,ftcol.g),ftcol.b);\r\n\r\n    vec4 tscol = vec4(0.,fscol.g*3.,0.,1.)*scintensity;\r\n    vec4 ttcol = vec4(ftcol.r*3.,0.,0.,1.)*tcintensity;\r\n    \r\n    vec4 iscol = vec4(0.,fscol.g*3.,fscol.b*3.,1.)*scintensity;\r\n    vec4 itcol = vec4(ftcol.r*3.,0.,ftcol.b*3.,1.)*tcintensity;\r\n    \r\n    vec4 smix = mix(mix(fscol,tscol,progress),iscol,1.-cosProg);\r\n    vec4 tmix = mix(mix(ftcol,ttcol,1.-progress),itcol,1.-cosProg);;\r\n\r\n    return mix(smix, \r\n               tmix, \r\n               progress);\r\n}\r\n\r\nvec4 wind(vec2 uv, vec2 uvt) {\r\n    float r = rand(vec2(0, uv.y));\r\n    float m = smoothstep(0.0, -0.25, uv.x*0.75 + 0.25*r - (progress * 1.25));\r\n    return mix(\r\n        getFromColor(uv),\r\n        getToColor(uvt),\r\n        m\r\n    );\r\n}\r\n\r\nvec4 transition(vec2 uv, vec2 uvt) {\r\n    return mix(\r\n        getFromColor(uv),\r\n        getToColor(uvt),\r\n        progress\r\n    );\r\n}\r\n\r\nvoid main() {\r\n    vec4 result;\r\n    float scale = 1./magnify;\r\n    vec2 uvExtra = vTextureCoordExtra;\r\n    uvExtra -= vec2(0.5);\r\n    uvExtra *= mat2(scale,0.,0.,scale);\r\n    uvExtra += vec2(0.5);\r\n\r\n    // shortcut to prevent a lot of computation if progress is equal to 0 or 1\r\n    if (progress == 1.) {\r\n        outputColor = getToColor(uvExtra);\r\n        return;\r\n    }\r\n\r\n    if (progress == 0.) {\r\n        outputColor = getFromColor(vTextureCoord);\r\n        return;\r\n    }\r\n\r\n    if (type <= 1 || type >= 10) {\r\n        result = transition(vTextureCoord, uvExtra);\r\n    } else if (type == 2) {\r\n        result = dreamy(vTextureCoord, uvExtra);\r\n    } else if (type == 3) {\r\n        result = swirl(vTextureCoord, uvExtra);\r\n    } else if (type == 4) {\r\n        result = waterdrop(vTextureCoord, uvExtra);\r\n    } else if (type == 5) {\r\n        result = tvnoise(vTextureCoord, uvExtra);\r\n    } else if (type == 6) {\r\n        result = morph(vTextureCoord, uvExtra);\r\n    } else if (type == 7) {\r\n        result = crosswarp(vTextureCoord, uvExtra);\r\n    } else if (type == 8) {\r\n        result = wind(vTextureCoord, uvExtra);\r\n    } else if (type == 9) {\r\n        result = hologram(vTextureCoord, uvExtra);\r\n    } \r\n   \r\n    outputColor = result;\r\n}\r\n`;\r\n","// Custom vertex shader with filter matrix to map for additional sampler\r\n\r\nexport const customVertex2DSampler = `#version 300 es\r\nprecision mediump float;\r\n\r\nin vec2 aVertexPosition;\r\n\r\nuniform mat3 projectionMatrix;\r\nuniform mat3 filterMatrix;\r\nuniform mat3 targetUVMatrix;\r\n\r\nout vec2 vTextureCoord;\r\nout vec2 vTextureCoordExtra;\r\nout vec2 vFilterCoord;\r\n\r\nuniform vec4 inputSize;\r\nuniform vec4 outputFrame;\r\n\r\nvec4 filterVertexPosition( void )\r\n{\r\n    vec2 position = aVertexPosition * max(outputFrame.zw, vec2(0.)) + outputFrame.xy;\r\n\r\n    return vec4((projectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0);\r\n}\r\n\r\nvec2 filterTextureCoord( void )\r\n{\r\n    return aVertexPosition * (outputFrame.zw * inputSize.zw);\r\n}\r\n\r\nvoid main(void)\r\n{\r\n\tgl_Position = filterVertexPosition();\r\n\tvTextureCoord = filterTextureCoord();\r\n\tvTextureCoordExtra = (targetUVMatrix * vec3(vTextureCoord, 1.0)).xy;\r\n    vFilterCoord = (filterMatrix * vec3(vTextureCoord, 1.0)).xy;\r\n}\r\n`;\r\n","import { polymorph } from '../glsl/fragmentshaders/polymorph.js';\r\nimport { customVertex2DSampler } from '../glsl/vertexshaders/customvertex2DSampler.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\nimport { fixPath } from '../../module/tokenmagic.js';\r\n\r\nexport class FilterPolymorph extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet { imagePath, progress, magnify, type } = Object.assign({}, FilterPolymorph.defaults, params);\r\n\r\n\t\tconst targetSpriteMatrix = new PIXI.Matrix();\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2DSampler, polymorph);\r\n\r\n\t\t// vertex uniforms\r\n\t\tthis.uniforms.targetUVMatrix = targetSpriteMatrix;\r\n\r\n\t\t// fragment uniforms\r\n\t\tthis.uniforms.inputClampTarget = new Float32Array([0, 0, 0, 0]);\r\n\r\n\t\t// to store sprite matrix from the filter manager (and send to vertex)\r\n\t\tthis.targetSpriteMatrix = targetSpriteMatrix;\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\timagePath: fixPath(imagePath),\r\n\t\t\tprogress,\r\n\t\t\tmagnify,\r\n\t\t\ttype,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 1;\r\n\t\tthis.autoFit = false;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tsetTMParams(params) {\r\n\t\tsuper.setTMParams(params);\r\n\t\tif (!this.dummy && 'imagePath' in params) {\r\n\t\t\tthis.assignTexture();\r\n\t\t}\r\n\t}\r\n\r\n\tget progress() {\r\n\t\treturn this.uniforms.progress * 100;\r\n\t}\r\n\r\n\tset progress(value) {\r\n\t\tthis.uniforms.progress = Math.min(Math.max(value * 0.01, 0), 1);\r\n\t}\r\n\r\n\tget magnify() {\r\n\t\treturn this.uniforms.magnify;\r\n\t}\r\n\r\n\tset magnify(value) {\r\n\t\tthis.uniforms.magnify = Math.min(Math.max(value, 0.1), 100);\r\n\t}\r\n\r\n\tget type() {\r\n\t\treturn this.uniforms.type;\r\n\t}\r\n\r\n\tset type(value) {\r\n\t\tthis.uniforms.type = Math.floor(value);\r\n\t}\r\n\r\n\tget uSamplerTarget() {\r\n\t\treturn this.uniforms.uSamplerTarget;\r\n\t}\r\n\r\n\tset uSamplerTarget(value) {\r\n\t\tthis.uniforms.uSamplerTarget = value;\r\n\t}\r\n\r\n\t_setTargetSpriteSize() {\r\n\t\tconst sprite = this.targetSprite;\r\n\t\tlet ratioW = this.placeableImg._texture.baseTexture.realWidth / sprite.texture.baseTexture.realWidth;\r\n\t\tsprite.width = sprite.texture.baseTexture.realWidth * ratioW;\r\n\t\tsprite.height = sprite.texture.baseTexture.realHeight * ratioW;\r\n\t\tsprite.anchor.set(0.5);\r\n\t}\r\n\r\n\tassignTexture() {\r\n\t\tif (this.hasOwnProperty('imagePath')) {\r\n\t\t\tlet tex = PIXI.Texture.from(this.imagePath);\r\n\t\t\tlet sprite = new PIXI.Sprite(tex);\r\n\r\n\t\t\tsprite.renderable = false;\r\n\t\t\tthis.targetSprite = sprite;\r\n\r\n\t\t\t// We may need to wait for the texture to be loaded before accessing it's width and height\r\n\t\t\t// In such a case register an update listener which should be called when the texture is loaded/becomes valid\r\n\t\t\tif (tex.valid) {\r\n\t\t\t\tthis._setTargetSpriteSize();\r\n\t\t\t} else {\r\n\t\t\t\ttex.on('update', () => {\r\n\t\t\t\t\tthis._setTargetSpriteSize();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.uSamplerTarget = sprite._texture;\r\n\t\t\tthis.placeableImg.addChild(sprite);\r\n\t\t}\r\n\t}\r\n\r\n\t// override\r\n\tapply(filterManager, input, output, clear) {\r\n\t\tconst targetSprite = this.targetSprite;\r\n\t\tconst tex = targetSprite._texture;\r\n\r\n\t\tif (tex.valid) {\r\n\t\t\tif (!tex.uvMatrix) tex.uvMatrix = new PIXI.TextureMatrix(tex, 0.0);\r\n\t\t\ttex.uvMatrix.update();\r\n\r\n\t\t\tthis.uniforms.uSamplerTarget = tex;\r\n\t\t\tthis.uniforms.targetUVMatrix = filterManager\r\n\t\t\t\t.calculateSpriteMatrix(this.targetSpriteMatrix, targetSprite)\r\n\t\t\t\t.prepend(tex.uvMatrix.mapCoord);\r\n\t\t\tthis.uniforms.inputClampTarget = tex.uvMatrix.uClampFrame;\r\n\t\t}\r\n\r\n\t\tsuper.apply(filterManager, input, output, clear);\r\n\t}\r\n\r\n\t// override\r\n\tdestroy() {\r\n\t\tsuper.destroy();\r\n\t\tif (this.placeableImg) this.placeableImg.removeChild(this.targetSprite);\r\n\t\tthis.targetSprite.destroy({ children: true, texture: false, baseTexture: false });\r\n\t}\r\n}\r\n\r\nFilterPolymorph.defaults = {\r\n\tprogress: 0,\r\n\tmagnify: 1,\r\n\ttype: 1,\r\n};\r\n","import { burnXFire } from '../glsl/fragmentshaders/xfire.js';\r\nimport { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterXFire extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tlet {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tcolor1,\r\n\t\t\tcolor2,\r\n\t\t\tcolor3,\r\n\t\t\tcolor4,\r\n\t\t\tamplitude,\r\n\t\t\tdispersion,\r\n\t\t\tblend,\r\n\t\t\tscaleX,\r\n\t\t\tscaleY,\r\n\t\t\talphaDiscard,\r\n\t\t\tdiscardThreshold,\r\n\t\t\tchromatic,\r\n\t\t\tinlay,\r\n\t\t} = Object.assign({}, FilterXFire.defaults, params);\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2D, burnXFire);\r\n\r\n\t\tthis.uniforms.color = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.color1 = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.color2 = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.color3 = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.color4 = new Float32Array([1.0, 1.0, 1.0]);\r\n\t\tthis.uniforms.scale = new Float32Array([1.0, 1.0]);\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\ttime,\r\n\t\t\tcolor,\r\n\t\t\tcolor1,\r\n\t\t\tcolor2,\r\n\t\t\tcolor3,\r\n\t\t\tcolor4,\r\n\t\t\tamplitude,\r\n\t\t\tdispersion,\r\n\t\t\tblend,\r\n\t\t\tscaleX,\r\n\t\t\tscaleY,\r\n\t\t\talphaDiscard,\r\n\t\t\tdiscardThreshold,\r\n\t\t\tchromatic,\r\n\t\t\tinlay,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 145;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget time() {\r\n\t\treturn this.uniforms.time;\r\n\t}\r\n\r\n\tset time(value) {\r\n\t\tthis.uniforms.time = value;\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget color1() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color1);\r\n\t}\r\n\r\n\tset color1(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color1);\r\n\t}\r\n\r\n\tget color2() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color2);\r\n\t}\r\n\r\n\tset color2(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color2);\r\n\t}\r\n\r\n\tget color3() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color3);\r\n\t}\r\n\r\n\tset color3(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color3);\r\n\t}\r\n\r\n\tget color4() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color4);\r\n\t}\r\n\r\n\tset color4(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color4);\r\n\t}\r\n\r\n\tget amplitude() {\r\n\t\treturn this.uniforms.amplitude;\r\n\t}\r\n\r\n\tset amplitude(value) {\r\n\t\tthis.uniforms.amplitude = value;\r\n\t}\r\n\r\n\tget dispersion() {\r\n\t\treturn this.uniforms.dispersion;\r\n\t}\r\n\r\n\tset dispersion(value) {\r\n\t\tthis.uniforms.dispersion = value;\r\n\t}\r\n\r\n\tget blend() {\r\n\t\treturn this.uniforms.blend;\r\n\t}\r\n\r\n\tset blend(value) {\r\n\t\tthis.uniforms.blend = Math.floor(value);\r\n\t}\r\n\r\n\tget scaleX() {\r\n\t\treturn this.uniforms.scale[0];\r\n\t}\r\n\r\n\tset scaleX(value) {\r\n\t\tthis.uniforms.scale[0] = value;\r\n\t}\r\n\r\n\tget scaleY() {\r\n\t\treturn this.uniforms.scale[1];\r\n\t}\r\n\r\n\tset scaleY(value) {\r\n\t\tthis.uniforms.scale[1] = value;\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget discardThreshold() {\r\n\t\treturn this.uniforms.discardThreshold;\r\n\t}\r\n\r\n\tset discardThreshold(value) {\r\n\t\tthis.uniforms.discardThreshold = value;\r\n\t}\r\n\r\n\tget chromatic() {\r\n\t\treturn this.uniforms.chromatic;\r\n\t}\r\n\r\n\tset chromatic(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.chromatic = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget inlay() {\r\n\t\treturn this.uniforms.inlay;\r\n\t}\r\n\r\n\tset inlay(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.inlay = value;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterXFire.defaults = {\r\n\ttime: 0,\r\n\tcolor: 0x000000,\r\n\tcolor1: 0x250000,\r\n\tcolor2: 0xb20000,\r\n\tcolor3: 0x330000,\r\n\tcolor4: 0xffe500,\r\n\tamplitude: 1,\r\n\tdispersion: 0.25,\r\n\tblend: 2,\r\n\tscaleX: 1,\r\n\tscaleY: 1,\r\n\tdiscardThreshold: 0.1,\r\n\talphaDiscard: false,\r\n\tchromatic: false,\r\n\tinlay: false,\r\n};\r\n","export const burnXFire = `\r\nprecision mediump float;\r\n\r\nuniform float time;\r\nuniform float amplitude;\r\nuniform float dispersion;\r\nuniform float discardThreshold;\r\nuniform int blend;\r\nuniform bool alphaDiscard;\r\nuniform bool chromatic;\r\nuniform bool inlay;\r\nuniform vec2 scale;\r\nuniform vec3 color;\r\nuniform vec3 color1;\r\nuniform vec3 color2;\r\nuniform vec3 color3;\r\nuniform vec3 color4;\r\n\r\nuniform sampler2D uSampler;\r\nvarying vec2 vTextureCoord;\r\nvarying vec2 vFilterCoord;\r\n\r\nconst float MU_3 = 0.333333333334;\r\n\r\nfloat rand(vec2 n) { \r\n\treturn fract(cos(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);\r\n}\r\n\r\nfloat maxRgbIntensity(vec3 col) {\r\n    return max(max(col.r,col.g),col.b);\r\n}\r\n\r\nfloat colorIntensity(vec3 col) {\r\n    return clamp((col.r + col.g + col.b)*MU_3,0.,1.);\r\n}\r\n\r\nvec3 blendLinearDual(vec3 base, vec3 blend, float intensity) {\r\n    if (intensity < dispersion) {\r\n        return mix(base,blend,pow(abs((1.-dispersion)),clamp(10.*dispersion,1.,3.)));\r\n    } \r\n    return mix(blend,mix(blend,base,1.-pow(intensity*dispersion,0.5)),1.-pow(intensity,4.));\r\n}\r\n\r\nvec3 blendScreen(vec3 base, vec3 blend, float intensity) {\r\n    return vec3(1.)\r\n            -((1.-base*(intensity+dispersion))\r\n            *(1.-blend*clamp(pow(intensity,dispersion),0.,1.)));\r\n}\r\n\r\nfloat blendScreenPure(float base, float blend) {\r\n\treturn 1.0-((1.0-base)*(1.0-blend));\r\n}\r\n\r\nvec3 blendScreenPure(vec3 base, vec3 blend) {\r\n\treturn vec3(blendScreenPure(base.r,blend.r),blendScreenPure(base.g,blend.g),blendScreenPure(base.b,blend.b));\r\n}\r\n\r\nvec3 blendMix(vec3 base, vec3 blend) {\r\n\treturn mix(blendLinearDual(base, blend, smoothstep(0.35,0.6,1.-colorIntensity(blend))),\r\n\t           blendScreen(base, blend, smoothstep(0.,1.,1.-colorIntensity(blend))),\r\n\t           smoothstep(0.,1.,colorIntensity((base+blend)*0.5)));\r\n}\r\n\r\nfloat blendColorBurn(float base, float blend) {\r\n\treturn (blend==0.0)?blend:max((1.0-((1.0-base)/blend)),0.0);\r\n}\r\n\r\nvec3 blendColorBurn(vec3 base, vec3 blend) {\r\n\treturn vec3(blendColorBurn(base.r,blend.r),blendColorBurn(base.g,blend.g),blendColorBurn(base.b,blend.b));\r\n}\r\n\r\nfloat blendColorDodge(float base, float blend) {\r\n\treturn (blend==1.0)?blend:min(base/(1.0-blend),1.0);\r\n}\r\n\r\nvec3 blendColorDodge(vec3 base, vec3 blend) {\r\n\treturn vec3(blendColorDodge(base.r,blend.r),blendColorDodge(base.g,blend.g),blendColorDodge(base.b,blend.b));\r\n}\r\n\r\nfloat blendVividLight(float base, float blend) {\r\n\treturn (blend<0.5)?blendColorBurn(base,(2.0*blend)):blendColorDodge(base,(2.0*(blend-0.5)));\r\n}\r\n\r\nvec3 blendVividLight(vec3 base, vec3 blend) {\r\n\treturn vec3(blendVividLight(base.r,blend.r),blendVividLight(base.g,blend.g),blendVividLight(base.b,blend.b));\r\n}\r\n\r\nvec4 blender(int blend, vec3 scol, vec3 tcol) {\r\n    if (blend <= 1) {\r\n        scol = mix(scol, tcol, smoothstep(dispersion, 1., maxRgbIntensity(tcol)));\r\n    } else if (blend == 2) {\r\n        scol = blendLinearDual(scol, tcol, maxRgbIntensity(tcol));\r\n    } else if (blend == 3) {\r\n        scol = blendLinearDual(scol, tcol, colorIntensity(tcol));\r\n    } else if (blend == 4) {\r\n        scol = blendScreen(scol, tcol, maxRgbIntensity(tcol));\r\n    } else if (blend == 5) {\r\n        scol = blendScreen(scol, tcol, colorIntensity(tcol));\r\n    } else if (blend == 6) {\r\n        scol = blendVividLight(scol,tcol);\r\n    } else if (blend == 7) {\r\n        scol = blendColorDodge(scol,tcol);\r\n    } else if (blend == 8) {\r\n        scol = blendColorBurn(scol,tcol);\r\n    } else if (blend == 9) {\r\n        scol = blendScreen(scol, blendVividLight(scol,tcol), colorIntensity(tcol));\r\n    } else if (blend == 10) {\r\n        scol = blendScreen(scol, blendColorDodge(scol,tcol), colorIntensity(tcol));\r\n    } else if (blend == 11) {\r\n        scol = blendLinearDual(blendVividLight(scol,tcol), tcol, maxRgbIntensity(tcol));\r\n    } else if (blend == 12) {\r\n        scol = blendMix(scol,tcol);\r\n    } else if (blend == 13) {\r\n        scol = blendScreenPure(scol,tcol);\r\n    } else if (blend >= 14) {\r\n        scol = blendScreenPure(scol,tcol*0.5);\r\n    }\r\n\r\n    return vec4(scol,1.);\r\n}\r\n\r\nfloat noise(vec2 n) {\r\n\tconst vec2 d = vec2(0.0, 1.0);\r\n\tvec2 b = floor(n);\r\n\tvec2 f = smoothstep(vec2(0.), vec2(1.0), fract(n));\r\n\treturn mix(mix(rand(b), rand(b + d.yx), f.x), \r\n\t       mix(rand(b + d.xy), rand(b + d.yy), f.x), f.y);\r\n}\r\n\r\nfloat fbm(vec2 n) {\r\n\tfloat total = 0.0, amp = amplitude;\r\n\tfor (int i = 0; i < 5; i++) {\r\n\t\ttotal += noise(n) * amp;\r\n\t\tn += n;\r\n\t\tamp *= 0.5;\r\n\t}\r\n\treturn total;\r\n}\r\n\r\nvec3 fire(in vec4 pixel) {\r\n    vec3 c1,c2,c3,c4;\r\n\r\n    if (chromatic) {\r\n        c1 = vec3(0.00, 0.50, 0.50);\r\n    \tc2 = vec3(0.60, 0.35, 0.70);\r\n    \tc3 = vec3(0.20, 0.90, 1.00);\r\n    \tc4 = vec3(0.90, 1.00, 0.60); \r\n    } else if ( any(greaterThan(color,vec3(0.))) ) {\r\n        c1 = vec3(0.10*color);\r\n    \tc2 = vec3(0.85*color);\r\n    \tc3 = vec3(0.35*color);\r\n    \tc4 = vec3(color);\r\n    } else {\r\n        c1 = color1;\r\n        c2 = color2;\r\n        c3 = color3;\r\n        c4 = color4;\r\n    }\r\n\r\n\tconst vec3 c5 = vec3(0.1);\r\n\tconst vec3 c6 = vec3(0.9);\r\n\tconst vec2 pivot = vec2(0.5);\r\n\t\r\n    vec2 uv = vFilterCoord;\r\n    uv -= pivot;\r\n\tvec2 p = uv * mat2(8.*scale.x,0.0,0.0,8.*scale.y);\r\n\tuv += pivot;\r\n\r\n    vec2 r;\r\n\tvec3 c;\r\n\tfloat t = time*0.1;\r\n\tfloat q = fbm(p - t);\r\n\r\n\tif (inlay) {\r\n\t    float sat = pixel.r + pixel.g + pixel.b;\r\n\t    float sat4 = sat*4.;\r\n\t    r = vec2(fbm(p + q + t - p.x - p.y - sat), fbm(p + q - t + sat4));\r\n\t    c = mix(c1, c2, fbm(p + r + sat4)) + mix(c3, c4, 1.4-pixel.rgb) - mix(c5, c6, r.y);\r\n\t} else {\r\n\t    r = vec2(fbm(p + q + time - p.x - p.y), fbm(p + q - t));\r\n\t    c = mix(c1, c2, fbm(p + r)) + mix(c3, c4, r.x) - mix(c5, c6, r.y);\r\n\t}\r\n\t\r\n\treturn clamp(c,0.,1.);\r\n}\r\n\r\nvoid main() {\r\n    vec4 pixel = texture2D(uSampler, vTextureCoord);\r\n    if (pixel.a==0.) {\r\n       gl_FragColor = pixel;\r\n       return;\r\n    }\r\n\r\n    vec3 fire = fire(pixel);\r\n    if (alphaDiscard && all(lessThanEqual(fire,vec3(discardThreshold))))  {\r\n        discard;\r\n    }\r\n\r\n    vec4 result = blender(blend, pixel.rgb, fire);\r\n\r\n\tgl_FragColor = result*pixel.a;\r\n}\r\n`;\r\n","import { sprite } from '../glsl/fragmentshaders/sprite.js';\r\nimport { customVertex2DSampler } from '../glsl/vertexshaders/customvertex2DSampler.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\nimport { fixPath } from '../../module/tokenmagic.js';\r\n\r\nexport class FilterSprite extends CustomFilter {\r\n\ttex = null;\r\n\r\n\tconstructor(params) {\r\n\t\tlet {\r\n\t\t\timagePath,\r\n\t\t\tcolor,\r\n\t\t\tcolorize,\r\n\t\t\tinverse,\r\n\t\t\talpha,\r\n\t\t\talphaDiscard,\r\n\t\t\trepeat,\r\n\t\t\ttop,\r\n\t\t\trotation,\r\n\t\t\ttwRadiusPercent,\r\n\t\t\ttwAngle,\r\n\t\t\ttwRotation,\r\n\t\t\tbpRadiusPercent,\r\n\t\t\tbpStrength,\r\n\t\t\tscale,\r\n\t\t\tscaleX,\r\n\t\t\tscaleY,\r\n\t\t\ttranslationX,\r\n\t\t\ttranslationY,\r\n\t\t\tplay,\r\n\t\t\tloop,\r\n\t\t\tmaintainAspectRatio,\r\n\t\t\tmaintainScale,\r\n\t\t} = Object.assign({}, FilterSprite.defaults, params);\r\n\r\n\t\tconst targetSpriteMatrix = new PIXI.Matrix();\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2DSampler, sprite);\r\n\r\n\t\t// vertex uniforms\r\n\t\tthis.uniforms.targetUVMatrix = targetSpriteMatrix;\r\n\r\n\t\t// fragment uniforms\r\n\t\tthis.uniforms.inputClampTarget = new Float32Array([0, 0, 0, 0]);\r\n\t\tthis.uniforms.color = new Float32Array([0.0, 0.0, 0.0]);\r\n\t\tthis.uniforms.scale = new Float32Array([1.0, 1.0]);\r\n\t\tthis.uniforms.translation = new Float32Array([0.0, 0.0]);\r\n\r\n\t\t// to store sprite matrix from the filter manager (and send to vertex)\r\n\t\tthis.targetSpriteMatrix = targetSpriteMatrix;\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\timagePath: fixPath(imagePath),\r\n\t\t\tcolor,\r\n\t\t\tcolorize,\r\n\t\t\tinverse,\r\n\t\t\talpha,\r\n\t\t\talphaDiscard,\r\n\t\t\trepeat,\r\n\t\t\ttop,\r\n\t\t\trotation,\r\n\t\t\ttwRadiusPercent,\r\n\t\t\ttwAngle,\r\n\t\t\ttwRotation,\r\n\t\t\tbpRadiusPercent,\r\n\t\t\tbpStrength,\r\n\t\t\tscale,\r\n\t\t\tscaleX,\r\n\t\t\tscaleY,\r\n\t\t\ttranslationX,\r\n\t\t\ttranslationY,\r\n\t\t\tplay,\r\n\t\t\tloop,\r\n\t\t\tmaintainAspectRatio,\r\n\t\t\tmaintainScale,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 0;\r\n\t\tthis.autoFit = false;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tsetTMParams(params) {\r\n\t\tsuper.setTMParams(params);\r\n\t\tif (!this.dummy && 'imagePath' in params) {\r\n\t\t\tthis.assignTexture();\r\n\t\t}\r\n\t}\r\n\r\n\t_play = true;\r\n\t_loop = true;\r\n\t_maintainAspectRatio = false;\r\n\t_maintainScale = false;\r\n\r\n\tget play() {\r\n\t\treturn this._play;\r\n\t}\r\n\r\n\tset play(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis._play = value;\r\n\t\t\tthis._playVideo(this._play);\r\n\t\t}\r\n\t}\r\n\r\n\tget loop() {\r\n\t\treturn this._loop;\r\n\t}\r\n\r\n\tset loop(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis._loop = value;\r\n\t\t\tthis._playVideo(this._play);\r\n\t\t}\r\n\t}\r\n\r\n\tget maintainAspectRatio() {\r\n\t\treturn this._maintainAspectRatio;\r\n\t}\r\n\r\n\tset maintainAspectRatio(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis._maintainAspectRatio = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget maintainScale() {\r\n\t\treturn this._maintainScale;\r\n\t}\r\n\r\n\tset maintainScale(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis._maintainScale = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.color);\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.color);\r\n\t}\r\n\r\n\tget colorize() {\r\n\t\treturn this.uniforms.colorize;\r\n\t}\r\n\r\n\tset colorize(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.colorize = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget inverse() {\r\n\t\treturn this.uniforms.inverse;\r\n\t}\r\n\r\n\tset inverse(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.inverse = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget alpha() {\r\n\t\treturn this.uniforms.alpha;\r\n\t}\r\n\r\n\tset alpha(value) {\r\n\t\tthis.uniforms.alpha = value;\r\n\t}\r\n\r\n\tget alphaDiscard() {\r\n\t\treturn this.uniforms.alphaDiscard;\r\n\t}\r\n\r\n\tset alphaDiscard(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.alphaDiscard = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget repeat() {\r\n\t\treturn this.uniforms.repeat;\r\n\t}\r\n\r\n\tset repeat(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.repeat = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget top() {\r\n\t\treturn this.uniforms.top;\r\n\t}\r\n\r\n\tset top(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.top = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget rotation() {\r\n\t\treturn this.uniforms.rotation;\r\n\t}\r\n\r\n\tset rotation(value) {\r\n\t\tthis.uniforms.rotation = value;\r\n\t}\r\n\r\n\tget twRadiusPercent() {\r\n\t\treturn this.uniforms.twRadius * 200;\r\n\t}\r\n\r\n\tset twRadiusPercent(value) {\r\n\t\tthis.uniforms.twRadius = value / 200;\r\n\t}\r\n\r\n\tget twAngle() {\r\n\t\treturn this.uniforms.twAngle;\r\n\t}\r\n\r\n\tset twAngle(value) {\r\n\t\tthis.uniforms.twAngle = value;\r\n\t}\r\n\r\n\tget twRotation() {\r\n\t\treturn this.uniforms.twAngle * (180 / Math.PI);\r\n\t}\r\n\r\n\tset twRotation(value) {\r\n\t\tthis.uniforms.twAngle = value * (Math.PI / 180);\r\n\t}\r\n\r\n\tget bpRadiusPercent() {\r\n\t\treturn this.uniforms.bpRadius * 200;\r\n\t}\r\n\r\n\tset bpRadiusPercent(value) {\r\n\t\tthis.uniforms.bpRadius = value / 200;\r\n\t}\r\n\r\n\tget bpStrength() {\r\n\t\treturn this.uniforms.bpStrength;\r\n\t}\r\n\r\n\tset bpStrength(value) {\r\n\t\tthis.uniforms.bpStrength = value;\r\n\t}\r\n\r\n\tget scale() {\r\n\t\t// a little hack (we get only x)\r\n\t\treturn this.uniforms.scale[0];\r\n\t}\r\n\r\n\tset scale(value) {\r\n\t\tthis.uniforms.scale[1] = this.uniforms.scale[0] = value;\r\n\t}\r\n\r\n\tget scaleX() {\r\n\t\treturn this.uniforms.scale[0];\r\n\t}\r\n\r\n\tset scaleX(value) {\r\n\t\tthis.uniforms.scale[0] = value;\r\n\t}\r\n\r\n\tget scaleY() {\r\n\t\treturn this.uniforms.scale[1];\r\n\t}\r\n\r\n\tset scaleY(value) {\r\n\t\tthis.uniforms.scale[1] = value;\r\n\t}\r\n\r\n\tget translationX() {\r\n\t\treturn this.uniforms.translation[0];\r\n\t}\r\n\r\n\tset translationX(value) {\r\n\t\tthis.uniforms.translation[0] = value;\r\n\t}\r\n\r\n\tget translationY() {\r\n\t\treturn this.uniforms.translation[1];\r\n\t}\r\n\r\n\tset translationY(value) {\r\n\t\tthis.uniforms.translation[1] = value;\r\n\t}\r\n\r\n\tget uSamplerTarget() {\r\n\t\treturn this.uniforms.uSamplerTarget;\r\n\t}\r\n\r\n\tset uSamplerTarget(value) {\r\n\t\tthis.uniforms.uSamplerTarget = value;\r\n\t}\r\n\r\n\tasync _playVideo(value) {\r\n\t\t// Play if baseTexture resource is a video\r\n\t\tif (this.tex) {\r\n\t\t\tconst source = foundry.utils.getProperty(this.tex, 'baseTexture.resource.source');\r\n\t\t\tif (source && source.tagName === 'VIDEO') {\r\n\t\t\t\tif (isNaN(source.duration)) {\r\n\t\t\t\t\tawait new Promise((resolve) => {\r\n\t\t\t\t\t\tsource.onloadedmetadata = () => resolve();\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tif (value) game.video.play(source, { loop: this._loop, volume: 0 });\r\n\t\t\t\telse game.video.stop(source);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tassignTexture() {\r\n\t\tif (this.hasOwnProperty('imagePath')) {\r\n\t\t\t// Destroy the previous sprite\r\n\t\t\tif (this.targetSprite && !this.targetSprite.destroyed)\r\n\t\t\t\tthis.targetSprite.destroy({ children: true, texture: false, baseTexture: false });\r\n\t\t\tthis.tex = PIXI.Texture.from(this.imagePath);\r\n\r\n\t\t\tlet sprite = new PIXI.Sprite(this.tex);\r\n\r\n\t\t\tsprite.renderable = false;\r\n\t\t\tif (this.placeableImg._texture) {\r\n\t\t\t\tsprite.width = this.placeableImg._texture.baseTexture.realWidth;\r\n\t\t\t\tsprite.height = this.placeableImg._texture.baseTexture.realHeight;\r\n\t\t\t\tsprite.anchor.set(0.5);\r\n\t\t\t} else {\r\n\t\t\t\tsprite.width = this.placeableImg.width;\r\n\t\t\t\tsprite.height = this.placeableImg.height;\r\n\t\t\t}\r\n\r\n\t\t\tthis.targetSprite = sprite;\r\n\t\t\tthis.uSamplerTarget = sprite._texture;\r\n\t\t\tthis.placeableImg.addChild(sprite);\r\n\r\n\t\t\tthis._playVideo(this._play);\r\n\t\t}\r\n\t}\r\n\r\n\t// override\r\n\tapply(filterManager, input, output, clear) {\r\n\t\t// assignTexture may not be called if there is no imagePath in params, so we\r\n\t\t// need to check here or canvas drawing will break\r\n\t\tconst targetSprite = this.targetSprite;\r\n\t\tif (targetSprite) {\r\n\t\t\tconst tex = targetSprite._texture;\r\n\t\t\tif (tex?.valid) {\r\n\t\t\t\tif (!tex.uvMatrix) tex.uvMatrix = new PIXI.TextureMatrix(tex, 0.0);\r\n\t\t\t\ttex.uvMatrix.update();\r\n\r\n\t\t\t\tthis.uniforms.uSamplerTarget = tex;\r\n\t\t\t\tif (this.maintainScale) {\r\n\t\t\t\t\tlet pScale = targetSprite.parent.scale;\r\n\t\t\t\t\ttargetSprite.scale.set(1 / pScale.x, 1 / pScale.y);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet w = targetSprite.worldTransform;\r\n\t\t\t\tif (this.maintainAspectRatio) {\r\n\t\t\t\t\tlet scale = Math.min(w.a, w.d);\r\n\t\t\t\t\tw.set(scale, w.b, w.c, scale, w.tx, w.ty);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.uniforms.targetUVMatrix = filterManager.calculateSpriteMatrix(this.targetSpriteMatrix, targetSprite);\r\n\t\t\t\tthis.uniforms.inputClampTarget = tex.uvMatrix.uClampFrame;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsuper.apply(filterManager, input, output, clear);\r\n\t}\r\n\r\n\t// override\r\n\tdestroy() {\r\n\t\tsuper.destroy();\r\n\t\tif (!this.targetSprite.destroyed) this.targetSprite.destroy({ children: true, texture: false, baseTexture: false });\r\n\t}\r\n}\r\n\r\nFilterSprite.defaults = {\r\n\tcolor: 0x000000,\r\n\tcolorize: false,\r\n\tinverse: false,\r\n\talpha: 1,\r\n\talphaDiscard: false,\r\n\trepeat: false,\r\n\ttop: false,\r\n\trotation: 0.0,\r\n\ttwRadiusPercent: 0,\r\n\ttwAngle: 0,\r\n\tbpRadiusPercent: 0,\r\n\tbpStrength: 0,\r\n\tscaleX: 1,\r\n\tscaleY: 1,\r\n\ttranslationX: 0,\r\n\ttranslationY: 0,\r\n\tplay: true,\r\n\tloop: true,\r\n\tmaintainAspectRatio: false,\r\n\tmaintainScale: false,\r\n};\r\n","export const sprite = `#version 300 es\r\nprecision mediump float;\r\n\r\nuniform float rotation;\r\nuniform float twRadius;\r\nuniform float twAngle;\r\nuniform float bpRadius;\r\nuniform float bpStrength;\r\nuniform float alpha;\r\nuniform bool alphaDiscard;\r\n\r\nuniform bool inverse;\r\nuniform bool top;\r\nuniform bool colorize;\r\nuniform bool repeat;\r\n\r\nuniform vec2 scale;\r\nuniform vec2 translation;\r\n\r\nuniform vec3 color;\r\n\r\nuniform vec4 inputClamp;\r\nuniform vec4 inputClampTarget;\r\n\r\nuniform sampler2D uSampler;\r\nuniform sampler2D uSamplerTarget;\r\n\r\nin vec2 vTextureCoord;\r\nin vec2 vTextureCoordExtra;\r\nin vec2 vFilterCoord;\r\nin mat3 vTargetUVMatrix;\r\n\r\nout vec4 outputColor;\r\n\r\nconst float PI = 3.14159265358;\r\n\r\nfloat getClip(in vec2 uv) {\r\n    return step(3.5,\r\n       step(inputClampTarget.x, uv.x) +\r\n       step(inputClampTarget.y, uv.y) +\r\n       step(uv.x, inputClampTarget.z) +\r\n       step(uv.y, inputClampTarget.w));\r\n}\r\n\r\nvec2 morphing(in vec2 uv) {\r\n    float dist = length(uv);\r\n\r\n    // twist effect\r\n    if (dist < twRadius) {\r\n        float ratioDist = (twRadius - dist) / twRadius;\r\n        float angleMod = ratioDist * ratioDist * twAngle;\r\n        float s = sin(angleMod);\r\n        float c = cos(angleMod);\r\n        uv = vec2(uv.x * c - uv.y * s, uv.x * s + uv.y * c);\r\n    }\r\n\r\n    // bulge pinch effect\r\n    if (dist < bpRadius) {\r\n        float percent = dist / bpRadius;\r\n        if (bpStrength > 0.) {\r\n            uv *= mix(1.0, smoothstep(0., bpRadius / dist, percent), bpStrength * 0.75);\r\n        } else {\r\n            uv *= mix(1.0, pow(percent, 1.0 + bpStrength * 0.75) * bpRadius / dist, 1.0 - percent);\r\n        }\r\n    }\r\n\r\n    return uv;\r\n}\r\n\r\nvec4 colorization(in vec4 col) {\r\n    vec3 wcol = col.rgb;\r\n    if (inverse) {\r\n        wcol = (vec3(1.0) - wcol) * col.a;\r\n    }\r\n    float avg = (wcol.r + wcol.g + wcol.b) / 3.0;\r\n    return vec4(vec3(color * avg), col.a);\r\n}\r\n\r\nvec2 transform(in vec2 uv) {\r\n    float angle = -(PI * rotation * 0.005555555555);\r\n    uv -= 0.5;\r\n    uv *= mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\r\n    uv *= mat2(1.0 / scale.x, 0.0, 0.0, 1.0 / scale.y);\r\n    uv = morphing(uv);\r\n    uv += 0.5;\r\n\r\n    return uv;\r\n}\r\n\r\nvec4 getFromColor(in vec2 uv) {\r\n    return texture(uSampler, clamp(uv, inputClamp.xy, inputClamp.zw));\r\n}\r\n\r\nvec4 getToColor(in vec2 uv) {\r\n    return texture(uSamplerTarget, clamp(uv, inputClampTarget.xy, inputClampTarget.zw)) * getClip(uv);\r\n}\r\n\r\nvec4 getToColorFract(in vec2 uv) {\r\n    return textureGrad(uSamplerTarget, fract(uv), dFdx(uv), dFdy(uv));\r\n}\r\n\r\nvoid main() {\r\n\r\n    // UV transformations\r\n    vec2 uvTex = transform(vTextureCoordExtra);\r\n\r\n    // get samplers color\r\n    vec4 icolor = getFromColor(vTextureCoord);\r\n\r\n    vec4 tcolor;\r\n    if(repeat) {\r\n        tcolor = getToColorFract(uvTex + translation);\r\n    } else {\r\n        tcolor = getToColor(uvTex + translation);\r\n    }\r\n\r\n    tcolor.a *= alpha;\r\n    if(alphaDiscard) tcolor = mix(tcolor, icolor, 1.0 - icolor.a);\r\n\r\n    // colorize if necessary\r\n    if (colorize) {\r\n        tcolor = colorization(tcolor);\r\n    }\r\n\r\n    vec3 fcolor = tcolor.rgb;\r\n    if(top && icolor.a > 0.) fcolor = mix(tcolor.rgb, icolor.rgb, 1.0 - tcolor.a);\r\n    else if(!top) fcolor = mix(icolor.rgb, tcolor.rgb, 1.0 - icolor.a);\r\n   \r\n    outputColor = vec4(fcolor, max(tcolor.a, icolor.a));\r\n}\r\n`;\r\n","import { spritemask } from '../glsl/fragmentshaders/spritemask.js';\r\nimport { customVertex2DSampler } from '../glsl/vertexshaders/customvertex2DSampler.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\nimport { fixPath } from '../../module/tokenmagic.js';\r\n\r\nexport class FilterSpriteMask extends CustomFilter {\r\n\ttex = null;\r\n\r\n\tconstructor(params) {\r\n\t\tlet {\r\n\t\t\timagePath,\r\n\t\t\talpha,\r\n\t\t\trepeat,\r\n\t\t\trotation,\r\n\t\t\ttwRadiusPercent,\r\n\t\t\ttwAngle,\r\n\t\t\ttwRotation,\r\n\t\t\tbpRadiusPercent,\r\n\t\t\tbpStrength,\r\n\t\t\tscale,\r\n\t\t\tscaleX,\r\n\t\t\tscaleY,\r\n\t\t\ttranslationX,\r\n\t\t\ttranslationY,\r\n\t\t\tplay,\r\n\t\t\tloop,\r\n\t\t\tmaintainAspectRatio,\r\n\t\t\tmaintainScale,\r\n\t\t} = Object.assign({}, FilterSpriteMask.defaults, params);\r\n\r\n\t\tconst targetSpriteMatrix = new PIXI.Matrix();\r\n\r\n\t\t// using specific vertex shader and fragment shader\r\n\t\tsuper(customVertex2DSampler, spritemask);\r\n\r\n\t\t// vertex uniforms\r\n\t\tthis.uniforms.targetUVMatrix = targetSpriteMatrix;\r\n\r\n\t\t// fragment uniforms\r\n\t\tthis.uniforms.inputClampTarget = new Float32Array([0, 0, 0, 0]);\r\n\t\tthis.uniforms.color = new Float32Array([0.0, 0.0, 0.0]);\r\n\t\tthis.uniforms.scale = new Float32Array([1.0, 1.0]);\r\n\t\tthis.uniforms.translation = new Float32Array([0.0, 0.0]);\r\n\r\n\t\t// to store sprite matrix from the filter manager (and send to vertex)\r\n\t\tthis.targetSpriteMatrix = targetSpriteMatrix;\r\n\r\n\t\tObject.assign(this, {\r\n\t\t\timagePath: fixPath(imagePath),\r\n\t\t\talpha,\r\n\t\t\trepeat,\r\n\t\t\trotation,\r\n\t\t\ttwRadiusPercent,\r\n\t\t\ttwAngle,\r\n\t\t\ttwRotation,\r\n\t\t\tbpRadiusPercent,\r\n\t\t\tbpStrength,\r\n\t\t\tscale,\r\n\t\t\tscaleX,\r\n\t\t\tscaleY,\r\n\t\t\ttranslationX,\r\n\t\t\ttranslationY,\r\n\t\t\tplay,\r\n\t\t\tloop,\r\n\t\t\tmaintainAspectRatio,\r\n\t\t\tmaintainScale,\r\n\t\t});\r\n\r\n\t\tthis.zOrder = 0;\r\n\t\tthis.autoFit = false;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tsetTMParams(params) {\r\n\t\tsuper.setTMParams(params);\r\n\t\tif (!this.dummy && 'imagePath' in params) {\r\n\t\t\tthis.assignTexture();\r\n\t\t}\r\n\t}\r\n\r\n\t_play = true;\r\n\t_loop = true;\r\n\t_maintainAspectRatio = false;\r\n\t_maintainScale = false;\r\n\r\n\tget play() {\r\n\t\treturn this._play;\r\n\t}\r\n\r\n\tset play(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis._play = value;\r\n\t\t\tthis._playVideo(this._play);\r\n\t\t}\r\n\t}\r\n\r\n\tget loop() {\r\n\t\treturn this._loop;\r\n\t}\r\n\r\n\tset loop(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis._loop = value;\r\n\t\t\tthis._playVideo(this._play);\r\n\t\t}\r\n\t}\r\n\r\n\tget maintainAspectRatio() {\r\n\t\treturn this._maintainAspectRatio;\r\n\t}\r\n\r\n\tset maintainAspectRatio(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis._maintainAspectRatio = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget maintainScale() {\r\n\t\treturn this._maintainScale;\r\n\t}\r\n\r\n\tset maintainScale(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis._maintainScale = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget alpha() {\r\n\t\treturn this.uniforms.alpha;\r\n\t}\r\n\r\n\tset alpha(value) {\r\n\t\tthis.uniforms.alpha = value;\r\n\t}\r\n\r\n\tget repeat() {\r\n\t\treturn this.uniforms.repeat;\r\n\t}\r\n\r\n\tset repeat(value) {\r\n\t\tif (!(value == null) && typeof value === 'boolean') {\r\n\t\t\tthis.uniforms.repeat = value;\r\n\t\t}\r\n\t}\r\n\r\n\tget rotation() {\r\n\t\treturn this.uniforms.rotation;\r\n\t}\r\n\r\n\tset rotation(value) {\r\n\t\tthis.uniforms.rotation = value;\r\n\t}\r\n\r\n\tget twRadiusPercent() {\r\n\t\treturn this.uniforms.twRadius * 200;\r\n\t}\r\n\r\n\tset twRadiusPercent(value) {\r\n\t\tthis.uniforms.twRadius = value / 200;\r\n\t}\r\n\r\n\tget twAngle() {\r\n\t\treturn this.uniforms.twAngle;\r\n\t}\r\n\r\n\tset twAngle(value) {\r\n\t\tthis.uniforms.twAngle = value;\r\n\t}\r\n\r\n\tget twRotation() {\r\n\t\treturn this.uniforms.twAngle * (180 / Math.PI);\r\n\t}\r\n\r\n\tset twRotation(value) {\r\n\t\tthis.uniforms.twAngle = value * (Math.PI / 180);\r\n\t}\r\n\r\n\tget bpRadiusPercent() {\r\n\t\treturn this.uniforms.bpRadius * 200;\r\n\t}\r\n\r\n\tset bpRadiusPercent(value) {\r\n\t\tthis.uniforms.bpRadius = value / 200;\r\n\t}\r\n\r\n\tget bpStrength() {\r\n\t\treturn this.uniforms.bpStrength;\r\n\t}\r\n\r\n\tset bpStrength(value) {\r\n\t\tthis.uniforms.bpStrength = value;\r\n\t}\r\n\r\n\tget scale() {\r\n\t\t// a little hack (we get only x)\r\n\t\treturn this.uniforms.scale[0];\r\n\t}\r\n\r\n\tset scale(value) {\r\n\t\tthis.uniforms.scale[1] = this.uniforms.scale[0] = value;\r\n\t}\r\n\r\n\tget scaleX() {\r\n\t\treturn this.uniforms.scale[0];\r\n\t}\r\n\r\n\tset scaleX(value) {\r\n\t\tthis.uniforms.scale[0] = value;\r\n\t}\r\n\r\n\tget scaleY() {\r\n\t\treturn this.uniforms.scale[1];\r\n\t}\r\n\r\n\tset scaleY(value) {\r\n\t\tthis.uniforms.scale[1] = value;\r\n\t}\r\n\r\n\tget translationX() {\r\n\t\treturn this.uniforms.translation[0];\r\n\t}\r\n\r\n\tset translationX(value) {\r\n\t\tthis.uniforms.translation[0] = value;\r\n\t}\r\n\r\n\tget translationY() {\r\n\t\treturn this.uniforms.translation[1];\r\n\t}\r\n\r\n\tset translationY(value) {\r\n\t\tthis.uniforms.translation[1] = value;\r\n\t}\r\n\r\n\tget uSamplerTarget() {\r\n\t\treturn this.uniforms.uSamplerTarget;\r\n\t}\r\n\r\n\tset uSamplerTarget(value) {\r\n\t\tthis.uniforms.uSamplerTarget = value;\r\n\t}\r\n\r\n\tasync _playVideo(value) {\r\n\t\t// Play if baseTexture resource is a video\r\n\t\tif (this.tex) {\r\n\t\t\tconst source = foundry.utils.getProperty(this.tex, 'baseTexture.resource.source');\r\n\t\t\tif (source && source.tagName === 'VIDEO') {\r\n\t\t\t\tif (isNaN(source.duration)) {\r\n\t\t\t\t\tawait new Promise((resolve) => {\r\n\t\t\t\t\t\tsource.onloadedmetadata = () => resolve();\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tif (value) game.video.play(source, { loop: this._loop, volume: 0 });\r\n\t\t\t\telse game.video.stop(source);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tassignTexture() {\r\n\t\tif (this.hasOwnProperty('imagePath')) {\r\n\t\t\t// Destroy the previous sprite\r\n\t\t\tif (this.targetSprite && !this.targetSprite.destroyed)\r\n\t\t\t\tthis.targetSprite.destroy({ children: true, texture: false, baseTexture: false });\r\n\t\t\tthis.tex = PIXI.Texture.from(this.imagePath);\r\n\r\n\t\t\tlet sprite = new PIXI.Sprite(this.tex);\r\n\r\n\t\t\tsprite.renderable = false;\r\n\t\t\tif (this.placeableImg._texture) {\r\n\t\t\t\tsprite.width = this.placeableImg._texture.baseTexture.realWidth;\r\n\t\t\t\tsprite.height = this.placeableImg._texture.baseTexture.realHeight;\r\n\t\t\t\tsprite.anchor.set(0.5);\r\n\t\t\t} else {\r\n\t\t\t\tsprite.width = this.placeableImg.width;\r\n\t\t\t\tsprite.height = this.placeableImg.height;\r\n\t\t\t}\r\n\r\n\t\t\tthis.targetSprite = sprite;\r\n\t\t\tthis.uSamplerTarget = sprite._texture;\r\n\t\t\tthis.placeableImg.addChild(sprite);\r\n\r\n\t\t\tthis._playVideo(this._play);\r\n\t\t}\r\n\t}\r\n\r\n\t// override\r\n\tapply(filterManager, input, output, clear) {\r\n\t\tconst targetSprite = this.targetSprite;\r\n\t\tconst tex = targetSprite._texture;\r\n\r\n\t\tif (tex.valid) {\r\n\t\t\tif (!tex.uvMatrix) tex.uvMatrix = new PIXI.TextureMatrix(tex, 0.0);\r\n\t\t\ttex.uvMatrix.update();\r\n\r\n\t\t\tthis.uniforms.uSamplerTarget = tex;\r\n\t\t\tif (this.maintainScale) {\r\n\t\t\t\tlet pScale = targetSprite.parent.scale;\r\n\t\t\t\ttargetSprite.scale.set(1 / pScale.x, 1 / pScale.y);\r\n\t\t\t}\r\n\r\n\t\t\tlet w = targetSprite.worldTransform;\r\n\t\t\tif (this.maintainAspectRatio) {\r\n\t\t\t\tlet scale = Math.min(w.a, w.d);\r\n\t\t\t\tw.set(scale, w.b, w.c, scale, w.tx, w.ty);\r\n\t\t\t}\r\n\r\n\t\t\tthis.uniforms.targetUVMatrix = filterManager.calculateSpriteMatrix(this.targetSpriteMatrix, targetSprite);\r\n\t\t\tthis.uniforms.inputClampTarget = tex.uvMatrix.uClampFrame;\r\n\t\t}\r\n\r\n\t\tsuper.apply(filterManager, input, output, clear);\r\n\t}\r\n\r\n\t// override\r\n\tdestroy() {\r\n\t\tsuper.destroy();\r\n\t\tif (!this.targetSprite.destroyed) this.targetSprite.destroy({ children: true, texture: false, baseTexture: false });\r\n\t}\r\n}\r\n\r\nFilterSpriteMask.defaults = {\r\n\talpha: 1,\r\n\trepeat: false,\r\n\trotation: 0.0,\r\n\ttwRadiusPercent: 0,\r\n\ttwAngle: 0,\r\n\tbpRadiusPercent: 0,\r\n\tbpStrength: 0,\r\n\tscaleX: 1,\r\n\tscaleY: 1,\r\n\ttranslationX: 0,\r\n\ttranslationY: 0,\r\n\tplay: true,\r\n\tloop: true,\r\n\tmaintainAspectRatio: false,\r\n\tmaintainScale: false,\r\n};\r\n","export const spritemask = `#version 300 es\r\nprecision mediump float;\r\n\r\nuniform float rotation;\r\nuniform float twRadius;\r\nuniform float twAngle;\r\nuniform float bpRadius;\r\nuniform float bpStrength;\r\nuniform float alpha;\r\n\r\nuniform bool repeat;\r\n\r\nuniform vec2 scale;\r\nuniform vec2 translation;\r\n\r\nuniform vec4 inputClamp;\r\nuniform vec4 inputClampTarget;\r\n\r\nuniform sampler2D uSampler;\r\nuniform sampler2D uSamplerTarget;\r\n\r\nin vec2 vTextureCoord;\r\nin vec2 vTextureCoordExtra;\r\nin vec2 vFilterCoord;\r\nin mat3 vTargetUVMatrix;\r\n\r\nout vec4 outputColor;\r\n\r\nconst float PI = 3.14159265358;\r\n\r\nfloat getClip(in vec2 uv) {\r\n    return step(3.5,\r\n       step(inputClampTarget.x, uv.x) +\r\n       step(inputClampTarget.y, uv.y) +\r\n       step(uv.x, inputClampTarget.z) +\r\n       step(uv.y, inputClampTarget.w));\r\n}\r\n\r\nvec2 morphing(in vec2 uv) {\r\n    float dist = length(uv);\r\n\r\n    // twist effect\r\n    if (dist < twRadius) {\r\n        float ratioDist = (twRadius - dist) / twRadius;\r\n        float angleMod = ratioDist * ratioDist * twAngle;\r\n        float s = sin(angleMod);\r\n        float c = cos(angleMod);\r\n        uv = vec2(uv.x * c - uv.y * s, uv.x * s + uv.y * c);\r\n    }\r\n\r\n    // bulge pinch effect\r\n    if (dist < bpRadius) {\r\n        float percent = dist / bpRadius;\r\n        if (bpStrength > 0.) {\r\n            uv *= mix(1.0, smoothstep(0., bpRadius / dist, percent), bpStrength * 0.75);\r\n        } else {\r\n            uv *= mix(1.0, pow(percent, 1.0 + bpStrength * 0.75) * bpRadius / dist, 1.0 - percent);\r\n        }\r\n    }\r\n\r\n    return uv;\r\n}\r\n\r\nvec2 transform(in vec2 uv) {\r\n    float angle = -(PI * rotation * 0.005555555555);\r\n    uv -= 0.5;\r\n    uv *= mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\r\n    uv *= mat2(1.0 / scale.x, 0.0, 0.0, 1.0 / scale.y);\r\n    uv = morphing(uv);\r\n    uv += 0.5;\r\n\r\n    return uv;\r\n}\r\n\r\nvec4 getFromColor(in vec2 uv) {\r\n    return texture(uSampler, clamp(uv, inputClamp.xy, inputClamp.zw));\r\n}\r\n\r\nvec4 getToColor(in vec2 uv) {\r\n    return texture(uSamplerTarget, clamp(uv, inputClampTarget.xy, inputClampTarget.zw)) * getClip(uv);\r\n}\r\n\r\nvec4 getToColorFract(in vec2 uv) {\r\n    return textureGrad(uSamplerTarget, fract(uv), dFdx(uv), dFdy(uv));\r\n}\r\n\r\nvoid main() {\r\n\r\n    // UV transformations\r\n    vec2 uvTex = transform(vTextureCoordExtra);\r\n\r\n    // get samplers color\r\n    vec4 icolor = getFromColor(vTextureCoord);\r\n\r\n    vec4 tcolor;\r\n    if(repeat) tcolor = getToColorFract(uvTex + translation);\r\n    else tcolor = getToColor(uvTex + translation);\r\n\r\n    outputColor = icolor * (tcolor.a * alpha);\r\n}\r\n`;\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterReplaceColor extends PIXI.filters.ColorReplaceFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.originalColor = FilterReplaceColor.defaults.originalColor;\r\n\t\tthis.newColor = FilterReplaceColor.defaults.newColor;\r\n\t\tthis.epsilon = FilterReplaceColor.defaults.epsilon;\r\n\t\tthis.zOrder = 100;\r\n\t\tthis.animating = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n\r\nFilterReplaceColor.defaults = {\r\n\tepsilon: 0.7,\r\n\toriginalColor: 0xff0000,\r\n\tnewColor: 0x00ff00,\r\n};\r\n","import { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js';\r\nimport { CustomFilter } from './CustomFilter.js';\r\nimport { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\nimport { ddTint } from '../glsl/fragmentshaders/ddtint.js';\r\n\r\nexport class FilterDDTint extends CustomFilter {\r\n\tconstructor(params) {\r\n\t\tsuper(customVertex2D, ddTint);\r\n\t\tthis.tint = [1, 0, 0];\r\n\t\tthis.zOrder = 100;\r\n\t\tthis.animating = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget tint() {\r\n\t\treturn this.uniforms.tint;\r\n\t}\r\n\r\n\tset tint(value) {\r\n\t\tthis.uniforms.tint = value;\r\n\t}\r\n\r\n\tset color(value) {\r\n\t\tnew Color(value).applyRGB(this.uniforms.tint);\r\n\t}\r\n\r\n\tget color() {\r\n\t\treturn PIXI.utils.rgb2hex(this.uniforms.tint);\r\n\t}\r\n}\r\n\r\nFilterDDTint.defaults = {\r\n\tcolor: 0xff0000,\r\n};\r\n","export const ddTint = `\r\nvarying vec2 vTextureCoord;\r\nuniform sampler2D uSampler;\r\nuniform vec3 tint;\r\nvoid main() {\r\n    vec4 color = texture2D(uSampler, vTextureCoord);\r\n    float lesser = min(color.g,color.b);\r\n    float bigger = max(color.g,color.b);\r\n    if ((bigger - lesser < 0.1) && (color.r > 1.5 * bigger)) {\r\n        float primary = color.r;\r\n        float range = primary - lesser;\r\n        color.r = lesser + range * tint.r;\r\n        color.g = lesser + range * tint.g;\r\n        color.b = lesser + range * tint.b;\r\n    }\r\n    gl_FragColor = color;\r\n}`;\r\n","import { TokenMagic, isTheOne, log, warn, error } from '../module/tokenmagic.js';\r\nimport { PresetsLibrary, templatePresets } from '../fx/presets/defaultpresets.js';\r\n\r\nconst Magic = TokenMagic();\r\n\r\n// TODO create a generic function to import JSON by version\r\n\r\nexport const DataVersion = {\r\n\tARCHAIC: '',\r\n\tV030: '0.3.0',\r\n\tV040: '0.4.0',\r\n\tV040b: '0.4.0b',\r\n\tV041: '0.4.1',\r\n\tV043: '0.4.3',\r\n\tV044: '0.4.4',\r\n};\r\n\r\n// migration function - will evolve constantly\r\nexport async function tmfxDataMigration() {\r\n\tif (isTheOne()) {\r\n\t\tvar dataVersionNow;\r\n\t\ttry {\r\n\t\t\tdataVersionNow = game.settings.get('tokenmagic', 'migration');\r\n\t\t} catch (e) {\r\n\t\t\tdataVersionNow = DataVersion.ARCHAIC;\r\n\t\t}\r\n\t\tif (dataVersionNow < DataVersion.V030) {\r\n\t\t\tawait updatePresetsV030();\r\n\t\t}\r\n\t\tif (dataVersionNow < DataVersion.V040) {\r\n\t\t\tawait updatePresetsV040();\r\n\t\t}\r\n\t\tif (dataVersionNow < DataVersion.V040b) {\r\n\t\t\tawait updatePresetsV040b();\r\n\t\t}\r\n\t\tif (dataVersionNow < DataVersion.V041) {\r\n\t\t\tawait updatePresetsV041();\r\n\t\t}\r\n\t\tif (dataVersionNow < DataVersion.V043) {\r\n\t\t\tawait updatePresetsV043();\r\n\t\t}\r\n\t\tif (dataVersionNow < DataVersion.V044) {\r\n\t\t\tawait updatePresetsV044();\r\n\t\t}\r\n\t}\r\n}\r\n\r\n// migrating to the new presets data\r\nasync function updatePresetsV030() {\r\n\tvar presets = game.settings.get('tokenmagic', 'presets');\r\n\r\n\tif (!(presets == null)) {\r\n\t\tlog(`Migration 0.3.0 - Launching presets data migration...`);\r\n\r\n\t\tlet foundTemplateLibrary = false;\r\n\r\n\t\tfor (const preset of presets) {\r\n\t\t\tif (!preset.hasOwnProperty('library')) {\r\n\t\t\t\tpreset.library = PresetsLibrary.MAIN;\r\n\t\t\t\tlog(`Migration 0.3.0 - Adding ${preset.name} to ${PresetsLibrary.MAIN}`);\r\n\t\t\t} else if (preset.library === PresetsLibrary.TEMPLATE && !foundTemplateLibrary) {\r\n\t\t\t\tfoundTemplateLibrary = true;\r\n\t\t\t\tlog(`Migration 0.3.0 - Found template presets. Templates will not be added.`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!foundTemplateLibrary) log(`Migration 0.3.0 - Merging templates presets.`);\r\n\r\n\t\tlet newPresets = foundTemplateLibrary ? presets : presets.concat(templatePresets);\r\n\r\n\t\ttry {\r\n\t\t\tawait game.settings.set('tokenmagic', 'presets', newPresets);\r\n\t\t\tawait game.settings.set('tokenmagic', 'migration', DataVersion.V030);\r\n\t\t\tlog(`Migration 0.3.0 - Migration successful!`);\r\n\t\t} catch (e) {\r\n\t\t\terror(`Migration 0.3.0 - Migration failed.`);\r\n\t\t\terror(e);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nasync function updatePresetsV040() {\r\n\tvar presets = game.settings.get('tokenmagic', 'presets');\r\n\r\n\tif (!(presets == null)) {\r\n\t\tlog(`Migration 0.4.0 - Launching presets data migration...`);\r\n\r\n\t\t// Adding zOrder for the template presets only\r\n\t\t// Does not break visuals\r\n\t\tfor (const preset of presets) {\r\n\t\t\tif (preset.library === PresetsLibrary.TEMPLATE) {\r\n\t\t\t\tlog(`Migration 0.4.0 - Checking template preset ${preset.name}...`);\r\n\t\t\t\tlet zOrder = 1;\r\n\t\t\t\tfor (const filter of preset.params) {\r\n\t\t\t\t\tif (!filter.hasOwnProperty('zOrder')) {\r\n\t\t\t\t\t\tfilter.zOrder = zOrder;\r\n\t\t\t\t\t\tlog(`Migration 0.4.0 - Updating ${filter.filterType} in ${preset.name}...`);\r\n\t\t\t\t\t\tzOrder++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tawait game.settings.set('tokenmagic', 'presets', presets);\r\n\t\t\tlog(`Migration 0.4.0 - Importing new template presets...`);\r\n\t\t\tawait Magic.importPresetLibraryFromPath('modules/tokenmagic/import/TMFX-update-presets-v040.json', {\r\n\t\t\t\toverwrite: false,\r\n\t\t\t});\r\n\t\t\tawait game.settings.set('tokenmagic', 'migration', DataVersion.V040);\r\n\t\t\tlog(`Migration 0.4.0 - Migration successful!`);\r\n\t\t} catch (e) {\r\n\t\t\terror(`Migration 0.4.0 - Migration failed.`);\r\n\t\t\terror(e);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nasync function updatePresetsV040b() {\r\n\tvar presets = game.settings.get('tokenmagic', 'presets');\r\n\r\n\tif (!(presets == null)) {\r\n\t\tlog(`Migration 0.4.0b - Launching presets data migration...`);\r\n\r\n\t\ttry {\r\n\t\t\tawait game.settings.set('tokenmagic', 'presets', presets);\r\n\t\t\tlog(`Migration 0.4.0b - updating template presets...`);\r\n\t\t\tawait Magic.importPresetLibraryFromPath('modules/tokenmagic/import/TMFX-update-presets-v040b.json', {\r\n\t\t\t\toverwrite: true,\r\n\t\t\t});\r\n\t\t\tawait game.settings.set('tokenmagic', 'migration', DataVersion.V040b);\r\n\t\t\tlog(`Migration 0.4.0b - Migration successful!`);\r\n\t\t} catch (e) {\r\n\t\t\terror(`Migration 0.4.0b - Migration failed.`);\r\n\t\t\terror(e);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nasync function updatePresetsV041() {\r\n\tvar presets = game.settings.get('tokenmagic', 'presets');\r\n\r\n\tif (!(presets == null)) {\r\n\t\tlog(`Migration 0.4.1 - Launching presets data migration...`);\r\n\r\n\t\ttry {\r\n\t\t\tawait game.settings.set('tokenmagic', 'presets', presets);\r\n\t\t\tlog(`Migration 0.4.1 - updating template presets...`);\r\n\t\t\tawait Magic.importPresetLibraryFromPath('modules/tokenmagic/import/TMFX-update-presets-v041.json', {\r\n\t\t\t\toverwrite: true,\r\n\t\t\t});\r\n\t\t\tawait game.settings.set('tokenmagic', 'migration', DataVersion.V041);\r\n\t\t\tlog(`Migration 0.4.1 - Migration successful!`);\r\n\t\t} catch (e) {\r\n\t\t\terror(`Migration 0.4.1 - Migration failed.`);\r\n\t\t\terror(e);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nasync function updatePresetsV043() {\r\n\tvar presets = game.settings.get('tokenmagic', 'presets');\r\n\r\n\tif (!(presets == null)) {\r\n\t\tlog(`Migration 0.4.3 - Launching presets data migration...`);\r\n\r\n\t\ttry {\r\n\t\t\tawait game.settings.set('tokenmagic', 'presets', presets);\r\n\t\t\tlog(`Migration 0.4.3 - updating template presets...`);\r\n\t\t\tawait Magic.importPresetLibraryFromPath('modules/tokenmagic/import/TMFX-update-presets-v043.json', {\r\n\t\t\t\toverwrite: true,\r\n\t\t\t});\r\n\t\t\tawait game.settings.set('tokenmagic', 'migration', DataVersion.V043);\r\n\t\t\tlog(`Migration 0.4.3 - Migration successful!`);\r\n\t\t} catch (e) {\r\n\t\t\terror(`Migration 0.4.3 - Migration failed.`);\r\n\t\t\terror(e);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nasync function updatePresetsV044() {\r\n\tvar presets = game.settings.get('tokenmagic', 'presets');\r\n\r\n\tif (!(presets == null)) {\r\n\t\tlog(`Migration 0.4.4 - Launching presets data migration...`);\r\n\r\n\t\ttry {\r\n\t\t\tawait game.settings.set('tokenmagic', 'presets', presets);\r\n\t\t\tlog(`Migration 0.4.4 - updating template presets...`);\r\n\t\t\tawait Magic.importPresetLibraryFromPath('modules/tokenmagic/import/TMFX-update-presets-v044.json', {\r\n\t\t\t\toverwrite: true,\r\n\t\t\t});\r\n\t\t\tawait game.settings.set('tokenmagic', 'migration', DataVersion.V044);\r\n\t\t\tlog(`Migration 0.4.4 - Migration successful!`);\r\n\t\t} catch (e) {\r\n\t\t\terror(`Migration 0.4.4 - Migration failed.`);\r\n\t\t\terror(e);\r\n\t\t}\r\n\t}\r\n}\r\n","import { PlaceableType } from '../constants.js';\r\nimport { broadcast, mustBroadCast } from '../tokenmagic.js';\r\nimport { callAsyncHook } from '../utilities.js';\r\nimport { gMaxRank } from './PlaceableObjectProto.js';\r\n\r\nObject.values(PlaceableType).forEach((type) => {\r\n\tconst cls = getDocumentClass(type);\r\n\tif (!cls) return;\r\n\r\n\tcls.prototype._TMFXsetFlag = async function (flag) {\r\n\t\tawait callAsyncHook('tokenmagic._TMFXsetFlag', flag);\r\n\t\tif (mustBroadCast()) broadcast(this, flag, SocketAction.SET_FLAG);\r\n\t\telse await this.setFlag('tokenmagic', 'filters', flag);\r\n\t};\r\n\r\n\tcls.prototype._TMFXunsetFlag = async function () {\r\n\t\tif (mustBroadCast()) broadcast(this, null, SocketAction.SET_FLAG);\r\n\t\telse await this.unsetFlag('tokenmagic', 'filters');\r\n\t};\r\n\r\n\tcls.prototype._TMFXsetAnimeFlag = async function (flag) {\r\n\t\tif (mustBroadCast()) broadcast(this, flag, SocketAction.SET_ANIME_FLAG);\r\n\t\telse await this.setFlag('tokenmagic', 'animeInfo', flag);\r\n\t};\r\n\r\n\tcls.prototype._TMFXunsetAnimeFlag = async function () {\r\n\t\tif (mustBroadCast()) broadcast(this, null, SocketAction.SET_ANIME_FLAG);\r\n\t\telse await this.unsetFlag('tokenmagic', 'animeInfo');\r\n\t};\r\n\r\n\tcls.prototype._TMFXgetMaxFilterRank = function () {\r\n\t\tconst placeable = this.object;\r\n\t\tif (!placeable) return gMaxRank++;\r\n\t\telse return placeable._TMFXgetMaxFilterRank();\r\n\t};\r\n\r\n\tcls.prototype._TMFXgetPlaceableType = function () {\r\n\t\tif (\r\n\t\t\t[\r\n\t\t\t\tPlaceableType.TOKEN,\r\n\t\t\t\tPlaceableType.TEMPLATE,\r\n\t\t\t\tPlaceableType.TILE,\r\n\t\t\t\tPlaceableType.DRAWING,\r\n\t\t\t\tPlaceableType.REGION,\r\n\t\t\t].includes(this.documentName)\r\n\t\t)\r\n\t\t\treturn this.documentName;\r\n\t\treturn PlaceableType.NOT_SUPPORTED;\r\n\t};\r\n});\r\n","/**\r\n * Modified Foundry's Hooks.call(...) function to support calling and awaiting of asynchronous hooks\r\n * @param {string} hook\r\n * @param  {...any} args\r\n * @returns\r\n */\r\nexport async function callAsyncHook(hook, ...args) {\r\n\tif (CONFIG.debug.hooks) {\r\n\t\tconsole.log(`DEBUG | Calling async ${hook} hook with args:`);\r\n\t\tconsole.log(args);\r\n\t}\r\n\r\n\tif (!(hook in Hooks.events)) return true;\r\n\r\n\tfor (const entry of Array.from(Hooks.events[hook])) {\r\n\t\tconst { hook, id, fn, once } = entry;\r\n\t\tif (once) Hooks.off(hook, id);\r\n\t\ttry {\r\n\t\t\tconst result = await entry.fn(...args);\r\n\t\t\tif (result === false) return false;\r\n\t\t} catch (err) {\r\n\t\t\tconst msg = `Error thrown in hooked function '${fn?.name}' for hook '${hook}'`;\r\n\t\t\tconsole.warn(`${CONST.vtt} | ${msg}`);\r\n\t\t\tif (hook !== 'error') Hooks.onError('Hooks.callAsyncHook', err, { msg, hook, fn, log: 'error' });\r\n\t\t}\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterCRT extends PIXI.filters.CRTFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.curvature = 1.0;\r\n\t\tthis.lineWidth = 1.0;\r\n\t\tthis.lineContrast = 0.25;\r\n\t\tthis.verticalLine = false;\r\n\t\tthis.noise = 0.08;\r\n\t\tthis.noiseSize = 1.0;\r\n\t\tthis.seed = 0;\r\n\t\tthis.vignetting = 0;\r\n\t\tthis.zOrder = 320;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\n\r\nexport class FilterRGBSplit extends PIXI.filters.RGBSplitFilter {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.red = new Float32Array([-10, 0]);\r\n\t\tthis.green = new Float32Array([0, 10]);\r\n\t\tthis.blue = new Float32Array([0, 0]);\r\n\t\tthis.zOrder = 340;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget redX() {\r\n\t\treturn this.uniforms.red[0];\r\n\t}\r\n\r\n\tset redX(value) {\r\n\t\tthis.uniforms.red[0] = value;\r\n\t}\r\n\r\n\tget redY() {\r\n\t\treturn this.uniforms.red[1];\r\n\t}\r\n\r\n\tset redY(value) {\r\n\t\tthis.uniforms.red[1] = value;\r\n\t}\r\n\r\n\tget greenX() {\r\n\t\treturn this.uniforms.green[0];\r\n\t}\r\n\r\n\tset greenX(value) {\r\n\t\tthis.uniforms.green[0] = value;\r\n\t}\r\n\r\n\tget greenY() {\r\n\t\treturn this.uniforms.green[1];\r\n\t}\r\n\r\n\tset greenY(value) {\r\n\t\tthis.uniforms.green[1] = value;\r\n\t}\r\n\r\n\tget blueX() {\r\n\t\treturn this.uniforms.blue[0];\r\n\t}\r\n\r\n\tset blueX(value) {\r\n\t\tthis.uniforms.blue[0] = value;\r\n\t}\r\n\r\n\tget blueY() {\r\n\t\treturn this.uniforms.blue[1];\r\n\t}\r\n\r\n\tset blueY(value) {\r\n\t\tthis.uniforms.blue[1] = value;\r\n\t}\r\n}\r\n","import { PresetsLibrary } from '../../../fx/presets/defaultpresets.js';\r\nimport { defaultOpacity, emptyPreset } from '../../../module/constants.js';\r\nimport { Magic } from '../../../module/tokenmagic.js';\r\n\r\nconst { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;\r\n\r\nexport class TemplateSettings extends HandlebarsApplicationMixin(ApplicationV2) {\r\n\t/** @override */\r\n\tstatic DEFAULT_OPTIONS = {\r\n\t\tid: 'tmfx-template-settings',\r\n\t\ttag: 'form',\r\n\t\twindow: {\r\n\t\t\ticon: 'fa-solid fa-fire',\r\n\t\t\ttitle: 'TMFX.settings.autoTemplateSettings.dialog.title',\r\n\t\t\tcontentClasses: ['standard-form'],\r\n\t\t},\r\n\t\tclasses: ['tokenmagic', 'settings'],\r\n\t\tposition: {\r\n\t\t\twidth: 600,\r\n\t\t},\r\n\t\tform: {\r\n\t\t\thandler: TemplateSettings._onSubmit,\r\n\t\t\tsubmitOnChange: true,\r\n\t\t\tcloseOnSubmit: false,\r\n\t\t},\r\n\t\tactions: {\r\n\t\t\taddOverride: TemplateSettings._onAddOverride,\r\n\t\t\tremoveOverride: TemplateSettings._onRemoveOverride,\r\n\t\t},\r\n\t};\r\n\r\n\t/** @override */\r\n\tstatic TABS = {\r\n\t\tmain: {\r\n\t\t\ttabs: [\r\n\t\t\t\t{ id: 'categories', icon: 'fa-regular fa-book-open' },\r\n\t\t\t\t{ id: 'overrides', icon: 'fa-solid fa-circle-plus' },\r\n\t\t\t],\r\n\t\t\tinitial: 'categories',\r\n\t\t\tlabelPrefix: 'TMFX.settings.autoTemplateSettings.tabs',\r\n\t\t},\r\n\t};\r\n\r\n\t/** @override */\r\n\tasync _preparePartContext(partId, context, options) {\r\n\t\tcontext.partId = partId;\r\n\t\tif (partId in context.tabs) context.tab = context.tabs[partId];\r\n\t\treturn context;\r\n\t}\r\n\r\n\t/** @override */\r\n\tasync _prepareContext(options) {\r\n\t\tconst context = await super._prepareContext(options);\r\n\r\n\t\treturn Object.assign(context, {\r\n\t\t\temptyPreset,\r\n\t\t\tpresets: [\r\n\t\t\t\t{ name: emptyPreset },\r\n\t\t\t\t...Magic.getPresets(PresetsLibrary.TEMPLATE).sort(function (a, b) {\r\n\t\t\t\t\tif (a.name < b.name) return -1;\r\n\t\t\t\t\tif (a.name > b.name) return 1;\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}),\r\n\t\t\t],\r\n\t\t\tsystem: { id: game.system.id, title: game.system.title },\r\n\t\t\tsettings: {\r\n\t\t\t\tautoTemplateEnable: game.settings.get('tokenmagic', 'autoTemplateEnabled'),\r\n\t\t\t\tautoTemplateSettings: game.settings.get('tokenmagic', 'autoTemplateSettings'),\r\n\t\t\t},\r\n\t\t\tsubmitText: game.i18n.localize('TMFX.save'),\r\n\t\t});\r\n\t}\r\n\r\n\tstatic async _onSubmit(event, form, formData) {\r\n\t\tconst data = foundry.utils.expandObject(formData.object);\r\n\r\n\t\tfor (let [key, value] of Object.entries(data)) {\r\n\t\t\tif (key === 'autoTemplateSettings' && value.overrides) {\r\n\t\t\t\tconst compacted = {};\r\n\t\t\t\tObject.values(value.overrides).forEach((val, idx) => (compacted[idx] = val));\r\n\t\t\t\tvalue.overrides = compacted;\r\n\t\t\t}\r\n\t\t\tawait game.settings.set('tokenmagic', key, value);\r\n\t\t}\r\n\t}\r\n\r\n\tstatic async _onAddOverride(event) {\r\n\t\tconst autoTemplateSettings = await game.settings.get('tokenmagic', 'autoTemplateSettings');\r\n\r\n\t\tlet idx;\r\n\r\n\t\tautoTemplateSettings.overrides ??= [];\r\n\r\n\t\tconst lastKey = Object.keys(autoTemplateSettings.overrides)\r\n\t\t\t.map((k) => Number(k))\r\n\t\t\t.sort()\r\n\t\t\t.at(-1);\r\n\t\tif (lastKey == null) idx = 0;\r\n\t\telse idx = lastKey + 1;\r\n\r\n\t\tautoTemplateSettings.overrides[idx] = {\r\n\t\t\ttarget: '',\r\n\t\t\topacity: defaultOpacity,\r\n\t\t\ttint: null,\r\n\t\t\tpreset: emptyPreset,\r\n\t\t\ttexture: null,\r\n\t\t};\r\n\r\n\t\tawait game.settings.set('tokenmagic', 'autoTemplateSettings', autoTemplateSettings);\r\n\t\tthis.render(true);\r\n\t}\r\n\r\n\tstatic async _onRemoveOverride(event) {\r\n\t\tevent.target.closest('.override-entry').remove();\r\n\t\tawait this.submit();\r\n\t\tthis.render();\r\n\t}\r\n}\r\n","import { defaultOpacity, emptyPreset } from '../../../module/constants.js';\r\nimport { TemplateSettings } from './TemplateSettings.js';\r\n\r\nexport class AutoTemplateDND5E extends TemplateSettings {\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis._enabled = false;\r\n\t}\r\n\r\n\t/** @override */\r\n\tstatic PARTS = {\r\n\t\ttabs: { template: 'templates/generic/tab-navigation.hbs' },\r\n\t\tcategories: { template: 'modules/tokenmagic/templates/settings/generic/categories.hbs' },\r\n\t\toverrides: { template: 'modules/tokenmagic/templates/settings/generic/overrides.hbs' },\r\n\t};\r\n\r\n\tstatic get defaultConfiguration() {\r\n\t\tconst defaultConfig = {\r\n\t\t\tcategories: {},\r\n\t\t\toverrides: {\r\n\t\t\t\t0: {\r\n\t\t\t\t\ttarget: 'Stinking Cloud',\r\n\t\t\t\t\topacity: 0.5,\r\n\t\t\t\t\ttint: '#00a80b',\r\n\t\t\t\t\tpreset: 'Smoky Area',\r\n\t\t\t\t\ttexture: null,\r\n\t\t\t\t},\r\n\t\t\t\t1: {\r\n\t\t\t\t\ttarget: 'Web',\r\n\t\t\t\t\topacity: 0.5,\r\n\t\t\t\t\ttint: '#808080',\r\n\t\t\t\t\tpreset: 'Spider Web 2',\r\n\t\t\t\t\ttexture: null,\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t};\r\n\r\n\t\tObject.keys(CONFIG.DND5E.damageTypes).forEach((dmgType) => {\r\n\t\t\tif (defaultConfig.categories[dmgType] == undefined) {\r\n\t\t\t\tconst config = { opacity: defaultOpacity, tint: null };\r\n\t\t\t\tswitch (dmgType.toLowerCase()) {\r\n\t\t\t\t\tcase 'acid':\r\n\t\t\t\t\t\tconfig.tint = '#2d8000';\r\n\t\t\t\t\t\tconfig.opacity = 0.6;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'cold':\r\n\t\t\t\t\t\tconfig.tint = '#47b3ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'necrotic':\r\n\t\t\t\t\t\tconfig.tint = '#502673';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'poison':\r\n\t\t\t\t\t\tconfig.tint = '#00a80b';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'psychic':\r\n\t\t\t\t\t\tconfig.tint = '#8000ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'thunder':\r\n\t\t\t\t\t\tconfig.tint = '#0060ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefaultConfig.categories[dmgType] = config;\r\n\t\t\t}\r\n\t\t\tObject.values(CONST.MEASURED_TEMPLATE_TYPES).forEach((tplType) => {\r\n\t\t\t\tconst config = { preset: emptyPreset, texture: null };\r\n\t\t\t\tswitch (dmgType.toLowerCase()) {\r\n\t\t\t\t\tcase 'acid':\r\n\t\t\t\t\t\tconfig.preset = 'Watery Surface 2';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'cold':\r\n\t\t\t\t\t\tconfig.preset = 'Thick Fog';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'fire':\r\n\t\t\t\t\t\tconfig.preset = 'Flames';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'force':\r\n\t\t\t\t\t\tconfig.preset = 'Waves 3';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'lightning':\r\n\t\t\t\t\t\tconfig.preset = 'Shock';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'necrotic':\r\n\t\t\t\t\t\tconfig.preset = 'Smoke Filaments';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'poison':\r\n\t\t\t\t\t\tconfig.preset = 'Smoky Area';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'psychic':\r\n\t\t\t\t\t\tconfig.preset = 'Classic Rays';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'radiant':\r\n\t\t\t\t\t\tconfig.preset = 'Annihilating Rays';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'thunder':\r\n\t\t\t\t\t\tconfig.preset = 'Waves';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefaultConfig.categories[dmgType][tplType] = config;\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\treturn defaultConfig;\r\n\t}\r\n\r\n\tget enabled() {\r\n\t\treturn this._enabled;\r\n\t}\r\n\r\n\tconfigure(enabled = false) {\r\n\t\tif (game.system.id !== 'dnd5e') return;\r\n\r\n\t\tif (!enabled) {\r\n\t\t\tif (this._enabled) {\r\n\t\t\t\tlibWrapper.unregister('tokenmagic', 'game.dnd5e.canvas.AbilityTemplate.fromActivity');\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (!this._enabled) {\r\n\t\t\t\tlibWrapper.register('tokenmagic', 'game.dnd5e.canvas.AbilityTemplate.fromActivity', fromActivity, 'WRAPPER');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._enabled = enabled;\r\n\t}\r\n\r\n\t/** @override */\r\n\tasync _preparePartContext(partId, context, options) {\r\n\t\tawait super._preparePartContext(partId, context, options);\r\n\t\tswitch (partId) {\r\n\t\t\tcase 'categories':\r\n\t\t\t\tthis._prepareCategoriesContext(context, options);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn context;\r\n\t}\r\n\r\n\t_prepareCategoriesContext(context, options) {\r\n\t\tcontext.dmgTypes = CONFIG.DND5E.damageTypes;\r\n\t\tcontext.templateTypes = CONST.MEASURED_TEMPLATE_TYPES;\r\n\t}\r\n}\r\n\r\nfunction fromConfig(config, template) {\r\n\tconst o = { tokenmagic: { options: {} } };\r\n\tif (config.preset && config.preset !== '' && config.preset !== emptyPreset) {\r\n\t\to.tokenmagic.options.tmfxPreset = config.preset;\r\n\t}\r\n\tif (config.texture && config.texture !== '') {\r\n\t\to.tokenmagic.options.tmfxTexture = config.texture;\r\n\t}\r\n\tif (config.tint && config.tint !== '') {\r\n\t\to.tokenmagic.options.tmfxTint = config.tint;\r\n\t}\r\n\to.tokenmagic.options.tmfxTextureAlpha = config.opacity;\r\n\ttemplate.updateSource({ flags: { tokenmagic: o.tokenmagic } });\r\n}\r\n\r\nfunction fromOverrides(overrides = [], activity, template) {\r\n\tif (!activity.item) return false;\r\n\tlet configs = overrides.filter((el) => el.target.toLowerCase() === activity.item.name.toLowerCase());\r\n\tif (configs.length === 0) {\r\n\t\treturn false;\r\n\t}\r\n\t// if there are multiple overrides for the same item, the random one is chosen\r\n\tlet config = configs[Math.floor(Math.random() * configs.length)];\r\n\tfromConfig(config, template);\r\n\treturn true;\r\n}\r\n\r\nfunction fromCategories(categories = {}, activity, template) {\r\n\tif (!activity.item) return false;\r\n\r\n\tlet item = activity.item;\r\n\tif (!(item.hasAttack || item.hasSave) && !item.system.damage?.base?.types.size) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tlet config, dmgSettings;\r\n\r\n\tlet dmgTypes = [];\r\n\tif (item.system?.damage?.base?.types) {\r\n\t\tdmgTypes = item.system.damage.base.types;\r\n\t}\r\n\tif (!dmgTypes.length && item.system.activities) {\r\n\t\tconst saves = item.system.activities.getByType('save');\r\n\t\tif (saves.length) {\r\n\t\t\tdmgTypes = saves.flatMap((save) => save.damage.parts.flatMap((part) => Array.from(part.types)));\r\n\t\t}\r\n\t}\r\n\r\n\t// some items/spells have multiple damage types\r\n\t// this loop looks over all the types until it finds one with a valid fx preset\r\n\tfor (const dmgType of dmgTypes) {\r\n\t\tdmgSettings = categories[dmgType] || {};\r\n\t\tconfig = dmgSettings[template.t];\r\n\r\n\t\tif (config && config.preset !== emptyPreset) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tif (!config) {\r\n\t\treturn false;\r\n\t}\r\n\tfromConfig(\r\n\t\tfoundry.utils.mergeObject(config, { opacity: dmgSettings.opacity, tint: dmgSettings.tint }, true, true),\r\n\t\ttemplate\r\n\t);\r\n\treturn true;\r\n}\r\n\r\nfunction fromActivity(wrapped, ...args) {\r\n\tconst [activity] = args;\r\n\tconst activityTemplates = wrapped(...args);\r\n\tif (!activityTemplates) {\r\n\t\treturn activityTemplates;\r\n\t}\r\n\r\n\tfor (const activityTemplate of activityTemplates) {\r\n\t\tconst template = activityTemplate.document;\r\n\r\n\t\tlet hasPreset = template.hasOwnProperty('tmfxPreset');\r\n\t\tif (hasPreset) continue;\r\n\r\n\t\tconst settings = game.settings.get('tokenmagic', 'autoTemplateSettings');\r\n\t\tlet updated = settings.overrides ? fromOverrides(Object.values(settings.overrides), activity, template) : false;\r\n\t\tif (!updated) {\r\n\t\t\tfromCategories(settings.categories, activity, template);\r\n\t\t}\r\n\t}\r\n\r\n\treturn activityTemplates;\r\n}\r\n","import { defaultOpacity, emptyPreset } from '../../../module/constants.js';\r\nimport { TemplateSettings } from './TemplateSettings.js';\r\n\r\nexport class AutoTemplatePF2E extends TemplateSettings {\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis._enabled = false;\r\n\t}\r\n\r\n\t/** @override */\r\n\tstatic PARTS = {\r\n\t\ttabs: { template: 'templates/generic/tab-navigation.hbs' },\r\n\t\tcategories: { template: 'modules/tokenmagic/templates/settings/generic/categories.hbs' },\r\n\t\toverrides: { template: 'modules/tokenmagic/templates/settings/generic/overrides.hbs' },\r\n\t};\r\n\r\n\tstatic get defaultConfiguration() {\r\n\t\tconst defaultConfig = {\r\n\t\t\tcategories: {},\r\n\t\t\toverrides: {\r\n\t\t\t\t0: {\r\n\t\t\t\t\ttarget: 'Stinking Cloud',\r\n\t\t\t\t\topacity: 0.5,\r\n\t\t\t\t\ttint: '#00a80b',\r\n\t\t\t\t\tpreset: 'Smoky Area',\r\n\t\t\t\t\ttexture: null,\r\n\t\t\t\t},\r\n\t\t\t\t1: {\r\n\t\t\t\t\ttarget: 'Sanguine Mist',\r\n\t\t\t\t\topacity: 0.6,\r\n\t\t\t\t\ttint: '#c41212',\r\n\t\t\t\t\tpreset: 'Smoky Area',\r\n\t\t\t\t},\r\n\t\t\t\t2: {\r\n\t\t\t\t\ttarget: 'Web',\r\n\t\t\t\t\topacity: 0.5,\r\n\t\t\t\t\ttint: '#808080',\r\n\t\t\t\t\tpreset: 'Spider Web 2',\r\n\t\t\t\t\ttexture: null,\r\n\t\t\t\t},\r\n\t\t\t\t3: {\r\n\t\t\t\t\ttarget: 'Incendiary Aura',\r\n\t\t\t\t\topacity: 0.2,\r\n\t\t\t\t\ttint: '#b12910',\r\n\t\t\t\t\tpreset: 'Smoke Filaments',\r\n\t\t\t\t\ttexture: null,\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t};\r\n\r\n\t\tObject.keys(CONFIG.PF2E.damageTraits).forEach((dmgType) => {\r\n\t\t\tif (defaultConfig.categories[dmgType] == undefined) {\r\n\t\t\t\tconst config = { opacity: defaultOpacity, tint: null };\r\n\t\t\t\tswitch (dmgType.toLowerCase()) {\r\n\t\t\t\t\tcase 'acid':\r\n\t\t\t\t\t\tconfig.tint = '#2d8000';\r\n\t\t\t\t\t\tconfig.opacity = 0.6;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'cold':\r\n\t\t\t\t\t\tconfig.tint = '#47b3ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'electricity':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'fire':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'force':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mental':\r\n\t\t\t\t\t\tconfig.tint = '#8000ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'negative':\r\n\t\t\t\t\t\tconfig.tint = '#502673';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'poison':\r\n\t\t\t\t\t\tconfig.tint = '#00a80b';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'positive':\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'sonic':\r\n\t\t\t\t\t\tconfig.tint = '#0060ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefaultConfig.categories[dmgType] = config;\r\n\t\t\t}\r\n\t\t\tObject.values(CONST.MEASURED_TEMPLATE_TYPES).forEach((tplType) => {\r\n\t\t\t\tconst config = { preset: emptyPreset, texture: null };\r\n\t\t\t\tswitch (dmgType.toLowerCase()) {\r\n\t\t\t\t\tcase 'acid':\r\n\t\t\t\t\t\tconfig.preset = 'Watery Surface 2';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'cold':\r\n\t\t\t\t\t\tconfig.preset = 'Thick Fog';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'electricity':\r\n\t\t\t\t\t\tconfig.preset = 'Shock';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'fire':\r\n\t\t\t\t\t\tconfig.preset = 'Flames';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'force':\r\n\t\t\t\t\t\tconfig.preset = 'Waves 3';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'mental':\r\n\t\t\t\t\t\tconfig.preset = 'Classic Rays';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'negative':\r\n\t\t\t\t\t\tconfig.preset = 'Smoke Filaments';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'poison':\r\n\t\t\t\t\t\tconfig.preset = 'Smoky Area';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'positive':\r\n\t\t\t\t\t\tconfig.preset = 'Annihilating Rays';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'sonic':\r\n\t\t\t\t\t\tconfig.preset = 'Waves';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefaultConfig.categories[dmgType][tplType] = config;\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\treturn defaultConfig;\r\n\t}\r\n\r\n\tconfigure(enabled = false) {\r\n\t\tif (game.system.id !== 'pf2e') return;\r\n\t\tthis._enabled = enabled;\r\n\t}\r\n\r\n\tget enabled() {\r\n\t\treturn this._enabled;\r\n\t}\r\n\r\n\tset enabled(value) {}\r\n\r\n\t/** @override */\r\n\tasync _preparePartContext(partId, context, options) {\r\n\t\tawait super._preparePartContext(partId, context, options);\r\n\t\tswitch (partId) {\r\n\t\t\tcase 'categories':\r\n\t\t\t\tthis._prepareCategoriesContext(context, options);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn context;\r\n\t}\r\n\r\n\t_prepareCategoriesContext(context, options) {\r\n\t\tconst dmgTypes = {};\r\n\t\tfor (const type of Object.keys(CONFIG.PF2E.damageTraits).sort((k1, k2) => k1.localeCompare(k2))) {\r\n\t\t\tdmgTypes[type] = { label: type.charAt(0).toUpperCase() + type.slice(1) };\r\n\t\t}\r\n\t\tcontext.dmgTypes = dmgTypes;\r\n\t\tcontext.templateTypes = CONST.MEASURED_TEMPLATE_TYPES;\r\n\t}\r\n\r\n\tpreCreateMeasuredTemplate(template) {\r\n\t\tlet hasPreset = template.hasOwnProperty('tmfxPreset');\r\n\t\tif (hasPreset) {\r\n\t\t\treturn template;\r\n\t\t}\r\n\r\n\t\tconst origin = template.flags?.pf2e?.origin;\r\n\t\tconst settings = game.settings.get('tokenmagic', 'autoTemplateSettings');\r\n\t\tlet updated = settings.overrides ? fromOverrides(Object.values(settings.overrides), origin, template) : false;\r\n\t\tif (!updated) {\r\n\t\t\tfromCategories(settings.categories, origin, template);\r\n\t\t}\r\n\t\treturn template;\r\n\t}\r\n}\r\n\r\nfunction fromConfig(config, template) {\r\n\tconst o = { tokenmagic: { options: {} } };\r\n\tif (config.preset && config.preset !== '' && config.preset !== emptyPreset) {\r\n\t\to.tokenmagic.options.tmfxPreset = config.preset;\r\n\t}\r\n\tif (config.texture && config.texture !== '') {\r\n\t\to.tokenmagic.options.tmfxTexture = config.texture;\r\n\t}\r\n\tif (config.tint && config.tint !== '') {\r\n\t\to.tokenmagic.options.tmfxTint = config.tint;\r\n\t}\r\n\to.tokenmagic.options.tmfxTextureAlpha = config.opacity;\r\n\ttemplate.updateSource({ flags: { tokenmagic: o.tokenmagic } });\r\n}\r\n\r\nfunction fromOverrides(overrides = [], origin, template) {\r\n\tconst { name, slug } = origin;\r\n\r\n\tlet configs = overrides.filter((el) => el.target.toLowerCase() === name?.toLowerCase());\r\n\tif (configs.length === 0) {\r\n\t\treturn false;\r\n\t}\r\n\t// if there are multiple overrides for the same item, the random one is chosen\r\n\tlet config = configs[Math.floor(Math.random() * configs.length)];\r\n\tfromConfig(config, template);\r\n\treturn true;\r\n}\r\n\r\nfunction fromCategories(categories = {}, origin, template) {\r\n\tif (!origin.traits?.length) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tlet config, dmgSettings;\r\n\r\n\t// some templates may have multiple traits\r\n\t// this loop looks over all of them until it finds one with a valid fx preset\r\n\tfor (const trait of origin.traits) {\r\n\t\tdmgSettings = categories[trait.toLowerCase()] || {};\r\n\t\tconfig = dmgSettings[template.t];\r\n\r\n\t\tif (config && config.preset !== emptyPreset) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\tif (!config) {\r\n\t\treturn false;\r\n\t}\r\n\tfromConfig(\r\n\t\tfoundry.utils.mergeObject(config, { opacity: dmgSettings.opacity, tint: dmgSettings.tint }, true, true),\r\n\t\ttemplate\r\n\t);\r\n\treturn true;\r\n}\r\n","import { defaultOpacity, emptyPreset } from '../../../module/constants.js';\r\nimport { TemplateSettings } from './TemplateSettings.js';\r\n\r\nexport class AutoTemplateTheWitcherTRPG extends TemplateSettings {\r\n\tconstructor() {\r\n\t\tsuper();\r\n\t\tthis._enabled = false;\r\n\t}\r\n\r\n\t/** @override */\r\n\tstatic PARTS = {\r\n\t\ttabs: { template: 'templates/generic/tab-navigation.hbs' },\r\n\t\tcategories: { template: 'modules/tokenmagic/templates/settings/generic/categories.hbs' },\r\n\t\toverrides: { template: 'modules/tokenmagic/templates/settings/generic/overrides.hbs' },\r\n\t};\r\n\r\n\tstatic get defaultConfiguration() {\r\n\t\tconst defaultConfig = {\r\n\t\t\tcategories: {},\r\n\t\t\toverrides: {\r\n\t\t\t\t0: {\r\n\t\t\t\t\ttarget: 'Игни',\r\n\t\t\t\t\topacity: 0.5,\r\n\t\t\t\t\ttint: '#00a80b',\r\n\t\t\t\t\tpreset: 'Flames',\r\n\t\t\t\t\ttexture: null,\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t};\r\n\r\n\t\tObject.keys(CONFIG.WITCHER.meleeSkills).forEach((meleeSkillType) => {\r\n\t\t\tif (defaultConfig.categories[meleeSkillType] == undefined) {\r\n\t\t\t\tconst config = { opacity: defaultOpacity, tint: null };\r\n\t\t\t\tswitch (meleeSkillType.toLowerCase()) {\r\n\t\t\t\t\tcase 'brawling':\r\n\t\t\t\t\t\tconfig.tint = '#2d8000';\r\n\t\t\t\t\t\tconfig.opacity = 0.6;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'melee':\r\n\t\t\t\t\t\tconfig.tint = '#47b3ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'small blades':\r\n\t\t\t\t\t\tconfig.tint = '#502673';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'staff/spear':\r\n\t\t\t\t\t\tconfig.tint = '#00a80b';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'swordsmanship':\r\n\t\t\t\t\t\tconfig.tint = '#8000ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'athletics':\r\n\t\t\t\t\t\tconfig.tint = '#0060ff';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefaultConfig.categories[meleeSkillType] = config;\r\n\t\t\t}\r\n\t\t\tObject.values(CONST.MEASURED_TEMPLATE_TYPES).forEach((tplType) => {\r\n\t\t\t\tconst config = { preset: emptyPreset, texture: null };\r\n\t\t\t\tswitch (meleeSkillType.toLowerCase()) {\r\n\t\t\t\t\tcase 'acid':\r\n\t\t\t\t\t\tconfig.preset = 'slashing';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'cold':\r\n\t\t\t\t\t\tconfig.preset = 'bludgeoning';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'fire':\r\n\t\t\t\t\t\tconfig.preset = 'piercing';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase 'force':\r\n\t\t\t\t\t\tconfig.preset = 'elemental';\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tdefaultConfig.categories[meleeSkillType][tplType] = config;\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\treturn defaultConfig;\r\n\t}\r\n\r\n\tget enabled() {\r\n\t\treturn this._enabled;\r\n\t}\r\n\r\n\tconfigure(enabled = false) {\r\n\t\tif (game.system.id !== 'TheWitcherTRPG') return;\r\n\t\tthis._enabled = enabled;\r\n\t}\r\n\r\n\t/** @override */\r\n\tasync _preparePartContext(partId, context, options) {\r\n\t\tawait super._preparePartContext(partId, context, options);\r\n\t\tswitch (partId) {\r\n\t\t\tcase 'categories':\r\n\t\t\t\tthis._prepareCategoriesContext(context, options);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\treturn context;\r\n\t}\r\n\r\n\t_prepareCategoriesContext(context, options) {\r\n\t\tconst dmgTypes = {};\r\n\t\tfor (const type of CONFIG.WITCHER.meleeSkills.sort((k1, k2) => k1.localeCompare(k2))) {\r\n\t\t\tdmgTypes[type] = { label: type.charAt(0).toUpperCase() + type.slice(1) };\r\n\t\t}\r\n\t\tcontext.dmgTypes = dmgTypes;\r\n\t\tcontext.templateTypes = CONST.MEASURED_TEMPLATE_TYPES;\r\n\t}\r\n\r\n\tpreCreateMeasuredTemplate(template) {\r\n\t\tlet hasPreset = template.hasOwnProperty('tmfxPreset');\r\n\t\tif (hasPreset) {\r\n\t\t\treturn template;\r\n\t\t}\r\n\t\tconst settings = game.settings.get('tokenmagic', 'autoTemplateSettings');\r\n\t\tlet updated = settings.overrides ? fromOverrides(Object.values(settings.overrides), template) : false;\r\n\t\tif (!updated) {\r\n\t\t\tfromCategories(settings.categories, template);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction fromConfig(config, templateData) {\r\n\tconst o = { tokenmagic: { options: {} } };\r\n\tif (config.preset && config.preset !== '' && config.preset !== emptyPreset) {\r\n\t\to.tokenmagic.options.tmfxPreset = config.preset;\r\n\t}\r\n\tif (config.texture && config.texture !== '') {\r\n\t\to.tokenmagic.options.tmfxTexture = config.texture;\r\n\t}\r\n\tif (config.tint && config.tint !== '') {\r\n\t\to.tokenmagic.options.tmfxTint = config.tint;\r\n\t}\r\n\to.tokenmagic.options.tmfxTextureAlpha = config.opacity;\r\n\tfoundry.utils.mergeObject(templateData, { 'flags.tokenmagic': o.tokenmagic });\r\n}\r\n\r\nfunction fromOverrides(overrides = [], templateData) {\r\n\tconst name = templateData.flags.witcher?.origin?.name;\r\n\tlet config = overrides.find((el) => el.target.toLowerCase() === name?.toLowerCase());\r\n\tif (!config) {\r\n\t\treturn false;\r\n\t}\r\n\tfromConfig(config, templateData);\r\n\treturn true;\r\n}\r\n\r\nfunction fromCategories(categories = {}, templateData) {\r\n\tconst traits = templateData.flags.witcher?.origin?.traits ?? [];\r\n\r\n\tlet config, dmgSettings;\r\n\tfor (const trait of traits) {\r\n\t\tdmgSettings = categories[trait] || {};\r\n\t\tconfig = dmgSettings[templateData.t];\r\n\r\n\t\tif (config && config.preset !== emptyPreset) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!config) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tfromConfig(\r\n\t\tfoundry.utils.mergeObject(config, { opacity: dmgSettings.opacity, tint: dmgSettings.tint }, true, true),\r\n\t\ttemplateData\r\n\t);\r\n\treturn true;\r\n}\r\n","import { presets as defaultPresets } from '../fx/presets/defaultpresets.js';\r\nimport { DataVersion } from '../migration/migration.js';\r\nimport { TokenMagic, isVideoDisabled, fixPath } from './tokenmagic.js';\r\nimport { AutoTemplateDND5E } from '../gui/apps/autoTemplate/dnd5e.js';\r\nimport { AutoTemplatePF2E } from '../gui/apps/autoTemplate/pf2e.js';\r\nimport { AutoTemplateTheWitcherTRPG } from '../gui/apps/autoTemplate/TheWitcherTRPG.js';\r\nimport { emptyPreset } from './constants.js';\r\n\r\nconst Magic = TokenMagic();\r\n\r\nexport class TokenMagicSettings {\r\n\tstatic init() {\r\n\t\tconst autoTemplateClass = this.getSystemTemplateClass();\r\n\t\tconst hasAutoTemplates = !!autoTemplateClass;\r\n\t\tif (autoTemplateClass) {\r\n\t\t\tgame.settings.registerMenu('tokenmagic', 'autoTemplateSettings', {\r\n\t\t\t\tname: game.i18n.localize('TMFX.settings.autoTemplateSettings.button.name'),\r\n\t\t\t\tlabel: game.i18n.localize('TMFX.settings.autoTemplateSettings.button.label'),\r\n\t\t\t\thint: game.i18n.localize('TMFX.settings.autoTemplateSettings.button.hint'),\r\n\t\t\t\ttype: autoTemplateClass,\r\n\t\t\t\trestricted: true,\r\n\t\t\t});\r\n\t\t\tgame.settings.register('tokenmagic', 'autoTemplateSettings', {\r\n\t\t\t\tname: game.i18n.localize('TMFX.settings.autoTemplateSettings.name'),\r\n\t\t\t\thint: game.i18n.localize('TMFX.settings.autoTemplateSettings.hint'),\r\n\t\t\t\tscope: 'world',\r\n\t\t\t\tconfig: false,\r\n\t\t\t\tdefault: autoTemplateClass.defaultConfiguration,\r\n\t\t\t\ttype: Object,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tgame.settings.register('tokenmagic', 'autoTemplateEnabled', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.autoTemplateEnabled.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.autoTemplateEnabled.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: hasAutoTemplates,\r\n\t\t\tdefault: hasAutoTemplates,\r\n\t\t\ttype: Boolean,\r\n\t\t\tonChange: (value) => TokenMagicSettings.configureAutoTemplate(value),\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'defaultTemplateOnHover', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.defaultTemplateOnHover.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.defaultTemplateOnHover.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: hasAutoTemplates,\r\n\t\t\ttype: Boolean,\r\n\t\t\trequiresReload: true,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'autohideTemplateElements', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.autohideTemplateElements.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.autohideTemplateElements.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: true,\r\n\t\t\ttype: Boolean,\r\n\t\t\trequiresReload: true,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'useAdditivePadding', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.useMaxPadding.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.useMaxPadding.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: false,\r\n\t\t\ttype: Boolean,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'minPadding', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.minPadding.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.minPadding.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: 50,\r\n\t\t\ttype: Number,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'fxPlayerPermission', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.fxPlayerPermission.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.fxPlayerPermission.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: false,\r\n\t\t\ttype: Boolean,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'importOverwrite', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.importOverwrite.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.importOverwrite.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: false,\r\n\t\t\ttype: Boolean,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'useZOrder', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.useZOrder.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.useZOrder.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: false,\r\n\t\t\ttype: Boolean,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'disableAnimations', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.disableAnimations.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.disableAnimations.hint'),\r\n\t\t\tscope: 'client',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: false,\r\n\t\t\ttype: Boolean,\r\n\t\t\trequiresReload: true,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'disableCaching', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.disableCaching.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.disableCaching.hint'),\r\n\t\t\tscope: 'client',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: true,\r\n\t\t\ttype: Boolean,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'disableVideo', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.disableVideo.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.disableVideo.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: false,\r\n\t\t\ttype: Boolean,\r\n\t\t\trequiresReload: true,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'presets', {\r\n\t\t\tname: 'Token Magic FX presets',\r\n\t\t\thint: 'Token Magic FX presets',\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: false,\r\n\t\t\tdefault: defaultPresets,\r\n\t\t\ttype: Object,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'migration', {\r\n\t\t\tname: 'TMFX Data Version',\r\n\t\t\thint: 'TMFX Data Version',\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: false,\r\n\t\t\tdefault: DataVersion.ARCHAIC,\r\n\t\t\ttype: String,\r\n\t\t});\r\n\r\n\t\tgame.settings.register('tokenmagic', 'alwaysDisplayEditorControl', {\r\n\t\t\tname: game.i18n.localize('TMFX.settings.alwaysDisplayEditorControl.name'),\r\n\t\t\thint: game.i18n.localize('TMFX.settings.alwaysDisplayEditorControl.hint'),\r\n\t\t\tscope: 'world',\r\n\t\t\tconfig: true,\r\n\t\t\tdefault: true,\r\n\t\t\ttype: Boolean,\r\n\t\t});\r\n\t}\r\n\r\n\tstatic configureAutoTemplate(enabled = false) {\r\n\t\tthis.getSystemTemplates()?.configure(enabled);\r\n\t}\r\n\r\n\tstatic getSystemTemplates() {\r\n\t\tif (this._autoTemplate) return this._autoTemplate;\r\n\r\n\t\tconst cls = this.getSystemTemplateClass();\r\n\t\tthis._autoTemplate = cls ? new cls() : null;\r\n\r\n\t\treturn this._autoTemplate;\r\n\t}\r\n\r\n\tstatic getSystemTemplateClass() {\r\n\t\tswitch (game.system.id) {\r\n\t\t\tcase 'dnd5e':\r\n\t\t\t\treturn AutoTemplateDND5E;\r\n\t\t\tcase 'pf2e':\r\n\t\t\t\treturn AutoTemplatePF2E;\r\n\t\t\tcase 'TheWitcherTRPG':\r\n\t\t\t\treturn AutoTemplateTheWitcherTRPG;\r\n\t\t\tdefault:\r\n\t\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nHooks.once('init', () => {\r\n\t// Extracted from https://github.com/leapfrogtechnology/just-handlebars-helpers/\r\n\tHandlebars.registerHelper('concat', function (...params) {\r\n\t\t// Ignore the object appended by handlebars.\r\n\t\tif (typeof params[params.length - 1] === 'object') {\r\n\t\t\tparams.pop();\r\n\t\t}\r\n\r\n\t\treturn params.join('');\r\n\t});\r\n\tTokenMagicSettings.init();\r\n\tTokenMagicSettings.configureAutoTemplate(game.settings.get('tokenmagic', 'autoTemplateEnabled'));\r\n\r\n\tconst wmtdUpdate = async function (wrapped, ...args) {\r\n\t\tconst [update] = args;\r\n\t\tlet preset, hasPresetData;\r\n\r\n\t\tconst tex = update.texture ?? '';\r\n\t\tconst hasTexture = !!update.texture;\r\n\t\tconst opt = update.flags?.tokenmagic?.options ?? null;\r\n\t\tif (!opt) {\r\n\t\t\tpreset = update['flags.tokenmagic.templateData.preset'];\r\n\t\t}\r\n\t\thasPresetData = !!preset;\r\n\r\n\t\tif (hasTexture) {\r\n\t\t\tupdate.texture = fixPath(update.texture);\r\n\t\t}\r\n\r\n\t\tif (opt == null) {\r\n\t\t\tif (hasPresetData && preset !== emptyPreset) {\r\n\t\t\t\tlet defaultTexture = Magic._getPresetTemplateDefaultTexture(preset);\r\n\t\t\t\tif (!(defaultTexture == null)) {\r\n\t\t\t\t\tif (tex === '' || tex.startsWith('modules/tokenmagic/fx/assets/templates/')) update.texture = defaultTexture;\r\n\t\t\t\t}\r\n\t\t\t} else if (\r\n\t\t\t\thasTexture &&\r\n\t\t\t\ttex.startsWith('modules/tokenmagic/fx/assets/templates/') &&\r\n\t\t\t\thasPresetData &&\r\n\t\t\t\tpreset === emptyPreset\r\n\t\t\t) {\r\n\t\t\t\tdocument.texture = '';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn await wrapped(...args);\r\n\t};\r\n\r\n\tconst wmtDraw = async function (wrapped, ...args) {\r\n\t\tif (this.document.texture) {\r\n\t\t\tthis.document.texture = fixPath(this.document.texture);\r\n\t\t}\r\n\t\treturn await wrapped(...args);\r\n\t};\r\n\r\n\tlet wmtApplyRenderFlags;\r\n\tlet wmtApplyRenderFlagsType;\r\n\r\n\tlet wmtRefreshTemplate;\r\n\r\n\tif (!isVideoDisabled()) {\r\n\t\tconst toRadians = Math.toRadians;\r\n\r\n\t\twmtApplyRenderFlagsType = 'WRAPPER';\r\n\r\n\t\twmtApplyRenderFlags = function (wrapped, ...args) {\r\n\t\t\tconst [flags] = args;\r\n\t\t\tif (flags?.refreshShape) flags.refreshShape = this.template && !this.template._destroyed;\r\n\t\t\treturn wrapped(...args);\r\n\t\t};\r\n\r\n\t\t/* ------------------------------------------------------------------------------------ */\r\n\r\n\t\t/**\r\n\t\t *\r\n\t\t * @return {wmtRefreshTemplate}\r\n\t\t */\r\n\t\twmtRefreshTemplate = function () {\r\n\t\t\tconst t = this.template.clear();\r\n\t\t\tif (!this.isVisible) return;\r\n\r\n\t\t\t// Draw the Template outline\r\n\t\t\tt.lineStyle(this._borderThickness, this.document.borderColor, 0.75).beginFill(0x000000, 0.0);\r\n\r\n\t\t\t// Fill Color or Texture\r\n\t\t\tif (this.texture) {\r\n\t\t\t\tlet mat = PIXI.Matrix.IDENTITY;\r\n\t\t\t\t// rectangle\r\n\t\t\t\tif (this.shape.width && this.shape.height)\r\n\t\t\t\t\tmat.scale(this.shape.width / this.texture.width, this.shape.height / this.texture.height);\r\n\t\t\t\telse if (this.shape.radius) {\r\n\t\t\t\t\tmat.scale((this.shape.radius * 2) / this.texture.height, (this.shape.radius * 2) / this.texture.width);\r\n\t\t\t\t\t// Circle center is texture start...\r\n\t\t\t\t\tmat.translate(-this.shape.radius, -this.shape.radius);\r\n\t\t\t\t} else if (this.document.t === 'ray') {\r\n\t\t\t\t\tconst d = canvas.dimensions,\r\n\t\t\t\t\t\theight = (this.document.width * d.size) / d.distance,\r\n\t\t\t\t\t\twidth = (this.document.distance * d.size) / d.distance;\r\n\t\t\t\t\tmat.scale(width / this.texture.width, height / this.texture.height);\r\n\t\t\t\t\tmat.translate(0, -height * 0.5);\r\n\r\n\t\t\t\t\tmat.rotate(toRadians(this.document.direction));\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// cone\r\n\t\t\t\t\tconst d = canvas.dimensions;\r\n\r\n\t\t\t\t\t// Extract and prepare data\r\n\t\t\t\t\tlet { direction, distance, angle } = this.document;\r\n\t\t\t\t\tdistance *= d.size / d.distance;\r\n\t\t\t\t\tdirection = Math.toRadians(direction);\r\n\t\t\t\t\tconst width = (this.document.distance * d.size) / d.distance;\r\n\r\n\t\t\t\t\tconst angles = [angle / -2, angle / 2];\r\n\t\t\t\t\tdistance = distance / Math.cos(Math.toRadians(angle / 2));\r\n\r\n\t\t\t\t\t// Get the cone shape as a polygon\r\n\t\t\t\t\tconst rays = angles.map((a) => Ray.fromAngle(0, 0, direction + Math.toRadians(a), distance + 1));\r\n\t\t\t\t\tconst height = Math.sqrt(\r\n\t\t\t\t\t\t(rays[0].B.x - rays[1].B.x) * (rays[0].B.x - rays[1].B.x) +\r\n\t\t\t\t\t\t\t(rays[0].B.y - rays[1].B.y) * (rays[0].B.y - rays[1].B.y),\r\n\t\t\t\t\t);\r\n\t\t\t\t\tmat.scale(width / this.texture.width, height / this.texture.height);\r\n\t\t\t\t\tmat.translate(0, -height / 2);\r\n\t\t\t\t\tmat.rotate(toRadians(this.document.direction));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tt.beginTextureFill({\r\n\t\t\t\t\ttexture: this.texture,\r\n\t\t\t\t\tmatrix: mat,\r\n\t\t\t\t\talpha: 1.0,\r\n\t\t\t\t});\r\n\t\t\t\tconst source = foundry.utils.getProperty(this.texture, 'baseTexture.resource.source');\r\n\t\t\t\tif (source && source.tagName === 'VIDEO') {\r\n\t\t\t\t\tsource.loop = true;\r\n\t\t\t\t\tsource.muted = true;\r\n\t\t\t\t\tgame.video.play(source);\r\n\t\t\t\t}\r\n\t\t\t} else t.beginFill(0x000000, 0.0);\r\n\r\n\t\t\t// Draw the shape\r\n\t\t\tt.drawShape(this.shape);\r\n\r\n\t\t\t// Draw origin and destination points\r\n\t\t\tt.lineStyle(this._borderThickness, 0x000000)\r\n\t\t\t\t.beginFill(0x000000, 0.5)\r\n\t\t\t\t.drawCircle(0, 0, 6)\r\n\t\t\t\t.drawCircle(this.ray.dx, this.ray.dy, 6)\r\n\t\t\t\t.endFill();\r\n\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\t\t/* ------------------------------------------------------------------------------------ */\r\n\t}\r\n\r\n\tif (game.settings.get('tokenmagic', 'autohideTemplateElements')) {\r\n\t\t/**\r\n\t\t *\r\n\t\t * @param wrapped\r\n\t\t * @param args\r\n\t\t * @return {*}\r\n\t\t */\r\n\t\tconst autohideTemplateElements = function (wrapped, ...args) {\r\n\t\t\t// Save texture and border thickness\r\n\t\t\tconst texture = this.texture;\r\n\t\t\tconst borderThickness = this._borderThickness;\r\n\r\n\t\t\t// Hide template texture while moving\r\n\t\t\tif (this._original || this.parent === canvas.templates.preview) {\r\n\t\t\t\tthis.texture = null;\r\n\t\t\t}\r\n\r\n\t\t\t// Show border outline only on hover if the template is textured\r\n\t\t\tif (this.texture && this.texture !== '' && !this._hover) {\r\n\t\t\t\tthis._borderThickness = 0;\r\n\t\t\t}\r\n\r\n\t\t\tconst retVal = wrapped(...args);\r\n\r\n\t\t\t// Restore texture and border thickness\r\n\t\t\tthis.texture = texture;\r\n\t\t\tthis._borderThickness = borderThickness;\r\n\r\n\t\t\t{\r\n\t\t\t\t// Show the origin/destination points and ruler text only on hover or while creating but not while moving\r\n\t\t\t\tconst template = this._original ?? this;\r\n\t\t\t\tconst show = !this._original && (this._hover || this.parent === canvas.templates.preview);\r\n\r\n\t\t\t\tif (!show && template.template?.geometry) {\r\n\t\t\t\t\t// Hide origin and destination points, i.e., hide everything except the template shape\r\n\t\t\t\t\tfor (const document of template.template.geometry.graphicsData) {\r\n\t\t\t\t\t\tif (document.shape !== template.shape) {\r\n\t\t\t\t\t\t\tdocument.fillStyle.visible = false;\r\n\t\t\t\t\t\t\tdocument.lineStyle.visible = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttemplate.template.geometry.invalidate();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (template.ruler) template.ruler.renderable = show;\r\n\t\t\t\tif (template.controlIcon) template.controlIcon.renderable = template.isOwner;\r\n\t\t\t\tif (template.handle) template.handle.renderable = template.isOwner;\r\n\t\t\t}\r\n\t\t\treturn retVal;\r\n\t\t};\r\n\r\n\t\t/* ------------------------------------------------------------------------------------ */\r\n\r\n\t\tif (wmtApplyRenderFlags) {\r\n\t\t\tconst _wmtApplyRenderFlags = wmtApplyRenderFlags;\r\n\t\t\twmtApplyRenderFlags = function () {\r\n\t\t\t\treturn autohideTemplateElements.call(this, _wmtApplyRenderFlags.bind(this), ...arguments);\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\twmtApplyRenderFlagsType = 'WRAPPER';\r\n\t\t\twmtApplyRenderFlags = autohideTemplateElements;\r\n\t\t}\r\n\t}\r\n\r\n\tif (game.settings.get('tokenmagic', 'defaultTemplateOnHover')) {\r\n\t\tHooks.on('canvasReady', () => {\r\n\t\t\tcanvas.stage.on('mousemove', (event) => {\r\n\t\t\t\tconst { x: mx, y: my } = event.data.getLocalPosition(canvas.templates);\r\n\t\t\t\tfor (const template of canvas.templates.placeables) {\r\n\t\t\t\t\tconst hl = canvas.interface.grid.getHighlightLayer(template.highlightId);\r\n\t\t\t\t\tconst opacity = template.document.getFlag('tokenmagic', 'templateData')?.opacity ?? 1;\r\n\t\t\t\t\tif (template.texture && template.texture !== '') {\r\n\t\t\t\t\t\tconst { x: cx, y: cy } = template.center;\r\n\t\t\t\t\t\tconst mouseover = template.shape?.contains(mx - cx, my - cy);\r\n\t\t\t\t\t\thl.renderable = mouseover;\r\n\t\t\t\t\t\ttemplate.template.alpha = (mouseover ? 0.5 : 1.0) * opacity;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\thl.renderable = true;\r\n\t\t\t\t\t\ttemplate.template.alpha = opacity;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tlibWrapper.register('tokenmagic', 'MeasuredTemplateDocument.prototype.update', wmtdUpdate, 'WRAPPER');\r\n\tlibWrapper.register('tokenmagic', 'foundry.canvas.placeables.MeasuredTemplate.prototype._draw', wmtDraw, 'WRAPPER');\r\n\r\n\tlibWrapper.register(\r\n\t\t'tokenmagic',\r\n\t\t'foundry.canvas.placeables.MeasuredTemplate.prototype._refreshState',\r\n\t\tfunction (wrapped, ...args) {\r\n\t\t\tconst result = wrapped(...args);\r\n\r\n\t\t\t// Update visibility\r\n\t\t\tthis.template.alpha = this.document.getFlag('tokenmagic', 'templateData')?.opacity ?? 1;\r\n\t\t\tthis.controlIcon.visible = !!this.layer.active;\r\n\t\t\tthis.controlIcon.border.visible = !!this.hover;\r\n\r\n\t\t\treturn result;\r\n\t\t},\r\n\t\t'WRAPPER',\r\n\t);\r\n\r\n\tif (wmtApplyRenderFlags)\r\n\t\tlibWrapper.register(\r\n\t\t\t'tokenmagic',\r\n\t\t\t'foundry.canvas.placeables.MeasuredTemplate.prototype._applyRenderFlags',\r\n\t\t\twmtApplyRenderFlags,\r\n\t\t\twmtApplyRenderFlagsType,\r\n\t\t);\r\n\tif (wmtRefreshTemplate)\r\n\t\tlibWrapper.register(\r\n\t\t\t'tokenmagic',\r\n\t\t\t'foundry.canvas.placeables.MeasuredTemplate.prototype._refreshTemplate',\r\n\t\t\twmtRefreshTemplate,\r\n\t\t\t'OVERRIDE',\r\n\t\t);\r\n});\r\n","import { FilterAdjustment } from '../fx/filters/FilterAdjustment.js';\r\nimport { FilterAscii } from '../fx/filters/FilterAscii.js';\r\nimport { FilterXBloom } from '../fx/filters/FilterAdvancedBloom.js';\r\nimport { FilterDot } from '../fx/filters/FilterDot.js';\r\nimport { FilterDistortion } from '../fx/filters/FilterDistortion.js';\r\nimport { FilterOldFilm } from '../fx/filters/FilterOldFilm.js';\r\nimport { FilterGlow } from '../fx/filters/FilterGlow.js';\r\nimport { FilterOutline } from '../fx/filters/FilterOutline.js';\r\nimport { FilterBevel } from '../fx/filters/FilterBevel.js';\r\nimport { FilterDropShadow } from '../fx/filters/FilterDropShadow.js';\r\nimport { FilterTwist } from '../fx/filters/FilterTwist.js';\r\nimport { FilterZoomBlur } from '../fx/filters/FilterZoomBlur.js';\r\nimport { FilterBlur } from '../fx/filters/FilterBlur.js';\r\nimport { FilterShockwave } from '../fx/filters/FilterShockWave.js';\r\nimport { FilterBulgePinch } from '../fx/filters/FilterBulgePinch.js';\r\nimport { FilterRemoveShadow } from '../fx/filters/FilterRemoveShadow.js';\r\nimport { FilterRays } from '../fx/filters/FilterRays.js';\r\nimport { FilterFog } from '../fx/filters/FilterFog.js';\r\nimport { FilterXFog } from '../fx/filters/FilterXFog.js';\r\nimport { FilterElectric } from '../fx/filters/FilterElectric.js';\r\nimport { FilterWaves } from '../fx/filters/FilterWaves.js';\r\nimport { FilterFire } from '../fx/filters/FilterFire.js';\r\nimport { FilterFumes } from '../fx/filters/FilterFumes.js';\r\nimport { FilterFlood } from '../fx/filters/FilterFlood.js';\r\nimport { FilterSmoke } from '../fx/filters/FilterSmoke.js';\r\nimport { FilterForceField } from '../fx/filters/FilterForceField.js';\r\nimport { FilterMirrorImages } from '../fx/filters/FilterMirrorImages.js';\r\nimport { FilterXRays } from '../fx/filters/FilterXRays.js';\r\nimport { FilterLiquid } from '../fx/filters/FilterLiquid.js';\r\nimport { FilterGleamingGlow } from '../fx/filters/FilterGleamingGlow.js';\r\nimport { FilterPixelate } from '../fx/filters/FilterPixelate.js';\r\nimport { FilterSpiderWeb } from '../fx/filters/FilterSpiderWeb.js';\r\nimport { FilterSolarRipples } from '../fx/filters/FilterSolarRipples.js';\r\nimport { FilterGlobes } from '../fx/filters/FilterGlobes.js';\r\nimport { FilterTransform } from '../fx/filters/FilterTransform.js';\r\nimport { FilterSplash } from '../fx/filters/FilterSplash.js';\r\nimport { FilterPolymorph } from '../fx/filters/FilterPolymorph.js';\r\nimport { FilterXFire } from '../fx/filters/FilterXFire.js';\r\nimport { FilterSprite } from '../fx/filters/FilterSprite.js';\r\nimport { FilterSpriteMask } from '../fx/filters/FilterSpriteMask.js';\r\nimport { FilterReplaceColor } from '../fx/filters/FilterReplaceColor.js';\r\nimport { FilterDDTint } from '../fx/filters/FilterDDTint.js';\r\nimport { Anime } from '../fx/Anime.js';\r\nimport { allPresets, PresetsLibrary } from '../fx/presets/defaultpresets.js';\r\nimport { tmfxDataMigration } from '../migration/migration.js';\r\nimport { emptyPreset, PlaceableType } from './constants.js';\r\nimport './proto/PlaceableObjectProto.js';\r\nimport './proto/CanvasDocumentProto.js';\r\nimport { FilterCRT } from '../fx/filters/FilterCRT.js';\r\nimport { FilterRGBSplit } from '../fx/filters/FilterRGBSplit.js';\r\nimport { TokenMagicSettings } from './settings.js';\r\n\r\n/*\r\n\r\nIt's getting messy here !\r\nI will fix it in a future version\r\n(+ duplicated code to factorize and code to improve)\r\n\r\n*/\r\n\r\nconst moduleTM = 'module.tokenmagic';\r\n\r\n// Filters Class Keys\r\nexport const FilterType = {\r\n\tadjustment: FilterAdjustment,\r\n\tascii: FilterAscii,\r\n\tdot: FilterDot,\r\n\tdistortion: FilterDistortion,\r\n\tcrt: FilterCRT,\r\n\toldfilm: FilterOldFilm,\r\n\tglow: FilterGlow,\r\n\toutline: FilterOutline,\r\n\tbevel: FilterBevel,\r\n\txbloom: FilterXBloom,\r\n\tshadow: FilterDropShadow,\r\n\ttwist: FilterTwist,\r\n\tzoomblur: FilterZoomBlur,\r\n\tblur: FilterBlur,\r\n\tbulgepinch: FilterBulgePinch,\r\n\tzapshadow: FilterRemoveShadow,\r\n\tray: FilterRays,\r\n\tfog: FilterFog,\r\n\txfog: FilterXFog,\r\n\telectric: FilterElectric,\r\n\twave: FilterWaves,\r\n\tshockwave: FilterShockwave,\r\n\tfire: FilterFire,\r\n\tfumes: FilterFumes,\r\n\tsmoke: FilterSmoke,\r\n\tflood: FilterFlood,\r\n\timages: FilterMirrorImages,\r\n\tfield: FilterForceField,\r\n\txray: FilterXRays,\r\n\tliquid: FilterLiquid,\r\n\txglow: FilterGleamingGlow,\r\n\tpixel: FilterPixelate,\r\n\tweb: FilterSpiderWeb,\r\n\tripples: FilterSolarRipples,\r\n\tglobes: FilterGlobes,\r\n\ttransform: FilterTransform,\r\n\tsplash: FilterSplash,\r\n\tpolymorph: FilterPolymorph,\r\n\txfire: FilterXFire,\r\n\tsprite: FilterSprite,\r\n\tspriteMask: FilterSpriteMask,\r\n\treplaceColor: FilterReplaceColor,\r\n\tddTint: FilterDDTint,\r\n\trgbSplit: FilterRGBSplit,\r\n};\r\n\r\nfunction i18n(key) {\r\n\treturn game.i18n.localize(key);\r\n}\r\n\r\nasync function exportObjectAsJson(exportObj, exportName) {\r\n\tlet jsonStr = JSON.stringify(exportObj, null, 4);\r\n\r\n\tconst a = document.createElement('a');\r\n\tconst file = new Blob([jsonStr], { type: 'plain/text' });\r\n\r\n\ta.href = URL.createObjectURL(file);\r\n\ta.download = exportName + '.json';\r\n\ta.click();\r\n\r\n\tURL.revokeObjectURL(a.href);\r\n}\r\n\r\nexport const SocketAction = {\r\n\tSET_FLAG: 'TMFXSetFlag',\r\n\tSET_ANIME_FLAG: 'TMFXSetAnimeFlag',\r\n};\r\n\r\nexport function broadcast(placeable, flag, socketAction) {\r\n\tconst document = placeable.document ?? placeable;\r\n\tconst data = {\r\n\t\ttmAction: socketAction,\r\n\t\ttmPlaceableId: document.id,\r\n\t\ttmPlaceableType: document._TMFXgetPlaceableType(),\r\n\t\ttmFlag: flag,\r\n\t\ttmScene: document.parent.id,\r\n\t};\r\n\tgame.socket.emit(moduleTM, data, (resp) => {});\r\n}\r\n\r\nexport function isActiveModule(moduleName) {\r\n\treturn game.modules.has(moduleName) && game.modules.get(moduleName).active === true;\r\n}\r\n\r\nexport function getMinPadding() {\r\n\treturn game.settings.get('tokenmagic', 'minPadding');\r\n}\r\n\r\nexport function isAdditivePaddingConfig() {\r\n\treturn game.settings.get('tokenmagic', 'useAdditivePadding');\r\n}\r\n\r\nexport function isFilterCachingDisabled() {\r\n\treturn game.settings.get('tokenmagic', 'disableCaching');\r\n}\r\n\r\nexport function isVideoDisabled() {\r\n\treturn game.settings.get('tokenmagic', 'disableVideo');\r\n}\r\n\r\nexport function isTheOne() {\r\n\tconst theOne = game.users.find((user) => user.isGM && user.active);\r\n\treturn theOne && game.user === theOne;\r\n}\r\n\r\nexport function mustBroadCast() {\r\n\treturn game.settings.get('tokenmagic', 'fxPlayerPermission') && !isTheOne();\r\n}\r\n\r\nexport function autosetPaddingMode() {\r\n\tcanvas.app.renderer.filter.useMaxPadding = !isAdditivePaddingConfig();\r\n}\r\n\r\nexport function isZOrderConfig() {\r\n\treturn game.settings.get('tokenmagic', 'useZOrder');\r\n}\r\n\r\nexport function isAnimationDisabled() {\r\n\treturn game.settings.get('tokenmagic', 'disableAnimations');\r\n}\r\n\r\nexport function log(output) {\r\n\tlet logged = '%cTokenMagic %c| ' + output;\r\n\tconsole.log(logged, 'color:#4BC470', 'color:#B3B3B3');\r\n}\r\n\r\nexport function warn(output) {\r\n\tlet logged = 'TokenMagic | ' + output;\r\n\tconsole.warn(logged);\r\n}\r\n\r\nexport function error(output) {\r\n\tlet logged = 'TokenMagic | ' + output;\r\n\tconsole.error(logged);\r\n}\r\n\r\nexport function fixPath(path) {\r\n\t/*\r\n      /prefix/...               =>   ...\r\n      /modules/tokenmagic/...   =>   modules/tokenmagic/...\r\n  */\r\n\tif (path) {\r\n\t\tconst base = '/modules/tokenmagic';\r\n\t\tconst url = new URL(path, window.location.href);\r\n\r\n\t\tif (url.origin === window.location.origin) {\r\n\t\t\tlet prefix = '/';\r\n\r\n\t\t\ttry {\r\n\t\t\t\tif (ROUTE_PREFIX) {\r\n\t\t\t\t\tprefix = new URL(ROUTE_PREFIX, window.location.origin).pathname;\r\n\t\t\t\t}\r\n\t\t\t} catch (err) {}\r\n\r\n\t\t\tpath = url.pathname;\r\n\r\n\t\t\tif (prefix === '/') {\r\n\t\t\t\tpath = path.slice(1);\r\n\t\t\t} else if (path.startsWith(prefix) && (path.length === prefix.length || path[prefix.length] === '/')) {\r\n\t\t\t\tpath = path.slice(prefix.length + 1);\r\n\t\t\t} else if (path.startsWith(base) && (path.length === base.length || path[base.length] === '/')) {\r\n\t\t\t\tpath = path.slice(1);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tpath = url.href;\r\n\t\t}\r\n\t}\r\n\r\n\treturn path;\r\n}\r\n\r\nexport function getControlledPlaceables() {\r\n\tconst authorizedLayers = [canvas.tokens, canvas.tiles, canvas.drawings, canvas.regions, canvas.templates];\r\n\tif (authorizedLayers.some((layer) => layer === canvas.activeLayer)) {\r\n\t\treturn canvas.activeLayer.placeables.filter((p) => p.controlled === true) || [];\r\n\t} else return [];\r\n}\r\n\r\nexport function getTargetedTokens() {\r\n\treturn canvas.tokens.placeables.filter((placeable) => placeable.isTargeted);\r\n}\r\n\r\nexport function getPlaceableById(id, type) {\r\n\tlet placeable = null;\r\n\r\n\tfunction findPlaceable(placeables, id) {\r\n\t\tlet rplaceable = null;\r\n\t\tif (!(placeables == null) && placeables.length > 0) {\r\n\t\t\trplaceable = placeables.find((n) => n.id === id);\r\n\t\t}\r\n\t\treturn rplaceable;\r\n\t}\r\n\r\n\tswitch (type) {\r\n\t\tcase PlaceableType.TOKEN:\r\n\t\t\tplaceable = findPlaceable(canvas.tokens.placeables, id);\r\n\t\t\tbreak;\r\n\t\tcase PlaceableType.TILE:\r\n\t\t\tplaceable = findPlaceable(canvas.tiles.placeables, id);\r\n\t\t\tbreak;\r\n\t\tcase PlaceableType.TEMPLATE:\r\n\t\t\tplaceable = findPlaceable(canvas.templates.placeables, id);\r\n\t\t\tbreak;\r\n\t\tcase PlaceableType.DRAWING:\r\n\t\t\tplaceable = findPlaceable(canvas.drawings.placeables, id);\r\n\t\t\tbreak;\r\n\t\tcase PlaceableType.REGION:\r\n\t\t\tplaceable = findPlaceable(canvas.regions.placeables, id);\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\treturn placeable;\r\n}\r\n\r\n/**\r\n * Randomizes params using 'randomized' field.\r\n * 'randomized' is an object consisting of keys named after params to be randomized, which map either\r\n * to arrays or ranges which will be used to generate a random value.\r\n * e.g.\r\n * {\r\n *  param1: ['foo1', 'foo2', 'foo3'],\r\n *  param2: { list: ['foo1', 'foo2', 'foo3'], link: 'param5'},\r\n *  param3: { val1: 0, val2: 1, step: 0.1},\r\n *  param4: { val1: 0, val2: 10, step: 1, link: 'param6'},\r\n * }\r\n * 'link' will assign the same generated value to one other param.\r\n */\r\nfunction randomizeParams(params) {\r\n\tif (params.randomized.hasOwnProperty('active') && !params.randomized.active) return;\r\n\r\n\tfor (const [param, opts] of Object.entries(params.randomized)) {\r\n\t\tif (opts.hasOwnProperty('active') && !opts.active) continue;\r\n\r\n\t\tlet rVal;\r\n\t\tif (Array.isArray(opts) || opts.list?.length) {\r\n\t\t\tconst list = opts.list ?? opts;\r\n\t\t\trVal = list[Math.floor(Math.random() * list.length)];\r\n\t\t} else if (opts.color && opts.type !== 'any') {\r\n\t\t\trVal = Color.mix(opts.val1, opts.val2, Math.random());\r\n\t\t} else {\r\n\t\t\tif (typeof opts.val1 === 'boolean') {\r\n\t\t\t\trVal = Math.random() > 0.5;\r\n\t\t\t} else {\r\n\t\t\t\tconst min = Math.min(opts.val1, opts.val2);\r\n\t\t\t\tconst max = Math.max(opts.val1, opts.val2);\r\n\t\t\t\tconst step = opts.step ?? 1;\r\n\t\t\t\tconst steps = Math.floor((max - min) / step) + 1;\r\n\t\t\t\tconst randomStep = Math.floor(Math.random() * steps);\r\n\r\n\t\t\t\tconst precision = Math.max(\r\n\t\t\t\t\t(step.toString().split('.')[1] || '').length,\r\n\t\t\t\t\t(min.toString().split('.')[1] || '').length,\r\n\t\t\t\t);\r\n\r\n\t\t\t\trVal = Number((min + randomStep * step).toFixed(precision));\r\n\t\t\t}\r\n\t\t}\r\n\t\tfoundry.utils.setProperty(params, param, rVal);\r\n\t\tif (opts.hasOwnProperty('link')) foundry.utils.setProperty(params, opts.link, rVal);\r\n\t}\r\n}\r\n\r\nexport function objectAssign(target, ...sources) {\r\n\tsources.forEach((source) => {\r\n\t\tObject.keys(source).forEach((key) => {\r\n\t\t\tconst s_val = source[key];\r\n\t\t\tconst t_val = target[key];\r\n\t\t\tif (s_val instanceof Array) target[key] = [...s_val];\r\n\t\t\telse\r\n\t\t\t\ttarget[key] =\r\n\t\t\t\t\tt_val && s_val && typeof t_val === 'object' && typeof s_val === 'object' ? objectAssign(t_val, s_val) : s_val;\r\n\t\t});\r\n\t});\r\n\treturn target;\r\n}\r\n\r\nexport function TokenMagic() {\r\n\tlet _cachedContainer = new PIXI.Container();\r\n\r\n\tasync function addFiltersOnSelected(paramsArray, replace = false) {\r\n\t\tif (!Array.isArray(paramsArray)) {\r\n\t\t\tparamsArray = getPreset(paramsArray);\r\n\t\t}\r\n\r\n\t\tconst controlled = getControlledPlaceables();\r\n\r\n\t\tif (!(controlled == null) && controlled.length > 0) {\r\n\t\t\tfor (const placeable of controlled) {\r\n\t\t\t\tawait addFilters(placeable, paramsArray, replace);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tasync function addUpdateFiltersOnSelected(paramsArray) {\r\n\t\tif (!Array.isArray(paramsArray)) {\r\n\t\t\tparamsArray = getPreset(paramsArray);\r\n\t\t}\r\n\r\n\t\tconst controlled = getControlledPlaceables();\r\n\r\n\t\tif (!(controlled == null) && controlled.length > 0) {\r\n\t\t\tfor (const placeable of controlled) {\r\n\t\t\t\tawait addUpdateFilters(placeable, paramsArray);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tasync function addUpdateFiltersOnTargeted(paramsArray) {\r\n\t\tif (!Array.isArray(paramsArray)) {\r\n\t\t\tparamsArray = getPreset(paramsArray);\r\n\t\t}\r\n\r\n\t\tconst targeted = getTargetedTokens();\r\n\r\n\t\tif (!(targeted == null) && targeted.length > 0) {\r\n\t\t\tfor (const token of targeted) {\r\n\t\t\t\tawait addUpdateFilters(token, paramsArray);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tasync function addFiltersOnTargeted(paramsArray, replace = false) {\r\n\t\tif (!Array.isArray(paramsArray)) {\r\n\t\t\tparamsArray = getPreset(paramsArray);\r\n\t\t}\r\n\r\n\t\tconst targeted = getTargetedTokens();\r\n\r\n\t\tif (!(targeted == null) && targeted.length > 0) {\r\n\t\t\tfor (const token of targeted) {\r\n\t\t\t\tawait addFilters(token, paramsArray, replace);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tasync function addFilters(placeable, paramsArray, replace = false) {\r\n\t\tif (!Array.isArray(paramsArray)) {\r\n\t\t\tparamsArray = getPreset(paramsArray);\r\n\t\t}\r\n\r\n\t\tconst document = placeable.document ?? placeable;\r\n\r\n\t\tif (!(paramsArray instanceof Array && paramsArray.length > 0) || document == null) return;\r\n\r\n\t\tlet actualFlags = replace ? null : document.getFlag('tokenmagic', 'filters');\r\n\t\tlet newFlags = [];\r\n\r\n\t\tfor (const params of paramsArray) {\r\n\t\t\tif (!params.hasOwnProperty('filterType') || !FilterType.hasOwnProperty(params.filterType)) {\r\n\t\t\t\t// one invalid ? all rejected.\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!params.hasOwnProperty('rank')) {\r\n\t\t\t\tparams.rank = document._TMFXgetMaxFilterRank();\r\n\t\t\t}\r\n\r\n\t\t\tif (!params.hasOwnProperty('filterId') || params.filterId == null) {\r\n\t\t\t\tparams.filterId = foundry.utils.randomID();\r\n\t\t\t}\r\n\r\n\t\t\tif (!params.hasOwnProperty('enabled') || !(typeof params.enabled === 'boolean')) {\r\n\t\t\t\tparams.enabled = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (params.hasOwnProperty('randomized') && params.randomized) {\r\n\t\t\t\trandomizeParams(params);\r\n\t\t\t}\r\n\r\n\t\t\tparams.placeableId = document.id;\r\n\t\t\tparams.filterInternalId = foundry.utils.randomID();\r\n\t\t\tparams.filterOwner = game.data.userId;\r\n\t\t\tparams.placeableType = document._TMFXgetPlaceableType();\r\n\t\t\tparams.updateId = foundry.utils.randomID();\r\n\r\n\t\t\tnewFlags.push({\r\n\t\t\t\ttmFilters: {\r\n\t\t\t\t\ttmFilterId: params.filterId,\r\n\t\t\t\t\ttmFilterInternalId: params.filterInternalId,\r\n\t\t\t\t\ttmFilterType: params.filterType,\r\n\t\t\t\t\ttmFilterOwner: params.filterOwner,\r\n\t\t\t\t\ttmParams: params,\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (!(actualFlags == null)) {\r\n\t\t\tnewFlags = actualFlags.concat(newFlags);\r\n\t\t}\r\n\r\n\t\tawait document._TMFXsetFlag(newFlags);\r\n\t}\r\n\r\n\tasync function addUpdateFilters(placeable, paramsArray) {\r\n\t\tif ((!paramsArray) instanceof Array || paramsArray.length < 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst document = placeable.document ?? placeable;\r\n\r\n\t\tlet flags = document.getFlag('tokenmagic', 'filters');\r\n\t\tlet workingFlags = [];\r\n\t\tif (flags) {\r\n\t\t\tflags.forEach((flag) => {\r\n\t\t\t\tworkingFlags.push(foundry.utils.duplicate(flag));\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tlet newFlags = [];\r\n\t\tlet updateParams;\r\n\r\n\t\tfor (const params of paramsArray) {\r\n\t\t\tupdateParams = false;\r\n\t\t\tparams.updateId = foundry.utils.randomID();\r\n\r\n\t\t\tif (params.hasOwnProperty('randomized') && params.randomized) {\r\n\t\t\t\trandomizeParams(params);\r\n\t\t\t}\r\n\r\n\t\t\tworkingFlags.forEach((flag) => {\r\n\t\t\t\tlet match = flag.tmFilters.tmFilterId === params.filterId && flag.tmFilters.tmFilterType === params.filterType;\r\n\t\t\t\tif (match && params.hasOwnProperty('filterInternalId')) {\r\n\t\t\t\t\tmatch = flag.tmFilters.tmFilterInternalId === params.filterInternalId;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (match && flag.tmFilters.hasOwnProperty('tmParams')) {\r\n\t\t\t\t\tobjectAssign(flag.tmFilters.tmParams, params);\r\n\t\t\t\t\tupdateParams = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (!updateParams) {\r\n\t\t\t\tif (!params.hasOwnProperty('filterType') || !FilterType.hasOwnProperty(params.filterType)) {\r\n\t\t\t\t\t// one invalid ? all rejected (even the update)\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!params.hasOwnProperty('rank')) {\r\n\t\t\t\t\tparams.rank = document._TMFXgetMaxFilterRank();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!params.hasOwnProperty('filterId') || params.filterId == null) {\r\n\t\t\t\t\tparams.filterId = foundry.utils.randomID();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!params.hasOwnProperty('enabled') || !(typeof params.enabled === 'boolean')) {\r\n\t\t\t\t\tparams.enabled = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tparams.placeableId = document.id;\r\n\t\t\t\tparams.filterInternalId = foundry.utils.randomID();\r\n\t\t\t\tparams.filterOwner = game.data.userId;\r\n\t\t\t\tparams.placeableType = document._TMFXgetPlaceableType();\r\n\r\n\t\t\t\tnewFlags.push({\r\n\t\t\t\t\ttmFilters: {\r\n\t\t\t\t\t\ttmFilterId: params.filterId,\r\n\t\t\t\t\t\ttmFilterInternalId: params.filterInternalId,\r\n\t\t\t\t\t\ttmFilterType: params.filterType,\r\n\t\t\t\t\t\ttmFilterOwner: params.filterOwner,\r\n\t\t\t\t\t\ttmParams: params,\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (newFlags.length > 0) {\r\n\t\t\tworkingFlags = newFlags.concat(workingFlags);\r\n\t\t}\r\n\r\n\t\tawait document._TMFXsetFlag(workingFlags);\r\n\t}\r\n\r\n\tasync function updateFilters(paramsArray) {\r\n\t\tif (params == null || !params.hasOwnProperty('filterId')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tlet placeableIdSet = new Set();\r\n\t\tlet animations = Anime.getAnimeMap();\r\n\t\tif (animations.size <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tanimations.forEach((anime, id) => {\r\n\t\t\tlet filterIdMatch = (params) => params.filterId === anime.puppet.filterId;\r\n\t\t\tif (paramsArray.some(filterIdMatch)) {\r\n\t\t\t\tplaceableIdSet.add(anime.puppet.placeableId);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (placeableIdSet.size <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (const placeableId of placeableIdSet) {\r\n\t\t\t// we must browse the collection of placeables whatever their types\r\n\t\t\t// we have just a filterId.\r\n\t\t\tlet placeable = getPlaceableById(placeableId, PlaceableType.TOKEN);\r\n\t\t\tif (placeable == null) placeable = getPlaceableById(placeableId, PlaceableType.TEMPLATE);\r\n\t\t\tif (placeable == null) placeable = getPlaceableById(placeableId, PlaceableType.TILE);\r\n\t\t\tif (placeable == null) placeable = getPlaceableById(placeableId, PlaceableType.DRAWING);\r\n\t\t\tif (placeable == null) placeable = getPlaceableById(placeableId, PlaceableType.REGION);\r\n\r\n\t\t\tif (!(placeable == null) && placeable instanceof foundry.canvas.placeables.PlaceableObject)\r\n\t\t\t\tawait updateFiltersByPlaceable(placeable, paramsArray);\r\n\t\t}\r\n\t}\r\n\r\n\tasync function updateFiltersOnSelected(paramsArray) {\r\n\t\tlet placeables = getControlledPlaceables();\r\n\r\n\t\tif (placeables == null || placeables.length < 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (typeof paramsArray === 'string') {\r\n\t\t\tparamsArray = getPreset(paramsArray);\r\n\t\t}\r\n\t\tif (!(paramsArray instanceof Array) || paramsArray.length < 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (const placeable of placeables) {\r\n\t\t\tawait updateFiltersByPlaceable(placeable, paramsArray);\r\n\t\t}\r\n\t}\r\n\r\n\tasync function updateFiltersOnTargeted(paramsArray) {\r\n\t\tlet targeted = getTargetedTokens();\r\n\r\n\t\tif (targeted == null || targeted.length < 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (typeof paramsArray === 'string') {\r\n\t\t\tparamsArray = getPreset(paramsArray);\r\n\t\t}\r\n\r\n\t\tif (!(paramsArray instanceof Array) || paramsArray.length < 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (const token of targeted) {\r\n\t\t\tawait updateFiltersByPlaceable(token, paramsArray);\r\n\t\t}\r\n\t}\r\n\r\n\tasync function updateFiltersByPlaceable(placeable, paramsArray) {\r\n\t\tif (!(paramsArray instanceof Array) || paramsArray.length < 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst document = placeable.document ?? placeable;\r\n\r\n\t\tlet flags = document.getFlag('tokenmagic', 'filters');\r\n\t\tif (flags == null || !(flags instanceof Array) || flags.length < 1) {\r\n\t\t\treturn;\r\n\t\t} // nothing to update...\r\n\r\n\t\tlet workingFlags = [];\r\n\t\tflags.forEach((flag) => {\r\n\t\t\tworkingFlags.push(foundry.utils.duplicate(flag));\r\n\t\t});\r\n\r\n\t\tfor (const params of paramsArray) {\r\n\t\t\tparams.updateId = foundry.utils.randomID();\r\n\r\n\t\t\tif (params.hasOwnProperty('randomized') && params.randomized) {\r\n\t\t\t\trandomizeParams(params);\r\n\t\t\t}\r\n\r\n\t\t\tworkingFlags.forEach((flag) => {\r\n\t\t\t\tlet match = flag.tmFilters.tmFilterId === params.filterId && flag.tmFilters.tmFilterType === params.filterType;\r\n\t\t\t\tif (match && params.hasOwnProperty('filterInternalId')) {\r\n\t\t\t\t\tmatch = flag.tmFilters.tmFilterInternalId === params.filterInternalId;\r\n\t\t\t\t}\r\n\t\t\t\tif (match && flag.tmFilters.hasOwnProperty('tmParams')) {\r\n\t\t\t\t\tobjectAssign(flag.tmFilters.tmParams, params);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tawait document._TMFXsetFlag(workingFlags);\r\n\t}\r\n\r\n\t// Deleting filters on targeted tokens\r\n\tasync function deleteFiltersOnTargeted(filterId = null, filterType = null, filterInternalId = null) {\r\n\t\tlet targeted = getTargetedTokens();\r\n\t\tif (!(targeted == null) && targeted.length > 0) {\r\n\t\t\tfor (const token of targeted) {\r\n\t\t\t\tawait deleteFilters(token, filterId, filterType, filterInternalId);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Deleting filters on selected placeable(s)\r\n\tasync function deleteFiltersOnSelected(filterId = null, filterType = null, filterInternalId = null) {\r\n\t\tlet placeables = getControlledPlaceables();\r\n\t\tif (!(placeables == null) && placeables.length > 0) {\r\n\t\t\tfor (const placeable of placeables) {\r\n\t\t\t\tawait deleteFilters(placeable, filterId, filterType, filterInternalId);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Deleting all filters on a placeable in parameter\r\n\tasync function deleteFilters(placeable, filterId = null, filterType = null, filterInternalId = null) {\r\n\t\tif (placeable == null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst document = placeable.document ?? placeable;\r\n\r\n\t\tif (filterId == null && filterType == null && filterInternalId == null) {\r\n\t\t\tawait document._TMFXunsetFlag();\r\n\t\t\tawait document._TMFXunsetAnimeFlag();\r\n\t\t} else if (typeof filterId === 'string' || typeof filterType === 'string' || typeof filterInternalId === 'string') {\r\n\t\t\tlet flags = document.getFlag('tokenmagic', 'filters');\r\n\t\t\tif (flags == null || !(flags instanceof Array) || flags.length < 1) {\r\n\t\t\t\treturn;\r\n\t\t\t} // nothing to delete...\r\n\r\n\t\t\tlet workingFlags = [];\r\n\t\t\tconst removedInternalIds = new Set();\r\n\t\t\tflags.forEach((flag) => {\r\n\t\t\t\tconst idMatch = !filterId || flag.tmFilters.tmFilterId === filterId;\r\n\t\t\t\tconst typeMatch = !filterType || flag.tmFilters.tmFilterType === filterType;\r\n\t\t\t\tconst internalIdMatch = !filterInternalId || flag.tmFilters.tmFilterInternalId === filterInternalId;\r\n\r\n\t\t\t\tif (idMatch && typeMatch && internalIdMatch) {\r\n\t\t\t\t\tremovedInternalIds.add(flag.tmFilters.tmFilterInternalId);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tworkingFlags.push(foundry.utils.duplicate(flag));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (workingFlags.length > 0) await document._TMFXsetFlag(workingFlags);\r\n\t\t\telse await document._TMFXunsetFlag();\r\n\r\n\t\t\tflags = document.getFlag('tokenmagic', 'animeInfo');\r\n\t\t\tif (flags == null || !(flags instanceof Array) || flags.length < 1) {\r\n\t\t\t\treturn;\r\n\t\t\t} // nothing to delete...\r\n\r\n\t\t\tworkingFlags = [];\r\n\t\t\tflags.forEach((flag) => {\r\n\t\t\t\tif (!removedInternalIds.has(flag.tmFilterInternalId)) {\r\n\t\t\t\t\tworkingFlags.push(foundry.utils.duplicate(flag));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (workingFlags.length > 0) await document._TMFXsetAnimeFlag(workingFlags);\r\n\t\t\telse await document._TMFXunsetAnimeFlag();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction hasFilterType(placeable, filterType) {\r\n\t\tif (placeable == null || filterType == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst flags = (placeable.document ?? placeable).getFlag('tokenmagic', 'filters');\r\n\t\tif (flags == null || !(flags instanceof Array) || flags.length < 1) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst found = flags.find((flag) => flag.tmFilters.tmFilterType === filterType);\r\n\t\tif (found === undefined) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfunction isApplicableUser(tmParams) {\r\n\t\tconst hasUser = (arr) => {\r\n\t\t\treturn arr.includes(game.user.name) || arr.includes(game.user.id);\r\n\t\t};\r\n\r\n\t\tif (\r\n\t\t\t(tmParams.users?.include?.length && !hasUser(tmParams.users.include)) ||\r\n\t\t\t(tmParams.users?.exclude?.length && hasUser(tmParams.users?.exclude))\r\n\t\t) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfunction hasFilterId(placeable, filterId) {\r\n\t\tif (placeable == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tlet flags = (placeable.document ?? placeable).getFlag('tokenmagic', 'filters');\r\n\t\treturn _checkFilterId(placeable, filterId, flags);\r\n\t}\r\n\r\n\tfunction _checkFilterId(placeable, filterId, flags) {\r\n\t\tif (placeable == null || filterId == null) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (flags == null || !(flags instanceof Array) || flags.length < 1) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst found = flags.find((flag) => flag.tmFilters.tmFilterId === filterId);\r\n\t\tif (found === undefined) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfunction setFilter(placeable, filter) {\r\n\t\tplaceable._TMFXsetRawFilters(filter);\r\n\t}\r\n\r\n\tfunction _loadPersistedValues(params, animeInfos) {\r\n\t\tif (!params.hasOwnProperty('animated')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!animeInfos || animeInfos.length <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (const effect of Object.keys(params.animated)) {\r\n\t\t\tfor (const animeInfo of animeInfos.values()) {\r\n\t\t\t\tif (\r\n\t\t\t\t\tanimeInfo.tmFilterId === params.filterId &&\r\n\t\t\t\t\tanimeInfo.tmFilterInternalId === params.filterInternalId &&\r\n\t\t\t\t\tanimeInfo.tmFilterEffect === effect\r\n\t\t\t\t) {\r\n\t\t\t\t\tparams.animated[effect].active = false;\r\n\t\t\t\t\tparams[effect] = animeInfo.tmFilterEffectValue;\r\n\r\n\t\t\t\t\t// special case for halfCosOscillation\r\n\t\t\t\t\tif (params.animated[effect].animType === 'halfCosOscillation') {\r\n\t\t\t\t\t\tif (params.animated[effect].val1 !== animeInfo.tmFilterEffectValue) {\r\n\t\t\t\t\t\t\tparams.animated[effect].val2 = params.animated[effect].val1;\r\n\t\t\t\t\t\t\tparams.animated[effect].val1 = animeInfo.tmFilterEffectValue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction _assignFilters(placeable, filters, bulkLoading = false) {\r\n\t\tif (filters == null || placeable == null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// Assign all filters to the placeable\r\n\t\tlet animeInfos = placeable.document.getFlag('tokenmagic', 'animeInfo');\r\n\t\tfor (const filterInfo of filters) {\r\n\t\t\t// if bulkloading is on, we update with terminal value if it exists\r\n\t\t\tif (bulkLoading) {\r\n\t\t\t\tlet params = filterInfo.tmFilters.tmParams;\r\n\t\t\t\t_loadPersistedValues(params, animeInfos);\r\n\t\t\t}\r\n\t\t\t_assignFilter(placeable, filterInfo);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction _assignFilter(placeable, filterInfo) {\r\n\t\tif (filterInfo == null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Do not assign the filter if it has been explicitly set as not applicable to the current user\r\n\t\tif (!isApplicableUser(filterInfo.tmFilters.tmParams)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet workingFilterInfo = foundry.utils.duplicate(filterInfo);\r\n\t\tworkingFilterInfo.tmFilters.tmParams.placeableId = placeable.id;\r\n\t\tworkingFilterInfo.tmFilters.tmParams.placeableType = placeable._TMFXgetPlaceableType();\r\n\t\tlet filter = new FilterType[workingFilterInfo.tmFilters.tmFilterType](workingFilterInfo.tmFilters.tmParams);\r\n\t\tsetFilter(placeable, filter);\r\n\t}\r\n\r\n\tfunction _loadFilters(placeables, bulkLoading = true) {\r\n\t\tif (!(placeables == null)) {\r\n\t\t\tplaceables\r\n\t\t\t\t.slice()\r\n\t\t\t\t.reverse()\r\n\t\t\t\t.forEach((placeable) => {\r\n\t\t\t\t\t_singleLoadFilters(placeable, bulkLoading);\r\n\t\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction _singleLoadFilters(placeable, bulkLoading = false) {\r\n\t\tlet placeableType = placeable._TMFXgetPlaceableType();\r\n\t\tif (placeableType === PlaceableType.TEMPLATE) {\r\n\t\t\tlet updateData = placeable.document.getFlag('tokenmagic', 'templateData');\r\n\t\t\tif (!(updateData == null)) {\r\n\t\t\t\tplaceable.document.tmfxTextureAlpha = placeable._TMFXgetSprite().alpha = updateData.opacity;\r\n\t\t\t\tplaceable.document.tmfxTint = updateData.tint;\r\n\t\t\t}\r\n\t\t} else if (placeableType === PlaceableType.REGION) {\r\n\t\t\tconst sprite = placeable._TMFXgetSprite();\r\n\t\t\tif (sprite) sprite.alpha = placeable.document.getFlag('tokenmagic', 'regionData')?.alpha ?? 0.5;\r\n\t\t}\r\n\r\n\t\tlet filters = placeable.document.getFlag('tokenmagic', 'filters');\r\n\t\tif (!(filters == null)) {\r\n\t\t\tif (placeableType === PlaceableType.TEMPLATE) {\r\n\t\t\t\t// get the first filterId to assign tmfxPreset\r\n\t\t\t\tplaceable.document.tmfxPreset = filters[0].tmFilters.tmFilterId;\r\n\t\t\t} else if (placeableType === PlaceableType.REGION) {\r\n\t\t\t\tconst sprite = placeable._TMFXgetSprite();\r\n\t\t\t\tif (sprite) sprite.setShaderClass(foundry.canvas.rendering.shaders.RegionShader);\r\n\t\t\t}\r\n\t\t\t_assignFilters(placeable, filters, bulkLoading);\r\n\t\t}\r\n\t\tplaceable.loadingRequest = false;\r\n\t}\r\n\r\n\tfunction _fxPseudoEqual(flagObject, filterObject) {\r\n\t\tfunction isObject(object) {\r\n\t\t\treturn object != null && typeof object === 'object';\r\n\t\t}\r\n\r\n\t\tconst flagKeys = Object.keys(flagObject);\r\n\r\n\t\tfor (const flagKey of flagKeys) {\r\n\t\t\tlet flagValue = flagObject[flagKey];\r\n\t\t\tconst filterValue = filterObject[flagKey];\r\n\t\t\tconst areObjects = isObject(flagValue) && isObject(filterValue);\r\n\r\n\t\t\tif (areObjects && !_fxPseudoEqual(flagValue, filterValue)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// handling the Infinity exception with loops... thanks to JSON serialization...\r\n\t\t\tif (!areObjects && flagKey === 'loops' && flagValue === null) {\r\n\t\t\t\tflagValue = Infinity; // not nice, but works ! :-)=\r\n\t\t\t}\r\n\r\n\t\t\tif (!areObjects && flagValue !== filterValue) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\tfunction _updateTemplateData(data, options, placeableType) {\r\n\t\tif (!options.hasOwnProperty('flags') || !options.flags.hasOwnProperty('tokenmagic')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (data == null || !data.hasOwnProperty('_id')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet placeable = getPlaceableById(data._id, placeableType);\r\n\t\tif (placeable == null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet updateData = placeable.document.getFlag('tokenmagic', 'templateData');\r\n\t\tif (!(updateData == null)) {\r\n\t\t\tplaceable._TMFXgetSprite().alpha = updateData.opacity;\r\n\t\t}\r\n\t}\r\n\r\n\tfunction _updateFilters(data, options, placeableType) {\r\n\t\tif (\r\n\t\t\t!(\r\n\t\t\t\toptions.hasOwnProperty('flags') &&\r\n\t\t\t\toptions.flags.hasOwnProperty('tokenmagic') &&\r\n\t\t\t\t(options.flags.tokenmagic.hasOwnProperty('filters') || options.flags.tokenmagic.hasOwnProperty('-=filters'))\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (data == null || !data.hasOwnProperty('_id')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet placeable = getPlaceableById(data._id, placeableType);\r\n\t\tif (placeable == null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Shortcut when all filters are deleted\r\n\t\tif (options.flags.tokenmagic.hasOwnProperty('-=filters')) {\r\n\t\t\tAnime.removeAnimation(data._id); // removing animations on this placeable\r\n\t\t\tthis._clearImgFiltersByPlaceable(placeable); // clearing the filters (owned by tokenmagic)\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet filters = placeable.document.getFlag('tokenmagic', 'filters');\r\n\t\tif (filters == null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// CROSS-RESEARCH between the anime map and tokenmagic flags to add, delete or update filters on this placeable\r\n\r\n\t\t// we begin by detecting deleted filters\r\n\t\tfor (let anime of Anime.getAnimeMap().values()) {\r\n\t\t\t// we test all the animes that are supposed to be on the placeable\r\n\t\t\tif (anime.puppet.placeableId === placeable.id) {\r\n\t\t\t\t// is the animation present in the tokenmagic flags for this placeable ?\r\n\t\t\t\t// and is it applicable to the current user?\r\n\t\t\t\tlet foundFilter = false;\r\n\t\t\t\tfilters.forEach((filterFlag) => {\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tanime.puppet.filterId === filterFlag.tmFilters.tmFilterId &&\r\n\t\t\t\t\t\tanime.puppet.filterInternalId === filterFlag.tmFilters.tmFilterInternalId &&\r\n\t\t\t\t\t\tanime.puppet.placeableId === filterFlag.tmFilters.tmParams.placeableId &&\r\n\t\t\t\t\t\tisApplicableUser(filterFlag.tmFilters.tmParams)\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\t// we find it !\r\n\t\t\t\t\t\tfoundFilter = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// Not found, the animation is removed from the AnimeMap as well as the filter on the placeable\r\n\t\t\t\tif (!foundFilter) {\r\n\t\t\t\t\tAnime.removeAnimationByFilterId(data._id, anime.puppet.filterId);\r\n\t\t\t\t\tthis._clearImgFiltersByPlaceable(placeable, anime.puppet.filterId);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// we test each tokenmagic filter flag in the placeable\r\n\t\tfilters.forEach((filterFlag) => {\r\n\t\t\tif (filterFlag.tmFilters.hasOwnProperty('tmParams')) {\r\n\t\t\t\t// we get the puppets in anime corresponding to this placeable\r\n\t\t\t\tlet puppets = Anime.getPuppetsByParams(filterFlag.tmFilters.tmParams);\r\n\t\t\t\tif (puppets.length > 0) {\r\n\t\t\t\t\t// we found corresponding filters\r\n\t\t\t\t\tfor (const puppet of puppets) {\r\n\t\t\t\t\t\t// we update if needed\r\n\t\t\t\t\t\tif (!_fxPseudoEqual(filterFlag.tmFilters.tmParams, puppet)) {\r\n\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t!puppet.hasOwnProperty('updateId') ||\r\n\t\t\t\t\t\t\t\t(puppet.hasOwnProperty('updateId') && puppet.updateId !== filterFlag.tmFilters.tmParams.updateId)\r\n\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\tpuppet.setTMParams(foundry.utils.duplicate(filterFlag.tmFilters.tmParams));\r\n\t\t\t\t\t\t\t\tpuppet.normalizeTMParams();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// this is a new filter, we assign it to the placeable\r\n\t\t\t\t\t_assignFilter(placeable, filterFlag);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction _clearImgFiltersByPlaceable(placeable, filterId = null) {\r\n\t\tif (placeable == null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet filterById = filterId != null && typeof filterId === 'string';\r\n\r\n\t\tfunction destroyClearedFilters(theFilters) {\r\n\t\t\tif (theFilters instanceof Array) {\r\n\t\t\t\tlet tmFilters = theFilters.filter((filter) =>\r\n\t\t\t\t\tfilterById\r\n\t\t\t\t\t\t? filter.hasOwnProperty('filterId') && filter.filterId === filterId\r\n\t\t\t\t\t\t: filter.hasOwnProperty('filterId'),\r\n\t\t\t\t);\r\n\r\n\t\t\t\tfor (const filter of tmFilters) {\r\n\t\t\t\t\tfilter.enabled = false;\r\n\t\t\t\t\tfilter.destroy();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction filterTheFiltering(theFilters) {\r\n\t\t\tif (theFilters instanceof Array) {\r\n\t\t\t\tlet tmFilters = theFilters.filter((filter) =>\r\n\t\t\t\t\tfilterById\r\n\t\t\t\t\t\t? !(filter.hasOwnProperty('filterId') && filter.filterId === filterId)\r\n\t\t\t\t\t\t: !filter.hasOwnProperty('filterId'),\r\n\t\t\t\t);\r\n\t\t\t\treturn tmFilters.length === 0 ? null : tmFilters;\r\n\t\t\t}\r\n\t\t\treturn theFilters;\r\n\t\t}\r\n\r\n\t\tlet sprite = placeable._TMFXgetSprite();\r\n\t\tif (sprite != null) {\r\n\t\t\tdestroyClearedFilters(sprite.filters);\r\n\t\t\tsprite.filters = filterTheFiltering(sprite.filters);\r\n\t\t}\r\n\t}\r\n\r\n\tasync function _importPresetContent(content, options = {}) {\r\n\t\t// In internal, we can force overwrite\r\n\t\tif (!options.hasOwnProperty('overwrite')) {\r\n\t\t\toptions.overwrite = game.settings.get('tokenmagic', 'importOverwrite');\r\n\t\t}\r\n\r\n\t\t///////////////////////////////////////////////\r\n\t\t// Checking the imported object format\r\n\r\n\t\tlog('import -> checking import file format...');\r\n\t\tif (!(content instanceof Array) || content.length < 1) {\r\n\t\t\terror('import -> file format check KO !');\r\n\t\t\terror(i18n('TMFX.preset.import.format.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlog('import -> file format check OK !');\r\n\t\t// check object format end\r\n\t\t/////////////////////////////////////////////////\r\n\r\n\t\tlet check = true;\r\n\r\n\t\t///////////////////////////////////////////////\r\n\t\t// Checking the imported content\r\n\t\tlog('import -> checking import file content...');\r\n\t\tfor (const element of content) {\r\n\t\t\tif (\r\n\t\t\t\telement.hasOwnProperty('name') &&\r\n\t\t\t\ttypeof element.name === 'string' &&\r\n\t\t\t\telement.hasOwnProperty('params') &&\r\n\t\t\t\telement.params instanceof Array\r\n\t\t\t) {\r\n\t\t\t\tfor (const effect of element.params) {\r\n\t\t\t\t\tif (!(effect.hasOwnProperty('filterType') && FilterType.hasOwnProperty(effect.filterType))) {\r\n\t\t\t\t\t\tcheck = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (!check) break;\r\n\t\t\t} else {\r\n\t\t\t\tcheck = false;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!check) {\r\n\t\t\terror('import -> file content check KO !');\r\n\t\t\terror(i18n('TMFX.preset.import.format.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlog('import -> file content check OK !');\r\n\r\n\t\t// check content end\r\n\t\t/////////////////////////////////////////////////\r\n\r\n\t\t// The preset libray must be replaced ?\r\n\t\tif (options.hasOwnProperty('replaceLibrary') && options.replaceLibrary) {\r\n\t\t\tawait game.settings.set('tokenmagic', 'presets', content);\r\n\t\t\tlog('import -> preset library replaced');\r\n\t\t\tlog(i18n('TMFX.preset.import.success'));\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tlet pst = game.settings.get('tokenmagic', 'presets');\r\n\t\tlet it = 0;\r\n\t\tfor (const element of content) {\r\n\t\t\tconst preset = pst.find((el) => el.name === element.name);\r\n\t\t\tif (preset == null) {\r\n\t\t\t\tlog('import -> add: ' + element.name);\r\n\t\t\t\tpst.push(element);\r\n\t\t\t\tit++;\r\n\t\t\t} else {\r\n\t\t\t\tif (options.hasOwnProperty('overwrite') && options.overwrite) {\r\n\t\t\t\t\tconst index = pst.indexOf(preset);\r\n\t\t\t\t\tif (index > -1) {\r\n\t\t\t\t\t\tlog('import -> overwrite: ' + element.name);\r\n\t\t\t\t\t\tpst[index] = element;\r\n\t\t\t\t\t\tit++;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\twarn('import -> ignored: ' + element.name + ' -> already exists');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tawait game.settings.set('tokenmagic', 'presets', pst);\r\n\t\tlog('import -> ' + it + ' preset(s) added to the library');\r\n\t\tlog(i18n('TMFX.preset.import.success'));\r\n\t\treturn true;\r\n\t}\r\n\r\n\tasync function _importTemplateSettingsContent(content, options = {}) {\r\n\t\t///////////////////////////////////////////////\r\n\t\t// Checking the imported object format\r\n\r\n\t\tlog('import -> checking import file format...');\r\n\t\tif (!(content instanceof Object)) {\r\n\t\t\terror('import -> file format check KO !');\r\n\t\t\terror(i18n('TMFX.preset.import.format.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tlog('import -> file format check OK !');\r\n\r\n\t\t// check object format end\r\n\t\t/////////////////////////////////////////////////\r\n\r\n\t\tawait game.settings.set('tokenmagic', 'autoTemplateSettings', content);\r\n\t\tlog('import -> automatic template settings replaced');\r\n\t\tlog(i18n('TMFX.preset.import.success'));\r\n\t\treturn true;\r\n\t}\r\n\r\n\tasync function resetPresetLibrary() {\r\n\t\tif (!game.user.isGM) return;\r\n\r\n\t\tif (confirm(i18n('TMFX.preset.reset.message'))) {\r\n\t\t\ttry {\r\n\t\t\t\tawait game.settings.set('tokenmagic', 'presets', allPresets);\r\n\t\t\t\tui.notifications.info(i18n('TMFX.preset.reset.success'));\r\n\t\t\t} catch (e) {\r\n\t\t\t\terror(e.message);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tasync function importPresetLibraryFromURL(url, options = {}) {\r\n\t\ttry {\r\n\t\t\t$.getJSON(url, async function (content) {\r\n\t\t\t\treturn await _importPresetContent(content, options);\r\n\t\t\t});\r\n\t\t} catch (e) {\r\n\t\t\terror(e.message);\r\n\t\t\terror(i18n('TMFX.preset.import.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tasync function importPresetLibraryFromPath(path, options = {}) {\r\n\t\ttry {\r\n\t\t\tconst response = await fetch(path);\r\n\t\t\tconst content = await response.json();\r\n\r\n\t\t\treturn await _importPresetContent(content, options);\r\n\t\t} catch (e) {\r\n\t\t\terror(e.message);\r\n\t\t\terror(i18n('TMFX.preset.import.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tasync function importTemplateSettingsFromPath(path, options = {}) {\r\n\t\ttry {\r\n\t\t\tconst response = await fetch(path);\r\n\t\t\tconst content = await response.json();\r\n\r\n\t\t\treturn await _importTemplateSettingsContent(content, options);\r\n\t\t} catch (e) {\r\n\t\t\terror(e.message);\r\n\t\t\terror(i18n('TMFX.preset.import.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tasync function importPresetLibrary() {\r\n\t\tconst path = 'modules/tokenmagic/import';\r\n\t\tnew FilePicker({\r\n\t\t\ttype: 'json',\r\n\t\t\tcurrent: path,\r\n\t\t\tcallback: importPresetLibraryFromPath,\r\n\t\t}).browse();\r\n\t}\r\n\r\n\tfunction exportPresetLibrary(exportName = 'tmfx-presets') {\r\n\t\tlet pst = game.settings.get('tokenmagic', 'presets');\r\n\t\tif (pst == null || typeof pst !== 'object') return false;\r\n\t\texportObjectAsJson(pst, exportName);\r\n\t}\r\n\r\n\tasync function importTemplateSettings() {\r\n\t\tconst path = 'modules/tokenmagic/import';\r\n\t\tnew FilePicker({\r\n\t\t\ttype: 'json',\r\n\t\t\tcurrent: path,\r\n\t\t\tcallback: importTemplateSettingsFromPath,\r\n\t\t}).browse();\r\n\t}\r\n\r\n\tfunction exportTemplateSettings(exportName = 'tmfx-template-settings') {\r\n\t\tlet pst = game.settings.get('tokenmagic', 'autoTemplateSettings');\r\n\t\tif (pst == null || typeof pst !== 'object') return false;\r\n\t\texportObjectAsJson(pst, exportName);\r\n\t}\r\n\r\n\tfunction getPresets(libraryName = PresetsLibrary.MAIN) {\r\n\t\tlet pst = game.settings.get('tokenmagic', 'presets');\r\n\t\tif (pst == null || typeof pst !== 'object') return [];\r\n\t\treturn pst.filter((preset) => preset.library === libraryName);\r\n\t}\r\n\r\n\tfunction _getPresetTemplateDefaultTexture(presetName, presetLibrary = PresetsLibrary.TEMPLATE) {\r\n\t\tlet pst = game.settings.get('tokenmagic', 'presets');\r\n\t\tconst preset = pst.find((el) => el['name'] === presetName && el['library'] === presetLibrary);\r\n\t\tif (!(preset == null) && preset.hasOwnProperty('defaultTexture')) return fixPath(preset.defaultTexture);\r\n\t\telse return null;\r\n\t}\r\n\r\n\tfunction getPreset(presetName) {\r\n\t\tlet pName = null,\r\n\t\t\tpLibrary = null;\r\n\t\tlet argIsObj = presetName instanceof Object;\r\n\t\tconst { name, library, ...adjustmentProp } = argIsObj ? presetName : {};\r\n\t\tif (argIsObj) {\r\n\t\t\tif (presetName.hasOwnProperty('name')) {\r\n\t\t\t\tpName = presetName.name;\r\n\t\t\t}\r\n\t\t\tif (presetName.hasOwnProperty('library')) {\r\n\t\t\t\tpLibrary = presetName.library;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tpName = presetName;\r\n\t\t}\r\n\r\n\t\tif (pLibrary == null || typeof pLibrary !== 'string') {\r\n\t\t\tpLibrary = PresetsLibrary.MAIN;\r\n\t\t}\r\n\r\n\t\tif (typeof pName !== 'string') return undefined;\r\n\r\n\t\tlet pst = game.settings.get('tokenmagic', 'presets');\r\n\t\tif (pst == null || typeof pst !== 'object') return undefined;\r\n\r\n\t\tconst preset = pst.find((el) => el['name'] === pName && el['library'] === pLibrary);\r\n\t\tif (!(preset == null) && preset.hasOwnProperty('params') && preset.params instanceof Array) {\r\n\t\t\tfor (const [filterProp, filterPropVal] of Object.entries(adjustmentProp)) {\r\n\t\t\t\t//log(`getPreset ${filterProp}: ${filterPropVal}`);\r\n\t\t\t\tfor (const param of preset.params) {\r\n\t\t\t\t\tif (param.hasOwnProperty(filterProp)) {\r\n\t\t\t\t\t\tparam[filterProp] = filterPropVal;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn foundry.utils.deepClone(preset.params);\r\n\t\t}\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\tasync function deletePreset(presetName, silent = false) {\r\n\t\tif (!game.user.isGM) {\r\n\t\t\tif (!silent) ui.notifications.warn(i18n('TMFX.preset.delete.permission.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet pName = null,\r\n\t\t\tpLibrary = null;\r\n\r\n\t\tif (presetName instanceof Object) {\r\n\t\t\tif (presetName.hasOwnProperty('name')) {\r\n\t\t\t\tpName = presetName.name;\r\n\t\t\t}\r\n\t\t\tif (presetName.hasOwnProperty('library')) {\r\n\t\t\t\tpLibrary = presetName.library;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tpName = presetName;\r\n\t\t}\r\n\r\n\t\tif (pLibrary == null || typeof pLibrary !== 'string') {\r\n\t\t\tpLibrary = PresetsLibrary.MAIN;\r\n\t\t}\r\n\r\n\t\tif (typeof pName !== 'string') {\r\n\t\t\tif (!silent) ui.notifications.error(i18n('TMFX.preset.delete.params.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet pst = game.settings.get('tokenmagic', 'presets');\r\n\t\tif (pst == null) {\r\n\t\t\tif (!silent) ui.notifications.warn(i18n('TMFX.preset.delete.empty.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet state = true;\r\n\t\tconst preset = pst.find((el) => el['name'] === pName && el['library'] === pLibrary);\r\n\r\n\t\tif (preset == null) {\r\n\t\t\tif (!silent) ui.notifications.warn(i18n('TMFX.preset.delete.notfound.failure'));\r\n\t\t\tstate = false;\r\n\t\t} else {\r\n\t\t\tconst index = pst.indexOf(preset);\r\n\t\t\tif (index > -1) {\r\n\t\t\t\tpst.splice(index, 1);\r\n\t\t\t\ttry {\r\n\t\t\t\t\tawait game.settings.set('tokenmagic', 'presets', pst);\r\n\t\t\t\t\tif (!silent) ui.notifications.info(i18n('TMFX.preset.delete.success'));\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tif (!silent) ui.notifications.error(e.message);\r\n\t\t\t\t\tconsole.error(e);\r\n\t\t\t\t\tstate = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn state;\r\n\t}\r\n\r\n\tasync function addPreset(presetName, params, silent = false) {\r\n\t\tif (!game.user.isGM) {\r\n\t\t\tif (!silent) ui.notifications.warn(i18n('TMFX.preset.add.permission.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tlet pName = null,\r\n\t\t\tpLibrary = null,\r\n\t\t\tpDefaultTexture = null;\r\n\t\tif (presetName instanceof Object) {\r\n\t\t\tif (presetName.hasOwnProperty('name')) {\r\n\t\t\t\tpName = presetName.name;\r\n\t\t\t}\r\n\t\t\tif (presetName.hasOwnProperty('library')) {\r\n\t\t\t\tpLibrary = presetName.library;\r\n\t\t\t}\r\n\t\t\tif (presetName.hasOwnProperty('defaultTexture')) {\r\n\t\t\t\tpDefaultTexture = fixPath(presetName.defaultTexture);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tpName = presetName;\r\n\t\t}\r\n\r\n\t\tif (pLibrary == null || typeof pLibrary !== 'string') {\r\n\t\t\tpLibrary = PresetsLibrary.MAIN;\r\n\t\t}\r\n\r\n\t\tif (typeof pDefaultTexture !== 'string') {\r\n\t\t\tpDefaultTexture = null;\r\n\t\t}\r\n\r\n\t\tif (typeof pName !== 'string' && !(params instanceof Array)) {\r\n\t\t\tif (!silent) ui.notifications.error(i18n('TMFX.preset.add.params.failure'));\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor (const param of params) {\r\n\t\t\tparam.filterId = pName;\r\n\t\t}\r\n\r\n\t\tlet pst = game.settings.get('tokenmagic', 'presets');\r\n\t\tlet presetObject = {};\r\n\t\tpresetObject.name = pName;\r\n\t\tpresetObject.library = pLibrary;\r\n\t\tpresetObject.params = params;\r\n\t\tif (pDefaultTexture != null) {\r\n\t\t\tpresetObject.defaultTexture = pDefaultTexture;\r\n\t\t}\r\n\r\n\t\tlet state = true;\r\n\t\tif (pst == null) {\r\n\t\t\tpst = [presetObject];\r\n\t\t} else {\r\n\t\t\tconst preset = pst.find((el) => el['name'] === pName && el['library'] === pLibrary);\r\n\t\t\tif (preset == null) pst.push(presetObject);\r\n\t\t\telse {\r\n\t\t\t\tif (!silent) ui.notifications.warn(i18n('TMFX.preset.add.duplicate.failure'));\r\n\t\t\t\tstate = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (state) {\r\n\t\t\ttry {\r\n\t\t\t\tawait game.settings.set('tokenmagic', 'presets', pst);\r\n\t\t\t\tif (!silent) ui.notifications.info(i18n('TMFX.preset.add.success'));\r\n\t\t\t} catch (e) {\r\n\t\t\t\tif (!silent) ui.notifications.error(e.message);\r\n\t\t\t\tconsole.error(e);\r\n\t\t\t\tstate = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn state;\r\n\t}\r\n\r\n\treturn {\r\n\t\taddFilters: addFilters,\r\n\t\taddFiltersOnSelected: addFiltersOnSelected,\r\n\t\taddFiltersOnTargeted: addFiltersOnTargeted,\r\n\t\taddUpdateFilters: addUpdateFilters,\r\n\t\taddUpdateFiltersOnSelected: addUpdateFiltersOnSelected,\r\n\t\taddUpdateFiltersOnTargeted: addUpdateFiltersOnTargeted,\r\n\t\tdeleteFilters: deleteFilters,\r\n\t\tdeleteFiltersOnSelected: deleteFiltersOnSelected,\r\n\t\tdeleteFiltersOnTargeted: deleteFiltersOnTargeted,\r\n\t\tupdateFilters: updateFilters,\r\n\t\tupdateFiltersOnSelected: updateFiltersOnSelected,\r\n\t\tupdateFiltersOnTargeted: updateFiltersOnTargeted,\r\n\t\tupdateFiltersByPlaceable: updateFiltersByPlaceable,\r\n\t\thasFilterType: hasFilterType,\r\n\t\thasFilterId: hasFilterId,\r\n\t\timportTemplateSettings: importTemplateSettings,\r\n\t\timportTemplateSettingsFromPath: importTemplateSettingsFromPath,\r\n\t\texportTemplateSettings: exportTemplateSettings,\r\n\t\texportPresetLibrary: exportPresetLibrary,\r\n\t\timportPresetLibrary: importPresetLibrary,\r\n\t\timportPresetLibraryFromURL: importPresetLibraryFromURL,\r\n\t\timportPresetLibraryFromPath: importPresetLibraryFromPath,\r\n\t\tresetPresetLibrary: resetPresetLibrary,\r\n\t\tgetPresets: getPresets,\r\n\t\tgetPreset: getPreset,\r\n\t\taddPreset: addPreset,\r\n\t\tdeletePreset: deletePreset,\r\n\t\tgetControlledPlaceables: getControlledPlaceables,\r\n\t\tgetTargetedTokens: getTargetedTokens,\r\n\t\tgetPlaceableById: getPlaceableById,\r\n\t\tpresetToggler: () => {\r\n\t\t\timport('../gui/apps/editor/PresetToggler.js').then((module) => {\r\n\t\t\t\tmodule.presetToggler();\r\n\t\t\t});\r\n\t\t},\r\n\t\tpresetSearch: (options) => {\r\n\t\t\timport('../gui/apps/editor/PresetSearch.js').then((module) => {\r\n\t\t\t\tmodule.presetSearch(options);\r\n\t\t\t});\r\n\t\t},\r\n\t\tfilterEditor: (placeable, sourceBounds) => {\r\n\t\t\timport('../gui/apps/editor/FilterEditor.js').then((module) => {\r\n\t\t\t\tmodule.filterEditor(placeable, sourceBounds);\r\n\t\t\t});\r\n\t\t},\r\n\t\tget filterTypes() {\r\n\t\t\treturn FilterType;\r\n\t\t},\r\n\t\t_assignFilters: _assignFilters,\r\n\t\t_loadFilters: _loadFilters,\r\n\t\t_clearImgFiltersByPlaceable: _clearImgFiltersByPlaceable,\r\n\t\t_getAnimeMap: Anime.getAnimeMap,\r\n\t\t_updateFilters: _updateFilters,\r\n\t\t_updateTemplateData: _updateTemplateData,\r\n\t\t_singleLoadFilters: _singleLoadFilters,\r\n\t\t_cachedContainer: _cachedContainer,\r\n\t\t_checkFilterId: _checkFilterId,\r\n\t\t_getPresetTemplateDefaultTexture: _getPresetTemplateDefaultTexture,\r\n\t};\r\n}\r\n\r\nexport const Magic = TokenMagic();\r\n\r\nasync function compilingShaders() {\r\n\t// Caching filters to prevent freezing on first-time loading (shader compilation time)\r\n\t// https://www.html5gamedevs.com/topic/43652-shader-compile-performance/\r\n\r\n\tlet params = { enabled: true, dummy: true };\r\n\r\n\tMagic._cachedContainer.filters = [];\r\n\tconst filterTypes = Object.keys(FilterType);\r\n\tfor (const filterType of filterTypes) {\r\n\t\tparams.filterType = filterType;\r\n\t\tlog(`Caching ${filterType}`);\r\n\t\tMagic._cachedContainer.filters.push(new FilterType[filterType](params));\r\n\t}\r\n\r\n\tlog('Compiling shaders...');\r\n\tlet tmpRenderTexture = new PIXI.RenderTexture.create({ width: 4, height: 4 });\r\n\t// A call to render triggers the compilation of all the shaders bound to the filters.\r\n\tcanvas.app.renderer.render(Magic._cachedContainer, { renderTexture: tmpRenderTexture });\r\n\tlog('Shaders compiled for the GPU and ready!');\r\n}\r\n\r\nfunction initSocketListener() {\r\n\t// Activate the listener only for the One\r\n\tconst theOne = game.users.find((user) => user.isGM && user.active);\r\n\tif (theOne && game.user !== theOne) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Listener the listening\r\n\tgame.socket.on(moduleTM, async (data) => {\r\n\t\tif (data == null || !data.hasOwnProperty('tmAction')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tasync function updateFlags(targetFlag) {\r\n\t\t\t// getting the scene coming from the socket\r\n\t\t\tlet scene = game.scenes.get(data.tmScene);\r\n\t\t\tif (scene == null) return;\r\n\r\n\t\t\t// preparing flag data (with -= if the data is null)\r\n\t\t\tlet updateData;\r\n\t\t\tif (data.tmFlag == null) updateData = { [`flags.tokenmagic.-=${targetFlag}`]: null };\r\n\t\t\telse updateData = { [`flags.tokenmagic.${targetFlag}`]: data.tmFlag };\r\n\t\t\tupdateData['_id'] = data.tmPlaceableId;\r\n\r\n\t\t\t// updating the placeable in the scene\r\n\t\t\tawait scene.updateEmbeddedDocuments(data.tmPlaceableType, [updateData]);\r\n\t\t}\r\n\r\n\t\tswitch (data.tmAction) {\r\n\t\t\tcase SocketAction.SET_FLAG:\r\n\t\t\t\tawait updateFlags(`filters`);\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase SocketAction.SET_ANIME_FLAG:\r\n\t\t\t\tawait updateFlags(`animeInfo`);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t});\r\n}\r\n\r\nasync function requestLoadFilters(placeable, startTimeout = 0) {\r\n\tlet reqTimer;\r\n\tplaceable.loadingRequest = true;\r\n\r\n\tfunction launchRequest(placeable) {\r\n\t\treqTimer = setTimeout(() => {\r\n\t\t\tif (placeable == null) return;\r\n\t\t\tlet check = placeable._TMFXcheckSprite();\r\n\t\t\tif (check == null) {\r\n\t\t\t\tplaceable.loadingRequest = false;\r\n\t\t\t\treturn;\r\n\t\t\t} else if (check) Magic._singleLoadFilters(placeable);\r\n\t\t\telse launchRequest(placeable);\r\n\t\t}, 35);\r\n\t}\r\n\r\n\tfunction setRequestTimeOut() {\r\n\t\tsetTimeout(() => {\r\n\t\t\tclearTimeout(reqTimer);\r\n\t\t}, 2000);\r\n\t}\r\n\r\n\tsetTimeout(() => {\r\n\t\tsetRequestTimeOut();\r\n\t\tlaunchRequest(placeable);\r\n\t}, startTimeout);\r\n}\r\n\r\nfunction getAnchor(direction, angle, shapeType) {\r\n\tif (shapeType === 'circle' || shapeType === 'rect') return { x: 0.5, y: 0.5 };\r\n\r\n\t// Compute emanation anchor point from the orthonormal bounding rect containing the polygon.\r\n\t// Not complete (to rework later), but ok with cardinal and half-cardinal directions\r\n\tlet dirRad = (direction * Math.PI) / 180;\r\n\tlet angleRad = (angle * Math.PI) / 180;\r\n\r\n\tlet cosRa1 = Math.cos(dirRad - angleRad / 2);\r\n\tlet rsinRa1 = -Math.sin(dirRad - angleRad / 2);\r\n\tlet cosRa2 = Math.cos(dirRad + angleRad / 2);\r\n\tlet rsinRa2 = -Math.sin(dirRad + angleRad / 2);\r\n\r\n\tlet x = 0,\r\n\t\ty = 1;\r\n\r\n\tif (cosRa1 < 0 && cosRa2 < 0) {\r\n\t\tx = 1;\r\n\t} else if (cosRa1 < 0 || cosRa2 < 0) {\r\n\t\tx = (Math.sin(-dirRad - Math.PI / 2) + 1) / 2;\r\n\t}\r\n\r\n\tif (rsinRa1 < 0 && rsinRa2 < 0) {\r\n\t\ty = 0;\r\n\t} else if (rsinRa1 < 0 || rsinRa2 < 0) {\r\n\t\ty = (Math.cos(-dirRad - Math.PI / 2) + 1) / 2;\r\n\t}\r\n\r\n\treturn { x: x, y: y };\r\n}\r\n\r\nfunction onMeasuredTemplateConfig(templateConfig, html) {\r\n\tif (!isVideoDisabled()) {\r\n\t\thtml.querySelector('[name=\"texture\"]').setAttribute('type', 'imagevideo');\r\n\t}\r\n\r\n\tfunction compare(a, b) {\r\n\t\tif (a.name < b.name) return -1;\r\n\t\tif (a.name > b.name) return 1;\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tlet tmTemplate = templateConfig.document.object;\r\n\r\n\tlet opacity = tmTemplate.template.alpha;\r\n\tlet tint = '';\r\n\tlet currentPreset = emptyPreset;\r\n\r\n\t// getting custom data\r\n\tlet tmfxTemplateData = tmTemplate.document.getFlag('tokenmagic', 'templateData');\r\n\tif (!(tmfxTemplateData == null) && tmfxTemplateData instanceof Object) {\r\n\t\topacity = tmTemplate.document.tmfxTextureAlpha = tmfxTemplateData.opacity;\r\n\t\ttint = tmTemplate.document.tmfxTint = tmfxTemplateData.tint ? PIXI.utils.hex2string(tmfxTemplateData.tint) : '';\r\n\r\n\t\tif (tmfxTemplateData.preset !== undefined) currentPreset = tmfxTemplateData.preset;\r\n\t}\r\n\tlet filters = tmTemplate.document.getFlag('tokenmagic', 'filters');\r\n\tlet presets = Magic.getPresets(PresetsLibrary.TEMPLATE);\r\n\r\n\tif (filters && filters instanceof Array && filters.length >= 1) currentPreset = filters[0].tmFilters.tmFilterId;\r\n\r\n\t// forming our injected html\r\n\tlet tmfxValues = '';\r\n\tlet selected = '';\r\n\ttmfxValues += `<option value=\"${emptyPreset}\"></option>`;\r\n\tpresets.sort(compare).forEach((preset) => {\r\n\t\tselected = preset.name === currentPreset ? ' selected' : '';\r\n\t\ttmfxValues += `<option value=\"${preset.name}\"${selected}>${preset.name}</option>`;\r\n\t});\r\n\r\n\tlet divPreset = `\r\n    <div class=\"form-group\">\r\n        <label>${i18n('TMFX.template.opacity')}</label>\r\n        <div class=\"form-fields\">\r\n\t\t\t<range-picker name=\"flags.tokenmagic.templateData.opacity\" value=\"${opacity}\" min=\"0.0\" max=\"1.0\" step=\"0.01\">\r\n\t\t\t\t<input type=\"range\" min=\"0.0\" max=\"1\" step=\"0.01\">\r\n\t\t\t\t<input type=\"number\" min=\"0.0\" max=\"1\" step=\"0.01\">\r\n\t\t\t</range-picker>\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"form-group\">\r\n        <label>${i18n('TMFX.template.fx')}</label>\r\n        <select class=\"tmfx\" name=\"flags.tokenmagic.templateData.preset\" data-dtype=\"String\">\r\n        ${tmfxValues}\r\n        </select>\r\n    </div>\r\n\r\n    <div class=\"form-group\">\r\n        <label>${i18n('TMFX.template.tint')}</label>\r\n        <div class=\"form-fields\">\r\n\t\t\t<color-picker name=\"flags.tokenmagic.templateData.tint\" value=\"${tint}\" placeholder=\"\">\r\n\t\t\t\t<input type=\"text\" placeholder=\"\">\r\n\t\t\t\t<input type=\"color\">\r\n\t\t\t</color-picker>\r\n        </div>\r\n    </div>\r\n    `;\r\n\r\n\t// injecting\r\n\tconst formGroup = html.querySelector('[name=\"texture\"]').closest('.form-group');\r\n\t$(formGroup).after(divPreset);\r\n\ttemplateConfig.setPosition({ height: 'auto' });\r\n}\r\n\r\nasync function onRegionConfig(regionConfig, html) {\r\n\tif (html.querySelector('[name=\"flags.tokenmagic.regionData.alpha\"]')) return;\r\n\r\n\tconst region = regionConfig.document;\r\n\r\n\tlet tmfxRegionData = region.getFlag('tokenmagic', 'regionData');\r\n\tlet alpha = tmfxRegionData?.alpha ?? region.object?._TMFXgetSprite()?.alpha ?? 0.5;\r\n\r\n\tconst alphaRangePicker = await foundry.applications.handlebars.renderTemplate(\r\n\t\t'modules/tokenmagic/templates/settings/regionAlpha.hbs',\r\n\t\t{ alpha },\r\n\t);\r\n\r\n\t$(html).find('[name=\"color\"]').closest('.form-group').after(alphaRangePicker);\r\n}\r\n\r\n/* -------------------------------------------- */\r\n/*  Setup Management                            */\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('ready', () => {\r\n\tlog('Hook -> ready');\r\n\ttmfxDataMigration();\r\n\tinitSocketListener();\r\n\twindow.TokenMagic = Magic;\r\n\r\n\tif (!game.modules.get('lib-wrapper')?.active && game.user.isGM)\r\n\t\tui.notifications.warn(\"The 'Token Magic FX' module recommends to install and activate the 'libWrapper' module.\");\r\n\r\n\tHooks.on('renderMeasuredTemplateConfig', onMeasuredTemplateConfig);\r\n\tHooks.on('renderRegionConfig', onRegionConfig);\r\n});\r\n\r\n/* -------------------------------------------- */\r\n/*  Canvas Management                           */\r\n/* -------------------------------------------- */\r\n\r\nHooks.once('canvasInit', (canvas) => {\r\n\tif (!isFilterCachingDisabled()) {\r\n\t\tlog('Init -> canvasInit -> caching shaders');\r\n\t\tcompilingShaders();\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('canvasInit', (canvas) => {\r\n\tlog('Hook -> canvasInit');\r\n\tautosetPaddingMode();\r\n\tAnime.deactivateAnimation();\r\n\tAnime.resetAnimation();\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('canvasReady', (canvas) => {\r\n\tlog('Hook -> canvasReady');\r\n\tif (!window.hasOwnProperty('TokenMagic')) {\r\n\t\twindow.TokenMagic = Magic;\r\n\t}\r\n\tif (canvas == null) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst tokens = canvas.tokens.placeables;\r\n\tMagic._loadFilters(tokens);\r\n\tconst tiles = canvas.tiles.placeables;\r\n\tMagic._loadFilters(tiles);\r\n\tconst drawings = canvas.drawings.placeables;\r\n\tMagic._loadFilters(drawings);\r\n\tconst templates = canvas.templates.placeables;\r\n\tMagic._loadFilters(templates);\r\n\tconst regions = canvas.regions.placeables;\r\n\tMagic._loadFilters(regions);\r\n\r\n\tAnime.activateAnimation();\r\n});\r\n\r\n/* -------------------------------------------- */\r\n/*  Scenes Management                           */\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('deleteScene', (document) => {\r\n\tif (document.id !== game.user.viewedScene) return;\r\n\tAnime.deactivateAnimation();\r\n\tAnime.resetAnimation();\r\n});\r\n\r\n/* -------------------------------------------- */\r\n/*  Settings Management                         */\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('closeSettingsConfig', () => {\r\n\tautosetPaddingMode();\r\n});\r\n\r\n/* -------------------------------------------- */\r\n/*  Tokens Management                           */\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('createToken', (document) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\r\n\tif (document.flags?.tokenmagic?.filters) {\r\n\t\tlet placeable = getPlaceableById(document._id, PlaceableType.TOKEN);\r\n\t\trequestLoadFilters(placeable, 250);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('deleteToken', (_, document) => {\r\n\tif (!(document == null || !document._id)) {\r\n\t\tAnime.removeAnimation(document._id);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('updateToken', (document, options) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\r\n\tif (['img', 'tint', 'height', 'width', 'name'].some((k) => k in options)) {\r\n\t\tlet placeable = getPlaceableById(document._id, PlaceableType.TOKEN);\r\n\t\tAnime.removeAnimation(document._id); // removing animations on this placeable\r\n\t\tMagic._clearImgFiltersByPlaceable(placeable); // clearing the filters (owned by tokenmagic)\r\n\t\trequestLoadFilters(placeable, 250);\r\n\t} else {\r\n\t\tMagic._updateFilters(document, options, PlaceableType.TOKEN);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n/*  Tiles Management                            */\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('createTile', (document) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\r\n\tif (document.flags?.tokenmagic?.filters) {\r\n\t\tconst placeable = getPlaceableById(document._id, PlaceableType.TILE);\r\n\t\trequestLoadFilters(placeable, 250);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('deleteTile', (_, document) => {\r\n\tif (!(document == null || !document._id)) {\r\n\t\tAnime.removeAnimation(document._id);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('updateTile', (document, options) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\r\n\tif (options.texture?.src || options.overhead) {\r\n\t\tconst placeable = getPlaceableById(document._id, PlaceableType.TILE);\r\n\t\tAnime.removeAnimation(document._id); // removing animations on this placeable\r\n\t\tMagic._clearImgFiltersByPlaceable(placeable); // clearing the filters (owned by tokenmagic)\r\n\t\trequestLoadFilters(placeable, 250);\r\n\t} else {\r\n\t\tMagic._updateFilters(document, options, PlaceableType.TILE);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n/*  Drawings Management                         */\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('createDrawing', (document) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\r\n\tif (document.flags?.tokenmagic?.filters) {\r\n\t\tlet placeable = getPlaceableById(document._id, PlaceableType.DRAWING);\r\n\t\trequestLoadFilters(placeable, 250);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('deleteDrawing', (_, document) => {\r\n\tif (!(document == null || !document._id)) {\r\n\t\tAnime.removeAnimation(document._id);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('updateDrawing', (document, options) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\r\n\tif (!options.flags?.tokenmagic || options.x || options.y) {\r\n\t\tlet placeable = getPlaceableById(document._id, PlaceableType.DRAWING);\r\n\t\tAnime.removeAnimation(document._id); // removing animations on this placeable\r\n\t\tMagic._clearImgFiltersByPlaceable(placeable); // clearing the filters (owned by tokenmagic)\r\n\t\trequestLoadFilters(placeable, 250);\r\n\t} else {\r\n\t\tMagic._updateFilters(document, options, PlaceableType.DRAWING);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n/*  Regions Management                         */\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('createRegion', (document) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\r\n\tif (document.flags?.tokenmagic?.filters) {\r\n\t\tlet placeable = getPlaceableById(document._id, PlaceableType.REGION);\r\n\t\trequestLoadFilters(placeable, 250);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('deleteRegion', (_, document) => {\r\n\tif (!(document == null || !document._id)) {\r\n\t\tAnime.removeAnimation(document._id);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('updateRegion', (document, options) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\tlet placeable = getPlaceableById(document._id, PlaceableType.REGION);\r\n\r\n\tif (!options.flags?.tokenmagic || options.x || options.y) {\r\n\t\tAnime.removeAnimation(document._id); // removing animations on this placeable\r\n\t\tMagic._clearImgFiltersByPlaceable(placeable); // clearing the filters (owned by tokenmagic)\r\n\t\trequestLoadFilters(placeable, 250);\r\n\t} else {\r\n\t\tif (!placeable.loadingRequest) {\r\n\t\t\tMagic._updateFilters(document, options, PlaceableType.REGION);\r\n\r\n\t\t\tconst sprite = getPlaceableById(document._id, PlaceableType.REGION)?._TMFXgetSprite();\r\n\t\t\tif (sprite) {\r\n\t\t\t\tconst filters = document.getFlag('tokenmagic', 'filters');\r\n\t\t\t\tif (filters) sprite.setShaderClass(foundry.canvas.rendering.shaders.RegionShader);\r\n\t\t\t\telse sprite.setShaderClass(foundry.canvas.rendering.shaders.HighlightRegionShader);\r\n\t\t\t\tsprite.alpha = document.getFlag('tokenmagic', 'regionData')?.alpha ?? 0.5;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n/*  Measured Templates Management               */\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('createMeasuredTemplate', (document) => {\r\n\tconst scene = document.parent;\r\n\tif (!(scene == null) && scene.id === game.user.viewedScene && document.flags?.tokenmagic?.filters) {\r\n\t\tlet placeable = getPlaceableById(document._id, PlaceableType.TEMPLATE);\r\n\t\trequestLoadFilters(placeable, 250); // request to load filters (when pixi containers are ready)\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('deleteMeasuredTemplate', (_, document) => {\r\n\tif (!(document == null || !document._id)) {\r\n\t\tAnime.removeAnimation(document._id);\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('updateMeasuredTemplate', (document, options) => {\r\n\tif (document.parent.id !== game.user.viewedScene) return;\r\n\tlet placeable = getPlaceableById(document._id, PlaceableType.TEMPLATE);\r\n\tif (!placeable) return;\r\n\r\n\tif (options.texture) {\r\n\t\tAnime.removeAnimation(document._id); // removing animations on this placeable\r\n\t\tMagic._clearImgFiltersByPlaceable(placeable); // clearing the filters (owned by tokenmagic)\r\n\t\trequestLoadFilters(placeable, 250); // querying filters reload (when pixi containers are ready)\r\n\t} else {\r\n\t\tif (!placeable.loadingRequest) {\r\n\t\t\tMagic._updateFilters(document, options, PlaceableType.TEMPLATE);\r\n\t\t\tMagic._updateTemplateData(document, options, PlaceableType.TEMPLATE);\r\n\t\t}\r\n\t\tif ('-=texture' in options) {\r\n\t\t\tdocument.object?.draw();\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('preUpdateMeasuredTemplate', async (document, options) => {\r\n\tfunction getTint() {\r\n\t\tif (options.flags?.tokenmagic?.templateData?.tint !== undefined) {\r\n\t\t\treturn options.flags.tokenmagic.templateData.tint;\r\n\t\t} else if (document.flags?.tokenmagic?.tint !== undefined) {\r\n\t\t\treturn document.flags.tokenmagic.tint;\r\n\t\t} else return '';\r\n\t}\r\n\r\n\tfunction getFX() {\r\n\t\tif (options.flags?.tokenmagic?.templateData?.preset !== undefined) {\r\n\t\t\treturn options.flags.tokenmagic.templateData.preset;\r\n\t\t} else if (document.flags?.tokenmagic?.templateData?.preset !== undefined) {\r\n\t\t\treturn document.flags.tokenmagic.templateData.preset;\r\n\t\t} else if (document.tmfxPreset !== undefined) {\r\n\t\t\treturn document.tmfxPreset;\r\n\t\t} else return emptyPreset;\r\n\t}\r\n\r\n\tfunction getDirection() {\r\n\t\tif (options.direction) {\r\n\t\t\treturn options.direction;\r\n\t\t} else if (document.direction) {\r\n\t\t\treturn document.direction;\r\n\t\t} else return 0;\r\n\t}\r\n\r\n\tfunction getAngle() {\r\n\t\tif (options.angle) {\r\n\t\t\treturn options.angle;\r\n\t\t} else if (document.angle) {\r\n\t\t\treturn document.angle;\r\n\t\t} else return 0;\r\n\t}\r\n\r\n\tfunction getShapeType() {\r\n\t\tif (options.t) {\r\n\t\t\treturn options.t;\r\n\t\t} else if (document.t) {\r\n\t\t\treturn document.t;\r\n\t\t} else return 'ITSBAD';\r\n\t}\r\n\r\n\tlet measuredTemplateInstance = canvas.templates.get(document._id);\r\n\tlet templateTint = getTint();\r\n\tlet presetUpdate = options.flags?.tokenmagic?.templateData?.preset !== undefined;\r\n\tlet tintUpdate = options.flags?.tokenmagic?.templateData?.tint !== undefined;\r\n\tlet directionUpdate = options.hasOwnProperty('direction');\r\n\tlet angleUpdate = options.hasOwnProperty('angle');\r\n\tlet typeUpdate = options.hasOwnProperty('t');\r\n\r\n\tif (tintUpdate)\r\n\t\toptions.flags.tokenmagic.templateData.tint = templateTint !== '' ? Color.from(templateTint).valueOf() : null;\r\n\r\n\tif (presetUpdate || tintUpdate || directionUpdate || typeUpdate || angleUpdate) {\r\n\t\tlet templateFX = getFX();\r\n\t\tif (templateFX !== emptyPreset) {\r\n\t\t\tlet anchor = getAnchor(getDirection(), getAngle(), getShapeType());\r\n\t\t\tlet presetOptions = {\r\n\t\t\t\tname: templateFX,\r\n\t\t\t\tlibrary: PresetsLibrary.TEMPLATE,\r\n\t\t\t\tanchorX: anchor.x,\r\n\t\t\t\tanchorY: anchor.y,\r\n\t\t\t};\r\n\t\t\tif (templateTint && templateTint !== '') {\r\n\t\t\t\tpresetOptions.color = Color.from(templateTint).valueOf();\r\n\t\t\t}\r\n\t\t\tlet preset = Magic.getPreset(presetOptions);\r\n\t\t\tif (!(preset == null)) {\r\n\t\t\t\tif (presetUpdate) await measuredTemplateInstance.TMFXaddFilters(preset, true);\r\n\t\t\t\telse await measuredTemplateInstance.TMFXaddUpdateFilters(preset);\r\n\t\t\t}\r\n\t\t} else await measuredTemplateInstance.TMFXdeleteFilters();\r\n\t}\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('preCreateMeasuredTemplate', (document) => {\r\n\t// Do nothing if we're on a 3D Canvas scene\r\n\tif (game.Levels3DPreview?._active) return;\r\n\r\n\t// Apply auto-preset if needed\r\n\tconst templates = TokenMagicSettings.getSystemTemplates();\r\n\tif (templates?.enabled) {\r\n\t\ttemplates.preCreateMeasuredTemplate?.(document);\r\n\t}\r\n\r\n\tconst hasFlags = document.flags;\r\n\tlet hasPreset = false;\r\n\tlet hasTint = false;\r\n\tlet hasOpacity = false;\r\n\tlet hasFlagsNoOptions = false;\r\n\r\n\tif (hasFlags && document.flags.tokenmagic?.options) {\r\n\t\tconst opt = document.flags.tokenmagic.options;\r\n\t\tif (opt.tmfxPreset) {\r\n\t\t\tdocument.tmfxPreset = opt.tmfxPreset;\r\n\t\t\thasPreset = true;\r\n\t\t}\r\n\t\tif (opt.tmfxTint) {\r\n\t\t\tdocument.tmfxTint = opt.tmfxTint;\r\n\t\t\thasTint = true;\r\n\t\t}\r\n\t\tif (opt.tmfxTextureAlpha) {\r\n\t\t\tdocument.tmfxTextureAlpha = opt.tmfxTextureAlpha;\r\n\t\t\thasOpacity = true;\r\n\t\t}\r\n\t\tif (opt.tmfxTexture) {\r\n\t\t\tdocument.texture = opt.tmfxTexture;\r\n\t\t\tdocument.updateSource({ texture: opt.tmfxTexture });\r\n\t\t}\r\n\t} else hasFlagsNoOptions = true;\r\n\r\n\tlet hasTexture = document.texture && document.texture !== '';\r\n\tlet newFilters = [];\r\n\r\n\tlet tmfxBaseFlags = { tokenmagic: { filters: null, templateData: null, options: null } };\r\n\tif (hasFlags && hasFlagsNoOptions) {\r\n\t\t// the measured template comes with tokenmagic flags ? It is a copy ! We do nothing.\r\n\t\tif (document.flags.tokenmagic) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tdocument.flags = foundry.utils.mergeObject(document.flags, tmfxBaseFlags, true, true);\r\n\t}\r\n\r\n\t// normalizing color to value if needed\r\n\tif (hasTint && typeof document.tmfxTint !== 'number') {\r\n\t\tdocument.tmfxTint = Color.from(document.tmfxTint).valueOf();\r\n\t}\r\n\r\n\tlet tmfxFiltersData = null;\r\n\r\n\t// FX to add ?\r\n\tif (hasPreset) {\r\n\t\t// Compute shader anchor point\r\n\t\tlet anchor = getAnchor(document.direction, document.angle, document.t);\r\n\r\n\t\t// Constructing the preset search object\r\n\t\tlet pstSearch = {\r\n\t\t\tname: document.tmfxPreset,\r\n\t\t\tlibrary: PresetsLibrary.TEMPLATE,\r\n\t\t\tanchorX: anchor.x,\r\n\t\t\tanchorY: anchor.y,\r\n\t\t};\r\n\r\n\t\t// Adding tint if needed\r\n\t\tif (hasTint) pstSearch.color = document.tmfxTint;\r\n\r\n\t\t// Retrieving the preset\r\n\t\tlet preset = Magic.getPreset(pstSearch);\r\n\r\n\t\tif (!(preset == null) && preset instanceof Array) {\r\n\t\t\tlet defaultTex = Magic._getPresetTemplateDefaultTexture(pstSearch.name);\r\n\t\t\tif (!(defaultTex == null) && !hasTexture) {\r\n\t\t\t\tdocument.updateSource({ texture: defaultTex });\r\n\t\t\t}\r\n\r\n\t\t\tlet persist = true;\r\n\r\n\t\t\t// Constructing the filter flag parameters\r\n\t\t\tfor (const params of preset) {\r\n\t\t\t\tif (!params.filterType || !FilterType.hasOwnProperty(params.filterType)) {\r\n\t\t\t\t\t// one invalid ? all rejected.\r\n\t\t\t\t\tpersist = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// getPreset MUST provide a filter id\r\n\t\t\t\tif (!params.filterId) {\r\n\t\t\t\t\tpersist = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!params.enabled || !(typeof params.enabled === 'boolean')) {\r\n\t\t\t\t\tparams.enabled = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tparams.placeableId = null;\r\n\t\t\t\tparams.filterInternalId = foundry.utils.randomID();\r\n\t\t\t\tparams.filterOwner = game.data.userId;\r\n\t\t\t\tparams.placeableType = PlaceableType.TEMPLATE;\r\n\r\n\t\t\t\tnewFilters.push({\r\n\t\t\t\t\ttmFilters: {\r\n\t\t\t\t\t\ttmFilterId: params.filterId,\r\n\t\t\t\t\t\ttmFilterInternalId: params.filterInternalId,\r\n\t\t\t\t\t\ttmFilterType: params.filterType,\r\n\t\t\t\t\t\ttmFilterOwner: params.filterOwner,\r\n\t\t\t\t\t\ttmParams: params,\r\n\t\t\t\t\t},\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (persist) tmfxFiltersData = newFilters;\r\n\t\t}\r\n\t} else {\r\n\t\tdocument.tmfxPreset = emptyPreset;\r\n\t}\r\n\r\n\tif (!hasOpacity) document.tmfxTextureAlpha = 1;\r\n\tif (!hasTint) document.tmfxTint = null;\r\n\r\n\tlet tmfxFlags = {\r\n\t\ttemplateData: {\r\n\t\t\topacity: document.tmfxTextureAlpha,\r\n\t\t\ttint: document.tmfxTint,\r\n\t\t},\r\n\t\tfilters: tmfxFiltersData,\r\n\t\toptions: null,\r\n\t};\r\n\tdocument.updateSource({ flags: { tokenmagic: tmfxFlags } });\r\n});\r\n\r\n/* -------------------------------------------- */\r\n\r\nHooks.on('renderBasePlaceableHUD', (hud, form, data, options) => {\r\n\tif (!game.user.isGM || !hud.document._TMFXgetPlaceableType?.()) return;\r\n\r\n\tconst alwaysDisplay = game.settings.get('tokenmagic', 'alwaysDisplayEditorControl');\r\n\tif (!alwaysDisplay && !hud.object.document.getFlag('tokenmagic', 'filters')?.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst leftColumn = form.querySelector('.placeable-hud .col.left');\r\n\tif (!leftColumn) return;\r\n\r\n\tconst button = document.createElement('button');\r\n\tbutton.type = 'button';\r\n\tbutton.classList.add('control-icon');\r\n\r\n\tbutton.dataset.action = 'tmfx-editor';\r\n\tbutton.dataset.tooltip = game.i18n.localize('TMFX.hud.title');\r\n\r\n\tconst icon = document.createElement('i');\r\n\ticon.classList.add('fa-solid', 'fa-fire');\r\n\r\n\tbutton.appendChild(icon);\r\n\tbutton.addEventListener('click', (event) => {\r\n\t\tif (event.pointerType)\r\n\t\t\twindow.TokenMagic.filterEditor(hud.object, event.target.closest('.col.left').getBoundingClientRect());\r\n\t});\r\n\r\n\tleftColumn.appendChild(button);\r\n});\r\n\r\nHooks.on('getHeaderControlsDocumentSheetV2', (config, controls) => {\r\n\tif (config.document._TMFXgetPlaceableType?.()) {\r\n\t\tcontrols.push({\r\n\t\t\tonClick: () => {\r\n\t\t\t\twindow.TokenMagic.filterEditor(config.document);\r\n\t\t\t},\r\n\t\t\ticon: 'fa-solid fa-fire',\r\n\t\t\tlabel: 'TMFX.hud.title',\r\n\t\t\tvisible: game.user.isGM,\r\n\t\t});\r\n\t}\r\n});\r\n\r\nHooks.on('dropCanvasData', async (canvas, data, event) => {\r\n\tconst { type, x, y, subtype } = data;\r\n\tif (\r\n\t\ttype === 'TMFX Filter' ||\r\n\t\ttype === 'TMFX Preset' ||\r\n\t\t(type === 'CommunityGalleryEntry' && subtype === 'TMFX Preset')\r\n\t) {\r\n\t\tconst placeables = canvas.activeLayer?.placeables\r\n\t\t\t?.filter((p) => p.visible && p.bounds?.contains(x, y))\r\n\t\t\t.map((p) => p.document)\r\n\t\t\t.sort(\r\n\t\t\t\t(p1, p2) =>\r\n\t\t\t\t\tp1.elevation - p2.elevation ||\r\n\t\t\t\t\tp1.sort - p2.sort ||\r\n\t\t\t\t\tp1.zIndex - p2.zIndex ||\r\n\t\t\t\t\tp1._lastSortedIndex - p2._lastSortedIndex,\r\n\t\t\t);\r\n\t\tconst placeable = placeables?.[placeables.length - 1];\r\n\t\tif (placeable && Object.values(PlaceableType).includes(placeable.documentName)) {\r\n\t\t\timport('../gui/apps/editor/FilterEditor.js').then((module) => {\r\n\t\t\t\tmodule.handleTMFXDropEvent(placeable, data);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n});\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\nimport { FilterDropShadowEx } from './FilterDropShadowEx.js';\r\n\r\nexport class FilterDropShadow extends FilterDropShadowEx {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.enabled = false;\r\n\t\tthis.rotation = 45;\r\n\t\tthis.distance = 5;\r\n\t\tthis.color = 0x000000;\r\n\t\tthis.alpha = 0.5;\r\n\t\tthis.shadowOnly = false;\r\n\t\tthis.blur = 2;\r\n\t\tthis.quality = 3;\r\n\t\tthis.padding = 10;\r\n\t\tthis.zOrder = 110;\r\n\t\tthis.animated = {};\r\n\t\tthis.resolution = game.settings.get('core', 'pixelRatioResolutionScaling')\r\n\t\t\t? window.devicePixelRatio\r\n\t\t\t: PIXI.settings.RESOLUTION;\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t\tthis.autoFit = false;\r\n\t}\r\n}\r\n","import { Anime } from '../Anime.js';\r\nimport './proto/FilterProto.js';\r\nimport { FilterBlurEx } from './FilterBlurEx.js';\r\n\r\nexport class FilterBlur extends FilterBlurEx {\r\n\tconstructor(params) {\r\n\t\tsuper();\r\n\t\tthis.enabled = false;\r\n\t\tthis.blur = 2;\r\n\t\tthis.quality = 4;\r\n\t\tthis.zOrder = 290;\r\n\t\tthis.repeatEdgePixels = false;\r\n\t\tthis.animated = {};\r\n\t\tthis.setTMParams(params);\r\n\t\tif (!this.dummy) {\r\n\t\t\tthis.anime = new Anime(this);\r\n\t\t\tthis.normalizeTMParams();\r\n\t\t}\r\n\t}\r\n\r\n\tget blur() {\r\n\t\treturn this.strengthX;\r\n\t}\r\n\r\n\tset blur(value) {\r\n\t\tthis.strengthX = this.strengthY = value;\r\n\t}\r\n\r\n\tget blurX() {\r\n\t\treturn this.strengthX;\r\n\t}\r\n\r\n\tset blurX(value) {\r\n\t\tthis.strengthX = value;\r\n\t}\r\n\r\n\tget blurY() {\r\n\t\treturn this.strengthY;\r\n\t}\r\n\r\n\tset blurY(value) {\r\n\t\tthis.strengthY = value;\r\n\t}\r\n\r\n\tcalculatePadding() {\r\n\t\tconst scale = this.targetPlaceable.worldTransform.a;\r\n\t\tthis.blurXFilter.blur = scale * this.strengthX;\r\n\t\tthis.blurYFilter.blur = scale * this.strengthY;\r\n\t\tthis.updatePadding();\r\n\t\tsuper.calculatePadding();\r\n\t}\r\n}\r\n","export const PresetsLibrary = {\r\n\tMAIN: 'tmfx-main',\r\n\tTEMPLATE: 'tmfx-template',\r\n};\r\n\r\nexport var presets = [];\r\n\r\nlet params = [\r\n\t{\r\n\t\tfilterType: 'bevel',\r\n\t\tfilterId: 'bevel',\r\n\t\trotation: 0,\r\n\t\tthickness: 5,\r\n\t\tlightColor: 0xff0000,\r\n\t\tlightAlpha: 0.8,\r\n\t\tshadowColor: 0x00ff00,\r\n\t\tshadowAlpha: 0.5,\r\n\t\tanimated: {\r\n\t\t\trotation: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tclockWise: true,\r\n\t\t\t\tloopDuration: 1600,\r\n\t\t\t\tanimType: 'syncRotation',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\nvar presetObject = {};\r\npresetObject.name = 'bevel';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'adjustment',\r\n\t\tfilterId: 'adjustment',\r\n\t\tsaturation: 1.5,\r\n\t\tbrightness: 1.5,\r\n\t\tcontrast: 2,\r\n\t\tgamma: 2,\r\n\t\tred: 4,\r\n\t\tgreen: 0.25,\r\n\t\tblue: 0.25,\r\n\t\talpha: 1,\r\n\t\tanimated: {\r\n\t\t\talpha: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 5000,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 0.15,\r\n\t\t\t\tval2: 1,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'adjustment';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'shadow',\r\n\t\tfilterId: 'dropshadow',\r\n\t\trotation: 35,\r\n\t\tblur: 2,\r\n\t\tquality: 5,\r\n\t\tdistance: 20,\r\n\t\talpha: 0.7,\r\n\t\tpadding: 10,\r\n\t\tshadowOnly: false,\r\n\t\tcolor: 0x000000,\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'dropshadow';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'outline',\r\n\t\tfilterId: 'outline',\r\n\t\tpadding: 10,\r\n\t\tcolor: 0xee6035,\r\n\t\tthickness: 1,\r\n\t\tquality: 5,\r\n\t\tanimated: {\r\n\t\t\tthickness: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 800,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 1,\r\n\t\t\t\tval2: 6,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'outline';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'glow',\r\n\t\tfilterId: 'glow',\r\n\t\touterStrength: 7,\r\n\t\tinnerStrength: 0,\r\n\t\tcolor: 0x006000,\r\n\t\tquality: 0.5,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\tcolor: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'colorOscillation',\r\n\t\t\t\tval1: 0x003000,\r\n\t\t\t\tval2: 0x00ff00,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'glow';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xbloom',\r\n\t\tfilterId: 'bloom',\r\n\t\tthreshold: 0.35,\r\n\t\tbloomScale: 0,\r\n\t\tbrightness: 1,\r\n\t\tblur: 0.1,\r\n\t\tpadding: 10,\r\n\t\tquality: 15,\r\n\t\tblendMode: 0,\r\n\t\tanimated: {\r\n\t\t\tbloomScale: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 2000,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 2.1,\r\n\t\t\t},\r\n\t\t\tthreshold: {\r\n\t\t\t\tactive: false,\r\n\t\t\t\tloopDuration: 1000,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 0.0,\r\n\t\t\t\tval2: 1.9,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'bloom';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'distortion',\r\n\t\tfilterId: 'distortion',\r\n\t\tmaskPath: 'modules/tokenmagic/fx/assets/distortion-1.png',\r\n\t\tmaskSpriteScaleX: 5,\r\n\t\tmaskSpriteScaleY: 5,\r\n\t\tpadding: 20,\r\n\t\tanimated: {\r\n\t\t\tmaskSpriteX: { active: true, speed: 0.05, animType: 'move' },\r\n\t\t\tmaskSpriteY: { active: true, speed: 0.07, animType: 'move' },\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'distortion';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'oldfilm',\r\n\t\tfilterId: 'oldfilm',\r\n\t\tsepia: 0.6,\r\n\t\tnoise: 0.2,\r\n\t\tnoiseSize: 1.0,\r\n\t\tscratch: 0.8,\r\n\t\tscratchDensity: 0.5,\r\n\t\tscratchWidth: 1.2,\r\n\t\tvignetting: 0.9,\r\n\t\tvignettingAlpha: 0.6,\r\n\t\tvignettingBlur: 0.2,\r\n\t\tanimated: {\r\n\t\t\tseed: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'randomNumber',\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 1,\r\n\t\t\t},\r\n\t\t\tvignetting: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 2000,\r\n\t\t\t\tval1: 0.2,\r\n\t\t\t\tval2: 0.4,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'outline',\r\n\t\tfilterId: 'oldfilm',\r\n\t\tcolor: 0x000000,\r\n\t\tthickness: 0,\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'oldfilm';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'twist',\r\n\t\tfilterId: 'twist',\r\n\t\tradiusPercent: 120,\r\n\t\tangle: 0,\r\n\t\tanimated: {\r\n\t\t\tangle: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'sinOscillation',\r\n\t\t\t\tloopDuration: 10000,\r\n\t\t\t\tval1: -0.6 * Math.PI,\r\n\t\t\t\tval2: +0.6 * Math.PI,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'twist';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'bulgepinch',\r\n\t\tfilterId: 'bulge',\r\n\t\tpadding: 150,\r\n\t\tstrength: 0,\r\n\t\tzIndex: 2,\r\n\t\tradiusPercent: 200,\r\n\t\tanimated: {\r\n\t\t\tstrength: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 2000,\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 0.45,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'bulge';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'blur',\r\n\t\tfilterId: 'blur',\r\n\t\tpadding: 10,\r\n\t\tquality: 4.0,\r\n\t\tblur: 0,\r\n\t\tblurX: 0,\r\n\t\tblurY: 0,\r\n\t\tanimated: {\r\n\t\t\tblurX: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 500,\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 6,\r\n\t\t\t},\r\n\t\t\tblurY: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 750,\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 6,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'blur';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'zoomblur',\r\n\t\tfilterId: 'zoomblur',\r\n\t\tstrength: 0.15,\r\n\t\tinnerRadiusPercent: 65,\r\n\t\tradiusPercent: 100,\r\n\t\tpadding: 30,\r\n\t\tanimated: {\r\n\t\t\tinnerRadiusPercent: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'sinOscillation',\r\n\t\t\t\tloopDuration: 500,\r\n\t\t\t\tval1: 65,\r\n\t\t\t\tval2: 75,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'zoomblur';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'shockwave',\r\n\t\tfilterId: 'shockwave',\r\n\t\ttime: 0,\r\n\t\tamplitude: 8,\r\n\t\twavelength: 75,\r\n\t\tradius: 500,\r\n\t\tbrightness: 1.5,\r\n\t\tspeed: 25,\r\n\t\tpadding: 0,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 1800,\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 10,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'shockwave';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'zapshadow',\r\n\t\tfilterId: 'zapshadow',\r\n\t\talphaTolerance: 0.45,\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'zapshadow';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'ray',\r\n\t\tfilterId: 'rays',\r\n\t\ttime: 0,\r\n\t\tcolor: 0xcf8000,\r\n\t\talpha: 0.5,\r\n\t\tdivisor: 32,\r\n\t\tanchorX: 0,\r\n\t\tanchorY: 0,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0005,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'rays';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'fog',\r\n\t\tfilterId: 'fog',\r\n\t\tcolor: 0x000000,\r\n\t\tdensity: 0.65,\r\n\t\ttime: 0,\r\n\t\tdimX: 1,\r\n\t\tdimY: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 2.2,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'fog';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'fumes',\r\n\t\tfilterId: 'fumes',\r\n\t\tcolor: 0x808080,\r\n\t\ttime: 0,\r\n\t\tblend: 8,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.001,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'fumes';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'electric',\r\n\t\tfilterId: 'electric',\r\n\t\tcolor: 0xffffff,\r\n\t\ttime: 0,\r\n\t\tblend: 1,\r\n\t\tintensity: 5,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.002,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'electric';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'fire',\r\n\t\tfilterId: 'fire',\r\n\t\tintensity: 1,\r\n\t\tcolor: 0xffffff,\r\n\t\tamplitude: 1,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tfireBlend: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: -0.0024,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tintensity: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 15000,\r\n\t\t\t\tval1: 0.8,\r\n\t\t\t\tval2: 2,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t},\r\n\t\t\tamplitude: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 4400,\r\n\t\t\t\tval1: 1,\r\n\t\t\t\tval2: 1.4,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'fire';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'wave',\r\n\t\tfilterId: 'waves',\r\n\t\ttime: 0,\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tstrength: 0.015,\r\n\t\tfrequency: 120,\r\n\t\tcolor: 0xffffff,\r\n\t\tmaxIntensity: 2.5,\r\n\t\tminIntensity: 0.9,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0085,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tanchorX: {\r\n\t\t\t\tactive: false,\r\n\t\t\t\tval1: 0.15,\r\n\t\t\t\tval2: 0.85,\r\n\t\t\t\tanimType: 'syncChaoticOscillation',\r\n\t\t\t\tloopDuration: 20000,\r\n\t\t\t},\r\n\t\t\tanchorY: {\r\n\t\t\t\tactive: false,\r\n\t\t\t\tval1: 0.15,\r\n\t\t\t\tval2: 0.85,\r\n\t\t\t\tanimType: 'syncSinOscillation',\r\n\t\t\t\tloopDuration: 20000,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'waves';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'flood',\r\n\t\tfilterId: 'flood',\r\n\t\ttime: 0,\r\n\t\tcolor: 0x0020bb,\r\n\t\tbillowy: 0.43,\r\n\t\ttintIntensity: 0.72,\r\n\t\tglint: 0.31,\r\n\t\tscale: 70,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0006,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'flood';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'smoke',\r\n\t\tfilterId: 'smoke',\r\n\t\tcolor: 0x5099dd,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tdimX: 0.1,\r\n\t\tdimY: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.009,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'smoke';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'images',\r\n\t\tfilterId: 'images',\r\n\t\ttime: 0,\r\n\t\tnbImage: 4,\r\n\t\talphaImg: 1.0,\r\n\t\talphaChr: 0.0,\r\n\t\tblend: 4,\r\n\t\tampX: 0.1,\r\n\t\tampY: 0.1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.001,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'images';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'images',\r\n\t\tfilterId: 'chaos-images',\r\n\t\ttime: 0,\r\n\t\tnbImage: 4,\r\n\t\talphaImg: 1.0,\r\n\t\talphaChr: 0.0,\r\n\t\tblend: 4,\r\n\t\tampX: 0.1,\r\n\t\tampY: 0.1,\r\n\t\tpadding: 80,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.001,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tampX: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tval1: 0.0,\r\n\t\t\t\tval2: 0.3,\r\n\t\t\t\tchaosFactor: 0.03,\r\n\t\t\t\tanimType: 'syncChaoticOscillation',\r\n\t\t\t\tloopDuration: 2000,\r\n\t\t\t},\r\n\t\t\tampY: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tval1: 0.0,\r\n\t\t\t\tval2: 0.3,\r\n\t\t\t\tchaosFactor: 0.04,\r\n\t\t\t\tanimType: 'syncChaoticOscillation',\r\n\t\t\t\tloopDuration: 1650,\r\n\t\t\t},\r\n\t\t\talphaChr: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'randomNumberPerLoop',\r\n\t\t\t\tval1: 0.0,\r\n\t\t\t\tval2: 1,\r\n\t\t\t\tloopDuration: 250,\r\n\t\t\t},\r\n\t\t\talphaImg: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'randomNumberPerLoop',\r\n\t\t\t\tval1: 0.8,\r\n\t\t\t\tval2: 1,\r\n\t\t\t\tloopDuration: 250,\r\n\t\t\t},\r\n\t\t\tnbImage: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tval1: 1,\r\n\t\t\t\tval2: 9,\r\n\t\t\t\tanimType: 'syncSinOscillation',\r\n\t\t\t\tloopDuration: 1400,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'chaos-images';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'images',\r\n\t\tfilterId: 'spectral-images',\r\n\t\ttime: 0,\r\n\t\tblend: 4,\r\n\t\tnbImage: 4,\r\n\t\tpadding: 100,\r\n\t\talphaImg: 0.5,\r\n\t\talphaChr: 0.0,\r\n\t\tampX: 0.1,\r\n\t\tampY: 0.1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tspeed: 0.001,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tampX: {\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 0.22,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 2500,\r\n\t\t\t},\r\n\t\t\tampY: {\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 0.24,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 2500,\r\n\t\t\t\tpauseBetweenDuration: 2500,\r\n\t\t\t},\r\n\t\t\talphaChr: {\r\n\t\t\t\tval1: 1,\r\n\t\t\t\tval2: 0,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 2500,\r\n\t\t\t},\r\n\t\t\talphaImg: {\r\n\t\t\t\tval1: 0.2,\r\n\t\t\t\tval2: 0.8,\r\n\t\t\t\tanimType: 'syncSinOscillation',\r\n\t\t\t\tloopDuration: 2500,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'spectral-images';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'hexa-field',\r\n\t\tshieldType: 2,\r\n\t\tgridPadding: 1.5,\r\n\t\tcolor: 0xcc00cc,\r\n\t\ttime: 0,\r\n\t\tblend: 3,\r\n\t\tintensity: 1,\r\n\t\tlightAlpha: 0.5,\r\n\t\tlightSize: 0.5,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'hexa-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'fire-field',\r\n\t\tshieldType: 1,\r\n\t\tgridPadding: 2,\r\n\t\tcolor: 0xe58550,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tintensity: 1.15,\r\n\t\tlightAlpha: 2,\r\n\t\tlightSize: 0.7,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'fire-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'smoke-field',\r\n\t\tshieldType: 3,\r\n\t\tgridPadding: 1.5,\r\n\t\tcolor: 0x60cc70,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tintensity: 0.9,\r\n\t\tlightAlpha: 1,\r\n\t\tlightSize: 0.7,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'smoke-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'earth-field',\r\n\t\tshieldType: 4,\r\n\t\tgridPadding: 2,\r\n\t\tcolor: 0xbb9070,\r\n\t\ttime: 0,\r\n\t\tblend: 1,\r\n\t\tintensity: 1.25,\r\n\t\tlightAlpha: 1,\r\n\t\tlightSize: 0.7,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'earth-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'earth-field-top',\r\n\t\tshieldType: 5,\r\n\t\tgridPadding: 3,\r\n\t\tcolor: 0xaaaaaa,\r\n\t\ttime: 0,\r\n\t\tblend: 5,\r\n\t\tintensity: 1.9,\r\n\t\tlightAlpha: 1,\r\n\t\tlightSize: 0.7,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tzIndex: 5,\r\n\t\tchromatic: true,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'earth-field-top';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'air-field',\r\n\t\tshieldType: 6,\r\n\t\tgridPadding: 1.2,\r\n\t\tcolor: 0x7090aa,\r\n\t\ttime: 0,\r\n\t\tblend: 14,\r\n\t\tintensity: 1,\r\n\t\tlightAlpha: 1,\r\n\t\tlightSize: 0.7,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'air-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'magic-field',\r\n\t\tshieldType: 7,\r\n\t\tgridPadding: 1,\r\n\t\tcolor: 0xffffff,\r\n\t\ttime: 0,\r\n\t\tblend: 10,\r\n\t\tintensity: 0.8,\r\n\t\tlightAlpha: 1,\r\n\t\tlightSize: 0.45,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'magic-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'chromatic-field',\r\n\t\tshieldType: 8,\r\n\t\tgridPadding: 2,\r\n\t\tcolor: 0xaaaaaa,\r\n\t\ttime: 0,\r\n\t\tblend: 0,\r\n\t\tintensity: 1,\r\n\t\tlightAlpha: 0,\r\n\t\tlightSize: 0,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tchromatic: true,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0045,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'chromatic-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'water-field',\r\n\t\tshieldType: 9,\r\n\t\tgridPadding: 1.2,\r\n\t\tcolor: 0x20bbee,\r\n\t\ttime: 0,\r\n\t\tblend: 4,\r\n\t\tintensity: 1,\r\n\t\tlightAlpha: 0.7,\r\n\t\tlightSize: 0.5,\r\n\t\tscale: 0.6,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'water-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'evil-field',\r\n\t\tshieldType: 9,\r\n\t\tgridPadding: 2,\r\n\t\tcolor: 0xff3010,\r\n\t\ttime: 0,\r\n\t\tblend: 5,\r\n\t\tintensity: 1,\r\n\t\tlightAlpha: 4,\r\n\t\tlightSize: 0.8,\r\n\t\tscale: 0.5,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0012,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tlightSize: {\r\n\t\t\t\tval1: 0.4,\r\n\t\t\t\tval2: 1.5,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 5000,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'evil-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'grid-field',\r\n\t\tshieldType: 11,\r\n\t\tgridPadding: 2,\r\n\t\tcolor: 0x00cccc,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tintensity: 1,\r\n\t\tlightAlpha: 1,\r\n\t\tlightSize: 0.3,\r\n\t\tscale: 0.5,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0009,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'grid-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'warp-field',\r\n\t\tshieldType: 12,\r\n\t\tgridPadding: 2,\r\n\t\tcolor: 0xffffff,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tintensity: 1,\r\n\t\tlightAlpha: 0.8,\r\n\t\tlightSize: 0.5,\r\n\t\tscale: 0.9,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0009,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'warp-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'field',\r\n\t\tfilterId: 'color-field',\r\n\t\tshieldType: 13,\r\n\t\tgridPadding: 2,\r\n\t\tcolor: 0x00cc00,\r\n\t\ttime: 0,\r\n\t\tblend: 14,\r\n\t\tintensity: 1,\r\n\t\tlightAlpha: 0,\r\n\t\tlightSize: 0,\r\n\t\tscale: 1,\r\n\t\tradius: 1,\r\n\t\tchromatic: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0009,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'color-field';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xray',\r\n\t\tfilterId: 'sunburst',\r\n\t\ttime: 0,\r\n\t\tcolor: 0xffbb00,\r\n\t\tblend: 9,\r\n\t\tdimX: 1,\r\n\t\tdimY: 1,\r\n\t\tanchorX: 0,\r\n\t\tanchorY: 0,\r\n\t\tdivisor: 36,\r\n\t\tintensity: 4,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0012,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tanchorX: {\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 6000,\r\n\t\t\t\tval1: 0.4,\r\n\t\t\t\tval2: 0.6,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'sunburst';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xray',\r\n\t\tfilterId: 'clover',\r\n\t\ttime: 0,\r\n\t\tcolor: 0x00ff00,\r\n\t\tblend: 9,\r\n\t\tdimX: 0.05,\r\n\t\tdimY: 0.05,\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tdivisor: 4,\r\n\t\tintensity: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0012,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tanchorX: {\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 6000,\r\n\t\t\t\tval1: 0.4,\r\n\t\t\t\tval2: 0.6,\r\n\t\t\t},\r\n\t\t\tanchorY: {\r\n\t\t\t\tanimType: 'syncSinOscillation',\r\n\t\t\t\tloopDuration: 6000,\r\n\t\t\t\tval1: 0.4,\r\n\t\t\t\tval2: 0.6,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'clover';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xray',\r\n\t\tfilterId: 'scan',\r\n\t\ttime: 0,\r\n\t\tcolor: 0xffffff,\r\n\t\tblend: 5,\r\n\t\tdimX: 20,\r\n\t\tdimY: 20,\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0,\r\n\t\tdivisor: 8,\r\n\t\tintensity: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0005,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'scan';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xray',\r\n\t\tfilterId: 'blue-rays',\r\n\t\ttime: 0,\r\n\t\tcolor: 0x1030ff,\r\n\t\tblend: 9,\r\n\t\tdimX: 1,\r\n\t\tdimY: 1,\r\n\t\tanchorX: 0,\r\n\t\tanchorY: 0,\r\n\t\tdivisor: 24,\r\n\t\tintensity: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0002,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tanchorX: {\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 18000,\r\n\t\t\t\tval1: 0.05,\r\n\t\t\t\tval2: 0.95,\r\n\t\t\t},\r\n\t\t\tanchorY: {\r\n\t\t\t\tanimType: 'syncSinOscillation',\r\n\t\t\t\tloopDuration: 18000,\r\n\t\t\t\tval1: 0.05,\r\n\t\t\t\tval2: 0.95,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'blue-rays';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'liquid',\r\n\t\tfilterId: 'spectral-body',\r\n\t\tcolor: 0x20aaee,\r\n\t\ttime: 0,\r\n\t\tblend: 8,\r\n\t\tintensity: 4,\r\n\t\tspectral: true,\r\n\t\tscale: 0.9,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.001,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tcolor: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 6000,\r\n\t\t\t\tanimType: 'colorOscillation',\r\n\t\t\t\tval1: 0xffffff,\r\n\t\t\t\tval2: 0x00aaff,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'spectral-body';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'liquid',\r\n\t\tfilterId: 'mantle-of-madness',\r\n\t\tcolor: 0x0090ff,\r\n\t\ttime: 0,\r\n\t\tblend: 5,\r\n\t\tintensity: 0.0001,\r\n\t\tspectral: false,\r\n\t\tscale: 7,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tintensity: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 30000,\r\n\t\t\t\tval1: 0.0001,\r\n\t\t\t\tval2: 4,\r\n\t\t\t},\r\n\t\t\tscale: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 30000,\r\n\t\t\t\tval1: 7,\r\n\t\t\t\tval2: 1,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'mantle-of-madness';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'wave',\r\n\t\tfilterId: 'drift-in-plans',\r\n\t\ttime: 0,\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tstrength: 0.035,\r\n\t\tfrequency: 80,\r\n\t\tcolor: 0xffffff,\r\n\t\tmaxIntensity: 1.5,\r\n\t\tminIntensity: 0.5,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0085,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tanchorX: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tval1: 0.35,\r\n\t\t\t\tval2: 0.65,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 10000,\r\n\t\t\t},\r\n\t\t\tanchorY: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tval1: 0.35,\r\n\t\t\t\tval2: 0.65,\r\n\t\t\t\tanimType: 'syncSinOscillation',\r\n\t\t\t\tloopDuration: 10000,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'liquid',\r\n\t\tfilterId: 'drift-in-plans',\r\n\t\tcolor: 0xff0000,\r\n\t\ttime: 0,\r\n\t\tblend: 6,\r\n\t\tintensity: 5,\r\n\t\tspectral: false,\r\n\t\tscale: 2.5,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0018,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tcolor: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 9000,\r\n\t\t\t\tanimType: 'colorOscillation',\r\n\t\t\t\tval1: 0xff0000,\r\n\t\t\t\tval2: 0xffffff,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'drift-in-plans';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'zapshadow',\r\n\t\tfilterId: 'fire-aura',\r\n\t\talphaTolerance: 0.5,\r\n\t},\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'fire-aura',\r\n\t\tauraType: 2,\r\n\t\tcolor: 0x903010,\r\n\t\tthickness: 9.8,\r\n\t\tscale: 4,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 2,\r\n\t\tsubAuraIntensity: 1.5,\r\n\t\tthreshold: 0.4,\r\n\t\tdiscard: true,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0027,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tthickness: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tval1: 2,\r\n\t\t\t\tval2: 5,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'fire-aura';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'zapshadow',\r\n\t\tfilterId: 'glacial-aura',\r\n\t\talphaTolerance: 0.5,\r\n\t},\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'glacial-aura',\r\n\t\tauraType: 1,\r\n\t\tcolor: 0x5099dd,\r\n\t\tthickness: 4.5,\r\n\t\tscale: 3,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 0.8,\r\n\t\tsubAuraIntensity: 0.25,\r\n\t\tthreshold: 0.5,\r\n\t\tdiscard: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0018,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tthickness: {\r\n\t\t\t\tval1: 2,\r\n\t\t\t\tval2: 4.7,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t},\r\n\t\t\tsubAuraIntensity: {\r\n\t\t\t\tval1: 0.45,\r\n\t\t\t\tval2: 0.65,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 6000,\r\n\t\t\t},\r\n\t\t\tauraIntensity: {\r\n\t\t\t\tval1: 0.9,\r\n\t\t\t\tval2: 2.2,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'glacial-aura';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'zapshadow',\r\n\t\tfilterId: 'anti-aura',\r\n\t\talphaTolerance: 0.5,\r\n\t},\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'anti-aura',\r\n\t\tauraType: 2,\r\n\t\tcolor: 0x050505,\r\n\t\tthickness: 2.7,\r\n\t\tscale: 7,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 5,\r\n\t\tsubAuraIntensity: 2,\r\n\t\tthreshold: 0.08,\r\n\t\tdiscard: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0012,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tauraIntensity: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 5,\r\n\t\t\t\tval2: 0,\r\n\t\t\t},\r\n\t\t\tsubAuraIntensity: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 2,\r\n\t\t\t\tval2: 0,\r\n\t\t\t},\r\n\t\t\tcolor: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 6000,\r\n\t\t\t\tanimType: 'syncColorOscillation',\r\n\t\t\t\tval1: 0x050505,\r\n\t\t\t\tval2: 0x200000,\r\n\t\t\t},\r\n\t\t\tthreshold: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 1500,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 0.02,\r\n\t\t\t\tval2: 0.5,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'anti-aura';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'fire',\r\n\t\tfilterId: 'pure-fire-aura',\r\n\t\tintensity: 1,\r\n\t\tcolor: 0xffffff,\r\n\t\tamplitude: 1,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tfireBlend: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: -0.0024,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tintensity: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 15000,\r\n\t\t\t\tval1: 0.8,\r\n\t\t\t\tval2: 2,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t},\r\n\t\t\tamplitude: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 4400,\r\n\t\t\t\tval1: 1,\r\n\t\t\t\tval2: 1.4,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'zapshadow',\r\n\t\tfilterId: 'pure-fire-aura',\r\n\t\talphaTolerance: 0.5,\r\n\t},\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'pure-fire-aura',\r\n\t\tauraType: 2,\r\n\t\tcolor: 0x903010,\r\n\t\tthickness: 9.8,\r\n\t\tscale: 4,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 2,\r\n\t\tsubAuraIntensity: 1.5,\r\n\t\tthreshold: 0.4,\r\n\t\tdiscard: true,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0027,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tthickness: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tval1: 2,\r\n\t\t\t\tval2: 5,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'pure-fire-aura';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'zapshadow',\r\n\t\tfilterId: 'pure-fire-aura-2',\r\n\t\talphaTolerance: 0.5,\r\n\t},\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'pure-fire-aura-2',\r\n\t\tauraType: 2,\r\n\t\tcolor: 0x903010,\r\n\t\tthickness: 9.8,\r\n\t\tscale: 4,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 1,\r\n\t\tsubAuraIntensity: 0.3,\r\n\t\tthreshold: 0.5,\r\n\t\tdiscard: true,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0027,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tthickness: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tval1: 2,\r\n\t\t\t\tval2: 3.6,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'fire',\r\n\t\tfilterId: 'pure-fire-aura-2',\r\n\t\tintensity: 1,\r\n\t\tcolor: 0xffffff,\r\n\t\tamplitude: 1,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tfireBlend: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: -0.0024,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tintensity: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 15000,\r\n\t\t\t\tval1: 0.8,\r\n\t\t\t\tval2: 3,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t},\r\n\t\t\tamplitude: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 4400,\r\n\t\t\t\tval1: 1,\r\n\t\t\t\tval2: 1.6,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'pure-fire-aura-2';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'zapshadow',\r\n\t\tfilterId: 'pure-ice-aura',\r\n\t\talphaTolerance: 0.5,\r\n\t},\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'pure-ice-aura',\r\n\t\tauraType: 1,\r\n\t\tcolor: 0x5099dd,\r\n\t\tthickness: 4.5,\r\n\t\tscale: 10,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 0.25,\r\n\t\tsubAuraIntensity: 1,\r\n\t\tthreshold: 0.5,\r\n\t\tdiscard: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0018,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tthickness: {\r\n\t\t\t\tval1: 2,\r\n\t\t\t\tval2: 3.3,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t},\r\n\t\t\tsubAuraIntensity: {\r\n\t\t\t\tval1: 0.45,\r\n\t\t\t\tval2: 0.65,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 6000,\r\n\t\t\t},\r\n\t\t\tauraIntensity: {\r\n\t\t\t\tval1: 0.9,\r\n\t\t\t\tval2: 2.2,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'smoke',\r\n\t\tfilterId: 'pure-ice-aura',\r\n\t\tcolor: 0x80ccff,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tdimX: 0.3,\r\n\t\tdimY: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: -0.006,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tdimX: {\r\n\t\t\t\tval1: 0.4,\r\n\t\t\t\tval2: 0.2,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'pure-ice-aura';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'pixel',\r\n\t\tfilterId: 'pixelate',\r\n\t\tsizeX: 2.5,\r\n\t\tsizeY: 2.5,\r\n\t},\r\n];\r\n\r\npresetObject = new Object();\r\npresetObject.name = 'pixelate';\r\npresetObject.library = PresetsLibrary.MAIN;\r\npresetObject.params = params;\r\npresets.push(presetObject);\r\n\r\nexport var templatePresets = [];\r\n\r\n// white : **electric , **waves, ***xrays, **liquid (normal), (clover)\r\n// black : **liquid (protoplasm), **smoke, **rays, outline, **fumes, **fog, **flood, **fire\r\n// no texture : **glow, **bulge, **blur, **bloom\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'flood',\r\n\t\tfilterId: 'Watery Surface',\r\n\t\ttime: 0,\r\n\t\tcolor: 0x0020bb,\r\n\t\tbillowy: 0.43,\r\n\t\ttintIntensity: 0.72,\r\n\t\tglint: 0.31,\r\n\t\tscale: 70,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0006,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Watery Surface';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'liquid',\r\n\t\tfilterId: 'Protoplasm',\r\n\t\tcolor: 0x20aaee,\r\n\t\ttime: 0,\r\n\t\tblend: 8,\r\n\t\tintensity: 4,\r\n\t\tspectral: true,\r\n\t\tscale: 1.4,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.001,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Protoplasm';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'liquid',\r\n\t\tfilterId: 'Watery Surface 2',\r\n\t\tcolor: 0x20aaee,\r\n\t\ttime: 0,\r\n\t\tblend: 8,\r\n\t\tintensity: 4,\r\n\t\tspectral: false,\r\n\t\tscale: 1.4,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.001,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Watery Surface 2';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/white-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'smoke',\r\n\t\tfilterId: 'Smoky Area',\r\n\t\tcolor: 0xaaaaaa,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tdimX: 1,\r\n\t\tdimY: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.002,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Smoky Area';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'electric',\r\n\t\tfilterId: 'Shock',\r\n\t\tcolor: 0xffffff,\r\n\t\ttime: 0,\r\n\t\tblend: 1,\r\n\t\tintensity: 5,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.002,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Shock';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/white-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xray',\r\n\t\tfilterId: 'Annihilating Rays',\r\n\t\ttime: 0,\r\n\t\tcolor: 0xffbb00,\r\n\t\tblend: 9,\r\n\t\tdimX: 1,\r\n\t\tdimY: 1,\r\n\t\tanchorX: 0,\r\n\t\tanchorY: 0,\r\n\t\tdivisor: 6,\r\n\t\tintensity: 4,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0012,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Annihilating Rays';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/white-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'ray',\r\n\t\tfilterId: 'Classic Rays',\r\n\t\ttime: 0,\r\n\t\tcolor: 0xcf8000,\r\n\t\talpha: 0.5,\r\n\t\tdivisor: 32,\r\n\t\tanchorX: 0,\r\n\t\tanchorY: 0,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0005,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Classic Rays';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'fumes',\r\n\t\tfilterId: 'Smoke Filaments',\r\n\t\tcolor: 0x808080,\r\n\t\ttime: 0,\r\n\t\tblend: 8,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.001,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Smoke Filaments';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'fire',\r\n\t\tfilterId: 'Flames',\r\n\t\tintensity: 1.5,\r\n\t\tcolor: 0xffffff,\r\n\t\tamplitude: 1.3,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tfireBlend: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: -0.0016,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Flames';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xfog',\r\n\t\tfilterId: 'Thick Fog',\r\n\t\tautoFit: false,\r\n\t\tcolor: 0x3090ff,\r\n\t\ttime: 0,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0006,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Thick Fog';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-vstrong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'glow',\r\n\t\tfilterId: 'Glowing Outline',\r\n\t\touterStrength: 5.5,\r\n\t\tinnerStrength: 0,\r\n\t\tcolor: 0x006000,\r\n\t\tquality: 0.5,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\touterStrength: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 5.5,\r\n\t\t\t\tval2: 1.5,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Glowing Outline';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'wave',\r\n\t\tfilterId: 'Waves',\r\n\t\ttime: 0,\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tstrength: 0.015,\r\n\t\tfrequency: 120,\r\n\t\tcolor: 0xffffff,\r\n\t\tmaxIntensity: 2.5,\r\n\t\tminIntensity: 0.9,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0085,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Waves';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/white-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'wave',\r\n\t\tfilterId: 'Waves 2',\r\n\t\ttime: 0,\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tstrength: 0.014,\r\n\t\tfrequency: 400,\r\n\t\tcolor: 0xffffff,\r\n\t\tmaxIntensity: 2.4,\r\n\t\tminIntensity: 0.8,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0385,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Waves 2';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/white-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'wave',\r\n\t\tfilterId: 'Waves 3',\r\n\t\ttime: 0,\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tstrength: 0.017,\r\n\t\tfrequency: 35,\r\n\t\tcolor: 0xffffff,\r\n\t\tmaxIntensity: 2.6,\r\n\t\tminIntensity: 0.9,\r\n\t\tpadding: 20,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0085,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Waves 3';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/white-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'Zone : Fire',\r\n\t\tauraType: 1,\r\n\t\tcolor: 0x903010,\r\n\t\tscale: 1.5,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 1.8,\r\n\t\tsubAuraIntensity: 0.25,\r\n\t\tthreshold: 0.6,\r\n\t\tdiscard: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0027,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tthickness: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tval1: 2,\r\n\t\t\t\tval2: 5,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'fire',\r\n\t\tfilterId: 'Zone : Fire',\r\n\t\tintensity: 1.5,\r\n\t\tcolor: 0xffffff,\r\n\t\tamplitude: 1,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tfireBlend: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: -0.0015,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Zone : Fire';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'Zone : Electricity',\r\n\t\tauraType: 2,\r\n\t\tcolor: 0x303030,\r\n\t\tscale: 1.5,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 1,\r\n\t\tsubAuraIntensity: 0.9,\r\n\t\tthreshold: 0,\r\n\t\tdiscard: true,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0027,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tthickness: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tval1: 1,\r\n\t\t\t\tval2: 2,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'electric',\r\n\t\tfilterId: 'Zone : Electricity',\r\n\t\tcolor: 0xffffff,\r\n\t\ttime: 0,\r\n\t\tblend: 1,\r\n\t\tintensity: 5,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.002,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Zone : Electricity';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/white-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xglow',\r\n\t\tfilterId: 'Zone : Blizzard',\r\n\t\tauraType: 1,\r\n\t\tcolor: 0x5099dd,\r\n\t\tthickness: 4.5,\r\n\t\tscale: 5,\r\n\t\ttime: 0,\r\n\t\tauraIntensity: 0.25,\r\n\t\tsubAuraIntensity: 1,\r\n\t\tthreshold: 0.5,\r\n\t\tdiscard: false,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0018,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tthickness: {\r\n\t\t\t\tval1: 2,\r\n\t\t\t\tval2: 3.3,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t},\r\n\t\t\tsubAuraIntensity: {\r\n\t\t\t\tval1: 0.05,\r\n\t\t\t\tval2: 0.1,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 6000,\r\n\t\t\t},\r\n\t\t\tauraIntensity: {\r\n\t\t\t\tval1: 0.9,\r\n\t\t\t\tval2: 2.2,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'smoke',\r\n\t\tfilterId: 'Zone : Blizzard',\r\n\t\tcolor: 0x80ccff,\r\n\t\ttime: 0,\r\n\t\tblend: 2,\r\n\t\tdimY: 1,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: -0.005,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t\tdimX: {\r\n\t\t\t\tval1: 0.4,\r\n\t\t\t\tval2: 0.2,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 3000,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Zone : Blizzard';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'bulgepinch',\r\n\t\tfilterId: 'Bulging Out',\r\n\t\tpadding: 150,\r\n\t\tstrength: 0,\r\n\t\tradiusPercent: 200,\r\n\t\tanimated: {\r\n\t\t\tstrength: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tloopDuration: 2000,\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 0.45,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Bulging Out';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'blur',\r\n\t\tfilterId: 'Blurred Texture',\r\n\t\tpadding: 25,\r\n\t\tquality: 4.0,\r\n\t\tblur: 0,\r\n\t\tblurX: 0,\r\n\t\tblurY: 0,\r\n\t\tanimated: {\r\n\t\t\tblurX: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 500,\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 6,\r\n\t\t\t},\r\n\t\t\tblurY: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tloopDuration: 750,\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 6,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Blurred Texture';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'xbloom',\r\n\t\tfilterId: 'Bloomed Texture',\r\n\t\tthreshold: 0.35,\r\n\t\tbloomScale: 0,\r\n\t\tbrightness: 1,\r\n\t\tblur: 0.1,\r\n\t\tpadding: 10,\r\n\t\tquality: 15,\r\n\t\tblendMode: 0,\r\n\t\tanimated: {\r\n\t\t\tbloomScale: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 2000,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 0,\r\n\t\t\t\tval2: 2.1,\r\n\t\t\t},\r\n\t\t\tthreshold: {\r\n\t\t\t\tactive: false,\r\n\t\t\t\tloopDuration: 1000,\r\n\t\t\t\tanimType: 'syncCosOscillation',\r\n\t\t\t\tval1: 0.0,\r\n\t\t\t\tval2: 1.9,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Bloomed Texture';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'liquid',\r\n\t\tfilterId: 'Wild Magic',\r\n\t\tcolor: 0xff0000,\r\n\t\ttime: 0,\r\n\t\tblend: 6,\r\n\t\tintensity: 5,\r\n\t\tspectral: false,\r\n\t\tscale: 2.5,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0018,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'wave',\r\n\t\tfilterId: 'Wild Magic',\r\n\t\ttime: 0,\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tstrength: 0.014,\r\n\t\tfrequency: 10,\r\n\t\tcolor: 0xffffff,\r\n\t\tmaxIntensity: 1.3,\r\n\t\tminIntensity: 0.6,\r\n\t\tpadding: 10,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0065,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Wild Magic';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'web',\r\n\t\tfilterId: 'Spider Web 1',\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tcolor: 0xffffff,\r\n\t\tthickness: 2,\r\n\t\tdiv2: 5,\r\n\t\ttime: 98.8,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tloopDuration: 5000,\r\n\t\t\t\tanimType: 'cosOscillation',\r\n\t\t\t\tval1: 98.8,\r\n\t\t\t\tval2: 99.7,\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Spider Web 1';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'web',\r\n\t\tfilterId: 'Spider Web 2',\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tcolor: 0xcccccc,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0005,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n\t{\r\n\t\tfilterType: 'liquid',\r\n\t\tfilterId: 'Spider Web 2',\r\n\t\tcolor: 0xff0000,\r\n\t\ttime: 0,\r\n\t\tblend: 4,\r\n\t\tintensity: 8,\r\n\t\tspectral: false,\r\n\t\tscale: 0.2,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0005,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Spider Web 2';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nparams = [\r\n\t{\r\n\t\tfilterType: 'web',\r\n\t\tfilterId: 'Spider Web 3',\r\n\t\tanchorX: 0.5,\r\n\t\tanchorY: 0.5,\r\n\t\tcolor: 0xcccccc,\r\n\t\ttime: 100,\r\n\t},\r\n\t{\r\n\t\tfilterType: 'liquid',\r\n\t\tfilterId: 'Spider Web 3',\r\n\t\tcolor: 0xff0000,\r\n\t\ttime: 0,\r\n\t\tblend: 1,\r\n\t\tintensity: 4,\r\n\t\tspectral: true,\r\n\t\tscale: 0.2,\r\n\t\tanimated: {\r\n\t\t\ttime: {\r\n\t\t\t\tactive: true,\r\n\t\t\t\tspeed: 0.0005,\r\n\t\t\t\tanimType: 'move',\r\n\t\t\t},\r\n\t\t},\r\n\t},\r\n];\r\n\r\npresetObject = {};\r\npresetObject.name = 'Spider Web 3';\r\npresetObject.library = PresetsLibrary.TEMPLATE;\r\npresetObject.defaultTexture = 'modules/tokenmagic/fx/assets/templates/black-tone-strong-opacity.png';\r\npresetObject.params = params;\r\ntemplatePresets.push(presetObject);\r\n\r\nexport var allPresets = presets.concat(templatePresets);\r\n","export const defaultOpacity = 0.5;\r\nexport const emptyPreset = 'NOFX';\r\nexport const autoMinRank = 10000;\r\nexport const PlaceableType = {\r\n\tTOKEN: foundry.canvas.placeables.Token.embeddedName,\r\n\tTILE: foundry.canvas.placeables.Tile.embeddedName,\r\n\tTEMPLATE: foundry.canvas.placeables.MeasuredTemplate.embeddedName,\r\n\tDRAWING: foundry.canvas.placeables.Drawing.embeddedName,\r\n\tREGION: foundry.canvas.placeables.Region.embeddedName,\r\n\tNOT_SUPPORTED: null,\r\n};\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".tokenmagic.js\";\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","__webpack_require__.p = \"modules/tokenmagic/module/bundle/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunktokenmagic\"] = self[\"webpackChunktokenmagic\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(182);\n"],"names":["inProgress","dataWebpackPrefix","Anime","constructor","puppet","self","this","animated","animeId","foundry","utils","randomID","frameTime","elapsedTime","loopElapsedTime","loops","internalLoops","ping","pauseBetweenElapsedTime","pauseBetween","shutdown","hasOwnProperty","Object","keys","length","initAnimatedInternals","addAnimation","rgbToValue","r","g","b","valueToRgb","bin","oscillation","elapsed","loopDuration","syncShift","val1","val2","func","isSync","xpi","twoPi","getSynchronizedTime","colOscillation","rgbValue1","rgbValue2","Math","floor","cos","_lastTime","getSynchronizedRotation","getPuppetsByParams","params","puppetArray","_animeMap","forEach","anime","id","placeableId","filterId","filterInternalId","push","set","_resumeAnimation","removeAnimation","delete","size","_suspendAnimation","removeAnimationByFilterId","resetAnimation","Map","_suspended","tick","canvas","app","ticker","lastTime","_frameTime","_prevTime","enabled","placeableImg","preComputation","animate","_activated","isAnimationDisabled","_detachFromTicker","_attachToTicker","activateAnimation","deactivateAnimation","add","PIXI","UPDATE_PRIORITY","LOW","remove","getAnimeMap","effect","initInternals","hasInternals","active","cycleCheck","animType","persistTerminatedEffect","autoDisableCheck","isPauseBetweenLoop","Infinity","pauseBetweenDuration","filterOwner","game","data","userId","animeInfo","doInit","flag","targetPlaceable","document","getFlag","animeinfo","values","tmFilterId","tmFilterInternalId","tmFilterEffect","tmFilterEffectValue","concat","duplicate","_TMFXsetAnimeFlag","autoDisable","autoDestroy","every","animeEffect","disableOrDestroy","placeable","window","TokenMagic","deleteFilters","filterType","updateFiltersByPlaceable","frametime","pauseBetweenCheck","pauseStart","pauseStartDuration","pauseStartElapsedTime","moveToward","colorOscillation","halfColorOscillation","PI","syncColorOscillation","cosOscillation","halfCosOscillation","sinOscillation","sin","halfSinOscillation","chaoticOscillation","random","chaosFactor","syncCosOscillation","syncSinOscillation","syncChaoticOscillation","rotation","computedRotation","clockWise","syncRotation","randomNumber","wantInteger","randomNumberPerLoop","_ringing","randomColor","randomColorPerLoop","move","speed","logCompatibilityWarning","gMaxRank","PlaceableObject","placeables","prototype","TMFXaddFilters","async","paramsArray","replace","addFilters","TMFXupdateFilters","TMFXaddUpdateFilters","addUpdateFilters","TMFXdeleteFilters","TMFXhasFilterType","hasFilterType","TMFXhasFilterId","hasFilterId","_TMFXsetFlag","since","once","_TMFXunsetFlag","_TMFXunsetAnimeFlag","_TMFXgetSprite","_TMFXgetPlaceableType","TOKEN","mesh","TILE","bg","TEMPLATE","template","DRAWING","hasText","text","shape","REGION","children","find","ch","regions","RegionMesh","_TMFXgetPlaceablePadding","accPadding","filters","Array","filter","renderer","useMaxPadding","max","padding","_TMFXcheckSprite","_TMFXgetMaxFilterRank","sprite","maxRank","map","f","rank","_TMFXsetRawFilters","isZOrder","isZOrderConfig","addFilter","sort","a","zOrder","insertFilter","_TMFXunsetRawFilters","includes","embeddedName","NOT_SUPPORTED","Filter","setTMParams","gridPadding","boundsPadding","Point","currentPadding","recalculatePadding","dummy","mergeObject","apply","filterManager","input","output","clear","applyFilter","rawPadding","originalPadding","getMinPadding","assignPlaceable","activateTransform","defineProperty","get","calculatePadding","getPlaceable","getPlaceableById","placeableType","getPlaceableType","target","width","height","ang","sticky","abs","gridSize","dimensions","x","y","scale","worldTransform","filterTransform","state","handleTransform","arguments","zIndex","normalizeTMParams","undefined","FilterAdjustment","AdjustmentFilter","super","gamma","saturation","contrast","brightness","red","green","blue","alpha","animating","FilterAscii","AsciiFilter","FilterXBloom","AdvancedBloomFilter","threshold","bloomScale","blur","quality","FilterDot","DotFilter","angle","grayscale","FilterDistortion","DisplacementFilter","displacementSpriteMask","spriteMaskPath","fixPath","maskPath","Sprite","from","wrapMode","WRAP_MODES","REPEAT","position","skew","pivot","anchorSet","transition","maskSpriteX","maskSpriteY","maskSpriteScaleX","maskSpriteScaleY","maskSpriteSkewX","maskSpriteSkewY","maskSpriteRotation","anchor","texture","baseTexture","value","maskSpritePivotX","maskSpritePivotY","transform","updateTransform","stage","uniforms","filterMatrix","calculateSpriteMatrix","maskMatrix","maskSprite","wt","c","d","FilterOldFilm","OldFilmFilter","vignetting","noise","scratch","scratchDensity","seed","FilterGlow","GlowFilter","innerStrength","outerStrength","color","distance","FilterOutline","OutlineFilter","blendMode","BLEND_MODES","NORMAL","thickness","FilterBevel","BevelFilter","lightColor","lightAlpha","shadowColor","shadowAlpha","_tempRect","Rectangle","CustomFilter","args","filterMatrixInverse","Matrix","sourceFrame","destinationFrame","activeState","TEMP_MATRIX","localBounds","getLocalBounds","copyFrom","invert","scaleX","hypot","scaleY","pad","tx","ty","prepend","parent","translate","customVertex2D","FilterDropShadowEx","shadowOnly","_distance","_resolution","settings","RESOLUTION","_tintFilter","_blurFilter","options","opt","defaults","kernels","resolution","Float32Array","shift","KawaseBlurFilter","_pixelSize","_updateShiftAndScale","getFilterTexture","returnFilterTexture","DEG_TO_RAD","rgb2hex","Color","applyRGB","pixelSize","FilterTwist","TwistFilter","radiusPercent","offset","autoFit","radius","FilterZoomBlur","ZoomBlurFilter","strength","innerRadiusPercent","center","innerRadius","FilterBlurEx","blurXFilter","blurYFilter","_repeatEdgePixels","kernelSize","BlurFilterPassEx","repeatEdgePixels","clearMode","xStrength","yStrength","renderTarget","CLEAR_MODES","CLEAR","updatePadding","blurX","blurY","horizontal","passes","_quality","vertSrc","halfLength","ceil","vertSource","vertTemplate","blurLoop","i","toString","generateBlurVertSource","fragSrc","kernel","GAUSSIAN_VALUES","fragSource","fragTemplate","generateBlurFragSource","flip","flop","blend","bindAndClear","BLIT","uSampler","temp","shader","bind","geometry","draw","join","FilterShockwave","ShockwaveFilter","time","amplitude","wavelength","FilterBulgePinch","BulgePinchFilter","anchorX","anchorY","FilterRemoveShadow","alphaTolerance","assign","FilterRays","divisor","dimX","dimY","alphaDiscard","FilterFog","density","FilterXFog","zapElectricity","FilterElectric","shaderFragment","intensity","intensityVal","FilterWaves","inward","frequency","minIntensity","maxIntensity","FilterFire","fireBlend","FilterFumes","FilterFlood","glint","billowy","shiftX","shiftY","tintIntensity","waterColor","FilterSmoke","FilterForceField","shieldType","posLightX","posLightY","lightSize","hideRadius","chromatic","discardThreshold","posLight","lightColorAlpha","FilterMirrorImages","alphaImg","alphaChr","nbImage","ampX","ampY","FilterXRays","FilterLiquid","spectral","FilterGleamingGlow","auraIntensity","subAuraIntensity","discard","auraType","holes","_frame","FilterPixelate","PixelateFilter","sizeX","sizeY","FilterSpiderWeb","div1","div2","tear","solarRipples","FilterSolarRipples","_octaves","_octave","fragment","FilterGlobes","distortion","FilterTransform","twRadiusPercent","twAngle","twRotation","bpRadiusPercent","bpStrength","pivotX","pivotY","translationX","translationY","translation","twRadius","bpRadius","FilterSplash","spread","splashFactor","cut","textureAlphaBlend","customVertex2DSampler","FilterPolymorph","imagePath","progress","magnify","type","targetSpriteMatrix","targetUVMatrix","inputClampTarget","assignTexture","min","uSamplerTarget","_setTargetSpriteSize","targetSprite","ratioW","_texture","realWidth","realHeight","tex","Texture","renderable","valid","on","addChild","uvMatrix","TextureMatrix","update","mapCoord","uClampFrame","destroy","removeChild","FilterXFire","color1","color2","color3","color4","dispersion","inlay","FilterSprite","colorize","inverse","repeat","top","play","loop","maintainAspectRatio","maintainScale","_play","_loop","_maintainAspectRatio","_maintainScale","_playVideo","source","getProperty","tagName","isNaN","duration","Promise","resolve","onloadedmetadata","video","volume","stop","destroyed","pScale","w","FilterSpriteMask","FilterReplaceColor","ColorReplaceFilter","originalColor","newColor","epsilon","FilterDDTint","tint","Magic","DataVersion","tmfxDataMigration","isTheOne","dataVersionNow","e","presets","log","foundTemplateLibrary","preset","library","MAIN","name","newPresets","error","updatePresetsV030","importPresetLibraryFromPath","overwrite","updatePresetsV040","updatePresetsV040b","updatePresetsV041","updatePresetsV043","updatePresetsV044","cls","getDocumentClass","hook","CONFIG","debug","hooks","console","Hooks","events","entry","fn","off","err","msg","warn","CONST","vtt","onError","callAsyncHook","mustBroadCast","broadcast","SocketAction","SET_FLAG","setFlag","unsetFlag","SET_ANIME_FLAG","object","documentName","FilterCRT","CRTFilter","curvature","lineWidth","lineContrast","verticalLine","noiseSize","FilterRGBSplit","RGBSplitFilter","redX","redY","greenX","greenY","blueX","blueY","HandlebarsApplicationMixin","ApplicationV2","applications","api","TemplateSettings","static","tag","icon","title","contentClasses","classes","form","handler","_onSubmit","submitOnChange","closeOnSubmit","actions","addOverride","_onAddOverride","removeOverride","_onRemoveOverride","main","tabs","initial","labelPrefix","_preparePartContext","partId","context","tab","_prepareContext","emptyPreset","getPresets","system","autoTemplateEnable","autoTemplateSettings","submitText","i18n","localize","event","formData","expandObject","key","entries","overrides","compacted","val","idx","lastKey","k","Number","at","opacity","render","closest","submit","AutoTemplateDND5E","_enabled","categories","defaultConfiguration","defaultConfig","DND5E","damageTypes","dmgType","config","toLowerCase","MEASURED_TEMPLATE_TYPES","tplType","configure","libWrapper","register","fromActivity","unregister","_prepareCategoriesContext","dmgTypes","templateTypes","fromConfig","o","tokenmagic","tmfxPreset","tmfxTexture","tmfxTint","tmfxTextureAlpha","updateSource","flags","fromOverrides","activity","item","configs","el","fromCategories","dmgSettings","hasAttack","hasSave","damage","base","types","activities","saves","getByType","flatMap","save","parts","part","t","wrapped","activityTemplates","activityTemplate","AutoTemplatePF2E","PF2E","damageTraits","k1","k2","localeCompare","label","charAt","toUpperCase","slice","preCreateMeasuredTemplate","origin","pf2e","updated","slug","traits","trait","AutoTemplateTheWitcherTRPG","WITCHER","meleeSkills","meleeSkillType","templateData","witcher","TokenMagicSettings","init","autoTemplateClass","getSystemTemplateClass","hasAutoTemplates","registerMenu","hint","restricted","scope","default","Boolean","onChange","configureAutoTemplate","requiresReload","String","getSystemTemplates","_autoTemplate","Handlebars","registerHelper","pop","wmtApplyRenderFlags","wmtApplyRenderFlagsType","wmtRefreshTemplate","isVideoDisabled","toRadians","refreshShape","_destroyed","isVisible","lineStyle","_borderThickness","borderColor","beginFill","mat","IDENTITY","rotate","direction","angles","rays","Ray","fromAngle","sqrt","B","beginTextureFill","matrix","muted","drawShape","drawCircle","ray","dx","dy","endFill","autohideTemplateElements","borderThickness","_original","templates","preview","_hover","retVal","show","graphicsData","fillStyle","visible","invalidate","ruler","controlIcon","isOwner","handle","_wmtApplyRenderFlags","call","mx","my","getLocalPosition","hl","interface","grid","getHighlightLayer","highlightId","cx","cy","mouseover","contains","hasPresetData","hasTexture","defaultTexture","_getPresetTemplateDefaultTexture","startsWith","result","layer","border","hover","moduleTM","FilterType","adjustment","ascii","dot","crt","oldfilm","glow","outline","bevel","xbloom","shadow","FilterDropShadow","devicePixelRatio","twist","zoomblur","FilterBlur","strengthX","strengthY","bulgepinch","zapshadow","fog","xfog","electric","wave","shockwave","fire","fumes","smoke","flood","images","field","xray","liquid","xglow","pixel","web","ripples","globes","splash","polymorph","xfire","spriteMask","replaceColor","ddTint","rgbSplit","exportObjectAsJson","exportObj","exportName","jsonStr","JSON","stringify","createElement","file","Blob","href","URL","createObjectURL","download","click","revokeObjectURL","socketAction","tmAction","tmPlaceableId","tmPlaceableType","tmFlag","tmScene","socket","emit","resp","theOne","users","user","isGM","autosetPaddingMode","logged","path","url","location","prefix","ROUTE_PREFIX","pathname","getControlledPlaceables","tokens","tiles","drawings","some","activeLayer","p","controlled","getTargetedTokens","isTargeted","findPlaceable","rplaceable","n","randomizeParams","randomized","param","opts","rVal","isArray","list","mix","step","steps","randomStep","precision","split","toFixed","setProperty","link","objectAssign","sources","s_val","t_val","_cachedContainer","Container","getPreset","actualFlags","newFlags","updateId","tmFilters","tmFilterType","tmFilterOwner","tmParams","workingFlags","updateParams","match","removedInternalIds","Set","idMatch","typeMatch","internalIdMatch","has","isApplicableUser","hasUser","arr","include","exclude","_checkFilterId","_loadPersistedValues","animeInfos","_assignFilters","bulkLoading","filterInfo","_assignFilter","workingFilterInfo","setFilter","_singleLoadFilters","updateData","setShaderClass","rendering","shaders","RegionShader","loadingRequest","_fxPseudoEqual","flagObject","filterObject","isObject","flagKeys","flagKey","flagValue","filterValue","areObjects","_importPresetContent","content","check","element","replaceLibrary","pst","it","index","indexOf","response","fetch","json","message","importTemplateSettingsFromPath","_importTemplateSettingsContent","presetName","pName","pLibrary","argIsObj","adjustmentProp","filterProp","filterPropVal","deepClone","addFiltersOnSelected","addFiltersOnTargeted","targeted","token","addUpdateFiltersOnSelected","addUpdateFiltersOnTargeted","deleteFiltersOnSelected","deleteFiltersOnTargeted","updateFilters","placeableIdSet","animations","updateFiltersOnSelected","updateFiltersOnTargeted","importTemplateSettings","FilePicker","current","callback","browse","exportTemplateSettings","exportPresetLibrary","importPresetLibrary","importPresetLibraryFromURL","$","getJSON","resetPresetLibrary","confirm","ui","notifications","info","libraryName","addPreset","silent","pDefaultTexture","presetObject","deletePreset","splice","presetToggler","then","module","presetSearch","filterEditor","sourceBounds","filterTypes","_loadFilters","reverse","_clearImgFiltersByPlaceable","filterById","theFilters","destroyClearedFilters","filterTheFiltering","_getAnimeMap","_updateFilters","_id","foundFilter","filterFlag","puppets","_updateTemplateData","presetLibrary","compilingShaders","tmpRenderTexture","RenderTexture","create","renderTexture","requestLoadFilters","startTimeout","reqTimer","launchRequest","setTimeout","clearTimeout","getAnchor","shapeType","dirRad","angleRad","cosRa1","rsinRa1","cosRa2","rsinRa2","onMeasuredTemplateConfig","templateConfig","html","querySelector","setAttribute","tmTemplate","currentPreset","tmfxTemplateData","hex2string","tmfxValues","selected","divPreset","formGroup","after","setPosition","onRegionConfig","regionConfig","region","tmfxRegionData","alphaRangePicker","handlebars","renderTemplate","updateFlags","targetFlag","scene","scenes","updateEmbeddedDocuments","initSocketListener","modules","viewedScene","_","src","overhead","HighlightRegionShader","measuredTemplateInstance","templateTint","presetUpdate","tintUpdate","directionUpdate","angleUpdate","typeUpdate","valueOf","templateFX","presetOptions","Levels3DPreview","_active","hasFlags","hasPreset","hasTint","hasOpacity","hasFlagsNoOptions","newFilters","tmfxBaseFlags","tmfxFiltersData","pstSearch","defaultTex","persist","tmfxFlags","hud","leftColumn","button","classList","dataset","action","tooltip","appendChild","addEventListener","pointerType","getBoundingClientRect","controls","onClick","subtype","bounds","p1","p2","elevation","_lastSortedIndex","handleTMFXDropEvent","PresetsLibrary","sepia","scratchWidth","vignettingAlpha","vignettingBlur","templatePresets","allPresets","defaultOpacity","autoMinRank","PlaceableType","Token","Tile","MeasuredTemplate","Drawing","Region","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","__webpack_modules__","m","definition","enumerable","chunkId","all","reduce","promises","u","obj","prop","l","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","nc","onScriptComplete","prev","onerror","onload","timeout","doneFns","parentNode","head","installedChunks","j","installedChunkData","promise","reject","Error","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal"],"ignoreList":[],"sourceRoot":""}