Files
junisaber/src/components/raycaster-target.js

59 lines
1.8 KiB
JavaScript

/**
* Set raycast target as a child independnent from entity.
* Useful for padding the raycast target of a mesh without changing the mesh.
*/
AFRAME.registerComponent('raycaster-target', {
schema: {
bindToggle: {default: ''},
depth: {type: 'number'},
height: {type: 'number'},
position: {type: 'vec3', default: {x: 0, y: 0, z: 0}},
rotation: {type: 'vec3', default: {x: 0, y: 0, z: 0}},
useBoxTarget: {default: false},
width: {type: 'number'}
},
init: (function () {
var boxGeometry = {primitive: 'box'};
var planeGeometry = {primitive: 'plane'};
return function () {
var data = this.data;
var el = this.el;
var geometry;
var raycastTarget;
raycastTarget = document.createElement('a-entity');
raycastTarget.classList.add('raycasterTarget');
if (data.bindToggle) {
raycastTarget.setAttribute('bind-toggle__raycastable', data.bindToggle);
} else {
raycastTarget.setAttribute('data-raycastable', '');
}
if (data.useBoxTarget) {
// 3D target.
geometry = boxGeometry;
geometry.depth = data.depth;
geometry.height = data.height;
geometry.width = data.width;
} else {
// 2D target.
geometry = planeGeometry;
geometry.height = data.height;
geometry.width = data.width;
}
raycastTarget.setAttribute('geometry', geometry);
raycastTarget.object3D.visible = false;
raycastTarget.object3D.position.copy(data.position);
raycastTarget.object3D.rotation.x = THREE.Math.degToRad(data.rotation.x);
raycastTarget.object3D.rotation.y = THREE.Math.degToRad(data.rotation.y);
raycastTarget.object3D.rotation.z = THREE.Math.degToRad(data.rotation.z);
el.appendChild(raycastTarget);
};
})()
});