textmode.js 0.7.0-beta.1 → 0.7.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,7 +9,7 @@ export type { TextmodeFramebufferOptions } from './rendering/webgl';
9
9
  export { registerConversionStrategy, unregisterConversionStrategy, getConversionStrategy, } from './textmode/conversion';
10
10
  export type { TextmodeConversionStrategy, TextmodeConversionContext, TextmodeConversionMode, } from './textmode/conversion';
11
11
  export type { TextmodePlugin, TextmodePluginAPI, } from './textmode/managers/PluginManager';
12
- export { registerFilterStrategy, unregisterFilterStrategy, isFilterRegistered, getRegisteredFilters, } from './textmode/layers';
12
+ export { FilterRegistry } from './textmode/layers';
13
13
  export type { FilterName, BuiltInFilterName, BuiltInFilterParams, FilterContext, TextmodeFilterStrategy, } from './textmode/layers';
14
14
  export { TextmodeErrorLevel } from './errors/ErrorHandler';
15
15
  export { Textmode as textmode } from './Textmode';
@@ -1,6 +1,7 @@
1
1
  import type { GLFramebuffer } from '../../rendering';
2
2
  import type { Textmodifier } from '../Textmodifier';
3
3
  import { TextmodeLayer } from './TextmodeLayer';
4
+ import { LayerFilterManager } from './filters';
4
5
  import type { TextmodeLayerOptions } from './types';
5
6
  import type { ILayerManager } from './ILayerManager';
6
7
  /**
@@ -69,6 +70,29 @@ export declare class LayerManager implements ILayerManager {
69
70
  $dispose(): void;
70
71
  get all(): readonly TextmodeLayer[];
71
72
  get base(): TextmodeLayer;
73
+ /**
74
+ * Access the filter registry for this Textmodifier instance.
75
+ *
76
+ * Use this to define or register custom filters scoped to this instance.
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * // Define a filter using the simplified API
81
+ * const shader = await t.createShader(vertSrc, fragSrc);
82
+ * t.layers.filters.define('brightness', shader, { amount: 1.0 });
83
+ *
84
+ * // Register a custom filter strategy
85
+ * t.layers.filters.register({
86
+ * id: 'custom',
87
+ * createShader() { return shader; },
88
+ * createUniforms(params, ctx) { return { ... }; }
89
+ * });
90
+ *
91
+ * // Use the filter
92
+ * t.layers.base.filter('brightness', 1.5);
93
+ * ```
94
+ */
95
+ get filters(): LayerFilterManager;
72
96
  /**
73
97
  * Initialize a single layer with required dependencies.
74
98
  */
@@ -1,87 +1,83 @@
1
+ import type { GLRenderer, GLShader } from '../../../rendering';
1
2
  import type { TextmodeFilterStrategy, FilterName } from './types';
