UNPKG

@pmndrs/handle

Version:

framework agnostic expandable handle implementation for threejs

47 lines (46 loc) 2.12 kB
import { BufferGeometry, Float32BufferAttribute, LineBasicMaterial, LineSegments, Mesh, MeshBasicMaterial, OctahedronGeometry, Quaternion, } from 'three'; import { handleXRayMaterialProperties } from '../material.js'; const quaternionHelper = new Quaternion(); export function setupTranslateHandleDelta(group, context) { const startMesh = new Mesh(new OctahedronGeometry(0.01, 2), new MeshBasicMaterial(handleXRayMaterialProperties)); startMesh.renderOrder = Infinity; startMesh.visible = false; group.add(startMesh); const endMesh = new Mesh(new OctahedronGeometry(0.01, 2), new MeshBasicMaterial(handleXRayMaterialProperties)); endMesh.renderOrder = Infinity; endMesh.visible = false; group.add(endMesh); const geometry = new BufferGeometry(); geometry.setAttribute('position', new Float32BufferAttribute([0, 0, 0, 1, 1, 1], 3)); const lineSegments = new LineSegments(geometry, new LineBasicMaterial(handleXRayMaterialProperties)); lineSegments.renderOrder = Infinity; lineSegments.visible = false; group.add(lineSegments); const unsubscribe = context.subscribeApply((_, state) => { endMesh.position.set(0, 0, 0); startMesh.position.copy(state.initial.position).sub(state.current.position); const target = context.getTarget(); if (target != null) { quaternionHelper.copy(target.quaternion).invert(); startMesh.position.applyQuaternion(quaternionHelper); } lineSegments.position.set(0, 0, 0); lineSegments.scale.copy(startMesh.position); //show/hide objects startMesh.visible = !state.last; lineSegments.visible = !state.last; endMesh.visible = !state.last; }); return () => { startMesh.geometry.dispose(); startMesh.material.dispose(); endMesh.geometry.dispose(); endMesh.material.dispose(); lineSegments.geometry.dispose(); lineSegments.material.dispose(); group.remove(startMesh); group.remove(endMesh); group.remove(lineSegments); unsubscribe(); }; }