From 29523e290e5933f5711b9066488c4f65829a27ee Mon Sep 17 00:00:00 2001 From: Kevin Ngo Date: Fri, 20 Jul 2018 15:42:47 +0200 Subject: [PATCH] finish keyboard pass --- assets/img/keyboard/sk-basic.png | Bin 0 -> 77429 bytes package-lock.json | 35 +++++++ package.json | 1 + src/components/controller.js | 109 +++++++++++++++++++++ src/components/keyboard-raycastable.js | 12 +-- src/components/search.js | 6 ++ src/index.html | 6 +- src/index.js | 1 + src/state/index.js | 127 +++++++++---------------- src/templates/menu.html | 34 +------ src/templates/ui.html | 25 ----- webpack.config.js | 7 +- 12 files changed, 211 insertions(+), 152 deletions(-) create mode 100644 assets/img/keyboard/sk-basic.png create mode 100644 src/components/controller.js delete mode 100644 src/templates/ui.html diff --git a/assets/img/keyboard/sk-basic.png b/assets/img/keyboard/sk-basic.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9e55f313341a8eab6376fb8275e13359c7e97e GIT binary patch literal 77429 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 NJ9M@uZawh#{{fzfG}-_F literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 24e39a6..876a41d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -151,6 +151,36 @@ "aframe": "github:aframevr/aframe#2afb6ac191f1a44edbbfe6f0e733380356a9e0c8" } }, + "aframe-super-keyboard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aframe-super-keyboard/-/aframe-super-keyboard-2.0.0.tgz", + "integrity": "sha512-GYRMEm0mu8QO1+x0BawM1dMedlzlGidivtsvOxo3MVUnwJTrnE4TokzOP7PxO+IO5Zxl7VDTcloJ/vEskm/ZUQ==", + "requires": { + "uglify-js": "^3.3.23", + "uglifyjs": "^2.4.11" + }, + "dependencies": { + "commander": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.16.0.tgz", + "integrity": "sha512-sVXqklSaotK9at437sFlFpyOcJonxe0yST/AG9DkQKUdIE6IqGIMv4SfAQSKaJbSdVEJYItASCrBiVQHq1HQew==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "uglify-js": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.5.tgz", + "integrity": "sha512-Fm52gLqJqFBnT+Sn411NPDnsgaWiYeRLw42x7Va/mS8TKgaepwoGY7JLXHSEef3d3PmdFXSz1Zx7KMLL89E2QA==", + "requires": { + "commander": "~2.16.0", + "source-map": "~0.6.1" + } + } + } + }, "agentkeepalive": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", @@ -10230,6 +10260,11 @@ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", "optional": true }, + "uglifyjs": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/uglifyjs/-/uglifyjs-2.4.11.tgz", + "integrity": "sha1-NEDWTgRXWViVJEGOtkHGi7kNET4=" + }, "uglifyjs-webpack-plugin": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", diff --git a/package.json b/package.json index 3381d05..c420aa5 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "aframe-proxy-event-component": "^1.1.1", "aframe-slice9-component": "^1.0.0", "aframe-state-component": "^4.1.0", + "aframe-super-keyboard": "^2.0.0", "algoliasearch": "^3.29.0", "ansi-html": "0.0.7", "autoprefixer": "^7.2.3", diff --git a/src/components/controller.js b/src/components/controller.js new file mode 100644 index 0000000..e7cb217 --- /dev/null +++ b/src/components/controller.js @@ -0,0 +1,109 @@ +var handData = { + right: {hand: 'right', model: false}, + left: {hand: 'left', model: false}, +}; + +/** + * Controller visuals. + */ +AFRAME.registerComponent('controller', { + schema: { + hand: {type: 'string'}, + menuActive: {default: true} + }, + + init: function() { + var data = this.data; + var el = this.el; + + this.controllerType = ''; + + el.addEventListener('object3dset', evt => { + var mesh; + if (evt.detail.type !== 'mesh') { return; } + if (this.controllerType) { + this.setControllerRotation(); + } + }); + + // Set controllers. + // TODO: Add controller model. + el.setAttribute('geometry', {primitive: 'box', width: 0.05, depth: 0.05, height: 0.05}); + el.setAttribute('oculus-touch-controls', handData[data.hand]); + el.setAttribute('vive-controls', handData[data.hand]); + el.setAttribute('windows-motion-controls', handData[data.hand]); + + el.addEventListener('controllerconnected', evt => { + this.controllerConnected = true; + this.controllerType = evt.detail.name; + if (this.el.getObject3D('mesh')) { this.setControllerRotation(); } + if (data.hand === 'left') { return; } + const controllerConfig = this.config[this.controllerType]; + el.setAttribute('raycaster', controllerConfig.raycaster || {}); + el.setAttribute('cursor', controllerConfig.cursor || {}); + el.setAttribute('line', {opacity: 0.75, color: 'pink'}); + }); + }, + + /** + * TODO: Adjust rotation depending on controller type. + */ + setControllerRotation: function() { + var el = this.el; + mesh = el.getObject3D('mesh'); + if (this.controllerType === 'vive-controls') { + mesh.rotation.x = THREE.Math.degToRad(90); + mesh.rotation.y = THREE.Math.degToRad(this.data.hand === 'left' ? -90 : 90); + mesh.rotation.z = THREE.Math.degToRad(180); + } else { + mesh.rotation.y = THREE.Math.degToRad(180); + } + }, + + update: function() { + var data = this.data; + var el = this.el; + if (data.hand === 'left') { return; } + if (this.controllerConnected) { + el.setAttribute('raycaster', 'enabled', data.menuActive); + el.setAttribute('raycaster', 'showLine', data.menuActive); + } + }, + + config: { + 'oculus-touch-controls': { + cursor: { + downEvents: [ + 'triggerdown', + 'gripdown', + 'abuttondown', + 'bbuttondown', + 'xbuttondown', + 'ybuttondown', + ], + upEvents: [ + 'triggerup', + 'gripup', + 'abuttonup', + 'bbuttonup', + 'xbuttonup', + 'ybuttonup', + ], + }, + }, + + 'vive-controls': { + cursor: { + downEvents: ['trackpaddown', 'triggerdown', 'gripdown'], + upEvents: ['trackpadup', 'triggerup', 'gripup'], + }, + }, + + 'windows-motion-controls': { + cursor: { + downEvents: ['trackpaddown', 'triggerdown', 'gripdown'], + upEvents: ['trackpadup', 'triggerup', 'gripup'], + }, + } + } +}); diff --git a/src/components/keyboard-raycastable.js b/src/components/keyboard-raycastable.js index 50543fd..6e385ec 100644 --- a/src/components/keyboard-raycastable.js +++ b/src/components/keyboard-raycastable.js @@ -1,10 +1,8 @@ AFRAME.registerComponent('keyboard-raycastable', { - play: function() { - var els; - var i; - els = this.el.querySelectorAll('*'); - for (i = 0; i < els.length; i++) { - els[i].setAttribute('bind-toggle__raycastable', 'isSearchScreen'); - } + dependencies: ['super-keyboard'], + + play: function () { + // TODO: bind-toggle__raycastable for when search is activated. + this.el.components['super-keyboard'].kbImg.setAttribute('raycastable', ''); }, }); diff --git a/src/components/search.js b/src/components/search.js index 47566ea..ecea022 100644 --- a/src/components/search.js +++ b/src/components/search.js @@ -7,6 +7,7 @@ var index = client.initIndex('supersaber'); /** * Search (including the initial list of popular searches). + * Attached to super-keyboard. */ AFRAME.registerComponent('search', { init: function() { @@ -17,6 +18,10 @@ AFRAME.registerComponent('search', { this.search(''); }, + superkeyboardchange: bindEvent(function (evt) { + this.search(evt.detail.value); + }), + search: function (query) { this.queryObject.query = query; index.search(this.queryObject, (err, content) => { @@ -35,6 +40,7 @@ AFRAME.registerComponent('search-result', { this.audio = new Audio(); this.audio.currentTime = el.getAttribute('data-preview-start-time'); this.audio.src = utils.getS3FileUrl(el.getAttribute('data-id'), 'song.ogg'); + this.audio.volume = 0.5; this.eventDetail = {}; }, diff --git a/src/index.html b/src/index.html index 42becd0..e559fbb 100644 --- a/src/index.html +++ b/src/index.html @@ -15,7 +15,7 @@ console-shortcuts search> - + @@ -37,8 +37,8 @@ - - + + diff --git a/src/index.js b/src/index.js index 7e44dfe..2709819 100644 --- a/src/index.js +++ b/src/index.js @@ -12,6 +12,7 @@ require('aframe-particle-system-component'); require('aframe-proxy-event-component'); require('aframe-state-component'); require('aframe-slice9-component'); +require('aframe-super-keyboard'); requireAll(require.context('./components/', true, /\.js$/)); requireAll(require.context('./state/', true, /\.js$/)); diff --git a/src/state/index.js b/src/state/index.js index 569da69..6123ced 100644 --- a/src/state/index.js +++ b/src/state/index.js @@ -4,117 +4,66 @@ AFRAME.registerState({ initialState: { challenge: { id: AFRAME.utils.getUrlParameter('challenge'), - isLoading: false, - loadingText: '' + isLoading: false }, discoLightsOn: true, discotube: {speedX: -0.05, speedY: -0.1}, - featuredPanelShowing: !hasInitialChallenge, inVR: false, - isChallengeScreen: hasInitialChallenge, - isFeaturedScreen: !hasInitialChallenge, - isSearchScreen: false, maxStreak: 0, menuActive: true, - playButtonShowing: hasInitialChallenge, playButtonText: 'Play', score: 0, scoreText: '', - screen: hasInitialChallenge ? 'challenge' : 'featured', + // screen: keep track of layers or depth. Like breadcrumbs. + screen: hasInitialChallenge ? 'challenge' : 'home', screenHistory: [], searchResults: [], streak: 0 }, handlers: { - /** - * Update search results. Will automatically render using `bind-for` (menu.html). - */ - searchresults: function (state, payload) { - var i; - state.searchResults.length = 0; - for (i = 0; i < 6; i++) { - state.searchResults.push(payload.results[i]); - } - }, - - setscreen: function (state, payload) { - console.log('setscreen: ' + payload.screen); - if (state.screen === payload.screen) { - return; - } - switch (payload.screen) { - case 'challenge': - case 'featured': - case 'search': - state.screenHistory.push(state.screen); - state.screen = payload.screen; - break; - default: - console.log('Unknown screen set: ' + payload.screen); - } - }, - - popscreen: function (state, payload) { - var prevScreen = state.screenHistory.pop(); - if (!prevScreen) { - return; - } - state.screen = prevScreen; - console.log('popscreen: ' + state.screen); - }, - - challengeloaded: function (state, payload) { + beatloaderfinish: function (state, payload) { state.challenge.isLoading = false; - state.isLoadingFrames = false; - state.isLoadingPunches = false; - state.score = 0; }, - challengeloadstart: function (state, payload) { + beatloaderstart: function (state, payload) { state.challenge.isLoading = true; }, - challengeloadingframes: function (state, payload) { - state.challenge.isLoadingPunches = false; - state.challenge.isLoadingFrames = true; - }, - - challengeloadingpunches: function (state, payload) { - state.challenge.isLoadingPunches = true; - state.challenge.isLoadingFrames = false; - }, - challengeset: function (state, payload) { state.challenge.id = payload.challengeId; state.score = 0; state.streak = 0; state.maxStreak = 0; state.menuActive = false; - - this.setscreen(state, {screen: 'challenge'}); + setScreen(state, 'challenge'); }, playbuttonclick: function (state) { state.menuActive = false; }, - searchblur: function (state) { - this.popscreen(state); - }, - - searchfocus: function (state) { - this.setscreen(state, {screen: 'search'}); - }, - - togglemenu: function (state) { - state.menuActive = !state.menuActive; + /** + * Update search results. Will automatically render using `bind-for` (menu.html). + */ + searchresults: function (state, payload) { + var i; + state.searchResults.length = 0; + for (i = 0; i < 6; i++) { + if (!payload.results[i]) { continue; } + state.searchResults.push(payload.results[i]); + } + state.searchResults.__dirty = true; }, togglediscolights: function (state, payload) { state.discoLightsOn = !state.discoLightsOn; }, + togglemenu: function (state) { + state.menuActive = !state.menuActive; + }, + 'enter-vr': function (state, payload) { state.inVR = true; }, @@ -126,16 +75,28 @@ AFRAME.registerState({ computeState: function (state) { state.scoreText = `Streak: ${state.streak} / Max Streak: ${state.maxStreak} / Score: ${state.score}`; - state.isFeaturedScreen = state.screen === 'featured'; - state.isSearchScreen = state.screen === 'search'; - state.isChallengeScreen = state.screen === 'challenge'; - - state.featuredPanelShowing = state.isFeaturedScreen || (state.isChallengeScreen && state.menuActive); - - if (state.challenge.isLoading) { - state.loadingText = 'Loading challenge...'; - } else { - state.loadingText = ''; - } } }); + +/** + * Push screen onto history and set to current. + */ +function setScreen (state, screen) { + if (state.screen === screen) { return; } + state.screenHistory.push(screen); + state.screen = screen; +} + +/** + * Pop screen off history. + * Set new current screen if any. + */ +function popScreen (state) { + var prevScreen; + prevScreen = state.screenHistory.pop(); + if (state.screenHistory.length === 0) { + state.screen = ''; + return; + } + state.screen = state.screenHistory[state.screenHistory.length - 1]; +} diff --git a/src/templates/menu.html b/src/templates/menu.html index 83470fc..c96852c 100644 --- a/src/templates/menu.html +++ b/src/templates/menu.html @@ -34,25 +34,9 @@ - + + + - - - {{ searchResults() }} diff --git a/src/templates/ui.html b/src/templates/ui.html deleted file mode 100644 index 2a890c5..0000000 --- a/src/templates/ui.html +++ /dev/null @@ -1,25 +0,0 @@ -{% macro searchresult (featured) %} - - - - - - - - - - - -{% endmacro %} diff --git a/webpack.config.js b/webpack.config.js index 6d7c577..a83901a 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -10,11 +10,12 @@ var webpack = require('webpack'); var nunjucks = Nunjucks.configure(path.resolve(__dirname, 'src'), { noCache: true, }); +nunjucks.addGlobal('DEBUG_KEYBOARD', !!process.env.DEBUG_KEYBOARD); nunjucks.addGlobal('HOST', ip.address()); +nunjucks.addGlobal('IS_PRODUCTION', process.env.NODE_ENV === 'production'); // Initial Nunjucks render. -var context = {IS_PRODUCTION: process.env.NODE_ENV === 'production'}; -fs.writeFileSync('index.html', nunjucks.render('index.html', context)); +fs.writeFileSync('index.html', nunjucks.render('index.html')); // For development, watch HTML for changes to compile Nunjucks. // The production Express server will handle Nunjucks by itself. @@ -24,7 +25,7 @@ if (process.env.NODE_ENV !== 'production') { return; } try { - fs.writeFileSync('index.html', nunjucks.render('index.html', context)); + fs.writeFileSync('index.html', nunjucks.render('index.html')); } catch (e) { console.error(e); }