/* Class Ball, BallWidget
 *
 * Online rendered balls with caching + animation widget
 *
 * Supported static effects
 *  - ball color
 *  - ripple texture
 *
 * Supported animation sequences for now:
 *  - Color Blending
 *  - Texture rotate
 *
 * April 1999, Josef Weidendorfer
 */

#ifndef _BALL_H_
#define _BALL_H_

#include <tqpixmap.h>
#include <tqimage.h>
#include <tqcolor.h>
#include <tqwidget.h>
#include <tqptrlist.h>

/* textures for balls */
#define TEX_FLAT   0
#define TEX_RIPPLE 1

class Ball {
  
 public:
  Ball(const TQColor& c, double a = 0.0, int t=TEX_RIPPLE );
  ~Ball();

  TQPixmap* pixmap();

  double angle() { return an; }
  TQColor ballColor() { return bColor; }
  void setSpecials(double z, double f, double l)
    { zoom = z, flip=f, limit=l; }

  static int w() { return sizeX; }
  static int h() { return sizeY; }
  static void setSize(int x,int y);
  static void setLight(int x=5, int y=3, int z=10, 
		       const TQColor& c = TQColor(200,230,255) );
  static void setTexture(double c=13., double d=.2);

 private:

  void render();
  static void invalidate();

  //static TQImage back;
  static int sizeX, sizeY;
  static double lightX, lightY, lightZ;
  static TQColor lightColor;
  static double rippleCount, rippleDepth;

  TQPixmap pm;
  TQColor bColor;
  double an, sina, cosa;
  double zoom, flip, limit;
  int tex;

  Ball *next;
  static Ball* first;
};


class BallAnimation {
 public:
  BallAnimation(int s, Ball*, Ball*);

  int steps;
  TQPtrList<Ball> balls;
};

#define ANIMATION_STOPPED 0
#define ANIMATION_FORWARD 1
#define ANIMATION_BACK    2
#define ANIMATION_LOOP    3
#define ANIMATION_CYCLE   4

class BallPosition {
 public:
  BallPosition(int xp,int yp, Ball* d);

  int x, y, actStep, actDir, actType;
  Ball* def;
  BallAnimation* actAnimation;
};

#define MAX_POSITION  130
#define MAX_ANIMATION  20

class BallWidget : public TQWidget
{
  TQ_OBJECT
  

 public:
  BallWidget(int _freq, int bFr, TQWidget *parent = 0, const char *name = 0);
  ~BallWidget();

  void createBlending(int, int, Ball* , Ball* );
  void createBallPosition(int, int x, int y, Ball*);
  
  void startAnimation(int pos, int anim, int type=ANIMATION_FORWARD);
  void stopAnimation(int pos);

  void paint(TQPaintDevice *);
  
  virtual void resizeEvent(TQResizeEvent *);
  virtual void paintEvent(TQPaintEvent *);

 signals:
  void animationFinished(int);
  void animationsFinished(void);

 protected:
  void drawBackground();

 private slots:
  void animate();

 protected:
  TQMemArray<BallPosition*> positions;
  TQMemArray<BallAnimation*> animations;

 private:
  int freq;
  int xStart, yStart, realSize, ballFraction;
  bool isRunning;
  TQTimer *timer;
};


/* Ball Test */

class BallTest: public BallWidget
{
  TQ_OBJECT
  
public:
  BallTest(TQWidget *parent=0, const char *name=0 );
protected:
  void mousePressEvent( TQMouseEvent * );
  void mouseReleaseEvent( TQMouseEvent * );


};




#endif // _BALL_H_  
