Esempio n. 1
0
    public bool GetToken(Vector3 worldPos, Token startToken, TrackBranch trackBranch, out TokenHit hitInfo)
    {
        List <TokenHit> hits = this.GetTokens(worldPos, startToken, trackBranch, true, -1);

        if (hits.Count > 0)
        {
            hitInfo = hits[0];

            return(true);
        }
        else
        {
            hitInfo = null;

            return(false);
        }
    }
Esempio n. 2
0
    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
    }
Esempio n. 3
0
 public bool GetToken(Vector3 worldPos, Token startToken, out TokenHit hitInfo)
 {
     return(this.GetToken(worldPos, startToken, null, out hitInfo));
 }