Commit cc4de742076f2a578cb11669add67fcbd4da0fd1
1 parent
dd84c126
Exists in
master
and in
6 other branches
Implements trie prefix getter and use in list manager
Showing
5 changed files
with
67 additions
and
89 deletions
Show diff stats
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 | }); | ... | ... |