import { OrthographicCamera, Scene, WebGLRenderer, WebGLRenderTarget, } from "three"; const pixelBuffer = new Uint8Array(4); export default function pickNodeIndex( event: MouseEvent, renderer: WebGLRenderer, pickingScene: Scene, camera: OrthographicCamera, pickingRenderTarget: WebGLRenderTarget ) { const rect = renderer.domElement.getBoundingClientRect(); // Convert from client coords to pixel coords in render target const x = ((event.clientX - rect.left) / rect.width) * pickingRenderTarget.width; const y = pickingRenderTarget.height - ((event.clientY - rect.top) / rect.height) * pickingRenderTarget.height; renderer.setRenderTarget(pickingRenderTarget); renderer.clear(); renderer.render(pickingScene, camera); renderer.readRenderTargetPixels( pickingRenderTarget, Math.floor(x), Math.floor(y), 1, 1, pixelBuffer ); renderer.setRenderTarget(null); const id = pixelBuffer[0] + pixelBuffer[1] * 256 + pixelBuffer[2] * 256 * 256; return id || -1; }