ROOT logo
// $Id: ZNode.h 2444 2010-09-13 21:01:56Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#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:
  // ZList
  virtual void on_insert(ZList::iterator it);

  //----------------------------------------------------------------------

  TimeStamp_t	mStampReqTrans;	//! TimeStamp of last change of mTrans
  ZTrans	mTrans;		//  X{RPG} Transform from parent

  // Position and Rotation widgets
  // 777 Trans_Pos_Ctrl(Methodbase=>'Pos', Methodname=>'Pos', Transname=>'Trans')
  // 777 Trans_Rot_Ctrl(Methodbase=>'Rot', Methodname=>'Rot', Transname=>'Trans')

  Bool_t	bUseScale;	// X{GSt}  7 Bool(-join=>1)
  Bool_t	bUseOM;		// X{GSt}  7 Bool(-join=>1)
  Float_t	mOM;		// X{GSt}  7 Value(-range=>[-32, 32, 1,1000])
  Float_t	mSx;		// X{GSt}  7 Value(-range=>[0,1000, 1,1000], -join=>1)
  Float_t	mSy;		// X{GSt}  7 Value(-range=>[0,1000, 1,1000], -join=>1)
  Float_t	mSz;		// X{GSt}  7 Value(-range=>[0,1000, 1,1000])

  ZLink<ZNode>	mParent;	// X{gS} L{} Structural parent
  Bool_t	bKeepParent;	// X{GS} 7 Bool()

  // RnrBits of RnrMod calculated on the fly.
  Bool_t	bRnrSelf;	// X{GSx} 7 Bool(-join=>1)
  Bool_t	bRnrElements;	// X{GSx} 7 Bool()
public:
  void RnrOnForDaughters();     // X{ED}  7 MButt(-join=>1)
  void RnrOffForDaughters();    // X{ED}  7 MButt()
  void RnrElmsOnForDaughters(); // X{ED}  7 MButt(-join=>1)
  void RnrElmsOffForDaughters();// X{ED}  7 MButt()

protected:
  ZLink<ZGlass>	mRnrMod;	// X{gS} L{}
  Bool_t	bModSelf;	// X{GSx} 7 Bool(-join=>1)
  Bool_t	bModElements;	// X{GSx} 7 Bool()
public:
  void MakeRnrModList(ZGlass* optional_element=0); // X{E} C{1} 7 MCWButt()
  void AddRnrMod(ZGlass* el);                      // X{E} C{1}

public:
  ZNode(const Text_t* n="ZNode", const Text_t* t=0) : ZList(n, t) {_init();}

  Int_t	Level();

  // ZTrans wrappers
  //----------------

  void UnitTrans();                // X{E}
  void UnitRot();                  // X{E}

  void SetTrans(const ZTrans& t);  // X{E}
  void MultLeft(const ZTrans& t);  // X{E}
  void MultRight(const ZTrans& t); // X{E}
  ZTrans& ref_trans() { return mTrans; } // Use wisely.

  void MoveLF(Int_t vi, Double_t amount);             // X{E}
  void Move3LF(Double_t x, Double_t y, Double_t z);   // X{E}
  void RotateLF(Int_t i1, Int_t i2, Double_t amount); // X{E}

  void MovePF(Int_t vi, Double_t amount);             // X{E}
  void Move3PF(Double_t x, Double_t y, Double_t z);   // X{E}
  void RotatePF(Int_t i1, Int_t i2, Double_t amount); // X{E}

  void Move(ZNode* ref, Int_t vi, Double_t amount);               // X{E} C{1}
  void Move3(ZNode* ref, Double_t x, Double_t y, Double_t z);     // X{E} C{1}
  void Rotate(ZNode* ref, Int_t ii1, Int_t ii2, Double_t amount); // X{E} C{1}

  void SetPos(Double_t x, Double_t y, Double_t z);          // X{E}
  void SetRotByAngles(Float_t a1, Float_t a2, Float_t a3);  // X{E}
  void SetRotByDegrees(Float_t a1, Float_t a2, Float_t a3); // X{E}
  void SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3, const Text_t* pat);  // X{E}
  void SetRotByAnyDegrees(Float_t a1, Float_t a2, Float_t a3, const Text_t* pat); // X{E}

  // Scaling (stored separately from ZTrans, use ApplyScale to imprint it)

  void SetScale(Float_t xx);                       // X{E}
  void SetScales(Float_t x, Float_t y, Float_t z); // X{E}
  void MultScale(Float_t s);                       // X{E}
  void ApplyScale(ZTrans& t);

  void SetOMofDaughters(Float_t om, Bool_t enforce_to_all=false); // X{ED}

  // Node-to-node transforamtions

  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>();
  }

  // ZGlass virtuals
  virtual void SetStamps(TimeStamp_t s)
  { ZList::SetStamps(s); mStampReqTrans = s; }

  // Stamps
  void MarkStampReqTrans() { mStampReqTrans = ++mTimeStamp; }
  void StampReqTrans()     { mStampReqTrans = Stamp(FID()); }

