41 ClassImp(TEveQuadSet);
46 TEveQuadSet::TEveQuadSet(
const char* n,
const char* t) :
49 fQuadType (kQT_Undef),
59 TEveQuadSet::TEveQuadSet(EQuadType_e quadType, Bool_t valIsCol, Int_t chunkSize,
60 const char* n,
const char* t) :
63 fQuadType (kQT_Undef),
68 Reset(quadType, valIsCol, chunkSize);
74 Int_t TEveQuadSet::SizeofAtom(TEveQuadSet::EQuadType_e qt)
76 static const TEveException eH(
"TEveQuadSet::SizeofAtom ");
79 case kQT_Undef:
return 0;
80 case kQT_FreeQuad:
return sizeof(QFreeQuad_t);
83 case kQT_RectangleYZ:
return sizeof(QRect_t);
84 case kQT_RectangleXYFixedDim:
return sizeof(QRectFixDim_t);
85 case kQT_RectangleXYFixedZ:
86 case kQT_RectangleXZFixedY:
87 case kQT_RectangleYZFixedX:
return sizeof(QRectFixC_t);
88 case kQT_RectangleXYFixedDimZ:
89 case kQT_RectangleXZFixedDimY:
90 case kQT_RectangleYZFixedDimX:
return sizeof(QRectFixDimC_t);
91 case kQT_LineXZFixedY:
92 case kQT_LineXYFixedZ:
return sizeof(QLineFixC_t);
94 case kQT_HexagonYX:
return sizeof(QHex_t);
95 default:
throw(eH +
"unexpected atom type.");
103 void TEveQuadSet::Reset(TEveQuadSet::EQuadType_e quadType, Bool_t valIsCol,
106 fQuadType = quadType;
107 fValueIsColor = valIsCol;
108 fDefaultValue = valIsCol ? 0 : kMinInt;
111 fPlex.Reset(SizeofAtom(fQuadType), chunkSize);
117 void TEveQuadSet::AddQuad(Float_t verts[12])
119 static const TEveException eH(
"TEveQuadSet::AddQuad ");
121 if (fQuadType != kQT_FreeQuad)
122 throw(eH +
"expect free quad-type.");
124 QFreeQuad_t* fq = (QFreeQuad_t*) NewDigit();
126 memcpy(fq->fVertices, verts,
sizeof(fq->fVertices));
133 void TEveQuadSet::AddQuad(Float_t a, Float_t b)
135 AddQuad(a, b, fDefCoord, fDefWidth, fDefHeight);
142 void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t c)
144 AddQuad(a, b, c, fDefWidth, fDefHeight);
151 void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t w, Float_t h)
153 AddQuad(a, b, fDefCoord, w, h);
159 void TEveQuadSet::AddQuad(Float_t a, Float_t b, Float_t c, Float_t w, Float_t h)
161 static const TEveException eH(
"TEveQuadSet::AddAAQuad ");
163 QOrigin_t& fq = * (QOrigin_t*) NewDigit();
164 fq.fA = a; fq.fB = b;
167 case kQT_RectangleXY:
168 case kQT_RectangleXZ:
169 case kQT_RectangleYZ:
171 QRect_t& q = (QRect_t&) fq;
172 q.fC = c; q.fW = w; q.fH = h;
176 case kQT_RectangleXYFixedDim:
178 QRectFixDim_t& q = (QRectFixDim_t&) fq;
183 case kQT_RectangleXYFixedZ:
184 case kQT_RectangleXZFixedY:
185 case kQT_RectangleYZFixedX:
187 QRectFixC_t& q = (QRectFixC_t&) fq;
192 case kQT_RectangleXYFixedDimZ:
193 case kQT_RectangleXZFixedDimY:
194 case kQT_RectangleYZFixedDimX:
200 throw(eH +
"expect axis-aligned quad-type.");
207 void TEveQuadSet::AddLine(Float_t a, Float_t b, Float_t w, Float_t h)
209 static const TEveException eH(
"TEveQuadSet::AddLine ");
211 QOrigin_t& fq = * (QOrigin_t*) NewDigit();
212 fq.fA = a; fq.fB = b;
215 case kQT_LineXZFixedY:
216 case kQT_LineXYFixedZ: {
217 QLineFixC_t& q = (QLineFixC_t&) fq;
218 q.fDx = w; q.fDy = h;
222 throw(eH +
"expect line quad-type.");
229 void TEveQuadSet::AddHexagon(Float_t a, Float_t b, Float_t c, Float_t r)
231 static const TEveException eH(
"TEveQuadSet::AddHexagon ");
233 QOrigin_t& fq = * (QOrigin_t*) NewDigit();
234 fq.fA = a; fq.fB = b;
238 case kQT_HexagonYX: {
239 QHex_t& q = (QHex_t&) fq;
244 throw eH +
"expects hexagon quad-type.";
253 void TEveQuadSet::ComputeBBox()
255 static const TEveException eH(
"TEveQuadSet::ComputeBBox ");
260 Int_t n = fFrame->GetFrameSize() / 3;
261 Float_t *bbps = fFrame->GetFramePoints();
262 for (
int i=0; i<n; ++i, bbps+=3)
263 BBoxCheckPoint(bbps);
267 if(fPlex.Size() == 0) {
273 if (fQuadType == kQT_RectangleXYFixedZ ||
274 fQuadType == kQT_RectangleXYFixedDimZ)
276 fBBox[4] = fDefCoord;
277 fBBox[5] = fDefCoord;
279 else if (fQuadType == kQT_RectangleXZFixedY ||
280 fQuadType == kQT_RectangleXZFixedDimY)
282 fBBox[2] = fDefCoord;
283 fBBox[3] = fDefCoord;
285 else if (fQuadType == kQT_RectangleYZFixedX ||
286 fQuadType == kQT_RectangleYZFixedDimX)
288 fBBox[0] = fDefCoord;
289 fBBox[1] = fDefCoord;
292 TEveChunkManager::iterator qi(fPlex);
300 const Float_t* p = ((QFreeQuad_t*) qi())->fVertices;
301 BBoxCheckPoint(p); p += 3;
302 BBoxCheckPoint(p); p += 3;
303 BBoxCheckPoint(p); p += 3;
309 case kQT_RectangleXY:
312 QRect_t& q = * (QRect_t*) qi();
313 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
314 if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
315 if(q.fB < fBBox[2]) fBBox[2] = q.fB;
316 if(q.fB + q.fH > fBBox[3]) fBBox[3] = q.fB + q.fH;
317 if(q.fC < fBBox[4]) fBBox[4] = q.fC;
318 if(q.fC > fBBox[5]) fBBox[5] = q.fC;
323 case kQT_RectangleXZ:
326 QRect_t& q = * (QRect_t*) qi();
327 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
328 if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
329 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
330 if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
331 if(q.fC < fBBox[2]) fBBox[2] = q.fC;
332 if(q.fC > fBBox[3]) fBBox[3] = q.fC;
337 case kQT_RectangleYZ:
340 QRect_t& q = * (QRect_t*) qi();
341 if(q.fA < fBBox[2]) fBBox[2] = q.fA;
342 if(q.fA + q.fW > fBBox[3]) fBBox[3] = q.fA + q.fW;
343 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
344 if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
345 if(q.fC < fBBox[0]) fBBox[0] = q.fC;
346 if(q.fC > fBBox[1]) fBBox[1] = q.fC;
351 case kQT_RectangleXYFixedDim:
353 const Float_t& w = fDefWidth;
354 const Float_t& h = fDefHeight;
356 QRectFixDim_t& q = * (QRectFixDim_t*) qi();
357 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
358 if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
359 if(q.fB < fBBox[2]) fBBox[2] = q.fB;
360 if(q.fB + h > fBBox[3]) fBBox[3] = q.fB + h;
361 if(q.fC < fBBox[4]) fBBox[4] = q.fC;
362 if(q.fC > fBBox[5]) fBBox[5] = q.fC;
367 case kQT_RectangleXYFixedZ:
370 QRectFixC_t& q = * (QRectFixC_t*) qi();
371 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
372 if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
373 if(q.fB < fBBox[2]) fBBox[2] = q.fB;
374 if(q.fB + q.fH > fBBox[3]) fBBox[3] = q.fB + q.fH;
379 case kQT_RectangleXZFixedY:
382 QRectFixC_t& q = * (QRectFixC_t*) qi();
383 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
384 if(q.fA + q.fW > fBBox[1]) fBBox[1] = q.fA + q.fW;
385 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
386 if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
391 case kQT_RectangleYZFixedX:
394 QRectFixC_t& q = * (QRectFixC_t*) qi();
395 if(q.fA < fBBox[2]) fBBox[2] = q.fA;
396 if(q.fA + q.fW > fBBox[3]) fBBox[3] = q.fA + q.fW;
397 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
398 if(q.fB + q.fH > fBBox[5]) fBBox[5] = q.fB + q.fH;
403 case kQT_RectangleXYFixedDimZ:
405 const Float_t& w = fDefWidth;
406 const Float_t& h = fDefHeight;
408 QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
409 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
410 if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
411 if(q.fB < fBBox[2]) fBBox[2] = q.fB;
412 if(q.fB + h > fBBox[3]) fBBox[3] = q.fB + h;
417 case kQT_RectangleXZFixedDimY:
419 const Float_t& w = fDefWidth;
420 const Float_t& h = fDefHeight;
422 QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
423 if(q.fA < fBBox[0]) fBBox[0] = q.fA;
424 if(q.fA + w > fBBox[1]) fBBox[1] = q.fA + w;
425 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
426 if(q.fB + h > fBBox[5]) fBBox[5] = q.fB + h;
431 case kQT_RectangleYZFixedDimX:
433 const Float_t& w = fDefWidth;
434 const Float_t& h = fDefHeight;
436 QRectFixDimC_t& q = * (QRectFixDimC_t*) qi();
437 if(q.fA < fBBox[2]) fBBox[2] = q.fA;
438 if(q.fA + w > fBBox[3]) fBBox[3] = q.fA + w;
439 if(q.fB < fBBox[4]) fBBox[4] = q.fB;
440 if(q.fB + h > fBBox[5]) fBBox[5] = q.fB + h;
447 case kQT_LineXYFixedZ:
450 QLineFixC_t& q = * (QLineFixC_t*) qi();
451 BBoxCheckPoint(q.fA, q.fB, fDefCoord);
452 BBoxCheckPoint(q.fA + q.fDx, q.fB + q.fDy, fDefCoord);
457 case kQT_LineXZFixedY:
460 QLineFixC_t& q = * (QLineFixC_t*) qi();
461 BBoxCheckPoint(q.fA, fDefCoord, q.fB);
462 BBoxCheckPoint(q.fA + q.fDx, fDefCoord, q.fB + q.fDy);
474 QHex_t& q = * (QHex_t*) qi();
475 BBoxCheckPoint(q.fA-q.fR, q.fB-q.fR, q.fC);
476 BBoxCheckPoint(q.fA+q.fR, q.fB+q.fR, q.fC);
483 throw(eH +
"unsupported quad-type.");