// This file is distributed under a BSD license. See LICENSE.txt for details.

#ifndef __GENEFFECT_HPP__
#define __GENEFFECT_HPP__

#include "_types.hpp"
#include "_start.hpp"
#include "kdoc.hpp"

class GenBitmap;
class GenSpline;
class GenMaterial;
class GenMesh;
class GenMinMesh;

/****************************************************************************/

class GenEffect : public KObject
{
public:
  GenEffect();
  ~GenEffect();
  void Copy(KObject *);
  KObject *Copy();

  class GenMaterial *Material;
  sInt Pass;
  sInt Usage;
  sBool NeedCurrentRender;
  void *EffectData;
  KOp *Op;
};

GenEffect *MakeEffect(class GenMaterial *mtrl);      // new GenEffect, set Pass from material, release material.
void SetVert(sF32 *fp,sF32 x,sF32 y,sF32 z,sF32 u,sF32 v,sU64 col=~0);   // set tspace vertex for simple effects.


/****************************************************************************/

KObject * __stdcall Init_Effect_Dummy(class GenMaterial *mtrl,sF323 size);
void __stdcall Exec_Effect_Dummy(KOp *op,KEnvironment *kenv,sF323 size);

/****************************************************************************/

KObject * __stdcall Init_Effect_Water(GenSpline *spline, class GenMaterial *mtrl, sF32 scalexy , sF32 scalepos, sF32 scaleuv,sF32 speed,sF32 scaleamp, sInt grid  );
void __stdcall Exec_Effect_Water(KOp *op,KEnvironment *kenv, sF32 scalexy , sF32 scalepos, sF32 scaleuv,sF32 speed,sF32 scaleamp, sInt grid );

/****************************************************************************/

KObject * __stdcall Init_Effect_Print(class GenMaterial *mtrl,sInt flags,sF32 sizex,sF32 sizey,sF32 spacex,sF32 spacey,sF32 radius,sChar *text);
void __stdcall Exec_Effect_Print(KOp *op,KEnvironment *kenv,sInt flags,sF32 sizex,sF32 sizey,sF32 spacex,sF32 spacey,sF32 radius,sChar *text);

/****************************************************************************/

//KObject * __stdcall Init_Effect_Particles(class GenMaterial *mtrl,sInt mode,sInt count,sF32 time,sF32 rate,sF324 speed,sU32 col0,sU32 col1,sU32 col2,sF323 size,sF32 middle,sF32 fade,sF324 rpos,sF324 rspeed);
//void __stdcall Exec_Effect_Particles(KOp *op,KEnvironment *kenv,sInt mode,sInt count,sF32 time,sF32 rate,sF324 speed,sU32 col0,sU32 col1,sU32 col2,sF323 size,sF32 middle,sF32 fade,sF324 rpos,sF324 rspeed);

/****************************************************************************/

KObject * __stdcall Init_Effect_PartEmitter(GenMinMesh *mesh,
  sInt slot,sInt mode,sInt count,sF32 time,sF32 rate,
  sF324 speed,sF324 rpos,sF324 rspeed,sInt slots,sF32 fade,sF32 metamorph);
void __stdcall Exec_Effect_PartEmitter(KOp *op,KEnvironment *kenv,
  sInt slot,sInt mode,sInt count,sF32 time,sF32 rate,
  sF324 speed,sF324 rpos,sF324 rspeed,sInt slots,sF32 fade,sF32 metamorph);

/****************************************************************************/

KObject * __stdcall Init_Effect_PartSystem(class GenMaterial *mtrl,
  sInt slot,sInt count,sU32 col0,sU32 col1,sU32 col2,sF323 size,sF32 middle,sF32 fade,sF32 gravity,sInt flags);
void __stdcall Exec_Effect_PartSystem(KOp *op,KEnvironment *kenv,
  sInt slot,sInt count,sU32 col0,sU32 col1,sU32 col2,sF323 size,sF32 middle,sF32 fade,sF32 gravity,sInt flags);
void FreeParticles();

/****************************************************************************/

KObject * __stdcall Init_Effect_ImageLayer(KOp *op,class GenBitmap *alpha,sInt pass,sInt quality,sF32 fade,sInt flags,sChar *filename);
void __stdcall Exec_Effect_ImageLayer(KOp *op,KEnvironment *kenv,sInt pass,sInt quality,sF32 fade,sInt flags,sChar *filename);

/****************************************************************************/

struct BillboardOTElem
{
  BillboardOTElem *Next;
  sF32 x,y,z;
  sF32 size;
  sInt uvval;
};

void PaintBillboards(KEnvironment *kenv,sInt count,BillboardOTElem **OT,sInt MAXOT,sF32 size,sF32 aspect,sInt mode);

KObject * __stdcall Init_Effect_Billboards(class GenMinMesh *mesh,class GenMaterial *mtrl,sF32 size,sF32 aspect,sF32 maxdist,sInt mode);
void __stdcall Exec_Effect_Billboards(KOp *op,KEnvironment *kenv,sF32 size,sF32 aspect,sF32 maxdist,sInt mode);

/****************************************************************************/

#endif