#include "ZNode.h7"
  ClassDef(ZNode, 1);
}; // endclass ZNode

#endif
 ZNode.h:1
 ZNode.h:2
 ZNode.h:3
 ZNode.h:4
 ZNode.h:5
 ZNode.h:6
 ZNode.h:7
 ZNode.h:8
 ZNode.h:9
 ZNode.h:10
 ZNode.h:11
 ZNode.h:12
 ZNode.h:13
 ZNode.h:14
 ZNode.h:15
 ZNode.h:16
 ZNode.h:17
 ZNode.h:18
 ZNode.h:19
 ZNode.h:20
 ZNode.h:21
 ZNode.h:22
 ZNode.h:23
 ZNode.h:24
 ZNode.h:25
 ZNode.h:26
 ZNode.h:27
 ZNode.h:28
 ZNode.h:29
 ZNode.h:30
 ZNode.h:31
 ZNode.h:32
 ZNode.h:33
 ZNode.h:34
 ZNode.h:35
 ZNode.h:36
 ZNode.h:37
 ZNode.h:38
 ZNode.h:39
 ZNode.h:40
 ZNode.h:41
 ZNode.h:42
 ZNode.h:43
 ZNode.h:44
 ZNode.h:45
 ZNode.h:46
 ZNode.h:47
 ZNode.h:48
 ZNode.h:49
 ZNode.h:50
 ZNode.h:51
 ZNode.h:52
 ZNode.h:53
 ZNode.h:54
 ZNode.h:55
 ZNode.h:56
 ZNode.h:57
 ZNode.h:58
 ZNode.h:59
 ZNode.h:60
 ZNode.h:61
 ZNode.h:62
 ZNode.h:63
 ZNode.h:64
 ZNode.h:65
 ZNode.h:66
 ZNode.h:67
 ZNode.h:68
 ZNode.h:69
 ZNode.h:70
 ZNode.h:71
 ZNode.h:72
 ZNode.h:73
 ZNode.h:74
 ZNode.h:75
 ZNode.h:76
 ZNode.h:77
 ZNode.h:78
 ZNode.h:79
 ZNode.h:80
 ZNode.h:81
 ZNode.h:82
 ZNode.h:83
 ZNode.h:84
 ZNode.h:85
 ZNode.h:86
 ZNode.h:87
 ZNode.h:88
 ZNode.h:89
 ZNode.h:90
 ZNode.h:91
 ZNode.h:92
 ZNode.h:93
 ZNode.h:94
 ZNode.h:95
 ZNode.h:96
 ZNode.h:97
 ZNode.h:98
 ZNode.h:99
 ZNode.h:100
 ZNode.h:101
 ZNode.h:102
 ZNode.h:103
 ZNode.h:104
 ZNode.h:105
 ZNode.h:106
 ZNode.h:107
 ZNode.h:108
 ZNode.h:109
 ZNode.h:110
 ZNode.h:111
 ZNode.h:112
 ZNode.h:113
 ZNode.h:114
 ZNode.h:115
 ZNode.h:116
 ZNode.h:117
 ZNode.h:118
 ZNode.h:119
 ZNode.h:120
 ZNode.h:121
 ZNode.h:122
 ZNode.h:123
 ZNode.h:124
 ZNode.h:125
 ZNode.h:126
 ZNode.h:127
 ZNode.h:128
 ZNode.h:129
 ZNode.h:130
 ZNode.h:131
 ZNode.h:132