// @(#)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 "TEveFrameBoxGL.h"
#include "TEveFrameBox.h"

#include "TGLIncludes.h"
#include "TGLUtil.h"

#include "TMath.h"

//______________________________________________________________________________
//
// A class encapsulating GL rendering of TEveFrameBox via a static
// meber function.

ClassImp(TEveFrameBoxGL);

//______________________________________________________________________________
void TEveFrameBoxGL::RenderFrame(const TEveFrameBox& b, Bool_t fillp)
{
   // Render the frame with GL.

   const Float_t * p = b.fFramePoints;
   Float_t normal[3];

   if (b.fFrameType == TEveFrameBox::kFT_Quad)
   {
      if (fillp)
      {
         TMath::Normal2Plane(p, p+3, p+6, normal);
         glNormal3fv(normal);
         glBegin(GL_POLYGON);
      }
      else
      {
         glBegin(GL_LINE_LOOP);
      }
      Int_t nPoints = b.fFrameSize / 3;
      for (Int_t i = 0; i < nPoints; ++i, p += 3)
         glVertex3fv(p);
      glEnd();
   }
   else if (b.fFrameType == TEveFrameBox::kFT_Box)
   {
      if (fillp)
      {
         glBegin(GL_QUADS);
         TMath::Normal2Plane(p, p+3, p+6, normal);
         glNormal3fv(normal);
         glVertex3fv(p);      glVertex3fv(p + 3);
         glVertex3fv(p + 6);  glVertex3fv(p + 9);
         // top:    7654
         TMath::Normal2Plane(p+21, p+18, p+15, normal);
         glNormal3fv(normal);
         glVertex3fv(p + 21); glVertex3fv(p + 18);
         glVertex3fv(p + 15); glVertex3fv(p + 12);
         // back:  0451
         TMath::Normal2Plane(p, p+12, p+15, normal);
         glNormal3fv(normal);
         glVertex3fv(p);      glVertex3fv(p + 12);
         glVertex3fv(p + 15); glVertex3fv(p + 3);
         // front:   3267
         TMath::Normal2Plane(p+9, p+6, p+18, normal);
         glNormal3fv(normal);
         glVertex3fv(p + 9);   glVertex3fv(p + 6);
         glVertex3fv(p + 18);  glVertex3fv(p + 21);
         // left:    0374
         TMath::Normal2Plane(p, p+9, p+21, normal);
         glNormal3fv(normal);
         glVertex3fv(p);       glVertex3fv(p + 9);
         glVertex3fv(p + 21);  glVertex3fv(p + 12);
         // right:   1562
         TMath::Normal2Plane(p+3, p+15, p+18, normal);
         glNormal3fv(normal);
         glVertex3fv(p + 3);   glVertex3fv(p + 15);
         glVertex3fv(p + 18);  glVertex3fv(p + 6);
         glEnd();
      }
      else
      {
         glBegin(GL_LINE_STRIP);
         glVertex3fv(p);       glVertex3fv(p + 3);
         glVertex3fv(p + 6);   glVertex3fv(p + 9);
         glVertex3fv(p);
         glVertex3fv(p + 12);  glVertex3fv(p + 15);
         glVertex3fv(p + 18);  glVertex3fv(p + 21);
         glVertex3fv(p + 12);
         glEnd();
         glBegin(GL_LINES);
         glVertex3fv(p + 3);   glVertex3fv(p + 15);
         glVertex3fv(p + 6);   glVertex3fv(p + 18);
         glVertex3fv(p + 9);   glVertex3fv(p + 21);
         glEnd();
      }
   }
}

//______________________________________________________________________________
void TEveFrameBoxGL::Render(const TEveFrameBox* box)
{
   // Render the frame-box with GL.

   const TEveFrameBox& b = *box;

   glPushAttrib(GL_POLYGON_BIT | GL_LINE_BIT | GL_ENABLE_BIT);

   glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
   glEnable(GL_COLOR_MATERIAL);
   glDisable(GL_CULL_FACE);

   if (b.fDrawBack)
   {
      GLboolean lmts;
      glGetBooleanv(GL_LIGHT_MODEL_TWO_SIDE, &lmts);
      if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

      glEnable(GL_POLYGON_OFFSET_FILL);
      glPolygonOffset(2, 2);
      glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

      if (b.fBackRGBA[3] < 255)
      {
         glEnable(GL_BLEND);
         glDepthMask(GL_FALSE);
      }

      TGLUtil::Color4ubv(b.fBackRGBA);
      RenderFrame(b, kTRUE);

      if (!lmts) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
   }

   glDisable(GL_LIGHTING);
   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
   glEnable(GL_BLEND);
   glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   glEnable(GL_LINE_SMOOTH);

   TGLUtil::LineWidth(b.fFrameWidth);
   TGLUtil::Color4ubv(b.fFrameRGBA);
   RenderFrame(b, b.fFrameFill);

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