@tolokoban/tgd
Version:
ToloGameDev library for WebGL2
73 lines • 6.5 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmx1ci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9maWx0ZXIvYmx1ci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQWNwQyxNQUFNLGlCQUFpQixHQUFzQixJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7QUFFOUQsTUFBTSxPQUFPLGFBQWMsU0FBUSxTQUFTO0lBQ2pDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBcUYsRUFBRTtRQUM1RyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQTtRQUN4QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLHFCQUFxQixDQUFBO1FBQ2xELE9BQU87WUFDSCxJQUFJLGFBQWEsQ0FBQztnQkFDZCxHQUFHLE9BQU87Z0JBQ1YsU0FBUztnQkFDVCxJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksU0FBUyxHQUFHO2FBQ2hDLENBQUM7WUFDRixJQUFJLGFBQWEsQ0FBQztnQkFDZCxHQUFHLE9BQU87Z0JBQ1YsU0FBUyxFQUFFLFNBQVMsR0FBRyxFQUFFO2dCQUN6QixJQUFJLEVBQUUsR0FBRyxJQUFJLElBQUksU0FBUyxHQUFHO2FBQ2hDLENBQUM7U0FDTCxDQUFBO0lBQ0wsQ0FBQztJQUdELFlBQVksVUFBeUMsRUFBRTtRQUNuRCxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxFQUFFLEdBQUcsT0FBTyxDQUFBO1FBQzFDLE1BQU0sU0FBUyxHQUFZLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNoRSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFBO1FBQzdCLE1BQU0sU0FBUyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUM3QyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUNsQyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQTtRQUNsQyxNQUFNLEtBQUssR0FBYSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQTtRQUMvQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQTtZQUN2QixLQUFLLElBQUksTUFBTSxDQUFBO1lBQ2YsS0FBSyxDQUFDLElBQUksQ0FDTixPQUFPLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNwQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFDM0IsOENBQThDLEVBQzlDLDhDQUE4QyxDQUNqRCxDQUFBO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ1gsMEJBQTBCO1lBQzFCLEtBQUssQ0FBQyxJQUFJLENBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQy9CLDBDQUEwQyxFQUMxQywwQ0FBMEMsQ0FDN0MsQ0FBQTtZQUNELEtBQUssRUFBRSxDQUFBO1FBQ1gsQ0FBQztRQUNELEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUE7UUFDaEMsS0FBSyxDQUFDO1lBQ0YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksaUJBQWlCLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxPQUFPO1lBQ3BFLGtCQUFrQixFQUFFO2dCQUNoQiwyQ0FBMkM7Z0JBQzNDLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3pDLElBQUk7Z0JBQ0osZ0JBQWdCLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO2dCQUNyRSxHQUFHLEtBQUs7Z0JBQ1IsdUJBQXVCLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRzthQUNuRDtZQUNELFFBQVEsRUFBRTtnQkFDTixXQUFXLEVBQUUsT0FBTztnQkFDcEIsZUFBZSxFQUFFLE9BQU87Z0JBQ3hCLGdCQUFnQixFQUFFLE9BQU87YUFDNUI7WUFDRCxXQUFXLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7Z0JBQ3pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUNuRCxDQUFDO1NBQ0osQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7SUFDNUIsQ0FBQztDQUNKO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxTQUFpRDtJQUN6RSxJQUFJLFNBQVMsS0FBSyxTQUFTO1FBQUUsT0FBTyxpQkFBaUIsQ0FBQTtJQUVyRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUN0QyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQTtBQUNwQixDQUFDIn0=