#ifndef Geom1_Amphitheatre_H
#define Geom1_Amphitheatre_H
#include <Glasses/ZNode.h>
#include <Stones/ZColor.h>
#include <Stones/TimeMakerClient.h>
#include <TRandom.h>
class Amphitheatre : public ZNode, public TimeMakerClient
{
MAC_RNR_FRIENDS(Amphitheatre);
private:
void _init();
protected:
struct Chair {
TVector3 fPos;
ZNode* fNode;
Chair() : fPos(), fNode(0) {}
Chair(TVector3& p, ZNode* n=0) : fPos(p), fNode(n) {}
bool freep() { return fNode == 0; }
};
typedef list<Chair> lChair_t;
typedef list<Chair>::iterator lChair_i;
ZLink<ZList> mNewGuests;
lChair_t mChairs;
Int_t mNumCh;
Int_t mNumChFree;
Int_t mStageSides;
Float_t mStageRot;
Float_t mStageSize;
Float_t mChairSize;
Float_t mGuestSize;
Float_t mGuestScaleFac;
Float_t mRepX0;
Float_t mRepXm;
Float_t mRepXM;
Float_t mGuestStep;
UInt_t mStepSleepMS;
Bool_t bChairHunt;
Bool_t bInnerHunt;
Chair* closest_free_chair(TVector3& pos);
void chair_hunt(Double_t t, Double_t dt);
void chair_hunt_emit_mir(Double_t t, Double_t dt);
void fix_guest_scale(ZNode* guest, bool finalp=false);
Bool_t bRnrStage;
Bool_t bRnrChairs;
ZColor mStageCol;
ZColor mChairCol;
TRandom mRnd;
Double_t rnd(Double_t k=1, Double_t n=0);
public:
Amphitheatre(const Text_t* n="Amphitheatre", const Text_t* t=0) :
ZNode(n,t) { _init(); }
virtual void AdEnlightenment();
void CreateChairs(Float_t radius=4, Float_t xoffset=0, Float_t z=0,
Float_t dphi_deg=90, Int_t nchair=16);
void RemoveChairs();
void AddGuest(ZNode* guest);
void ClearFailedGuests();
void ClearAmphitheatre();
void StartHunt();
void StopHunt();
virtual void TimeTick(Double_t t, Double_t dt);
void MakeRandomGuests(Int_t nguests=10, Float_t box_size=10);
#include "Amphitheatre.h7"
ClassDef(Amphitheatre, 1);
};
#endif