// @(#)root/gl:$Name:  $:$Id: TGLOrthoCamera.cxx,v 1.5 2005/06/21 16:54:17 brun Exp $
// Author:  Richard Maunder  25/05/2005
// Parts taken from original by Timur Pocheptsov

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

// TODO: Function descriptions
// TODO: Class def - same as header

#include "TGLOrthoCamera.h"
#include "TGLUtil.h"
#include "TGLIncludes.h"

#include "TMath.h"
#include "Riostream.h"

ClassImp(TGLOrthoCamera)

UInt_t   TGLOrthoCamera::fgZoomDeltaSens = 1000;

//______________________________________________________________________________
 TGLOrthoCamera::TGLOrthoCamera(EType type) :
   fType(type), 
   fZoomMin(0.01), fZoomDefault(1.0), fZoomMax(100.0),
   fVolumeDiag(100.0), fWidth(100), fHeight(100), fZoom(1.0),
   fCenter(0.0, 0.0, 0.0), fTruck(0.0, 0.0, 0.0), fMatrix()
{
   Setup(TGLBoundingBox(TGLVertex3(-100,-100,-100), TGLVertex3(100,100,100)));
}

//______________________________________________________________________________
 TGLOrthoCamera::~TGLOrthoCamera()
{
}

//______________________________________________________________________________
 void TGLOrthoCamera::Setup(const TGLBoundingBox & box)
{
   fCenter = box.Center();

   static const Double_t rotMatrixXOY[] = {1., 0.,  0., 0.,
                                           0., 1.,  0., 0.,
                                           0., 0.,  1., 0.,
                                           0., 0.,  0., 1.};
   static const Double_t rotMatrixYOZ[] = {1.,  0.,  0.,  0.,
                                           0.,  0., -1.,  0.,
                                           0.,  1.,  0.,  0.,
                                           0.,  0.,  0.,  1.};
   static const Double_t rotMatrixXOZ[] = { 0.,  0.,  1.,  0.,
                                            0.,  1.,  0.,  0.,
                                           -1.,  0.,  0.,  0.,
                                            0.,  0.,  0.,  1.};

   switch (fType) {
      case (kXOY): {
         fWidth = box.XMax() - box.XMin();
         fHeight = box.YMax() - box.YMin();
         fMatrix.Set(rotMatrixXOY);
         break;
      }
      case (kYOZ): {
         fWidth = box.YMax() - box.YMin();
         fHeight = box.ZMax() - box.ZMin();
         fMatrix.Set(rotMatrixYOZ);
         break;
      }
      case (kXOZ): {
         fWidth = box.XMax() - box.XMin();
         fHeight = box.ZMax() - box.ZMin();
         fMatrix.Set(rotMatrixXOZ);
         break;
      }
   }
   fVolumeDiag = box.Extents().Mag();
   fZoomMin = 0.5;
   fZoomDefault = 0.95;
   fZoomMax = 30.0;
   Reset();
}

//______________________________________________________________________________
 void TGLOrthoCamera::Reset()
{
   fTruck.Set(-fCenter.X(), -fCenter.Y(), -fCenter.Z());
   fZoom   = fZoomDefault;
   fCacheDirty = kTRUE;
}

//______________________________________________________________________________
 Bool_t TGLOrthoCamera::Dolly(Int_t delta, Bool_t mod1, Bool_t mod2)
{
   return Zoom(delta, mod1, mod2);
}

//______________________________________________________________________________
 Bool_t TGLOrthoCamera::Zoom (Int_t delta, Bool_t mod1, Bool_t mod2)
{
   if (AdjustAndClampVal(fZoom, fZoomMin, fZoomMax, -delta, fgZoomDeltaSens, mod1, mod2))
   {
      fCacheDirty = kTRUE;
      return kTRUE;
   }
   else
   {
      return kFALSE;
   }
}

//______________________________________________________________________________
 Bool_t TGLOrthoCamera::Truck(Int_t x, Int_t y, Int_t xDelta, Int_t yDelta)
{
   //TODO: Convert TGLRect so this not required
   GLint viewport[4] = { fViewport.X(), fViewport.Y(), fViewport.Width(), fViewport.Height() };
   TGLVertex3 start, end;
   gluUnProject(x, y, 0.0, fModVM.CArr(), fProjM.CArr(), viewport, &start.X(), &start.Y(), &start.Z());
   gluUnProject(x + xDelta, y + yDelta, 0.0, fModVM.CArr(), fProjM.CArr(), viewport, &end.X(), &end.Y(), &end.Z());
   fTruck = fTruck + (end - start);
   fCacheDirty = kTRUE;
   return kTRUE;
}

//______________________________________________________________________________
 Bool_t TGLOrthoCamera::Rotate(Int_t /*xDelta*/, Int_t /*yDelta*/)
{
   // Not allowed at present - could let the user or external code create non-axis
   // ortho projects by adjusting H/V rotations
   return kFALSE;
}

//______________________________________________________________________________
 void TGLOrthoCamera::Apply(const TGLBoundingBox & /*box*/, const TGLRect * pickRect)
{
   glViewport(fViewport.X(), fViewport.Y(), fViewport.Width(), fViewport.Height());

   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();

   // Load up any picking rect
   if (pickRect) {
      //TODO: Convert TGLRect so this not required
      GLint viewport[4] = { fViewport.X(), fViewport.Y(), fViewport.Width(), fViewport.Height() };
      gluPickMatrix(pickRect->X(), pickRect->Y(),
                    pickRect->Width(), pickRect->Height(),
                    viewport);
   }

   if(fViewport.Width() == 0 || fViewport.Height() == 0) {
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
   } else {
      Double_t biggest = fWidth > fHeight ? fWidth:fHeight;
      glOrtho(-biggest/2.0, biggest/2.0, -biggest/2.0, biggest/2.0, fVolumeDiag, 3.0*fVolumeDiag);
      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();
      glTranslated(0.0, 0.0, -2.0*fVolumeDiag);
      glScaled(fZoom, fZoom*fViewport.Aspect(), 1.0);
      glMultMatrixd(fMatrix.CArr());
      glTranslated(fTruck.X(), fTruck.Y(), fTruck.Z());
   }

   if (fCacheDirty) {
      UpdateCache();
   }
}





ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.