Resolve WES-90 "Integrate signpredictor in courses"
This commit is contained in:
committed by
Jerome Coudron
parent
1a75791d62
commit
746906294b
@@ -4,7 +4,9 @@
|
||||
"references": [
|
||||
"Unity.TextMeshPro",
|
||||
"AccountsScripts",
|
||||
"InterfacesScripts"
|
||||
"InterfacesScripts",
|
||||
"SignPredictor",
|
||||
"Tween"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
|
||||
123
Assets/Courses/Scripts/Feedback.cs
Normal file
123
Assets/Courses/Scripts/Feedback.cs
Normal file
@@ -0,0 +1,123 @@
|
||||
//using Mediapipe.Unity.Tutorial;
|
||||
using Mediapipe.Unity.Tutorial;
|
||||
using System.Collections;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
// for your own scripts make sure to add the following line:
|
||||
using DigitalRuby.Tween;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace Assets.Courses.Scripts
|
||||
{
|
||||
public class Feedback : MonoBehaviour
|
||||
{
|
||||
/// <summary>
|
||||
/// Reference to the feedback field
|
||||
/// </summary>
|
||||
public TMP_Text feedback;
|
||||
|
||||
/// <summary>
|
||||
/// Reference to the sign predictor
|
||||
/// </summary>
|
||||
public Wesign_extractor signPredictor;
|
||||
|
||||
/// <summary>
|
||||
/// Reference to the TemplateCourse
|
||||
/// </summary>
|
||||
public TemplateCourse templateCourse;
|
||||
|
||||
/// <summary>
|
||||
/// Reference to the progress bar
|
||||
/// </summary>
|
||||
public GameObject progress;
|
||||
|
||||
/// <summary>
|
||||
/// Start is called before the first frame update
|
||||
/// </summary>
|
||||
void Start()
|
||||
{
|
||||
// Start the coroutine to update the scale every 200 milliseconds
|
||||
StartCoroutine(UpdateFeedback());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// UpdateScale updates the progress bar every 200ms, updated the feedback text, and progress bar color
|
||||
/// If a high enough accuracy is detected, it will go to the next sign
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
IEnumerator UpdateFeedback()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
// Get current sign
|
||||
char currentSign = (char)(65 + templateCourse.GetWordIndex());
|
||||
//Debug.Log(currentSign);
|
||||
// Get the predicted sign
|
||||
if (signPredictor != null && signPredictor.letterProbabilities != null && signPredictor.letterProbabilities.ContainsKey(currentSign))
|
||||
{
|
||||
int accuracy = (int)(signPredictor.letterProbabilities[currentSign] * 100);
|
||||
if (accuracy > 98)
|
||||
{
|
||||
feedback.text = "Perfect!!!";
|
||||
feedback.color = Color.green;
|
||||
progress.GetComponent<Image>().color = Color.green;
|
||||
}
|
||||
else if (accuracy > 95)
|
||||
{
|
||||
feedback.text = "Super!";
|
||||
feedback.color = Color.green;
|
||||
progress.GetComponent<Image>().color = Color.green;
|
||||
}
|
||||
else if (accuracy > 90)
|
||||
{
|
||||
feedback.text = "Goed";
|
||||
feedback.color = Color.green;
|
||||
progress.GetComponent<Image>().color = Color.green;
|
||||
}
|
||||
else if (accuracy > 80)
|
||||
{
|
||||
feedback.text = "Bijna...";
|
||||
feedback.color = new Color(0xFF, 0xE5, 0x00);
|
||||
progress.GetComponent<Image>().color = new Color(0xFF, 0xE5, 0x00);
|
||||
}
|
||||
else
|
||||
{
|
||||
feedback.text = "Detecteren ...";
|
||||
feedback.color = Color.red;
|
||||
progress.GetComponent<Image>().color = Color.red;
|
||||
}
|
||||
// use an exponential scale
|
||||
float newScale = Mathf.Exp(((float)accuracy / 24.5f) - 4);
|
||||
Vector3 newScaleVector = new Vector3(newScale,
|
||||
progress.transform.localScale.y,
|
||||
progress.transform.localScale.z);
|
||||
System.Action<ITween<Vector3>> updateProgressScale = (t) =>
|
||||
{
|
||||
if (progress != null)
|
||||
{
|
||||
progress.transform.localScale = t.CurrentValue;
|
||||
}
|
||||
|
||||
};
|
||||
progress.Tween("ScaleProgress", progress.transform.localScale, newScaleVector, 0.2f, TweenScaleFunctions.CubicEaseInOut, updateProgressScale);
|
||||
|
||||
if (accuracy > 90)
|
||||
{
|
||||
// Wait and go to next sign
|
||||
yield return new WaitForSeconds(1);
|
||||
templateCourse.NextSign();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
progress.transform.localScale = new Vector3(0f, progress.transform.localScale.y, progress.transform.localScale.z);
|
||||
//Debug.Log("doesn't contain A");
|
||||
}
|
||||
|
||||
// Wait for 200 milliseconds before updating the scale again
|
||||
yield return new WaitForSeconds(0.2f);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/Courses/Scripts/Feedback.cs.meta
Normal file
11
Assets/Courses/Scripts/Feedback.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 44e682a32ee15cc489bf50f3a06f717b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -29,10 +29,6 @@ public class TemplateCourse : MonoBehaviour
|
||||
/// </summary>
|
||||
public Button feedback;
|
||||
|
||||
/// <summary>
|
||||
/// This is a reference to the PANEL that holds the feedbackwindow
|
||||
/// </summary>
|
||||
public GameObject feedbackPopup;
|
||||
|
||||
/// <summary>
|
||||
/// This is a reference to the textfield that holds the part of the feedback-window that will change: bad/good/excellent
|
||||
@@ -134,15 +130,15 @@ public class TemplateCourse : MonoBehaviour
|
||||
void Awake()
|
||||
{
|
||||
// Setting up Webcam
|
||||
feedbackPopup.SetActive(false);
|
||||
if (WebCamTexture.devices.Length > 0)
|
||||
{
|
||||
WebCamDevice device = WebCamTexture.devices[camdex];
|
||||
tex = new WebCamTexture(device.name);
|
||||
webcamDisplay.texture = tex;
|
||||
// feedbackPopup.SetActive(false);
|
||||
//if (WebCamTexture.devices.Length > 0)
|
||||
//{
|
||||
// WebCamDevice device = WebCamTexture.devices[camdex];
|
||||
// tex = new WebCamTexture(device.name);
|
||||
// webcamDisplay.texture = tex;
|
||||
|
||||
tex.Play();
|
||||
}
|
||||
// tex.Play();
|
||||
//}
|
||||
|
||||
// Setting up course
|
||||
course = courselist.courses[courselist.currentCourseIndex];
|
||||
@@ -160,6 +156,9 @@ public class TemplateCourse : MonoBehaviour
|
||||
}
|
||||
userList.Save();
|
||||
|
||||
// Force the videoplayer to add bars to preserve aspect ratio
|
||||
player.aspectRatio = VideoAspectRatio.FitInside;
|
||||
|
||||
// Setup UI
|
||||
button.image.sprite = pauseSprite;
|
||||
title.text = course.name;
|
||||
@@ -305,9 +304,9 @@ public class TemplateCourse : MonoBehaviour
|
||||
/// <param name="sceneName"> The path for the scene you want to travel to, assuming root-directory is Assets</param>
|
||||
public void Back()
|
||||
{
|
||||
webcamDisplay.texture = null;
|
||||
tex.Stop();
|
||||
tex = null;
|
||||
//webcamDisplay.texture = null;
|
||||
//tex.Stop();
|
||||
//tex = null;
|
||||
|
||||
SystemController.GetInstance().BackToPreviousScene();
|
||||
}
|
||||
@@ -316,27 +315,34 @@ public class TemplateCourse : MonoBehaviour
|
||||
/// This function toggles between inactivity and activity for the popup panel.
|
||||
/// This will be changed later when the model gets integrated, probably being timed to dissapear.
|
||||
/// </summary>
|
||||
public void ShowFeedback()
|
||||
//public void ShowFeedback()
|
||||
//{
|
||||
// if (feedbackPopup.activeSelf)
|
||||
// {
|
||||
// dynamic.text = "";
|
||||
// feedbackPopup.SetActive(false);
|
||||
// return;
|
||||
// }
|
||||
// double index = UnityEngine.Random.value;
|
||||
// if (index < 0.5)
|
||||
// {
|
||||
// dynamic.text = "Poor";
|
||||
// }
|
||||
// else if (index > 0.8)
|
||||
// {
|
||||
// dynamic.text = "Excellent";
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// dynamic.text = "Good";
|
||||
// }
|
||||
// feedbackPopup.SetActive(true);
|
||||
//}
|
||||
|
||||
// Get currentWordIndex
|
||||
public int GetWordIndex()
|
||||
{
|
||||
if (feedbackPopup.activeSelf)
|
||||
{
|
||||
dynamic.text = "";
|
||||
feedbackPopup.SetActive(false);
|
||||
return;
|
||||
}
|
||||
double index = UnityEngine.Random.value;
|
||||
if (index < 0.5)
|
||||
{
|
||||
dynamic.text = "Poor";
|
||||
}
|
||||
else if (index > 0.8)
|
||||
{
|
||||
dynamic.text = "Excellent";
|
||||
}
|
||||
else
|
||||
{
|
||||
dynamic.text = "Good";
|
||||
}
|
||||
feedbackPopup.SetActive(true);
|
||||
return currentWordIndex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user