-
Brian Peiris authoredBrian Peiris authored
hoverable-visuals.js 2.52 KiB
const interactorOneTransform = [];
const interactorTwoTransform = [];
/**
* Applies effects to a hoverable based on hover state.
* @namespace interactables
* @component hoverable-visuals
*/
AFRAME.registerComponent("hoverable-visuals", {
schema: {
cursorController: { type: "selector" },
enableSweepingEffect: { type: "boolean", default: true }
},
init() {
// uniforms and boundingSphere are set from the component responsible for loading the mesh.
this.uniforms = null;
this.boundingSphere = new THREE.Sphere();
this.sweepParams = [0, 0];
},
remove() {
this.uniforms = null;
this.boundingBox = null;
},
tick(time) {
if (!this.uniforms || !this.uniforms.size) return;
const { hoverers } = this.el.components["hoverable"];
let interactorOne, interactorTwo;
for (const hoverer of hoverers) {
if (hoverer.id === "player-left-controller") {
interactorOne = hoverer.object3D;
} else if (hoverer.id === "cursor") {
if (this.data.cursorController.components["cursor-controller"].enabled) {
interactorTwo = hoverer.object3D;
}
} else {
interactorTwo = hoverer.object3D;
}
}
if (interactorOne) {
interactorOne.matrixWorld.toArray(interactorOneTransform);
}
if (interactorTwo) {
interactorTwo.matrixWorld.toArray(interactorTwoTransform);
}
if (interactorOne || interactorTwo) {
const worldY = this.el.object3D.matrixWorld.elements[13];
const scaledRadius = this.el.object3D.scale.y * this.boundingSphere.radius;
this.sweepParams[0] = worldY - scaledRadius;
this.sweepParams[1] = worldY + scaledRadius;
}
for (const uniform of this.uniforms.values()) {
uniform.hubs_EnableSweepingEffect.value = this.data.enableSweepingEffect;
uniform.hubs_SweepParams.value = this.sweepParams;
uniform.hubs_HighlightInteractorOne.value = !!interactorOne;
uniform.hubs_InteractorOnePos.value[0] = interactorOneTransform[12];
uniform.hubs_InteractorOnePos.value[1] = interactorOneTransform[13];
uniform.hubs_InteractorOnePos.value[2] = interactorOneTransform[14];
uniform.hubs_HighlightInteractorTwo.value = !!interactorTwo;
uniform.hubs_InteractorTwoPos.value[0] = interactorTwoTransform[12];
uniform.hubs_InteractorTwoPos.value[1] = interactorTwoTransform[13];
uniform.hubs_InteractorTwoPos.value[2] = interactorTwoTransform[14];
if (interactorOne || interactorTwo) {
uniform.hubs_Time.value = time;
}
}
}
});