/// <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; }
private void InitializeDrawSystem() { // Initialize random engine _randomGenerator = new System.Random(seed); turtle = new Turtle(Vector3.zero, Quaternion.identity); treeRoot = new LSystemNode(Vector3.zero); }
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); } }
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)); } } }
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; } }