diff options
Diffstat (limited to 'apps/web/src/lib/effects')
| -rw-r--r-- | apps/web/src/lib/effects/definitions/blur.ts | 110 | ||||
| -rw-r--r-- | apps/web/src/lib/effects/definitions/index.ts | 13 | ||||
| -rw-r--r-- | apps/web/src/lib/effects/index.ts | 47 | ||||
| -rw-r--r-- | apps/web/src/lib/effects/registry.ts | 10 | ||||
| -rw-r--r-- | apps/web/src/lib/effects/types.ts | 41 |
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; -} |
