#ifndef __ZGO_H__
#define __ZGO_H__

#include <windows.h>
#include "math.h"



class ZGoDATA;
class ZGoPARAMS;
class ZGoNAME;
class ZGoFn;

class ZGoMain;

class ZGo;



class ZGoDATA
{
  public:

  ZGo *zgo;
  ZGoFn *input_of, *output_of;
  int frame;

  ZGoDATA();
  ZGoDATA(ZGo *zgo);
  ZGoDATA *setInput(ZGoFn *fn);
  ZGoDATA *setOutput(ZGoFn *fn);
  virtual void process();
};



class ZGoFn
{
  public:

  ZGo *zgo;
  ZGoPARAMS *input, *output;

  ZGoNAME *fnType;

  ZGoFn();
  ZGoFn(ZGo *zgo, ZGoPARAMS *input, ZGoPARAMS *output);
  virtual void process();

  virtual ZGoNAME *getType();
};






//---- DEFINE DATA TYPES -----------------------------------------------------//

//- System Data Types

#include "ZGoNAME.h"
#include "ZGoPARAMS.h"

//- Basic Data Types

#include "ZGoINT.h"
#include "ZGoBOOL.h"
#include "ZGoREAL.h"

//- 2D Data Types

#include "ZGoIMAGE.h"

//- 3D Data Types

#include "ZGoMATRIX.h"
#include "ZGoCAMERA.h"
#include "ZGo3DOBJECT.h"
#include "ZGoDISTORTION3D.h"



//---- DEFINE FUNCTIONS ------------------------------------------------------//



//- Boolean Output Functions

#include "ZGoKeyPressed.h"

//- Real Output Functions

#include "ZGoSine.h"

//- Image Functions

#include "ZGoFader.h"
#include "ZGoTile.h"
#include "ZGoChecker.h"

//- 3D Fuctions

#include "ZGoMatrixMul.h"

#include "ZGoTransform.h"
#include "ZGoRender.h"

//- Main

#include "ZGoMain.h"



//- User Functions

#include "AnimatedRotationMatrix.h"



//---- MAIN ZGO CLASS --------------------------------------------------------//

class ZGo
{
  private:

  ZGoREAL *time;
  ZGoIMAGE *result;

  ZGoMain *main;

  bool keypress[256];

  public:
  
  int frame;

  ZGo(int w, int h);
  void render(double t);
  void display(HDC dc);

  void keyDown(int key);
  void keyUp(int key);
  bool keyPressed(int key);
};






#endif
