#include "ZGo.h"



//---- MakeScene1 ----------------------------------------------------------------//

//---- MakeScene1

MakeScene1::MakeScene1(ZGo *zgo, ZGoPARAMS *input, ZGoPARAMS *output)
{
  this->zgo = zgo;
  this->input = input->setInput(this);
  this->output = output->setOutput(this);

  this->fnType = new ZGoNAME(zgo, "MakeScene1");

  //  Parameters

  time = (ZGoREAL *)input->get("time");
  scene = (ZGo3DOBJECT *)output->get("scene");

  //  Make tree

  ZGoREAL *z = new ZGoREAL(zgo);

  new ZGoRealFloor(zgo,
    (new ZGoPARAMS(zgo))->add("a", time)
                        ->add("b", new ZGoREAL(zgo, 2)),
    (new ZGoPARAMS(zgo))->add("result", z)
  );

  ZGoMATRIX *m = new ZGoMATRIX(zgo);

  new ZGoMakeShiftMatrix(zgo,
    (new ZGoPARAMS(zgo))->add("x", new ZGoREAL(zgo, -0.5))
                        ->add("y", new ZGoREAL(zgo, -0.5))
                        ->add("z", z),
    (new ZGoPARAMS(zgo))->add("result", m)
  );

  ZGo3DOBJECT *floor = new ZGo3DOBJECT(zgo);
  floor->plane(1.0);

  ZGo3DOBJECT *tfloor = new ZGo3DOBJECT(zgo);

  new ZGoTransform(zgo,
    (new ZGoPARAMS(zgo))->add("matrix", m)
                        ->add("object", floor),
    (new ZGoPARAMS(zgo))->add("result", tfloor)
  );

  //  Make shapey

  ZGo3DOBJECT *tshapey = new ZGo3DOBJECT(zgo);

  {
    ZGoREAL *rand = new ZGoREAL(zgo);

    new ZGoRandom(zgo,
      (new ZGoPARAMS(zgo))->add("min", new ZGoREAL(zgo, -5))
                          ->add("max", new ZGoREAL(zgo, 5)),
      (new ZGoPARAMS(zgo))->add("result", rand)
    );

    ZGoREAL *intrand = new ZGoREAL(zgo);

    new ZGoRealFloor(zgo,
      (new ZGoPARAMS(zgo))->add("a", rand),
      (new ZGoPARAMS(zgo))->add("result", intrand)
    );

    ZGoREAL *zz = new ZGoREAL(zgo);

    new ZGoRealAdd(zgo,
      (new ZGoPARAMS(zgo))->add("a", time)->add("b", new ZGoREAL(zgo, 4)),
      (new ZGoPARAMS(zgo))->add("result", zz)
    );

    ZGoREAL *z = new ZGoREAL(zgo);

    new ZGoRealFloor(zgo,
      (new ZGoPARAMS(zgo))->add("a", zz)->add("b", new ZGoREAL(zgo, 10)),
      (new ZGoPARAMS(zgo))->add("result", z)
    );

    ZGoBOOL *inc = new ZGoBOOL(zgo);

    new ZGoIsRealIncreasing(zgo,
      (new ZGoPARAMS(zgo))->add("a", z)->add("init_a", new ZGoREAL(zgo, -9999)),
      (new ZGoPARAMS(zgo))->add("result", inc)
    );

    ZGoREAL *x = new ZGoREAL(zgo);

    new ZGoRealFreezer(zgo,
      (new ZGoPARAMS(zgo))->add("in", intrand)->add("flag", inc),
      (new ZGoPARAMS(zgo))->add("out", x)
    );

    ZGoMATRIX *m = new ZGoMATRIX(zgo);

    new ZGoMakeShiftMatrix(zgo,
      (new ZGoPARAMS(zgo))->add("x", x)
                          ->add("y", new ZGoREAL(zgo, 0.8))
                          ->add("z", z),
      (new ZGoPARAMS(zgo))->add("result", m)
    );

    ZGo3DOBJECT *shapey = new ZGo3DOBJECT(zgo);
    shapey->cube();

    new ZGoTransform(zgo,
      (new ZGoPARAMS(zgo))->add("matrix", m)
                          ->add("object", shapey),
      (new ZGoPARAMS(zgo))->add("result", tshapey)
    );
  }

  new ZGoMerge3D(zgo,
    (new ZGoPARAMS(zgo))->add("object1", tfloor)->add("object2", tshapey),
    (new ZGoPARAMS(zgo))->add("result", scene)
  );

}



//---- process

void MakeScene1::process()
{
}



//---- end of file -----------------------------------------------------------//
