ROOT logo
// @(#)root/eve:$Id: TEveJetConeGL.cxx 28506 2009-05-08 16:57:18Z matevz $
// Author: Matevz Tadel, Jochen Thaeder 2009

/*************************************************************************
 * 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 "TEveJetConeGL.h"
#include "TEveJetCone.h"

#include "TMath.h"

#include "TGLRnrCtx.h"
#include "TGLIncludes.h"

//______________________________________________________________________________
// OpenGL renderer class for TEveJetCone.
//

ClassImp(TEveJetConeGL);

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

   fDLCache = kFALSE; // Disable display list.
}

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

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

   if (SetModelCheckClass(obj, TEveJetCone::Class())) {
      fM = dynamic_cast<TEveJetCone*>(obj);
      return kTRUE;
   }
   return kFALSE;
}

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

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

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

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

   // printf("TEveJetConeGL::DirectDraw LOD %d\n", rnrCtx.CombiLOD());

   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);

   glDisable(GL_CULL_FACE);
   glEnable(GL_NORMALIZE);

   glBegin(GL_TRIANGLE_FAN);
   glVertex3fv(fM->fApex);
   if ( fM->fBasePoints.size() > 2)
   {
      TEveJetCone::vTEveVector_ci prev = fM->fBasePoints.end(); --prev;
      TEveJetCone::vTEveVector_ci i    = fM->fBasePoints.begin();
      TEveJetCone::vTEveVector_ci next = i; ++next;

      TEveVector norm_buf;
      TEveVector beg_normal = TMath::Cross((*i - fM->fApex).Arr(), (*next - *prev).Arr(), norm_buf.Arr());

      glNormal3fv(beg_normal);
      glVertex3fv(fM->fBasePoints.front());

      prev = i;  i = next;  ++next;

      while (i != fM->fBasePoints.begin())
      {
         glNormal3fv(TMath::Cross((*i - fM->fApex).Arr(), (*next - *prev).Arr(), norm_buf.Arr()));
         glVertex3fv(*i);

         prev = i;
         i    = next;
         ++next; if (next == fM->fBasePoints.end()) next = fM->fBasePoints.begin();
      }

      glNormal3fv(beg_normal);
      glVertex3fv(fM->fBasePoints.front());
   }
   glEnd();

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