lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
45 lines • 2.12 kB
JavaScript
import { Raycaster } from "three";
import { getManager } from "../display/core/utils/getManager";
import { actorPtrManagerMap } from "../collections/pxCollections";
import { assignPxVec, assignPxVec_ } from "../engine/physx/pxMath";
import { FAR, M2CM } from "../globals";
import { cameraRenderedPtr } from "../pointers/cameraRenderedPtr";
import { physxPtr } from "../pointers/physxPtr";
import computePerFrameWithData from "./utils/computePerFrameWithData";
import { pt3d0, vector2 } from "../display/utils/reusables";
import { vec2Point } from "../display/utils/vec2Point";
import Point3d from "../math/Point3d";
const raycaster = new Raycaster();
export const mouseRaycast = computePerFrameWithData((candidates, { additionalCandidate, x, y }) => {
raycaster.setFromCamera(vector2.set(x, y), cameraRenderedPtr[0]);
const candidateArray = [...candidates];
additionalCandidate && candidateArray.push(additionalCandidate);
const [intersection] = raycaster.intersectObjects(candidateArray, false);
const manager = intersection && getManager(intersection.object);
const pxHit = physxPtr[0].pxRaycast?.(assignPxVec(raycaster.ray.origin), assignPxVec_(raycaster.ray.direction), FAR);
if (pxHit) {
const pxHitManager = actorPtrManagerMap.get(pxHit.actor.ptr);
if (candidates.has(pxHitManager.object3d) &&
(!intersection ||
pxHit.distance < intersection.distance ||
(manager &&
"$loadedObject3d" in manager &&
manager.$loadedObject3d))) {
const { x, y, z } = pxHit.normal;
return {
point: vec2Point(pxHit.position),
distance: pxHit.distance * M2CM,
normal: new Point3d(x, y, z),
manager: pxHitManager
};
}
}
if (intersection)
return {
point: vec2Point(intersection.point),
distance: intersection.distance * M2CM,
normal: intersection.face?.normal ?? pt3d0,
manager: manager
};
});
//# sourceMappingURL=mouseRaycast.js.map