ROOT logo
// @(#)root/gl:$Id: TGLManip.cxx 29755 2009-08-11 17:38:16Z matevz $
// Author:  Richard Maunder  16/09/2005

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

#include "TGLManip.h"
#include "TGLUtil.h"
#include "TGLCamera.h"
#include "TGLPhysicalShape.h"
#include "TGLIncludes.h"
#include "TROOT.h"

#include "TVirtualX.h"

//______________________________________________________________________________
//                                                                      
// Abstract base class for viewer manipulators, which allow direct in   
// viewer manipulation of a (TGlPhysicalShape) object - currently       
// translation, scaling and rotation along/round objects local axes.    
// See derived classes for these implementations.                       
//                                                                      
// This class provides binding to the zero or one manipulated physical, 
// hit testing (selection) for manipulator sub component (widget), and  
// some common mouse action handling/tracking.                          

ClassImp(TGLManip);

Float_t TGLManip::fgRed[4]    = { 0.8, 0.0, 0.0, 1.0 };
Float_t TGLManip::fgGreen[4]  = { 0.0, 0.8, 0.0, 1.0 };
Float_t TGLManip::fgBlue[4]   = { 0.0, 0.0, 0.8, 1.0 };
Float_t TGLManip::fgYellow[4] = { 0.8, 0.8, 0.0, 1.0 };
Float_t TGLManip::fgWhite[4]  = { 1.0, 1.0, 1.0, 1.0 };
Float_t TGLManip::fgGrey[4]   = { 0.5, 0.5, 0.5, 0.4 };

//______________________________________________________________________________
TGLManip::TGLManip() :
   fShape(0),
   fSelectedWidget(0), fActive(kFALSE),
   fFirstMouse(0, 0),
   fLastMouse(0, 0)
{
   // Construct a manipulator object, bound to supplied viewer, and no
   // physical shape.
}

//______________________________________________________________________________
TGLManip::TGLManip(TGLPhysicalShape* shape) :
   fShape(shape),
   fSelectedWidget(0), fActive(kFALSE),
   fFirstMouse(0, 0),
   fLastMouse(0, 0)
{
   // Construct a manipulator object, bound to supplied physical shape.
}

//______________________________________________________________________________
TGLManip::TGLManip(const TGLManip& gm) :
  TVirtualGLManip(gm),
  fShape(gm.fShape),
  fSelectedWidget(gm.fSelectedWidget),
  fActive(gm.fActive),
  fFirstMouse(gm.fFirstMouse),
  fLastMouse(gm.fLastMouse)
{
   // Copy constructor.
}

//______________________________________________________________________________
TGLManip& TGLManip::operator=(const TGLManip& gm)
{
   // Assignement operator.

   if(this!=&gm) {
      TVirtualGLManip::operator=(gm);
      fShape=gm.fShape;
      fSelectedWidget=gm.fSelectedWidget;
      fActive=gm.fActive;
      fFirstMouse=gm.fFirstMouse;
      fLastMouse=gm.fLastMouse;
      for(Int_t i=0; i<4; i++) {
         fgRed[i]=gm.fgRed[i];
         fgGreen[i]=gm.fgGreen[i];
         fgBlue[i]=gm.fgBlue[i];
         fgYellow[i]=gm.fgYellow[i];
         fgWhite[i]=gm.fgWhite[i];
         fgGrey[i]=gm.fgGrey[i];
      }
   }
   return *this;
}

//______________________________________________________________________________
TGLManip::~TGLManip()
{
   // Destroy manipulator object.
}

