ROOT logo
// @(#)root/eve:$Id: TEveStraightLineSetGL.cxx 31083 2009-11-11 11:51:59Z matevz $
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TEveStraightLineSetGL.h"
#include "TEveStraightLineSet.h"

#include "TGLIncludes.h"
#include "TGLRnrCtx.h"
#include "TGLSelectRecord.h"

//==============================================================================
//==============================================================================
// TEveStraightLineSetGL
//==============================================================================

//______________________________________________________________________________
//
// GL-renderer for TEveStraightLineSet class.

ClassImp(TEveStraightLineSetGL);

//______________________________________________________________________________
TEveStraightLineSetGL::TEveStraightLineSetGL() : TGLObject(), fM(0)
{
   // Constructor.

   // fDLCache = false; // Disable display list.
   fMultiColor = kTRUE;
}

//==============================================================================

//______________________________________________________________________________
Bool_t TEveStraightLineSetGL::SetModel(TObject* obj, const Option_t* /*opt*/)
{
   // Set model object.

   if (SetModelCheckClass(obj, TEveStraightLineSet::Class())) {
      fM = dynamic_cast<TEveStraightLineSet*>(obj);
      return kTRUE;
   }
   return kFALSE;
}

//______________________________________________________________________________
void TEveStraightLineSetGL::SetBBox()
{
   // Setup bounding box information.

   SetAxisAlignedBBox(((TEveStraightLineSet*)fExternalObj)->AssertBBox());
}

//______________________________________________________________________________
Bool_t TEveStraightLineSetGL::ShouldDLCache(const TGLRnrCtx& rnrCtx) const
{
   // Override from TGLObject.
   // To account for large point-sizes we modify the projection matrix
   // during selection and thus we need a direct draw.

   if (rnrCtx.Selection()) return kFALSE;
   return TGLObject::ShouldDLCache(rnrCtx);
}

/******************************************************************************/

//______________________________________________________________________________
void TEveStraightLineSetGL::Draw(TGLRnrCtx& rnrCtx) const
{
   // Draw function for TEveStraightLineSetGL. Skips line-pass of outline mode.

   if (rnrCtx.IsDrawPassOutlineLine())
      return;

   TGLObject::Draw(rnrCtx);
}

//______________________________________________________________________________
void TEveStraightLineSetGL::DirectDraw(TGLRnrCtx& rnrCtx) const
{
   // Render the line-set with GL.

   // printf("TEveStraightLineSetGL::DirectDraw LOD %d\n", rnrCtx.ShapeLOD());

   TEveStraightLineSet& mL = * fM;

   TGLCapabilitySwitch lights_off(GL_LIGHTING, kFALSE);
   if (mL.GetDepthTest() == kFALSE)
   {
      glPushAttrib(GL_VIEWPORT_BIT);
      glDepthRange(0, 0.1); 
   }

   // lines
   if (mL.GetRnrLines() && mL.GetLinePlex().Size() > 0)
   {
      glPushAttrib(GL_LINE_BIT | GL_ENABLE_BIT);
      TGLUtil::LineWidth(mL.GetLineWidth());
      if (mL.GetLineStyle() > 1) {
         Int_t    fac = 1;
         UShort_t pat = 0xffff;
         switch (mL.GetLineStyle()) {
            case 2:  pat = 0x3333; break;
            case 3:  pat = 0x5555; break;
            case 4:  pat = 0xf040; break;
            case 5:  pat = 0xf4f4; break;
            case 6:  pat = 0xf111; break;
            case 7:  pat = 0xf0f0; break;
            case 8:  pat = 0xff11; break;
            case 9:  pat = 0x3fff; break;
            case 10: pat = 0x08ff; fac = 2; break;
         }
         glLineStipple(1, pat);
         glEnable(GL_LINE_STIPPLE);
      }

      // During selection extend picking region for large line-widths.
      Bool_t changePM = rnrCtx.Selection() && mL.GetLineWidth() > rnrCtx.GetPickRadius();
      if (changePM)
         TGLUtil::BeginExtendPickRegion((Float_t) rnrCtx.GetPickRadius() / mL.GetLineWidth());

      TEveChunkManager::iterator li(mL.GetLinePlex());
      if (rnrCtx.SecSelection())
      {
         GLuint name = 0;
         glPushName(1);
         glPushName(0);
         while (li.next())
         {
            TEveStraightLineSet::Line_t& l = * (TEveStraightLineSet::Line_t*) li();
            glLoadName(name);
            {
               glBegin(GL_LINES);
               glVertex3f(l.fV1[0], l.fV1[1], l.fV1[2]);
               glVertex3f(l.fV2[0], l.fV2[1], l.fV2[2]);
               glEnd();
            }
            name ++;
         }
         glPopName();
         glPopName();
      }
      else
      {
         glBegin(GL_LINES);
         while (li.next())
         {
            TEveStraightLineSet::Line_t& l = * (TEveStraightLineSet::Line_t*) li();
            glVertex3f(l.fV1[0], l.fV1[1], l.fV1[2]);
            glVertex3f(l.fV2[0], l.fV2[1], l.fV2[2]);
         }
         glEnd();
      }

      if (changePM)
         TGLUtil::EndExtendPickRegion();

      glPopAttrib();
   }


   // markers
   if (mL.GetRnrMarkers() && mL.GetMarkerPlex().Size() > 0)
   {
      TEveChunkManager::iterator mi(mL.GetMarkerPlex());
      Float_t* pnts = new Float_t[mL.GetMarkerPlex().Size()*3];
      Float_t* pnt  = pnts;
      Int_t lidx = -1;
      while (mi.next())
      {
         TEveStraightLineSet::Marker_t& m = * (TEveStraightLineSet::Marker_t*) mi();
         lidx = m.fLineID;
         TEveStraightLineSet::Line_t& l = * (TEveStraightLineSet::Line_t*) mL.GetLinePlex().Atom(lidx);
         pnt[0] = l.fV1[0] + (l.fV2[0] - l.fV1[0])*m.fPos;
         pnt[1] = l.fV1[1] + (l.fV2[1] - l.fV1[1])*m.fPos;
         pnt[2] = l.fV1[2] + (l.fV2[2] - l.fV1[2])*m.fPos;
         pnt   += 3;
      }
      if (rnrCtx.SecSelection()) glPushName(2);
      TGLUtil::RenderPolyMarkers((TAttMarker&)mL,
                                 pnts, mL.GetMarkerPlex().Size(),
                                 rnrCtx.GetPickRadius(),
                                 rnrCtx.Selection(),
                                 rnrCtx.SecSelection());
      if (rnrCtx.SecSelection()) glPopName();
      delete [] pnts;
   }

   if (mL.GetDepthTest() == kFALSE)
      glPopAttrib();
}

