// @(#)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 "TEveArrowGL.h"
#include "TEveArrow.h"

#include "TGLRnrCtx.h"
#include "TGLIncludes.h"
#include "TGLUtil.h"
#include "TGLQuadric.h"

//______________________________________________________________________________
// OpenGL renderer class for TEveArrow.
//

ClassImp(TEveArrowGL);

//______________________________________________________________________________
TEveArrowGL::TEveArrowGL() :
   TGLObject(), fM(0)
{
   // Constructor.
}

/******************************************************************************/

//______________________________________________________________________________
Bool_t TEveArrowGL::SetModel(TObject* obj, const Option_t* /*opt*/)
{
   // Set model object.

   fM = SetModelDynCast<TEveArrow>(obj);
   return kTRUE;
}

//______________________________________________________________________________
void TEveArrowGL::SetBBox()
{
   // Set bounding box.

   // !! This ok if master sub-classed from TAttBBox
   SetAxisAlignedBBox(((TEveArrow*)fExternalObj)->AssertBBox());
}

/******************************************************************************/

//______________________________________________________________________________
void TEveArrowGL::DirectDraw(TGLRnrCtx& /*rnrCtx*/) const
{
   // Render with OpenGL.

   static TGLQuadric quad;

   glPushMatrix();

   TGLVertex3 uo(fM->fOrigin.fX, fM->fOrigin.fY, fM->fOrigin.fZ);
   TGLVector3 uv(fM->fVector.fX, fM->fVector.fY, fM->fVector.fZ);
   TGLMatrix local(uo, uv);
   glMultMatrixd(local.CArr());
   Float_t size = fM->fVector.Mag();

   // Line (tube) component
   Float_t r = size*fM->fTubeR;
   Float_t h = size*fM->fConeL;
   gluCylinder(quad.Get(), r, r, size - h, fM->fDrawQuality, 1);
   gluQuadricOrientation(quad.Get(), (GLenum)GLU_INSIDE);
   gluDisk(quad.Get(), 0.0, r, fM->fDrawQuality, 1);

   // Arrow cone
   r = size*fM->fConeR;
   glTranslated(0.0, 0.0, size -h );
   gluDisk(quad.Get(), 0.0, r, fM->fDrawQuality, 1);
   gluQuadricOrientation(quad.Get(), (GLenum)GLU_OUTSIDE);
   gluCylinder(quad.Get(), r, 0., h , fM->fDrawQuality, 1);

   glPopMatrix();
}
 TEveArrowGL.cxx:1
 TEveArrowGL.cxx:2
 TEveArrowGL.cxx:3
 TEveArrowGL.cxx:4
 TEveArrowGL.cxx:5
 TEveArrowGL.cxx:6
 TEveArrowGL.cxx:7
 TEveArrowGL.cxx:8
 TEveArrowGL.cxx:9
 TEveArrowGL.cxx:10
 TEveArrowGL.cxx:11
 TEveArrowGL.cxx:12
 TEveArrowGL.cxx:13
 TEveArrowGL.cxx:14
 TEveArrowGL.cxx:15
 TEveArrowGL.cxx:16
 TEveArrowGL.cxx:17
 TEveArrowGL.cxx:18
 TEveArrowGL.cxx:19
 TEveArrowGL.cxx:20
 TEveArrowGL.cxx:21
 TEveArrowGL.cxx:22
 TEveArrowGL.cxx:23
 TEveArrowGL.cxx:24
 TEveArrowGL.cxx:25
 TEveArrowGL.cxx:26
 TEveArrowGL.cxx:27
 TEveArrowGL.cxx:28
 TEveArrowGL.cxx:29
 TEveArrowGL.cxx:30
 TEveArrowGL.cxx:31
 TEveArrowGL.cxx:32
 TEveArrowGL.cxx:33
 TEveArrowGL.cxx:34
 TEveArrowGL.cxx:35
 TEveArrowGL.cxx:36
 TEveArrowGL.cxx:37
 TEveArrowGL.cxx:38
 TEveArrowGL.cxx:39
 TEveArrowGL.cxx:40
 TEveArrowGL.cxx:41
 TEveArrowGL.cxx:42
 TEveArrowGL.cxx:43
 TEveArrowGL.cxx:44
 TEveArrowGL.cxx:45
 TEveArrowGL.cxx:46
 TEveArrowGL.cxx:47
 TEveArrowGL.cxx:48
 TEveArrowGL.cxx:49
 TEveArrowGL.cxx:50
 TEveArrowGL.cxx:51
 TEveArrowGL.cxx:52
 TEveArrowGL.cxx:53
 TEveArrowGL.cxx:54
 TEveArrowGL.cxx:55
 TEveArrowGL.cxx:56
 TEveArrowGL.cxx:57
 TEveArrowGL.cxx:58
 TEveArrowGL.cxx:59
 TEveArrowGL.cxx:60
 TEveArrowGL.cxx:61
 TEveArrowGL.cxx:62
 TEveArrowGL.cxx:63
 TEveArrowGL.cxx:64
 TEveArrowGL.cxx:65
 TEveArrowGL.cxx:66
 TEveArrowGL.cxx:67
 TEveArrowGL.cxx:68
 TEveArrowGL.cxx:69
 TEveArrowGL.cxx:70
 TEveArrowGL.cxx:71
 TEveArrowGL.cxx:72
 TEveArrowGL.cxx:73
 TEveArrowGL.cxx:74
 TEveArrowGL.cxx:75
 TEveArrowGL.cxx:76
 TEveArrowGL.cxx:77
 TEveArrowGL.cxx:78
 TEveArrowGL.cxx:79
 TEveArrowGL.cxx:80
 TEveArrowGL.cxx:81
 TEveArrowGL.cxx:82
 TEveArrowGL.cxx:83
 TEveArrowGL.cxx:84
 TEveArrowGL.cxx:85