TEveQuadSet.cxx

Go to the documentation of this file.
00001 // @(#)root/eve:$Id: TEveQuadSet.cxx 33864 2010-06-14 09:47:19Z matevz $
00002 // Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
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 // TEveQuadSet
00028 //
00029 // Supports various internal formats that result in rendering of a
00030 // set of planar (lines, rectangles, hegagons with shared normal) objects.
00031 //
00032 // Names of internal structures and their variables use A, B and C as
00033 // names for coordinate value-holders. Typical assignment is A->X,
00034 // B->Y, C->Z but each render mode can override this convention and
00035 // impose y or x as a fixed (third or C) coordinate. Alphabetic order
00036 // is obeyed in this correspondence.
00037 //
00038 // For quad modes the deltas are expected to be positive.
00039 // For line modes negative deltas are ok.
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    // Constructor.
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    // Constructor.
00066 
00067    Reset(quadType, valIsCol, chunkSize);
00068 }
00069 
00070 /******************************************************************************/
00071 
00072 //______________________________________________________________________________
00073 Int_t TEveQuadSet::SizeofAtom(TEveQuadSet::EQuadType_e qt)
00074 {
00075    // Return size of given atom type.
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    // Clear the quad-set and reset the basic parameters.
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    // Add a quad specified with 4 vertices.
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    // Add a quad with a and b coordinates. Defaults are applied for
00138    // c coordinate and sizes.
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    // Add a quad with a, b and c coordinates. Defaults are applied
00147    // for sizes.
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    // Add a quad with a and b coordinates and sizes. Default is applied
00156    // for c coordinate.
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    // Add a quad with a, b and c coordinates and sizes.
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    // Add a line with starting coordinates and displacements.
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    // Add a hexagon with given center (a,b,c) and radius.
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    // Fill bounding-box information. Virtual from TAttBBox.
00259    // If member 'TEveFrameBox* fFrame' is set, frame's corners are
00260    // used as bbox.
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          // TEveLine modes
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          // Hexagon modes
00475 
00476          // Ignore 'slight' difference, assume square box for both cases.
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       } // end switch quad-type
00494    } // end if frame ... else ...
00495 }

Generated on Tue Jul 5 14:16:13 2011 for ROOT_528-00b_version by  doxygen 1.5.1