@flighthq/effects-gl 0.1.0
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.
- package/dist/glBloomEffect.d.ts +4 -0
- package/dist/glBloomEffect.d.ts.map +1 -0
- package/dist/glBloomEffect.js +56 -0
- package/dist/glBloomEffect.js.map +1 -0
- package/dist/glBokehDepthOfFieldEffect.d.ts +4 -0
- package/dist/glBokehDepthOfFieldEffect.d.ts.map +1 -0
- package/dist/glBokehDepthOfFieldEffect.js +55 -0
- package/dist/glBokehDepthOfFieldEffect.js.map +1 -0
- package/dist/glBrightnessContrastEffect.d.ts +4 -0
- package/dist/glBrightnessContrastEffect.d.ts.map +1 -0
- package/dist/glBrightnessContrastEffect.js +28 -0
- package/dist/glBrightnessContrastEffect.js.map +1 -0
- package/dist/glCameraMotionBlurEffect.d.ts +4 -0
- package/dist/glCameraMotionBlurEffect.d.ts.map +1 -0
- package/dist/glCameraMotionBlurEffect.js +41 -0
- package/dist/glCameraMotionBlurEffect.js.map +1 -0
- package/dist/glChannelMixerEffect.d.ts +4 -0
- package/dist/glChannelMixerEffect.d.ts.map +1 -0
- package/dist/glChannelMixerEffect.js +30 -0
- package/dist/glChannelMixerEffect.js.map +1 -0
- package/dist/glChromaticAberrationEffect.d.ts +4 -0
- package/dist/glChromaticAberrationEffect.d.ts.map +1 -0
- package/dist/glChromaticAberrationEffect.js +36 -0
- package/dist/glChromaticAberrationEffect.js.map +1 -0
- package/dist/glColorGradeEffect.d.ts +4 -0
- package/dist/glColorGradeEffect.d.ts.map +1 -0
- package/dist/glColorGradeEffect.js +46 -0
- package/dist/glColorGradeEffect.js.map +1 -0
- package/dist/glCrtEffect.d.ts +4 -0
- package/dist/glCrtEffect.d.ts.map +1 -0
- package/dist/glCrtEffect.js +55 -0
- package/dist/glCrtEffect.js.map +1 -0
- package/dist/glCustomShaderEffect.d.ts +6 -0
- package/dist/glCustomShaderEffect.d.ts.map +1 -0
- package/dist/glCustomShaderEffect.js +87 -0
- package/dist/glCustomShaderEffect.js.map +1 -0
- package/dist/glDirectionalBlurEffect.d.ts +4 -0
- package/dist/glDirectionalBlurEffect.d.ts.map +1 -0
- package/dist/glDirectionalBlurEffect.js +44 -0
- package/dist/glDirectionalBlurEffect.js.map +1 -0
- package/dist/glDisplacementEffect.d.ts +4 -0
- package/dist/glDisplacementEffect.d.ts.map +1 -0
- package/dist/glDisplacementEffect.js +37 -0
- package/dist/glDisplacementEffect.js.map +1 -0
- package/dist/glDitherEffect.d.ts +4 -0
- package/dist/glDitherEffect.d.ts.map +1 -0
- package/dist/glDitherEffect.js +37 -0
- package/dist/glDitherEffect.js.map +1 -0
- package/dist/glEffectProgramCache.d.ts +4 -0
- package/dist/glEffectProgramCache.d.ts.map +1 -0
- package/dist/glEffectProgramCache.js +42 -0
- package/dist/glEffectProgramCache.js.map +1 -0
- package/dist/glExposureEffect.d.ts +4 -0
- package/dist/glExposureEffect.d.ts.map +1 -0
- package/dist/glExposureEffect.js +24 -0
- package/dist/glExposureEffect.js.map +1 -0
- package/dist/glFilmGrainEffect.d.ts +4 -0
- package/dist/glFilmGrainEffect.d.ts.map +1 -0
- package/dist/glFilmGrainEffect.js +36 -0
- package/dist/glFilmGrainEffect.js.map +1 -0
- package/dist/glFxaaEffect.d.ts +4 -0
- package/dist/glFxaaEffect.d.ts.map +1 -0
- package/dist/glFxaaEffect.js +61 -0
- package/dist/glFxaaEffect.js.map +1 -0
- package/dist/glGlitchEffect.d.ts +4 -0
- package/dist/glGlitchEffect.d.ts.map +1 -0
- package/dist/glGlitchEffect.js +50 -0
- package/dist/glGlitchEffect.js.map +1 -0
- package/dist/glGodRaysEffect.d.ts +4 -0
- package/dist/glGodRaysEffect.d.ts.map +1 -0
- package/dist/glGodRaysEffect.js +59 -0
- package/dist/glGodRaysEffect.js.map +1 -0
- package/dist/glGrayscaleEffect.d.ts +4 -0
- package/dist/glGrayscaleEffect.d.ts.map +1 -0
- package/dist/glGrayscaleEffect.js +25 -0
- package/dist/glGrayscaleEffect.js.map +1 -0
- package/dist/glHalftoneEffect.d.ts +4 -0
- package/dist/glHalftoneEffect.d.ts.map +1 -0
- package/dist/glHalftoneEffect.js +38 -0
- package/dist/glHalftoneEffect.js.map +1 -0
- package/dist/glHueSaturationEffect.d.ts +4 -0
- package/dist/glHueSaturationEffect.d.ts.map +1 -0
- package/dist/glHueSaturationEffect.js +67 -0
- package/dist/glHueSaturationEffect.js.map +1 -0
- package/dist/glInvertEffect.d.ts +4 -0
- package/dist/glInvertEffect.d.ts.map +1 -0
- package/dist/glInvertEffect.js +24 -0
- package/dist/glInvertEffect.js.map +1 -0
- package/dist/glKuwaharaEffect.d.ts +4 -0
- package/dist/glKuwaharaEffect.d.ts.map +1 -0
- package/dist/glKuwaharaEffect.js +61 -0
- package/dist/glKuwaharaEffect.js.map +1 -0
- package/dist/glLensDirtEffect.d.ts +4 -0
- package/dist/glLensDirtEffect.d.ts.map +1 -0
- package/dist/glLensDirtEffect.js +45 -0
- package/dist/glLensDirtEffect.js.map +1 -0
- package/dist/glLensDistortionEffect.d.ts +4 -0
- package/dist/glLensDistortionEffect.d.ts.map +1 -0
- package/dist/glLensDistortionEffect.js +34 -0
- package/dist/glLensDistortionEffect.js.map +1 -0
- package/dist/glLensFlareEffect.d.ts +4 -0
- package/dist/glLensFlareEffect.d.ts.map +1 -0
- package/dist/glLensFlareEffect.js +56 -0
- package/dist/glLensFlareEffect.js.map +1 -0
- package/dist/glLiftGammaGainEffect.d.ts +4 -0
- package/dist/glLiftGammaGainEffect.d.ts.map +1 -0
- package/dist/glLiftGammaGainEffect.js +44 -0
- package/dist/glLiftGammaGainEffect.js.map +1 -0
- package/dist/glLookupTableGradeEffect.d.ts +4 -0
- package/dist/glLookupTableGradeEffect.d.ts.map +1 -0
- package/dist/glLookupTableGradeEffect.js +28 -0
- package/dist/glLookupTableGradeEffect.js.map +1 -0
- package/dist/glMotionBlurEffect.d.ts +4 -0
- package/dist/glMotionBlurEffect.d.ts.map +1 -0
- package/dist/glMotionBlurEffect.js +61 -0
- package/dist/glMotionBlurEffect.js.map +1 -0
- package/dist/glOutlineEffect.d.ts +4 -0
- package/dist/glOutlineEffect.d.ts.map +1 -0
- package/dist/glOutlineEffect.js +49 -0
- package/dist/glOutlineEffect.js.map +1 -0
- package/dist/glPixelateEffect.d.ts +4 -0
- package/dist/glPixelateEffect.d.ts.map +1 -0
- package/dist/glPixelateEffect.js +27 -0
- package/dist/glPixelateEffect.js.map +1 -0
- package/dist/glPosterizeEffect.d.ts +4 -0
- package/dist/glPosterizeEffect.d.ts.map +1 -0
- package/dist/glPosterizeEffect.js +25 -0
- package/dist/glPosterizeEffect.js.map +1 -0
- package/dist/glRadialBlurEffect.d.ts +4 -0
- package/dist/glRadialBlurEffect.d.ts.map +1 -0
- package/dist/glRadialBlurEffect.js +43 -0
- package/dist/glRadialBlurEffect.js.map +1 -0
- package/dist/glRenderEffectPipeline.d.ts +7 -0
- package/dist/glRenderEffectPipeline.d.ts.map +1 -0
- package/dist/glRenderEffectPipeline.js +86 -0
- package/dist/glRenderEffectPipeline.js.map +1 -0
- package/dist/glRenderEffectRegistrar.d.ts +13 -0
- package/dist/glRenderEffectRegistrar.d.ts.map +1 -0
- package/dist/glRenderEffectRegistrar.js +222 -0
- package/dist/glRenderEffectRegistrar.js.map +1 -0
- package/dist/glRenderEffectRegistry.d.ts +5 -0
- package/dist/glRenderEffectRegistry.d.ts.map +1 -0
- package/dist/glRenderEffectRegistry.js +23 -0
- package/dist/glRenderEffectRegistry.js.map +1 -0
- package/dist/glScanlinesEffect.d.ts +4 -0
- package/dist/glScanlinesEffect.d.ts.map +1 -0
- package/dist/glScanlinesEffect.js +28 -0
- package/dist/glScanlinesEffect.js.map +1 -0
- package/dist/glScreenSpaceFogEffect.d.ts +4 -0
- package/dist/glScreenSpaceFogEffect.d.ts.map +1 -0
- package/dist/glScreenSpaceFogEffect.js +55 -0
- package/dist/glScreenSpaceFogEffect.js.map +1 -0
- package/dist/glSepiaEffect.d.ts +4 -0
- package/dist/glSepiaEffect.d.ts.map +1 -0
- package/dist/glSepiaEffect.js +29 -0
- package/dist/glSepiaEffect.js.map +1 -0
- package/dist/glSharpenEffect.d.ts +4 -0
- package/dist/glSharpenEffect.d.ts.map +1 -0
- package/dist/glSharpenEffect.js +33 -0
- package/dist/glSharpenEffect.js.map +1 -0
- package/dist/glSketchEffect.d.ts +4 -0
- package/dist/glSketchEffect.d.ts.map +1 -0
- package/dist/glSketchEffect.js +43 -0
- package/dist/glSketchEffect.js.map +1 -0
- package/dist/glSmaaEffect.d.ts +4 -0
- package/dist/glSmaaEffect.d.ts.map +1 -0
- package/dist/glSmaaEffect.js +48 -0
- package/dist/glSmaaEffect.js.map +1 -0
- package/dist/glSsaoEffect.d.ts +4 -0
- package/dist/glSsaoEffect.d.ts.map +1 -0
- package/dist/glSsaoEffect.js +45 -0
- package/dist/glSsaoEffect.js.map +1 -0
- package/dist/glSsrEffect.d.ts +4 -0
- package/dist/glSsrEffect.d.ts.map +1 -0
- package/dist/glSsrEffect.js +24 -0
- package/dist/glSsrEffect.js.map +1 -0
- package/dist/glTaaEffect.d.ts +4 -0
- package/dist/glTaaEffect.d.ts.map +1 -0
- package/dist/glTaaEffect.js +22 -0
- package/dist/glTaaEffect.js.map +1 -0
- package/dist/glTiltShiftEffect.d.ts +4 -0
- package/dist/glTiltShiftEffect.d.ts.map +1 -0
- package/dist/glTiltShiftEffect.js +45 -0
- package/dist/glTiltShiftEffect.js.map +1 -0
- package/dist/glToneMapEffect.d.ts +4 -0
- package/dist/glToneMapEffect.d.ts.map +1 -0
- package/dist/glToneMapEffect.js +51 -0
- package/dist/glToneMapEffect.js.map +1 -0
- package/dist/glVignetteEffect.d.ts +4 -0
- package/dist/glVignetteEffect.d.ts.map +1 -0
- package/dist/glVignetteEffect.js +42 -0
- package/dist/glVignetteEffect.js.map +1 -0
- package/dist/glWhiteBalanceEffect.d.ts +4 -0
- package/dist/glWhiteBalanceEffect.d.ts.map +1 -0
- package/dist/glWhiteBalanceEffect.js +31 -0
- package/dist/glWhiteBalanceEffect.js.map +1 -0
- package/dist/index.d.ts +50 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
- package/src/glBloomEffect.test.ts +13 -0
- package/src/glBokehDepthOfFieldEffect.test.ts +13 -0
- package/src/glBrightnessContrastEffect.test.ts +16 -0
- package/src/glCameraMotionBlurEffect.test.ts +13 -0
- package/src/glChannelMixerEffect.test.ts +13 -0
- package/src/glChromaticAberrationEffect.test.ts +16 -0
- package/src/glColorGradeEffect.test.ts +13 -0
- package/src/glCrtEffect.test.ts +13 -0
- package/src/glCustomShaderEffect.test.ts +68 -0
- package/src/glDirectionalBlurEffect.test.ts +13 -0
- package/src/glDisplacementEffect.test.ts +13 -0
- package/src/glDitherEffect.test.ts +13 -0
- package/src/glEffectProgramCache.test.ts +13 -0
- package/src/glExposureEffect.test.ts +13 -0
- package/src/glFilmGrainEffect.test.ts +13 -0
- package/src/glFxaaEffect.test.ts +13 -0
- package/src/glGlitchEffect.test.ts +13 -0
- package/src/glGodRaysEffect.test.ts +13 -0
- package/src/glGrayscaleEffect.test.ts +13 -0
- package/src/glHalftoneEffect.test.ts +13 -0
- package/src/glHueSaturationEffect.test.ts +13 -0
- package/src/glInvertEffect.test.ts +13 -0
- package/src/glKuwaharaEffect.test.ts +13 -0
- package/src/glLensDirtEffect.test.ts +13 -0
- package/src/glLensDistortionEffect.test.ts +13 -0
- package/src/glLensFlareEffect.test.ts +13 -0
- package/src/glLiftGammaGainEffect.test.ts +13 -0
- package/src/glLookupTableGradeEffect.test.ts +13 -0
- package/src/glMotionBlurEffect.test.ts +13 -0
- package/src/glOutlineEffect.test.ts +13 -0
- package/src/glPixelateEffect.test.ts +13 -0
- package/src/glPosterizeEffect.test.ts +13 -0
- package/src/glRadialBlurEffect.test.ts +13 -0
- package/src/glRenderEffectPipeline.test.ts +37 -0
- package/src/glRenderEffectRegistrar.test.ts +187 -0
- package/src/glRenderEffectRegistry.test.ts +52 -0
- package/src/glScanlinesEffect.test.ts +13 -0
- package/src/glScreenSpaceFogEffect.test.ts +13 -0
- package/src/glSepiaEffect.test.ts +13 -0
- package/src/glSharpenEffect.test.ts +13 -0
- package/src/glSketchEffect.test.ts +13 -0
- package/src/glSmaaEffect.test.ts +13 -0
- package/src/glSsaoEffect.test.ts +13 -0
- package/src/glSsrEffect.test.ts +13 -0
- package/src/glTaaEffect.test.ts +13 -0
- package/src/glTiltShiftEffect.test.ts +13 -0
- package/src/glToneMapEffect.test.ts +13 -0
- package/src/glVignetteEffect.test.ts +13 -0
- package/src/glWhiteBalanceEffect.test.ts +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glHalftoneEffect.js","sourceRoot":"","sources":["../src/glHalftoneEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,mGAAmG;AACnG,oFAAoF;AACpF,MAAM,UAAU,uBAAuB,CACrC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAgC;IAEhC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;IAClC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,CAAC,CAAC;IACzF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAC9E,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QACjE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;EAmB5B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, HueSaturationEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyHueSaturationEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<HueSaturationEffect>): void;
|
|
3
|
+
export declare const defaultGlHueSaturationEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glHueSaturationEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glHueSaturationEffect.d.ts","sourceRoot":"","sources":["../src/glHueSaturationEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAKhH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GACpC,IAAI,CAUN;AAED,eAAO,MAAM,kCAAkC,EAAE,oBAEhD,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Hue/saturation/lightness: convert to HSL, adjust, convert back.
|
|
4
|
+
export function applyHueSaturationEffectToGl(state, source, dest, effect) {
|
|
5
|
+
const hue = effect.hue ?? 0;
|
|
6
|
+
const saturation = effect.saturation ?? 1;
|
|
7
|
+
const lightness = effect.lightness ?? 0;
|
|
8
|
+
const program = getGlEffectProgram(state, 'colorGrade.hueSaturation', HUE_SATURATION_FRAGMENT_SRC);
|
|
9
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
10
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_hue'), hue / 360);
|
|
11
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_saturation'), saturation);
|
|
12
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_lightness'), lightness);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export const defaultGlHueSaturationEffectRunner = (ctx, effect) => {
|
|
16
|
+
applyHueSaturationEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
17
|
+
};
|
|
18
|
+
const HUE_SATURATION_FRAGMENT_SRC = `#version 300 es
|
|
19
|
+
precision highp float;
|
|
20
|
+
in vec2 v_texCoord;
|
|
21
|
+
uniform sampler2D u_texture0;
|
|
22
|
+
uniform float u_hue;
|
|
23
|
+
uniform float u_saturation;
|
|
24
|
+
uniform float u_lightness;
|
|
25
|
+
out vec4 o_color;
|
|
26
|
+
vec3 rgb2hsl(vec3 c) {
|
|
27
|
+
float mx = max(c.r, max(c.g, c.b));
|
|
28
|
+
float mn = min(c.r, min(c.g, c.b));
|
|
29
|
+
float l = (mx + mn) * 0.5;
|
|
30
|
+
float h = 0.0;
|
|
31
|
+
float s = 0.0;
|
|
32
|
+
float d = mx - mn;
|
|
33
|
+
if (d > 0.0001) {
|
|
34
|
+
s = l < 0.5 ? d / (mx + mn) : d / (2.0 - mx - mn);
|
|
35
|
+
if (mx == c.r) h = (c.g - c.b) / d + (c.g < c.b ? 6.0 : 0.0);
|
|
36
|
+
else if (mx == c.g) h = (c.b - c.r) / d + 2.0;
|
|
37
|
+
else h = (c.r - c.g) / d + 4.0;
|
|
38
|
+
h /= 6.0;
|
|
39
|
+
}
|
|
40
|
+
return vec3(h, s, l);
|
|
41
|
+
}
|
|
42
|
+
float hue2rgb(float p, float q, float t) {
|
|
43
|
+
if (t < 0.0) t += 1.0;
|
|
44
|
+
if (t > 1.0) t -= 1.0;
|
|
45
|
+
if (t < 1.0 / 6.0) return p + (q - p) * 6.0 * t;
|
|
46
|
+
if (t < 1.0 / 2.0) return q;
|
|
47
|
+
if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6.0;
|
|
48
|
+
return p;
|
|
49
|
+
}
|
|
50
|
+
vec3 hsl2rgb(vec3 hsl) {
|
|
51
|
+
float h = hsl.x;
|
|
52
|
+
float s = hsl.y;
|
|
53
|
+
float l = hsl.z;
|
|
54
|
+
if (s <= 0.0) return vec3(l);
|
|
55
|
+
float q = l < 0.5 ? l * (1.0 + s) : l + s - l * s;
|
|
56
|
+
float p = 2.0 * l - q;
|
|
57
|
+
return vec3(hue2rgb(p, q, h + 1.0 / 3.0), hue2rgb(p, q, h), hue2rgb(p, q, h - 1.0 / 3.0));
|
|
58
|
+
}
|
|
59
|
+
void main() {
|
|
60
|
+
vec4 c = texture(u_texture0, v_texCoord);
|
|
61
|
+
vec3 hsl = rgb2hsl(c.rgb);
|
|
62
|
+
hsl.x = fract(hsl.x + u_hue);
|
|
63
|
+
hsl.y = clamp(hsl.y * u_saturation, 0.0, 1.0);
|
|
64
|
+
hsl.z = clamp(hsl.z + u_lightness, 0.0, 1.0);
|
|
65
|
+
o_color = vec4(hsl2rgb(hsl), c.a);
|
|
66
|
+
}`;
|
|
67
|
+
//# sourceMappingURL=glHueSaturationEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glHueSaturationEffect.js","sourceRoot":"","sources":["../src/glHueSaturationEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,kEAAkE;AAClE,MAAM,UAAU,4BAA4B,CAC1C,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAqC;IAErC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,2BAA2B,CAAC,CAAC;IACnG,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;QACnE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;QAC3E,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,kCAAkC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACtF,4BAA4B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA6B,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgDlC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, InvertEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyInvertEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<InvertEffect>): void;
|
|
3
|
+
export declare const defaultGlInvertEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glInvertEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glInvertEffect.d.ts","sourceRoot":"","sources":["../src/glInvertEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKzG,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAMN;AAED,eAAO,MAAM,2BAA2B,EAAE,oBAEzC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Invert: mix toward 1 - rgb by intensity.
|
|
4
|
+
export function applyInvertEffectToGl(state, source, dest, effect) {
|
|
5
|
+
const intensity = effect.intensity ?? 1;
|
|
6
|
+
const program = getGlEffectProgram(state, 'colorGrade.invert', INVERT_FRAGMENT_SRC);
|
|
7
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
8
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export const defaultGlInvertEffectRunner = (ctx, effect) => {
|
|
12
|
+
applyInvertEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
13
|
+
};
|
|
14
|
+
const INVERT_FRAGMENT_SRC = `#version 300 es
|
|
15
|
+
precision highp float;
|
|
16
|
+
in vec2 v_texCoord;
|
|
17
|
+
uniform sampler2D u_texture0;
|
|
18
|
+
uniform float u_intensity;
|
|
19
|
+
out vec4 o_color;
|
|
20
|
+
void main() {
|
|
21
|
+
vec4 c = texture(u_texture0, v_texCoord);
|
|
22
|
+
o_color = vec4(mix(c.rgb, 1.0 - c.rgb, u_intensity), c.a);
|
|
23
|
+
}`;
|
|
24
|
+
//# sourceMappingURL=glInvertEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glInvertEffect.js","sourceRoot":"","sources":["../src/glInvertEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,2CAA2C;AAC3C,MAAM,UAAU,qBAAqB,CACnC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IACpF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC/E,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG;;;;;;;;;EAS1B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, KuwaharaEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyKuwaharaEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<KuwaharaEffect>): void;
|
|
3
|
+
export declare const defaultGlKuwaharaEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glKuwaharaEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glKuwaharaEffect.d.ts","sourceRoot":"","sources":["../src/glKuwaharaEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAO3G,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CAON;AAED,eAAO,MAAM,6BAA6B,EAAE,oBAE3C,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Kuwahara: edge-preserving smoothing. Over a fixed small radius split the neighborhood into four
|
|
4
|
+
// overlapping quadrants, compute each mean and variance, and emit the lowest-variance mean — flattens
|
|
5
|
+
// regions while keeping edges crisp. `radius` gates the sampled extent.
|
|
6
|
+
export function applyKuwaharaEffectToGl(state, source, dest, effect) {
|
|
7
|
+
const radius = effect.radius ?? 3;
|
|
8
|
+
const program = getGlEffectProgram(state, 'stylization.kuwahara', KUWAHARA_FRAGMENT_SRC);
|
|
9
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
10
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_radius'), Math.max(1, radius));
|
|
11
|
+
gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export const defaultGlKuwaharaEffectRunner = (ctx, effect) => {
|
|
15
|
+
applyKuwaharaEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
16
|
+
};
|
|
17
|
+
const KUWAHARA_FRAGMENT_SRC = `#version 300 es
|
|
18
|
+
precision highp float;
|
|
19
|
+
in vec2 v_texCoord;
|
|
20
|
+
uniform sampler2D u_texture0;
|
|
21
|
+
uniform float u_radius;
|
|
22
|
+
uniform vec2 u_resolution;
|
|
23
|
+
out vec4 o_color;
|
|
24
|
+
const int R = 4;
|
|
25
|
+
void main() {
|
|
26
|
+
vec2 texel = 1.0 / u_resolution;
|
|
27
|
+
int r = int(min(float(R), u_radius));
|
|
28
|
+
vec3 means[4];
|
|
29
|
+
float vars[4];
|
|
30
|
+
ivec2 lo[4] = ivec2[4](ivec2(-1, -1), ivec2(0, -1), ivec2(-1, 0), ivec2(0, 0));
|
|
31
|
+
for (int q = 0; q < 4; q++) {
|
|
32
|
+
vec3 sum = vec3(0.0);
|
|
33
|
+
vec3 sumSq = vec3(0.0);
|
|
34
|
+
float n = 0.0;
|
|
35
|
+
for (int y = 0; y <= R; y++) {
|
|
36
|
+
for (int x = 0; x <= R; x++) {
|
|
37
|
+
if (x > r || y > r) continue;
|
|
38
|
+
ivec2 d = ivec2(x, y) * sign(lo[q] + ivec2(1)) + lo[q] * r;
|
|
39
|
+
vec2 off = vec2(float(d.x), float(d.y)) * texel;
|
|
40
|
+
vec3 col = texture(u_texture0, v_texCoord + off).rgb;
|
|
41
|
+
sum += col;
|
|
42
|
+
sumSq += col * col;
|
|
43
|
+
n += 1.0;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
vec3 mean = sum / n;
|
|
47
|
+
means[q] = mean;
|
|
48
|
+
vec3 v = sumSq / n - mean * mean;
|
|
49
|
+
vars[q] = v.r + v.g + v.b;
|
|
50
|
+
}
|
|
51
|
+
float minVar = vars[0];
|
|
52
|
+
vec3 result = means[0];
|
|
53
|
+
for (int q = 1; q < 4; q++) {
|
|
54
|
+
if (vars[q] < minVar) {
|
|
55
|
+
minVar = vars[q];
|
|
56
|
+
result = means[q];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
o_color = vec4(result, texture(u_texture0, v_texCoord).a);
|
|
60
|
+
}`;
|
|
61
|
+
//# sourceMappingURL=glKuwaharaEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glKuwaharaEffect.js","sourceRoot":"","sources":["../src/glKuwaharaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,kGAAkG;AAClG,sGAAsG;AACtG,wEAAwE;AACxE,MAAM,UAAU,uBAAuB,CACrC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,sBAAsB,EAAE,qBAAqB,CAAC,CAAC;IACzF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAChF,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2C5B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, LensDirtEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyLensDirtEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<LensDirtEffect>): void;
|
|
3
|
+
export declare const defaultGlLensDirtEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glLensDirtEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLensDirtEffect.d.ts","sourceRoot":"","sources":["../src/glLensDirtEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAK3G,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CAUN;AAED,eAAO,MAAM,6BAA6B,EAAE,oBAE3C,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Lens dirt: procedural soft smudges that brighten where the scene is bright — a cheap bloom-dirt overlay.
|
|
4
|
+
export function applyLensDirtEffectToGl(state, source, dest, effect) {
|
|
5
|
+
const intensity = effect.intensity ?? 1;
|
|
6
|
+
const threshold = effect.threshold ?? 0.55;
|
|
7
|
+
const seed = effect.seed ?? 0;
|
|
8
|
+
const program = getGlEffectProgram(state, 'lens.lensDirt', LENS_DIRT_FRAGMENT_SRC);
|
|
9
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
10
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
|
|
11
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_threshold'), threshold);
|
|
12
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_seed'), seed);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export const defaultGlLensDirtEffectRunner = (ctx, effect) => {
|
|
16
|
+
applyLensDirtEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
17
|
+
};
|
|
18
|
+
const LENS_DIRT_FRAGMENT_SRC = `#version 300 es
|
|
19
|
+
precision highp float;
|
|
20
|
+
in vec2 v_texCoord;
|
|
21
|
+
uniform sampler2D u_texture0;
|
|
22
|
+
uniform float u_intensity;
|
|
23
|
+
uniform float u_threshold;
|
|
24
|
+
uniform float u_seed;
|
|
25
|
+
out vec4 o_color;
|
|
26
|
+
float dirtHash(vec2 p) { return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123); }
|
|
27
|
+
float dirtAmount(vec2 uv, float seed) {
|
|
28
|
+
float acc = 0.0;
|
|
29
|
+
for (int i = 0; i < 8; i++) {
|
|
30
|
+
float fi = float(i);
|
|
31
|
+
vec2 c = vec2(dirtHash(vec2(fi, seed)), dirtHash(vec2(fi + 9.0, seed)));
|
|
32
|
+
float r = 0.06 + 0.16 * dirtHash(vec2(fi + 3.0, seed));
|
|
33
|
+
float d = distance(uv, c) / r;
|
|
34
|
+
acc += smoothstep(1.0, 0.0, d) * (0.3 + 0.7 * dirtHash(vec2(fi + 5.0, seed)));
|
|
35
|
+
}
|
|
36
|
+
return clamp(acc, 0.0, 1.0);
|
|
37
|
+
}
|
|
38
|
+
void main() {
|
|
39
|
+
vec4 c = texture(u_texture0, v_texCoord);
|
|
40
|
+
float lum = dot(c.rgb, vec3(0.299, 0.587, 0.114));
|
|
41
|
+
float bright = max(0.0, lum - u_threshold);
|
|
42
|
+
float dirt = dirtAmount(v_texCoord, u_seed + 1.0);
|
|
43
|
+
o_color = vec4(c.rgb + bright * dirt * u_intensity * 2.0, c.a);
|
|
44
|
+
}`;
|
|
45
|
+
//# sourceMappingURL=glLensDirtEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLensDirtEffect.js","sourceRoot":"","sources":["../src/glLensDirtEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,2GAA2G;AAC3G,MAAM,UAAU,uBAAuB,CACrC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAgC;IAEhC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,eAAe,EAAE,sBAAsB,CAAC,CAAC;IACnF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;EA0B7B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, LensDistortionEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyLensDistortionEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<LensDistortionEffect>): void;
|
|
3
|
+
export declare const defaultGlLensDistortionEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glLensDistortionEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLensDistortionEffect.d.ts","sourceRoot":"","sources":["../src/glLensDistortionEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAMjH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GACrC,IAAI,CAQN;AAED,eAAO,MAAM,mCAAmC,EAAE,oBAEjD,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Lens distortion: remap uv by a radial polynomial. Positive amount bulges outward (barrel), negative
|
|
4
|
+
// pinches inward (pincushion); scale re-frames the result so corners stay in view.
|
|
5
|
+
export function applyLensDistortionEffectToGl(state, source, dest, effect) {
|
|
6
|
+
const amount = effect.amount ?? 0.2;
|
|
7
|
+
const scale = effect.scale ?? 1;
|
|
8
|
+
const program = getGlEffectProgram(state, 'lens.lensDistortion', LENS_DISTORTION_FRAGMENT_SRC);
|
|
9
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
10
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_amount'), amount);
|
|
11
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_scale'), scale);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export const defaultGlLensDistortionEffectRunner = (ctx, effect) => {
|
|
15
|
+
applyLensDistortionEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
16
|
+
};
|
|
17
|
+
const LENS_DISTORTION_FRAGMENT_SRC = `#version 300 es
|
|
18
|
+
precision highp float;
|
|
19
|
+
in vec2 v_texCoord;
|
|
20
|
+
uniform sampler2D u_texture0;
|
|
21
|
+
uniform float u_amount;
|
|
22
|
+
uniform float u_scale;
|
|
23
|
+
out vec4 o_color;
|
|
24
|
+
void main() {
|
|
25
|
+
vec2 centered = (v_texCoord - 0.5) / u_scale;
|
|
26
|
+
float r2 = dot(centered, centered);
|
|
27
|
+
vec2 distorted = centered * (1.0 + u_amount * r2) + 0.5;
|
|
28
|
+
if (distorted.x < 0.0 || distorted.x > 1.0 || distorted.y < 0.0 || distorted.y > 1.0) {
|
|
29
|
+
o_color = vec4(0.0, 0.0, 0.0, 1.0);
|
|
30
|
+
} else {
|
|
31
|
+
o_color = texture(u_texture0, distorted);
|
|
32
|
+
}
|
|
33
|
+
}`;
|
|
34
|
+
//# sourceMappingURL=glLensDistortionEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLensDistortionEffect.js","sourceRoot":"","sources":["../src/glLensDistortionEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,sGAAsG;AACtG,mFAAmF;AACnF,MAAM,UAAU,6BAA6B,CAC3C,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAsC;IAEtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,4BAA4B,CAAC,CAAC;IAC/F,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACvF,6BAA6B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA8B,CAAC,CAAC;AACjG,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG;;;;;;;;;;;;;;;;EAgBnC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, LensFlareEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyLensFlareEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<LensFlareEffect>): void;
|
|
3
|
+
export declare const defaultGlLensFlareEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glLensFlareEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLensFlareEffect.d.ts","sourceRoot":"","sources":["../src/glLensFlareEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAS5G,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAYN;AAED,eAAO,MAAM,8BAA8B,EAAE,oBAE5C,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Lens flare: a single-pass approximation. A true flare is a multi-pass recipe (downsample a bright
|
|
4
|
+
// pass, then accumulate ghosts and a halo from it). Here, on each fragment, we sample the source's
|
|
5
|
+
// bright spots along the vector from the pixel toward the center, adding `ghosts` evenly spaced ghost
|
|
6
|
+
// samples plus a halo ring, scaled by threshold/intensity. It previews the look without the bright-pass
|
|
7
|
+
// buffer.
|
|
8
|
+
export function applyLensFlareEffectToGl(state, source, dest, effect) {
|
|
9
|
+
const threshold = effect.threshold ?? 0.8;
|
|
10
|
+
const intensity = effect.intensity ?? 1;
|
|
11
|
+
const ghosts = effect.ghosts ?? 4;
|
|
12
|
+
const halo = effect.halo ?? 0.5;
|
|
13
|
+
const program = getGlEffectProgram(state, 'lens.lensFlare', LENS_FLARE_FRAGMENT_SRC);
|
|
14
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
15
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_threshold'), threshold);
|
|
16
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
|
|
17
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_ghosts'), ghosts);
|
|
18
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_halo'), halo);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export const defaultGlLensFlareEffectRunner = (ctx, effect) => {
|
|
22
|
+
applyLensFlareEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
23
|
+
};
|
|
24
|
+
const LENS_FLARE_FRAGMENT_SRC = `#version 300 es
|
|
25
|
+
precision highp float;
|
|
26
|
+
in vec2 v_texCoord;
|
|
27
|
+
uniform sampler2D u_texture0;
|
|
28
|
+
uniform float u_threshold;
|
|
29
|
+
uniform float u_intensity;
|
|
30
|
+
uniform float u_ghosts;
|
|
31
|
+
uniform float u_halo;
|
|
32
|
+
out vec4 o_color;
|
|
33
|
+
vec3 brightPass(vec2 uv) {
|
|
34
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) return vec3(0.0);
|
|
35
|
+
vec3 c = texture(u_texture0, uv).rgb;
|
|
36
|
+
float l = dot(c, vec3(0.2126, 0.7152, 0.0722));
|
|
37
|
+
return c * max(0.0, l - u_threshold);
|
|
38
|
+
}
|
|
39
|
+
void main() {
|
|
40
|
+
vec4 scene = texture(u_texture0, v_texCoord);
|
|
41
|
+
// Single-pass approximation of a flare: walk ghost samples along the vector toward the optical
|
|
42
|
+
// center and add a halo ring, all from the bright pass of the scene itself (no separate buffer).
|
|
43
|
+
vec2 toCenter = (vec2(0.5) - v_texCoord);
|
|
44
|
+
vec3 flare = vec3(0.0);
|
|
45
|
+
int count = int(clamp(u_ghosts, 0.0, 8.0));
|
|
46
|
+
for (int i = 0; i < 8; i++) {
|
|
47
|
+
if (i >= count) break;
|
|
48
|
+
float t = (float(i) + 1.0) / (float(count) + 1.0);
|
|
49
|
+
vec2 uv = v_texCoord + toCenter * (2.0 * t);
|
|
50
|
+
flare += brightPass(uv);
|
|
51
|
+
}
|
|
52
|
+
vec2 haloDir = normalize(toCenter + vec2(1e-5));
|
|
53
|
+
flare += brightPass(v_texCoord + haloDir * u_halo) * u_halo;
|
|
54
|
+
o_color = vec4(scene.rgb + flare * u_intensity, scene.a);
|
|
55
|
+
}`;
|
|
56
|
+
//# sourceMappingURL=glLensFlareEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLensFlareEffect.js","sourceRoot":"","sources":["../src/glLensFlareEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,oGAAoG;AACpG,mGAAmG;AACnG,sGAAsG;AACtG,wGAAwG;AACxG,UAAU;AACV,MAAM,UAAU,wBAAwB,CACtC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAiC;IAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC;IAChC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,CAAC;IACrF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;QACnE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAClF,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+B9B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, LiftGammaGainEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyLiftGammaGainEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<LiftGammaGainEffect>): void;
|
|
3
|
+
export declare const defaultGlLiftGammaGainEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glLiftGammaGainEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLiftGammaGainEffect.d.ts","sourceRoot":"","sources":["../src/glLiftGammaGainEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAMhH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GACpC,IAAI,CAgBN;AAED,eAAO,MAAM,kCAAkC,EAAE,oBAEhD,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Lift/gamma/gain: unpack packed-RGBA neutrals to per-channel offsets/exponents/multipliers in JS.
|
|
4
|
+
// Neutral packed values: lift 0x000000ff, gamma 0x808080ff, gain 0xffffffff.
|
|
5
|
+
export function applyLiftGammaGainEffectToGl(state, source, dest, effect) {
|
|
6
|
+
const lift = unpackColor(effect.lift ?? 0x000000ff);
|
|
7
|
+
const gammaRaw = unpackColor(effect.gamma ?? 0x808080ff);
|
|
8
|
+
const gain = unpackColor(effect.gain ?? 0xffffffff);
|
|
9
|
+
// Map gamma's 0.5-neutral to a 1.0-neutral exponent so 0x808080 leaves the image unchanged.
|
|
10
|
+
const gamma = [
|
|
11
|
+
1 / Math.max(gammaRaw[0] * 2, 1e-3),
|
|
12
|
+
1 / Math.max(gammaRaw[1] * 2, 1e-3),
|
|
13
|
+
1 / Math.max(gammaRaw[2] * 2, 1e-3),
|
|
14
|
+
];
|
|
15
|
+
const program = getGlEffectProgram(state, 'colorGrade.liftGammaGain', LIFT_GAMMA_GAIN_FRAGMENT_SRC);
|
|
16
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
17
|
+
gl.uniform3f(gl.getUniformLocation(p.program, 'u_lift'), lift[0], lift[1], lift[2]);
|
|
18
|
+
gl.uniform3f(gl.getUniformLocation(p.program, 'u_gamma'), gamma[0], gamma[1], gamma[2]);
|
|
19
|
+
gl.uniform3f(gl.getUniformLocation(p.program, 'u_gain'), gain[0], gain[1], gain[2]);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export const defaultGlLiftGammaGainEffectRunner = (ctx, effect) => {
|
|
23
|
+
applyLiftGammaGainEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
24
|
+
};
|
|
25
|
+
// Unpack a packed RGBA integer (0xRRGGBBAA) into normalized [r, g, b] floats. Alpha is dropped — these
|
|
26
|
+
// grade values describe RGB channels only.
|
|
27
|
+
function unpackColor(c) {
|
|
28
|
+
return [((c >>> 24) & 255) / 255, ((c >>> 16) & 255) / 255, ((c >>> 8) & 255) / 255];
|
|
29
|
+
}
|
|
30
|
+
const LIFT_GAMMA_GAIN_FRAGMENT_SRC = `#version 300 es
|
|
31
|
+
precision highp float;
|
|
32
|
+
in vec2 v_texCoord;
|
|
33
|
+
uniform sampler2D u_texture0;
|
|
34
|
+
uniform vec3 u_lift;
|
|
35
|
+
uniform vec3 u_gamma;
|
|
36
|
+
uniform vec3 u_gain;
|
|
37
|
+
out vec4 o_color;
|
|
38
|
+
void main() {
|
|
39
|
+
vec4 c = texture(u_texture0, v_texCoord);
|
|
40
|
+
vec3 rgb = c.rgb * u_gain + u_lift * (1.0 - c.rgb);
|
|
41
|
+
rgb = pow(max(rgb, 0.0), u_gamma);
|
|
42
|
+
o_color = vec4(clamp(rgb, 0.0, 1.0), c.a);
|
|
43
|
+
}`;
|
|
44
|
+
//# sourceMappingURL=glLiftGammaGainEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLiftGammaGainEffect.js","sourceRoot":"","sources":["../src/glLiftGammaGainEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,mGAAmG;AACnG,6EAA6E;AAC7E,MAAM,UAAU,4BAA4B,CAC1C,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAqC;IAErC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC;IACpD,4FAA4F;IAC5F,MAAM,KAAK,GAAsC;QAC/C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;QACnC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;QACnC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;KACpC,CAAC;IACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,CAAC,CAAC;IACpG,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACxF,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,kCAAkC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACtF,4BAA4B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA6B,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,uGAAuG;AACvG,2CAA2C;AAC3C,SAAS,WAAW,CAAC,CAAS;IAC5B,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,4BAA4B,GAAG;;;;;;;;;;;;;EAanC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, LookupTableGradeEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyLookupTableGradeEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<LookupTableGradeEffect>): void;
|
|
3
|
+
export declare const defaultGlLookupTableGradeEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glLookupTableGradeEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLookupTableGradeEffect.d.ts","sourceRoot":"","sources":["../src/glLookupTableGradeEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAOnH,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACvC,IAAI,CAMN;AAED,eAAO,MAAM,qCAAqC,EAAE,oBAEnD,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// LUT grade: passthrough with a strength mix. A real 3D LUT grade needs an uploaded LUT cube texture
|
|
4
|
+
// (size from effect.size) sampled per pixel; that texture path is not yet wired, so this keeps the
|
|
5
|
+
// pass compiling and color-neutral until the LUT upload is added.
|
|
6
|
+
export function applyLookupTableGradeEffectToGl(state, source, dest, effect) {
|
|
7
|
+
const strength = effect.strength ?? 1;
|
|
8
|
+
const program = getGlEffectProgram(state, 'colorGrade.lutGrade', LUT_GRADE_FRAGMENT_SRC);
|
|
9
|
+
drawGlFullscreenPass(state, program, [source.texture], dest, (gl, p) => {
|
|
10
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_strength'), strength);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
export const defaultGlLookupTableGradeEffectRunner = (ctx, effect) => {
|
|
14
|
+
applyLookupTableGradeEffectToGl(ctx.state, ctx.source, ctx.dest, effect);
|
|
15
|
+
};
|
|
16
|
+
const LUT_GRADE_FRAGMENT_SRC = `#version 300 es
|
|
17
|
+
precision highp float;
|
|
18
|
+
in vec2 v_texCoord;
|
|
19
|
+
uniform sampler2D u_texture0;
|
|
20
|
+
uniform float u_strength;
|
|
21
|
+
out vec4 o_color;
|
|
22
|
+
void main() {
|
|
23
|
+
vec4 c = texture(u_texture0, v_texCoord);
|
|
24
|
+
// Passthrough: a real 3D LUT samples an uploaded LUT cube here, then mixes by u_strength.
|
|
25
|
+
vec3 graded = c.rgb;
|
|
26
|
+
o_color = vec4(mix(c.rgb, graded, u_strength), c.a);
|
|
27
|
+
}`;
|
|
28
|
+
//# sourceMappingURL=glLookupTableGradeEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glLookupTableGradeEffect.js","sourceRoot":"","sources":["../src/glLookupTableGradeEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,qGAAqG;AACrG,mGAAmG;AACnG,kEAAkE;AAClE,MAAM,UAAU,+BAA+B,CAC7C,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,MAAwC;IAExC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,CAAC,CAAC;IACzF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QACrE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,qCAAqC,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACzF,+BAA+B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAgC,CAAC,CAAC;AACrG,CAAC,CAAC;AAEF,MAAM,sBAAsB,GAAG;;;;;;;;;;;EAW7B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, MotionBlurEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyMotionBlurEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, velocityTexture: WebGLTexture | null, effect: Readonly<MotionBlurEffect>): void;
|
|
3
|
+
export declare const defaultGlMotionBlurEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glMotionBlurEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glMotionBlurEffect.d.ts","sourceRoot":"","sources":["../src/glMotionBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAW7G,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,eAAe,EAAE,YAAY,GAAG,IAAI,EACpC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CAYN;AAED,eAAO,MAAM,+BAA+B,EAAE,oBAE7C,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { drawGlFullscreenPass } from '@flighthq/render-gl';
|
|
2
|
+
import { getGlEffectProgram } from './glEffectProgramCache';
|
|
3
|
+
// Motion blur (per-object): the velocity-driven analog of the depth consumers (fog/DoF). When the scene
|
|
4
|
+
// produced a per-pixel velocity buffer (`velocityTexture`, rgba16f screen-space velocity in pixels in the
|
|
5
|
+
// RG channels), this is the real recipe — read each fragment's velocity, scale it by `intensity`, and
|
|
6
|
+
// accumulate `samples` taps spread along that vector centered on the fragment, smearing every object by
|
|
7
|
+
// its own motion. When velocity is absent (the scene did not write the buffer), u_hasVelocity=0 and it is
|
|
8
|
+
// a passthrough copy (sentinel path), preserving the pipeline stage without altering the image. Demonstrates
|
|
9
|
+
// the ctx.sceneVelocityTexture seam: real velocity path when present, sentinel copy when null.
|
|
10
|
+
export function applyMotionBlurEffectToGl(state, source, dest, velocityTexture, effect) {
|
|
11
|
+
const intensity = effect.intensity ?? 1;
|
|
12
|
+
const samples = effect.samples ?? 16;
|
|
13
|
+
const program = getGlEffectProgram(state, 'motionBlur', MOTION_BLUR_FRAGMENT_SRC);
|
|
14
|
+
const inputs = velocityTexture ? [source.texture, velocityTexture] : [source.texture];
|
|
15
|
+
drawGlFullscreenPass(state, program, inputs, dest, (gl, p) => {
|
|
16
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_intensity'), intensity);
|
|
17
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_samples'), samples);
|
|
18
|
+
// u_resolution converts the pixel-space velocity vector into UV-space tap offsets.
|
|
19
|
+
gl.uniform2f(gl.getUniformLocation(p.program, 'u_resolution'), source.width, source.height);
|
|
20
|
+
gl.uniform1f(gl.getUniformLocation(p.program, 'u_hasVelocity'), velocityTexture ? 1 : 0);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export const defaultGlMotionBlurEffectRunner = (ctx, effect) => {
|
|
24
|
+
applyMotionBlurEffectToGl(ctx.state, ctx.source, ctx.dest, ctx.sceneVelocityTexture, effect);
|
|
25
|
+
};
|
|
26
|
+
const MOTION_BLUR_FRAGMENT_SRC = `#version 300 es
|
|
27
|
+
precision highp float;
|
|
28
|
+
in vec2 v_texCoord;
|
|
29
|
+
uniform sampler2D u_texture0;
|
|
30
|
+
uniform sampler2D u_texture1;
|
|
31
|
+
uniform float u_intensity;
|
|
32
|
+
uniform float u_samples;
|
|
33
|
+
uniform vec2 u_resolution;
|
|
34
|
+
uniform float u_hasVelocity;
|
|
35
|
+
out vec4 o_color;
|
|
36
|
+
const int SAMPLES = 16;
|
|
37
|
+
void main() {
|
|
38
|
+
vec4 base = texture(u_texture0, v_texCoord);
|
|
39
|
+
if (u_hasVelocity < 0.5) {
|
|
40
|
+
// Sentinel path: no velocity buffer written — passthrough copy.
|
|
41
|
+
o_color = base;
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
// Velocity decode: rgba16f buffer stores screen-space velocity in pixels in the RG channels. Convert
|
|
45
|
+
// to a UV-space smear vector via u_resolution and scale by intensity.
|
|
46
|
+
vec2 velocityPixels = texture(u_texture1, v_texCoord).rg;
|
|
47
|
+
vec2 smear = (velocityPixels / u_resolution) * u_intensity;
|
|
48
|
+
float count = min(u_samples, 16.0);
|
|
49
|
+
vec4 sum = vec4(0.0);
|
|
50
|
+
float taken = 0.0;
|
|
51
|
+
for (int i = 0; i < SAMPLES; i++) {
|
|
52
|
+
if (float(i) >= count) break;
|
|
53
|
+
// Center the taps on the fragment: t in [-0.5, 0.5] spreads the accumulation along the motion vector.
|
|
54
|
+
float t = count > 1.0 ? (float(i) / (count - 1.0)) - 0.5 : 0.0;
|
|
55
|
+
vec2 uv = v_texCoord + smear * t;
|
|
56
|
+
sum += texture(u_texture0, uv);
|
|
57
|
+
taken += 1.0;
|
|
58
|
+
}
|
|
59
|
+
o_color = sum / max(taken, 1.0);
|
|
60
|
+
}`;
|
|
61
|
+
//# sourceMappingURL=glMotionBlurEffect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glMotionBlurEffect.js","sourceRoot":"","sources":["../src/glMotionBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,wGAAwG;AACxG,0GAA0G;AAC1G,sGAAsG;AACtG,wGAAwG;AACxG,0GAA0G;AAC1G,6GAA6G;AAC7G,+FAA+F;AAC/F,MAAM,UAAU,yBAAyB,CACvC,KAAoB,EACpB,MAAgC,EAChC,IAA8B,EAC9B,eAAoC,EACpC,MAAkC;IAElC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,wBAAwB,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtF,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;QAC3D,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;QACzE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QACrE,mFAAmF;QACnF,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5F,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,oBAAoB,EAAE,MAA0B,CAAC,CAAC;AACnH,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkC/B,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlRenderEffectRunner, GlRenderState, GlRenderTarget, OutlineEffect } from '@flighthq/types';
|
|
2
|
+
export declare function applyOutlineEffectToGl(state: GlRenderState, source: Readonly<GlRenderTarget>, dest: Readonly<GlRenderTarget>, effect: Readonly<OutlineEffect>): void;
|
|
3
|
+
export declare const defaultGlOutlineEffectRunner: GlRenderEffectRunner;
|
|
4
|
+
//# sourceMappingURL=glOutlineEffect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glOutlineEffect.d.ts","sourceRoot":"","sources":["../src/glOutlineEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAM1G,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,cAAc,CAAC,EAC9B,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC9B,IAAI,CAiBN;AAED,eAAO,MAAM,4BAA4B,EAAE,oBAE1C,CAAC"}
|