in packages/core/gsi/src/polaris/PolarisGSI.ts [302:373]
private _initPointerEvents() {
if (!this.getProp('enablePointer')) return
const element = this.view.html.element
element.addEventListener('contextmenu', (e) => {
e.preventDefault()
})
const onClick = (e: MouseEvent) => {
if (this.getProp('enablePicking')) {
const bbox = element.getBoundingClientRect()
const left = bbox.left
const top = bbox.top
const canvasCoords = { x: e.x - left, y: e.y - top }
this._handlePointerEvent(canvasCoords, 'pick')
}
}
element.addEventListener('click', onClick)
this.addEventListener('dispose', () => {
element.removeEventListener('click', onClick)
})
// Use flag & timer to prevent [touchend, mousemove] linked events triggering
let isTouched = false
let lastTouchedTime = 0
element.addEventListener('touchstart', () => (isTouched = true))
element.addEventListener('touchend', () => {
isTouched = false
lastTouchedTime = this.timeline.currentTime
})
//
let isMouseDown = false
element.addEventListener('mousedown', () => (isMouseDown = true))
element.addEventListener('mouseup', () => (isMouseDown = false))
//
let viewChangeTime = this.timeline.currentTime
this.addEventListener('viewChange', () => {
viewChangeTime = this.timeline.currentTime
})
// Throttle the hover reaction
const mouseMoveHandler = throttle(
this.timeline.frametime,
(e) => {
// Disable hover when:
// 1. device has been touched
// 2. mouse has been pressed
// 3. camera stable frames < N (default 2)
// 4. lastTouchedTime < M (default 500ms)
if (
this.getProp('enablePicking') &&
isTouched === false &&
isMouseDown === false &&
this.timeline.currentTime - viewChangeTime > this.timeline.frametime * 2 &&
this.timeline.currentTime - lastTouchedTime > 500 // TODO: remove hardcode
) {
const bbox = element.getBoundingClientRect()
const left = bbox.left
const top = bbox.top
const canvasCoords = { x: e.x - left, y: e.y - top }
this._handlePointerEvent(canvasCoords, 'hover')
}
},
this
)
element.addEventListener('mousemove', mouseMoveHandler)
this.addEventListener('dispose', () => {
element.removeEventListener('mousemove', mouseMoveHandler)
})
}