// @(#)root/eve:$Id$
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_TEveTrans
#define ROOT_TEveTrans

#include "TEveVector.h"
#include "TVector3.h"

class TGeoMatrix;
class TGeoHMatrix;
class TBuffer3D;

/******************************************************************************/
// TEveTrans -- 3D transformation in generalised coordinates
/******************************************************************************/

class TEveTrans : public TObject
{
   friend class TEveTransSubEditor;
   friend class TEveTransEditor;

protected:
   Double32_t            fM[16];

   mutable Float_t       fA1;   //!
   mutable Float_t       fA2;   //!
   mutable Float_t       fA3;   //!
   mutable Bool_t        fAsOK; //!

   // TEveUtil
   Bool_t                fUseTrans;       // use transformation matrix
   Bool_t                fEditTrans;      // edit transformation in TGedFrame
   Bool_t                fEditRotation;   // edit rotation
   Bool_t                fEditScale;      // edit scale

   Double_t Norm3Column(Int_t col);
   Double_t Orto3Column(Int_t col, Int_t ref);

public:
   TEveTrans();
   TEveTrans(const TEveTrans& t);
   TEveTrans(const Double_t arr[16]);
   TEveTrans(const Float_t  arr[16]);
   virtual ~TEveTrans() {}

   // General operations

   void     UnitTrans();
   void     ZeroTrans(Double_t w=1.0);
   void     UnitRot();
   void     SetTrans(const TEveTrans& t, Bool_t copyAngles=kTRUE);
   void     SetFromArray(const Double_t arr[16]);
   void     SetFromArray(const Float_t  arr[16]);
   TEveTrans&  operator=(const TEveTrans& t) { SetTrans(t); return *this; }
   void     SetupRotation(Int_t i, Int_t j, Double_t f);
   void     SetupFromToVec(const TEveVector& from, const TEveVector& to);

   void     OrtoNorm3();
   Double_t Invert();

   void MultLeft(const TEveTrans& t);
   void MultRight(const TEveTrans& t);
   void operator*=(const TEveTrans& t) { MultRight(t); }

   void TransposeRotationPart();

   TEveTrans operator*(const TEveTrans& t);

   // Move & Rotate

