// @(#)root/eve:$Id$
// 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 "TGLCameraGuide.h"
#include "TGLRnrCtx.h"
#include "TGLCamera.h"
#include "TGLUtil.h"
#include "TGLIncludes.h"
#include "TGLSelectRecord.h"

#include "TMath.h"

//______________________________________________________________________________
//
// Draws arrows showing camera orientation in the overlay.
// X, Y position is in range 0, 1.

ClassImp(TGLCameraGuide);

//______________________________________________________________________________
TGLCameraGuide::TGLCameraGuide(Float_t x, Float_t y, Float_t s,
                               ERole role, EState state) :
   TGLOverlayElement(role, state),
   fXPos(x), fYPos(y), fSize(s),
   fSelAxis(-1), fInDrag(kFALSE)
{
   // Constructor.
}

//______________________________________________________________________________
Bool_t TGLCameraGuide::MouseEnter(TGLOvlSelectRecord& /*rec*/)
{
   // Mouse has entered overlay area.

   return kTRUE;
}


//______________________________________________________________________
Bool_t TGLCameraGuide::Handle(TGLRnrCtx&          rnrCtx,
                              TGLOvlSelectRecord&  selRec,
                              Event_t*             event)
{
   // Handle overlay event.
   // Return TRUE if event was handled.

   if (selRec.GetN() < 2) return kFALSE;
   Int_t recID = selRec.GetItem(1);

   if (recID == 4)
      fSelAxis = 4;
   else
      fSelAxis = 0;

   switch (event->fType)
   {
      case kButtonPress:
      {
         if (recID == 4)
            fInDrag = kTRUE;
         return kTRUE;
      }
      case kButtonRelease:
      {
         fInDrag = kFALSE;
         return kTRUE;
      }
      case kMotionNotify:
      {
         if (fInDrag)
         {
            const TGLRect& vp = rnrCtx.RefCamera().RefViewport();
            if (vp.Width() == 0 || vp.Height() == 0) return kFALSE;

            fXPos = TMath::Range(0.0f, 1.0f, (Float_t)(event->fX) / vp.Width());
            fYPos = TMath::Range(0.0f, 1.0f, 1.0f - (Float_t)(event->fY) / vp.Height());
         }
         return kTRUE;
      }
      default:
      {
         return kFALSE;
      }
   }
}

//______________________________________________________________________
void TGLCameraGuide::MouseLeave()
{
   // Mouse has left overlay area.

   fSelAxis = -1;
   fInDrag  = kFALSE;
}

//______________________________________________________________________________
void TGLCameraGuide::Render(TGLRnrCtx& rnrCtx)
{
   // Render the camera axis arrows.

   TGLCapabilitySwitch lgt_off(GL_LIGHTING, kFALSE);

   rnrCtx.ProjectionMatrixPushIdentity();
   glPushMatrix();
   glLoadIdentity();
   glTranslatef(-1.0f, -1.0f, 0.0f);
   glScalef(2.0f, 2.0f, -2.0f);
   glTranslatef(fXPos, fYPos, -0.25f);

   Float_t aspect= rnrCtx.RefCamera().RefViewport().Aspect();
   if (aspect > 1)
      glScalef(1.0f / aspect, 1.0f, 1.0f);
   else if (aspect < 1)
      glScalef(1.0f, aspect, 1.0f);

   Float_t dr[2];
   glGetFloatv(GL_DEPTH_RANGE, dr);
   glDepthRange(0, 0.01);

   TGLVertex3 c;
   TGLVector3 e;
   const TGLMatrix &mv = rnrCtx.RefCamera().RefModelViewMatrix();

   glPushName(1);
   mv.GetBaseVec(1, e);
   e *= fSize;
   TGLUtil::DrawLine(c, e, TGLUtil::kLineHeadArrow, 0.1*fSize,
                     fSelAxis == 1 ? TGLUtil::fgYellow : TGLUtil::fgRed);

   glLoadName(2);
   mv.GetBaseVec(2, e);
   e *= fSize;
   TGLUtil::DrawLine(c, e, TGLUtil::kLineHeadArrow, 0.1*fSize,
                     fSelAxis == 2 ? TGLUtil::fgYellow : TGLUtil::fgGreen);

   glLoadName(3);
   mv.GetBaseVec(3, e);
   e *= fSize;
   TGLUtil::DrawLine(c, e, TGLUtil::kLineHeadArrow, 0.1*fSize,
                     fSelAxis == 3 ? TGLUtil::fgYellow : TGLUtil::fgBlue);

   glLoadName(4);
   TGLUtil::DrawSphere(c, 0.08*fSize,
                       fSelAxis == 4 ? TGLUtil::fgYellow : rnrCtx.ColorSet().Foreground().CArr());

   glPopName();

   glDepthRange(dr[0], dr[1]);

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