pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
116 lines (112 loc) • 3.91 kB
JavaScript
;
var Matrix = require('../../../maths/matrix/Matrix.js');
var Point = require('../../../maths/point/Point.js');
var GlProgram = require('../../../rendering/renderers/gl/shader/GlProgram.js');
var GpuProgram = require('../../../rendering/renderers/gpu/shader/GpuProgram.js');
var UniformGroup = require('../../../rendering/renderers/shared/shader/UniformGroup.js');
var Sprite = require('../../../scene/sprite/Sprite.js');
var deprecation = require('../../../utils/logging/deprecation.js');
var Filter = require('../../Filter.js');
var displacement$1 = require('./displacement.frag.js');
var displacement = require('./displacement.vert.js');
var displacement$2 = require('./displacement.wgsl.js');
;
class DisplacementFilter extends Filter.Filter {
constructor(...args) {
let options = args[0];
if (options instanceof Sprite.Sprite) {
if (args[1]) {
deprecation.deprecation(deprecation.v8_0_0, "DisplacementFilter now uses options object instead of params. {sprite, scale}");
}
options = { sprite: options, scale: args[1] };
}
const { sprite, scale: scaleOption, ...rest } = options;
let scale = scaleOption ?? 20;
if (typeof scale === "number") {
scale = new Point.Point(scale, scale);
}
const filterUniforms = new UniformGroup.UniformGroup({
uFilterMatrix: { value: new Matrix.Matrix(), type: "mat3x3<f32>" },
uScale: { value: scale, type: "vec2<f32>" },
uRotation: { value: new Float32Array([0, 0, 0, 0]), type: "mat2x2<f32>" }
});
const glProgram = GlProgram.GlProgram.from({
vertex: displacement.default,
fragment: displacement$1.default,
name: "displacement-filter"
});
const gpuProgram = GpuProgram.GpuProgram.from({
vertex: {
source: displacement$2.default,
entryPoint: "mainVertex"
},
fragment: {
source: displacement$2.default,
entryPoint: "mainFragment"
}
});
const textureSource = sprite.texture.source;
super({
...rest,
gpuProgram,
glProgram,
resources: {
filterUniforms,
uMapTexture: textureSource,
uMapSampler: textureSource.style
}
});
this._sprite = options.sprite;
this._sprite.renderable = false;
}
/**
* Applies the filter.
* @param filterManager - The manager.
* @param input - The input target.
* @param output - The output target.
* @param clearMode - clearMode.
* @advanced
*/
apply(filterManager, input, output, clearMode) {
const uniforms = this.resources.filterUniforms.uniforms;
filterManager.calculateSpriteMatrix(
uniforms.uFilterMatrix,
this._sprite
);
const wt = this._sprite.worldTransform;
const lenX = Math.sqrt(wt.a * wt.a + wt.b * wt.b);
const lenY = Math.sqrt(wt.c * wt.c + wt.d * wt.d);
if (lenX !== 0 && lenY !== 0) {
uniforms.uRotation[0] = wt.a / lenX;
uniforms.uRotation[1] = wt.b / lenX;
uniforms.uRotation[2] = wt.c / lenY;
uniforms.uRotation[3] = wt.d / lenY;
}
this.resources.uMapTexture = this._sprite.texture.source;
filterManager.applyFilter(this, input, output, clearMode);
}
/**
* The scale of the displacement effect.
*
* Gets the current x and y scaling values used for the displacement mapping.
* - x: Horizontal displacement scale
* - y: Vertical displacement scale
* @returns {Point} The current scale as a Point object
* @example
* ```ts
* const filter = new DisplacementFilter({ sprite });
*
* // Get current scale
* console.log(filter.scale.x, filter.scale.y);
*
* // Update scale
* filter.scale.x = 100;
* filter.scale.y = 50;
* ```
*/
get scale() {
return this.resources.filterUniforms.uniforms.uScale;
}
}
exports.DisplacementFilter = DisplacementFilter;
//# sourceMappingURL=DisplacementFilter.js.map