UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

73 lines 6.5 kB
import { tgdCalcDegToRad } from "./../math/index.js"; import { TgdVec2 } from "../math/index.js"; import { TgdFilter } from "./filter.js"; const DEFAULT_DIRECTION = new TgdVec2(1, 0); export class TgdFilterBlur extends TgdFilter { static createPair(options = {}) { const direction = options.direction ?? 0; const name = options.name ?? "TgdFilterBlur/Pair/"; return [ new TgdFilterBlur({ ...options, direction, name: `${name}/${direction}°`, }), new TgdFilterBlur({ ...options, direction: direction + 90, name: `${name}/${direction}°`, }), ]; } constructor(options = {}) { const { size = 4, strength = 1 } = options; const direction = figureOutDirection(options.direction); const length = direction.size; const invLength = length > 0 ? 1 / length : 1; const sx = direction.x * invLength; const sy = direction.y * invLength; const lines = ["vec2 s;", "float f;"]; let total = 0; for (let s = 0; s < size - 1; s += 2) { const weight = size - s; total += weight; lines.push(`s = ${(s + 1.4).toFixed(6)} * dir;`, `f = ${weight.toFixed(1)};`, "color += f * texture(uniTexture, varUV + s);", "color += f * texture(uniTexture, varUV - s);"); } if (size & 1) { // Size is odd (not even). lines.push(`s = ${size.toFixed(1)} * dir;`, "color += texture(uniTexture, varUV + s);", "color += texture(uniTexture, varUV - s);"); total++; } total = total + total + size + 1; super({ name: options.name ?? `TgdFilterBlur(${options.direction ?? 0} deg)`, fragmentShaderCode: [ "vec2 dir = uniStrength * varPixel * vec2(", [`${sx.toFixed(9)},`, `${sy.toFixed(9)}`], ");", `vec4 color = ${(size + 1).toFixed(1)} * texture(uniTexture, varUV);`, ...lines, `FragColor = color * ${(1 / total).toFixed(9)};`, ], uniforms: { uniStrength: "float", uniInverseWidth: "float", uniInverseHeight: "float", }, setUniforms: ({ program }) => { program.uniform1f("uniStrength", this.strength); }, }); this.strength = strength; } } function figureOutDirection(direction) { if (direction === undefined) return DEFAULT_DIRECTION; if (typeof direction === "number") { const ang = tgdCalcDegToRad(direction); return new TgdVec2(Math.cos(ang), Math.sin(ang)); } return direction; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWx0ZXIvYmx1ci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQWNwQyxNQUFNLGlCQUFpQixHQUFzQixJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFFOUQsTUFBTSxPQUFPLGFBQWMsU0FBUSxTQUFTO0lBQ2pDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBcUYsRUFBRTtRQUM1RyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQTtRQUN4QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLHFCQUFxQixDQUFBO1FBQ2xELE9BQU87WUFDSCxJQUFJLGFBQWEsQ0FBQztnQkFDZCxHQUFHLE9BQU87Z0JBQ1YsU0FBUztnQkFDVCxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksU0FBUyxHQUFHO2FBQ2hDLENBQUM7WUFDRixJQUFJLGFBQWEsQ0FBQztnQkFDZCxHQUFHLE9BQU87Z0JBQ1YsU0FBUyxFQUFFLFNBQVMsR0FBRyxFQUFFO2dCQUN6QixJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksU0FBUyxHQUFHO2FBQ2hDLENBQUM7U0FDTCxDQUFBO0lBQ0wsQ0FBQztJQUdELFlBQVksVUFBeUMsRUFBRTtRQUNuRCxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQzFDLE1BQU0sU0FBUyxHQUFZLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNoRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFB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