diff --git a/assets/models/neons.obj b/assets/models/neons.obj
new file mode 100644
index 0000000..605ea74
--- /dev/null
+++ b/assets/models/neons.obj
@@ -0,0 +1,68 @@
+# Blender v2.79 (sub 0) OBJ File: 'neons.blend'
+# www.blender.org
+o neon_Cube.002
+v 4.475000 0.625000 18.000004
+v 4.475000 0.675000 18.000004
+v 4.475000 0.625000 -81.999992
+v 4.475000 0.675000 -81.999992
+v 4.525000 0.625000 18.000004
+v 4.525000 0.675000 18.000004
+v 4.525000 0.625000 -81.999992
+v 4.525000 0.675000 -81.999992
+v 3.475000 0.625000 -6.999996
+v 3.475000 0.675000 -6.999996
+v 3.475000 0.625000 -56.999996
+v 3.475000 0.675000 -56.999996
+v 3.525000 0.625000 -6.999996
+v 3.525000 0.675000 -6.999996
+v 3.525000 0.625000 -56.999996
+v 3.525000 0.675000 -56.999996
+v -4.475000 0.625000 18.000004
+v -4.475000 0.675000 18.000004
+v -4.475000 0.625000 -81.999992
+v -4.475000 0.675000 -81.999992
+v -4.525000 0.625000 18.000004
+v -4.525000 0.675000 18.000004
+v -4.525000 0.625000 -81.999992
+v -4.525000 0.675000 -81.999992
+v -3.475000 0.625000 -6.999996
+v -3.475000 0.675000 -6.999996
+v -3.475000 0.625000 -56.999996
+v -3.475000 0.675000 -56.999996
+v -3.525000 0.625000 -6.999996
+v -3.525000 0.675000 -6.999996
+v -3.525000 0.625000 -56.999996
+v -3.525000 0.675000 -56.999996
+s off
+f 2 3 1
+f 8 5 7
+f 7 1 3
+f 4 6 8
+f 10 11 9
+f 16 13 15
+f 15 9 11
+f 12 14 16
+f 19 18 17
+f 21 24 23
+f 17 23 19
+f 22 20 24
+f 27 26 25
+f 29 32 31
+f 25 31 27
+f 30 28 32
+f 2 4 3
+f 8 6 5
+f 7 5 1
+f 4 2 6
+f 10 12 11
+f 16 14 13
+f 15 13 9
+f 12 10 14
+f 19 20 18
+f 21 22 24
+f 17 21 23
+f 22 18 20
+f 27 28 26
+f 29 30 32
+f 25 29 31
+f 30 26 28
diff --git a/assets/models/tunnel.obj b/assets/models/tunnel.obj
new file mode 100644
index 0000000..07ddefd
--- /dev/null
+++ b/assets/models/tunnel.obj
@@ -0,0 +1,228 @@
+# Blender v2.79 (sub 0) OBJ File: 'neons.blend'
+# www.blender.org
+o tunnel_tunnel.001
+v -19.994535 0.145583 -13.462321
+v -20.733458 0.242623 -13.182165
+v -19.994535 0.145583 -13.828139
+v -20.733458 0.242623 -14.108295
+v 19.994537 -0.145587 -13.462318
+v 20.733459 -0.242600 -13.182168
+v 19.994537 -0.145587 -13.828142
+v 20.733459 -0.242600 -14.108293
+v 0.145584 19.994537 -13.462320
+v 0.242609 20.733471 -13.182167
+v 0.145584 19.994537 -13.828140
+v 0.242609 20.733471 -14.108294
+v -0.145584 -19.994539 -13.462319
+v -0.242609 -20.733444 -13.182167
+v -0.145584 -19.994539 -13.828141
+v -0.242609 -20.733444 -14.108294
+v -19.994535 0.145583 -22.723623
+v -20.733458 0.242623 -22.443466
+v -19.994535 0.145583 -23.089441
+v -20.733458 0.242623 -23.369598
+v 19.994537 -0.145587 -22.723621
+v 20.733459 -0.242600 -22.443470
+v 19.994537 -0.145587 -23.089443
+v 20.733459 -0.242600 -23.369595
+v 0.145584 19.994537 -22.723621
+v 0.242609 20.733471 -22.443470
+v 0.145584 19.994537 -23.089443
+v 0.242609 20.733471 -23.369595
+v -0.145584 -19.994539 -22.723621
+v -0.242609 -20.733444 -22.443470
+v -0.145584 -19.994539 -23.089443
+v -0.242609 -20.733444 -23.369595
+v -19.994535 0.145583 -31.984924
+v -20.733458 0.242623 -31.704769
+v -19.994535 0.145583 -32.350742
+v -20.733458 0.242623 -32.630898
+v 19.994537 -0.145587 -31.984924
+v 20.733459 -0.242600 -31.704773
+v 19.994537 -0.145587 -32.350746
+v 20.733459 -0.242600 -32.630898
+v 0.145584 19.994537 -31.984924
+v 0.242609 20.733471 -31.704769
+v 0.145584 19.994537 -32.350742
+v 0.242609 20.733471 -32.630898
+v -0.145584 -19.994539 -31.984924
+v -0.242609 -20.733444 -31.704769
+v -0.145584 -19.994539 -32.350746
+v -0.242609 -20.733444 -32.630898
+v -19.994535 0.145583 -41.246227
+v -20.733458 0.242623 -40.966072
+v -19.994535 0.145583 -41.612045
+v -20.733458 0.242623 -41.892200
+v 19.994537 -0.145587 -41.246223
+v 20.733459 -0.242600 -40.966072
+v 19.994537 -0.145587 -41.612045
+v 20.733459 -0.242600 -41.892197
+v 0.145584 19.994537 -41.246223
+v 0.242609 20.733471 -40.966072
+v 0.145584 19.994537 -41.612045
+v 0.242609 20.733471 -41.892200
+v -0.145584 -19.994539 -41.246223
+v -0.242609 -20.733444 -40.966072
+v -0.145584 -19.994539 -41.612045
+v -0.242609 -20.733444 -41.892200
+s off
+f 1 4 3
+f 4 11 3
+f 9 2 1
+f 11 1 3
+f 4 10 12
+f 15 8 16
+f 5 8 7
+f 13 6 5
+f 13 7 15
+f 6 16 8
+f 7 12 8
+f 11 10 12
+f 5 10 9
+f 5 11 7
+f 10 8 12
+f 14 15 13
+f 16 3 15
+f 1 14 13
+f 3 13 15
+f 16 2 4
+f 18 19 17
+f 20 27 19
+f 25 18 17
+f 27 17 19
+f 20 26 28
+f 31 24 32
+f 21 24 23
+f 29 22 21
+f 29 23 31
+f 24 30 32
+f 23 28 24
+f 25 28 27
+f 21 26 25
+f 21 27 23
+f 26 24 28
+f 30 31 29
+f 32 19 31
+f 17 30 29
+f 19 29 31
+f 32 18 20
+f 34 35 33
+f 36 43 35
+f 41 34 33
+f 43 33 35
+f 36 42 44
+f 47 40 48
+f 37 40 39
+f 45 38 37
+f 45 39 47
+f 38 48 40
+f 39 44 40
+f 41 44 43
+f 37 42 41
+f 37 43 39
+f 42 40 44
+f 46 47 45
+f 48 35 47
+f 33 46 45
+f 35 45 47
+f 48 34 36
+f 50 51 49
+f 52 59 51
+f 57 50 49
+f 59 49 51
+f 52 58 60
+f 63 56 64
+f 53 56 55
+f 61 54 53
+f 61 55 63
+f 54 64 56
+f 55 60 56
+f 57 60 59
+f 53 58 57
+f 53 59 55
+f 58 56 60
+f 62 63 61
+f 64 51 63
+f 49 62 61
+f 51 61 63
+f 64 50 52
+f 1 2 4
+f 4 12 11
+f 9 10 2
+f 11 9 1
+f 4 2 10
+f 15 7 8
+f 5 6 8
+f 13 14 6
+f 13 5 7
+f 6 14 16
+f 7 11 12
+f 11 9 10
+f 5 6 10
+f 5 9 11
+f 10 6 8
+f 14 16 15
+f 16 4 3
+f 1 2 14
+f 3 1 13
+f 16 14 2
+f 18 20 19
+f 20 28 27
+f 25 26 18
+f 27 25 17
+f 20 18 26
+f 31 23 24
+f 21 22 24
+f 29 30 22
+f 29 21 23
+f 24 22 30
+f 23 27 28
+f 25 26 28
+f 21 22 26
+f 21 25 27
+f 26 22 24
+f 30 32 31
+f 32 20 19
+f 17 18 30
+f 19 17 29
+f 32 30 18
+f 34 36 35
+f 36 44 43
+f 41 42 34
+f 43 41 33
+f 36 34 42
+f 47 39 40
+f 37 38 40
+f 45 46 38
+f 45 37 39
+f 38 46 48
+f 39 43 44
+f 41 42 44
+f 37 38 42
+f 37 41 43
+f 42 38 40
+f 46 48 47
+f 48 36 35
+f 33 34 46
+f 35 33 45
+f 48 46 34
+f 50 52 51
+f 52 60 59
+f 57 58 50
+f 59 57 49
+f 52 50 58
+f 63 55 56
+f 53 54 56
+f 61 62 54
+f 61 53 55
+f 54 62 64
+f 55 59 60
+f 57 58 60
+f 53 54 58
+f 53 57 59
+f 58 54 56
+f 62 64 63
+f 64 52 51
+f 49 50 62
+f 51 49 61
+f 64 62 50
diff --git a/assets/models/tunnelneon.obj b/assets/models/tunnelneon.obj
new file mode 100644
index 0000000..e724563
--- /dev/null
+++ b/assets/models/tunnelneon.obj
@@ -0,0 +1,132 @@
+# Blender v2.79 (sub 0) OBJ File: 'neons.blend'
+# www.blender.org
+o tunnelneon
+v 11.925084 7.848577 -13.610518
+v 7.848576 11.925085 -13.610518
+v 11.925084 7.848577 -13.710936
+v 7.848576 11.925085 -13.710936
+v 11.972422 7.895914 -13.610518
+v 7.895913 11.972423 -13.610518
+v 11.972422 7.895914 -13.710936
+v 7.895913 11.972423 -13.710936
+v -11.925084 7.848576 -13.610518
+v -7.848577 11.925083 -13.610518
+v -11.925084 7.848576 -13.710936
+v -7.848577 11.925083 -13.710936
+v -11.972423 7.895913 -13.610518
+v -7.895913 11.972422 -13.610518
+v -11.972423 7.895913 -13.710936
+v -7.895913 11.972422 -13.710936
+v 11.925084 7.848577 -22.869068
+v 7.848576 11.925085 -22.869068
+v 11.925084 7.848577 -22.969488
+v 7.848576 11.925085 -22.969488
+v 11.972422 7.895914 -22.869068
+v 7.895913 11.972423 -22.869068
+v 11.972422 7.895914 -22.969488
+v 7.895913 11.972423 -22.969488
+v -11.925084 7.848576 -22.869068
+v -7.848577 11.925083 -22.869068
+v -11.925084 7.848576 -22.969488
+v -7.848577 11.925083 -22.969488
+v -11.972423 7.895913 -22.869068
+v -7.895913 11.972422 -22.869068
+v -11.972423 7.895913 -22.969488
+v -7.895913 11.972422 -22.969488
+v 11.925084 7.848577 -32.127625
+v 7.848576 11.925085 -32.127625
+v 11.925084 7.848577 -32.228039
+v 7.848576 11.925085 -32.228039
+v 11.972422 7.895914 -32.127625
+v 7.895913 11.972423 -32.127625
+v 11.972422 7.895914 -32.228039
+v 7.895913 11.972423 -32.228039
+v -11.925084 7.848576 -32.127625
+v -7.848577 11.925083 -32.127625
+v -11.925084 7.848576 -32.228039
+v -7.848577 11.925083 -32.228039
+v -11.972423 7.895913 -32.127625
+v -7.895913 11.972422 -32.127625
+v -11.972423 7.895913 -32.228039
+v -7.895913 11.972422 -32.228039
+v 11.925084 7.848577 -41.386173
+v 7.848576 11.925085 -41.386173
+v 11.925084 7.848577 -41.486595
+v 7.848576 11.925085 -41.486595
+v 11.972422 7.895914 -41.386173
+v 7.895913 11.972423 -41.386173
+v 11.972422 7.895914 -41.486595
+v 7.895913 11.972423 -41.486595
+v -11.925084 7.848576 -41.386173
+v -7.848577 11.925083 -41.386173
+v -11.925084 7.848576 -41.486595
+v -7.848577 11.925083 -41.486595
+v -11.972423 7.895913 -41.386173
+v -7.895913 11.972422 -41.386173
+v -11.972423 7.895913 -41.486595
+v -7.895913 11.972422 -41.486595
+s off
+f 2 3 1
+f 4 7 3
+f 8 5 7
+f 6 1 5
+f 11 10 9
+f 15 12 11
+f 13 16 15
+f 9 14 13
+f 18 19 17
+f 20 23 19
+f 24 21 23
+f 22 17 21
+f 27 26 25
+f 31 28 27
+f 29 32 31
+f 25 30 29
+f 34 35 33
+f 36 39 35
+f 40 37 39
+f 38 33 37
+f 43 42 41
+f 47 44 43
+f 45 48 47
+f 41 46 45
+f 50 51 49
+f 52 55 51
+f 56 53 55
+f 54 49 53
+f 59 58 57
+f 63 60 59
+f 61 64 63
+f 57 62 61
+f 2 4 3
+f 4 8 7
+f 8 6 5
+f 6 2 1
+f 11 12 10
+f 15 16 12
+f 13 14 16
+f 9 10 14
+f 18 20 19
+f 20 24 23
+f 24 22 21
+f 22 18 17
+f 27 28 26
+f 31 32 28
+f 29 30 32
+f 25 26 30
+f 34 36 35
+f 36 40 39
+f 40 38 37
+f 38 34 33
+f 43 44 42
+f 47 48 44
+f 45 46 48
+f 41 42 46
+f 50 52 51
+f 52 56 55
+f 56 54 53
+f 54 50 49
+f 59 60 58
+f 63 64 60
+f 61 62 64
+f 57 58 62
diff --git a/src/components/beat-loader.js b/src/components/beat-loader.js
index 432081e..5b098aa 100644
--- a/src/components/beat-loader.js
+++ b/src/components/beat-loader.js
@@ -93,11 +93,19 @@ AFRAME.registerComponent('beat-loader', {
// Beats spawn ahead of the song and get to the user in sync with the music.
this.beatsTimeOffset = this.data.beatAnticipationTime * 1000;
this.beatsTime = 0;
-
this.beatData = beatData;
+ this.beatData._events.sort(lessThan);
this.beatData._obstacles.sort(lessThan);
this.beatData._notes.sort(lessThan);
this.bpm = this.beatData._beatsPerMinute;
+
+ // some events have negative time stamp to inicialize the stage
+ var events = this.beatData._events;
+ if (events.length && events[0]._time < 0) {
+ for (let i = 0; events[i]._time < 0; i++) {
+ this.generateEvent(events[i]);
+ }
+ }
console.log('Finished loading challenge data.');
},
@@ -109,6 +117,7 @@ AFRAME.registerComponent('beat-loader', {
var i;
var notes;
var obstacles;
+ var events;
var beatsTime = this.beatsTime;
var msPerBeat;
var noteTime;
@@ -123,6 +132,7 @@ AFRAME.registerComponent('beat-loader', {
notes = this.beatData._notes;
obstacles = this.beatData._obstacles;
+ events = this.beatData._events;
bpm = this.beatData._beatsPerMinute;
msPerBeat = 1000 * 60 / this.beatData._beatsPerMinute;
for (i = 0; i < notes.length; ++i) {
@@ -140,6 +150,14 @@ AFRAME.registerComponent('beat-loader', {
}
}
+ for (i=0; i < events.length; ++i) {
+ noteTime = events[i]._time * msPerBeat;
+ if (noteTime > beatsTime && noteTime <= beatsTime + delta) {
+ this.generateEvent(events[i]);
+ }
+ }
+
+
if (this.beatsTimeOffset !== undefined) {
if (this.beatsTimeOffset <= 0) {
this.el.sceneEl.emit('beatloaderpreloadfinish', null, false);
@@ -204,6 +222,34 @@ AFRAME.registerComponent('beat-loader', {
el.play();
},
+ generateEvent: function (event) {
+ console.log(event);
+ switch(event._type) {
+ case 0: // lasers color
+ case 1: // tunnel neon color
+ document.getElementById('tunnelNeon').setAttribute('colorPreset', event._value);
+ document.getElementById('tunnelNeon').emit('pulse');
+ break;
+ case 2: document.getElementById('leftStageLasers').setAttribute('colorPreset', event._value);
+ break;
+ case 3: document.getElementById('rightStageLasers').setAttribute('colorPreset', event._value);
+ break;
+ case 4:
+ document.getElementById('floor').emit('pulse');
+ document.getElementById('stageNeon').emit('pulse');
+ break;
+ case 8:
+ case 9: document.getElementById('twister').components.twister.pulse(event._value);
+ break;
+ case 12: document.getElementById('leftStageLasers').components['stage-lasers'].pulse(event._value);
+ console.log('left laser', event._value);
+ break;
+ case 13: document.getElementById('rightStageLasers').components['stage-lasers'].pulse(event._value);
+ console.log('right laser', event._value);
+ break;
+ }
+ },
+
requestBeat: function (type, color) {
var beatPoolName = 'pool__beat-' + type;
var pool;
diff --git a/src/components/stage-lasers.js b/src/components/stage-lasers.js
new file mode 100644
index 0000000..afb6c97
--- /dev/null
+++ b/src/components/stage-lasers.js
@@ -0,0 +1,33 @@
+AFRAME.registerComponent('stage-lasers', {
+ schema: {
+ enabled: {default: true}
+ },
+
+ init: function () {
+ this.speed = 0;
+ this.lasers = [
+ this.el.children[0].object3D,
+ this.el.children[1].object3D,
+ this.el.children[2].object3D
+ ];
+ },
+
+ pulse: function (speed) {
+ this.speed = speed / 3;
+ },
+
+ tick: function (time, delta) {
+ if (this.speed === 0) { return; }
+ delta /= 1000;
+ if (!this.data.enabled) {
+ this.speed *= 0.96;
+ if (Math.abs(this.speed) < 0.01) {
+ this.speed = 0;
+ return;
+ }
+ }
+ this.lasers[0].rotation.z += this.speed * delta;
+ this.lasers[1].rotation.z -= this.speed * delta * 1.04;
+ this.lasers[2].rotation.z += this.speed * delta * 1.1;
+ }
+})
\ No newline at end of file
diff --git a/src/components/twister.js b/src/components/twister.js
index c883263..6a7cea8 100644
--- a/src/components/twister.js
+++ b/src/components/twister.js
@@ -12,12 +12,14 @@ AFRAME.registerComponent('twister', {
init: function () {
this.currentTwist = 0;
this.animate = false;
- this.el.addEventListener('audioanalyserbeat', this.pulse.bind(this));
},
- pulse: function () {
+ pulse: function (twist) {
if (!this.data.enabled) { return; }
- this.el.setAttribute('twister', {twist: Math.random() * 0.5 - 0.25});
+ if (twist == 0) { twist = 0.1 + Math.random() * 0.25; }
+ else twist = Math.min(twist, 0.5);
+ twist *= Math.random() < 0.5 ? -1 : 1; // random direction
+ this.el.setAttribute('twister', {twist: twist});
},
update: function (oldData) {
diff --git a/src/index.html b/src/index.html
index 83a35bf..c37be95 100644
--- a/src/index.html
+++ b/src/index.html
@@ -55,6 +55,9 @@
+
+
+
diff --git a/src/templates/stage.html b/src/templates/stage.html
index 082708b..17c506d 100644
--- a/src/templates/stage.html
+++ b/src/templates/stage.html
@@ -11,7 +11,7 @@
id="audioAnalyser"
bind__audioanalyser="beatDetectionThrottle: menu.active && 5000 || 1000"
audioanalyser="src: #introSong; fftSize: 64; enableBeatDetection: true; enableLevels: false; enableWaveform: false; beatDetectionThrottle: 5000; unique: true"
- proxy-event="event: audioanalyserbeat; to: #logolight, #floor, #twister">
+ proxy-event="event: audioanalyserbeat; to: #logolight">
-
+
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+