diff --git a/assets/img/beam.png b/assets/img/beam.png
new file mode 100644
index 0000000..b3cf1aa
Binary files /dev/null and b/assets/img/beam.png differ
diff --git a/package-lock.json b/package-lock.json
index e039bd4..d02125e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -95,9 +95,9 @@
"integrity": "sha512-mVxIH5qjik3qnbmeuXnYWFyKkcdLdZEQIFIFky1Z3QY8gZFsbCgocImwAx9UV9DTsIywa/lt3nXyNrpgOQgNCg=="
},
"aframe-audioanalyser-component": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/aframe-audioanalyser-component/-/aframe-audioanalyser-component-4.0.0.tgz",
- "integrity": "sha512-piyQ6Ui8AmojGEWUx1LpsX2K7R0WiUzeehea699mAf3oE+BxGyDPNlFvi0ti3t9cdhj6ybvySu7xKRZ3f4llyA=="
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/aframe-audioanalyser-component/-/aframe-audioanalyser-component-4.0.1.tgz",
+ "integrity": "sha512-jTkt9umD4SoRmW6vlJfm2zG9fV8pzecNzTdJYn12w8hpZ0lp3BtFSKqTDy0RE3dqAsDJo9AU72niZAu8w3NeeA=="
},
"aframe-cubemap-component": {
"version": "0.1.4",
diff --git a/src/components/beams.js b/src/components/beams.js
new file mode 100644
index 0000000..63001ea
--- /dev/null
+++ b/src/components/beams.js
@@ -0,0 +1,62 @@
+AFRAME.registerComponent('beams', {
+ schema: {
+ poolSize: {default: 10}
+ },
+ init: function () {
+ var redMaterial;
+ var blueMaterial;
+ var materialOptions;
+ var geo;
+ var beam;
+
+ this.redBeams = [];
+ this.blueBeams = [];
+ this.currentRed = 0;
+ this.currentBlue = 0;
+
+ materialOptions = {
+ color: 0xaa3333,
+ map: new THREE.TextureLoader().load('assets/img/beam.png'),
+ transparent: true,
+ blending: THREE.AdditiveBlending
+ };
+ redMaterial = new THREE.MeshBasicMaterial(materialOptions);
+ materialOptions.color = 0x4444cc;
+ blueMaterial = new THREE.MeshBasicMaterial(materialOptions);
+ geo = new THREE.PlaneBufferGeometry(0.4, 50).translate(0, 25, 0);
+
+ for (var j = 0; j < 2; j++) {
+ for (var i = 0; i < this.data.poolSize; i++) {
+ beam = new THREE.Mesh(geo, j === 0 ? redMaterial : blueMaterial);
+ beam.visible = false;
+ this.el.object3D.add(beam);
+ this[j === 0 ? 'redBeams' : 'blueBeams'].push(beam);
+ }
+ }
+ },
+
+ newBeam: function (color, position) {
+ var beam;
+ if (color === 'red') {
+ beam = this.redBeams[this.currentRed];
+ this.currentRed = (this.currentRed + 1) % this.redBeams.length;
+ beam.position.set(position.x, position.y, position.z + this.currentRed / 50.0); // z offset to avoid z-fighting
+ } else {
+ beam = this.blueBeams[this.currentBlue];
+ this.currentBlue = (this.currentBlue + 1) % this.blueBeams.length;
+ beam.position.set(position.x, position.y, position.z + this.currentBlue / 50.0);
+ }
+
+ beam.visible = true;
+ beam.scale.x = 1;
+
+ AFRAME.anime({
+ targets: beam.scale,
+ x: 0,
+ duration: 300,
+ easing: 'easeInCubic',
+ complete: (anim) => { beam.visible = false; }
+ });
+ }
+
+});
\ No newline at end of file
diff --git a/src/components/beat-loader.js b/src/components/beat-loader.js
index c619bce..259b068 100644
--- a/src/components/beat-loader.js
+++ b/src/components/beat-loader.js
@@ -15,6 +15,10 @@ AFRAME.registerComponent('beat-loader', {
horizontalPositions: [-0.60, -0.25, 0.25, 0.60],
verticalPositions: [1.00, 1.35, 1.70],
+ init: function () {
+ this.beams = document.getElementById('beams').components['beams'];
+ },
+
update: function () {
if (!this.data.challengeId || !this.data.difficulty) { return; }
this.loadBeats();
@@ -122,6 +126,8 @@ AFRAME.registerComponent('beat-loader', {
el.object3D.rotation.z = THREE.Math.degToRad(this.orientations[noteInfo._cutDirection]);
el.play();
+ this.beams.newBeam(color, el.object3D.position);
+
if (this.first) { return; }
this.first = {
diff --git a/src/index.html b/src/index.html
index b5d2963..8b5ffae 100644
--- a/src/index.html
+++ b/src/index.html
@@ -18,9 +18,9 @@
effect-bloom="strength: 1"
intro-song
overlay="objects: #menu, #keyboard, #rightHand, #leftHand, [mixin~='cursorMesh']"
- pool__beat-arrow-blue="mixin: beat arrow-blue-beat; size: 5; container: #beatContainer"
- pool__beat-arrow-red="mixin: beat arrow-red-beat; size: 10; container: #beatContainer"
- pool__beat-dot-blue="mixin: beat dot-blue-beat; size: 10; container: #beatContainer"
+ pool__beat-arrow-blue="mixin: beat arrow-blue-beat; size: 5; container: #beatContainer"
+ pool__beat-arrow-red="mixin: beat arrow-red-beat; size: 10; container: #beatContainer"
+ pool__beat-dot-blue="mixin: beat dot-blue-beat; size: 10; container: #beatContainer"
pool__beat-dot-red="mixin: beat dot-red-beat; size: 10; container: #beatContainer"
proxy-event="event: menuchallengeselect; to: #searchResultsContainer, #menuDifficultiesGroup"
search
@@ -49,6 +49,7 @@
+
diff --git a/src/templates/stage.html b/src/templates/stage.html
index 143f1bc..1e8335b 100644
--- a/src/templates/stage.html
+++ b/src/templates/stage.html
@@ -49,6 +49,8 @@
+
+