// @(#)root/eve:$Id$
// 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 "TEveTriangleSetGL.h"
#include "TEveTriangleSet.h"
#include "TVector3.h"

#include "TGLIncludes.h"

//==============================================================================
// TEveTriangleSetGL
//==============================================================================

//______________________________________________________________________________
//
// GL-renderer for TEveTriangleSet class.
//
// See also: TGLObject, TGLLogicalShape.

ClassImp(TEveTriangleSetGL);

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

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

//______________________________________________________________________________
TEveTriangleSetGL::~TEveTriangleSetGL()
{
   // Destructor.
}

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

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

   fM = SetModelDynCast<TEveTriangleSet>(obj);
   return kTRUE;
}

//______________________________________________________________________________
void TEveTriangleSetGL::SetBBox()
{
   // Set bounding-box from the model.

   // !! This ok if master sub-classed from TAttBBox
   SetAxisAlignedBBox(((TEveTriangleSet*)fExternalObj)->AssertBBox());
}

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

//______________________________________________________________________________
void TEveTriangleSetGL::DirectDraw(TGLRnrCtx & /*rnrCtx*/) const
{
   // Low-level GL rendering.

   TEveTriangleSet& refTS = *fM;
   Bool_t isScaled = refTS.RefMainTrans().IsScale();

   GLint ex_shade_model;
   glGetIntegerv(GL_SHADE_MODEL, &ex_shade_model);
   glShadeModel(GL_FLAT);

   glPushAttrib(GL_ENABLE_BIT | GL_POLYGON_BIT);

   glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
   glEnable(GL_COLOR_MATERIAL);
   glDisable(GL_CULL_FACE);
   if (isScaled) glEnable(GL_NORMALIZE);
   glPushClientAttrib(GL_CLIENT_VERTEX_ARRAY_BIT);
   glVertexPointer(3, GL_FLOAT, 0, refTS.fVerts);
   glEnableClientState(GL_VERTEX_ARRAY);

   Int_t*   tng = refTS.fTrings;
   Float_t* nrm = refTS.fTringNorms;
   UChar_t* col = refTS.fTringCols;

   TVector3 e1, e2, n;

   glBegin(GL_TRIANGLES);
   for(Int_t t=0; t<refTS.fNTrings; ++t) {
      if (nrm) {
         glNormal3fv(nrm); nrm += 3;
      } else {
         Float_t* v0 = refTS.Vertex(tng[0]);
         Float_t* v1 = refTS.Vertex(tng[1]);
         Float_t* v2 = refTS.Vertex(tng[2]);
         e1.SetXYZ(v1[0]-v0[0], v1[1]-v0[1], v1[2]-v0[2]);
         e2.SetXYZ(v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2]);
         n = e1.Cross(e2);
         if (!isScaled) n.SetMag(1);
         glNormal3d(n.x(), n.y(), n.z());
      }
      if (col) {
         TGLUtil::Color3ubv(col);  col += 3;
      }
      glArrayElement(tng[0]);
      glArrayElement(tng[1]);
      glArrayElement(tng[2]);
      tng += 3;
   }
   glEnd();

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