2
3
  /**
3
- * Register a custom filter strategy.
4
+ * Instance-based registry for filter strategies.
4
5
  *
5
- * Once registered, the filter can be used with `layer.filter('filterId', params)`.
6
+ * Each {@link Textmodifier} instance has its own FilterRegistry, allowing
7
+ * filters to be scoped to a specific instance rather than registered globally.
6
8
  *
7
- * @param strategy The filter strategy to register
8
- * @throws Error if a filter with the same ID is already registered
9
+ * Access via `t.layers.filters`.
9
10
  *
10
11
  * @example
11
12
  * ```typescript
12
- * import { registerFilterStrategy } from 'textmode.js';
13
+ * // Define a simple filter with the declarative API
14
+ * t.layers.filters.define('blur', blurShader, { radius: 5.0 });
13
15
  *
14
- * registerFilterStrategy({
15
- * id: 'customGlow',
16
- * createShader(context) {
17
- * return context.renderer.$createShader(vertexSrc, fragmentSrc);
18
- * },
19
- * createUniforms(params, context) {
20
- * return {
21
- * u_intensity: params?.intensity ?? 1.0,
22
- * u_color: params?.color ?? [1, 1, 1],
23
- * u_resolution: [context.width, context.height]
24
- * };
25
- * }
16
+ * // Register a custom filter strategy
17
+ * t.layers.filters.register({
18
+ * id: 'custom',
19
+ * createShader(ctx) { ... },
20
+ * createUniforms(params, ctx) { ... }
26
21
  * });
27
22
  *
28
- * // Then in your sketch:
29
- * layer.draw(() => {
30
- * // ... drawing code
31
- * this.filter('customGlow', { intensity: 0.8, color: [1, 0.5, 0] });
32
- * });
33
- * ```
34
- */
35
- export declare function registerFilterStrategy(strategy: TextmodeFilterStrategy): void;
36
- /**
37
- * Unregister a previously registered filter strategy.
38
- *
39
- * @param id The ID of the filter to unregister
40
- * @returns true if the filter was unregistered, false if it wasn't registered
41
- *
42
- * @example
43
- * ```typescript
44
- * import { unregisterFilterStrategy } from 'textmode.js';
45
- *
46
- * unregisterFilterStrategy('customGlow');
47
- * ```
48
- */
49
- export declare function unregisterFilterStrategy(id: FilterName): boolean;
50
- /**
51
- * Get a registered filter strategy by its ID.
52
- *
53
- * @param id The ID of the filter
54
- * @returns The filter strategy, or undefined if not found
55
- * @internal
56
- */
57
- export declare function getFilterStrategy(id: FilterName): TextmodeFilterStrategy | undefined;
58
- /**
59
- * Check if a filter is registered.
60
- *
61
- * @param id The ID of the filter to check
62
- * @returns true if the filter is registered
63
- *
64
- * @example
65
- * ```typescript
66
- * import { isFilterRegistered } from 'textmode.js';
67
- *
68
- * if (isFilterRegistered('myFilter')) {
69
- * layer.filter('myFilter');
70
- * }
71
- * ```
72
- */
73
- export declare function isFilterRegistered(id: FilterName): boolean;
74
- /**
75
- * Get a list of all registered filter IDs.
76
- *
77
- * @returns An array of all registered filter IDs
78
- *
79
- * @example
80
- * ```typescript
81
- * import { getRegisteredFilters } from 'textmode.js';
82
- *
83
- * console.log('Available filters:', getRegisteredFilters());
84
- * // ['invert', 'grayscale', 'sepia', 'hueRotate', ...]
23
+ * // Use the filter
24
+ * t.layers.base.filter('blur', { radius: 10 });
85
25
  * ```
86
26
  */
