#ifdef WIN32
#include "Windows4root.h"
#endif
#include "TPointSet3DGL.h"
#include "TPointSet3D.h"
#include <TGLRnrCtx.h>
#include <TGLSelectRecord.h>
#include <TGLIncludes.h>
ClassImp(TPointSet3DGL)
Bool_t TPointSet3DGL::SetModel(TObject* obj, const Option_t*)
{
   
   return SetModelCheckClass(obj, TPointSet3D::Class());
}
void TPointSet3DGL::SetBBox()
{
   
   SetAxisAlignedBBox(((TPointSet3D*)fExternalObj)->AssertBBox());
}
Bool_t TPointSet3DGL::ShouldDLCache(const TGLRnrCtx & rnrCtx) const
{
   
   
   
   if (rnrCtx.Selection()) return kFALSE;
   return fDLCache;
}
void TPointSet3DGL::Draw(TGLRnrCtx & rnrCtx) const
{
   
   if (rnrCtx.DrawPass() == TGLRnrCtx::kPassOutlineLine)
      return;
   TGLObject::Draw(rnrCtx);
}
void TPointSet3DGL::DirectDraw(TGLRnrCtx & rnrCtx) const
{
   
   
   
   TPointSet3D& q = * (TPointSet3D*) fExternalObj;
   if (q.Size() <= 0) return;
   glPushAttrib(GL_POINT_BIT | GL_LINE_BIT | GL_ENABLE_BIT);
   glDisable(GL_LIGHTING);
   Int_t ms = q.GetMarkerStyle();
   if (ms != 2 && ms != 3 && ms != 5 && ms != 28)
      RenderPoints(rnrCtx);
   else
      RenderCrosses(rnrCtx);
   glPopAttrib();
}
void TPointSet3DGL::RenderPoints(TGLRnrCtx & rnrCtx) const
{
   
   TPointSet3D& q = * (TPointSet3D*) fExternalObj;
   Float_t size = 5*q.GetMarkerSize();
   Int_t  style = q.GetMarkerStyle();
   if (style == 4 || style == 20 || style == 24) {
      if (style == 4 || style == 24)
         glEnable(GL_BLEND);
      glEnable(GL_POINT_SMOOTH);
   } else {
      glDisable(GL_POINT_SMOOTH);
      if      (style == 1) size = 1;
      else if (style == 6) size = 2;
      else if (style == 7) size = 3;
   }
   glPointSize(size);
   
   static const Int_t sPickRadius = 3; 
   Bool_t changePM = kFALSE;
   if (rnrCtx.Selection() && size > sPickRadius) {
      changePM = kTRUE;
      glMatrixMode(GL_PROJECTION);
      glPushMatrix();
      Float_t pm[16];
      glGetFloatv(GL_PROJECTION_MATRIX, pm);
      Float_t scale = (Float_t) sPickRadius / size;
      for (Int_t i=0; i<=12; i+=4) {
         pm[i] *= scale; pm[i+1] *= scale;
      }
      glLoadMatrixf(pm);
   }
   if (rnrCtx.SecSelection()) {
      const Float_t* p = q.GetP();
      const Int_t    n = q.Size();
      glPushName(0);
      for (Int_t i=0; i<n; ++i, p+=3) {
         glLoadName(i);
         glBegin(GL_POINTS);
         glVertex3fv(p);
         glEnd();
      }
      glPopName();
   } else {
      glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
      glVertexPointer(3, GL_FLOAT, 0, q.GetP());
      glEnableClientState(GL_VERTEX_ARRAY);
      { 
         Int_t nleft = q.Size();
         Int_t ndone = 0;
         const Int_t maxChunk = 8192;
         while (nleft > maxChunk) {
            glDrawArrays(GL_POINTS, ndone, maxChunk);
            nleft -= maxChunk;
            ndone += maxChunk;
         }
         glDrawArrays(GL_POINTS, ndone, nleft);
      }
      glPopClientAttrib();
   }
   if (changePM) {
      glPopMatrix();
      glMatrixMode(GL_MODELVIEW);
   }
}
void TPointSet3DGL::RenderCrosses(TGLRnrCtx & rnrCtx) const
{
   
   TPointSet3D& q = * (TPointSet3D*) fExternalObj;
   const Float_t* p = q.GetP();
   const Float_t  d = 5*q.GetMarkerSize();
   const Int_t    n = q.Size();
   if (q.GetMarkerStyle() == 28) {
      glEnable(GL_BLEND);
      glEnable(GL_LINE_SMOOTH);
      glLineWidth(2);
   } else {
      glDisable(GL_LINE_SMOOTH);
   }
   if (rnrCtx.SecSelection()) {
      glPushName(0);
      for (Int_t i=0; i<n; ++i, p+=3) {
         glLoadName(i);
         glBegin(GL_LINES);
         glVertex3f(p[0]-d, p[1], p[2]); glVertex3f(p[0]+d, p[1], p[2]);
         glVertex3f(p[0], p[1]-d, p[2]); glVertex3f(p[0], p[1]+d, p[2]);
         glVertex3f(p[0], p[1], p[2]-d); glVertex3f(p[0], p[1], p[2]+d);
         glEnd();
      }
      glPopName();
   } else {
      glBegin(GL_LINES);
      for (Int_t i=0; i<n; ++i, p+=3) {
         glVertex3f(p[0]-d, p[1], p[2]); glVertex3f(p[0]+d, p[1], p[2]);
         glVertex3f(p[0], p[1]-d, p[2]); glVertex3f(p[0], p[1]+d, p[2]);
         glVertex3f(p[0], p[1], p[2]-d); glVertex3f(p[0], p[1], p[2]+d);
      }
      glEnd();
   }
}
void TPointSet3DGL::ProcessSelection(TGLRnrCtx & , TGLSelectRecord & rec)
{
   
   
   
   if (rec.GetN() < 2) return;
   TPointSet3D& q = * (TPointSet3D*) fExternalObj;
   q.PointSelected(rec.GetItem(1));
}
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.