Exemplo n.º 1
0
    public void SetPath(ChainPath path, int index)
    {
        const float size = 3.0f;

        this.path = path;
        direction = path.startDirection;
        float offset = index * size;

        transform.position = path.startPosition - direction * offset;
        distance           = path.turns[0].distance + offset;
        setPivot(path.startPosition, path.turns[0].distance);
        nextTurn = 0;
    }
Exemplo n.º 2
0
    public static ChainPath Random(Rng rng, Vector3 min, Vector3 max)
    {
        const float margin = 3.0f;
        ChainPath   path   = new ChainPath();
        Vector3     half   = (max + min) / 2.0f;

        // Enter from left, right or top
        int   entry         = rng.Range(0, 3);
        float nextDirection = 0;

        if (entry < 2)
        {
            if (entry == 0)
            {
                // left
                path.startDirection.x = 1.0f;
                path.startPosition.x  = min.x - margin;
                nextDirection         = -1.0f;
            }
            else
            {
                // right
                path.startDirection.x = -1.0f;
                path.startPosition.x  = max.x + margin;
                nextDirection         = 1.0f;
            }
            path.startPosition.z = rng.Range(half.z - margin, max.z + margin);
        }
        else
        {
            // top
            path.startDirection.z = -1.0f;
            path.startPosition.z  = max.z + margin;
            path.startPosition.x  = rng.Range(min.x + margin, max.x - margin);
            nextDirection         = rng.PlusOrMinusOne();
        }

        // Make a few turns, then exit
        Vector3 position  = path.startPosition;
        Vector3 direction = path.startDirection;
        int     numTurns  = rng.Range(2, 6);

        for (int i = 0; i < numTurns; i++)
        {
            // Choose radius
            float radius = 8.0f; // TODO: randomize this?

            // Choose distance
            float       clearance   = calcClearance(position, direction, min, max) - radius - margin;
            const float minDistance = 10.0f;
            if (clearance < minDistance)
            {
                break;
            }
            float distance = rng.Range(minDistance, clearance);

            // Add the turn
            Turn turn = new Turn();
            turn.direction = nextDirection;
            turn.radius    = radius;
            turn.distance  = distance;
            path.turns.Add(turn);

            // Move and turn
            position += direction * (distance + radius);
            direction = nextDirection * new Vector3(-direction.z, 0.0f, direction.x);
            float       nextClearance = calcClearance(position, direction, min, max) - radius - margin;
            const float minClearance  = 20.0f;
            if (nextClearance < minClearance)
            {
                direction = -direction;
            }
            position += direction * radius;

            // Choose the next turn direction randomly
            nextDirection = rng.PlusOrMinusOne();
        }

        return(path);
    }