Skip to content

Commit 8e0d56f

Browse files
committed
feat: add hooks for initialize and resize
1 parent eb218e7 commit 8e0d56f

File tree

5 files changed

+73
-41
lines changed

5 files changed

+73
-41
lines changed

lib/src/effects/trails/index.ts

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -69,43 +69,58 @@ export function trails(params?: TrailsParams) {
6969
},
7070
});
7171

72-
const uniforms = Object.defineProperty(trailPass.uniforms, "uErosion", {
73-
get() {
72+
const uniforms = {
73+
get uErosion() {
7474
return erosion;
7575
},
76-
set(value: number) {
76+
set uErosion(value: number) {
7777
erosion = value;
7878
trailPass.uniforms.uKernelSize = [
7979
Math.sqrt(erosion) / fboRead.width,
8080
Math.sqrt(erosion) / fboRead.height,
8181
];
8282
},
83-
}) as typeof trailPass.uniforms & { uErosion: number };
83+
get uFadeout() {
84+
return trailPass.uniforms.uFadeout;
85+
},
86+
set uFadeout(value: number) {
87+
trailPass.uniforms.uFadeout = value;
88+
},
89+
get uTailColor() {
90+
return trailPass.uniforms.uTailColor;
91+
},
92+
set uTailColor(value: [number, number, number, number]) {
93+
trailPass.uniforms.uTailColor = value;
94+
},
95+
get uTailColorFalloff() {
96+
return trailPass.uniforms.uTailColorFalloff;
97+
},
98+
set uTailColorFalloff(value: number) {
99+
trailPass.uniforms.uTailColorFalloff = value;
100+
},
101+
};
84102

85103
const trailsPass = useCompositeEffectPass([trailPass, outputPass], uniforms);
86104

87-
const originalLightTrailsSetSize = trailsPass.setSize;
88-
trailsPass.setSize = (size: { width: number; height: number }) => {
89-
originalLightTrailsSetSize(size);
90-
fboRead.setSize(size.width, size.height);
91-
fboWrite.setSize(size.width, size.height);
105+
trailsPass.onResize((width, height) => {
106+
fboRead.setSize(width, height);
107+
fboWrite.setSize(width, height);
92108

93109
trailPass.uniforms.uKernelSize = [
94110
Math.sqrt(erosion) / fboRead.width,
95111
Math.sqrt(erosion) / fboRead.height,
96112
];
97-
};
113+
});
98114

99-
const originalInitializeFn = trailsPass.initialize;
100-
trailsPass.initialize = (gl) => {
101-
originalInitializeFn(gl);
115+
trailsPass.onInit((gl) => {
102116
fboRead = createRenderTarget(gl, floatTargetConfig);
103117
fboWrite = createRenderTarget(gl, floatTargetConfig);
104-
};
118+
});
105119

106120
trailsPass.onBeforeRender(() => {
107121
trailPass.setTarget(fboWrite);
108122
});
123+
109124
trailsPass.onAfterRender(swap);
110125

111126
return trailsPass;

lib/src/hooks/useCompositeEffectPass.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ export function useCompositeEffectPass<U extends Uniforms = Record<string, never
1717
const [beforeRenderCallbacks, onBeforeRender] = useLifeCycleCallback<RenderCallback<any>>();
1818
const [afterRenderCallbacks, onAfterRender] = useLifeCycleCallback<RenderCallback<any>>();
1919
const [onUpdatedCallbacks, onUpdated] = useLifeCycleCallback<UpdatedCallback<any>>();
20+
const [onResizeCallbacks, onResize] =
21+
useLifeCycleCallback<(width: number, height: number) => void>();
22+
const [onInitCallbacks, onInit] = useLifeCycleCallback<(gl: WebGL2RenderingContext) => void>();
2023

2124
function render() {
2225
for (const callback of beforeRenderCallbacks) callback({ uniforms: {} });
@@ -34,12 +37,18 @@ export function useCompositeEffectPass<U extends Uniforms = Record<string, never
3437
}
3538
});
3639
}
40+
for (const callback of onInitCallbacks) {
41+
callback(gl);
42+
}
3743
}
3844

3945
function setSize(size: { width: number; height: number }) {
4046
for (const pass of passes) {
4147
pass.setSize(size);
4248
}
49+
for (const callback of onResizeCallbacks) {
50+
callback(size.width, size.height);
51+
}
4352
}
4453

