]>
Commit | Line | Data |
---|---|---|
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 | 23 | ClassImp(AliEveTPCSector3DGL) |
dcb55984 | 24 | |
d810d0de | 25 | AliEveTPCSector3DGL::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 | 35 | AliEveTPCSector3DGL::~AliEveTPCSector3DGL() |
dcb55984 | 36 | { |
a97abca8 | 37 | // Destructor. |
38 | ||
dcb55984 | 39 | delete fBoxRnr; |
40 | } | |
41 | ||
57ffa5fb | 42 | /******************************************************************************/ |
dcb55984 | 43 | |
32e219c2 | 44 | //______________________________________________________________________________ |
d810d0de | 45 | Short_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 | 59 | Bool_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 | 74 | void AliEveTPCSector3DGL::SetBBox() |
dcb55984 | 75 | { |
a97abca8 | 76 | // Set bounding-box. |
77 | ||
d810d0de | 78 | SetAxisAlignedBBox(((AliEveTPCSector3D*)fExternalObj)->AssertBBox()); |
dcb55984 | 79 | } |
80 | ||
57ffa5fb | 81 | /******************************************************************************/ |
dcb55984 | 82 | |
d810d0de | 83 | void 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 | 148 | void 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 | 181 | void 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 | } |