123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- (function(modules) {
-
- var installedModules = {};
-
- function __webpack_require__(moduleId) {
-
- if(installedModules[moduleId])
- return installedModules[moduleId].exports;
-
- var module = installedModules[moduleId] = {
- exports: {},
- id: moduleId,
- loaded: false
- };
-
- modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-
- module.loaded = true;
-
- return module.exports;
- }
-
- __webpack_require__.m = modules;
-
- __webpack_require__.c = installedModules;
-
- __webpack_require__.p = "";
-
- return __webpack_require__(0);
- })
- ([
- (function(module, exports) {
-
- if (typeof AFRAME === 'undefined') {
- throw new Error('Component attempted to register before AFRAME was available.');
- }
-
-
- var OBSERVER_CONFIG = {
- childList: true,
- attributes: true,
- subtree: true
- };
-
- AFRAME.registerComponent('aabb-collider', {
- schema: {
- collideNonVisible: {default: false},
- debug: {default: false},
- enabled: {default: true},
- interval: {default: 80},
- objects: {default: ''}
- },
- init: function () {
- this.centerDifferenceVec3 = new THREE.Vector3();
- this.clearedIntersectedEls = [];
- this.closestIntersectedEl = null;
- this.boundingBox = new THREE.Box3();
- this.boxCenter = new THREE.Vector3();
- this.boxHelper = new THREE.BoxHelper();
- this.boxMax = new THREE.Vector3();
- this.boxMin = new THREE.Vector3();
- this.hitClosestClearEventDetail = {};
- this.hitClosestEventDetail = {};
- this.intersectedEls = [];
- this.objectEls = [];
- this.newIntersectedEls = [];
- this.prevCheckTime = undefined;
- this.previousIntersectedEls = [];
- this.setDirty = this.setDirty.bind(this);
- this.observer = new MutationObserver(this.setDirty);
- this.dirty = true;
- this.hitStartEventDetail = {intersectedEls: this.newIntersectedEls};
- },
- play: function () {
- this.observer.observe(this.el.sceneEl, OBSERVER_CONFIG);
- this.el.sceneEl.addEventListener('object3dset', this.setDirty);
- this.el.sceneEl.addEventListener('object3dremove', this.setDirty);
- },
- remove: function () {
- this.observer.disconnect();
- this.el.sceneEl.removeEventListener('object3dset', this.setDirty);
- this.el.sceneEl.removeEventListener('object3dremove', this.setDirty);
- },
- tick: function (time) {
- var boxHelper;
- var boundingBox = this.boundingBox;
- var centerDifferenceVec3 = this.centerDifferenceVec3;
- var clearedIntersectedEls = this.clearedIntersectedEls;
- var closestCenterDifference;
- var newClosestEl;
- var intersectedEls = this.intersectedEls;
- var el = this.el;
- var i;
- var newIntersectedEls = this.newIntersectedEls;
- var objectEls = this.objectEls;
- var prevCheckTime = this.prevCheckTime;
- var previousIntersectedEls = this.previousIntersectedEls;
- var self = this;
- if (!this.data.enabled) { return; }
-
- if (prevCheckTime && (time - prevCheckTime < this.data.interval)) { return; }
-
- this.prevCheckTime = time;
- if (this.dirty) { this.refreshObjects(); }
-
- boundingBox.setFromObject(el.object3D);
- this.boxMin.copy(boundingBox.min);
- this.boxMax.copy(boundingBox.max);
- boundingBox.getCenter(this.boxCenter);
- if (this.data.debug) {
- this.boxHelper.setFromObject(el.object3D);
- if (!this.boxHelper.parent) { el.sceneEl.object3D.add(this.boxHelper); }
- }
- copyArray(previousIntersectedEls, intersectedEls);
-
- intersectedEls.length = 0;
- for (i = 0; i < objectEls.length; i++) {
- if (objectEls[i] === this.el) { continue; }
-
- if (!this.data.collideNonVisible && !objectEls[i].getAttribute('visible')) {
-
- if (this.data.debug) {
- boxHelper = objectEls[i].object3D.boxHelper;
- if (boxHelper) {
- el.sceneEl.object3D.remove(boxHelper);
- objectEls[i].object3D.boxHelper = null;
- }
- }
- continue;
- }
-
- if (this.isIntersecting(objectEls[i])) { intersectedEls.push(objectEls[i]); }
- }
-
- newIntersectedEls.length = 0;
- for (i = 0; i < intersectedEls.length; i++) {
- if (previousIntersectedEls.indexOf(intersectedEls[i]) === -1) {
- newIntersectedEls.push(intersectedEls[i]);
- }
- }
-
- clearedIntersectedEls.length = 0;
- for (i = 0; i < previousIntersectedEls.length; i++) {
- if (intersectedEls.indexOf(previousIntersectedEls[i]) !== -1) { continue; }
- if (!previousIntersectedEls[i].hasAttribute('aabb-collider')) {
- previousIntersectedEls[i].emit('hitend');
- }
- clearedIntersectedEls.push(previousIntersectedEls[i]);
- }
-
- for (i = 0; i < newIntersectedEls.length; i++) {
- if (newIntersectedEls[i] === this.el) { continue; }
- if (newIntersectedEls[i].hasAttribute('aabb-collider')) { continue; }
- newIntersectedEls[i].emit('hitstart');
- }
-
- for (i = 0; i < intersectedEls.length; i++) {
- if (intersectedEls[i] === this.el) { continue; }
- centerDifferenceVec3
- .copy(intersectedEls[i].object3D.boundingBoxCenter)
- .sub(this.boxCenter);
- if (closestCenterDifference === undefined ||
- centerDifferenceVec3.length() < closestCenterDifference) {
- closestCenterDifference = centerDifferenceVec3.length();
- newClosestEl = intersectedEls[i];
- }
- }
-
- if (!intersectedEls.length && this.closestIntersectedEl) {
-
- this.hitClosestClearEventDetail.el = this.closestIntersectedEl;
- this.closestIntersectedEl.emit('hitclosestclear');
- this.closestIntersectedEl = null;
- el.emit('hitclosestclear', this.hitClosestClearEventDetail);
- } else if (newClosestEl !== this.closestIntersectedEl) {
-
- if (this.closestIntersectedEl) {
- this.hitClosestClearEventDetail.el = this.closestIntersectedEl;
- this.closestIntersectedEl.emit('hitclosestclear', this.hitClosestClearEventDetail);
- }
- if (newClosestEl) {
-
- newClosestEl.emit('hitclosest');
- this.closestIntersectedEl = newClosestEl;
- this.hitClosestEventDetail.el = newClosestEl;
- el.emit('hitclosest', this.hitClosestEventDetail);
- }
- }
- if (clearedIntersectedEls.length) {
- el.emit('hitend');
- }
- if (newIntersectedEls.length) {
- el.emit('hitstart', this.hitStartEventDetail);
- }
- },
-
- isIntersecting: (function () {
- var boundingBox = new THREE.Box3();
- return function (el) {
- var isIntersecting;
- var boxHelper;
- var boxMin;
- var boxMax;
- boundingBox.setFromObject(el.object3D);
- if (this.data.debug) {
- if (!el.object3D.boxHelper) {
- el.object3D.boxHelper = new THREE.BoxHelper(
- el.object3D, new THREE.Color(Math.random(), Math.random(), Math.random()));
- el.sceneEl.object3D.add(el.object3D.boxHelper);
- }
- el.object3D.boxHelper.setFromObject(el.object3D);
- }
- boxMin = boundingBox.min;
- boxMax = boundingBox.max;
- el.object3D.boundingBoxCenter = el.object3D.boundingBoxCenter || new THREE.Vector3();
- boundingBox.getCenter(el.object3D.boundingBoxCenter);
- return (this.boxMin.x <= boxMax.x && this.boxMax.x >= boxMin.x) &&
- (this.boxMin.y <= boxMax.y && this.boxMax.y >= boxMin.y) &&
- (this.boxMin.z <= boxMax.z && this.boxMax.z >= boxMin.z);
- };
- })(),
-
- setDirty: function () {
- this.dirty = true;
- },
-
- refreshObjects: function () {
- var data = this.data;
-
- this.objectEls = data.objects
- ? this.el.sceneEl.querySelectorAll(data.objects)
- : this.el.sceneEl.children;
- this.dirty = false;
- }
- });
- function copyArray (dest, source) {
- var i;
- dest.length = 0;
- for (i = 0; i < source.length; i++) { dest[i] = source[i]; }
- }
- })
- ]);
|