示例#1
0
    /// <summary>
    /// Generate new graph node
    /// </summary>
    private void DoForwardGraph(Vector3 start, Vector3 end)
    {
        // Create new node
        LSystemNode node = new LSystemNode(end);

        _currentNode.edges.Add(node);
        _currentNode = node;
    }
示例#2
0
    private void InitializeDrawSystem()
    {
        // Initialize random engine
        _randomGenerator = new System.Random(seed);

        turtle   = new Turtle(Vector3.zero, Quaternion.identity);
        treeRoot = new LSystemNode(Vector3.zero);
    }
示例#3
0
    private void DrawLSystem()
    {
        InitializeDrawSystem();

        // Initialize graph
        Stack <LSystemNode> nodeStack = new Stack <LSystemNode>();

        _currentNode = treeRoot;

        // Draw
        for (int i = 0; i < currentPath.Length; i++)
        {
            DoStep(currentPath[i], nodeStack);
        }
    }
示例#4
0
    private IEnumerator DrawLSystemRoutine()
    {
        InitializeDrawSystem();

        // Initialize graph
        Stack <LSystemNode> nodeStack = new Stack <LSystemNode>();

        _currentNode = treeRoot;

        // Draw
        for (int i = 0; i < currentPath.Length; i++)
        {
            DoStep(currentPath[i], nodeStack);

            if (drawStepByStep && i % stepCount == 0)
            {
                yield return(new WaitForSeconds(stepDelay));
            }
        }
    }
示例#5
0
    private void DoStep(char input, Stack <LSystemNode> nodeStack)
    {
        switch (input)
        {
        case 'F':
            float   length = Mathf.Lerp(branchLength.min, branchLength.max, (float)_randomGenerator.NextDouble());
            Vector3 start  = turtle.transform.position;
            turtle.MoveForward(length);
            Vector3 end = turtle.transform.position;

            DoForwardGraph(start, end);
            if (generateTree)
            {
                DoForwardTree(start, end);
            }

            break;

        case 'X':
            break;

        case '+':
            turtle.Rotate(Vector3.up * angle * (1f + variance * Mathf.Lerp(-1f, 1f, (float)_randomGenerator.NextDouble())));
            break;

        case '-':
            turtle.Rotate(Vector3.down * angle * (1f + variance * Mathf.Lerp(-1f, 1f, (float)_randomGenerator.NextDouble())));
            break;

        case '[':
            turtle.SaveState();
            nodeStack.Push(_currentNode);
            break;

        case ']':
            turtle.LoadState();
            _currentNode = nodeStack.Pop();
            break;
        }
    }