Skip to content

Commit ddeabd9

Browse files
committed
feat!: change onPointerEvents to usePointerEvents and add more events
1 parent 8d1851e commit ddeabd9

File tree

12 files changed

+109
-63
lines changed

12 files changed

+109
-63
lines changed

lib/playground/src/pages/pointer/blob.astro

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Layout from "../../layouts/Layout.astro";
44
---
55

66
<script>
7-
import { onPointerEvents, useLoop, useWebGLCanvas, useBoundingRect } from "usegl";
7+
import { usePointerEvents, useLoop, useWebGLCanvas } from "usegl";
88
import { fragment, vertex } from "../../shaders/blob";
99
import { incrementRenderCount } from "../../components/renderCount";
1010

@@ -20,13 +20,12 @@ import Layout from "../../layouts/Layout.astro";
2020
immediate: false,
2121
});
2222

23-
const { center, rect } = useBoundingRect(canvas);
2423
const targetPointer = { x: 0, y: 0 };
2524

26-
onPointerEvents(canvas, {
27-
move: ({ x, y }) => {
28-
targetPointer.x = (x - center.x) / (rect.width / 2);
29-
targetPointer.y = (center.y - y) / (rect.height / 2);
25+
usePointerEvents(canvas, {
26+
move: ({ pointer, canvasRect, canvasCenter }) => {
27+
targetPointer.x = (pointer.x - canvasCenter.x) / (canvasRect.width / 2);
28+
targetPointer.y = (canvasCenter.y - pointer.y) / (canvasRect.height / 2);
3029
},
3130
leave: () => {
3231
targetPointer.x = targetPointer.y = 0;

lib/playground/src/pages/pointer/pointer.astro

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Layout from "../../layouts/Layout.astro";
33
---
44

55
<script>
6-
import { useBoundingRect, onPointerEvents, useWebGLCanvas } from "usegl";
6+
import { usePointerEvents, useWebGLCanvas } from "usegl";
77
import { incrementRenderCount } from "../../components/renderCount";
88

99
const canvas = document.querySelector("canvas");
@@ -14,29 +14,35 @@ import Layout from "../../layouts/Layout.astro";
1414
varying vec2 vUv;
1515
uniform vec2 uPointerPosition;
1616
uniform vec2 uResolution;
17+
uniform vec3 uCircleColor;
1718

1819
void main() {
1920
vec2 uv = (vUv - .5) * uResolution / min(uResolution.x, uResolution.y);
2021
float dist = distance(uv, uPointerPosition);
21-
float circle = 1. - smoothstep(.099, .101, dist);
22-
gl_FragColor = vec4(vec3(circle), 1.);
22+
float circleMask = 1. - smoothstep(.099, .101, dist);
23+
vec3 circle = mix(vec3(0.), uCircleColor, circleMask);
24+
gl_FragColor = vec4(circle, 1.);
2325
}
2426
`,
2527
uniforms: {
2628
uPointerPosition: [0, 0],
29+
uCircleColor: [1, 1, 1],
2730
},
2831
});
2932

30-
const { rect } = useBoundingRect(canvas);
31-
32-
onPointerEvents(canvas, {
33-
move: ({ clientX, clientY }) => {
34-
const { left, bottom, width, height } = rect;
33+
usePointerEvents(canvas, {
34+
move: ({ pointer, canvasCenter, canvasRect }) => {
3535
uniforms.uPointerPosition = [
36-
(clientX - (left + width / 2)) / Math.min(width, height),
37-
(bottom - height / 2 - clientY) / Math.min(width, height),
36+
(pointer.x - canvasCenter.x) / Math.min(canvasRect.width, canvasRect.height),
37+
(canvasCenter.y - pointer.y) / Math.min(canvasRect.width, canvasRect.height),
3838
];
3939
},
40+
down: () => {
41+
uniforms.uCircleColor = [1, 0, 0];
42+
},
43+
up: () => {
44+
uniforms.uCircleColor = [1, 1, 1];
45+
},
4046
});
4147

4248
onAfterRender(incrementRenderCount);

lib/src/helpers/pointer.ts

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

lib/src/hooks/useBoundingRect.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,17 @@ export interface UseBoundingRectOptions {
1515
windowScroll?: boolean;
1616
}
1717

18+
export interface BoundingRect {
19+
width: number;
20+
height: number;
21+
top: number;
22+
right: number;
23+
bottom: number;
24+
left: number;
25+
x: number;
26+
y: number;
27+
}
28+
1829
/**
1930
* Dynamically get the bounding rectangle of an HTML element
2031
*/
@@ -24,7 +35,7 @@ export function useBoundingRect(target: HTMLElement, options: UseBoundingRectOpt
2435
windowScroll = typeof window !== "undefined",
2536
} = options;
2637

27-
const rect = {
38+
const rect: BoundingRect = {
2839
width: 0,
2940
height: 0,
3041
top: 0,

lib/src/hooks/usePointerEvents.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import type { BoundingRect } from "./useBoundingRect";
2+
import { useBoundingRect } from "./useBoundingRect";
3+
4+
type HandlerArgs = {
5+
pointer: {
6+
x: number;
7+
y: number;
8+
};
9+
canvasRect: BoundingRect;
10+
canvasCenter: {
11+
x: number;
12+
y: number;
13+
};
14+
};
15+
16+
type PointerEventsHandlers = {
17+
enter?: ({ pointer, canvasRect, canvasCenter }: HandlerArgs) => void;
18+
move?: ({ pointer, canvasRect, canvasCenter }: HandlerArgs) => void;
19+
leave?: ({ pointer, canvasRect, canvasCenter }: HandlerArgs) => void;
20+
down?: ({ pointer, canvasRect, canvasCenter }: HandlerArgs) => void;
21+
up?: ({ pointer, canvasRect, canvasCenter }: HandlerArgs) => void;
22+
};
23+
24+
/**
25+
* Listen to common pointer events and provide additional infos about the canvas
26+
*/
27+
export function usePointerEvents(canvas: HTMLCanvasElement, handlers: PointerEventsHandlers) {
28+
const { rect: canvasRect, center: canvasCenter } = useBoundingRect(canvas);
29+
30+
const activeHandlers = Object.fromEntries(
31+
Object.entries(handlers)
32+
.filter(([, handler]) => typeof handler === "function")
33+
.map(([handlerName, handlerFunction]) => [
34+
handlerName,
35+
(e: PointerEvent) => {
36+
handlerFunction({
37+
pointer: { x: e.clientX, y: e.clientY },
38+
canvasRect,
39+
canvasCenter,
40+
});
41+
},
42+
]),
43+
);
44+
45+
function listen() {
46+
for (const [event, handler] of Object.entries(activeHandlers)) {
47+
canvas.addEventListener(`pointer${event as keyof PointerEventsHandlers}`, handler, {
48+
passive: true,
49+
});
50+
}
51+
}
52+
53+
function stop() {
54+
for (const [event, handler] of Object.entries(activeHandlers)) {
55+
canvas.removeEventListener(`pointer${event as keyof PointerEventsHandlers}`, handler);
56+
}
57+
}
58+
59+
listen();
60+
61+
return { stop, listen };
62+
}

lib/src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,4 @@ export { useWebGLContext } from "./hooks/useWebGLContext";
1414
export { useLoop, playAllLoops, pauseAllLoops } from "./hooks/useLoop";
1515
export { useResizeObserver } from "./hooks/useResizeObserver";
1616
export { useBoundingRect } from "./hooks/useBoundingRect";
17-
18-
export { onPointerEvents } from "./helpers/pointer";
17+
export { usePointerEvents } from "./hooks/usePointerEvents";
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading

0 commit comments

Comments
 (0)