ROOT logo
// @(#)root/eve:$Id: TGLAutoRotator.cxx 36373 2010-10-19 17:43:35Z matevz $
// Author: Matevz Tadel 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.             *
 *************************************************************************/

#include "TGLAutoRotator.h"

#include "TGLViewer.h"
#include "TGLCamera.h"

#include "TMath.h"
#include "TTimer.h"
#include "TStopwatch.h"

//______________________________________________________________________________
//
// Automatically rotates GL camera.
//
// W's are angular velocities.
// ATheta -- Theta amplitude in units of Pi/2.
// ADolly -- In/out amplitude in units of initial distance.

ClassImp(TGLAutoRotator);

//______________________________________________________________________________
TGLAutoRotator::TGLAutoRotator(TGLViewer* v) :
   fViewer(v), fCamera(0),
   fTimer(new TTimer), fWatch(new TStopwatch),
   fDt    (0.01),
   fWPhi  (0.40),
   fWTheta(0.15), fATheta(0.5),
   fWDolly(0.30), fADolly(0.4),
   fTimerRunning(kFALSE)
{
   // Constructor.

   fTimer->Connect("Timeout()", "TGLAutoRotator", this, "Timeout()");
}

//______________________________________________________________________________
TGLAutoRotator::~TGLAutoRotator()
{
   // Destructor.

   delete fWatch;
   delete fTimer;
}

//==============================================================================

//______________________________________________________________________________
void TGLAutoRotator::SetDt(Double_t dt)
{
   // Set time between two redraws in seconds.
   // Range: 0.001 -> 1.

   fDt = TMath::Range(0.01, 1.0, dt);
   if (fTimerRunning)
   {
      fTimer->SetTime(TMath::Nint(1000*fDt));
      fTimer->Reset();
   }
}

//______________________________________________________________________________
void TGLAutoRotator::SetATheta(Double_t a)
{
   // Set relative amplitude of theta oscilation.
   // Value range: 0.01 -> 1.

   a = TMath::Range(0.01, 1.0, a);
   if (fTimerRunning)
   {
      fThetaA0 = fThetaA0 * a / fATheta;
   }
   fATheta = a;
}

//______________________________________________________________________________
void TGLAutoRotator::SetADolly(Double_t a)
{
   // Set relative amplitude of forward/backward oscilation.
   // Value range: 0.01 -> 1.

  a = TMath::Range(0.01, 1.0, a);
  if (fTimerRunning)
  {
     fDollyA0 = fDollyA0 * a / fADolly;
  }
  fADolly = a;
}

//==============================================================================

//______________________________________________________________________________
void TGLAutoRotator::Start()
{
   if (fTimerRunning)
   {
      Stop();
   }

   fCamera = & fViewer->CurrentCamera();

   fThetaA0 = fATheta * TMath::PiOver2();
   fDollyA0 = fADolly * fCamera->GetCamTrans().GetBaseVec(4).Mag();

   fTimerRunning = kTRUE;
   fTimer->SetTime(TMath::Nint(1000*fDt));
   fTimer->Reset();
   fTimer->TurnOn();
   fWatch->Start();
}

//______________________________________________________________________________
void TGLAutoRotator::Stop()
{
   if (fTimerRunning)
   {
      fWatch->Stop();
      fTimer->TurnOff();
      fTimerRunning = kFALSE;
   }
}

