public Token EvaluateAt(float offset, float trasversal, out SBSVector3 pos, out SBSVector3 tang) #endif { BranchToken dummy = new BranchToken(null, (offset - startLength) * invLenScale); #if UNITY_FLASH int index = AS3Utils.BinarySearchList(branchTokens, dummy); #else int index = branchTokens.BinarySearch(dummy); #endif index = (index < 0 ? ~index : index); BranchToken branchToken = branchTokens[Mathf.Clamp(index - 1, 0, branchTokens.Count - 1)]; float l = (dummy.startLength - branchToken.startLength) / branchToken.token.Length; l = Mathf.Clamp01(l); #if UNITY_FLASH branchToken.token.TokenToWorld(l, trasversal, pos, tang); #else branchToken.token.TokenToWorld(l, trasversal, out pos, out tang); #endif return(branchToken.token); }
public List <TokenHit> GetTokens(Vector3 worldPos, Token startToken, TrackBranch trackBranch, bool exitAtFirstHit, int branchMask) { if (null == startToken) { if (null == trackBranch) { LevelObject[] objs = LevelRoot.Instance.Query(new Bounds(worldPos, Vector3.zero), "tokens"); if (objs.Length > 0) { startToken = objs[0].gameObject.GetComponent <Token>(); } else { objs = LevelRoot.Instance.Query("tokens"); if (objs.Length > 0) { startToken = objs[0].gameObject.GetComponent <Token>(); } else { return(new List <TokenHit>()); } } } else { startToken = trackBranch[0]; } } if (null == lastCrossHit) { lastCrossHit = startToken; } else { startToken = lastCrossHit; } List <TokenHit> tokenHits = new List <TokenHit>(); List <int> visitedTokens = new List <int>(); #if UNITY_FLASH List <Token> queue = new List <Token>(); queue.Add(startToken); #else Queue <Token> queue = new Queue <Token>(); queue.Enqueue(startToken); #endif visitedTokens.Add(startToken.UniqueId); while (queue.Count > 0) { TokenHit tokenHit = new TokenHit(); #if UNITY_FLASH tokenHit.token = queue[0]; queue.RemoveAt(0); #else tokenHit.token = queue.Dequeue(); #endif tokenHit.token.WorldToToken(worldPos, out tokenHit.longitudinal, out tokenHit.trasversal); if (tokenHit.longitudinal >= 0.0f - longitudinalExt && tokenHit.longitudinal <= 1.0f + longitudinalExt && tokenHit.trasversal >= -1.0f - trasversalExt && tokenHit.trasversal <= 1.0f + trasversalExt && (tokenHit.token.TrackBranch == trackBranch || null == trackBranch) && (null == tokenHit.token.TrackBranch || (tokenHit.token.TrackBranch.mask & branchMask) != 0)) { #if UNITY_FLASH tokenHit.token.TokenToWorld(tokenHit.longitudinal, tokenHit.trasversal, tokenHit.position, tokenHit.tangent); #else tokenHit.token.TokenToWorld(tokenHit.longitudinal, tokenHit.trasversal, out tokenHit.position, out tokenHit.tangent); #endif tokenHits.Add(tokenHit); if (tokenHit.token.type == Token.TokenType.Cross) { lastCrossHit = tokenHit.token; } if (exitAtFirstHit) { break; } } if (isGrid) { foreach (Token link in tokenHit.token.links) { if (null != link) { int linkIndex = visitedTokens.BinarySearch(link.UniqueId); if (linkIndex < 0) { queue.Enqueue(link); visitedTokens.Insert(~linkIndex, link.UniqueId); } } } } else { foreach (Token link in tokenHit.token.nextLinks) { #if UNITY_FLASH int linkIndex = AS3Utils.BinarySearchList(visitedTokens, link.UniqueId); #else int linkIndex = visitedTokens.BinarySearch(link.UniqueId); #endif if (linkIndex < 0) { #if UNITY_FLASH queue.Add(link); #else queue.Enqueue(link); #endif visitedTokens.Insert(~linkIndex, link.UniqueId); } } foreach (Token link in tokenHit.token.prevLinks) { #if UNITY_FLASH int linkIndex = AS3Utils.BinarySearchList(visitedTokens, link.UniqueId); #else int linkIndex = visitedTokens.BinarySearch(link.UniqueId); #endif if (linkIndex < 0) { #if UNITY_FLASH queue.Add(link); #else queue.Enqueue(link); #endif visitedTokens.Insert(~linkIndex, link.UniqueId); } } } } return(tokenHits);//.ToArray(); ToDo Flash }