UNPKG

mylingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

46 lines (38 loc) 1.43 kB
import { Raycaster, Object3D } from "three" import StaticObjectManager from ".." import { MouseEventName, mouseEvents } from "../../../../api/mouse" import { scaleUp } from "../../../../engine/constants" import { LingoMouseEvent } from "../../../../interface/IMouse" import { getCameraRendered } from "../../../../states/useCameraRendered" import { vec2Point } from "../../../utils/vec2Point" const raycaster = new Raycaster() raycaster.firstHitOnly = true export const raycast = (x: number, y: number, candidates: Set<Object3D>) => { raycaster.setFromCamera({ x, y }, getCameraRendered()) return raycaster.intersectObjects([...candidates])[0] } type Then = (obj: StaticObjectManager, e: LingoMouseEvent) => void export default ( name: MouseEventName | Array<MouseEventName>, candidates: Set<Object3D>, then: Then ) => mouseEvents.on(name, (e) => { if (!candidates.size) return const result = raycast(e.xNorm, e.yNorm, candidates) if (!result) return const point = vec2Point(result.point) const distance = result.distance * scaleUp then( result.object.userData.manager, new LingoMouseEvent( e.clientX, e.clientY, e.xNorm, e.yNorm, point, distance, result.object.userData.manager ) ) })