Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TEveTrackGL.cxx
Go to the documentation of this file.
1 // @(#)root/eve:$Id$
2 // Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #include "TEveTrackGL.h"
13 #include "TEveTrack.h"
14 #include "TEveTrackPropagator.h"
15 
16 #include "TGLIncludes.h"
17 #include "TGLRnrCtx.h"
18 #include "TGLSelectRecord.h"
19 
20 /** \class TEveTrackGL
21 \ingroup TEve
22 GL-renderer for TEveTrack class.
23 */
24 
25 ClassImp(TEveTrackGL);
26 
27 ////////////////////////////////////////////////////////////////////////////////
28 /// Default constructor.
29 
30 TEveTrackGL::TEveTrackGL() : TEveLineGL()
31 {
32  // fDLCache = false; // Disable display list.
33 }
34 
35 ////////////////////////////////////////////////////////////////////////////////
36 /// Set model object.
37 
38 Bool_t TEveTrackGL::SetModel(TObject* obj, const Option_t* /*opt*/)
39 {
40  TEveLineGL::SetModel(obj);
41  fTrack = DynCast<TEveTrack>(obj);
42  return kTRUE;
43 }
44 
45 ////////////////////////////////////////////////////////////////////////////////
46 /// Processes secondary selection from TGLViewer.
47 /// Just calls SecSelected(track) in model object which emits a signal.
48 /// This is used in user code for alternate selection of good / bad tracks.
49 
50 void TEveTrackGL::ProcessSelection(TGLRnrCtx & /*rnrCtx*/, TGLSelectRecord & rec)
51 {
52  if (gDebug > 0)
53  {
54  printf("TEveTrackGL::ProcessSelection %d names on the stack (z1=%g, z2=%g).\n",
55  rec.GetN(), rec.GetMinZ(), rec.GetMaxZ());
56  printf(" Names: ");
57  for (Int_t j=0; j<rec.GetN(); ++j) printf ("%d ", rec.GetItem(j));
58  printf("\n");
59  }
60 
61  fTrack->SecSelected(fTrack);
62 }
63 
64 ////////////////////////////////////////////////////////////////////////////////
65 /// GL rendering code.
66 /// Virtual from TGLLogicalShape.
67 
68 void TEveTrackGL::DirectDraw(TGLRnrCtx & rnrCtx) const
69 {
70  TEveLineGL::DirectDraw(rnrCtx);
71 
72  RenderPathMarksAndFirstVertex(rnrCtx);
73 }
74 
75 ////////////////////////////////////////////////////////////////////////////////
76 /// Render path-marks and the first vertex, if required.
77 
78 void TEveTrackGL::RenderPathMarksAndFirstVertex(TGLRnrCtx& rnrCtx) const
79 {
80  TEveTrackPropagator &rTP = *fTrack->GetPropagator();
81  const TEveTrack::vPathMark_t &pms = fTrack->RefPathMarks();
82  if ( ! pms.empty())
83  {
84  Float_t *pnts = new Float_t[3*pms.size()]; // maximum
85  Int_t cnt = 0;
86  Int_t n = 0;
87  for (Int_t i = 0; i < fTrack->fLastPMIdx; ++i)
88  {
89  const TEvePathMarkD &pm = pms[i];
90  if ((pm.fType == TEvePathMarkD::kDaughter && rTP.GetRnrDaughters()) ||
91  (pm.fType == TEvePathMarkD::kReference && rTP.GetRnrReferences()) ||
92  (pm.fType == TEvePathMarkD::kDecay && rTP.GetRnrDecay()) ||
93  (pm.fType == TEvePathMarkD::kCluster2D && rTP.GetRnrCluster2Ds()))
94  {
95  pnts[n ] = pm.fV.fX;
96  pnts[n+1] = pm.fV.fY;
97  pnts[n+2] = pm.fV.fZ;
98  n += 3;
99  ++cnt;
100  }
101  }
102  TGLUtil::RenderPolyMarkers(rTP.RefPMAtt(), 0, pnts, cnt,
103  rnrCtx.GetPickRadius(),
104  rnrCtx.Selection());
105  delete [] pnts;
106  }
107 
108  // fist vertex
109  if (rTP.GetRnrFV() && fTrack->GetLastPoint())
110  TGLUtil::RenderPolyMarkers(rTP.RefFVAtt(), 0, fTrack->GetP(), 1,
111  rnrCtx.GetPickRadius(),
112  rnrCtx.Selection());
113 }