shsunmoonlee / SparkAR-HotAir

0 stars 0 forks source link

Final Version for the presentation #5

Open shsunmoonlee opened 5 years ago

shsunmoonlee commented 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");

    };
shsunmoonlee commented 5 years ago

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

patrickscheper commented 5 years ago

DuplicateHotAiR.zip Bitte!

LauraMazgaj commented 5 years ago

Archive.zip

patrickscheper commented 5 years ago

DuplicateHotAiR 2.zip Alsjeblieft!