// @(#)root/eve:$Id$
// Author: Matevz Tadel 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 "TEveDigitSetGL.h"
#include "TEveFrameBoxGL.h"

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

//______________________________________________________________________________
// OpenGL renderer class for TEveDigitSet.
//

ClassImp(TEveDigitSetGL);

//______________________________________________________________________________
TEveDigitSetGL::TEveDigitSetGL() :
   TGLObject(), fHighlightSet(0)
{
   // Constructor.
}

//______________________________________________________________________________
Bool_t TEveDigitSetGL::SetupColor(const TEveDigitSet::DigitBase_t& q) const
{
   // Set color for rendering of the specified digit.

   TEveDigitSet &DS = * (TEveDigitSet*) fExternalObj;

   if (DS.fSingleColor)
   {
      return kTRUE;
   }
   else if (DS.fValueIsColor)
   {
      if (q.fValue != 0)
      {
         TGLUtil::Color4ubv((UChar_t*) & q.fValue);
         return kTRUE;
      } else {
         return kFALSE;
      }
   }
   else
   {
      UChar_t c[4];
      Bool_t visible = DS.fPalette->ColorFromValue(q.fValue, DS.fDefaultValue, c);
      if (visible)
         TGLUtil::Color3ubv(c);
      return visible;
   }
}

//______________________________________________________________________________
void TEveDigitSetGL::DrawFrameIfNeeded(TGLRnrCtx& rnrCtx) const
{
   // Make a decision if the frame should be drawn.
   // This depends on the render state (selection / highligt) and
   // on values of members fSelectViaFrame and fHighlightFrame.

   TEveDigitSet &DS = * (TEveDigitSet*)fExternalObj;

   if (DS.fFrame != 0 && ! rnrCtx.SecSelection() &&
       ! (rnrCtx.Selection() && ! DS.fSelectViaFrame) &&
       ! (rnrCtx.Highlight() && ! DS.fHighlightFrame))
   {
      TEveFrameBoxGL::Render(DS.fFrame);
   }
}