   void MoveLF(Int_t ai, 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 ai, 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(const TEveTrans& a, Int_t ai, Double_t amount);
   void Move3(const TEveTrans& a, Double_t x, Double_t y, Double_t z);
   void Rotate(const TEveTrans& a, Int_t i1, Int_t i2, Double_t amount);

   // Element access

   Double_t* Array() { return fM; }      const Double_t* Array() const { return fM; }
   Double_t* ArrX()  { return fM; }      const Double_t* ArrX()  const { return fM; }
   Double_t* ArrY()  { return fM +  4; } const Double_t* ArrY()  const { return fM +  4; }
   Double_t* ArrZ()  { return fM +  8; } const Double_t* ArrZ()  const { return fM +  8; }
   Double_t* ArrT()  { return fM + 12; } const Double_t* ArrT()  const { return fM + 12; }

   Double_t  operator[](Int_t i) const { return fM[i]; }
   Double_t& operator[](Int_t i)       { return fM[i]; }

   Double_t  CM(Int_t i, Int_t j) const { return fM[4*j + i]; }
   Double_t& CM(Int_t i, Int_t j)       { return fM[4*j + i]; }

   Double_t  operator()(Int_t i, Int_t j) const { return fM[4*j + i - 5]; }
   Double_t& operator()(Int_t i, Int_t j)       { return fM[4*j + i - 5]; }

   // Base-vector interface

   void SetBaseVec(Int_t b, Double_t x, Double_t y, Double_t z);
   void SetBaseVec(Int_t b, const TVector3& v);

   TVector3 GetBaseVec(Int_t b) const;
   void     GetBaseVec(Int_t b, TVector3& v) const;

   // Position interface

   void SetPos(Double_t x, Double_t y, Double_t z);
   void SetPos(Double_t* x);
   void SetPos(Float_t * x);
   void SetPos(const TEveTrans& t);

   void GetPos(Double_t& x, Double_t& y, Double_t& z) const;
   void GetPos(Double_t* x) const;
   void GetPos(Float_t * x) const;
   void GetPos(TVector3& v) const;
   TVector3 GetPos() const;

   // Cardan angle interface

   void SetRotByAngles(Float_t a1, Float_t a2, Float_t a3);
   void SetRotByAnyAngles(Float_t a1, Float_t a2, Float_t a3, const char* pat);
   void GetRotAngles(Float_t* x) const;

   // Scaling

   void     Scale(Double_t sx, Double_t sy, Double_t sz);
   Double_t Unscale();
   void     Unscale(Double_t& sx, Double_t& sy, Double_t& sz);
   void     GetScale(Double_t& sx, Double_t& sy, Double_t& sz) const;
   void     SetScale(Double_t  sx, Double_t  sy, Double_t  sz);
   void     SetScaleX(Double_t sx);
   void     SetScaleY(Double_t sy);
   void     SetScaleZ(Double_t sz);

   // Operations on vectors

   void     MultiplyIP(TVector3& v, Double_t w=1) const;
   void     MultiplyIP(Double_t* v, Double_t w=1) const;
   void     MultiplyIP(Float_t*  v, Double_t w=1) const;
   TVector3 Multiply(const TVector3& v, Double_t w=1) const;
   void     Multiply(const Double_t *vin, Double_t* vout, Double_t w=1) const;
   void     RotateIP(TVector3& v) const;
   void     RotateIP(Double_t* v) const;
   void     RotateIP(Float_t*  v) const;
   TVector3 Rotate(const TVector3& v) const;

   virtual void Print(Option_t* option = "") const;

   // TEveUtil stuff

   void SetFrom(Double_t* carr);
   void SetFrom(const TGeoMatrix& mat);
   void SetGeoHMatrix(TGeoHMatrix& mat);
   void SetBuffer3D(TBuffer3D& buff);

   Bool_t GetUseTrans()  const { return fUseTrans; }
   void SetUseTrans(Bool_t v)  { fUseTrans = v;    }

   void SetEditRotation(Bool_t x){ fEditRotation = x; }
   void SetEditScale(Bool_t x)   { fEditScale = x; }
   Bool_t GetEditRotation()      { return fEditRotation; }
   Bool_t GetEditScale()         { return fEditScale; }

   Bool_t GetEditTrans() const { return fEditTrans; }
   void SetEditTrans(Bool_t v) { fEditTrans = v;    }

   Bool_t IsScale(Double_t low=0.9, Double_t high=1.1) const;

   ClassDef(TEveTrans, 1); // Column-major 4x4 transforamtion matrix for homogeneous coordinates.
};

std::ostream& operator<<(std::ostream& s, const TEveTrans& t);

#endif
 TEveTrans.h:1
 TEveTrans.h:2
 TEveTrans.h:3
 TEveTrans.h:4
 TEveTrans.h:5
 TEveTrans.h:6
 TEveTrans.h:7
 TEveTrans.h:8
 TEveTrans.h:9
 TEveTrans.h:10
 TEveTrans.h:11
 TEveTrans.h:12
 TEveTrans.h:13
 TEveTrans.h:14
 TEveTrans.h:15
 TEveTrans.h:16
 TEveTrans.h:17
 TEveTrans.h:18
 TEveTrans.h:19
 TEveTrans.h:20
 TEveTrans.h:21
 TEveTrans.h:22
 TEveTrans.h:23
 TEveTrans.h:24
 TEveTrans.h:25
 TEveTrans.h:26
 TEveTrans.h:27
 TEveTrans.h:28
 TEveTrans.h:29
 TEveTrans.h:30
 TEveTrans.h:31
 TEveTrans.h:32
 TEveTrans.h:33
 TEveTrans.h:34
 TEveTrans.h:35
 TEveTrans.h:36
 TEveTrans.h:37
 TEveTrans.h:38
 TEveTrans.h:39
 TEveTrans.h:40
 TEveTrans.h:41
 TEveTrans.h:42
 TEveTrans.h:43
 TEveTrans.h:44
 TEveTrans.h:45
 TEveTrans.h:46
 TEveTrans.h:47
 TEveTrans.h:48
 TEveTrans.h:49
 TEveTrans.h:50
 TEveTrans.h:51
 TEveTrans.h:52
 TEveTrans.h:53
 TEveTrans.h:54
 TEveTrans.h:55
 TEveTrans.h:56
 TEveTrans.h:57
 TEveTrans.h:58
 TEveTrans.h:59
 TEveTrans.h:60
 TEveTrans.h:61
 TEveTrans.h:62
 TEveTrans.h:63
 TEveTrans.h:64
 TEveTrans.h:65
 TEveTrans.h:66
 TEveTrans.h:67
 TEveTrans.h:68
 TEveTrans.h:69
 TEveTrans.h:70
 TEveTrans.h:71
 TEveTrans.h:72
 TEveTrans.h:73
 TEveTrans.h:74
 TEveTrans.h:75
 TEveTrans.h:76
 TEveTrans.h:77
 TEveTrans.h:78
 TEveTrans.h:79
 TEveTrans.h:80
 TEveTrans.h:81
 TEveTrans.h:82
 TEveTrans.h:83
 TEveTrans.h:84
 TEveTrans.h:85
 TEveTrans.h:86
 TEveTrans.h:87
 TEveTrans.h:88
 TEveTrans.h:89
 TEveTrans.h:90
 TEveTrans.h:91
 TEveTrans.h:92
 TEveTrans.h:93
 TEveTrans.h:94
 TEveTrans.h:95
 TEveTrans.h:96
 TEveTrans.h:97
 TEveTrans.h:98
 TEveTrans.h:99
 TEveTrans.h:100
 TEveTrans.h:101
 TEveTrans.h:102
 TEveTrans.h:103
 TEveTrans.h:104
 TEveTrans.h:105
 TEveTrans.h:106
 TEveTrans.h:107
 TEveTrans.h:108
 TEveTrans.h:109
 TEveTrans.h:110
 TEveTrans.h:111
 TEveTrans.h:112
 TEveTrans.h:113
 TEveTrans.h:114
 TEveTrans.h:115
 TEveTrans.h:116
 TEveTrans.h:117
 TEveTrans.h:118
 TEveTrans.h:119
 TEveTrans.h:120
 TEveTrans.h:121
 TEveTrans.h:122
 TEveTrans.h:123
 TEveTrans.h:124
 TEveTrans.h:125
 TEveTrans.h:126
 TEveTrans.h:127
 TEveTrans.h:128
 TEveTrans.h:129
 TEveTrans.h:130
 TEveTrans.h:131
 TEveTrans.h:132
 TEveTrans.h:133
 TEveTrans.h:134
 TEveTrans.h:135
 TEveTrans.h:136
 TEveTrans.h:137
 TEveTrans.h:138
 TEveTrans.h:139
 TEveTrans.h:140
 TEveTrans.h:141
 TEveTrans.h:142
 TEveTrans.h:143
 TEveTrans.h:144
 TEveTrans.h:145
 TEveTrans.h:146
 TEveTrans.h:147
 TEveTrans.h:148
 TEveTrans.h:149
 TEveTrans.h:150
 TEveTrans.h:151
 TEveTrans.h:152
 TEveTrans.h:153
 TEveTrans.h:154
 TEveTrans.h:155
 TEveTrans.h:156
 TEveTrans.h:157
 TEveTrans.h:158
 TEveTrans.h:159
 TEveTrans.h:160
 TEveTrans.h:161
 TEveTrans.h:162
 TEveTrans.h:163
 TEveTrans.h:164
 TEveTrans.h:165
 TEveTrans.h:166
 TEveTrans.h:167
 TEveTrans.h:168
 TEveTrans.h:169
 TEveTrans.h:170
 TEveTrans.h:171
 TEveTrans.h:172
 TEveTrans.h:173
 TEveTrans.h:174
 TEveTrans.h:175
 TEveTrans.h:176
 TEveTrans.h:177
 TEveTrans.h:178
 TEveTrans.h:179
 TEveTrans.h:180
 TEveTrans.h:181
 TEveTrans.h:182
 TEveTrans.h:183
 TEveTrans.h:184
 TEveTrans.h:185
 TEveTrans.h:186