]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/EveDet/AliEveTPCSector3DGL.cxx
Coverity
[u/mrichter/AliRoot.git] / EVE / EveDet / AliEveTPCSector3DGL.cxx
CommitLineData
d810d0de 1// $Id$
2// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
dcb55984 3
d810d0de 4/**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
51346b82 7 * full copyright notice. *
d810d0de 8 **************************************************************************/
9
10#include "AliEveTPCSector3DGL.h"
cb4245bb 11#include <EveDet/AliEveTPCSector3D.h>
dcb55984 12
84aff7a4 13#include <TEveBoxSetGL.h>
dcb55984 14
19208112 15#include <TGLIncludes.h>
32e219c2 16#include <TGLRnrCtx.h>
17#include <TGLSelectRecord.h>
d810d0de 18
57ffa5fb 19//______________________________________________________________________________
dcb55984 20//
a97abca8 21// GL renderer for AliEveTPCSector3D.
dcb55984 22
d810d0de 23ClassImp(AliEveTPCSector3DGL)
dcb55984 24
d810d0de 25AliEveTPCSector3DGL::AliEveTPCSector3DGL() :
265ecb21 26 TGLObject(),
27 fSector(0), fBoxRnr(0),
28 fRTS(0)
dcb55984 29{
a97abca8 30 // Constructor.
31
9a1831fd 32 fDLCache = false; // Disable display list.
dcb55984 33}
34
d810d0de 35AliEveTPCSector3DGL::~AliEveTPCSector3DGL()
dcb55984 36{
a97abca8 37 // Destructor.
38
dcb55984 39 delete fBoxRnr;
40}
41
57ffa5fb 42/******************************************************************************/
dcb55984 43
32e219c2 44//______________________________________________________________________________
d810d0de 45Short_t AliEveTPCSector3DGL::QuantizeShapeLOD(Short_t shapeLOD, Short_t combiLOD) const
32e219c2 46{
47 // Factor in scene/viewer LOD and quantize.
48
49 Int_t lod = ((Int_t)shapeLOD * (Int_t)combiLOD) / 100;
50
51 if (lod >= 100)
52 return 100;
53 else
54 return (Short_t)(10 * TMath::Nint(0.1*lod));
55}
56
57ffa5fb 57/******************************************************************************/
32e219c2 58
d810d0de 59Bool_t AliEveTPCSector3DGL::SetModel(TObject* obj, const Option_t* /*opt*/)
dcb55984 60{
a97abca8 61 // Set model object.
62
d810d0de 63 if(SetModelCheckClass(obj, AliEveTPCSector3D::Class())) {
64 fSector = (AliEveTPCSector3D*) fExternalObj;
dcb55984 65 if(fBoxRnr == 0) {
84aff7a4 66 fBoxRnr = new TEveBoxSetGL;
dcb55984 67 fBoxRnr->SetModel(&fSector->fBoxSet);
68 }
69 return kTRUE;
70 }
71 return kFALSE;
72}
73
d810d0de 74void AliEveTPCSector3DGL::SetBBox()
dcb55984 75{
a97abca8 76 // Set bounding-box.
77
d810d0de 78 SetAxisAlignedBBox(((AliEveTPCSector3D*)fExternalObj)->AssertBBox());
dcb55984 79}
80
57ffa5fb 81/******************************************************************************/
dcb55984 82
d810d0de 83void AliEveTPCSector3DGL::DirectDraw(TGLRnrCtx & rnrCtx) const
dcb55984 84{
a97abca8 85 // Render object.
86
d810d0de 87 // printf("AliEveTPCSector3DGL::DirectDraw Style %d, LOD %d\n", rnrCtx.Style(), rnrCtx.LOD());
dcb55984 88
7b7bcadc 89 if(fRTS < fSector->fRTS) {
a97abca8 90 fSector->UpdateBoxesAndPoints();
7b7bcadc 91 fRTS = fSector->fRTS;
51346b82 92 }
7b7bcadc 93
32e219c2 94 if (rnrCtx.SecSelection()) glPushName(0);
95
7b7bcadc 96 Bool_t hasData = (fSector->GetSectorData() != 0);
97
98 if(hasData)
32e219c2 99 {
100 if (rnrCtx.SecSelection()) glLoadName(9999);
19208112 101 fBoxRnr->Render(rnrCtx);
32e219c2 102 }
dcb55984 103
6a3de3d4 104 glPushAttrib(GL_CURRENT_BIT | GL_POINT_BIT | GL_ENABLE_BIT);
105 glDisable(GL_LIGHTING);
9a7ad6a0 106
32e219c2 107 if(hasData && fSector->fPointSetOn)
108 {
9a7ad6a0 109 glEnable(GL_BLEND);
110 glEnable(GL_POINT_SMOOTH);
6a3de3d4 111 glPointSize(fSector->fPointSize);
9a7ad6a0 112
113 glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
114 glEnableClientState(GL_VERTEX_ARRAY);
115
84aff7a4 116 const TEvePointSetArray& psa = fSector->fPointSetArray;
32e219c2 117 for(Int_t b=0; b<psa.GetNBins(); ++b)
118 {
84aff7a4 119 TEvePointSet* ps = psa.GetBin(b);
32e219c2 120 if(ps->Size() > 0)
121 {
a15e6d7d 122 TGLUtil::Color(ps->GetMarkerColor());
9a7ad6a0 123
32e219c2 124 if (rnrCtx.SecSelection()) glLoadName(b + 1);
f80216f6 125 glVertexPointer(3, GL_FLOAT, 0, ps->GetP());
7b7bcadc 126 glDrawArrays(GL_POINTS, 0, ps->Size());
f80216f6 127 }
9a7ad6a0 128 }
129
130 glPopClientAttrib();
9a7ad6a0 131 }
132
32e219c2 133 if(fSector->fRnrFrame && ! rnrCtx.SecSelection())
134 {
a15e6d7d 135 TGLUtil::Color(fSector->fFrameColor);
dcb55984 136
137 if(fSector->fRnrInn)
d810d0de 138 DrawSegmentFrame(AliEveTPCSectorData::GetInnSeg(), 0, 2);
dcb55984 139 if(fSector->fRnrOut1)
d810d0de 140 DrawSegmentFrame(AliEveTPCSectorData::GetOut1Seg(), 2, 1);
dcb55984 141 if(fSector->fRnrOut2)
d810d0de 142 DrawSegmentFrame(AliEveTPCSectorData::GetOut2Seg(), 2, 2);
dcb55984 143 }
6a3de3d4 144
145 glPopAttrib();
dcb55984 146}
147
d810d0de 148void AliEveTPCSector3DGL::DrawSegmentFrame(const AliEveTPCSectorData::SegmentInfo& s,
a97abca8 149 Int_t botExtraPads, Int_t topExtraPads) const
dcb55984 150{
a97abca8 151 // Draw frame of given segment.
152
dcb55984 153 Float_t xl, xh, yl, yh, zl, zh;
d810d0de 154 xl = 0.5*s.GetPadWidth()*(AliEveTPCSectorData::GetNPadsInRow(s.GetFirstRow()) + botExtraPads);
155 xh = 0.5*s.GetPadWidth()*(AliEveTPCSectorData::GetNPadsInRow(s.GetLastRow()) + topExtraPads);
dcb55984 156 yl = s.GetRLow();
157 yh = yl + s.GetNRows()*s.GetPadHeight();
6a3de3d4 158 zl = 0;
d810d0de 159 zh = AliEveTPCSectorData::GetZLength();
dcb55984 160
161 glBegin(GL_LINE_LOOP);
162 glVertex3f( xl, yl, zl); glVertex3f( xh, yh, zl);
163 glVertex3f(-xh, yh, zl); glVertex3f(-xl, yl, zl);
164 glEnd();
165 glBegin(GL_LINE_LOOP);
166 glVertex3f( xl, yl, zh); glVertex3f( xh, yh, zh);
167 glVertex3f(-xh, yh, zh); glVertex3f(-xl, yl, zh);
168 glEnd();
169 glBegin(GL_LINES);
170 glVertex3f( xl, yl, zl); glVertex3f( xl, yl, zh);
171 glVertex3f( xh, yh, zl); glVertex3f( xh, yh, zh);
172 glVertex3f(-xh, yh, zl); glVertex3f(-xh, yh, zh);
173 glVertex3f(-xl, yl, zl); glVertex3f(-xl, yl, zh);
174 glEnd();
175}
32e219c2 176
57ffa5fb 177/******************************************************************************/
178/******************************************************************************/
32e219c2 179
180//______________________________________________________________________________
d810d0de 181void AliEveTPCSector3DGL::ProcessSelection(TGLRnrCtx & /*rnrCtx*/, TGLSelectRecord & rec)
32e219c2 182{
183 // Processes secondary selection from TGLViewer.
184 // Calls TPointSet3D::PointSelected(Int_t) with index of selected
185 // point as an argument.
186
187 if (rec.GetN() < 3) return;
188
189 if (rec.GetItem(1) == 9999)
190 {
191 printf("TPC3D Box selected idx=%u\n", rec.GetItem(2));
192 return;
193 }
194
84aff7a4 195 const TEvePointSetArray& psa = fSector->fPointSetArray;
32e219c2 196
197 if (rec.GetItem(1) > 0 && rec.GetItem(1) <= (UInt_t) psa.GetNBins())
198 {
84aff7a4 199 // TEvePointSet& ps = * psa.GetBin(rec.GetItem(1) - 1);
32e219c2 200 printf("TPC3D Point selected, bin=%u, idx=%u\n", rec.GetItem(1) - 1, rec.GetItem(2));
201 return;
202 }
203}