Skip to content

Commit f2163ce

Browse files
committed
gesture support attempt
1 parent e458802 commit f2163ce

File tree

3 files changed

+79
-16
lines changed

3 files changed

+79
-16
lines changed

demo/@/components/custom/animation-controls/AnimationControlsGroup.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div
3-
class="w-full h-screen grid lg:grid-cols-3 grid-cols-1 lg:grid-rows-1 justify-items-center justify-center items-center lg:overflow-hidden relative"
3+
class="w-full min-h-screen grid lg:grid-cols-3 grid-cols-1 lg:grid-rows-1 justify-items-center justify-center items-center lg:overflow-hidden relative"
44
v-bind="$attrs"
55
>
66
<div

demo/@/components/custom/animation-controls/animationStores.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,4 +158,4 @@ export const deepDefaultStore = (store: any, defaultStore: any) => {
158158
}
159159
};
160160

161-
resetAllStores();
161+
// resetAllStores();

demo/@/components/custom/orbital-drag/OrbitalDrag.vue

Lines changed: 77 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
@touchstart="startDrag"
88
@touchmove="drag"
99
@touchend="stopDrag"
10+
@gesturestart="startGesture"
11+
@gesturechange="gesture"
12+
@gestureend="stopGesture"
1013
>
1114
<slot></slot>
1215
</div>
@@ -30,6 +33,20 @@ import { clamp } from "@src/math";
3033
import { angleUnits } from "@src/parsing/units";
3134
import { get } from "http";
3235
36+
const normalizeAngle = (angle: number, unit: (typeof angleUnits)[number]): number => {
37+
switch (unit) {
38+
case "rad":
39+
return angle % (2 * Math.PI);
40+
case "grad":
41+
return angle % 400;
42+
case "turn":
43+
return angle % 1;
44+
default:
45+
case "deg":
46+
return angle % 360;
47+
}
48+
};
49+
3350
type PressedKeys = {
3451
x: boolean;
3552
y: boolean;
@@ -70,6 +87,16 @@ const getDefaultPreviousMousePosition = () => {
7087
7188
let previousMousePosition = $ref(getDefaultPreviousMousePosition());
7289
90+
const getDefaultGestureState = () => {
91+
return {
92+
x: 0,
93+
y: 0,
94+
scale: 1,
95+
};
96+
};
97+
98+
let previousGestureState = $ref(getDefaultGestureState());
99+
73100
let pressedKeys = $ref<PressedKeys>({
74101
x: false,
75102
y: false,
@@ -123,18 +150,20 @@ const stopDrag = (event: MouseEvent | TouchEvent) => {
123150
isDragging = false;
124151
};
125152
126-
const normalizeAngle = (angle: number, unit: (typeof angleUnits)[number]): number => {
127-
switch (unit) {
128-
case "rad":
129-
return angle % (2 * Math.PI);
130-
case "grad":
131-
return angle % 400;
132-
case "turn":
133-
return angle % 1;
134-
default:
135-
case "deg":
136-
return angle % 360;
137-
}
153+
const startGesture = (event: any) => {
154+
event.preventDefault();
155+
156+
isTouching = true;
157+
158+
previousGestureState = {
159+
x: event.screenX,
160+
y: event.screenY,
161+
scale: event.scale ?? 1,
162+
};
163+
};
164+
165+
const stopGesture = () => {
166+
isTouching = false;
138167
};
139168
140169
const updateTransform = (
@@ -218,6 +247,32 @@ const drag = (event: MouseEvent | TouchEvent) => {
218247
previousMousePosition = { x, y };
219248
};
220249
250+
const gesture = (event: any) => {
251+
if (!isTouching) return;
252+
253+
const { screenX, screenY, scale } = event;
254+
255+
const deltaX = screenX - previousGestureState.x;
256+
const deltaY = screenY - previousGestureState.y;
257+
const deltaScale = scale - previousGestureState.scale;
258+
259+
if (
260+
Math.abs(deltaX) < 1e-4 &&
261+
Math.abs(deltaY) < 1e-4 &&
262+
Math.abs(deltaScale) < 1e-4
263+
)
264+
return;
265+
266+
updateTranslation("x", deltaX);
267+
updateTranslation("y", deltaY);
268+
269+
updateScale("x", deltaScale);
270+
updateScale("y", deltaScale);
271+
updateScale("z", deltaScale);
272+
273+
previousGestureState = { x: screenX, y: screenY, scale };
274+
};
275+
221276
const handleAxisSpecificDrag = (deltaX: number, deltaY: number) => {
222277
const delta = Math.abs(deltaX) > Math.abs(deltaY) ? deltaX : deltaY;
223278
@@ -342,8 +397,12 @@ onMounted(() => {
342397
useEventListener(window, "mouseleave", stopDrag);
343398
344399
useEventListener(window, "touchmove", drag);
345-
// useEventListener(window, "touchstart", startDrag);
346-
// useEventListener(window, "touchend", stopDrag);
400+
useEventListener(window, "touchstart", startDrag);
401+
useEventListener(window, "touchend", stopDrag);
402+
403+
useEventListener(window, "gestureStart", startGesture);
404+
useEventListener(window, "gestureChange", gesture);
405+
useEventListener(window, "gestureEnd", stopGesture);
347406
348407
resume();
349408
});
@@ -366,6 +425,10 @@ onUnmounted(() => {
366425
window.removeEventListener("touchstart", startDrag);
367426
window.removeEventListener("touchend", stopDrag);
368427
428+
window.removeEventListener("gestureStart", startGesture);
429+
window.removeEventListener("gestureChange", gesture);
430+
window.removeEventListener("gestureEnd", stopGesture);
431+
369432
pause();
370433
});
371434

0 commit comments

Comments
 (0)