import * as core from "../../core"; import { readFileSync } from "fs"; import { join } from "path"; export default class DisplacementFilter extends core.Filter { constructor(sprite, scale) { const maskMatrix = new core.Matrix(); sprite.renderable = false; super( // vertex shader readFileSync( join(__dirname, "../fragments/default-filter-matrix.vert"), "utf8" ), // fragment shader readFileSync(join(__dirname, "./displacement.frag"), "utf8") ); this.maskSprite = sprite; this.maskMatrix = maskMatrix; this.uniforms.mapSampler = sprite._texture; this.uniforms.filterMatrix = maskMatrix; this.uniforms.scale = { x: 1, y: 1 }; if (scale === null || scale === undefined) { scale = 20; } this.scale = new core.Point(scale, scale); } apply(filterManager, input, output) { this.uniforms.filterMatrix = filterManager.calculateSpriteMatrix( this.maskMatrix, this.maskSprite ); this.uniforms.scale.x = this.scale.x; this.uniforms.scale.y = this.scale.y; // draw the filter... filterManager.applyFilter(this, input, output); } get map() { return this.uniforms.mapSampler; } set map(value) { this.uniforms.mapSampler = value; } }