public void Draw(List <LSSymbol> cmds) { Stack <Location> stack = new Stack <Location> (); // start at grid 0,0 facing north with no color index Location pos = new Location(0.0f, 0.0f, 90.0f, 0); // process each command in turn float yOffset = 0; //this._yOffset, Color[] colorList = new Color[] { Color.black, Color.black, Color.black, Color.black, Color.black }; bool draw = true; Vector3 v3; float rad; Color color; Color lastcolor = Color.black; int len = cmds.Count; #if DG string log = ""; #endif for (int i = 0; i < len; i++) { LSSymbol c = cmds[i]; switch (c.id) { // ANTICLOCK = '+' // CLOCKWISE = '-' // PUSH = '[' // POP = ']' // COLOR = 'C' case COLOR: // get color index from next character pos.colorIndex = cmds[++i].id; #if DG log += " / color " + pos.colorIndex; #endif break; case ANTICLOCK: pos.AddAngle(angle); #if DG log += " / turn + " + pos.heading.eulerAngles; #endif break; case CLOCKWISE: pos.AddAngle(-angle); #if DG log += " / turn - " + pos.heading.eulerAngles; #endif break; case PUSH: stack.Push(pos); #if DG log += " / PUSH"; #endif break; case POP: pos = stack.Pop(); v3 = new Vector3(pos.position.x, pos.position.y + yOffset, 0); vectors.Add(v3); #if DG log += " / POP"; #endif break; case CONSTANT: break; default: #if DG log += " / Line "; #endif // move the turtle rad = pos.heading.eulerAngles.z * Mathf.PI / 180f; pos.position.x += distance * Mathf.Cos(rad); pos.position.y += distance * Mathf.Sin(rad); if (draw) { // render this element /*if (renderLineWidths) * { * width = (maxStackDepth - stack.length); * ctx.lineWidth = width >= 1 ? width : 1; * }*/ color = colorList[pos.colorIndex]; if (lastcolor != color) { //ctx.strokeStyle = color; lastcolor = color; } //ctx.beginPath(); /* ctx.moveTo(lastX, HEIGHT - (lastY + yOffset)); * ctx.lineTo(pos.x, HEIGHT - (pos.y + yOffset));*/ v3 = new Vector3(pos.position.x, pos.position.y + yOffset, 0); vectors.Add(v3); //ctx.closePath(); //ctx.stroke(); } else { // remember min/max position Vector3 min = Vector3.one * float.MinValue; Vector3 max = Vector3.one * float.MaxValue; if (pos.position.x < min.x) { min.x = pos.position.x; } else if (pos.position.x > max.x) { max.x = pos.position.x; } if (pos.position.y < min.y) { min.y = pos.position.y; } else if (pos.position.y > max.y) { max.y = pos.position.y; } Vector3 extent = max - min; bounds = new Bounds(Vector3.zero, extent); int numStack = stack.Count; if (numStack > maxStackDepth) { maxStackDepth = numStack; } } break; } } #if DG DG.Log(log); #endif }