diff --git a/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue b/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue
index 1a4a2ac75d..0312017d86 100644
--- a/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue
+++ b/packages/frontend/src/components/MkImageEffectorDialog.Layer.vue
@@ -31,6 +31,9 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ k }}
+ { const c = v.slice(1).match(/.{2}/g)?.map(x => parseInt(x, 16) / 255); if (c) layer.params[k] = c; }">
+ {{ k }}
+
diff --git a/packages/frontend/src/utility/image-effector/ImageEffector.ts b/packages/frontend/src/utility/image-effector/ImageEffector.ts
index fbc2ccd8dc..fe253017e5 100644
--- a/packages/frontend/src/utility/image-effector/ImageEffector.ts
+++ b/packages/frontend/src/utility/image-effector/ImageEffector.ts
@@ -12,6 +12,7 @@ type ParamTypeToPrimitive = {
'align': { x: 'left' | 'center' | 'right'; y: 'top' | 'center' | 'bottom'; };
'seed': number;
'texture': { type: 'text'; text: string | null; } | { type: 'url'; url: string | null; } | null;
+ 'color': [r: number, g: number, b: number];
};
type ImageEffectorFxParamDefs = Record {
gl.uniform1f(u.angle, params.angle / 2);
gl.uniform1f(u.scale, params.scale * params.scale);
- gl.uniform1i(u.black, params.black ? 1 : 0);
+ gl.uniform3f(u.color, params.color[0], params.color[1], params.color[2]);
gl.uniform1f(u.opacity, params.opacity);
},
});
diff --git a/packages/frontend/src/utility/image-effector/fxs/polkadot.ts b/packages/frontend/src/utility/image-effector/fxs/polkadot.ts
index 16f19875e8..198dd9bad0 100644
--- a/packages/frontend/src/utility/image-effector/fxs/polkadot.ts
+++ b/packages/frontend/src/utility/image-effector/fxs/polkadot.ts
@@ -23,7 +23,7 @@ uniform float u_major_opacity;
uniform float u_minor_divisions;
uniform float u_minor_radius;
uniform float u_minor_opacity;
-uniform bool u_black;
+uniform vec3 u_color;
out vec4 out_color;
void main() {
@@ -48,9 +48,9 @@ void main() {
length(vec2((1.0 / u_scale) - major_modX, (1.0 / u_scale) - major_modY)) < major_threshold
) {
out_color = vec4(
- mix(in_color.r, u_black ? 0.0 : 1.0, u_major_opacity),
- mix(in_color.g, u_black ? 0.0 : 1.0, u_major_opacity),
- mix(in_color.b, u_black ? 0.0 : 1.0, u_major_opacity),
+ mix(in_color.r, u_color.r, u_major_opacity),
+ mix(in_color.g, u_color.g, u_major_opacity),
+ mix(in_color.b, u_color.b, u_major_opacity),
in_color.a
);
return;
@@ -66,9 +66,9 @@ void main() {
length(vec2((1.0 / u_scale / u_minor_divisions) - minor_modX, (1.0 / u_scale / u_minor_divisions) - minor_modY)) < minor_threshold
) {
out_color = vec4(
- mix(in_color.r, u_black ? 0.0 : 1.0, u_minor_opacity),
- mix(in_color.g, u_black ? 0.0 : 1.0, u_minor_opacity),
- mix(in_color.b, u_black ? 0.0 : 1.0, u_minor_opacity),
+ mix(in_color.r, u_color.r, u_minor_opacity),
+ mix(in_color.g, u_color.g, u_minor_opacity),
+ mix(in_color.b, u_color.b, u_minor_opacity),
in_color.a
);
return;
@@ -82,7 +82,7 @@ export const FX_polkadot = defineImageEffectorFx({
id: 'polkadot' as const,
name: i18n.ts._imageEffector._fxs.polkadot,
shader,
- uniforms: ['angle', 'scale', 'major_radius', 'major_opacity', 'minor_divisions', 'minor_radius', 'minor_opacity', 'black'] as const,
+ uniforms: ['angle', 'scale', 'major_radius', 'major_opacity', 'minor_divisions', 'minor_radius', 'minor_opacity', 'color'] as const,
params: {
angle: {
type: 'number' as const,
@@ -133,9 +133,9 @@ export const FX_polkadot = defineImageEffectorFx({
max: 1.0,
step: 0.01,
},
- black: {
- type: 'boolean' as const,
- default: false,
+ color: {
+ type: 'color' as const,
+ default: [1, 1, 1],
},
},
main: ({ gl, u, params }) => {
@@ -145,7 +145,7 @@ export const FX_polkadot = defineImageEffectorFx({
gl.uniform1f(u.major_opacity, params.majorOpacity);
gl.uniform1f(u.minor_divisions, params.minorDivisions);
gl.uniform1f(u.minor_radius, params.minorRadius);
+ gl.uniform3f(u.color, params.color[0], params.color[1], params.color[2]);
gl.uniform1f(u.minor_opacity, params.minorOpacity);
- gl.uniform1i(u.black, params.black ? 1 : 0);
},
});
diff --git a/packages/frontend/src/utility/image-effector/fxs/stripe.ts b/packages/frontend/src/utility/image-effector/fxs/stripe.ts
index 5c4c84dec1..37766e185d 100644
--- a/packages/frontend/src/utility/image-effector/fxs/stripe.ts
+++ b/packages/frontend/src/utility/image-effector/fxs/stripe.ts
@@ -20,7 +20,7 @@ uniform float u_angle;
uniform float u_frequency;
uniform float u_phase;
uniform float u_threshold;
-uniform bool u_black;
+uniform vec3 u_color;
uniform float u_opacity;
out vec4 out_color;
@@ -40,9 +40,9 @@ void main() {
float value = (1.0 + sin((rotatedUV.x * u_frequency - HALF_PI) + phase)) / 2.0;
value = value < u_threshold ? 1.0 : 0.0;
out_color = vec4(
- mix(in_color.r, u_black ? 0.0 : 1.0, value * u_opacity),
- mix(in_color.g, u_black ? 0.0 : 1.0, value * u_opacity),
- mix(in_color.b, u_black ? 0.0 : 1.0, value * u_opacity),
+ mix(in_color.r, u_color.r, value * u_opacity),
+ mix(in_color.g, u_color.g, value * u_opacity),
+ mix(in_color.b, u_color.b, value * u_opacity),
in_color.a
);
}
@@ -52,7 +52,7 @@ export const FX_stripe = defineImageEffectorFx({
id: 'stripe' as const,
name: i18n.ts._imageEffector._fxs.stripe,
shader,
- uniforms: ['angle', 'frequency', 'phase', 'threshold', 'black', 'opacity'] as const,
+ uniforms: ['angle', 'frequency', 'phase', 'threshold', 'color', 'opacity'] as const,
params: {
angle: {
type: 'number' as const,
@@ -75,9 +75,9 @@ export const FX_stripe = defineImageEffectorFx({
max: 1.0,
step: 0.01,
},
- black: {
- type: 'boolean' as const,
- default: false,
+ color: {
+ type: 'color' as const,
+ default: [1, 1, 1],
},
opacity: {
type: 'number' as const,
@@ -92,7 +92,7 @@ export const FX_stripe = defineImageEffectorFx({
gl.uniform1f(u.frequency, params.frequency * params.frequency);
gl.uniform1f(u.phase, 0.0);
gl.uniform1f(u.threshold, params.threshold);
- gl.uniform1i(u.black, params.black ? 1 : 0);
+ gl.uniform3f(u.color, params.color[0], params.color[1], params.color[2]);
gl.uniform1f(u.opacity, params.opacity);
},
});
diff --git a/packages/frontend/src/utility/watermark.ts b/packages/frontend/src/utility/watermark.ts
index 3910d014d6..8ee93181a6 100644
--- a/packages/frontend/src/utility/watermark.ts
+++ b/packages/frontend/src/utility/watermark.ts
@@ -39,7 +39,7 @@ export type WatermarkPreset = {
angle: number;
frequency: number;
threshold: number;
- black: boolean;
+ color: [r: number, g: number, b: number];
opacity: number;
} | {
id: string;
@@ -51,14 +51,14 @@ export type WatermarkPreset = {
minorDivisions: number;
minorRadius: number;
minorOpacity: number;
- black: boolean;
+ color: [r: number, g: number, b: number];
opacity: number;
} | {
id: string;
type: 'checker';
angle: number;
scale: number;
- black: boolean;
+ color: [r: number, g: number, b: number];
opacity: number;
})[];
};
@@ -126,7 +126,7 @@ export class WatermarkRenderer {
angle: layer.angle,
frequency: layer.frequency,
threshold: layer.threshold,
- black: layer.black,
+ color: layer.color,
opacity: layer.opacity,
},
};
@@ -142,7 +142,7 @@ export class WatermarkRenderer {
minorDivisions: layer.minorDivisions,
minorRadius: layer.minorRadius,
minorOpacity: layer.minorOpacity,
- black: layer.black,
+ color: layer.color,
opacity: layer.opacity,
},
};
@@ -153,7 +153,7 @@ export class WatermarkRenderer {
params: {
angle: layer.angle,
scale: layer.scale,
- black: layer.black,
+ color: layer.color,
opacity: layer.opacity,
},
};