4554
function setTarget(target: RenderTarget | null) {
@@ -55,6 +64,8 @@ export function useCompositeEffectPass<U extends Uniforms = Record<string, never
5564
onBeforeRender,
5665
onAfterRender,
5766
onUpdated,
67+
onResize,
68+
onInit,
5869
initialize,
5970
render,
6071
setSize,

lib/src/hooks/useEffectPass.ts

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ import type { QuadPassOptions } from "./useQuadRenderPass";
55
import { useQuadRenderPass } from "./useQuadRenderPass";
66

77
type EffectPassOptions<U extends EffectUniforms> = Omit<QuadPassOptions<U>, "target"> & {
8-
/**
9-
* Allow to scale the render target texture based on size given to the pass.
10-
*/
11-
resolutionScale?: number;
128
/**
139
* Params to create the render target of the pass.
1410
*/
@@ -27,27 +23,16 @@ export function useEffectPass<U extends EffectUniforms>(
2723

2824
const renderPass = useQuadRenderPass(undefined, { ...options, target: null });
2925

30-
const renderPassSetSize = renderPass.setSize;
31-
renderPass.setSize = function ({ width, height }) {
32-
renderPassSetSize({
33-
width: Math.ceil(width * resolutionScale),
34-
height: Math.ceil(height * resolutionScale),
35-
});
36-
};
37-
38-
const renderPassInitialize = renderPass.initialize;
39-
renderPass.initialize = function (gl) {
40-
if (target != null && !("framebuffer" in target)) {
41-
renderPass.setTarget(
42-
createRenderTarget(gl, {
43-
...target,
44-
width: (target.width ?? gl.canvas.width) * resolutionScale,
45-
height: (target.height ?? gl.canvas.height) * resolutionScale,
46-
}),
47-
);
48-
}
49-
renderPassInitialize(gl);
50-
};
26+
renderPass.onInit((gl) => {
27+
if (target == null || "framebuffer" in target) return;
28+
renderPass.setTarget(
29+
createRenderTarget(gl, {
30+
...target,
31+
width: (target.width ?? gl.canvas.width) * resolutionScale,
32+
height: (target.height ?? gl.canvas.height) * resolutionScale,
33+
}),
34+
);
35+
});
5136

5237
return renderPass;
5338
}

lib/src/hooks/useRenderPass.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ export type RenderPassOptions<U extends Uniforms = Record<string, never>> = {
2222
transparent?: boolean;
2323
drawMode?: DrawMode;
2424
transformFeedbackVaryings?: string[];
25+
resolutionScale?: number;
2526
};
2627

2728
export function useRenderPass<U extends Uniforms>(
@@ -35,6 +36,7 @@ export function useRenderPass<U extends Uniforms>(
3536
transparent = false,
3637
drawMode: userDrawMode,
3738
transformFeedbackVaryings,
39+
resolutionScale = 1,
3840
}: RenderPassOptions<U>,
3941
): RenderPass<U> {
4042
/*
@@ -60,6 +62,8 @@ export function useRenderPass<U extends Uniforms>(
6062
indexType,
6163
} = useAttributes(attributes);
6264

65+
const [initCallbacks, onInit] = useLifeCycleCallback<(gl: WebGL2RenderingContext) => void>();
66+
6367
function initialize(gl: WebGL2RenderingContext) {
6468
_gl = gl;
6569
const program = createProgram(_gl, fragment, vertex, transformFeedbackVaryings);
@@ -71,6 +75,10 @@ export function useRenderPass<U extends Uniforms>(
7175

7276
initializeUniforms(_gl, _program);
7377
initializeAttributes(_gl, _program);
78+
79+
for (const callback of initCallbacks) {
80+
callback(_gl);
81+
}
7482
}
7583

7684
if (gl) {
@@ -83,12 +91,21 @@ export function useRenderPass<U extends Uniforms>(
8391

8492
const resolutionUniformName = findUniformName(fragment + vertex, "resolution");
8593

94+
const [resizeCallbacks, onResize] =
95+
useLifeCycleCallback<(width: number, height: number) => void>();
96+
8697
function setSize(size: { width: number; height: number }) {
98+
const width = size.width * resolutionScale;
99+
const height = size.height * resolutionScale;
100+
87101
if (resolutionUniformName && userUniforms[resolutionUniformName] === undefined) {
88-
(uniformsProxy as Record<string, unknown>)[resolutionUniformName] = [size.width, size.height];
102+
(uniformsProxy as Record<string, unknown>)[resolutionUniformName] = [width, height];
89103
}
90104
if (_target != null) {
91-
_target.setSize(size.width, size.height);
105+
_target.setSize(width, height);
106+
}
107+
for (const callback of resizeCallbacks) {
108+
callback(width, height);
92109
}
93110
}
94111

@@ -152,5 +169,7 @@ export function useRenderPass<U extends Uniforms>(
152169
onUpdated,
153170
onBeforeRender,
154171
onAfterRender,
172+
onInit,
173+
onResize,
155174
};
156175
}

lib/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ export interface RenderPass<U extends Uniforms = Record<string, never>> extends
5252
onUpdated: (callback: UpdatedCallback<U>) => void;
5353
onBeforeRender: (callback: RenderCallback<U>) => void;
5454
onAfterRender: (callback: RenderCallback<U>) => void;
55+
onInit: (callback: (gl: WebGL2RenderingContext) => void) => void;
56+
onResize: (callback: (width: number, height: number) => void) => void;
5557
initialize: (gl: WebGL2RenderingContext) => void;
5658
}
5759

0 commit comments

Comments
 (0)