Commit cc4de742076f2a578cb11669add67fcbd4da0fd1

Authored by Mateus Lustosa
1 parent dd84c126

Implements trie prefix getter and use in list manager

Assets/Scripts/Animation List/ListManager.cs
... ... @@ -18,10 +18,12 @@ public class ItemData {
18 18  
19 19 public class ListManager : MonoBehaviour {
20 20  
  21 + private PlayerManager manager;
  22 +
21 23 public GameObject sampleItemObject;
22 24 public GameObject sampleLoadingItemObject;
23 25  
24   - public string[] itemList;
  26 + public List<string> itemList;
25 27 private int index = 0;
26 28 private const int OFFSET = 20;
27 29 private int size = 0;
... ... @@ -38,10 +40,9 @@ public class ListManager : MonoBehaviour {
38 40  
39 41 private float itemHeight = 30F;
40 42  
41   - TrieST<string> trie;
42   -
43 43 void Start()
44 44 {
  45 + this.manager = this.gameObject.GetComponent<PlayerManager>();
45 46 this.scrollView.onValueChanged.AddListener(checkScrollPosition);
46 47 this.input.onValueChanged.AddListener(inputChanged);
47 48  
... ... @@ -61,35 +62,11 @@ public class ListManager : MonoBehaviour {
61 62  
62 63 public IEnumerator load()
63 64 {
64   - WWW www = new WWW("http://150.165.205.9/anims/sinais.txt");
65   - yield return www;
66   -
67   - string[] lines = new string[0];
68   -
69   - if (string.IsNullOrEmpty(www.error))
70   - {
71   - lines = System.Text.Encoding.UTF8.GetString(www.bytes, 0, www.bytes.Length).Split('\n');
72   - }
73   - else
74   - {
75   - TextAsset file = Resources.Load("sinais") as TextAsset;
76   - lines = System.Text.Encoding.UTF8.GetString(file.bytes, 0, file.bytes.Length).Split('\n');
77   - // lines = file.text.Split("\n"[0]);
78   - }
  65 + while (manager.signs == null) yield return new WaitForEndOfFrame();
79 66  
80   - this.trie = new TrieST<string>();
81   -
82   - foreach (string line in lines)
83   - {
84   - string word = line.Trim();
85   -
86   - if ( ! String.IsNullOrEmpty(word))
87   - this.trie.put(word, word);
88   - }
89   -
90   - this.itemList = getNamesByPrefix("");
  67 + this.itemList = this.manager.signs.StartsWith("");
91 68 this.index = 0;
92   - this.size = itemList.Length;
  69 + this.size = itemList.Count;
93 70  
94 71 populateList();
95 72 }
... ... @@ -102,9 +79,9 @@ public class ListManager : MonoBehaviour {
102 79  
103 80 public void inputChanged(string text)
104 81 {
105   - this.itemList = getNamesByPrefix(text.ToUpper());
  82 + this.itemList = this.manager.signs.StartsWith(text.ToUpper());
106 83 this.index = 0;
107   - this.size = itemList.Length;
  84 + this.size = itemList.Count;
108 85  
109 86 this.contentPanel.DetachChildren();
110 87 foreach(GameObject go in GameObject.FindGameObjectsWithTag("clone"))
... ... @@ -145,10 +122,4 @@ public class ListManager : MonoBehaviour {
145 122 this.index = last;
146 123 }
147 124  
148   - private string[] getNamesByPrefix(string prefix)
149   - {
150   - Queue<string> names = this.trie.keysWithPrefix(prefix);
151   - return names.ToArray();
152   - }
153   -
154 125 }
... ...
Assets/Scripts/Player Manager/GenericPlayerManager.cs
... ... @@ -49,8 +49,6 @@ public abstract class GenericPlayerManager : MonoBehaviour {
49 49  
50 50 // Guarda os nomes das palavras já carregadas
51 51 private HashSet<string> loadedAssetBundles = new HashSet<string>();
52   - // Guarda os nomes das palavras que não tem assetbundle
53   - private HashSet<string> nonexistentAssetBundles = new HashSet<string>();
54 52  
55 53 // Fila de animações para reprodução
56 54 // Utilizada para alterar velocidade e apresentar a legenda
... ... @@ -476,32 +474,17 @@ public abstract class GenericPlayerManager : MonoBehaviour {
476 474  
477 475 Queue<ToPlay> toPlayQueue = new Queue<ToPlay>();
478 476 toPlayQueue.Enqueue(new ToPlay(Subtitle.TYPE_NONE, DEFAULT_ANIMATION, "", this));
479   -
480   - /*WWW checkConnectionRequest = getCheckConnectionRequest();
481   - bool connected = false;
482   -
483   - while ( ! checkConnectionRequest.isDone)
484   - yield return checkConnectionRequest;
485   -
486   - if (checkConnectionRequest.responseHeaders.Count > 0)
487   - {
488   - PlayerLogger.Log(checkConnectionRequest.responseHeaders["STATUS"]);
489   - connected = checkConnectionRequest.responseHeaders["STATUS"].Contains("404");
490   - }
491   - else PlayerLogger.Log("No response headers.");*/
492   -
493   - bool connected = true;
  477 +
494 478 bool playingStarted = false;
495 479  
496 480 String[] stringPos = gloss.Split(' ');
497 481 foreach (string aniName in stringPos)
498 482 {
499 483 if (String.IsNullOrEmpty(aniName)) continue;
500   -
501   - bool nonexistent = nonexistentAssetBundles.Contains(aniName);
  484 +
502 485 bool loaded = loadedAssetBundles.Contains(aniName);
503 486  
504   - if ( ! nonexistent && ! loaded && connected)
  487 + if ( ! loaded)
505 488 {
506 489 WWW bundleRequest = loadAssetBundle(aniName);
507 490  
... ... @@ -533,8 +516,6 @@ public abstract class GenericPlayerManager : MonoBehaviour {
533 516 else PlayerLogger.Log("GPM", "L", "Sign \"" + aniName + "\" wasn't loaded successfuly.");
534 517 }
535 518 else PlayerLogger.Log("GPM", "L", "Bundle \"" + aniName + "\" wasn't loaded successfuly.");
536   -
537   - if ( ! loaded) nonexistentAssetBundles.Add(aniName);
538 519 }
539 520 else
540 521 {
... ...
Assets/Scripts/PlayerManager.cs
... ... @@ -8,6 +8,7 @@ using System.Threading;
8 8 using LAViD.Utils;
9 9 using LAViD.Structures;
10 10 using System.Diagnostics;
  11 +using System.Collections.Generic;
11 12  
12 13 public class PlayerManager : GenericPlayerManager {
13 14  
... ... @@ -23,8 +24,6 @@ public class PlayerManager : GenericPlayerManager {
23 24 private const string SERVER_URL = "http://traducao.vlibras.gov.br/translate?text=";
24 25 private const int VERSION = 1;
25 26  
26   - private Trie signs;
27   -
28 27 public enum ERROR_STATUS_MESSAGE
29 28 {
30 29 INTERNET_CONNECTION_FAILURE,
... ... @@ -46,7 +45,8 @@ public class PlayerManager : GenericPlayerManager {
46 45 private string regionPath = "";
47 46 private int regionHash = 1;
48 47  
49   - private static string dictionaryJSON;
  48 + public Trie signs = null;
  49 +
50 50  
51 51 public static string get_connection_status_message(ERROR_STATUS_MESSAGE msg)
52 52 {
... ... @@ -67,15 +67,14 @@ public class PlayerManager : GenericPlayerManager {
67 67  
68 68 public override void Start()
69 69 {
70   - base.setRandomAnimations(randomAnimationNames);
71   - base.Start();
72   -
73   - voiceRecognizer = new VoiceRecognition();
74   -
75 70 #if UNITY_EDITOR
76 71 Caching.CleanCache();
77 72 #endif
78 73  
  74 + base.setRandomAnimations(randomAnimationNames);
  75 + base.Start();
  76 +
  77 + voiceRecognizer = new VoiceRecognition();
79 78 Screen.fullScreen = false;
80 79  
81 80 StartCoroutine(WaitForResponse(
... ... @@ -83,28 +82,39 @@ public class PlayerManager : GenericPlayerManager {
83 82 // Success
84 83 delegate(WWW www)
85 84 {
86   - PlayerManager.dictionaryJSON = www.text;
  85 + string response = www.text;
87 86  
88   - /*new Thread(
  87 + new Thread(
89 88 () => {
90   - Thread.CurrentThread.IsBackground = true;*/
  89 + Thread.CurrentThread.IsBackground = true;
91 90  
92 91 Stopwatch watch = new Stopwatch();
93 92 watch.Start();
94 93  
95 94 try {
96   - this.signs = Trie.FromJSON(new JSONParser(Regex.Unescape(PlayerManager.dictionaryJSON)));
97   -
98   - PlayerLogger.Log("PM", "S", "Found EU: " + this.signs.Contains("EU"));
99   - PlayerLogger.Log("PM", "S", "Found EUE: " + this.signs.Contains("EUE"));
  95 + PlayerLogger.Log("T", "FJ", "Starting trie parsing.");
  96 + this.signs = Trie.FromJSON(new JSONParser(Regex.Unescape(response)));
  97 +
  98 + char[] charactersSigns = new char[]
  99 + {
  100 + 'A', 'B', 'C', 'Ç', 'D', 'E', 'F', 'G', 'H', 'I',
  101 + 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
  102 + 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
  103 + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
  104 + };
  105 +
  106 + foreach (char c in charactersSigns)
  107 + {
  108 + this.signs.Add(c.ToString());
  109 + }
100 110 } catch (Exception e) {
101 111 PlayerLogger.Log("PM", "S", "Exception at trie JSON parser: " + e.ToString());
102 112 }
103 113  
104 114 watch.Stop();
105 115 PlayerLogger.Log("T", "FJ", "Parsed in " + watch.ElapsedMilliseconds + " ms.");
106   - /* }
107   - ).Start();*/
  116 + }
  117 + ).Start();
108 118 },
109 119 // Error
110 120 delegate (WWW www)
... ... @@ -166,6 +176,9 @@ public class PlayerManager : GenericPlayerManager {
166 176  
167 177 protected override WWW loadAssetBundle(string aniName)
168 178 {
  179 + if (this.regionHash == 1 && !this.signs.Contains(aniName))
  180 + return null;
  181 +
169 182 string address = BASE_URL + this.regionPath + WWW.EscapeURL(aniName);
170 183  
171 184 PlayerLogger.Log("PM", "lAB", "Requesting bundle: " + address);
... ...
Assets/Scripts/Trie/JSONParser.cs
... ... @@ -6,7 +6,7 @@ using System.Text;
6 6  
7 7 namespace LAViD.Utils
8 8 {
9   - class JSONParser
  9 + public class JSONParser
10 10 {
11 11 private static readonly string True = "true";
12 12 private static readonly string False = "false";
... ... @@ -250,7 +250,7 @@ namespace LAViD.Utils
250 250 }
251 251 }
252 252  
253   - class JSONObject<T>
  253 + public class JSONObject<T>
254 254 {
255 255 public delegate T Creator();
256 256 public delegate void Assigner(JSONParser json, T obj);
... ...
Assets/Scripts/Trie/Trie.cs
... ... @@ -9,7 +9,7 @@ using System.Text.RegularExpressions;
9 9  
10 10 namespace LAViD.Structures
11 11 {
12   - class Trie
  12 + public class Trie
13 13 {
14 14 private char[] characters;
15 15 private Dictionary<char, int> keys;
... ... @@ -32,13 +32,25 @@ namespace LAViD.Structures
32 32 obj.characters = jsonParser.ParseList<char>(char.Parse).ToArray();
33 33 });
34 34  
35   - public static Trie FromJSON(JSONParser json)
  35 + public static Trie FromJSON(JSONParser json) {
  36 + return Trie.Parser.Parse(json);
  37 + }
  38 +
  39 + public void Add(string word)
36 40 {
37   - PlayerLogger.Log("T", "FJ", "Starting trie parsing.");
  41 + Node node = this.root;
38 42  
39   - Trie trie = Trie.Parser.Parse(json);
40   -
41   - return trie;
  43 + foreach (char c in word)
  44 + {
  45 + int key = this.keys[c];
  46 +
  47 + if (node.children[key] == null)
  48 + node.children[key] = new Node(this.root.maxChildren);
  49 +
  50 + node = node.children[key];
  51 + }
  52 +
  53 + node.end = true;
42 54 }
43 55  
44 56 public bool Contains(string word)
... ... @@ -57,6 +69,8 @@ namespace LAViD.Structures
57 69  
58 70 public List<string> StartsWith(string word)
59 71 {
  72 + PlayerLogger.Log("T", "SW", "Searching for '" + word + "'.");
  73 +
60 74 List<string> list = new List<string>();
61 75 Node node = this.root;
62 76  
... ... @@ -66,7 +80,7 @@ namespace LAViD.Structures
66 80 if (node == null) break;
67 81 }
68 82  
69   - if (node != null) feed(list, "", node);
  83 + if (node != null) feed(list, word, node);
70 84  
71 85 return list;
72 86 }
... ... @@ -89,6 +103,7 @@ namespace LAViD.Structures
89 103  
90 104 public Node(int maxChildren) {
91 105 this.maxChildren = maxChildren;
  106 + this.children = new Node[maxChildren];
92 107 }
93 108  
94 109 private readonly static JSONObject<Node> Parser = new JSONObject<Node>()
... ... @@ -108,9 +123,7 @@ namespace LAViD.Structures
108 123 return Node.FromJSON(innerJSONParser, obj.maxChildren);
109 124 }
110 125 );
111   -
112   - obj.children = new Node[obj.maxChildren];
113   -
  126 +
114 127 foreach (KeyValuePair<int, Node> pair in children)
115 128 obj.children[pair.Key] = pair.Value;
116 129 });
... ...