87
- export declare function getRegisteredFilters(): FilterName[];
27
+ export declare class FilterRegistry {
28
+ private readonly _renderer;
29
+ private readonly _filters;
30
+ private readonly _shaderCache;
31
+ /**
32
+ * Create a new FilterRegistry.
33
+ * @param renderer The WebGL renderer instance
34
+ * @internal
35
+ */
36
+ constructor(renderer: GLRenderer);
37
+ /**
38
+ * Define a filter using a simplified declarative syntax.
39
+ *
40
+ * This is the easiest way to create filters for add-on libraries.
41
+ * The shader is compiled immediately and cached.
42
+ *
43
+ * @param id Unique filter identifier
44
+ * @param shader Pre-compiled GLShader, fragment shader source string, or path to a fragment shader file (.frag or .glsl)
45
+ * @param uniforms Default uniform values. Keys map uniform names to [paramName, defaultValue] tuples.
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * // With pre-compiled shader (recommended for add-ons)
50
+ * const shader = await t.createShader(vertSrc, fragSrc);
51
+ * t.layers.filters.define('brightness', shader, { u_amount: ['amount', 1.0] });
52
+ *
53
+ * // With a path to a fragment shader file
54
+ * await t.layers.filters.define('brightness', './brightness.frag', { u_amount: ['amount', 1.0] });
55
+ *
56
+ * // Usage:
57
+ * t.layers.base.filter('brightness', 1.5);
58
+ * t.layers.base.filter('brightness', { amount: 1.5 });
59
+ * ```
60
+ */
61
+ $register(id: FilterName, shader: GLShader | string, defs?: Record<string, [paramName: string, defaultValue: unknown]>): Promise<void>;
62
+ /**
63
+ * Unregister a filter by its ID.
64
+ *
65
+ * @param id The filter ID to unregister
66
+ * @returns true if the filter was unregistered, false if it wasn't found
67
+ */
68
+ $unregister(id: FilterName): boolean;
69
+ /**
70
+ * Get a filter strategy by ID.
71
+ * @internal
72
+ */
73
+ $get(id: FilterName): TextmodeFilterStrategy | undefined;
74
+ /**
75
+ * Dispose all resources.
76
+ * @internal
77
+ */
78
+ $dispose(): void;
79
+ /**
80
+ * Register all built-in filters.
81
+ */
82
+ private _registerBuiltInFilters;
83
+ }
@@ -1,5 +1,5 @@
1
- import type { GLRenderer, GLFramebuffer } from '../../../rendering';
2
- import type { QueuedFilter } from './types';
1
+ import type { GLRenderer, GLShader, GLFramebuffer } from '../../../rendering';
2
+ import type { QueuedFilter, FilterName } from './types';
3
3
  /**
4
4
  * Manages filter shader compilation and application for layers.
5
5
  *
@@ -17,11 +17,14 @@ export declare class LayerFilterManager {
17
17
  private _pingPongBuffers;
18
18
  private _currentBufferIndex;
19
19
  private _isInitialized;
20
+ private _filterRegistry;
20
21
  /**
21
22
  * Create a new LayerFilterManager.
22
23
  * @param renderer The WebGL renderer instance
23
24
  */
24
25
  constructor(renderer: GLRenderer);
26
+ register(id: FilterName, shader: GLShader | string, uniformDefs?: Record<string, [paramName: string, defaultValue: unknown]>): Promise<void>;
27
+ unregister(id: FilterName): boolean;
25
28
  /**
26
29
  * Initialize ping-pong buffers for filter chain processing.
27
30
  * @param width Buffer width in pixels
@@ -1,4 +1,3 @@
1
1
  export type { FilterName, BuiltInFilterName, BuiltInFilterParams, QueuedFilter, FilterContext, TextmodeFilterStrategy } from './types';
2
- export { registerFilterStrategy, unregisterFilterStrategy, isFilterRegistered, getRegisteredFilters } from './FilterRegistry';
3
- export { getFilterStrategy } from './FilterRegistry';
2
+ export { FilterRegistry } from './FilterRegistry';
4
3
  export { LayerFilterManager } from './LayerFilterManager';
@@ -2,5 +2,5 @@ export { TextmodeLayer } from './TextmodeLayer';
2
2
  export { LayerManager as TextmodeLayerManager } from './LayerManager';
3
3
  export { Layer2DCompositor as LayerCompositor } from './Layer2DCompositor';
4
4
  export type { TextmodeLayerOptions, TextmodeLayerBlendMode } from './types';
5
- export { registerFilterStrategy, unregisterFilterStrategy, isFilterRegistered, getRegisteredFilters } from './filters';
5
+ export { FilterRegistry } from './filters';
6
6
  export type { FilterName, BuiltInFilterName, BuiltInFilterParams, FilterContext, TextmodeFilterStrategy } from './filters';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "textmode.js",
3
- "version": "0.7.0-beta.1",
3
+ "version": "0.7.0-beta.2",
4
4
  "description": "textmode.js is a lightweight creative coding library for creating real-time ASCII art on the web.",
5
5
  "type": "module",
6
6
  "types": "./dist/types/index.d.ts",