From eaca56c07f2feb1404c776f7ed28651a8db301d3 Mon Sep 17 00:00:00 2001 From: grimsace Date: Fri, 8 May 2026 08:46:51 -0500 Subject: [PATCH] added highlight thickness option --- languages/en.json | 4 ++++ scripts/module.js | 33 ++++++++++++++++++++++++++------- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/languages/en.json b/languages/en.json index c3b5c78..a015d49 100644 --- a/languages/en.json +++ b/languages/en.json @@ -11,6 +11,10 @@ "name": "Refresh During Movement", "hint": "If disabled, aura highlights will only refresh when a token stops moving or its settings are updated. This can improve performance." }, + "thickness": { + "name": "Highlight Thickness", + "hint": "The thickness of the aura highlights in pixels (1-100)." + }, "name": { "name": "Aura Name" }, diff --git a/scripts/module.js b/scripts/module.js index f1862a4..1ff07a1 100644 --- a/scripts/module.js +++ b/scripts/module.js @@ -5,11 +5,11 @@ const MODULE_ID = "basic_aura_highlighting"; const AURAS_TAB = "basic-aura-highlighting-auras"; const AURAS_FLAG_PATH = `flags.${MODULE_ID}.auras`; const HIGHLIGHT_CONTAINER_NAME = `${MODULE_ID}.highlights`; -const HIGHLIGHT_LINE_WIDTH = 4; const HIGHLIGHT_RING_SPACING = 5; const HIGHLIGHT_ALPHA_THRESHOLD = 0.2; const ALPHA_SAMPLE_SIZE = 48; const HIGHLIGHT_FILTER_MARKER = Symbol(MODULE_ID); +const THICKNESS_SETTING = "thickness"; // Shader for drawing an outline around the token's non-transparent pixels const ALPHA_OUTLINE_FRAGMENT_SHADER = ` @@ -64,6 +64,21 @@ Hooks.once("init", () => { default: true, onChange: scheduleAuraHighlightRefresh, }); + + game.settings.register(MODULE_ID, THICKNESS_SETTING, { + name: localize("settings.thickness.name"), + hint: localize("settings.thickness.hint"), + scope: "client", + config: true, + type: Number, + range: { + min: 1, + max: 100, + step: 1, + }, + default: 4, + onChange: scheduleAuraHighlightRefresh, + }); }); Hooks.on("renderTokenConfig", injectAurasTab); @@ -888,7 +903,7 @@ function createOutlineFilter(color) { const colorNumber = colorToNumber(color); const pixiOutlineFilter = globalThis.PIXI?.filters?.OutlineFilter; if (pixiOutlineFilter) - return new pixiOutlineFilter(HIGHLIGHT_LINE_WIDTH, colorNumber, 0.2); + return new pixiOutlineFilter(getHighlightThickness(), colorNumber, 0.2); const outlineOverlayFilter = globalThis.OutlineOverlayFilter ?? @@ -896,7 +911,7 @@ function createOutlineFilter(color) { if (outlineOverlayFilter?.create) { const filter = outlineOverlayFilter.create({ outlineColor: colorToRgbArray(colorNumber), - thickness: [HIGHLIGHT_LINE_WIDTH, HIGHLIGHT_LINE_WIDTH], + thickness: [getHighlightThickness(), getHighlightThickness()], alphaThreshold: HIGHLIGHT_ALPHA_THRESHOLD, knockout: false, wave: false, @@ -915,7 +930,7 @@ function createOutlineFilter(color) { if (glowOverlayFilter?.create) { const filter = glowOverlayFilter.create({ glowColor: colorToRgbArray(colorNumber), - distance: HIGHLIGHT_LINE_WIDTH, + distance: getHighlightThickness(), outerStrength: 3, innerStrength: 0, alpha: 1, @@ -931,7 +946,7 @@ function createOutlineFilter(color) { function createAlphaOutlineFilter(color) { const uniforms = { outlineColor: colorToRgbArray(color), - thickness: HIGHLIGHT_LINE_WIDTH, + thickness: getHighlightThickness(), alphaThreshold: HIGHLIGHT_ALPHA_THRESHOLD, }; const baseFilter = @@ -945,7 +960,7 @@ function createAlphaOutlineFilter(color) { ALPHA_OUTLINE_FRAGMENT_SHADER, uniforms, ); - filter.padding = HIGHLIGHT_LINE_WIDTH; + filter.padding = getHighlightThickness(); return filter; } catch (_error) { return null; @@ -958,7 +973,7 @@ function drawFallbackTokenHighlights(container, token, highlights) { const bounds = token.bounds.clone().pad(index * HIGHLIGHT_RING_SPACING); const graphic = new PIXI.Graphics(); - graphic.lineStyle(HIGHLIGHT_LINE_WIDTH, colorToNumber(aura.color), 0.9); + graphic.lineStyle(getHighlightThickness(), colorToNumber(aura.color), 0.9); graphic.drawRoundedRect( bounds.x, bounds.y, @@ -1014,6 +1029,10 @@ function activateAurasTab(root, group) { } } +function getHighlightThickness() { + return game.settings.get(MODULE_ID, THICKNESS_SETTING) ?? 4; +} + function localize(path) { return game.i18n.localize(`BASIC_AURA_HIGHLIGHTING.${path}`); }