00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "TEveQuadSet.h"
00013
00014 #include "TEveManager.h"
00015
00016 #include "TColor.h"
00017
00018 #include "TBuffer3D.h"
00019 #include "TBuffer3DTypes.h"
00020 #include "TVirtualPad.h"
00021 #include "TVirtualViewer3D.h"
00022
00023 #include "TROOT.h"
00024 #include "TRandom.h"
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 ClassImp(TEveQuadSet);
00042
00043
00044 TEveQuadSet::TEveQuadSet(const char* n, const char* t) :
00045 TEveDigitSet (n, t),
00046
00047 fQuadType (kQT_Undef),
00048 fDefWidth (1),
00049 fDefHeight (1),
00050 fDefCoord (0)
00051 {
00052
00053 }
00054
00055
00056 TEveQuadSet::TEveQuadSet(EQuadType_e quadType, Bool_t valIsCol, Int_t chunkSize,
00057 const char* n, const char* t) :
00058 TEveDigitSet (n, t),
00059
00060 fQuadType (kQT_Undef),
00061 fDefWidth (1),
00062 fDefHeight (1),
00063 fDefCoord (0)
00064 {
00065
00066
00067 Reset(quadType, valIsCol, chunkSize);
00068 }
00069
00070
00071
00072
00073 Int_t TEveQuadSet::SizeofAtom(TEveQuadSet::EQuadType_e qt)
00074 {
00075
00076
00077 static const TEveException eH("TEveQuadSet::SizeofAtom ");
00078
00079 switch (qt) {
00080 case kQT_Undef: return 0;
00081 case kQT_FreeQuad: return sizeof(QFreeQuad_t);
00082 case kQT_RectangleXY:
00083 case kQT_RectangleXZ:
00084 case kQT_RectangleYZ: return sizeof(QRect_t);
00085 case kQT_RectangleXYFixedDim: return sizeof(QRectFixDim_t);
00086 case kQT_RectangleXYFixedZ:
00087 case kQT_RectangleXZFixedY:
00088 case kQT_RectangleYZFixedX: return sizeof(QRectFixC_t);
00089 case kQT_RectangleXYFixedDimZ:
00090 case kQT_RectangleXZFixedDimY:
00091 case kQT_RectangleYZFixedDimX: return sizeof(QRectFixDimC_t);
00092 case kQT_LineXZFixedY:
00093 case kQT_LineXYFixedZ: return sizeof(QLineFixC_t);
00094 case kQT_HexagonXY:
00095 case kQT_HexagonYX: return sizeof(QHex_t);
00096 default: throw(eH + "unexpected atom type.");
00097 }
00098 return 0;
00099 }
00100
00101
00102
00103
00104 void TEveQuadSet::Reset(TEveQuadSet::EQuadType_e quadType, Bool_t valIsCol,
00105 Int_t chunkSize)
00106 {
00107
00108
00109 fQuadType = quadType;
00110 fValueIsColor = valIsCol;
00111 fDefaultValue = valIsCol ? 0 : kMinInt;
00112 if (fOwnIds)
00113 ReleaseIds();
00114 fPlex.Reset(SizeofAtom(fQuadType), chunkSize);
00115 }
00116
00117
00118
00119
00120 void TEveQuadSet::AddQuad(Float_t verts[12])
00121 {
00122
00123
00124 static const TEveException eH("TEveQuadSet::AddQuad ");
00125
00126 if (fQuadType != kQT_FreeQuad)
00127 throw(eH + "expect free quad-type.");
00128
00129 QFreeQuad_t* fq = (QFreeQuad_t*) NewDigit();
00130 if (verts != 0)
00131 memcpy(fq->fVertices, verts, sizeof(fq->fVertices));
00132 }
00133
00134
00135 void TEveQuadSet::AddQuad(Float_t a, Float_t b)
00136 {
00137
00138
00139
00140 AddQuad(a, b, fDefCoord, fDefWidth, fDefHeight);
00141 }
00142
00143
00144 void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t c)
00145 {
00146
00147
00148
00149 AddQuad(a, b, c, fDefWidth, fDefHeight);
00150 }
00151
00152
00153 void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t w, Float_t h)
00154 {
00155
00156
00157
00158 AddQuad(a, b, fDefCoord, w, h);
00159 }
00160
00161
00162 void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t c, Float_t w, Float_t h)
00163 {
00164
00165
00166 static const TEveException eH("TEveQuadSet::AddAAQuad ");
00167
00168 QOrigin_t& fq = * (QOrigin_t*) NewDigit();
00169 fq.fA = a; fq.fB = b;
00170 switch (fQuadType)
00171 {
00172 case kQT_RectangleXY:
00173 case kQT_RectangleXZ:
00174 case kQT_RectangleYZ:
00175 {
00176 QRect_t& q = (QRect_t&) fq;
00177 q.fC = c; q.fW = w; q.fH = h;
00178 break;
00179 }
00180
00181 case kQT_RectangleXYFixedDim:
00182 {
00183 QRectFixDim_t& q = (QRectFixDim_t&) fq;
00184 q.fC = c;
00185 break;
00186 }
00187
00188 case kQT_RectangleXYFixedZ:
00189 case kQT_RectangleXZFixedY:
00190 case kQT_RectangleYZFixedX:
00191 {
00192 QRectFixC_t& q = (QRectFixC_t&) fq;
00193 q.fW = w; q.fH = h;
00194 break;
00195 }
00196
00197 case kQT_RectangleXYFixedDimZ:
00198 case kQT_RectangleXZFixedDimY:
00199 case kQT_RectangleYZFixedDimX:
00200 {
00201 break;
00202 }
00203
00204 default:
00205 throw(eH + "expect axis-aligned quad-type.");
00206 }
00207 }
00208
00209
00210 void TEveQuadSet::AddLine(Float_t a, Float_t b, Float_t w, Float_t h)
00211 {
00212
00213
00214 static const TEveException eH("TEveQuadSet::AddLine ");
00215
00216 QOrigin_t& fq = * (QOrigin_t*) NewDigit();
00217 fq.fA = a; fq.fB = b;
00218 switch (fQuadType)
00219 {
00220 case kQT_LineXZFixedY:
00221 case kQT_LineXYFixedZ: {
00222 QLineFixC_t& q = (QLineFixC_t&) fq;
00223 q.fDx = w; q.fDy = h;
00224 break;
00225 }
00226 default:
00227 throw(eH + "expect line quad-type.");
00228 }
00229 }
00230
00231
00232 void TEveQuadSet::AddHexagon(Float_t a, Float_t b, Float_t c, Float_t r)
00233 {
00234
00235
00236 static const TEveException eH("TEveQuadSet::AddHexagon ");
00237
00238 QOrigin_t& fq = * (QOrigin_t*) NewDigit();
00239 fq.fA = a; fq.fB = b;
00240 switch (fQuadType)
00241 {
00242 case kQT_HexagonXY:
00243 case kQT_HexagonYX: {
00244 QHex_t& q = (QHex_t&) fq;
00245 q.fC = c; q.fR = r;
00246 break;
00247 }
00248 default:
00249 throw(eH + "expect line quad-type.");
00250 }
00251 }
00252
00253
00254
00255
00256 void TEveQuadSet::ComputeBBox()
00257 {
00258
00259
00260
00261
00262 static const TEveException eH("TEveQuadSet::ComputeBBox ");
00263
00264 if (fFrame != 0)
00265 {
00266 BBoxInit();
00267 Int_t n = fFrame->GetFrameSize() / 3;
00268 Float_t *bbps = fFrame->GetFramePoints();
00269 for (int i=0; i<n; ++i, bbps+=3)
00270 BBoxCheckPoint(bbps);
00271 }
00272 else
00273 {
00274 if(fPlex.Size() == 0) {
00275 BBoxZero();
00276 return;
00277 }
00278
00279 BBoxInit();
00280 if (fQuadType == kQT_RectangleXYFixedZ ||
00281 fQuadType == kQT_RectangleXYFixedDimZ)
00282 {
00283 fBBox[4] = fDefCoord;
00284 fBBox[5] = fDefCoord;
00285 }
00286 else if (fQuadType == kQT_RectangleXZFixedY ||
00287 fQuadType == kQT_RectangleXZFixedDimY)
00288 {
00289 fBBox[2] = fDefCoord;
00290 fBBox[3] = fDefCoord;
00291 }
00292 else if (fQuadType == kQT_RectangleYZFixedX ||
00293 fQuadType == kQT_RectangleYZFixedDimX)
00294 {
00295 fBBox[0] = fDefCoord;
00296 fBBox[1] = fDefCoord;
00297 }
00298
00299 TEveChunkManager::iterator qi(fPlex);
00300
00301 switch (fQuadType)
00302 {
00303
00304 case kQT_FreeQuad:
00305 {
00306 while (qi.next()) {
00307 const Float_t* p = ((QFreeQuad_t*) qi())->fVertices;
00308 BBoxCheckPoint(p); p += 3;
00309 BBoxCheckPoint(p); p += 3;
00310 BBoxCheckPoint(p); p += 3;
00311 BBoxCheckPoint(p);
00312 }
00313 break;
00314 }
00315
00316 case kQT_RectangleXY:
00317 {
00318 while (qi.next()) {
00319 QRect_t& q = * (QRect_t*) qi();
00320 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
00321 if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
00322 if(q.fB < fBBox[2]) fBBox[2] = q.fB;
00323 if(q.fB + q.fH > fBBox[3]) fBBox[3] = q.fB + q.fH;
00324 if(q.fC < fBBox[4]) fBBox[4] = q.fC;
00325 if(q.fC > fBBox[5]) fBBox[5] = q.fC;
00326 }
00327 break;
00328 }
00329
00330 case kQT_RectangleXZ:
00331 {
00332 while (qi.next()) {
00333 QRect_t& q = * (QRect_t*) qi();
00334 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
00335 if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
00336 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
00337 if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
00338 if(q.fC < fBBox[2]) fBBox[2] = q.fC;
00339 if(q.fC > fBBox[3]) fBBox[3] = q.fC;
00340 }
00341 break;
00342 }
00343
00344 case kQT_RectangleYZ:
00345 {
00346 while (qi.next()) {
00347 QRect_t& q = * (QRect_t*) qi();
00348 if(q.fA < fBBox[2]) fBBox[2] = q.fA;
00349 if(q.fA + q.fW > fBBox[3]) fBBox[3] = q.fA + q.fW;
00350 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
00351 if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
00352 if(q.fC < fBBox[0]) fBBox[0] = q.fC;
00353 if(q.fC > fBBox[1]) fBBox[1] = q.fC;
00354 }
00355 break;
00356 }
00357
00358 case kQT_RectangleXYFixedDim:
00359 {
00360 const Float_t& w = fDefWidth;
00361 const Float_t& h = fDefHeight;
00362 while (qi.next()) {
00363 QRectFixDim_t& q = * (QRectFixDim_t*) qi();
00364 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
00365 if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
00366 if(q.fB < fBBox[2]) fBBox[2] = q.fB;
00367 if(q.fB + h > fBBox[3]) fBBox[3] = q.fB + h;
00368 if(q.fC < fBBox[4]) fBBox[4] = q.fC;
00369 if(q.fC > fBBox[5]) fBBox[5] = q.fC;
00370 }
00371 break;
00372 }
00373
00374 case kQT_RectangleXYFixedZ:
00375 {
00376 while (qi.next()) {
00377 QRectFixC_t& q = * (QRectFixC_t*) qi();
00378 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
00379 if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
00380 if(q.fB < fBBox[2]) fBBox[2] = q.fB;
00381 if(q.fB + q.fH > fBBox[3]) fBBox[3] = q.fB + q.fH;
00382 }
00383 break;
00384 }
00385
00386 case kQT_RectangleXZFixedY:
00387 {
00388 while (qi.next()) {
00389 QRectFixC_t& q = * (QRectFixC_t*) qi();
00390 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
00391 if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
00392 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
00393 if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
00394 }
00395 break;
00396 }
00397
00398 case kQT_RectangleYZFixedX:
00399 {
00400 while (qi.next()) {
00401 QRectFixC_t& q = * (QRectFixC_t*) qi();
00402 if(q.fA < fBBox[2]) fBBox[2] = q.fA;
00403 if(q.fA + q.fW > fBBox[3]) fBBox[3] = q.fA + q.fW;
00404 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
00405 if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
00406 }
00407 break;
00408 }
00409
00410 case kQT_RectangleXYFixedDimZ:
00411 {
00412 const Float_t& w = fDefWidth;
00413 const Float_t& h = fDefHeight;
00414 while (qi.next()) {
00415 QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
00416 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
00417 if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
00418 if(q.fB < fBBox[2]) fBBox[2] = q.fB;
00419 if(q.fB + h > fBBox[3]) fBBox[3] = q.fB + h;
00420 }
00421 break;
00422 }
00423
00424 case kQT_RectangleXZFixedDimY:
00425 {
00426 const Float_t& w = fDefWidth;
00427 const Float_t& h = fDefHeight;
00428 while (qi.next()) {
00429 QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
00430 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
00431 if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
00432 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
00433 if(q.fB + h > fBBox[5]) fBBox[5] = q.fB + h;
00434 }
00435 break;
00436 }
00437
00438 case kQT_RectangleYZFixedDimX:
00439 {
00440 const Float_t& w = fDefWidth;
00441 const Float_t& h = fDefHeight;
00442 while (qi.next()) {
00443 QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
00444 if(q.fA < fBBox[2]) fBBox[2] = q.fA;
00445 if(q.fA + w > fBBox[3]) fBBox[3] = q.fA + w;
00446 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
00447 if(q.fB + h > fBBox[5]) fBBox[5] = q.fB + h;
00448 }
00449 break;
00450 }
00451
00452
00453
00454 case kQT_LineXYFixedZ:
00455 {
00456 while (qi.next()) {
00457 QLineFixC_t& q = * (QLineFixC_t*) qi();
00458 BBoxCheckPoint(q.fA, q.fB, fDefCoord);
00459 BBoxCheckPoint(q.fA + q.fDx, q.fB + q.fDy, fDefCoord);
00460 }
00461 break;
00462 }
00463
00464 case kQT_LineXZFixedY:
00465 {
00466 while (qi.next()) {
00467 QLineFixC_t& q = * (QLineFixC_t*) qi();
00468 BBoxCheckPoint(q.fA, fDefCoord, q.fB);
00469 BBoxCheckPoint(q.fA + q.fDx, fDefCoord, q.fB + q.fDy);
00470 }
00471 break;
00472 }
00473
00474
00475
00476
00477 case kQT_HexagonXY:
00478 case kQT_HexagonYX:
00479 {
00480 while (qi.next()) {
00481 QHex_t& q = * (QHex_t*) qi();
00482 BBoxCheckPoint(q.fA-q.fR, q.fB-q.fR, q.fC);
00483 BBoxCheckPoint(q.fA+q.fR, q.fB+q.fR, q.fC);
00484 }
00485 break;
00486 }
00487
00488 default:
00489 {
00490 throw(eH + "unsupported quad-type.");
00491 }
00492
00493 }
00494 }
00495 }