Open shsunmoonlee opened 5 years ago
// -- Firebase const Diagnostics = require("Diagnostics"); const Networking = require("Networking"); var Scene = require('Scene'); var Textures = require('Textures'); var FaceTracking = require('FaceTracking'); var Reactive = require('Reactive'); var Patches = require('Patches'); var FaceGestures = require('FaceGestures'); var Materials = require('Materials'); const Firebase = (function () { // -- Modules const D = require("Diagnostics"); const N = require("Networking"); // -- Public /** * Firebase class. * * @constructor * @param {String} url - The url of your realtime database. */ function Firebase(url) { this._url = url; this._isObserving = false; this._onUpdate = null; } /** * Update the realtime database and set the data as current value. */ Firebase.prototype.set = function(data) { let options = { method: 'PUT', body: JSON.stringify(data) } N.fetch(this._url, options).then(function(result) { if (!((result.status >= 200) && (result.status < 300))) { D.log("Failed to post data!"); } }); } /** * Update the realtime database and set the data as current value. */ Firebase.prototype.subscribe = function(onUpdate) { this._onUpdate = onUpdate; } /** * Start observing changes in your realtime database. */ Firebase.prototype.start = function() { this._isObserving = true; fetch.call(this); } /** * Stop observing changes in your realtime database. */ Firebase.prototype.stop = function() { this._isObserving = false; } /** * Get a description for debugging purposes. * * @return {String} */ Firebase.prototype.toString = function() { return 'Firebase("' + this._url + '")'; } // -- Private /** * Fetch realtime database once. */ function fetch() { const self = this; N.fetch(self._url).then(function(result) { if (self._isObserving) { fetch.call(self); } if ((result.status >= 200) && (result.status < 300)) { return result.json(); } throw new Error("HTTP status code " + result.status); }).then(function(json) { if (self._onUpdate != null) { self._onUpdate(json); } }).catch(function(error) { D.log("There was an issue with fetch operation: " + error.message); }); } // -- Export return Firebase; })(); // -- Modules // const S = require("Scene"); // const TG = require("TouchGestures"); // -- Constants // const URL = "https://ar-studio-hackathon.firebaseio.com/data.json"; const URL = "https://react-firebase-meal-ordering.firebaseio.com/.json" // -- Scene // const counterText = S.root.find("Counter Text"); // const decrementButton = S.root.find("Decrement Button"); // const incrementButton = S.root.find("Increment Button"); // -- Example // const D = require("Diagnostics"); var data = null; // this.data = null; var firebase = new Firebase(URL); firebase.subscribe(function(e) { data = e; // Diagnostics.log(data) // counterText.text = `${data.counter}`; }); firebase.start(); // var state = { // user1: { // sequences: [ // { expression: 'eyebrowUp', time: 1.5 }, // { expression: 'smile', time: 3 }, // { expression: 'frown', time: 5 }, // { expression: 'mouthOpen', time: 7 }, // ], // score: 10, // } // } // // firebase.set({counter: 6, seunghun: 1, array: ['hi', 'hello']}) // firebase.set({counter: 6, seunghun: 1, array: ['hi', 'hello']}) // TG.onTap(decrementButton).subscribe(function(e) { // data.counter = data.counter - 1; // firebase.set(data); // }); // // TG.onTap(incrementButton).subscribe(function(e) { // data.counter = data.counter + 1; // firebase.set(data); // }); var face = FaceTracking.face(0); var FacialExpressions = { leftBlink : 0, rightBlink : 1, shake : 2, openMouth : 3, raisedBrows : 4 } var arrayLimit = 5; var clientExpressionsArray = new Array(); var serverExpressionsArray = [ FacialExpressions.leftBlink, FacialExpressions.rightBlink, FacialExpressions.openMouth,FacialExpressions.openMouth, FacialExpressions.leftBlink]; var hasNodded = false; var hasCompared = false; FaceGestures.onNod(face).subscribe(function() { if (hasNodded == false) { hasNodded = true; Diagnostics.log('RECORDING'); //YOU ARE RECORDING NOW! } }); FaceGestures.hasMouthOpen(face).monitor().subscribe(function(changedValue) { if (changedValue.newValue) { RecordToArray(FacialExpressions.openMouth, clientExpressionsArray); } }); FaceGestures.hasEyebrowsRaised(face).monitor().subscribe(function(changedValue) { if (changedValue.newValue) { RecordToArray(FacialExpressions.raisedBrows, clientExpressionsArray); } }); FaceGestures.hasLeftEyeClosed(face).monitor().subscribe(function(changedValue) { if (changedValue.newValue) { RecordToArray(FacialExpressions.leftBlink, clientExpressionsArray); } }); FaceGestures.hasRightEyeClosed(face).monitor().subscribe(function(changedValue) { if (changedValue.newValue) { RecordToArray(FacialExpressions.rightBlink, clientExpressionsArray); } }); FaceGestures.onShake(face).subscribe(function() { RecordToArray(FacialExpressions.shake, clientExpressionsArray); }); function arr_diff (a1, a2) { var a = [], diff = []; for (var i = 0; i < a1.length; i++) { a[a1[i]] = true; } for (var i = 0; i < a2.length; i++) { if (a[a2[i]]) { delete a[a2[i]]; } else { a[a2[i]] = true; } } for (var k in a) { diff.push(k); } return diff; } var ID = function () { // Math.random should be unique because of its seeding algorithm. // Convert it to base 36 (numbers + letters), and grab the first 9 characters // after the decimal. return '_' + Math.random().toString(36).substr(2, 9); }; function RecordToArray(expressionType, array) { if (hasNodded == true && hasCompared == false) { if (array.length < arrayLimit) { array.push(expressionType); Diagnostics.log('FaceExpression is : ' + Object.keys(FacialExpressions)[expressionType]); } else { hasCompared = true; var arraysAreSame = true; for (var i = 0; i < arrayLimit; i++) { Diagnostics.log(serverExpressionsArray[i] + ' :s compared to c: ' + clientExpressionsArray[i] + ' on index : ' + i); if (serverExpressionsArray[i] != clientExpressionsArray[i]) { arraysAreSame = false; } } if (arraysAreSame == true) { Diagnostics.log('Same'); } else { Diagnostics.log('Different'); } Diagnostics.log('Limit reached '); var prevState = data Diagnostics.log(prevState) var incorrectSequences = arr_diff(clientExpressionsArray, prevState).length // var users = []; // if(prevState.users) { // users = [ ... prevState.users] // } else { // users = ['user0'] // } var state = { // sequences: [ {expression: 0, time: 0}, {expression: 1, time: 0}, {expression: 2, time: 0}, {expression: 3, time: 0}, {expression: 4, time: 0} ], sequences: [ 0,1,2,3,4 ], // users: prevState.users ? [ ... prevState.users, `user${ prevState.users.length}`] : [ 'user0'], [`user-${ID()}`]: { sequences: clientExpressionsArray, score: 100 - 20* incorrectSequences, } } firebase.set(Object.assign(prevState, state)) } } } // var FacialExpressions = { leftBlink : 0, rightBlink : 1, shake : 2, openMouth : 3, raisedBrows : 4 } // var clientExpressionsArray = new Array(); ClearSprites(); SetSpritesFromArray(); function SetSpritesFromArray() { var i = 0; data.sequences.forEach(element => { switch(element){ case FacialExpressions.leftBlink: SetSpriteToMaterial(i, "181019_Emojis_WinkLeft"); // Patches.setPulseValue("ShowLeftBlink", Reactive.once()); break; case FacialExpressions.rightBlink: SetSpriteToMaterial(i, "181019_Emojis_WinkRight"); // Patches.setPulseValue("ShowRightBlink", Reactive.once()); break; case FacialExpressions.shake: SetSpriteToMaterial(i, "181019_Emojis_ShakeNewer"); // Patches.setPulseValue("ShowShake", Reactive.once()); break; case FacialExpressions.openMouth: SetSpriteToMaterial(i, "181019_Emojis_Woooow"); // Patches.setPulseValue("ShowOpenMouth", Reactive.once()); break; case FacialExpressions.raisedBrows: SetSpriteToMaterial(i, "181019_Emojis-RaiseBrows"); break; } i++; }); } function SetSpriteToMaterial(i, y){ switch(i){ case 0: Materials.get("ExpressionOne").diffuse = Textures.get(y); break; case 1: Materials.get("ExpressionTwo").diffuse = Textures.get(y); break; case 2: Materials.get("ExpressionThree").diffuse = Textures.get(y); break; case 3: Materials.get("ExpressionFour").diffuse = Textures.get(y); break; case 4: Materials.get("ExpressionFive").diffuse = Textures.get(y); break; default: } }; function ClearSprites() { Materials.get("ExpressionOne").diffuse = Textures.get("OnePixel"); Materials.get("ExpressionTwo").diffuse = Textures.get("OnePixel"); Materials.get("ExpressionThree").diffuse = Textures.get("OnePixel"); Materials.get("ExpressionFour").diffuse = Textures.get("OnePixel"); Materials.get("ExpressionFive").diffuse = Textures.get("OnePixel"); };
properties
ar-studio-hackathon.firebaseio.com,https://react-firebase-meal-ordering.firebaseio.com/,https://react-firebase-meal-ordering.firebaseio.com/data.json,react-firebase-meal-ordering.firebaseio.com,react-firebase-meal-ordering.firebaseio.com/data.json
DuplicateHotAiR.zip Bitte!
Archive.zip
DuplicateHotAiR 2.zip Alsjeblieft!