Skip to content

Commit 06eaafd

Browse files
committed
- added touch events
1 parent e6d0c45 commit 06eaafd

3 files changed

Lines changed: 62 additions & 2 deletions

File tree

examples/particle_system.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ <h3>4. Time integration</h3>
340340
let dx = px - mousePos.x
341341
let dy = py - mousePos.y
342342
let dist2 = Math.sqrt(dx * dx + dy * dy)
343-
if (dist2 < 10)
343+
if (dist2 < 50)
344344
this.selected = true;
345345
}
346346
}

examples/particle_system_rb.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ <h3>4. Time integration</h3>
369369
let dx = px - mousePos.x
370370
let dy = py - mousePos.y
371371
let dist2 = Math.sqrt(dx * dx + dy * dy)
372-
if (dist2 < 10)
372+
if (dist2 < 50)
373373
this.selected = true;
374374
}
375375
}

examples/rigid_body_collision.html

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,11 @@ <h3>4. Time integration</h3>
464464
this.canvas.addEventListener("mousemove", this.mouseMove.bind(this), false);
465465
this.canvas.addEventListener("mouseup", this.mouseUp.bind(this), false);
466466
this.canvas.addEventListener("wheel", this.wheel.bind(this), false);
467+
// register touch event listeners (mobile / tablet)
468+
// passive:false is required so we can call preventDefault() to suppress scrolling
469+
this.canvas.addEventListener("touchstart", this.touchStart.bind(this), { passive: false });
470+
this.canvas.addEventListener("touchmove", this.touchMove.bind(this), { passive: false });
471+
this.canvas.addEventListener("touchend", this.touchEnd.bind(this), { passive: false });
467472
}
468473

469474
// set simulation parameters from GUI and start mainLoop
@@ -650,6 +655,61 @@ <h3>4. Time integration</h3>
650655
if (this.zoom < 1)
651656
this.zoom = 1;
652657
}
658+
659+
// Convert the first touch point to a plain {clientX, clientY} object
660+
// so it can be passed directly to the existing mouse handlers.
661+
getTouchClient(event)
662+
{
663+
const t = event.touches.length > 0 ? event.touches[0] : event.changedTouches[0];
664+
return { clientX: t.clientX, clientY: t.clientY };
665+
}
666+
667+
touchStart(event)
668+
{
669+
event.preventDefault();
670+
if (event.touches.length === 1)
671+
this.mouseDown({ which: 1, ...this.getTouchClient(event) });
672+
else if (event.touches.length === 2)
673+
this.lastPinchDist = this.getPinchDist(event);
674+
}
675+
676+
touchMove(event)
677+
{
678+
event.preventDefault();
679+
if (event.touches.length === 1)
680+
{
681+
this.lastPinchDist = null;
682+
this.mouseMove(this.getTouchClient(event));
683+
}
684+
else if (event.touches.length === 2)
685+
{
686+
// deselect any dragged particle while pinching
687+
this.selectedParticle = -1;
688+
const dist = this.getPinchDist(event);
689+
if (this.lastPinchDist !== null)
690+
{
691+
this.zoom += (dist - this.lastPinchDist) * 0.3;
692+
if (this.zoom < 1) this.zoom = 1;
693+
}
694+
this.lastPinchDist = dist;
695+
}
696+
}
697+
698+
touchEnd(event)
699+
{
700+
event.preventDefault();
701+
if (event.touches.length < 2)
702+
this.lastPinchDist = null;
703+
if (event.touches.length === 0)
704+
this.mouseUp(event);
705+
}
706+
707+
getPinchDist(event)
708+
{
709+
const dx = event.touches[0].clientX - event.touches[1].clientX;
710+
const dy = event.touches[0].clientY - event.touches[1].clientY;
711+
return Math.sqrt(dx*dx + dy*dy);
712+
}
653713
}
654714

655715
gui = new GUI();

0 commit comments

Comments
 (0)