// Copyright 2020 Google LLC
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#include "tools/fiddle/examples.h"

#include <array>

REG_FIDDLE_ANIMATED(l_system_plant, 256, 256, false, 0, 3) {
// L-System
// https://en.wikipedia.org/wiki/L-system#Example_7:_Fractal_plant

struct rules_t {
    char c;
    std::string s;
};

std::array<rules_t, 6> rules = {{
        {'X', "F-[[X]+X]+F[+FX]-X"},
        {'F', "FF"},
        {'+', "+"},
        {'-', "-"},
        {'[', "["},
        {']', "]"},
}};

std::string E(std::string s) {
    if (s.size() == 0) {
        return "";
    }
    for (int i=0; i<6; i++) {
        if (rules[i].c == s[0]) {
            return rules[i].s + E(s.substr(1));
        }
    }
    return "";
}

struct Pt {
  SkScalar x;
  SkScalar y;
  SkScalar a;
};

void draw(SkCanvas* canvas) {
  canvas->drawColor(SK_ColorLTGRAY);

  SkPaint p;
  p.setColor(0xFFA6761D);
  p.setAntiAlias(true);
  p.setStyle(SkPaint::kStroke_Style);
  p.setStrokeWidth(1);

  std::vector<struct Pt> ptstack;
  std::string plant = E(E(E(E(E("X")))));
  const double len = 2.5;
  struct Pt pt = {128, 256, 3.14};
  SkPathBuilder path;
  path.moveTo(pt.x, pt.y);

  for (std::string::iterator it=plant.begin(); it!=plant.end(); ++it) {
    if (*it == 'F') {
      pt.x += len*sin(pt.a);
      pt.y += len*cos(pt.a);
      path.lineTo(pt.x, pt.y);
    } else if (*it == '+') {
      pt.a += (0.15 + sin(frame*2.0*3.14159)*0.05);
    } else if (*it == '-') {
      pt.a += (-0.15 + sin(frame*2.0*3.14159)*0.05);
    } else if (*it == '[') {
      ptstack.push_back(pt);
    } else if (*it == ']') {
      pt = ptstack.back();
      ptstack.pop_back();
      path.moveTo(pt.x, pt.y);
    }
  }
  canvas->drawPath(path.detach(), p);
}
}  // END FIDDLE
