Skip to content

Commit 4f5f4fb

Browse files
committed
refactor: simplify the use of callback functions
1 parent 8e0d56f commit 4f5f4fb

File tree

6 files changed

+41
-52
lines changed

6 files changed

+41
-52
lines changed

lib/src/hooks/useCompositeEffectPass.ts

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useLifeCycleCallback } from "../internal/useLifeCycleCallback";
1+
import { useHook } from "../internal/useHook";
22
import type {
33
CompositeEffectPass,
44
EffectPass,
@@ -14,41 +14,33 @@ export function useCompositeEffectPass<U extends Uniforms = Record<string, never
1414
): CompositeEffectPass<U> {
1515
const outputPass = passes.at(-1)!;
1616

17-
const [beforeRenderCallbacks, onBeforeRender] = useLifeCycleCallback<RenderCallback<any>>();
18-
const [afterRenderCallbacks, onAfterRender] = useLifeCycleCallback<RenderCallback<any>>();
19-
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>();
17+
const [onBeforeRender, executeBeforeRenderCallbacks] = useHook<RenderCallback<any>>();
18+
const [onAfterRender, executeAfterRenderCallbacks] = useHook<RenderCallback<any>>();
19+
const [onUpdated, executeUpdateCallbacks] = useHook<UpdatedCallback<any>>();
20+
const [onResize, executeResizeCallbacks] = useHook<(width: number, height: number) => void>();
21+
const [onInit, executeInitCallbacks] = useHook<(gl: WebGL2RenderingContext) => void>();
2322

2423
function render() {
25-
for (const callback of beforeRenderCallbacks) callback({ uniforms: {} });
24+
executeBeforeRenderCallbacks({ uniforms });
2625
for (const pass of passes) pass.render();
27-
for (const callback of afterRenderCallbacks) callback({ uniforms: {} });
26+
executeAfterRenderCallbacks({ uniforms });
2827
}
2928

3029
function initialize(gl: WebGL2RenderingContext) {
3130
for (const pass of passes) {
3231
pass.initialize(gl);
33-
3432
pass.onUpdated((newUniforms, oldUniforms) => {
35-
for (const callback of onUpdatedCallbacks) {
36-
callback(newUniforms, oldUniforms);
37-
}
33+
executeUpdateCallbacks(newUniforms, oldUniforms);
3834
});
3935
}
40-
for (const callback of onInitCallbacks) {
41-
callback(gl);
42-
}
36+
executeInitCallbacks(gl);
4337
}
4438

4539
function setSize(size: { width: number; height: number }) {
4640
for (const pass of passes) {
4741
pass.setSize(size);
4842
}
49-
for (const callback of onResizeCallbacks) {
50-
callback(size.width, size.height);
51-
}
43+
executeResizeCallbacks(size.width, size.height);
5244
}
5345

5446
function setTarget(target: RenderTarget | null) {

lib/src/hooks/useRenderPass.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { setRenderTarget } from "../core/renderTarget";
1111
import { findUniformName } from "../internal/findName";
1212
import { useUniforms } from "../internal/useUniforms";
1313
import { useAttributes } from "../internal/useAttributes";
14-
import { useLifeCycleCallback } from "../internal/useLifeCycleCallback";
14+
import { useHook } from "../internal/useHook";
1515

1616
export type RenderPassOptions<U extends Uniforms = Record<string, never>> = {
1717
target?: RenderTarget | null;
@@ -62,7 +62,7 @@ export function useRenderPass<U extends Uniforms>(
6262
indexType,
6363
} = useAttributes(attributes);
6464

65-
const [initCallbacks, onInit] = useLifeCycleCallback<(gl: WebGL2RenderingContext) => void>();
65+
const [onInit, executeInitCallbacks] = useHook<(gl: WebGL2RenderingContext) => void>();
6666

6767
function initialize(gl: WebGL2RenderingContext) {
6868
_gl = gl;
@@ -76,9 +76,7 @@ export function useRenderPass<U extends Uniforms>(
7676
initializeUniforms(_gl, _program);
7777
initializeAttributes(_gl, _program);
7878

79-
for (const callback of initCallbacks) {
80-
callback(_gl);
81-
}
79+
executeInitCallbacks(_gl);
8280
}
8381

8482
if (gl) {
@@ -91,8 +89,7 @@ export function useRenderPass<U extends Uniforms>(
9189

9290
const resolutionUniformName = findUniformName(fragment + vertex, "resolution");
9391

94-
const [resizeCallbacks, onResize] =
95-
useLifeCycleCallback<(width: number, height: number) => void>();
92+
const [onResize, executeResizeCallbacks] = useHook<(width: number, height: number) => void>();
9693

9794
function setSize(size: { width: number; height: number }) {
9895
const width = size.width * resolutionScale;
@@ -104,9 +101,7 @@ export function useRenderPass<U extends Uniforms>(
104101
if (_target != null) {
105102
_target.setSize(width, height);
106103
}
107-
for (const callback of resizeCallbacks) {
108-
callback(width, height);
109-
}
104+
executeResizeCallbacks(width, height);
110105
}
111106

112107
function setTarget(target: RenderTarget | null) {
@@ -119,8 +114,8 @@ export function useRenderPass<U extends Uniforms>(
119114

120115
const drawMode = userDrawMode || (vertex.includes("gl_PointSize") ? "POINTS" : "TRIANGLES");
121116

122-
const [beforeRenderCallbacks, onBeforeRender] = useLifeCycleCallback<RenderCallback<U>>();
123-
const [afterRenderCallbacks, onAfterRender] = useLifeCycleCallback<RenderCallback<U>>();
117+
const [onBeforeRender, executeBeforeRenderCallbacks] = useHook<RenderCallback<U>>();
118+
const [onAfterRender, executeAfterRenderCallbacks] = useHook<RenderCallback<U>>();
124119

125120
function render({ target }: { target?: RenderTarget | null } = {}) {
126121
if (_gl == undefined) {
@@ -140,19 +135,15 @@ export function useRenderPass<U extends Uniforms>(
140135
bindVAO();
141136
setUniforms();
142137

143-
for (const callback of beforeRenderCallbacks) {
144-
callback({ uniforms: getUniformsSnapshot() });
145-
}
138+
executeBeforeRenderCallbacks({ uniforms: getUniformsSnapshot() });
146139

147140
if (hasIndices) {
148141
_gl.drawElements(_gl[drawMode], getVertexCount(), indexType, 0);
149142
} else {
150143
_gl.drawArrays(_gl[drawMode], 0, getVertexCount());
151144
}
152145

153-
for (const callback of afterRenderCallbacks) {
154-
callback({ uniforms: getUniformsSnapshot() });
155-
}
146+
executeAfterRenderCallbacks({ uniforms: getUniformsSnapshot() });
156147
}
157148

158149
return {

lib/src/hooks/useWebGLCanvas.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { findUniformName } from "../internal/findName";
88
import type { UseLoopOptions } from "./useLoop";
99
import { useLoop } from "./useLoop";
1010
import { isHTMLImageTexture, isHTMLVideoTexture } from "../core/texture";
11-
import { useLifeCycleCallback } from "../internal/useLifeCycleCallback";
11+
import { useHook } from "../internal/useHook";
1212

1313
interface Props<U extends Uniforms> extends UseLoopOptions, QuadPassOptions<U> {
1414
canvas: HTMLCanvasElement | OffscreenCanvas | string;
@@ -111,12 +111,12 @@ export const useWebGLCanvas = <U extends Uniforms>(props: Props<U>) => {
111111

112112
let resizeObserver: ReturnType<typeof useResizeObserver> | null = null;
113113

114-
const [canvasReadyCallbacks, onCanvasReady] = useLifeCycleCallback();
114+
const [onCanvasReady, executeCanvasReadyCallbacks] = useHook();
115115

116116
function resizeCanvas(width: number, height: number) {
117117
setSize({ width: width * dpr, height: height * dpr });
118118
if (!isCanvasResized) {
119-
for (const callback of canvasReadyCallbacks) callback();
119+
executeCanvasReadyCallbacks();
120120
isCanvasResized = true;
121121
}
122122
}

lib/src/internal/useHook.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export function useHook<C extends (...args: any[]) => any = () => void>() {
2+
const callbacks: C[] = [];
3+
4+
function registerCallback(callback: C) {
5+
callbacks.push(callback);
6+
}
7+
8+
function executeCallbacks(...params: Parameters<C>) {
9+
for (const callback of callbacks) {
10+
callback(...params);
11+
}
12+
}
13+
14+
return [registerCallback, executeCallbacks] as const;
15+
}

lib/src/internal/useLifeCycleCallback.ts

Lines changed: 0 additions & 9 deletions
This file was deleted.

lib/src/internal/useUniforms.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { DataTextureParams, ImageTextureParams } from "../core/texture";
22
import { fillTexture } from "../core/texture";
33
import type { Uniforms, UniformValue, UpdatedCallback } from "../types";
4-
import { useLifeCycleCallback } from "./useLifeCycleCallback";
4+
import { useHook } from "./useHook";
55

66
export function useUniforms<U extends Uniforms>(uniforms: U) {
77
type UniformName = Extract<keyof U, string>;
@@ -12,7 +12,7 @@ export function useUniforms<U extends Uniforms>(uniforms: U) {
1212
let _gl: WebGL2RenderingContext;
1313
let _program: WebGLProgram;
1414

15-
const [onUpdatedCallbacks, onUpdated] = useLifeCycleCallback<UpdatedCallback<U>>();
15+
const [onUpdated, executeUpdateCallbacks] = useHook<UpdatedCallback<U>>();
1616

1717
const uniformsLocations = new Map<UniformName, WebGLUniformLocation>();
1818

@@ -35,7 +35,7 @@ export function useUniforms<U extends Uniforms>(uniforms: U) {
3535
const oldTarget = getSnapshot(target);
3636
target[uniform as keyof U] = value;
3737
const newTarget = getSnapshot(target);
38-
for (const callback of onUpdatedCallbacks) callback(newTarget, oldTarget);
38+
executeUpdateCallbacks(newTarget, oldTarget);
3939
}
4040
return true;
4141
},

0 commit comments

Comments
 (0)