#ifndef GledCore_ZNode_H
#define GledCore_ZNode_H
#include <Glasses/ZGlass.h>
#include <Glasses/ZList.h>
#include <Stones/ZTrans.h>
class ZNode : public ZList
{
MAC_RNR_FRIENDS(ZNode);
private:
void _init();
protected:
virtual void on_insert(ZList::iterator it);
TimeStamp_t mStampReqTrans;
ZTrans mTrans;
Bool_t bUseScale;
Bool_t bUseOM;
Float_t mOM;
Float_t mSx;
Float_t mSy;
Float_t mSz;
ZLink<ZNode> mParent;
Bool_t bKeepParent;
Bool_t bRnrSelf;
Bool_t bRnrElements;
public:
void RnrOnForDaughters();
void RnrOffForDaughters();
void RnrElmsOnForDaughters();
void RnrElmsOffForDaughters();
protected:
ZLink<ZGlass> mRnrMod;
Bool_t bModSelf;
Bool_t bModElements;
public:
void MakeRnrModList(ZGlass* optional_element=0);
void AddRnrMod(ZGlass* el);
public:
ZNode(const Text_t* n="ZNode", const Text_t* t=0) : ZList(n, t) {_init();}
Int_t Level();
void SetTrans(const ZTrans& t);
void MultLeft(const ZTrans& t);
void MultRight(const ZTrans& t);
ZTrans& ref_trans() { return mTrans; }
void MoveLF(Int_t vi, Double_t amount);
void Move3LF(Double_t x, Double_t y, Double_t z);
void RotateLF(Int_t i1, Int_t i2, Double_t amount);
void MovePF(Int_t vi, Double_t amount);
void Move3PF(Double_t x, Double_t y, Double_t z);
void RotatePF(Int_t i1, Int_t i2, Double_t amount);
void Move(ZNode* ref, Int_t vi, Double_t amount);
void Move3(ZNode* ref, Double_t x, Double_t y, Double_t z);
void Rotate(ZNode* ref, Int_t ii1, Int_t ii2, Double_t amount);
void SetPos(Double_t x, Double_t y, Double_t z);
void SetRotByAngles(Float_t a1, Float_t a2, Float_t a3);
void SetRotByDegrees(Float_t a1, Float_t a2, Float_t a3);
void SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3, const Text_t* pat);
void SetRotByAnyDegrees(Float_t a1, Float_t a2, Float_t a3, const Text_t* pat);
void SetScale(Float_t xx);
void SetScales(Float_t x, Float_t y, Float_t z);
void MultScale(Float_t s);
void ApplyScale(ZTrans& t);
void SetOMofDaughters(Float_t om, Bool_t enforce_to_all=false);
ZTrans* ToMFR(int depth=0);
ZTrans* ToNode(ZNode* top, int depth=0);
static ZTrans* BtoA(ZNode* a, ZNode* b, ZNode* top=0);
void FillParentList(list<ZNode*>& plist);
static ZNode* FindCommonParent(ZNode* a, ZNode* b);
template <class GLASS>
GLASS* GrepParentByGlass() {
ZNode* p = *mParent;
if(p == 0) return 0;
GLASS* g = dynamic_cast<GLASS*>(p); if(g) return g;
return p->GrepParentByGlass<GLASS>();
}
virtual void SetStamps(TimeStamp_t s)
{ ZList::SetStamps(s); mStampReqTrans = s; }
void MarkStampReqTrans() { mStampReqTrans = ++mTimeStamp; }
void StampReqTrans() { mStampReqTrans = Stamp(FID()); }
#include "ZNode.h7"
ClassDef(ZNode, 1);
};
#endif