added highlight thickness option

This commit is contained in:
grimsace
2026-05-08 08:46:51 -05:00
parent c4cfd59613
commit eaca56c07f
2 changed files with 30 additions and 7 deletions
+4
View File
@@ -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"
},
+26 -7
View File
@@ -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}`);
}