@combos-fun/plugin-renderer-filter 0.1.13 → 0.1.14-beta.1

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.
@@ -218,11 +218,11 @@ let FilterSystem = class FilterSystem extends pluginRenderer.Renderer {
218
218
  throw new Error('displacement Filter requires map (IMAGE resource name)');
219
219
  }
220
220
  const res = await engine.resource.getResource(mapName);
221
- const image = res?.data?.image;
222
- if (!image) {
221
+ const texture = pluginRenderer.imageResourceTexture(res);
222
+ if (!texture) {
223
223
  throw new Error(`displacement map "${mapName}" has no image data`);
224
224
  }
225
- const sprite = new pixi_js.Sprite(pixi_js.Texture.from(image));
225
+ const sprite = new pixi_js.Sprite(texture);
226
226
  return new pixi_js.DisplacementFilter({
227
227
  sprite,
228
228
  scale: effect.scale ?? 20,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-renderer-filter.cjs.js","sources":["../lib/component.ts","../lib/shaderSource.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport type FilterEffectType = 'blur' | 'colorMatrix' | 'noise' | 'displacement' | 'shader';\n\nexport type FilterUniformValue = number | boolean | number[];\n\nexport interface FilterEffectParams {\n type?: FilterEffectType | string;\n strength?: number;\n quality?: number;\n brightness?: number;\n contrast?: number;\n saturate?: number;\n hue?: number;\n grayscale?: boolean;\n noise?: number;\n seed?: number;\n map?: string;\n scale?: number;\n resource?: string;\n uniforms?: Record<string, FilterUniformValue>;\n}\n\nexport interface FilterParams {\n enabled?: boolean;\n effects?: FilterEffectParams[];\n}\n\nexport default class Filter extends Component<FilterParams> {\n static componentName: string = 'Filter';\n\n @Field({\n type: 'boolean',\n group: 'Filter',\n label: 'enabled',\n description: 'Apply effects to this GameObject.',\n editor: 'toggle',\n })\n enabled: boolean = true;\n\n effects: FilterEffectParams[] = [];\n\n init(obj?: FilterParams) {\n if (!obj) return;\n Object.assign(this, obj);\n if (obj.effects) this.effects = obj.effects;\n }\n}\n","import { resource } from '@combos-fun/engine';\n\nexport async function loadShaderSource(name: string): Promise<{ vertex: string; fragment: string }> {\n const trimmed = String(name ?? '').trim();\n if (!trimmed) {\n throw new Error('SHADER resource name is required');\n }\n const res = await resource.getResource(trimmed);\n if (!res?.name) {\n throw new Error(`Unknown resource \"${trimmed}\"; register RESOURCE_TYPE.SHADER first`);\n }\n const vertex = typeof res.data?.vertex === 'string'\n ? res.data.vertex\n : typeof res.instance?.vertex === 'string' ? res.instance.vertex : '';\n const fragment = typeof res.data?.fragment === 'string'\n ? res.data.fragment\n : typeof res.instance?.fragment === 'string' ? res.instance.fragment : '';\n if (!fragment) {\n throw new Error(`SHADER \"${trimmed}\" missing fragment`);\n }\n return { vertex, fragment };\n}\n\nexport const DEFAULT_FILTER_VERTEX = `in vec2 aPosition;\nout vec2 vTextureCoord;\n\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord(void) {\n return aPosition * (uOutputFrame.zw * uInputSize.zw);\n}\n\nvoid main(void) {\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n`;\n\nexport function pixiUniformType(value: number | boolean | number[]): string {\n if (typeof value === 'boolean' || typeof value === 'number') return 'f32';\n const n = value.length;\n if (n === 2) return 'vec2<f32>';\n if (n === 3) return 'vec3<f32>';\n if (n === 4) return 'vec4<f32>';\n if (n === 9) return 'mat3x3<f32>';\n if (n === 16) return 'mat4x4<f32>';\n return 'f32';\n}\n\nexport function pixiUniformValue(value: number | boolean | number[]): number | number[] {\n if (typeof value === 'boolean') return value ? 1 : 0;\n return value;\n}\n","import { decorators, resource, ComponentChanged, OBSERVER_TYPE, GameObject, UpdateParams } from '@combos-fun/engine';\nimport { Renderer, RendererManager, ContainerManager, RendererSystem } from '@combos-fun/plugin-renderer';\nimport {\n Filter as PixiFilter,\n BlurFilter,\n ColorMatrixFilter,\n NoiseFilter,\n DisplacementFilter,\n Sprite,\n Texture,\n} from 'pixi.js';\nimport FilterComponent from './component';\nimport type { FilterEffectParams, FilterUniformValue } from './component';\nimport {\n DEFAULT_FILTER_VERTEX,\n loadShaderSource,\n pixiUniformType,\n pixiUniformValue,\n} from './shaderSource';\n\ninterface FilterEntry {\n filters: PixiFilter[];\n shaderUniforms: Array<{ filter: PixiFilter; keys: string[] }>;\n time: number;\n}\n\n@decorators.componentObserver({\n Filter: ['enabled', { prop: ['effects'], deep: true }],\n})\nexport default class FilterSystem extends Renderer {\n static systemName = 'FilterSystem';\n name: string = 'FilterSystem';\n renderSystem: RendererSystem;\n rendererManager: RendererManager;\n containerManager: ContainerManager;\n private entries: Map<number, FilterEntry> = new Map();\n private deltaSeconds = 1 / 60;\n\n override update(e?: UpdateParams) {\n this.deltaSeconds = (e?.deltaTime ?? 16.67) / 1000;\n super.update(e);\n }\n\n init() {\n this.renderSystem = this.game.getSystem(RendererSystem) as RendererSystem;\n this.renderSystem.rendererManager.register(this);\n this.containerManager = this.renderSystem.containerManager;\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Filter') return;\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.clear(changed.gameObject.id);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE && changed.prop?.prop?.[0] === 'enabled') {\n this.applyEnabled(changed.gameObject, changed.component as FilterComponent);\n return;\n }\n this.mount(changed.gameObject, changed.component as FilterComponent);\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(FilterComponent) as FilterComponent;\n if (!component?.enabled) return;\n const entry = this.entries.get(gameObject.id);\n if (!entry?.shaderUniforms.length) return;\n entry.time += this.deltaSeconds;\n for (const { filter, keys } of entry.shaderUniforms) {\n const group = filter.resources?.combosUniforms;\n if (!group?.uniforms) continue;\n for (const key of keys) {\n if (key === 'time' || key === 'uTime') {\n group.uniforms[key] = entry.time;\n }\n }\n }\n }\n\n private applyEnabled(gameObject: GameObject, component: FilterComponent) {\n const container = this.containerManager.getContainer(gameObject.id);\n if (!container) return;\n const entry = this.entries.get(gameObject.id);\n container.filters = component.enabled && entry ? entry.filters : [];\n }\n\n private async mount(gameObject: GameObject, component: FilterComponent) {\n const asyncId = this.increaseAsyncId(gameObject.id);\n const built = await this.buildFilters(component.effects || []);\n if (!this.validateAsyncId(gameObject.id, asyncId)) {\n this.destroyFilters(built.filters);\n return;\n }\n this.clear(gameObject.id, false);\n this.entries.set(gameObject.id, { ...built, time: 0 });\n this.applyEnabled(gameObject, component);\n }\n\n private async buildFilters(effects: FilterEffectParams[]): Promise<Omit<FilterEntry, 'time'>> {\n const filters: PixiFilter[] = [];\n const shaderUniforms: FilterEntry['shaderUniforms'] = [];\n for (const effect of effects) {\n const type = effect.type || 'blur';\n if (type === 'blur') {\n filters.push(new BlurFilter({\n strength: effect.strength ?? 8,\n quality: effect.quality ?? 4,\n }));\n continue;\n }\n if (type === 'colorMatrix') {\n const matrix = new ColorMatrixFilter();\n if (effect.brightness != null) matrix.brightness(effect.brightness, false);\n if (effect.contrast != null) matrix.contrast(effect.contrast, true);\n if (effect.saturate != null) matrix.saturate(effect.saturate, true);\n if (effect.hue != null) matrix.hue(effect.hue, true);\n if (effect.grayscale) matrix.greyscale(0.33, true);\n filters.push(matrix);\n continue;\n }\n if (type === 'noise') {\n filters.push(new NoiseFilter({\n noise: effect.noise ?? 0.5,\n seed: effect.seed,\n }));\n continue;\n }\n if (type === 'displacement') {\n filters.push(await this.createDisplacement(effect));\n continue;\n }\n if (type === 'shader') {\n const { filter, keys } = await this.createShader(effect);\n filters.push(filter);\n if (keys.length) shaderUniforms.push({ filter, keys });\n continue;\n }\n throw new Error(`Unknown Filter effect type: ${type}`);\n }\n return { filters, shaderUniforms };\n }\n\n private async createDisplacement(effect: FilterEffectParams): Promise<DisplacementFilter> {\n const mapName = String(effect.map ?? '').trim();\n if (!mapName) {\n throw new Error('displacement Filter requires map (IMAGE resource name)');\n }\n const res = await resource.getResource(mapName);\n const image = res?.data?.image as HTMLImageElement | undefined;\n if (!image) {\n throw new Error(`displacement map \"${mapName}\" has no image data`);\n }\n const sprite = new Sprite(Texture.from(image));\n return new DisplacementFilter({\n sprite,\n scale: effect.scale ?? 20,\n });\n }\n\n private async createShader(effect: FilterEffectParams): Promise<{ filter: PixiFilter; keys: string[] }> {\n const source = await loadShaderSource(effect.resource || '');\n const uniforms = effect.uniforms || {};\n const keys = Object.keys(uniforms);\n const resources: Record<string, Record<string, { value: number | number[]; type: string }>> = {};\n if (keys.length) {\n const group: Record<string, { value: number | number[]; type: string }> = {};\n for (const [key, raw] of Object.entries(uniforms)) {\n group[key] = {\n value: pixiUniformValue(raw as FilterUniformValue),\n type: pixiUniformType(raw as FilterUniformValue),\n };\n }\n resources.combosUniforms = group;\n }\n const filter = PixiFilter.from({\n gl: {\n vertex: source.vertex || DEFAULT_FILTER_VERTEX,\n fragment: source.fragment,\n },\n resources,\n });\n return { filter, keys };\n }\n\n private clear(id: number, resetContainer = true) {\n const entry = this.entries.get(id);\n if (entry) {\n this.destroyFilters(entry.filters);\n this.entries.delete(id);\n }\n if (resetContainer) {\n const container = this.containerManager.getContainer(id);\n if (container) container.filters = [];\n }\n }\n\n private destroyFilters(filters: PixiFilter[]) {\n for (const filter of filters) {\n filter.destroy?.();\n }\n }\n\n onDestroy() {\n for (const id of [...this.entries.keys()]) {\n this.clear(id);\n }\n }\n}\n"],"names":["Component","__decorate","Field","resource","Renderer","RendererSystem","OBSERVER_TYPE","FilterComponent","BlurFilter","ColorMatrixFilter","NoiseFilter","Sprite","Texture","DisplacementFilter","PixiFilter","decorators"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-renderer-filter.cjs.js","sources":["../lib/component.ts","../lib/shaderSource.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport type FilterEffectType = 'blur' | 'colorMatrix' | 'noise' | 'displacement' | 'shader';\n\nexport type FilterUniformValue = number | boolean | number[];\n\nexport interface FilterEffectParams {\n type?: FilterEffectType | string;\n strength?: number;\n quality?: number;\n brightness?: number;\n contrast?: number;\n saturate?: number;\n hue?: number;\n grayscale?: boolean;\n noise?: number;\n seed?: number;\n map?: string;\n scale?: number;\n resource?: string;\n uniforms?: Record<string, FilterUniformValue>;\n}\n\nexport interface FilterParams {\n enabled?: boolean;\n effects?: FilterEffectParams[];\n}\n\nexport default class Filter extends Component<FilterParams> {\n static componentName: string = 'Filter';\n\n @Field({\n type: 'boolean',\n group: 'Filter',\n label: 'enabled',\n description: 'Apply effects to this GameObject.',\n editor: 'toggle',\n })\n enabled: boolean = true;\n\n effects: FilterEffectParams[] = [];\n\n init(obj?: FilterParams) {\n if (!obj) return;\n Object.assign(this, obj);\n if (obj.effects) this.effects = obj.effects;\n }\n}\n","import { resource } from '@combos-fun/engine';\n\nexport async function loadShaderSource(name: string): Promise<{ vertex: string; fragment: string }> {\n const trimmed = String(name ?? '').trim();\n if (!trimmed) {\n throw new Error('SHADER resource name is required');\n }\n const res = await resource.getResource(trimmed);\n if (!res?.name) {\n throw new Error(`Unknown resource \"${trimmed}\"; register RESOURCE_TYPE.SHADER first`);\n }\n const vertex = typeof res.data?.vertex === 'string'\n ? res.data.vertex\n : typeof res.instance?.vertex === 'string' ? res.instance.vertex : '';\n const fragment = typeof res.data?.fragment === 'string'\n ? res.data.fragment\n : typeof res.instance?.fragment === 'string' ? res.instance.fragment : '';\n if (!fragment) {\n throw new Error(`SHADER \"${trimmed}\" missing fragment`);\n }\n return { vertex, fragment };\n}\n\nexport const DEFAULT_FILTER_VERTEX = `in vec2 aPosition;\nout vec2 vTextureCoord;\n\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord(void) {\n return aPosition * (uOutputFrame.zw * uInputSize.zw);\n}\n\nvoid main(void) {\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n`;\n\nexport function pixiUniformType(value: number | boolean | number[]): string {\n if (typeof value === 'boolean' || typeof value === 'number') return 'f32';\n const n = value.length;\n if (n === 2) return 'vec2<f32>';\n if (n === 3) return 'vec3<f32>';\n if (n === 4) return 'vec4<f32>';\n if (n === 9) return 'mat3x3<f32>';\n if (n === 16) return 'mat4x4<f32>';\n return 'f32';\n}\n\nexport function pixiUniformValue(value: number | boolean | number[]): number | number[] {\n if (typeof value === 'boolean') return value ? 1 : 0;\n return value;\n}\n","import { decorators, resource, ComponentChanged, OBSERVER_TYPE, GameObject, UpdateParams } from '@combos-fun/engine';\nimport { Renderer, RendererManager, ContainerManager, RendererSystem, imageResourceTexture } from '@combos-fun/plugin-renderer';\nimport {\n Filter as PixiFilter,\n BlurFilter,\n ColorMatrixFilter,\n NoiseFilter,\n DisplacementFilter,\n Sprite,\n} from 'pixi.js';\nimport FilterComponent from './component';\nimport type { FilterEffectParams, FilterUniformValue } from './component';\nimport {\n DEFAULT_FILTER_VERTEX,\n loadShaderSource,\n pixiUniformType,\n pixiUniformValue,\n} from './shaderSource';\n\ninterface FilterEntry {\n filters: PixiFilter[];\n shaderUniforms: Array<{ filter: PixiFilter; keys: string[] }>;\n time: number;\n}\n\n@decorators.componentObserver({\n Filter: ['enabled', { prop: ['effects'], deep: true }],\n})\nexport default class FilterSystem extends Renderer {\n static systemName = 'FilterSystem';\n name: string = 'FilterSystem';\n renderSystem: RendererSystem;\n rendererManager: RendererManager;\n containerManager: ContainerManager;\n private entries: Map<number, FilterEntry> = new Map();\n private deltaSeconds = 1 / 60;\n\n override update(e?: UpdateParams) {\n this.deltaSeconds = (e?.deltaTime ?? 16.67) / 1000;\n super.update(e);\n }\n\n init() {\n this.renderSystem = this.game.getSystem(RendererSystem) as RendererSystem;\n this.renderSystem.rendererManager.register(this);\n this.containerManager = this.renderSystem.containerManager;\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Filter') return;\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.clear(changed.gameObject.id);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE && changed.prop?.prop?.[0] === 'enabled') {\n this.applyEnabled(changed.gameObject, changed.component as FilterComponent);\n return;\n }\n this.mount(changed.gameObject, changed.component as FilterComponent);\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(FilterComponent) as FilterComponent;\n if (!component?.enabled) return;\n const entry = this.entries.get(gameObject.id);\n if (!entry?.shaderUniforms.length) return;\n entry.time += this.deltaSeconds;\n for (const { filter, keys } of entry.shaderUniforms) {\n const group = filter.resources?.combosUniforms;\n if (!group?.uniforms) continue;\n for (const key of keys) {\n if (key === 'time' || key === 'uTime') {\n group.uniforms[key] = entry.time;\n }\n }\n }\n }\n\n private applyEnabled(gameObject: GameObject, component: FilterComponent) {\n const container = this.containerManager.getContainer(gameObject.id);\n if (!container) return;\n const entry = this.entries.get(gameObject.id);\n container.filters = component.enabled && entry ? entry.filters : [];\n }\n\n private async mount(gameObject: GameObject, component: FilterComponent) {\n const asyncId = this.increaseAsyncId(gameObject.id);\n const built = await this.buildFilters(component.effects || []);\n if (!this.validateAsyncId(gameObject.id, asyncId)) {\n this.destroyFilters(built.filters);\n return;\n }\n this.clear(gameObject.id, false);\n this.entries.set(gameObject.id, { ...built, time: 0 });\n this.applyEnabled(gameObject, component);\n }\n\n private async buildFilters(effects: FilterEffectParams[]): Promise<Omit<FilterEntry, 'time'>> {\n const filters: PixiFilter[] = [];\n const shaderUniforms: FilterEntry['shaderUniforms'] = [];\n for (const effect of effects) {\n const type = effect.type || 'blur';\n if (type === 'blur') {\n filters.push(new BlurFilter({\n strength: effect.strength ?? 8,\n quality: effect.quality ?? 4,\n }));\n continue;\n }\n if (type === 'colorMatrix') {\n const matrix = new ColorMatrixFilter();\n if (effect.brightness != null) matrix.brightness(effect.brightness, false);\n if (effect.contrast != null) matrix.contrast(effect.contrast, true);\n if (effect.saturate != null) matrix.saturate(effect.saturate, true);\n if (effect.hue != null) matrix.hue(effect.hue, true);\n if (effect.grayscale) matrix.greyscale(0.33, true);\n filters.push(matrix);\n continue;\n }\n if (type === 'noise') {\n filters.push(new NoiseFilter({\n noise: effect.noise ?? 0.5,\n seed: effect.seed,\n }));\n continue;\n }\n if (type === 'displacement') {\n filters.push(await this.createDisplacement(effect));\n continue;\n }\n if (type === 'shader') {\n const { filter, keys } = await this.createShader(effect);\n filters.push(filter);\n if (keys.length) shaderUniforms.push({ filter, keys });\n continue;\n }\n throw new Error(`Unknown Filter effect type: ${type}`);\n }\n return { filters, shaderUniforms };\n }\n\n private async createDisplacement(effect: FilterEffectParams): Promise<DisplacementFilter> {\n const mapName = String(effect.map ?? '').trim();\n if (!mapName) {\n throw new Error('displacement Filter requires map (IMAGE resource name)');\n }\n const res = await resource.getResource(mapName);\n const texture = imageResourceTexture(res);\n if (!texture) {\n throw new Error(`displacement map \"${mapName}\" has no image data`);\n }\n const sprite = new Sprite(texture);\n return new DisplacementFilter({\n sprite,\n scale: effect.scale ?? 20,\n });\n }\n\n private async createShader(effect: FilterEffectParams): Promise<{ filter: PixiFilter; keys: string[] }> {\n const source = await loadShaderSource(effect.resource || '');\n const uniforms = effect.uniforms || {};\n const keys = Object.keys(uniforms);\n const resources: Record<string, Record<string, { value: number | number[]; type: string }>> = {};\n if (keys.length) {\n const group: Record<string, { value: number | number[]; type: string }> = {};\n for (const [key, raw] of Object.entries(uniforms)) {\n group[key] = {\n value: pixiUniformValue(raw as FilterUniformValue),\n type: pixiUniformType(raw as FilterUniformValue),\n };\n }\n resources.combosUniforms = group;\n }\n const filter = PixiFilter.from({\n gl: {\n vertex: source.vertex || DEFAULT_FILTER_VERTEX,\n fragment: source.fragment,\n },\n resources,\n });\n return { filter, keys };\n }\n\n private clear(id: number, resetContainer = true) {\n const entry = this.entries.get(id);\n if (entry) {\n this.destroyFilters(entry.filters);\n this.entries.delete(id);\n }\n if (resetContainer) {\n const container = this.containerManager.getContainer(id);\n if (container) container.filters = [];\n }\n }\n\n private destroyFilters(filters: PixiFilter[]) {\n for (const filter of filters) {\n filter.destroy?.();\n }\n }\n\n onDestroy() {\n for (const id of [...this.entries.keys()]) {\n this.clear(id);\n }\n }\n}\n"],"names":["Component","__decorate","Field","resource","Renderer","RendererSystem","OBSERVER_TYPE","FilterComponent","BlurFilter","ColorMatrixFilter","NoiseFilter","imageResourceTexture","Sprite","DisplacementFilter","PixiFilter","decorators"],"mappings":"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"}
@@ -1 +1 @@
1
- "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),r=require("@combos-fun/inspector-decorator"),n=require("@combos-fun/plugin-renderer"),s=require("pixi.js");class i extends t.Component{constructor(){super(...arguments),this.enabled=!0,this.effects=[]}static{this.componentName="Filter"}init(e){e&&(Object.assign(this,e),e.effects&&(this.effects=e.effects))}}e.__decorate([r.Field({type:"boolean",group:"Filter",label:"enabled",description:"Apply effects to this GameObject.",editor:"toggle"})],i.prototype,"enabled",void 0);function o(e){if("boolean"==typeof e||"number"==typeof e)return"f32";const t=e.length;return 2===t?"vec2<f32>":3===t?"vec3<f32>":4===t?"vec4<f32>":9===t?"mat3x3<f32>":16===t?"mat4x4<f32>":"f32"}function a(e){return"boolean"==typeof e?e?1:0:e}let c=class extends n.Renderer{constructor(){super(...arguments),this.name="FilterSystem",this.entries=new Map,this.deltaSeconds=1/60}static{this.systemName="FilterSystem"}update(e){this.deltaSeconds=(e?.deltaTime??16.67)/1e3,super.update(e)}init(){this.renderSystem=this.game.getSystem(n.RendererSystem),this.renderSystem.rendererManager.register(this),this.containerManager=this.renderSystem.containerManager}componentChanged(e){"Filter"===e.componentName&&(e.type!==t.OBSERVER_TYPE.REMOVE?e.type!==t.OBSERVER_TYPE.CHANGE||"enabled"!==e.prop?.prop?.[0]?this.mount(e.gameObject,e.component):this.applyEnabled(e.gameObject,e.component):this.clear(e.gameObject.id))}rendererUpdate(e){const t=e.getComponent(i);if(!t?.enabled)return;const r=this.entries.get(e.id);if(r?.shaderUniforms.length){r.time+=this.deltaSeconds;for(const{filter:e,keys:t}of r.shaderUniforms){const n=e.resources?.combosUniforms;if(n?.uniforms)for(const e of t)"time"!==e&&"uTime"!==e||(n.uniforms[e]=r.time)}}}applyEnabled(e,t){const r=this.containerManager.getContainer(e.id);if(!r)return;const n=this.entries.get(e.id);r.filters=t.enabled&&n?n.filters:[]}async mount(e,t){const r=this.increaseAsyncId(e.id),n=await this.buildFilters(t.effects||[]);this.validateAsyncId(e.id,r)?(this.clear(e.id,!1),this.entries.set(e.id,{...n,time:0}),this.applyEnabled(e,t)):this.destroyFilters(n.filters)}async buildFilters(e){const t=[],r=[];for(const n of e){const e=n.type||"blur";if("blur"!==e){if("colorMatrix"===e){const e=new s.ColorMatrixFilter;null!=n.brightness&&e.brightness(n.brightness,!1),null!=n.contrast&&e.contrast(n.contrast,!0),null!=n.saturate&&e.saturate(n.saturate,!0),null!=n.hue&&e.hue(n.hue,!0),n.grayscale&&e.greyscale(.33,!0),t.push(e);continue}if("noise"!==e){if("displacement"!==e){if("shader"===e){const{filter:e,keys:s}=await this.createShader(n);t.push(e),s.length&&r.push({filter:e,keys:s});continue}throw new Error(`Unknown Filter effect type: ${e}`)}t.push(await this.createDisplacement(n))}else t.push(new s.NoiseFilter({noise:n.noise??.5,seed:n.seed}))}else t.push(new s.BlurFilter({strength:n.strength??8,quality:n.quality??4}))}return{filters:t,shaderUniforms:r}}async createDisplacement(e){const r=String(e.map??"").trim();if(!r)throw new Error("displacement Filter requires map (IMAGE resource name)");const n=await t.resource.getResource(r),i=n?.data?.image;if(!i)throw new Error(`displacement map "${r}" has no image data`);const o=new s.Sprite(s.Texture.from(i));return new s.DisplacementFilter({sprite:o,scale:e.scale??20})}async createShader(e){const r=await async function(e){const r=String(e??"").trim();if(!r)throw new Error("SHADER resource name is required");const n=await t.resource.getResource(r);if(!n?.name)throw new Error(`Unknown resource "${r}"; register RESOURCE_TYPE.SHADER first`);const s="string"==typeof n.data?.vertex?n.data.vertex:"string"==typeof n.instance?.vertex?n.instance.vertex:"",i="string"==typeof n.data?.fragment?n.data.fragment:"string"==typeof n.instance?.fragment?n.instance.fragment:"";if(!i)throw new Error(`SHADER "${r}" missing fragment`);return{vertex:s,fragment:i}}(e.resource||""),n=e.uniforms||{},i=Object.keys(n),c={};if(i.length){const e={};for(const[t,r]of Object.entries(n))e[t]={value:a(r),type:o(r)};c.combosUniforms=e}return{filter:s.Filter.from({gl:{vertex:r.vertex||"in vec2 aPosition;\nout vec2 vTextureCoord;\n\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord(void) {\n return aPosition * (uOutputFrame.zw * uInputSize.zw);\n}\n\nvoid main(void) {\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n",fragment:r.fragment},resources:c}),keys:i}}clear(e,t=!0){const r=this.entries.get(e);if(r&&(this.destroyFilters(r.filters),this.entries.delete(e)),t){const t=this.containerManager.getContainer(e);t&&(t.filters=[])}}destroyFilters(e){for(const t of e)t.destroy?.()}onDestroy(){for(const e of[...this.entries.keys()])this.clear(e)}};c=e.__decorate([t.decorators.componentObserver({Filter:["enabled",{prop:["effects"],deep:!0}]})],c);var u=c;exports.Filter=i,exports.FilterSystem=u;
1
+ "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),r=require("@combos-fun/inspector-decorator"),n=require("@combos-fun/plugin-renderer"),s=require("pixi.js");class i extends t.Component{constructor(){super(...arguments),this.enabled=!0,this.effects=[]}static{this.componentName="Filter"}init(e){e&&(Object.assign(this,e),e.effects&&(this.effects=e.effects))}}e.__decorate([r.Field({type:"boolean",group:"Filter",label:"enabled",description:"Apply effects to this GameObject.",editor:"toggle"})],i.prototype,"enabled",void 0);function o(e){if("boolean"==typeof e||"number"==typeof e)return"f32";const t=e.length;return 2===t?"vec2<f32>":3===t?"vec3<f32>":4===t?"vec4<f32>":9===t?"mat3x3<f32>":16===t?"mat4x4<f32>":"f32"}function a(e){return"boolean"==typeof e?e?1:0:e}let c=class extends n.Renderer{constructor(){super(...arguments),this.name="FilterSystem",this.entries=new Map,this.deltaSeconds=1/60}static{this.systemName="FilterSystem"}update(e){this.deltaSeconds=(e?.deltaTime??16.67)/1e3,super.update(e)}init(){this.renderSystem=this.game.getSystem(n.RendererSystem),this.renderSystem.rendererManager.register(this),this.containerManager=this.renderSystem.containerManager}componentChanged(e){"Filter"===e.componentName&&(e.type!==t.OBSERVER_TYPE.REMOVE?e.type!==t.OBSERVER_TYPE.CHANGE||"enabled"!==e.prop?.prop?.[0]?this.mount(e.gameObject,e.component):this.applyEnabled(e.gameObject,e.component):this.clear(e.gameObject.id))}rendererUpdate(e){const t=e.getComponent(i);if(!t?.enabled)return;const r=this.entries.get(e.id);if(r?.shaderUniforms.length){r.time+=this.deltaSeconds;for(const{filter:e,keys:t}of r.shaderUniforms){const n=e.resources?.combosUniforms;if(n?.uniforms)for(const e of t)"time"!==e&&"uTime"!==e||(n.uniforms[e]=r.time)}}}applyEnabled(e,t){const r=this.containerManager.getContainer(e.id);if(!r)return;const n=this.entries.get(e.id);r.filters=t.enabled&&n?n.filters:[]}async mount(e,t){const r=this.increaseAsyncId(e.id),n=await this.buildFilters(t.effects||[]);this.validateAsyncId(e.id,r)?(this.clear(e.id,!1),this.entries.set(e.id,{...n,time:0}),this.applyEnabled(e,t)):this.destroyFilters(n.filters)}async buildFilters(e){const t=[],r=[];for(const n of e){const e=n.type||"blur";if("blur"!==e){if("colorMatrix"===e){const e=new s.ColorMatrixFilter;null!=n.brightness&&e.brightness(n.brightness,!1),null!=n.contrast&&e.contrast(n.contrast,!0),null!=n.saturate&&e.saturate(n.saturate,!0),null!=n.hue&&e.hue(n.hue,!0),n.grayscale&&e.greyscale(.33,!0),t.push(e);continue}if("noise"!==e){if("displacement"!==e){if("shader"===e){const{filter:e,keys:s}=await this.createShader(n);t.push(e),s.length&&r.push({filter:e,keys:s});continue}throw new Error(`Unknown Filter effect type: ${e}`)}t.push(await this.createDisplacement(n))}else t.push(new s.NoiseFilter({noise:n.noise??.5,seed:n.seed}))}else t.push(new s.BlurFilter({strength:n.strength??8,quality:n.quality??4}))}return{filters:t,shaderUniforms:r}}async createDisplacement(e){const r=String(e.map??"").trim();if(!r)throw new Error("displacement Filter requires map (IMAGE resource name)");const i=await t.resource.getResource(r),o=n.imageResourceTexture(i);if(!o)throw new Error(`displacement map "${r}" has no image data`);const a=new s.Sprite(o);return new s.DisplacementFilter({sprite:a,scale:e.scale??20})}async createShader(e){const r=await async function(e){const r=String(e??"").trim();if(!r)throw new Error("SHADER resource name is required");const n=await t.resource.getResource(r);if(!n?.name)throw new Error(`Unknown resource "${r}"; register RESOURCE_TYPE.SHADER first`);const s="string"==typeof n.data?.vertex?n.data.vertex:"string"==typeof n.instance?.vertex?n.instance.vertex:"",i="string"==typeof n.data?.fragment?n.data.fragment:"string"==typeof n.instance?.fragment?n.instance.fragment:"";if(!i)throw new Error(`SHADER "${r}" missing fragment`);return{vertex:s,fragment:i}}(e.resource||""),n=e.uniforms||{},i=Object.keys(n),c={};if(i.length){const e={};for(const[t,r]of Object.entries(n))e[t]={value:a(r),type:o(r)};c.combosUniforms=e}return{filter:s.Filter.from({gl:{vertex:r.vertex||"in vec2 aPosition;\nout vec2 vTextureCoord;\n\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord(void) {\n return aPosition * (uOutputFrame.zw * uInputSize.zw);\n}\n\nvoid main(void) {\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n",fragment:r.fragment},resources:c}),keys:i}}clear(e,t=!0){const r=this.entries.get(e);if(r&&(this.destroyFilters(r.filters),this.entries.delete(e)),t){const t=this.containerManager.getContainer(e);t&&(t.filters=[])}}destroyFilters(e){for(const t of e)t.destroy?.()}onDestroy(){for(const e of[...this.entries.keys()])this.clear(e)}};c=e.__decorate([t.decorators.componentObserver({Filter:["enabled",{prop:["effects"],deep:!0}]})],c);var u=c;exports.Filter=i,exports.FilterSystem=u;
@@ -1,8 +1,8 @@
1
1
  import { __decorate } from 'tslib';
2
2
  import { Component, resource, OBSERVER_TYPE, decorators } from '@combos-fun/engine';
3
3
  import { Field } from '@combos-fun/inspector-decorator';
4
- import { Renderer, RendererSystem } from '@combos-fun/plugin-renderer';
5
- import { BlurFilter, ColorMatrixFilter, NoiseFilter, Sprite, Texture, DisplacementFilter, Filter as Filter$1 } from 'pixi.js';
4
+ import { Renderer, RendererSystem, imageResourceTexture } from '@combos-fun/plugin-renderer';
5
+ import { BlurFilter, ColorMatrixFilter, NoiseFilter, Sprite, DisplacementFilter, Filter as Filter$1 } from 'pixi.js';
6
6
 
7
7
  class Filter extends Component {
8
8
  constructor() {
@@ -216,11 +216,11 @@ let FilterSystem = class FilterSystem extends Renderer {
216
216
  throw new Error('displacement Filter requires map (IMAGE resource name)');
217
217
  }
218
218
  const res = await resource.getResource(mapName);
219
- const image = res?.data?.image;
220
- if (!image) {
219
+ const texture = imageResourceTexture(res);
220
+ if (!texture) {
221
221
  throw new Error(`displacement map "${mapName}" has no image data`);
222
222
  }
223
- const sprite = new Sprite(Texture.from(image));
223
+ const sprite = new Sprite(texture);
224
224
  return new DisplacementFilter({
225
225
  sprite,
226
226
  scale: effect.scale ?? 20,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-renderer-filter.esm.js","sources":["../lib/component.ts","../lib/shaderSource.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport type FilterEffectType = 'blur' | 'colorMatrix' | 'noise' | 'displacement' | 'shader';\n\nexport type FilterUniformValue = number | boolean | number[];\n\nexport interface FilterEffectParams {\n type?: FilterEffectType | string;\n strength?: number;\n quality?: number;\n brightness?: number;\n contrast?: number;\n saturate?: number;\n hue?: number;\n grayscale?: boolean;\n noise?: number;\n seed?: number;\n map?: string;\n scale?: number;\n resource?: string;\n uniforms?: Record<string, FilterUniformValue>;\n}\n\nexport interface FilterParams {\n enabled?: boolean;\n effects?: FilterEffectParams[];\n}\n\nexport default class Filter extends Component<FilterParams> {\n static componentName: string = 'Filter';\n\n @Field({\n type: 'boolean',\n group: 'Filter',\n label: 'enabled',\n description: 'Apply effects to this GameObject.',\n editor: 'toggle',\n })\n enabled: boolean = true;\n\n effects: FilterEffectParams[] = [];\n\n init(obj?: FilterParams) {\n if (!obj) return;\n Object.assign(this, obj);\n if (obj.effects) this.effects = obj.effects;\n }\n}\n","import { resource } from '@combos-fun/engine';\n\nexport async function loadShaderSource(name: string): Promise<{ vertex: string; fragment: string }> {\n const trimmed = String(name ?? '').trim();\n if (!trimmed) {\n throw new Error('SHADER resource name is required');\n }\n const res = await resource.getResource(trimmed);\n if (!res?.name) {\n throw new Error(`Unknown resource \"${trimmed}\"; register RESOURCE_TYPE.SHADER first`);\n }\n const vertex = typeof res.data?.vertex === 'string'\n ? res.data.vertex\n : typeof res.instance?.vertex === 'string' ? res.instance.vertex : '';\n const fragment = typeof res.data?.fragment === 'string'\n ? res.data.fragment\n : typeof res.instance?.fragment === 'string' ? res.instance.fragment : '';\n if (!fragment) {\n throw new Error(`SHADER \"${trimmed}\" missing fragment`);\n }\n return { vertex, fragment };\n}\n\nexport const DEFAULT_FILTER_VERTEX = `in vec2 aPosition;\nout vec2 vTextureCoord;\n\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord(void) {\n return aPosition * (uOutputFrame.zw * uInputSize.zw);\n}\n\nvoid main(void) {\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n`;\n\nexport function pixiUniformType(value: number | boolean | number[]): string {\n if (typeof value === 'boolean' || typeof value === 'number') return 'f32';\n const n = value.length;\n if (n === 2) return 'vec2<f32>';\n if (n === 3) return 'vec3<f32>';\n if (n === 4) return 'vec4<f32>';\n if (n === 9) return 'mat3x3<f32>';\n if (n === 16) return 'mat4x4<f32>';\n return 'f32';\n}\n\nexport function pixiUniformValue(value: number | boolean | number[]): number | number[] {\n if (typeof value === 'boolean') return value ? 1 : 0;\n return value;\n}\n","import { decorators, resource, ComponentChanged, OBSERVER_TYPE, GameObject, UpdateParams } from '@combos-fun/engine';\nimport { Renderer, RendererManager, ContainerManager, RendererSystem } from '@combos-fun/plugin-renderer';\nimport {\n Filter as PixiFilter,\n BlurFilter,\n ColorMatrixFilter,\n NoiseFilter,\n DisplacementFilter,\n Sprite,\n Texture,\n} from 'pixi.js';\nimport FilterComponent from './component';\nimport type { FilterEffectParams, FilterUniformValue } from './component';\nimport {\n DEFAULT_FILTER_VERTEX,\n loadShaderSource,\n pixiUniformType,\n pixiUniformValue,\n} from './shaderSource';\n\ninterface FilterEntry {\n filters: PixiFilter[];\n shaderUniforms: Array<{ filter: PixiFilter; keys: string[] }>;\n time: number;\n}\n\n@decorators.componentObserver({\n Filter: ['enabled', { prop: ['effects'], deep: true }],\n})\nexport default class FilterSystem extends Renderer {\n static systemName = 'FilterSystem';\n name: string = 'FilterSystem';\n renderSystem: RendererSystem;\n rendererManager: RendererManager;\n containerManager: ContainerManager;\n private entries: Map<number, FilterEntry> = new Map();\n private deltaSeconds = 1 / 60;\n\n override update(e?: UpdateParams) {\n this.deltaSeconds = (e?.deltaTime ?? 16.67) / 1000;\n super.update(e);\n }\n\n init() {\n this.renderSystem = this.game.getSystem(RendererSystem) as RendererSystem;\n this.renderSystem.rendererManager.register(this);\n this.containerManager = this.renderSystem.containerManager;\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Filter') return;\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.clear(changed.gameObject.id);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE && changed.prop?.prop?.[0] === 'enabled') {\n this.applyEnabled(changed.gameObject, changed.component as FilterComponent);\n return;\n }\n this.mount(changed.gameObject, changed.component as FilterComponent);\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(FilterComponent) as FilterComponent;\n if (!component?.enabled) return;\n const entry = this.entries.get(gameObject.id);\n if (!entry?.shaderUniforms.length) return;\n entry.time += this.deltaSeconds;\n for (const { filter, keys } of entry.shaderUniforms) {\n const group = filter.resources?.combosUniforms;\n if (!group?.uniforms) continue;\n for (const key of keys) {\n if (key === 'time' || key === 'uTime') {\n group.uniforms[key] = entry.time;\n }\n }\n }\n }\n\n private applyEnabled(gameObject: GameObject, component: FilterComponent) {\n const container = this.containerManager.getContainer(gameObject.id);\n if (!container) return;\n const entry = this.entries.get(gameObject.id);\n container.filters = component.enabled && entry ? entry.filters : [];\n }\n\n private async mount(gameObject: GameObject, component: FilterComponent) {\n const asyncId = this.increaseAsyncId(gameObject.id);\n const built = await this.buildFilters(component.effects || []);\n if (!this.validateAsyncId(gameObject.id, asyncId)) {\n this.destroyFilters(built.filters);\n return;\n }\n this.clear(gameObject.id, false);\n this.entries.set(gameObject.id, { ...built, time: 0 });\n this.applyEnabled(gameObject, component);\n }\n\n private async buildFilters(effects: FilterEffectParams[]): Promise<Omit<FilterEntry, 'time'>> {\n const filters: PixiFilter[] = [];\n const shaderUniforms: FilterEntry['shaderUniforms'] = [];\n for (const effect of effects) {\n const type = effect.type || 'blur';\n if (type === 'blur') {\n filters.push(new BlurFilter({\n strength: effect.strength ?? 8,\n quality: effect.quality ?? 4,\n }));\n continue;\n }\n if (type === 'colorMatrix') {\n const matrix = new ColorMatrixFilter();\n if (effect.brightness != null) matrix.brightness(effect.brightness, false);\n if (effect.contrast != null) matrix.contrast(effect.contrast, true);\n if (effect.saturate != null) matrix.saturate(effect.saturate, true);\n if (effect.hue != null) matrix.hue(effect.hue, true);\n if (effect.grayscale) matrix.greyscale(0.33, true);\n filters.push(matrix);\n continue;\n }\n if (type === 'noise') {\n filters.push(new NoiseFilter({\n noise: effect.noise ?? 0.5,\n seed: effect.seed,\n }));\n continue;\n }\n if (type === 'displacement') {\n filters.push(await this.createDisplacement(effect));\n continue;\n }\n if (type === 'shader') {\n const { filter, keys } = await this.createShader(effect);\n filters.push(filter);\n if (keys.length) shaderUniforms.push({ filter, keys });\n continue;\n }\n throw new Error(`Unknown Filter effect type: ${type}`);\n }\n return { filters, shaderUniforms };\n }\n\n private async createDisplacement(effect: FilterEffectParams): Promise<DisplacementFilter> {\n const mapName = String(effect.map ?? '').trim();\n if (!mapName) {\n throw new Error('displacement Filter requires map (IMAGE resource name)');\n }\n const res = await resource.getResource(mapName);\n const image = res?.data?.image as HTMLImageElement | undefined;\n if (!image) {\n throw new Error(`displacement map \"${mapName}\" has no image data`);\n }\n const sprite = new Sprite(Texture.from(image));\n return new DisplacementFilter({\n sprite,\n scale: effect.scale ?? 20,\n });\n }\n\n private async createShader(effect: FilterEffectParams): Promise<{ filter: PixiFilter; keys: string[] }> {\n const source = await loadShaderSource(effect.resource || '');\n const uniforms = effect.uniforms || {};\n const keys = Object.keys(uniforms);\n const resources: Record<string, Record<string, { value: number | number[]; type: string }>> = {};\n if (keys.length) {\n const group: Record<string, { value: number | number[]; type: string }> = {};\n for (const [key, raw] of Object.entries(uniforms)) {\n group[key] = {\n value: pixiUniformValue(raw as FilterUniformValue),\n type: pixiUniformType(raw as FilterUniformValue),\n };\n }\n resources.combosUniforms = group;\n }\n const filter = PixiFilter.from({\n gl: {\n vertex: source.vertex || DEFAULT_FILTER_VERTEX,\n fragment: source.fragment,\n },\n resources,\n });\n return { filter, keys };\n }\n\n private clear(id: number, resetContainer = true) {\n const entry = this.entries.get(id);\n if (entry) {\n this.destroyFilters(entry.filters);\n this.entries.delete(id);\n }\n if (resetContainer) {\n const container = this.containerManager.getContainer(id);\n if (container) container.filters = [];\n }\n }\n\n private destroyFilters(filters: PixiFilter[]) {\n for (const filter of filters) {\n filter.destroy?.();\n }\n }\n\n onDestroy() {\n for (const id of [...this.entries.keys()]) {\n this.clear(id);\n }\n }\n}\n"],"names":["FilterComponent","PixiFilter"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-renderer-filter.esm.js","sources":["../lib/component.ts","../lib/shaderSource.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport type FilterEffectType = 'blur' | 'colorMatrix' | 'noise' | 'displacement' | 'shader';\n\nexport type FilterUniformValue = number | boolean | number[];\n\nexport interface FilterEffectParams {\n type?: FilterEffectType | string;\n strength?: number;\n quality?: number;\n brightness?: number;\n contrast?: number;\n saturate?: number;\n hue?: number;\n grayscale?: boolean;\n noise?: number;\n seed?: number;\n map?: string;\n scale?: number;\n resource?: string;\n uniforms?: Record<string, FilterUniformValue>;\n}\n\nexport interface FilterParams {\n enabled?: boolean;\n effects?: FilterEffectParams[];\n}\n\nexport default class Filter extends Component<FilterParams> {\n static componentName: string = 'Filter';\n\n @Field({\n type: 'boolean',\n group: 'Filter',\n label: 'enabled',\n description: 'Apply effects to this GameObject.',\n editor: 'toggle',\n })\n enabled: boolean = true;\n\n effects: FilterEffectParams[] = [];\n\n init(obj?: FilterParams) {\n if (!obj) return;\n Object.assign(this, obj);\n if (obj.effects) this.effects = obj.effects;\n }\n}\n","import { resource } from '@combos-fun/engine';\n\nexport async function loadShaderSource(name: string): Promise<{ vertex: string; fragment: string }> {\n const trimmed = String(name ?? '').trim();\n if (!trimmed) {\n throw new Error('SHADER resource name is required');\n }\n const res = await resource.getResource(trimmed);\n if (!res?.name) {\n throw new Error(`Unknown resource \"${trimmed}\"; register RESOURCE_TYPE.SHADER first`);\n }\n const vertex = typeof res.data?.vertex === 'string'\n ? res.data.vertex\n : typeof res.instance?.vertex === 'string' ? res.instance.vertex : '';\n const fragment = typeof res.data?.fragment === 'string'\n ? res.data.fragment\n : typeof res.instance?.fragment === 'string' ? res.instance.fragment : '';\n if (!fragment) {\n throw new Error(`SHADER \"${trimmed}\" missing fragment`);\n }\n return { vertex, fragment };\n}\n\nexport const DEFAULT_FILTER_VERTEX = `in vec2 aPosition;\nout vec2 vTextureCoord;\n\nuniform vec4 uInputSize;\nuniform vec4 uOutputFrame;\nuniform vec4 uOutputTexture;\n\nvec4 filterVertexPosition(void) {\n vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;\n position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;\n position.y = position.y * (2.0 * uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;\n return vec4(position, 0.0, 1.0);\n}\n\nvec2 filterTextureCoord(void) {\n return aPosition * (uOutputFrame.zw * uInputSize.zw);\n}\n\nvoid main(void) {\n gl_Position = filterVertexPosition();\n vTextureCoord = filterTextureCoord();\n}\n`;\n\nexport function pixiUniformType(value: number | boolean | number[]): string {\n if (typeof value === 'boolean' || typeof value === 'number') return 'f32';\n const n = value.length;\n if (n === 2) return 'vec2<f32>';\n if (n === 3) return 'vec3<f32>';\n if (n === 4) return 'vec4<f32>';\n if (n === 9) return 'mat3x3<f32>';\n if (n === 16) return 'mat4x4<f32>';\n return 'f32';\n}\n\nexport function pixiUniformValue(value: number | boolean | number[]): number | number[] {\n if (typeof value === 'boolean') return value ? 1 : 0;\n return value;\n}\n","import { decorators, resource, ComponentChanged, OBSERVER_TYPE, GameObject, UpdateParams } from '@combos-fun/engine';\nimport { Renderer, RendererManager, ContainerManager, RendererSystem, imageResourceTexture } from '@combos-fun/plugin-renderer';\nimport {\n Filter as PixiFilter,\n BlurFilter,\n ColorMatrixFilter,\n NoiseFilter,\n DisplacementFilter,\n Sprite,\n} from 'pixi.js';\nimport FilterComponent from './component';\nimport type { FilterEffectParams, FilterUniformValue } from './component';\nimport {\n DEFAULT_FILTER_VERTEX,\n loadShaderSource,\n pixiUniformType,\n pixiUniformValue,\n} from './shaderSource';\n\ninterface FilterEntry {\n filters: PixiFilter[];\n shaderUniforms: Array<{ filter: PixiFilter; keys: string[] }>;\n time: number;\n}\n\n@decorators.componentObserver({\n Filter: ['enabled', { prop: ['effects'], deep: true }],\n})\nexport default class FilterSystem extends Renderer {\n static systemName = 'FilterSystem';\n name: string = 'FilterSystem';\n renderSystem: RendererSystem;\n rendererManager: RendererManager;\n containerManager: ContainerManager;\n private entries: Map<number, FilterEntry> = new Map();\n private deltaSeconds = 1 / 60;\n\n override update(e?: UpdateParams) {\n this.deltaSeconds = (e?.deltaTime ?? 16.67) / 1000;\n super.update(e);\n }\n\n init() {\n this.renderSystem = this.game.getSystem(RendererSystem) as RendererSystem;\n this.renderSystem.rendererManager.register(this);\n this.containerManager = this.renderSystem.containerManager;\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Filter') return;\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.clear(changed.gameObject.id);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE && changed.prop?.prop?.[0] === 'enabled') {\n this.applyEnabled(changed.gameObject, changed.component as FilterComponent);\n return;\n }\n this.mount(changed.gameObject, changed.component as FilterComponent);\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(FilterComponent) as FilterComponent;\n if (!component?.enabled) return;\n const entry = this.entries.get(gameObject.id);\n if (!entry?.shaderUniforms.length) return;\n entry.time += this.deltaSeconds;\n for (const { filter, keys } of entry.shaderUniforms) {\n const group = filter.resources?.combosUniforms;\n if (!group?.uniforms) continue;\n for (const key of keys) {\n if (key === 'time' || key === 'uTime') {\n group.uniforms[key] = entry.time;\n }\n }\n }\n }\n\n private applyEnabled(gameObject: GameObject, component: FilterComponent) {\n const container = this.containerManager.getContainer(gameObject.id);\n if (!container) return;\n const entry = this.entries.get(gameObject.id);\n container.filters = component.enabled && entry ? entry.filters : [];\n }\n\n private async mount(gameObject: GameObject, component: FilterComponent) {\n const asyncId = this.increaseAsyncId(gameObject.id);\n const built = await this.buildFilters(component.effects || []);\n if (!this.validateAsyncId(gameObject.id, asyncId)) {\n this.destroyFilters(built.filters);\n return;\n }\n this.clear(gameObject.id, false);\n this.entries.set(gameObject.id, { ...built, time: 0 });\n this.applyEnabled(gameObject, component);\n }\n\n private async buildFilters(effects: FilterEffectParams[]): Promise<Omit<FilterEntry, 'time'>> {\n const filters: PixiFilter[] = [];\n const shaderUniforms: FilterEntry['shaderUniforms'] = [];\n for (const effect of effects) {\n const type = effect.type || 'blur';\n if (type === 'blur') {\n filters.push(new BlurFilter({\n strength: effect.strength ?? 8,\n quality: effect.quality ?? 4,\n }));\n continue;\n }\n if (type === 'colorMatrix') {\n const matrix = new ColorMatrixFilter();\n if (effect.brightness != null) matrix.brightness(effect.brightness, false);\n if (effect.contrast != null) matrix.contrast(effect.contrast, true);\n if (effect.saturate != null) matrix.saturate(effect.saturate, true);\n if (effect.hue != null) matrix.hue(effect.hue, true);\n if (effect.grayscale) matrix.greyscale(0.33, true);\n filters.push(matrix);\n continue;\n }\n if (type === 'noise') {\n filters.push(new NoiseFilter({\n noise: effect.noise ?? 0.5,\n seed: effect.seed,\n }));\n continue;\n }\n if (type === 'displacement') {\n filters.push(await this.createDisplacement(effect));\n continue;\n }\n if (type === 'shader') {\n const { filter, keys } = await this.createShader(effect);\n filters.push(filter);\n if (keys.length) shaderUniforms.push({ filter, keys });\n continue;\n }\n throw new Error(`Unknown Filter effect type: ${type}`);\n }\n return { filters, shaderUniforms };\n }\n\n private async createDisplacement(effect: FilterEffectParams): Promise<DisplacementFilter> {\n const mapName = String(effect.map ?? '').trim();\n if (!mapName) {\n throw new Error('displacement Filter requires map (IMAGE resource name)');\n }\n const res = await resource.getResource(mapName);\n const texture = imageResourceTexture(res);\n if (!texture) {\n throw new Error(`displacement map \"${mapName}\" has no image data`);\n }\n const sprite = new Sprite(texture);\n return new DisplacementFilter({\n sprite,\n scale: effect.scale ?? 20,\n });\n }\n\n private async createShader(effect: FilterEffectParams): Promise<{ filter: PixiFilter; keys: string[] }> {\n const source = await loadShaderSource(effect.resource || '');\n const uniforms = effect.uniforms || {};\n const keys = Object.keys(uniforms);\n const resources: Record<string, Record<string, { value: number | number[]; type: string }>> = {};\n if (keys.length) {\n const group: Record<string, { value: number | number[]; type: string }> = {};\n for (const [key, raw] of Object.entries(uniforms)) {\n group[key] = {\n value: pixiUniformValue(raw as FilterUniformValue),\n type: pixiUniformType(raw as FilterUniformValue),\n };\n }\n resources.combosUniforms = group;\n }\n const filter = PixiFilter.from({\n gl: {\n vertex: source.vertex || DEFAULT_FILTER_VERTEX,\n fragment: source.fragment,\n },\n resources,\n });\n return { filter, keys };\n }\n\n private clear(id: number, resetContainer = true) {\n const entry = this.entries.get(id);\n if (entry) {\n this.destroyFilters(entry.filters);\n this.entries.delete(id);\n }\n if (resetContainer) {\n const container = this.containerManager.getContainer(id);\n if (container) container.filters = [];\n }\n }\n\n private destroyFilters(filters: PixiFilter[]) {\n for (const filter of filters) {\n filter.destroy?.();\n }\n }\n\n onDestroy() {\n for (const id of [...this.entries.keys()]) {\n this.clear(id);\n }\n }\n}\n"],"names":["FilterComponent","PixiFilter"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@combos-fun/plugin-renderer-filter",
3
- "version": "0.1.13",
3
+ "version": "0.1.14-beta.1",
4
4
  "description": "Pixi filters and custom 2D shaders",
5
5
  "main": "index.js",
6
6
  "module": "dist/plugin-renderer-filter.esm.js",
@@ -36,9 +36,9 @@
36
36
  "author": "sun668 <q947692259@gmail.com>",
37
37
  "dependencies": {
38
38
  "pixi.js": "^8.18.1",
39
- "@combos-fun/inspector-decorator": "0.1.13",
40
- "@combos-fun/engine": "0.1.13",
41
- "@combos-fun/plugin-renderer": "0.1.13"
39
+ "@combos-fun/engine": "0.1.14-beta.1",
40
+ "@combos-fun/inspector-decorator": "0.1.14-beta.1",
41
+ "@combos-fun/plugin-renderer": "0.1.14-beta.1"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "node ../../scripts/build-package.mjs"