// Chrisoft Bullet Lab Remix HGE -*- C++ -*-
// Chrisoft Game Helper header
// Copyright Chrisoft 2014
// libcgh version 0007
// Last full compatible version 0007
// ^Modify that when big change is made^
#include <hge.h>
#include <hgefont.h>
#include <hgedistort.h>
#include <hgecolor.h>
#include <math.h>
#ifndef libcgh_H
#define libcgh_H
#define pi 3.1415926535
#define sqr(x) ((x)*(x))
//static const char* LIBCGH_H_FN="libcgh.h";
struct vector2d
{
double x,y;
vector2d(double _x,double _y){x=_x;y=_y;}
vector2d(){x=y=0;}
double l(){return sqrt(sqr(x)+sqr(y));}
void ToUnitCircle(){double len=l();x/=len;y/=len;}
void Swap(){double t=x;x=y;y=t;}
void Rotate(double rad){double tx=x*cos(rad)+y*sin(rad),ty=y*cos(rad)-x*sin(rad);x=tx,y=ty;}
friend vector2d operator -(vector2d a,vector2d b)
{
return vector2d(a.x-b.x,a.y-b.y);
}
friend vector2d operator +(vector2d a,vector2d b)
{
return vector2d(a.x+b.x,a.y+b.y);
}
friend double operator |(vector2d a,vector2d b)//dot product
{
return a.x*b.x+a.y*b.y;
}
friend double operator *(vector2d a,vector2d b)//length of cross product
{
return a.x*b.y-b.x*a.y;
}
friend vector2d operator *(double a,vector2d b)
{
return vector2d(b.x*a,b.y*a);
}
friend double operator ^(vector2d a,vector2d b)//cosine of angle
{
return (a|b)/a.l()/b.l();
}
};
inline vector2d ToUnitCircle(vector2d input)
{
vector2d res=input;
res.x=res.x/input.l();
res.y=res.y/input.l();
return res;
}
inline double GetDist(const vector2d a,const vector2d b)
{
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}
inline double GetDistSeg(const vector2d a,const vector2d b,const vector2d c)
{
double l2=GetDist(a,b)*GetDist(a,b);
if (l2==0.0)return GetDist(c,a);
double t=((c-a)|(b-a))/l2;
if (t<0)return GetDist(c,a);
else if (t>1)return GetDist(c,b);
vector2d projection=a+t*(b-a);
return GetDist(c,projection);
}
inline double normalizerad(double a)
{
while (a<0)a+=2*pi;
while (a>2*pi)a-=2*pi;
return a;
}
struct TextureRect
{
double x,y,w,h;
TextureRect(){}
TextureRect(double _x,double _y,double _w,double _h){x=_x,y=_y,w=_w,h=_h;}
};
class RandomEngine
{
private:
unsigned int cseed;
public:
void SetSeed(unsigned int seed);
int NextInt(int min,int max);
double NextDouble(double min,double max);
};
class CircleIndicator
{
private:
hgeDistortionMesh *circle;
double value,radius,thk;
DWORD ccolour;
bool gradient;
BYTE alpha;
public:
void Init(double _r,double _thk,BYTE _a,bool _gr,HTEXTURE _Texture,TextureRect _TR,DWORD _cc=0);
void SetAlpha(BYTE _alpha);
void SetValue(double _value);
void Render(double x,double y);
};
class LinearProgresser
{
private:
double a,b,val;
double Elapsed,Limit;
public:
void Init(double _a,double _b,double _Lim);
void Launch();
void Update(double DT);
double GetA();
double GetB();
double GetValue();
double GetPercentage();
double GetDelta();
double GetElapsed();
};
class HangUpText
{
private:
hgeFont *TFont;
vector2d Position;
double Elapsed,Limit,dlim,delta;
BYTE alim,alpha;
char Text[255];
LinearProgresser Progresser,Progalpha;
bool done;
public:
bool Active();
void Init(const char *Font,const char *_Text,double _tlim,double _alim,double _dlim,DWORD _color=0x00FFFFFF);
void Launch(vector2d pos);
void Process(double DT);
};
#endif