//______________________________________________________________________________
void TGLAutoRotator::Timeout()
{
   if (!fTimerRunning || gTQSender != fTimer)
   {
      Error("Timeout", "Not running or not called via timer.");
      return;
   }

   using namespace TMath;

   fWatch->Stop();
   Double_t time = fWatch->RealTime();
   fWatch->Continue();

   Double_t delta_p = fWPhi*fDt;
   Double_t delta_t = fThetaA0*fWTheta*Cos(fWTheta*time)*fDt;
   Double_t delta_d = fDollyA0*fWDolly*Cos(fWDolly*time)*fDt;
   Double_t th      = fCamera->GetTheta();

   if (th + delta_t > 3.0 || th + delta_t < 0.1416)
      delta_t = 0;

   fCamera->RotateRad(delta_t, delta_p);
   fCamera->RefCamTrans().MoveLF(1, -delta_d);

   fViewer->RequestDraw(TGLRnrCtx::kLODHigh);
}
 TGLAutoRotator.cxx:1
 TGLAutoRotator.cxx:2
 TGLAutoRotator.cxx:3
 TGLAutoRotator.cxx:4
 TGLAutoRotator.cxx:5
 TGLAutoRotator.cxx:6
 TGLAutoRotator.cxx:7
 TGLAutoRotator.cxx:8
 TGLAutoRotator.cxx:9
 TGLAutoRotator.cxx:10
 TGLAutoRotator.cxx:11
 TGLAutoRotator.cxx:12
 TGLAutoRotator.cxx:13
 TGLAutoRotator.cxx:14
 TGLAutoRotator.cxx:15
 TGLAutoRotator.cxx:16
 TGLAutoRotator.cxx:17
 TGLAutoRotator.cxx:18
 TGLAutoRotator.cxx:19
 TGLAutoRotator.cxx:20
 TGLAutoRotator.cxx:21
 TGLAutoRotator.cxx:22
 TGLAutoRotator.cxx:23
 TGLAutoRotator.cxx:24
 TGLAutoRotator.cxx:25
 TGLAutoRotator.cxx:26
 TGLAutoRotator.cxx:27
 TGLAutoRotator.cxx:28
 TGLAutoRotator.cxx:29
 TGLAutoRotator.cxx:30
 TGLAutoRotator.cxx:31
 TGLAutoRotator.cxx:32
 TGLAutoRotator.cxx:33
 TGLAutoRotator.cxx:34
 TGLAutoRotator.cxx:35
 TGLAutoRotator.cxx:36
 TGLAutoRotator.cxx:37
 TGLAutoRotator.cxx:38
 TGLAutoRotator.cxx:39
 TGLAutoRotator.cxx:40
 TGLAutoRotator.cxx:41
 TGLAutoRotator.cxx:42
 TGLAutoRotator.cxx:43
 TGLAutoRotator.cxx:44
 TGLAutoRotator.cxx:45
 TGLAutoRotator.cxx:46
 TGLAutoRotator.cxx:47
 TGLAutoRotator.cxx:48
 TGLAutoRotator.cxx:49
 TGLAutoRotator.cxx:50
 TGLAutoRotator.cxx:51
 TGLAutoRotator.cxx:52
 TGLAutoRotator.cxx:53
 TGLAutoRotator.cxx:54
 TGLAutoRotator.cxx:55
 TGLAutoRotator.cxx:56
 TGLAutoRotator.cxx:57
 TGLAutoRotator.cxx:58
 TGLAutoRotator.cxx:59
 TGLAutoRotator.cxx:60
 TGLAutoRotator.cxx:61
 TGLAutoRotator.cxx:62
 TGLAutoRotator.cxx:63
 TGLAutoRotator.cxx:64
 TGLAutoRotator.cxx:65
 TGLAutoRotator.cxx:66
 TGLAutoRotator.cxx:67
 TGLAutoRotator.cxx:68
 TGLAutoRotator.cxx:69
 TGLAutoRotator.cxx:70
 TGLAutoRotator.cxx:71
 TGLAutoRotator.cxx:72
 TGLAutoRotator.cxx:73
 TGLAutoRotator.cxx:74
 TGLAutoRotator.cxx:75
 TGLAutoRotator.cxx:76
 TGLAutoRotator.cxx:77
 TGLAutoRotator.cxx:78
 TGLAutoRotator.cxx:79
 TGLAutoRotator.cxx:80
 TGLAutoRotator.cxx:81
 TGLAutoRotator.cxx:82
 TGLAutoRotator.cxx:83
 TGLAutoRotator.cxx:84
 TGLAutoRotator.cxx:85
 TGLAutoRotator.cxx:86
 TGLAutoRotator.cxx:87
 TGLAutoRotator.cxx:88
 TGLAutoRotator.cxx:89
 TGLAutoRotator.cxx:90
 TGLAutoRotator.cxx:91
 TGLAutoRotator.cxx:92
 TGLAutoRotator.cxx:93
 TGLAutoRotator.cxx:94
 TGLAutoRotator.cxx:95
 TGLAutoRotator.cxx:96
 TGLAutoRotator.cxx:97
 TGLAutoRotator.cxx:98
 TGLAutoRotator.cxx:99
 TGLAutoRotator.cxx:100
 TGLAutoRotator.cxx:101
 TGLAutoRotator.cxx:102
 TGLAutoRotator.cxx:103
 TGLAutoRotator.cxx:104
 TGLAutoRotator.cxx:105
 TGLAutoRotator.cxx:106
 TGLAutoRotator.cxx:107
 TGLAutoRotator.cxx:108
 TGLAutoRotator.cxx:109
 TGLAutoRotator.cxx:110
 TGLAutoRotator.cxx:111
 TGLAutoRotator.cxx:112
 TGLAutoRotator.cxx:113
 TGLAutoRotator.cxx:114
 TGLAutoRotator.cxx:115
 TGLAutoRotator.cxx:116
 TGLAutoRotator.cxx:117
 TGLAutoRotator.cxx:118
 TGLAutoRotator.cxx:119
 TGLAutoRotator.cxx:120
 TGLAutoRotator.cxx:121
 TGLAutoRotator.cxx:122
 TGLAutoRotator.cxx:123
 TGLAutoRotator.cxx:124
 TGLAutoRotator.cxx:125
 TGLAutoRotator.cxx:126
 TGLAutoRotator.cxx:127
 TGLAutoRotator.cxx:128
 TGLAutoRotator.cxx:129
 TGLAutoRotator.cxx:130
 TGLAutoRotator.cxx:131
 TGLAutoRotator.cxx:132
 TGLAutoRotator.cxx:133
 TGLAutoRotator.cxx:134
 TGLAutoRotator.cxx:135
 TGLAutoRotator.cxx:136
 TGLAutoRotator.cxx:137
 TGLAutoRotator.cxx:138
 TGLAutoRotator.cxx:139
 TGLAutoRotator.cxx:140
 TGLAutoRotator.cxx:141
 TGLAutoRotator.cxx:142
 TGLAutoRotator.cxx:143
 TGLAutoRotator.cxx:144
 TGLAutoRotator.cxx:145
 TGLAutoRotator.cxx:146
 TGLAutoRotator.cxx:147
 TGLAutoRotator.cxx:148
 TGLAutoRotator.cxx:149
 TGLAutoRotator.cxx:150
 TGLAutoRotator.cxx:151
 TGLAutoRotator.cxx:152
 TGLAutoRotator.cxx:153
 TGLAutoRotator.cxx:154
 TGLAutoRotator.cxx:155
 TGLAutoRotator.cxx:156
 TGLAutoRotator.cxx:157
 TGLAutoRotator.cxx:158
 TGLAutoRotator.cxx:159