//==============================================================================

//______________________________________________________________________________
void TEveStraightLineSetGL::ProcessSelection(TGLRnrCtx& /*rnrCtx*/,
                                             TGLSelectRecord& rec)
{
   // Process results of the secondary selection.

   if (rec.GetN() != 3) return;
   if (rec.GetItem(1) == 1)
   {
      printf("selected line %d\n", rec.GetItem(2));
   }
   else
   {
      TEveStraightLineSet::Marker_t& m = * (TEveStraightLineSet::Marker_t*) fM->GetMarkerPlex().Atom(rec.GetItem(2));
      printf("Selected point %d on line %d\n", rec.GetItem(2), m.fLineID);
   }
}
 TEveStraightLineSetGL.cxx:1
 TEveStraightLineSetGL.cxx:2
 TEveStraightLineSetGL.cxx:3
 TEveStraightLineSetGL.cxx:4
 TEveStraightLineSetGL.cxx:5
 TEveStraightLineSetGL.cxx:6
 TEveStraightLineSetGL.cxx:7
 TEveStraightLineSetGL.cxx:8
 TEveStraightLineSetGL.cxx:9
 TEveStraightLineSetGL.cxx:10
 TEveStraightLineSetGL.cxx:11
 TEveStraightLineSetGL.cxx:12
 TEveStraightLineSetGL.cxx:13
 TEveStraightLineSetGL.cxx:14
 TEveStraightLineSetGL.cxx:15
 TEveStraightLineSetGL.cxx:16
 TEveStraightLineSetGL.cxx:17
 TEveStraightLineSetGL.cxx:18
 TEveStraightLineSetGL.cxx:19
 TEveStraightLineSetGL.cxx:20
 TEveStraightLineSetGL.cxx:21
 TEveStraightLineSetGL.cxx:22
 TEveStraightLineSetGL.cxx:23
 TEveStraightLineSetGL.cxx:24
 TEveStraightLineSetGL.cxx:25
 TEveStraightLineSetGL.cxx:26
 TEveStraightLineSetGL.cxx:27
 TEveStraightLineSetGL.cxx:28
 TEveStraightLineSetGL.cxx:29
 TEveStraightLineSetGL.cxx:30
 TEveStraightLineSetGL.cxx:31
 TEveStraightLineSetGL.cxx:32
 TEveStraightLineSetGL.cxx:33
 TEveStraightLineSetGL.cxx:34
 TEveStraightLineSetGL.cxx:35
 TEveStraightLineSetGL.cxx:36
 TEveStraightLineSetGL.cxx:37
 TEveStraightLineSetGL.cxx:38
 TEveStraightLineSetGL.cxx:39
 TEveStraightLineSetGL.cxx:40
 TEveStraightLineSetGL.cxx:41
 TEveStraightLineSetGL.cxx:42
 TEveStraightLineSetGL.cxx:43
 TEveStraightLineSetGL.cxx:44
 TEveStraightLineSetGL.cxx:45
 TEveStraightLineSetGL.cxx:46
 TEveStraightLineSetGL.cxx:47
 TEveStraightLineSetGL.cxx:48
 TEveStraightLineSetGL.cxx:49
 TEveStraightLineSetGL.cxx:50
 TEveStraightLineSetGL.cxx:51
 TEveStraightLineSetGL.cxx:52
 TEveStraightLineSetGL.cxx:53
 TEveStraightLineSetGL.cxx:54
 TEveStraightLineSetGL.cxx:55
 TEveStraightLineSetGL.cxx:56
 TEveStraightLineSetGL.cxx:57
 TEveStraightLineSetGL.cxx:58
 TEveStraightLineSetGL.cxx:59
 TEveStraightLineSetGL.cxx:60
 TEveStraightLineSetGL.cxx:61
 TEveStraightLineSetGL.cxx:62
 TEveStraightLineSetGL.cxx:63
 TEveStraightLineSetGL.cxx:64
 TEveStraightLineSetGL.cxx:65
 TEveStraightLineSetGL.cxx:66
 TEveStraightLineSetGL.cxx:67
 TEveStraightLineSetGL.cxx:68
 TEveStraightLineSetGL.cxx:69
 TEveStraightLineSetGL.cxx:70
 TEveStraightLineSetGL.cxx:71
 TEveStraightLineSetGL.cxx:72
 TEveStraightLineSetGL.cxx:73
 TEveStraightLineSetGL.cxx:74
 TEveStraightLineSetGL.cxx:75
 TEveStraightLineSetGL.cxx:76
 TEveStraightLineSetGL.cxx:77
 TEveStraightLineSetGL.cxx:78
 TEveStraightLineSetGL.cxx:79
 TEveStraightLineSetGL.cxx:80
 TEveStraightLineSetGL.cxx:81
 TEveStraightLineSetGL.cxx:82
 TEveStraightLineSetGL.cxx:83
 TEveStraightLineSetGL.cxx:84
 TEveStraightLineSetGL.cxx:85
 TEveStraightLineSetGL.cxx:86
 TEveStraightLineSetGL.cxx:87
 TEveStraightLineSetGL.cxx:88
 TEveStraightLineSetGL.cxx:89
 TEveStraightLineSetGL.cxx:90
 TEveStraightLineSetGL.cxx:91
 TEveStraightLineSetGL.cxx:92
 TEveStraightLineSetGL.cxx:93
 TEveStraightLineSetGL.cxx:94
 TEveStraightLineSetGL.cxx:95
 TEveStraightLineSetGL.cxx:96
 TEveStraightLineSetGL.cxx:97
 TEveStraightLineSetGL.cxx:98
 TEveStraightLineSetGL.cxx:99
 TEveStraightLineSetGL.cxx:100
 TEveStraightLineSetGL.cxx:101
 TEveStraightLineSetGL.cxx:102
 TEveStraightLineSetGL.cxx:103
 TEveStraightLineSetGL.cxx:104
 TEveStraightLineSetGL.cxx:105
 TEveStraightLineSetGL.cxx:106
 TEveStraightLineSetGL.cxx:107
 TEveStraightLineSetGL.cxx:108
 TEveStraightLineSetGL.cxx:109
 TEveStraightLineSetGL.cxx:110
 TEveStraightLineSetGL.cxx:111
 TEveStraightLineSetGL.cxx:112
 TEveStraightLineSetGL.cxx:113
 TEveStraightLineSetGL.cxx:114
 TEveStraightLineSetGL.cxx:115
 TEveStraightLineSetGL.cxx:116
 TEveStraightLineSetGL.cxx:117
 TEveStraightLineSetGL.cxx:118
 TEveStraightLineSetGL.cxx:119
 TEveStraightLineSetGL.cxx:120
 TEveStraightLineSetGL.cxx:121
 TEveStraightLineSetGL.cxx:122
 TEveStraightLineSetGL.cxx:123
 TEveStraightLineSetGL.cxx:124
 TEveStraightLineSetGL.cxx:125
 TEveStraightLineSetGL.cxx:126
 TEveStraightLineSetGL.cxx:127
 TEveStraightLineSetGL.cxx:128
 TEveStraightLineSetGL.cxx:129
 TEveStraightLineSetGL.cxx:130
 TEveStraightLineSetGL.cxx:131
 TEveStraightLineSetGL.cxx:132
 TEveStraightLineSetGL.cxx:133
 TEveStraightLineSetGL.cxx:134
 TEveStraightLineSetGL.cxx:135
 TEveStraightLineSetGL.cxx:136
 TEveStraightLineSetGL.cxx:137
 TEveStraightLineSetGL.cxx:138
 TEveStraightLineSetGL.cxx:139
 TEveStraightLineSetGL.cxx:140
 TEveStraightLineSetGL.cxx:141
 TEveStraightLineSetGL.cxx:142
 TEveStraightLineSetGL.cxx:143
 TEveStraightLineSetGL.cxx:144
 TEveStraightLineSetGL.cxx:145
 TEveStraightLineSetGL.cxx:146
 TEveStraightLineSetGL.cxx:147
 TEveStraightLineSetGL.cxx:148
 TEveStraightLineSetGL.cxx:149
 TEveStraightLineSetGL.cxx:150
 TEveStraightLineSetGL.cxx:151
 TEveStraightLineSetGL.cxx:152
 TEveStraightLineSetGL.cxx:153
 TEveStraightLineSetGL.cxx:154
 TEveStraightLineSetGL.cxx:155
 TEveStraightLineSetGL.cxx:156
 TEveStraightLineSetGL.cxx:157
 TEveStraightLineSetGL.cxx:158
 TEveStraightLineSetGL.cxx:159
 TEveStraightLineSetGL.cxx:160
 TEveStraightLineSetGL.cxx:161
 TEveStraightLineSetGL.cxx:162
 TEveStraightLineSetGL.cxx:163
 TEveStraightLineSetGL.cxx:164
 TEveStraightLineSetGL.cxx:165
 TEveStraightLineSetGL.cxx:166
 TEveStraightLineSetGL.cxx:167
 TEveStraightLineSetGL.cxx:168
 TEveStraightLineSetGL.cxx:169
 TEveStraightLineSetGL.cxx:170
 TEveStraightLineSetGL.cxx:171
 TEveStraightLineSetGL.cxx:172
 TEveStraightLineSetGL.cxx:173
 TEveStraightLineSetGL.cxx:174
 TEveStraightLineSetGL.cxx:175
 TEveStraightLineSetGL.cxx:176
 TEveStraightLineSetGL.cxx:177
 TEveStraightLineSetGL.cxx:178
 TEveStraightLineSetGL.cxx:179
 TEveStraightLineSetGL.cxx:180
 TEveStraightLineSetGL.cxx:181
 TEveStraightLineSetGL.cxx:182
 TEveStraightLineSetGL.cxx:183
 TEveStraightLineSetGL.cxx:184
 TEveStraightLineSetGL.cxx:185
 TEveStraightLineSetGL.cxx:186
 TEveStraightLineSetGL.cxx:187
 TEveStraightLineSetGL.cxx:188
 TEveStraightLineSetGL.cxx:189
 TEveStraightLineSetGL.cxx:190
 TEveStraightLineSetGL.cxx:191
 TEveStraightLineSetGL.cxx:192
 TEveStraightLineSetGL.cxx:193
 TEveStraightLineSetGL.cxx:194
 TEveStraightLineSetGL.cxx:195
 TEveStraightLineSetGL.cxx:196
 TEveStraightLineSetGL.cxx:197
 TEveStraightLineSetGL.cxx:198
 TEveStraightLineSetGL.cxx:199
 TEveStraightLineSetGL.cxx:200
 TEveStraightLineSetGL.cxx:201
 TEveStraightLineSetGL.cxx:202
 TEveStraightLineSetGL.cxx:203
 TEveStraightLineSetGL.cxx:204
 TEveStraightLineSetGL.cxx:205
 TEveStraightLineSetGL.cxx:206
 TEveStraightLineSetGL.cxx:207
 TEveStraightLineSetGL.cxx:208
 TEveStraightLineSetGL.cxx:209
 TEveStraightLineSetGL.cxx:210
 TEveStraightLineSetGL.cxx:211
 TEveStraightLineSetGL.cxx:212
 TEveStraightLineSetGL.cxx:213
 TEveStraightLineSetGL.cxx:214
 TEveStraightLineSetGL.cxx:215
 TEveStraightLineSetGL.cxx:216
 TEveStraightLineSetGL.cxx:217
 TEveStraightLineSetGL.cxx:218