//______________________________________________________________________________
Bool_t TGLManip::HandleButton(const Event_t& event, const TGLCamera& /*camera*/)
{
   // Handle a mouse button event - return kTRUE if processed, kFALSE otherwise

   // Only interested in Left mouse button actions
   if (event.fCode != kButton1) {
      return kFALSE;
   }

   // Mouse down on selected widget?
   if (event.fType == kButtonPress && fSelectedWidget != 0) {
      fFirstMouse.SetX(event.fX);
      fFirstMouse.SetY(event.fY);
      fLastMouse.SetX(event.fX);
      fLastMouse.SetY(event.fY);
      fActive = kTRUE;
      return kTRUE;
   } else if (event.fType == kButtonRelease && fActive) {
      fActive = kFALSE;
      return kTRUE;
   } else {
      return kFALSE;
   }
}

//______________________________________________________________________________
Bool_t TGLManip::HandleMotion(const Event_t&   /*event*/,
                              const TGLCamera& /*camera*/)
{
   // Handle a mouse button event - return kTRUE if widget selection change
   // kFALSE otherwise

   return kFALSE;
}

//______________________________________________________________________________
void TGLManip::CalcDrawScale(const TGLBoundingBox& box,
                             const TGLCamera&      camera,
                             Double_t&             base,
                             TGLVector3            axis[3]) const
{
   // Calculates base and axis scale factor (in world units) for
   // drawing manipulators with reasonable size range in current
   // camera.

   // Calculate a base scale
   base = box.Extents().Mag() / 100.0;

   // Clamp this base scale to a viewport pixel range
   // Allow some variation so zooming is noticable
   TGLVector3 pixelInWorld = camera.ViewportDeltaToWorld(box.Center(), 1, 1);
   Double_t pixelScale = pixelInWorld.Mag();
   if (base < pixelScale * 3.0) {
      base = pixelScale * 3.0;
   } else if (base > pixelScale * 6.0) {
      base = pixelScale * 6.0;
   }

   // Calculate some axis scales
   for (UInt_t i = 0; i<3; i++) {
      if (box.IsEmpty()) {
         axis[i] = box.Axis(i, kTRUE)*base*-10.0;
      } else {
         axis[i] = box.Axis(i, kFALSE)*-0.51;
         if (axis[i].Mag() < base*10.0) {
            axis[i] = box.Axis(i, kTRUE)*base*-10.0;
         }
      }
   }
}
 TGLManip.cxx:1
 TGLManip.cxx:2
 TGLManip.cxx:3
 TGLManip.cxx:4
 TGLManip.cxx:5
 TGLManip.cxx:6
 TGLManip.cxx:7
 TGLManip.cxx:8
 TGLManip.cxx:9
 TGLManip.cxx:10
 TGLManip.cxx:11
 TGLManip.cxx:12
 TGLManip.cxx:13
 TGLManip.cxx:14
 TGLManip.cxx:15
 TGLManip.cxx:16
 TGLManip.cxx:17
 TGLManip.cxx:18
 TGLManip.cxx:19
 TGLManip.cxx:20
 TGLManip.cxx:21
 TGLManip.cxx:22
 TGLManip.cxx:23
 TGLManip.cxx:24
 TGLManip.cxx:25
 TGLManip.cxx:26
 TGLManip.cxx:27
 TGLManip.cxx:28
 TGLManip.cxx:29
 TGLManip.cxx:30
 TGLManip.cxx:31
 TGLManip.cxx:32
 TGLManip.cxx:33
 TGLManip.cxx:34
 TGLManip.cxx:35
 TGLManip.cxx:36
 TGLManip.cxx:37
 TGLManip.cxx:38
 TGLManip.cxx:39
 TGLManip.cxx:40
 TGLManip.cxx:41
 TGLManip.cxx:42
 TGLManip.cxx:43
 TGLManip.cxx:44
 TGLManip.cxx:45
 TGLManip.cxx:46
 TGLManip.cxx:47
 TGLManip.cxx:48
 TGLManip.cxx:49
 TGLManip.cxx:50
 TGLManip.cxx:51
 TGLManip.cxx:52
 TGLManip.cxx:53
 TGLManip.cxx:54
 TGLManip.cxx:55
 TGLManip.cxx:56
 TGLManip.cxx:57
 TGLManip.cxx:58
 TGLManip.cxx:59
 TGLManip.cxx:60
 TGLManip.cxx:61
 TGLManip.cxx:62
 TGLManip.cxx:63
 TGLManip.cxx:64
 TGLManip.cxx:65
 TGLManip.cxx:66
 TGLManip.cxx:67
 TGLManip.cxx:68
 TGLManip.cxx:69
 TGLManip.cxx:70
 TGLManip.cxx:71
 TGLManip.cxx:72
 TGLManip.cxx:73
 TGLManip.cxx:74
 TGLManip.cxx:75
 TGLManip.cxx:76
 TGLManip.cxx:77
 TGLManip.cxx:78
 TGLManip.cxx:79
 TGLManip.cxx:80
 TGLManip.cxx:81
 TGLManip.cxx:82
 TGLManip.cxx:83
 TGLManip.cxx:84
 TGLManip.cxx:85
 TGLManip.cxx:86
 TGLManip.cxx:87
 TGLManip.cxx:88
 TGLManip.cxx:89
 TGLManip.cxx:90
 TGLManip.cxx:91
 TGLManip.cxx:92
 TGLManip.cxx:93
 TGLManip.cxx:94
 TGLManip.cxx:95
 TGLManip.cxx:96
 TGLManip.cxx:97
 TGLManip.cxx:98
 TGLManip.cxx:99
 TGLManip.cxx:100
 TGLManip.cxx:101
 TGLManip.cxx:102
 TGLManip.cxx:103
 TGLManip.cxx:104
 TGLManip.cxx:105
 TGLManip.cxx:106
 TGLManip.cxx:107
 TGLManip.cxx:108
 TGLManip.cxx:109
 TGLManip.cxx:110
 TGLManip.cxx:111
 TGLManip.cxx:112
 TGLManip.cxx:113
 TGLManip.cxx:114
 TGLManip.cxx:115
 TGLManip.cxx:116
 TGLManip.cxx:117
 TGLManip.cxx:118
 TGLManip.cxx:119
 TGLManip.cxx:120
 TGLManip.cxx:121
 TGLManip.cxx:122
 TGLManip.cxx:123
 TGLManip.cxx:124
 TGLManip.cxx:125
 TGLManip.cxx:126
 TGLManip.cxx:127
 TGLManip.cxx:128
 TGLManip.cxx:129
 TGLManip.cxx:130
 TGLManip.cxx:131
 TGLManip.cxx:132
 TGLManip.cxx:133
 TGLManip.cxx:134
 TGLManip.cxx:135
 TGLManip.cxx:136
 TGLManip.cxx:137
 TGLManip.cxx:138
 TGLManip.cxx:139
 TGLManip.cxx:140
 TGLManip.cxx:141
 TGLManip.cxx:142
 TGLManip.cxx:143
 TGLManip.cxx:144
 TGLManip.cxx:145
 TGLManip.cxx:146
 TGLManip.cxx:147
 TGLManip.cxx:148
 TGLManip.cxx:149
 TGLManip.cxx:150
 TGLManip.cxx:151
 TGLManip.cxx:152
 TGLManip.cxx:153
 TGLManip.cxx:154
 TGLManip.cxx:155
 TGLManip.cxx:156
 TGLManip.cxx:157
 TGLManip.cxx:158
 TGLManip.cxx:159
 TGLManip.cxx:160
 TGLManip.cxx:161
 TGLManip.cxx:162
 TGLManip.cxx:163
 TGLManip.cxx:164
 TGLManip.cxx:165
 TGLManip.cxx:166
 TGLManip.cxx:167
 TGLManip.cxx:168
 TGLManip.cxx:169
 TGLManip.cxx:170
 TGLManip.cxx:171
 TGLManip.cxx:172
 TGLManip.cxx:173
 TGLManip.cxx:174