private _initPointerEvents()

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)
		})
	}