]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
Slight simplification of heavy-duty loops over elements.
authormtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 8 Dec 2006 18:17:34 +0000 (18:17 +0000)
committermtadel <mtadel@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 8 Dec 2006 18:17:34 +0000 (18:17 +0000)
EVE/Reve/QuadSet.cxx
EVE/Reve/QuadSet.h
EVE/Reve/QuadSetGL.cxx

index 34be7bbbcc3f779096c2c37fa52c786a97bb0aa8..9b9776e7c468035b850d04b53cc90819f433634c 100644 (file)
@@ -475,167 +475,145 @@ void QuadSet::ComputeBBox()
     fBBox[3] = fDefCoord;
   }
 
-  for (Int_t c=0; c<fPlex.VecSize(); ++c)
+  VoidCPlex::iterator qi(fPlex);
+  
+  switch (fQuadType)
   {
-    QuadBase* qbp = (QuadBase*) fPlex.Chunk(c);
-    Int_t       n = fPlex.NAtoms(c);
 
-    switch (fQuadType)
+    case QT_FreeQuad:
     {
-
-      case QT_FreeQuad:
-      {
-       QFreeQuad* qp = (QFreeQuad*) qbp;
-       while (n--) {
-         Float_t* p = qp->fVertices;
-         BBoxCheckPoint(p); p += 3;
-         BBoxCheckPoint(p); p += 3;
-         BBoxCheckPoint(p); p += 3;
-         BBoxCheckPoint(p);
-         ++qp;
-       }
-       break;
+      while (qi.next()) {
+       const Float_t* p =  ((QFreeQuad*) qi())->fVertices;
+       BBoxCheckPoint(p); p += 3;
+       BBoxCheckPoint(p); p += 3;
+       BBoxCheckPoint(p); p += 3;
+       BBoxCheckPoint(p);
       }
+      break;
+    }
 
-      case QT_RectangleXY:
-      {
-       QRect* qp = (QRect*) qbp;
-       while (n--) {
-         QRect& q = * qp;
-         if(q.fX        < fBBox[0]) fBBox[0] = q.fX;
-         if(q.fX + q.fW > fBBox[1]) fBBox[1] = q.fX + q.fW;
-         if(q.fY        < fBBox[2]) fBBox[2] = q.fY;
-         if(q.fY + q.fH > fBBox[3]) fBBox[3] = q.fY + q.fH;
-         if(q.fZ        < fBBox[4]) fBBox[4] = q.fZ;
-         if(q.fZ        > fBBox[5]) fBBox[5] = q.fZ;
-         ++qp;
-       }
-       break;
+    case QT_RectangleXY:
+    {
+      while (qi.next()) {
+       QRect& q = * (QRect*) qi();
+       if(q.fX        < fBBox[0]) fBBox[0] = q.fX;
+       if(q.fX + q.fW > fBBox[1]) fBBox[1] = q.fX + q.fW;
+       if(q.fY        < fBBox[2]) fBBox[2] = q.fY;
+       if(q.fY + q.fH > fBBox[3]) fBBox[3] = q.fY + q.fH;
+       if(q.fZ        < fBBox[4]) fBBox[4] = q.fZ;
+       if(q.fZ        > fBBox[5]) fBBox[5] = q.fZ;
       }
+      break;
+    }
 
-      case QT_RectangleXYFixedDim:
-      {
-       QRectFixDim* qp =  (QRectFixDim*) qbp;
-       const Float_t& w = fDefWidth;
-       const Float_t& h = fDefHeight;
-       while (n--) {
-         QRectFixDim& q = * qp;
-         if(q.fX     < fBBox[0]) fBBox[0] = q.fX;
-         if(q.fX + w > fBBox[1]) fBBox[1] = q.fX + w;
-         if(q.fY     < fBBox[2]) fBBox[2] = q.fY;
-         if(q.fY + h > fBBox[3]) fBBox[3] = q.fY + h;
-         if(q.fZ     < fBBox[4]) fBBox[4] = q.fZ;
-         if(q.fZ     > fBBox[5]) fBBox[5] = q.fZ;
-         ++qp;
-       }
-       break;
+    case QT_RectangleXYFixedDim:
+    {
+      const Float_t& w = fDefWidth;
+      const Float_t& h = fDefHeight;
+      while (qi.next()) {
+       QRectFixDim& q = * (QRectFixDim*) qi();
+       if(q.fX     < fBBox[0]) fBBox[0] = q.fX;
+       if(q.fX + w > fBBox[1]) fBBox[1] = q.fX + w;
+       if(q.fY     < fBBox[2]) fBBox[2] = q.fY;
+       if(q.fY + h > fBBox[3]) fBBox[3] = q.fY + h;
+       if(q.fZ     < fBBox[4]) fBBox[4] = q.fZ;
+       if(q.fZ     > fBBox[5]) fBBox[5] = q.fZ;
       }
+      break;
+    }
 
-      case QT_RectangleXYFixedZ:
-      {
-       QRectFixC* qp = (QRectFixC*) qbp;
-       while (n--) {
-         QRectFixC& q = * qp;
-         if(q.fX        < fBBox[0]) fBBox[0] = q.fX;
-         if(q.fX + q.fW > fBBox[1]) fBBox[1] = q.fX + q.fW;
-         if(q.fY        < fBBox[2]) fBBox[2] = q.fY;
-         if(q.fY + q.fH > fBBox[3]) fBBox[3] = q.fY + q.fH;
-         ++qp;
-       }
-       break;
+    case QT_RectangleXYFixedZ:
+    {
+      while (qi.next()) {
+       QRectFixC& q = * (QRectFixC*) qi();
+       if(q.fX        < fBBox[0]) fBBox[0] = q.fX;
+       if(q.fX + q.fW > fBBox[1]) fBBox[1] = q.fX + q.fW;
+       if(q.fY        < fBBox[2]) fBBox[2] = q.fY;
+       if(q.fY + q.fH > fBBox[3]) fBBox[3] = q.fY + q.fH;
       }
+      break;
+    }
 
-      case QT_RectangleXZFixedY:
-      {
-       QRectFixC* qp = (QRectFixC*) qbp;
-       while (n--) {
-         QRectFixC& q = * qp;
-         if(q.fX        < fBBox[0]) fBBox[0] = q.fX;
-         if(q.fX + q.fW > fBBox[1]) fBBox[1] = q.fX + q.fW;
-         if(q.fY        < fBBox[4]) fBBox[4] = q.fY;
-         if(q.fY + q.fH > fBBox[5]) fBBox[5] = q.fY + q.fH;
-         ++qp;
-       }
-       break;
+    case QT_RectangleXZFixedY:
+    {
+      while (qi.next()) {
+       QRectFixC& q = * (QRectFixC*) qi();
+       if(q.fX        < fBBox[0]) fBBox[0] = q.fX;
+       if(q.fX + q.fW > fBBox[1]) fBBox[1] = q.fX + q.fW;
+       if(q.fY        < fBBox[4]) fBBox[4] = q.fY;
+       if(q.fY + q.fH > fBBox[5]) fBBox[5] = q.fY + q.fH;
       }
+      break;
+    }
 
-      case QT_RectangleXYFixedDimZ:
-      {
-       QRectFixDimC* qp =  (QRectFixDimC*) qbp;
-       const Float_t& w = fDefWidth;
-       const Float_t& h = fDefHeight;
-       while (n--) {
-         QRectFixDimC& q = * qp;
-         if(q.fX     < fBBox[0]) fBBox[0] = q.fX;
-         if(q.fX + w > fBBox[1]) fBBox[1] = q.fX + w;
-         if(q.fY     < fBBox[2]) fBBox[2] = q.fY;
-         if(q.fY + h > fBBox[3]) fBBox[3] = q.fY + h;
-         ++qp;
-       }
-       break;
+    case QT_RectangleXYFixedDimZ:
+    {
+      const Float_t& w = fDefWidth;
+      const Float_t& h = fDefHeight;
+      while (qi.next()) {
+       QRectFixDimC& q = * (QRectFixDimC*) qi();
+       if(q.fX     < fBBox[0]) fBBox[0] = q.fX;
+       if(q.fX + w > fBBox[1]) fBBox[1] = q.fX + w;
+       if(q.fY     < fBBox[2]) fBBox[2] = q.fY;
+       if(q.fY + h > fBBox[3]) fBBox[3] = q.fY + h;
       }
+      break;
+    }
 
-      case QT_RectangleXZFixedDimY:
-      {
-       QRectFixDimC* qp =  (QRectFixDimC*) qbp;
-       const Float_t& w = fDefWidth;
-       const Float_t& h = fDefHeight;
-       while (n--) {
-         QRectFixDimC& q = * qp;
-         if(q.fX     < fBBox[0]) fBBox[0] = q.fX;
-         if(q.fX + w > fBBox[1]) fBBox[1] = q.fX + w;
-         if(q.fY     < fBBox[4]) fBBox[4] = q.fY;
-         if(q.fY + h > fBBox[5]) fBBox[5] = q.fY + h;
-         ++qp;
-       }
-       break;
+    case QT_RectangleXZFixedDimY:
+    {
+      const Float_t& w = fDefWidth;
+      const Float_t& h = fDefHeight;
+      while (qi.next()) {
+       QRectFixDimC& q = * (QRectFixDimC*) qi();
+       if(q.fX     < fBBox[0]) fBBox[0] = q.fX;
+       if(q.fX + w > fBBox[1]) fBBox[1] = q.fX + w;
+       if(q.fY     < fBBox[4]) fBBox[4] = q.fY;
+       if(q.fY + h > fBBox[5]) fBBox[5] = q.fY + h;
       }
+      break;
+    }
 
-      case QT_LineXYFixedZ:
-      {
-       QLineFixC* qp =  (QLineFixC*) qbp;
-       while (n--) {
-         QLineFixC& q = * qp;
-         BBoxCheckPoint(q.fX,         q.fY,         fDefCoord);
-         BBoxCheckPoint(q.fX + q.fDx, q.fY + q.fDy, fDefCoord);
-         ++qp;
-       }
-       break;
+    case QT_LineXYFixedZ:
+    {
+      while (qi.next()) {
+       QLineFixC& q = * (QLineFixC*) qi();
+       BBoxCheckPoint(q.fX,         q.fY,         fDefCoord);
+       BBoxCheckPoint(q.fX + q.fDx, q.fY + q.fDy, fDefCoord);
       }
+      break;
+    }
 
-      case QT_LineXZFixedY:
-      {
-       QLineFixC* qp =  (QLineFixC*) qbp;
-       while (n--) {
-         QLineFixC& q = * qp;
-         BBoxCheckPoint(q.fX,         fDefCoord, q.fY);
-         BBoxCheckPoint(q.fX + q.fDx, fDefCoord, q.fY + q.fDy);
-         ++qp;
-       }
-       break;
+    case QT_LineXZFixedY:
+    {
+      while (qi.next()) {
+       QLineFixC& q = * (QLineFixC*) qi();
+       BBoxCheckPoint(q.fX,         fDefCoord, q.fY);
+       BBoxCheckPoint(q.fX + q.fDx, fDefCoord, q.fY + q.fDy);
       }
+      break;
+    }
 
-      case QT_HexagonXY:
-      case QT_HexagonYX:
-      {
-       QHex* qp =  (QHex*) qbp;
-       while (n--) {
-         QHex& q = * qp;
-         BBoxCheckPoint(q.fX-q.fR, q.fY-q.fR, q.fZ);
-         BBoxCheckPoint(q.fX+q.fR, q.fY+q.fR, q.fZ);
-         ++qp;
-       }
-       break;
+    // Ignore 'slight' difference, assume square box for both cases.
+    case QT_HexagonXY:
+    case QT_HexagonYX:
+    {
+      while (qi.next()) {
+       QHex& q = * (QHex*) qi();
+       BBoxCheckPoint(q.fX-q.fR, q.fY-q.fR, q.fZ);
+       BBoxCheckPoint(q.fX+q.fR, q.fY+q.fR, q.fZ);
       }
+      break;
+    }
 
-      default: {
-       throw(eH + "unsupported quad-type.");
-      }
+    default: {
+      throw(eH + "unsupported quad-type.");
+    }
 
-    } // end switch quad-type
+  } // end switch quad-type
 
-  } // end for chunk
 
+#if ROOT_VERSION_CODE <= ROOT_VERSION(5,14,0)
   { // Resize bounding box so that it does not have 0 volume.
     // This should be done in TAttBBox (via method AssertMinExtents(epsilon)).
     // Or handled more gracefully in TGLViewer.
@@ -648,6 +626,9 @@ void QuadSet::ComputeBBox()
       }
     }
   }
+#else
+  AssertBBoxExtents(0.001);
+#endif
 }
 
 /**************************************************************************/
index a3bd8c9f2b0824540978b93410e14cd1bf314f66..7ea8d1bed6eaf40f505bc8ee1e003daf2bf44ef8 100644 (file)
@@ -220,6 +220,8 @@ public:
 
   virtual void Paint(Option_t* option="");
 
+  VoidCPlex* GetPlex() { return &fPlex; }
+
   ClassDef(QuadSet, 1);
 };
 
index bc427ecea6099841e664b90f118ee36b96a346eb..63c4c212d37f51f634dfdd7c7a6924317bc9e379 100644 (file)
@@ -175,6 +175,8 @@ void QuadSetGL::RenderQuads(const TGLDrawFlags &) const
 
   QuadSet& mQ = * fM;
 
+  VoidCPlex::iterator qi(mQ.fPlex);
+
   if (mQ.fRenderMode != QuadSet::RM_Line)
   {
 
@@ -184,318 +186,279 @@ void QuadSetGL::RenderQuads(const TGLDrawFlags &) const
       glNormal3f(0, 0, 1);
 
     glBegin(GL_QUADS);
-    for (Int_t c=0; c<mQ.fPlex.VecSize(); ++c)
+
+    switch (mQ.fQuadType)
     {
-      QuadSet::QuadBase* qbp = (QuadSet::QuadBase*) mQ.fPlex.Chunk(c);
-      Int_t n = mQ.fPlex.NAtoms(c);
 
-      switch (mQ.fQuadType)
+      case QuadSet::QT_FreeQuad:
       {
-
-       case QuadSet::QT_FreeQuad:
-       {
-         QuadSet::QFreeQuad* qp = (QuadSet::QFreeQuad*) qbp;
-         Float_t e1[3], e2[3], normal[3];
-         while (n--) {
-           if (SetupColor(*qp))
-           {
-             Float_t* p = qp->fVertices;
-             e1[0] = p[3] - p[0]; e1[1] = p[4] - p[1]; e1[2] = p[5] - p[2];
-             e2[0] = p[6] - p[0]; e2[1] = p[7] - p[1]; e2[2] = p[8] - p[2];
-             TMath::Cross(e1, e2, normal);
-             glNormal3fv(normal);
-             glVertex3fv(p);
-             glVertex3fv(p + 3);
-             glVertex3fv(p + 6);
-             glVertex3fv(p + 9);
-           }
-           ++qp;
+       Float_t e1[3], e2[3], normal[3];
+       while (qi.next()) {
+         QuadSet::QFreeQuad& q = * (QuadSet::QFreeQuad*) qi();
+         if (SetupColor(q))
+         {
+           Float_t* p = q.fVertices;
+           e1[0] = p[3] - p[0]; e1[1] = p[4] - p[1]; e1[2] = p[5] - p[2];
+           e2[0] = p[6] - p[0]; e2[1] = p[7] - p[1]; e2[2] = p[8] - p[2];
+           TMath::Cross(e1, e2, normal);
+           glNormal3fv(normal);
+           glVertex3fv(p);
+           glVertex3fv(p + 3);
+           glVertex3fv(p + 6);
+           glVertex3fv(p + 9);
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXY:
-       {
-         QuadSet::QRect* qp = (QuadSet::QRect*) qbp;
-         while (n--) {
-           QuadSet::QRect& q = * qp;
-           if (SetupColor(q))
-           {
-             glVertex3f(q.fX,        q.fY,        q.fZ);
-             glVertex3f(q.fX + q.fW, q.fY,        q.fZ);
-             glVertex3f(q.fX + q.fW, q.fY + q.fH, q.fZ);
-             glVertex3f(q.fX,        q.fY + q.fH, q.fZ);
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXY:
+      {
+       while (qi.next()) {
+         QuadSet::QRect& q = * (QuadSet::QRect*) qi();
+         if (SetupColor(q))
+         {
+           glVertex3f(q.fX,        q.fY,        q.fZ);
+           glVertex3f(q.fX + q.fW, q.fY,        q.fZ);
+           glVertex3f(q.fX + q.fW, q.fY + q.fH, q.fZ);
+           glVertex3f(q.fX,        q.fY + q.fH, q.fZ);
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXYFixedDim:
-       {
-         QuadSet::QRectFixDim* qp = (QuadSet::QRectFixDim*) qbp;
-         const Float_t& w = mQ.fDefWidth;
-         const Float_t& h = mQ.fDefHeight;
-         while (n--) {
-           QuadSet::QRectFixDim& q = * qp;
-           if (SetupColor(q))
-           {
-             glVertex3f(q.fX,     q.fY,     q.fZ);
-             glVertex3f(q.fX + w, q.fY,     q.fZ);
-             glVertex3f(q.fX + w, q.fY + h, q.fZ);
-             glVertex3f(q.fX,     q.fY + h, q.fZ);
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXYFixedDim:
+      {
+       const Float_t& w = mQ.fDefWidth;
+       const Float_t& h = mQ.fDefHeight;
+       while (qi.next()) {
+         QuadSet::QRectFixDim& q = * (QuadSet::QRectFixDim*) qi();
+         if (SetupColor(q))
+         {
+           glVertex3f(q.fX,     q.fY,     q.fZ);
+           glVertex3f(q.fX + w, q.fY,     q.fZ);
+           glVertex3f(q.fX + w, q.fY + h, q.fZ);
+           glVertex3f(q.fX,     q.fY + h, q.fZ);
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXYFixedZ:
-       {
-         QuadSet::QRectFixC* qp = (QuadSet::QRectFixC*) qbp;
-         const Float_t& z = mQ.fDefCoord;
-         while (n--) {
-           QuadSet::QRectFixC& q = * qp;
-           if (SetupColor(q))
-           {
-             glVertex3f(q.fX,        q.fY,        z);
-             glVertex3f(q.fX + q.fW, q.fY,        z);
-             glVertex3f(q.fX + q.fW, q.fY + q.fH, z);
-             glVertex3f(q.fX,        q.fY + q.fH, z);
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXYFixedZ:
+      {
+       const Float_t& z = mQ.fDefCoord;
+       while (qi.next()) {
+         QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
+         if (SetupColor(q))
+         {
+           glVertex3f(q.fX,        q.fY,        z);
+           glVertex3f(q.fX + q.fW, q.fY,        z);
+           glVertex3f(q.fX + q.fW, q.fY + q.fH, z);
+           glVertex3f(q.fX,        q.fY + q.fH, z);
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXZFixedY:
-       {
-         QuadSet::QRectFixC* qp = (QuadSet::QRectFixC*) qbp;
-         const Float_t& z = mQ.fDefCoord;
-         while (n--) {
-           QuadSet::QRectFixC& q = * qp;
-           if (SetupColor(q))
-           {
-             glVertex3f(q.fX,        z, q.fY);
-             glVertex3f(q.fX + q.fW, z, q.fY);
-             glVertex3f(q.fX + q.fW, z, q.fY + q.fH);
-             glVertex3f(q.fX,        z, q.fY + q.fH);
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXZFixedY:
+      {
+       const Float_t& z = mQ.fDefCoord;
+       while (qi.next()) {
+         QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
+         if (SetupColor(q))
+         {
+           glVertex3f(q.fX,        z, q.fY);
+           glVertex3f(q.fX + q.fW, z, q.fY);
+           glVertex3f(q.fX + q.fW, z, q.fY + q.fH);
+           glVertex3f(q.fX,        z, q.fY + q.fH);
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXYFixedDimZ:
-       {
-         QuadSet::QRectFixDimC* qp = (QuadSet::QRectFixDimC*) qbp;
-         const Float_t& z = mQ.fDefCoord;
-         const Float_t& w = mQ.fDefWidth;
-         const Float_t& h = mQ.fDefHeight;
-         while (n--) {
-           QuadSet::QRectFixDimC& q = * qp;
-           if (SetupColor(q))
-           {
-             glVertex3f(q.fX,     q.fY,     z);
-             glVertex3f(q.fX + w, q.fY,     z);
-             glVertex3f(q.fX + w, q.fY + h, z);
-             glVertex3f(q.fX,     q.fY + h, z);
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXYFixedDimZ:
+      {
+       const Float_t& z = mQ.fDefCoord;
+       const Float_t& w = mQ.fDefWidth;
+       const Float_t& h = mQ.fDefHeight;
+       while (qi.next()) {
+         QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
+         if (SetupColor(q))
+         {
+           glVertex3f(q.fX,     q.fY,     z);
+           glVertex3f(q.fX + w, q.fY,     z);
+           glVertex3f(q.fX + w, q.fY + h, z);
+           glVertex3f(q.fX,     q.fY + h, z);
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXZFixedDimY:
-       {
-         QuadSet::QRectFixDimC* qp = (QuadSet::QRectFixDimC*) qbp;
-         const Float_t& z = mQ.fDefCoord;
-         const Float_t& w = mQ.fDefWidth;
-         const Float_t& h = mQ.fDefHeight;
-         while (n--) {
-           QuadSet::QRectFixDimC& q = * qp;
-           if (SetupColor(q))
-           {
-             glVertex3f(q.fX,     z, q.fY);
-             glVertex3f(q.fX + w, z, q.fY);
-             glVertex3f(q.fX + w, z, q.fY + h);
-             glVertex3f(q.fX,     z, q.fY + h);
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXZFixedDimY:
+      {
+       const Float_t& z = mQ.fDefCoord;
+       const Float_t& w = mQ.fDefWidth;
+       const Float_t& h = mQ.fDefHeight;
+       while (qi.next()) {
+         QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
+         if (SetupColor(q))
+         {
+           glVertex3f(q.fX,     z, q.fY);
+           glVertex3f(q.fX + w, z, q.fY);
+           glVertex3f(q.fX + w, z, q.fY + h);
+           glVertex3f(q.fX,     z, q.fY + h);
          }
-         break;
        }
+       break;
+      }
 
-       default:
-         throw(eH + "unsupported quad-type.");
+      default:
+       throw(eH + "unsupported quad-type.");
 
-      } // end switch quad-type
+    } // end switch quad-type
 
-    } // end for chunk
     glEnd();
 
   }
   else
   {
 
-    for (Int_t c=0; c<mQ.fPlex.VecSize(); ++c)
+    switch (mQ.fQuadType)
     {
-      QuadSet::QuadBase* qbp = (QuadSet::QuadBase*) mQ.fPlex.Chunk(c);
-      Int_t n = mQ.fPlex.NAtoms(c);
 
-      switch (mQ.fQuadType)
+      case QuadSet::QT_FreeQuad:
       {
-
-       case QuadSet::QT_FreeQuad:
-       {
-         QuadSet::QFreeQuad* qp = (QuadSet::QFreeQuad*) qbp;
-         while (n--) {
-           if (SetupColor(*qp))
-           {
-             SetupColor(*qp);
-             Float_t* p = qp->fVertices;
-             glBegin(GL_LINE_LOOP);
-             glVertex3fv(p);
-             glVertex3fv(p + 3);
-             glVertex3fv(p + 6);
-             glVertex3fv(p + 9);
-             glEnd();
-           }
-           ++qp;
+       while (qi.next()) {
+         QuadSet::QFreeQuad& q = * (QuadSet::QFreeQuad*) qi();
+         if (SetupColor(q))
+         {
+           Float_t* p = q.fVertices;
+           glBegin(GL_LINE_LOOP);
+           glVertex3fv(p);
+           glVertex3fv(p + 3);
+           glVertex3fv(p + 6);
+           glVertex3fv(p + 9);
+           glEnd();
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXY:
-       {
-         QuadSet::QRect* qp = (QuadSet::QRect*) qbp;
-         while (n--) {
-           QuadSet::QRect& q = * qp;
-           if (SetupColor(q))
-           {
-             glBegin(GL_LINE_LOOP);
-             glVertex3f(q.fX,        q.fY,        q.fZ);
-             glVertex3f(q.fX + q.fW, q.fY,        q.fZ);
-             glVertex3f(q.fX + q.fW, q.fY + q.fH, q.fZ);
-             glVertex3f(q.fX,        q.fY + q.fH, q.fZ);
-             glEnd();
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXY:
+      {
+       while (qi.next()) {
+         QuadSet::QRect& q = * (QuadSet::QRect*) qi();
+         if (SetupColor(q))
+         {
+           glBegin(GL_LINE_LOOP);
+           glVertex3f(q.fX,        q.fY,        q.fZ);
+           glVertex3f(q.fX + q.fW, q.fY,        q.fZ);
+           glVertex3f(q.fX + q.fW, q.fY + q.fH, q.fZ);
+           glVertex3f(q.fX,        q.fY + q.fH, q.fZ);
+           glEnd();
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXYFixedDim:
-       {
-         QuadSet::QRectFixDim* qp = (QuadSet::QRectFixDim*) qbp;
-         const Float_t& w = mQ.fDefWidth;
-         const Float_t& h = mQ.fDefHeight;
-         while (n--) {
-           QuadSet::QRectFixDim& q = * qp;
-           if (SetupColor(q))
-           {
-             glBegin(GL_LINE_LOOP);
-             glVertex3f(q.fX,     q.fY,     q.fZ);
-             glVertex3f(q.fX + w, q.fY,     q.fZ);
-             glVertex3f(q.fX + w, q.fY + h, q.fZ);
-             glVertex3f(q.fX,     q.fY + h, q.fZ);
-             glEnd();
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXYFixedDim:
+      {
+       const Float_t& w = mQ.fDefWidth;
+       const Float_t& h = mQ.fDefHeight;
+       while (qi.next()) {
+         QuadSet::QRectFixDim& q = * (QuadSet::QRectFixDim*) qi();
+         if (SetupColor(q))
+         {
+           glBegin(GL_LINE_LOOP);
+           glVertex3f(q.fX,     q.fY,     q.fZ);
+           glVertex3f(q.fX + w, q.fY,     q.fZ);
+           glVertex3f(q.fX + w, q.fY + h, q.fZ);
+           glVertex3f(q.fX,     q.fY + h, q.fZ);
+           glEnd();
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXYFixedZ:
-       {
-         QuadSet::QRectFixC* qp = (QuadSet::QRectFixC*) qbp;
-         const Float_t& z = mQ.fDefCoord;
-         while (n--) {
-           QuadSet::QRectFixC& q = * qp;
-           if (SetupColor(q))
-           {
-             glBegin(GL_LINE_LOOP);
-             glVertex3f(q.fX,        q.fY,        z);
-             glVertex3f(q.fX + q.fW, q.fY,        z);
-             glVertex3f(q.fX + q.fW, q.fY + q.fH, z);
-             glVertex3f(q.fX,        q.fY + q.fH, z);
-             glEnd();
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXYFixedZ:
+      {
+       const Float_t& z = mQ.fDefCoord;
+       while (qi.next()) {
+         QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
+         if (SetupColor(q))
+         {
+           glBegin(GL_LINE_LOOP);
+           glVertex3f(q.fX,        q.fY,        z);
+           glVertex3f(q.fX + q.fW, q.fY,        z);
+           glVertex3f(q.fX + q.fW, q.fY + q.fH, z);
+           glVertex3f(q.fX,        q.fY + q.fH, z);
+           glEnd();
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXZFixedY:
-       {
-         QuadSet::QRectFixC* qp = (QuadSet::QRectFixC*) qbp;
-         const Float_t& z = mQ.fDefCoord;
-         while (n--) {
-           QuadSet::QRectFixC& q = * qp;
-           if (SetupColor(q))
-           {
-             glBegin(GL_LINE_LOOP);
-             glVertex3f(q.fX,        z, q.fY);
-             glVertex3f(q.fX + q.fW, z, q.fY);
-             glVertex3f(q.fX + q.fW, z, q.fY + q.fH);
-             glVertex3f(q.fX,        z, q.fY + q.fH);
-             glEnd();
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXZFixedY:
+      {
+       const Float_t& z = mQ.fDefCoord;
+       while (qi.next()) {
+         QuadSet::QRectFixC& q = * (QuadSet::QRectFixC*) qi();
+         if (SetupColor(q))
+         {
+           glBegin(GL_LINE_LOOP);
+           glVertex3f(q.fX,        z, q.fY);
+           glVertex3f(q.fX + q.fW, z, q.fY);
+           glVertex3f(q.fX + q.fW, z, q.fY + q.fH);
+           glVertex3f(q.fX,        z, q.fY + q.fH);
+           glEnd();
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXYFixedDimZ:
-       {
-         QuadSet::QRectFixDimC* qp = (QuadSet::QRectFixDimC*) qbp;
-         const Float_t& z = mQ.fDefCoord;
-         const Float_t& w = mQ.fDefWidth;
-         const Float_t& h = mQ.fDefHeight;
-         while (n--) {
-           QuadSet::QRectFixDimC& q = * qp;
-           if (SetupColor(q))
-           {
-             glBegin(GL_LINE_LOOP);
-             glVertex3f(q.fX,     q.fY,     z);
-             glVertex3f(q.fX + w, q.fY,     z);
-             glVertex3f(q.fX + w, q.fY + h, z);
-             glVertex3f(q.fX,     q.fY + h, z);
-             glEnd();
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXYFixedDimZ:
+      {
+       const Float_t& z = mQ.fDefCoord;
+       const Float_t& w = mQ.fDefWidth;
+       const Float_t& h = mQ.fDefHeight;
+       while (qi.next()) {
+         QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
+         if (SetupColor(q))
+         {
+           glBegin(GL_LINE_LOOP);
+           glVertex3f(q.fX,     q.fY,     z);
+           glVertex3f(q.fX + w, q.fY,     z);
+           glVertex3f(q.fX + w, q.fY + h, z);
+           glVertex3f(q.fX,     q.fY + h, z);
+           glEnd();
          }
-         break;
        }
+       break;
+      }
 
-       case QuadSet::QT_RectangleXZFixedDimY:
-       {
-         QuadSet::QRectFixDimC* qp = (QuadSet::QRectFixDimC*) qbp;
-         const Float_t& z = mQ.fDefCoord;
-         const Float_t& w = mQ.fDefWidth;
-         const Float_t& h = mQ.fDefHeight;
-         while (n--) {
-           QuadSet::QRectFixDimC& q = * qp;
-           if (SetupColor(q))
-           {
-             glBegin(GL_LINE_LOOP);
-             glVertex3f(q.fX,     z, q.fY);
-             glVertex3f(q.fX + w, z, q.fY);
-             glVertex3f(q.fX + w, z, q.fY + h);
-             glVertex3f(q.fX,     z, q.fY + h);
-             glEnd();
-           }
-           ++qp;
+      case QuadSet::QT_RectangleXZFixedDimY:
+      {
+       const Float_t& z = mQ.fDefCoord;
+       const Float_t& w = mQ.fDefWidth;
+       const Float_t& h = mQ.fDefHeight;
+       while (qi.next()) {
+         QuadSet::QRectFixDimC& q = * (QuadSet::QRectFixDimC*) qi();
+         if (SetupColor(q))
+         {
+           glBegin(GL_LINE_LOOP);
+           glVertex3f(q.fX,     z, q.fY);
+           glVertex3f(q.fX + w, z, q.fY);
+           glVertex3f(q.fX + w, z, q.fY + h);
+           glVertex3f(q.fX,     z, q.fY + h);
+           glEnd();
          }
-         break;
        }
+       break;
+      }
 
-       default:
-         throw(eH + "unsupported quad-type.");
-
-      } // end switch quad-type
+      default:
+       throw(eH + "unsupported quad-type.");
 
-    } // end for chunk
+    } // end switch quad-type
 
   } // end else of RenderMode
 }
@@ -507,55 +470,47 @@ void QuadSetGL::RenderLines(const TGLDrawFlags &) const
 
   QuadSet& mQ = * fM;
 
-  for (Int_t c=0; c<mQ.fPlex.VecSize(); ++c)
+  VoidCPlex::iterator qi(mQ.fPlex);
+
+  glBegin(GL_LINES);
+
+  switch (mQ.fQuadType)
   {
-    QuadSet::QuadBase* qbp = (QuadSet::QuadBase*) mQ.fPlex.Chunk(c);
-    Int_t n = mQ.fPlex.NAtoms(c);
 
-    switch (mQ.fQuadType)
+    case QuadSet::QT_LineXYFixedZ:
     {
-
-      case QuadSet::QT_LineXYFixedZ:
-      {
-       QuadSet::QLineFixC* qp = (QuadSet::QLineFixC*) qbp;
-       const Float_t& z = mQ.fDefCoord;
-       glBegin(GL_LINES);
-       while (n--) {
-         QuadSet::QLineFixC& q = * qp;
-         if (SetupColor(q))
-         {
-           glVertex3f(q.fX,         q.fY,         z);
-           glVertex3f(q.fX + q.fDx, q.fY + q.fDy, z);
-         }
-         ++qp;
+      const Float_t& z = mQ.fDefCoord;
+      while (qi.next()) {
+       QuadSet::QLineFixC& q = * (QuadSet::QLineFixC*) qi();
+       if (SetupColor(q))
+       {
+         glVertex3f(q.fX,         q.fY,         z);
+         glVertex3f(q.fX + q.fDx, q.fY + q.fDy, z);
        }
-       glEnd();
-       break;
       }
+      break;
+    }
 
-      case QuadSet::QT_LineXZFixedY:
-      {
-       QuadSet::QLineFixC* qp = (QuadSet::QLineFixC*) qbp;
-       const Float_t& z = mQ.fDefCoord;
-       glBegin(GL_LINES);
-       while (n--) {
-         QuadSet::QLineFixC& q = * qp;
-         if (SetupColor(q))
-         {
-           glVertex3f(q.fX,         z, q.fY);
-           glVertex3f(q.fX + q.fDx, z, q.fY + q.fDy);
-         }
-         ++qp;
+    case QuadSet::QT_LineXZFixedY:
+    {
+      const Float_t& z = mQ.fDefCoord;
+      while (qi.next()) {
+       QuadSet::QLineFixC& q = * (QuadSet::QLineFixC*) qi();
+       if (SetupColor(q))
+       {
+         glVertex3f(q.fX,         z, q.fY);
+         glVertex3f(q.fX + q.fDx, z, q.fY + q.fDy);
        }
-       glEnd();
-       break;
       }
+      break;
+    }
 
-      default:
-       throw(eH + "unsupported quad-type.");
+    default:
+      throw(eH + "unsupported quad-type.");
 
-    }
   }
+
+  glEnd();
 }
 
 void QuadSetGL::RenderHexagons(const TGLDrawFlags &) const
@@ -566,138 +521,61 @@ void QuadSetGL::RenderHexagons(const TGLDrawFlags &) const
 
   QuadSet& mQ = * fM;
 
-  if (mQ.fRenderMode != QuadSet::RM_Line)
-  {
-
-    glNormal3f(0, 0, 1);
+  GLenum primitveType = (mQ.fRenderMode != QuadSet::RM_Line) ?
+    GL_POLYGON : GL_LINE_LOOP;
 
-    for (Int_t c=0; c<mQ.fPlex.VecSize(); ++c)
-    {
-      QuadSet::QuadBase* qbp = (QuadSet::QuadBase*) mQ.fPlex.Chunk(c);
-      Int_t n = mQ.fPlex.NAtoms(c);
-
-      switch (mQ.fQuadType)
-      {
-
-       case QuadSet::QT_HexagonXY:
-       {
-         QuadSet::QHex* qp = (QuadSet::QHex*) qbp;
-         while (n--) {
-           QuadSet::QHex& q = * qp;
-           if (SetupColor(q))
-           {
-             const Float_t rh = q.fR * 0.5;
-             const Float_t rs = q.fR * sqr3hf;
-             glBegin(GL_POLYGON);
-             glVertex3f( q.fR + q.fX,       q.fY, q.fZ);
-             glVertex3f(   rh + q.fX,  rs + q.fY, q.fZ);
-             glVertex3f(  -rh + q.fX,  rs + q.fY, q.fZ);
-             glVertex3f(-q.fR + q.fX,       q.fY, q.fZ);
-             glVertex3f(  -rh + q.fX, -rs + q.fY, q.fZ);
-             glVertex3f(   rh + q.fX, -rs + q.fY, q.fZ);
-             glEnd();
-           }
-           ++qp;
-         }
-         break;
-       }
+  glNormal3f(0, 0, 1);
 
-       case QuadSet::QT_HexagonYX:
-       {
-         QuadSet::QHex* qp = (QuadSet::QHex*) qbp;
-         while (n--) {
-           QuadSet::QHex& q = * qp;
-           if (SetupColor(q))
-           {
-             const Float_t rh = q.fR * 0.5;
-             const Float_t rs = q.fR * sqr3hf;
-             glBegin(GL_POLYGON);
-             glVertex3f( rs + q.fX,    rh + q.fY, q.fZ);
-             glVertex3f(      q.fX,  q.fR + q.fY, q.fZ);
-             glVertex3f(-rs + q.fX,    rh + q.fY, q.fZ);
-             glVertex3f(-rs + q.fX,   -rh + q.fY, q.fZ);
-             glVertex3f(      q.fX, -q.fR + q.fY, q.fZ);
-             glVertex3f( rs + q.fX,   -rh + q.fY, q.fZ);
-             glEnd();
-           }
-           ++qp;
-         }
-         break;
-       }
+  VoidCPlex::iterator qi(mQ.fPlex);
 
-       default:
-         throw(eH + "unsupported quad-type.");
-
-      } // end switch quad-type
-
-    } // end for chunk
-
-  }
-  else
+  switch (mQ.fQuadType)
   {
 
-    for (Int_t c=0; c<mQ.fPlex.VecSize(); ++c)
+    case QuadSet::QT_HexagonXY:
     {
-      QuadSet::QuadBase* qbp = (QuadSet::QuadBase*) mQ.fPlex.Chunk(c);
-      Int_t n = mQ.fPlex.NAtoms(c);
-
-      switch (mQ.fQuadType)
-      {
-
-       case QuadSet::QT_HexagonXY:
+      while (qi.next()) {
+       QuadSet::QHex& q = * (QuadSet::QHex*) qi();
+       if (SetupColor(q))
        {
-         QuadSet::QHex* qp = (QuadSet::QHex*) qbp;
-         while (n--) {
-           QuadSet::QHex& q = * qp;
-           if (SetupColor(q))
-           {
-             const Float_t rh = q.fR * 0.5;
-             const Float_t rs = q.fR * sqr3hf;
-             glBegin(GL_LINE_LOOP);
-             glVertex3f( q.fR + q.fX,       q.fY, q.fZ);
-             glVertex3f(   rh + q.fX,  rs + q.fY, q.fZ);
-             glVertex3f(  -rh + q.fX,  rs + q.fY, q.fZ);
-             glVertex3f(-q.fR + q.fX,       q.fY, q.fZ);
-             glVertex3f(  -rh + q.fX, -rs + q.fY, q.fZ);
-             glVertex3f(   rh + q.fX, -rs + q.fY, q.fZ);
-             glEnd();
-           }
-           ++qp;
-         }
-         break;
+         const Float_t rh = q.fR * 0.5;
+         const Float_t rs = q.fR * sqr3hf;
+         glBegin(primitveType);
+         glVertex3f( q.fR + q.fX,       q.fY, q.fZ);
+         glVertex3f(   rh + q.fX,  rs + q.fY, q.fZ);
+         glVertex3f(  -rh + q.fX,  rs + q.fY, q.fZ);
+         glVertex3f(-q.fR + q.fX,       q.fY, q.fZ);
+         glVertex3f(  -rh + q.fX, -rs + q.fY, q.fZ);
+         glVertex3f(   rh + q.fX, -rs + q.fY, q.fZ);
+         glEnd();
        }
+      }
+      break;
+    }
 
-       case QuadSet::QT_HexagonYX:
+    case QuadSet::QT_HexagonYX:
+    {
+      while (qi.next()) {
+       QuadSet::QHex& q = * (QuadSet::QHex*) qi();
+       if (SetupColor(q))
        {
-         QuadSet::QHex* qp = (QuadSet::QHex*) qbp;
-         while (n--) {
-           QuadSet::QHex& q = * qp;
-           if (SetupColor(q))
-           {
-             const Float_t rh = q.fR * 0.5;
-             const Float_t rs = q.fR * sqr3hf;
-             glBegin(GL_LINE_LOOP);
-             glVertex3f( rs + q.fX,    rh + q.fY, q.fZ);
-             glVertex3f(      q.fX,  q.fR + q.fY, q.fZ);
-             glVertex3f(-rs + q.fX,    rh + q.fY, q.fZ);
-             glVertex3f(-rs + q.fX,   -rh + q.fY, q.fZ);
-             glVertex3f(      q.fX, -q.fR + q.fY, q.fZ);
-             glVertex3f( rs + q.fX,   -rh + q.fY, q.fZ);
-             glEnd();
-           }
-           ++qp;
-         }
-         break;
+         const Float_t rh = q.fR * 0.5;
+         const Float_t rs = q.fR * sqr3hf;
+         glBegin(primitveType);
+         glVertex3f( rs + q.fX,    rh + q.fY, q.fZ);
+         glVertex3f(      q.fX,  q.fR + q.fY, q.fZ);
+         glVertex3f(-rs + q.fX,    rh + q.fY, q.fZ);
+         glVertex3f(-rs + q.fX,   -rh + q.fY, q.fZ);
+         glVertex3f(      q.fX, -q.fR + q.fY, q.fZ);
+         glVertex3f( rs + q.fX,   -rh + q.fY, q.fZ);
+         glEnd();
        }
+      }
+      break;
+    }
 
-       default:
-         throw(eH + "unsupported quad-type.");
-
-      } // end switch quad-type
-
-    } // end for chunk
-
-  } // end else of RenderMode
+    default:
+      throw(eH + "unsupported quad-type.");
 
+  } // end switch quad-type
 
 }