// 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