@pmndrs/xr
Version:
VR/AR for threejs
37 lines (36 loc) • 1.62 kB
JavaScript
import { MeshBasicMaterial, } from 'three';
export class PointerRayMaterial extends MeshBasicMaterial {
constructor() {
super({ transparent: true, toneMapped: false });
}
onBeforeCompile(parameters, renderer) {
super.onBeforeCompile(parameters, renderer);
parameters.vertexShader = `varying float vFade;\n` + parameters.vertexShader;
parameters.vertexShader = parameters.vertexShader.replace(`#include <color_vertex>`, `#include <color_vertex>
vFade = position.z + 0.5;`);
parameters.fragmentShader = `varying float vFade;\n` + parameters.fragmentShader;
parameters.fragmentShader = parameters.fragmentShader.replace('#include <color_fragment>', `#include <color_fragment>
diffuseColor.a *= vFade;`);
}
}
export function updatePointerRayModel(mesh, material, pointer, options) {
const intersection = pointer.getIntersection();
if (!pointer.getEnabled() || intersection == null) {
mesh.visible = false;
return;
}
mesh.visible = true;
const color = typeof options.color === 'function' ? options.color(pointer) : options.color;
if (Array.isArray(color)) {
material.color.set(...color);
}
else {
material.color.set(color ?? 'white');
}
material.opacity = typeof options.opacity === 'function' ? options.opacity(pointer) : (options.opacity ?? 0.4);
const length = Math.min(options.maxLength ?? 1, intersection.distance);
mesh.position.z = -length / 2;
const size = options.size ?? 0.005;
mesh.scale.set(size, size, length);
mesh.updateMatrix();
}