//______________________________________________________________________________
void TEveDigitSetGL::SetBBox()
{
   // Set bounding box.

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

//______________________________________________________________________________
void TEveDigitSetGL::DrawHighlight(TGLRnrCtx& rnrCtx, const TGLPhysicalShape* pshp, Int_t /*lvl*/) const
{
   // Draw the quad-set in highlight mode.
   // Incoming lvl is ignored -- physical shape always calls it with -1.

   TEveDigitSet &DS = * (TEveDigitSet*)fExternalObj;

   if (AlwaysSecondarySelect())
   {
      if ( ! DS.RefHighlightedSet().empty())
      {
         fHighlightSet = & DS.RefHighlightedSet();
         TGLObject::DrawHighlight(rnrCtx, pshp, 3);
      }
      if ( ! DS.RefSelectedSet().empty())
      {
         fHighlightSet = & DS.RefSelectedSet();
         TGLObject::DrawHighlight(rnrCtx, pshp, 1);
      }
      fHighlightSet = 0;
   }
   else
   {
      TGLObject::DrawHighlight(rnrCtx, pshp);
   }
}

//______________________________________________________________________________
void TEveDigitSetGL::ProcessSelection(TGLRnrCtx& /*rnrCtx*/, TGLSelectRecord& rec)
{
   // Processes secondary selection from TGLViewer.
   // Calls DigitSelected(Int_t) in the model object with index of
   // selected point as the argument.

   TEveDigitSet &DS = * (TEveDigitSet*)fExternalObj;

   if (AlwaysSecondarySelect())
   {
      DS.ProcessGLSelection(rec);
   }
   else
   {
      if (rec.GetN() < 2) return;
      DS.DigitSelected(rec.GetItem(1));
   }
}
 TEveDigitSetGL.cxx:1
 TEveDigitSetGL.cxx:2
 TEveDigitSetGL.cxx:3
 TEveDigitSetGL.cxx:4
 TEveDigitSetGL.cxx:5
 TEveDigitSetGL.cxx:6
 TEveDigitSetGL.cxx:7
 TEveDigitSetGL.cxx:8
 TEveDigitSetGL.cxx:9
 TEveDigitSetGL.cxx:10
 TEveDigitSetGL.cxx:11
 TEveDigitSetGL.cxx:12
 TEveDigitSetGL.cxx:13
 TEveDigitSetGL.cxx:14
 TEveDigitSetGL.cxx:15
 TEveDigitSetGL.cxx:16
 TEveDigitSetGL.cxx:17
 TEveDigitSetGL.cxx:18
 TEveDigitSetGL.cxx:19
 TEveDigitSetGL.cxx:20
 TEveDigitSetGL.cxx:21
 TEveDigitSetGL.cxx:22
 TEveDigitSetGL.cxx:23
 TEveDigitSetGL.cxx:24
 TEveDigitSetGL.cxx:25
 TEveDigitSetGL.cxx:26
 TEveDigitSetGL.cxx:27
 TEveDigitSetGL.cxx:28
 TEveDigitSetGL.cxx:29
 TEveDigitSetGL.cxx:30
 TEveDigitSetGL.cxx:31
 TEveDigitSetGL.cxx:32
 TEveDigitSetGL.cxx:33
 TEveDigitSetGL.cxx:34
 TEveDigitSetGL.cxx:35
 TEveDigitSetGL.cxx:36
 TEveDigitSetGL.cxx:37
 TEveDigitSetGL.cxx:38
 TEveDigitSetGL.cxx:39
 TEveDigitSetGL.cxx:40
 TEveDigitSetGL.cxx:41
 TEveDigitSetGL.cxx:42
 TEveDigitSetGL.cxx:43
 TEveDigitSetGL.cxx:44
 TEveDigitSetGL.cxx:45
 TEveDigitSetGL.cxx:46
 TEveDigitSetGL.cxx:47
 TEveDigitSetGL.cxx:48
 TEveDigitSetGL.cxx:49
 TEveDigitSetGL.cxx:50
 TEveDigitSetGL.cxx:51
 TEveDigitSetGL.cxx:52
 TEveDigitSetGL.cxx:53
 TEveDigitSetGL.cxx:54
 TEveDigitSetGL.cxx:55
 TEveDigitSetGL.cxx:56
 TEveDigitSetGL.cxx:57
 TEveDigitSetGL.cxx:58
 TEveDigitSetGL.cxx:59
 TEveDigitSetGL.cxx:60
 TEveDigitSetGL.cxx:61
 TEveDigitSetGL.cxx:62
 TEveDigitSetGL.cxx:63
 TEveDigitSetGL.cxx:64
 TEveDigitSetGL.cxx:65
 TEveDigitSetGL.cxx:66
 TEveDigitSetGL.cxx:67
 TEveDigitSetGL.cxx:68
 TEveDigitSetGL.cxx:69
 TEveDigitSetGL.cxx:70
 TEveDigitSetGL.cxx:71
 TEveDigitSetGL.cxx:72
 TEveDigitSetGL.cxx:73
 TEveDigitSetGL.cxx:74
 TEveDigitSetGL.cxx:75
 TEveDigitSetGL.cxx:76
 TEveDigitSetGL.cxx:77
 TEveDigitSetGL.cxx:78
 TEveDigitSetGL.cxx:79
 TEveDigitSetGL.cxx:80
 TEveDigitSetGL.cxx:81
 TEveDigitSetGL.cxx:82
 TEveDigitSetGL.cxx:83
 TEveDigitSetGL.cxx:84
 TEveDigitSetGL.cxx:85
 TEveDigitSetGL.cxx:86
 TEveDigitSetGL.cxx:87
 TEveDigitSetGL.cxx:88
 TEveDigitSetGL.cxx:89
 TEveDigitSetGL.cxx:90
 TEveDigitSetGL.cxx:91
 TEveDigitSetGL.cxx:92
 TEveDigitSetGL.cxx:93
 TEveDigitSetGL.cxx:94
 TEveDigitSetGL.cxx:95
 TEveDigitSetGL.cxx:96
 TEveDigitSetGL.cxx:97
 TEveDigitSetGL.cxx:98
 TEveDigitSetGL.cxx:99
 TEveDigitSetGL.cxx:100
 TEveDigitSetGL.cxx:101
 TEveDigitSetGL.cxx:102
 TEveDigitSetGL.cxx:103
 TEveDigitSetGL.cxx:104
 TEveDigitSetGL.cxx:105
 TEveDigitSetGL.cxx:106
 TEveDigitSetGL.cxx:107
 TEveDigitSetGL.cxx:108
 TEveDigitSetGL.cxx:109
 TEveDigitSetGL.cxx:110
 TEveDigitSetGL.cxx:111
 TEveDigitSetGL.cxx:112
 TEveDigitSetGL.cxx:113
 TEveDigitSetGL.cxx:114
 TEveDigitSetGL.cxx:115
 TEveDigitSetGL.cxx:116
 TEveDigitSetGL.cxx:117
 TEveDigitSetGL.cxx:118
 TEveDigitSetGL.cxx:119
 TEveDigitSetGL.cxx:120
 TEveDigitSetGL.cxx:121
 TEveDigitSetGL.cxx:122
 TEveDigitSetGL.cxx:123
 TEveDigitSetGL.cxx:124
 TEveDigitSetGL.cxx:125
 TEveDigitSetGL.cxx:126
 TEveDigitSetGL.cxx:127
 TEveDigitSetGL.cxx:128
 TEveDigitSetGL.cxx:129
 TEveDigitSetGL.cxx:130
 TEveDigitSetGL.cxx:131
 TEveDigitSetGL.cxx:132
 TEveDigitSetGL.cxx:133
 TEveDigitSetGL.cxx:134