00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 #include "TGLManip.h"
00013 #include "TGLUtil.h"
00014 #include "TGLCamera.h"
00015 #include "TGLPhysicalShape.h"
00016 #include "TGLIncludes.h"
00017 #include "TROOT.h"
00018 
00019 #include "TVirtualX.h"
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 ClassImp(TGLManip);
00033 
00034 
00035 TGLManip::TGLManip() :
00036    fShape(0),
00037    fSelectedWidget(0), fActive(kFALSE),
00038    fFirstMouse(0, 0),
00039    fLastMouse(0, 0)
00040 {
00041    
00042    
00043 }
00044 
00045 
00046 TGLManip::TGLManip(TGLPhysicalShape* shape) :
00047    fShape(shape),
00048    fSelectedWidget(0), fActive(kFALSE),
00049    fFirstMouse(0, 0),
00050    fLastMouse(0, 0)
00051 {
00052    
00053 }
00054 
00055 
00056 TGLManip::TGLManip(const TGLManip& gm) :
00057   TVirtualGLManip(gm),
00058   fShape(gm.fShape),
00059   fSelectedWidget(gm.fSelectedWidget),
00060   fActive(gm.fActive),
00061   fFirstMouse(gm.fFirstMouse),
00062   fLastMouse(gm.fLastMouse)
00063 {
00064    
00065 }
00066 
00067 
00068 TGLManip& TGLManip::operator=(const TGLManip& gm)
00069 {
00070    
00071 
00072    if(this!=&gm) {
00073       TVirtualGLManip::operator=(gm);
00074       fShape=gm.fShape;
00075       fSelectedWidget=gm.fSelectedWidget;
00076       fActive=gm.fActive;
00077       fFirstMouse=gm.fFirstMouse;
00078       fLastMouse=gm.fLastMouse;
00079    }
00080    return *this;
00081 }
00082 
00083 
00084 TGLManip::~TGLManip()
00085 {
00086    
00087 }
00088 
00089 
00090 const UChar_t* TGLManip::ColorFor(UInt_t widget) const
00091 {
00092    
00093 
00094    if (widget == fSelectedWidget)
00095    {
00096       return TGLUtil::fgYellow;
00097    }
00098    else
00099    {
00100       switch (widget)
00101       {
00102          case 1:  return TGLUtil::fgRed;
00103          case 2:  return TGLUtil::fgGreen;
00104          case 3:  return TGLUtil::fgBlue;
00105          default: return TGLUtil::fgGrey;
00106       }
00107    }
00108 }
00109 
00110 
00111 Bool_t TGLManip::HandleButton(const Event_t& event, const TGLCamera& )
00112 {
00113    
00114 
00115    
00116    if (event.fCode != kButton1) {
00117       return kFALSE;
00118    }
00119 
00120    
00121    if (event.fType == kButtonPress && fSelectedWidget != 0) {
00122       fFirstMouse.SetX(event.fX);
00123       fFirstMouse.SetY(event.fY);
00124       fLastMouse.SetX(event.fX);
00125       fLastMouse.SetY(event.fY);
00126       fActive = kTRUE;
00127       return kTRUE;
00128    } else if (event.fType == kButtonRelease && fActive) {
00129       fActive = kFALSE;
00130       return kTRUE;
00131    } else {
00132       return kFALSE;
00133    }
00134 }
00135 
00136 
00137 Bool_t TGLManip::HandleMotion(const Event_t&   ,
00138                               const TGLCamera& )
00139 {
00140    
00141    
00142 
00143    return kFALSE;
00144 }
00145 
00146 
00147 void TGLManip::CalcDrawScale(const TGLBoundingBox& box,
00148                              const TGLCamera&      camera,
00149                              Double_t&             base,
00150                              TGLVector3            axis[3]) const
00151 {
00152    
00153    
00154    
00155 
00156    
00157    base = box.Extents().Mag() / 100.0;
00158 
00159    
00160    
00161    TGLVector3 pixelInWorld = camera.ViewportDeltaToWorld(box.Center(), 1, 1);
00162    Double_t pixelScale = pixelInWorld.Mag();
00163    if (base < pixelScale * 3.0) {
00164       base = pixelScale * 3.0;
00165    } else if (base > pixelScale * 6.0) {
00166       base = pixelScale * 6.0;
00167    }
00168 
00169    
00170    for (UInt_t i = 0; i<3; i++) {
00171       if (box.IsEmpty()) {
00172          axis[i] = box.Axis(i, kTRUE)*base*-10.0;
00173       } else {
00174          axis[i] = box.Axis(i, kFALSE)*-0.51;
00175          if (axis[i].Mag() < base*10.0) {
00176             axis[i] = box.Axis(i, kTRUE)*base*-10.0;
00177          }
00178       }
00179    }
00180 }