summaryrefslogtreecommitdiff
path: root/apps/web/src/lib/effects
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-04-20 11:31:17 +0200
committerMaze Winther <mazewinther@gmail.com>2026-04-20 11:31:17 +0200
commit3e89d2998588f8e35c524e523ba2ee853f0f6475 (patch)
tree57221f96c1259b3b07e3ddf8c1adefc502b9d8eb /apps/web/src/lib/effects
parent729d10592f4e802f91c555c309ff3ba4b119f843 (diff)
downloadopencut-3e89d2998588f8e35c524e523ba2ee853f0f6475.tar.gz
refactor: restructure files to their domains, new preview overlay system, and dep graph
Diffstat (limited to 'apps/web/src/lib/effects')
-rw-r--r--apps/web/src/lib/effects/definitions/blur.ts110
-rw-r--r--apps/web/src/lib/effects/definitions/index.ts13
-rw-r--r--apps/web/src/lib/effects/index.ts47
-rw-r--r--apps/web/src/lib/effects/registry.ts10
-rw-r--r--apps/web/src/lib/effects/types.ts41
5 files changed, 0 insertions, 221 deletions
diff --git a/apps/web/src/lib/effects/definitions/blur.ts b/apps/web/src/lib/effects/definitions/blur.ts
deleted file mode 100644
index b464db3a..00000000
--- a/apps/web/src/lib/effects/definitions/blur.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import type { EffectDefinition, EffectPass } from "@/lib/effects/types";
-
-export const GAUSSIAN_BLUR_SHADER = "gaussian-blur";
-
-const MAX_SINGLE_PASS_SIGMA = 10;
-const MAX_STEP = 4;
-const MAX_EFFECTIVE_SIGMA = MAX_SINGLE_PASS_SIGMA * MAX_STEP;
-const MAX_ITERATIONS = 8;
-
-export function buildGaussianBlurPasses({
- sigmaX,
- sigmaY,
-}: {
- sigmaX: number;
- sigmaY: number;
-}): EffectPass[] {
- const maxSigma = Math.max(sigmaX, sigmaY);
- if (maxSigma < 0.001) return [];
-
- const iterations = Math.min(
- MAX_ITERATIONS,
- Math.max(
- 1,
- Math.ceil(
- (maxSigma * maxSigma) /
- (MAX_EFFECTIVE_SIGMA * MAX_EFFECTIVE_SIGMA),
- ),
- ),
- );
- const perPassSigmaX = sigmaX / Math.sqrt(iterations);
- const perPassSigmaY = sigmaY / Math.sqrt(iterations);
- const stepX = Math.max(1, perPassSigmaX / MAX_SINGLE_PASS_SIGMA);
- const stepY = Math.max(1, perPassSigmaY / MAX_SINGLE_PASS_SIGMA);
-
- const passes: EffectPass[] = [];
- for (let i = 0; i < iterations; i++) {
- passes.push({
- shader: GAUSSIAN_BLUR_SHADER,
- uniforms: {
- u_sigma: perPassSigmaX,
- u_step: stepX,
- u_direction: [1, 0],
- },
- });
- passes.push({
- shader: GAUSSIAN_BLUR_SHADER,
- uniforms: {
- u_sigma: perPassSigmaY,
- u_step: stepY,
- u_direction: [0, 1],
- },
- });
- }
- return passes;
-}
-
-export const INTENSITY_TO_SIGMA_DIVISOR = 5;
-
-export function intensityToSigma({ intensity, resolution, reference }: { intensity: number; resolution: number; reference: number }): number {
- return (intensity / INTENSITY_TO_SIGMA_DIVISOR) * (resolution / reference);
-}
-
-function parseIntensity(effectParams: Record<string, unknown>): number {
- const raw = effectParams.intensity;
- return typeof raw === "number" ? raw : Number.parseFloat(String(raw));
-}
-
-export const blurEffectDefinition: EffectDefinition = {
- type: "blur",
- name: "Blur",
- keywords: ["blur", "soft", "defocus"],
- params: [
- {
- key: "intensity",
- label: "Intensity",
- type: "number",
- default: 15,
- min: 0,
- max: 100,
- step: 1,
- },
- ],
- renderer: {
- passes: [
- {
- shader: GAUSSIAN_BLUR_SHADER,
- uniforms: ({ effectParams, width }) => ({
- u_sigma: Math.max(intensityToSigma({ intensity: parseIntensity(effectParams), resolution: width, reference: 1920 }), 0.001),
- u_step: 1,
- u_direction: [1, 0],
- }),
- },
- {
- shader: GAUSSIAN_BLUR_SHADER,
- uniforms: ({ effectParams, height }) => ({
- u_sigma: Math.max(intensityToSigma({ intensity: parseIntensity(effectParams), resolution: height, reference: 1080 }), 0.001),
- u_step: 1,
- u_direction: [0, 1],
- }),
- },
- ],
- buildPasses: ({ effectParams, width, height }) => {
- const intensity = parseIntensity(effectParams);
- return buildGaussianBlurPasses({
- sigmaX: intensityToSigma({ intensity, resolution: width, reference: 1920 }),
- sigmaY: intensityToSigma({ intensity, resolution: height, reference: 1080 }),
- });
- },
- },
-};
diff --git a/apps/web/src/lib/effects/definitions/index.ts b/apps/web/src/lib/effects/definitions/index.ts
deleted file mode 100644
index edc8c5e2..00000000
--- a/apps/web/src/lib/effects/definitions/index.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { effectsRegistry } from "../registry";
-import { blurEffectDefinition } from "./blur";
-
-const defaultEffects = [blurEffectDefinition];
-
-export function registerDefaultEffects(): void {
- for (const definition of defaultEffects) {
- if (effectsRegistry.has(definition.type)) {
- continue;
- }
- effectsRegistry.register(definition.type, definition);
- }
-}
diff --git a/apps/web/src/lib/effects/index.ts b/apps/web/src/lib/effects/index.ts
deleted file mode 100644
index 92484ee2..00000000
--- a/apps/web/src/lib/effects/index.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { generateUUID } from "@/utils/id";
-import { buildDefaultParamValues } from "@/lib/registry";
-import { effectsRegistry } from "./registry";
-import type { ParamValues } from "@/lib/params";
-import type { Effect, EffectDefinition, EffectPass } from "@/lib/effects/types";
-import { VISUAL_ELEMENT_TYPES } from "@/lib/timeline";
-
-export { effectsRegistry } from "./registry";
-export { registerDefaultEffects } from "./definitions";
-
-export function resolveEffectPasses({
- definition,
- effectParams,
- width,
- height,
-}: {
- definition: EffectDefinition;
- effectParams: ParamValues;
- width: number;
- height: number;
-}): EffectPass[] {
- if (definition.renderer.buildPasses) {
- return definition.renderer.buildPasses({ effectParams, width, height });
- }
- return definition.renderer.passes.map((pass) => ({
- shader: pass.shader,
- uniforms: pass.uniforms({ effectParams, width, height }),
- }));
-}
-
-export const EFFECT_TARGET_ELEMENT_TYPES = VISUAL_ELEMENT_TYPES;
-
-export function buildDefaultEffectInstance({
- effectType,
-}: {
- effectType: string;
-}): Effect {
- const definition = effectsRegistry.get(effectType);
- const params: ParamValues = buildDefaultParamValues(definition.params);
-
- return {
- id: generateUUID(),
- type: effectType,
- params,
- enabled: true,
- };
-}
diff --git a/apps/web/src/lib/effects/registry.ts b/apps/web/src/lib/effects/registry.ts
deleted file mode 100644
index 29cc3202..00000000
--- a/apps/web/src/lib/effects/registry.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { DefinitionRegistry } from "@/lib/registry";
-import type { EffectDefinition } from "@/lib/effects/types";
-
-export class EffectsRegistry extends DefinitionRegistry<string, EffectDefinition> {
- constructor() {
- super("effect");
- }
-}
-
-export const effectsRegistry = new EffectsRegistry();
diff --git a/apps/web/src/lib/effects/types.ts b/apps/web/src/lib/effects/types.ts
deleted file mode 100644
index 1862b440..00000000
--- a/apps/web/src/lib/effects/types.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import type { ParamDefinition, ParamValues } from "@/lib/params";
-
-export interface Effect {
- id: string;
- type: string;
- params: ParamValues;
- enabled: boolean;
-}
-
-export type EffectUniformValue = number | number[];
-
-export interface EffectPass {
- shader: string;
- uniforms: Record<string, EffectUniformValue>;
-}
-
-export interface EffectPassTemplate {
- shader: string;
- uniforms(params: {
- effectParams: ParamValues;
- width: number;
- height: number;
- }): Record<string, EffectUniformValue>;
-}
-
-export interface EffectRendererConfig {
- passes: EffectPassTemplate[];
- buildPasses?: (params: {
- effectParams: ParamValues;
- width: number;
- height: number;
- }) => EffectPass[];
-}
-
-export interface EffectDefinition {
- type: string;
- name: string;
- keywords: string[];
- params: ParamDefinition[];
- renderer: EffectRendererConfig;
-}