// Common, group Miscelaneous
// Copyright Alexander Liss

#ifndef __SHAPE_H__
#define __SHAPE_H__

struct ReadControl;
class CommBuffer;


	// VibroData
	// phase from zero to one, default - max at start

struct VibroData
{
	float vigor, period, phase;

VibroData():vigor(0),period(1.0e6),phase(0){}

};

	// SwingData

struct SwingData
{
	enum {up,down};
	int direction;
	float range, segment, first_share, last_share; 

SwingData():
	direction(up),range(0),segment(0),first_share(0),last_share(0){}

};


	// Vibro
	// amplitude*cosin(2*pi*(t*frequency-phase));

class Vibro
{
friend int pack(CommBuffer& d,const Vibro& z);
friend int unpack(Vibro& z, const CommBuffer& s,ReadControl& c);
public:

Vibro();
Vibro(const VibroData&);

int set(const VibroData&);
float get(float t);

private:

	float amplitude, frequency, phase;
};


	// Swing

class Swing
{
friend int pack(CommBuffer& d,const Swing& z);
friend int unpack(Swing& z, const CommBuffer& s,ReadControl& c);
public:

Swing();
Swing(const SwingData&);

int set(const SwingData&);
float get(float t);

private:

	int direction;
	float h, t, t0, t1, a0, a1, b;

float local_get(float t);
};


// 0<=r1<=1
inline float mix(float z1,float z2, float r1)
{ return (float)(z1*r1 + (1.0-r1)*z2);}


#endif